<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>Dask Working Notes</title>
 <link href="https://blog.dask.org/atom.xml" rel="self"/>
 <link href="https://blog.dask.org"/>
 <updated>2024-11-21T20:54:13+00:00</updated>
 <id>https://blog.dask.org</id>
 <author>
   <name></name>
   <email></email>
 </author>

 
 
 <entry>
   <title>Improving GroupBy.map with Dask and Xarray</title>
   <link href="https://blog.dask.org/2024/11/21/dask-detrending"/>
   <updated>2024-11-21T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2024/11/21/dask-detrending</id>
   
   <category>dask array</category>
   
   <category>xarray</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This post was originally published on the &lt;a href=&quot;https://xarray.dev/blog/dask-detrending&quot;&gt;Xarray blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Running large-scale GroupBy-Map patterns with Xarray that are backed by &lt;a href=&quot;https://docs.dask.org/en/stable/array.html&quot;&gt;Dask arrays&lt;/a&gt; is
an essential part of a lot of typical geospatial workloads. Detrending is a very common
operation where this pattern is needed.&lt;/p&gt;

&lt;p&gt;In this post, we will explore how and why this caused so many pitfalls for Xarray users in
the past and how we improved performance and scalability with a few changes to how Dask
subselects data.&lt;/p&gt;

&lt;h2 id=&quot;what-is-groupbymap&quot;&gt;What is GroupBy.map?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.xarray.dev/en/stable/generated/xarray.core.groupby.DatasetGroupBy.map.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GroupBy.map&lt;/code&gt;&lt;/a&gt; lets you apply a User Defined Function (UDF)
that accepts and returns Xarray objects. The UDF will receive an Xarray object (either a Dataset or a DataArray) containing Dask arrays corresponding to one single group.
&lt;a href=&quot;https://docs.xarray.dev/en/stable/generated/xarray.core.groupby.DatasetGroupBy.reduce.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Groupby.reduce&lt;/code&gt;&lt;/a&gt; is quite similar
in that it applies a UDF, but in this case the UDF will receive the underlying Dask arrays, &lt;em&gt;not&lt;/em&gt; Xarray objects.&lt;/p&gt;

&lt;h2 id=&quot;the-application&quot;&gt;The Application&lt;/h2&gt;

&lt;p&gt;Consider a typical workflow where you want to apply a detrending step. You may want to smooth out
the data by removing the trends over time. This is a common operation in climate science
and normally looks roughly like this:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;detrending_step&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# important: the rolling operation is applied within a group
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;arr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rolling&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;min_periods&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;time.dayofyear&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;detrending_step&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We are grouping by the day of the year and then are calculating the rolling average over
30-year windows for a particular day.&lt;/p&gt;

&lt;p&gt;Our example will run on a 1 TiB array, 64 years worth of data and the following structure:&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Python repr output of 1 TiB Dask array with shape (1801, 3600, 233376) split into 5460, 250 MiB chunks of (300, 300, 365)&quot; src=&quot;/images/dask-detrending/input-array.png&quot; style=&quot;width: 800px;&quot; /&gt;&lt;/p&gt;
&lt;/figure&gt;

&lt;p&gt;The array isn’t overly huge and the chunks are reasonably sized.&lt;/p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;/h2&gt;

&lt;p&gt;The general application seems straightforward. Group by the day of the year and apply a UDF
to every group. There are a few pitfalls in this application that can make the result of
this operation unusable. Our array is sorted by time, which means that we have to pick
entries from many different areas in the array to create a single group (corresponding to a single day of the year).
Picking the same day of every year is basically a slicing operation with a step size of 365.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Schematic showing an array sorted by time, where data is selected from many different areas in the array to create a single group (corresponding to a specific day of the year).&quot; src=&quot;/images/dask-detrending/indexing-data-selection.png&quot; title=&quot;Data Selection Pattern&quot; style=&quot;width: 800px;&quot; /&gt;&lt;/p&gt;
&lt;/figure&gt;

&lt;p&gt;Our example has a year worth of data in a single chunk along the time axis. The general problem
exists for any workload where you have to access random entries of data. This
particular access pattern means that we have to pick one value per chunk, which is pretty
inefficient. The right side shows the individual groups that we are operating on.&lt;/p&gt;

&lt;p&gt;One of the main issues with this pattern is that Dask will create a single output chunk per time
entry, e.g. each group will consist of as many chunks as we have year.&lt;/p&gt;

&lt;p&gt;This results in a huge increase in the number of chunks:&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Python repr output of a 1 TiB Dask array with nearly 2 million, 700 kiB chunks.&quot; src=&quot;/images/dask-detrending/output-array-old.png&quot; style=&quot;width: 800px;&quot; /&gt;&lt;/p&gt;
&lt;/figure&gt;

&lt;p&gt;This simple operation increases the number of chunks from 5000 to close to 2 million. Each
chunk only has a few hundred kilobytes of data. &lt;strong&gt;This is pretty bad!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dask computations generally scale along the number of chunks you have. Increasing the chunks by such
a large factor is catastrophic. Each follow-up operation, as simple as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a-b&lt;/code&gt; will create 2 million
additional tasks.&lt;/p&gt;

&lt;p&gt;The only workaround for users was to rechunk to something more sensible afterward, but it
still keeps the incredibly expensive indexing operation in the graph.&lt;/p&gt;

&lt;p&gt;Note this is the underlying problem that is &lt;a href=&quot;https://xarray.dev/blog/flox&quot;&gt;solved by flox&lt;/a&gt; for aggregations like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.mean()&lt;/code&gt;
using parallel-native algorithms to avoid the expense of indexing out each group.&lt;/p&gt;

&lt;h2 id=&quot;improvements-to-the-data-selection-algorithm&quot;&gt;Improvements to the Data Selection algorithm&lt;/h2&gt;

&lt;p&gt;The method of how Dask selected the data was objectively pretty bad.
A rewrite of the underlying algorithm enabled us to achieve a much more robust result. The new
algorithm is a lot smarter about how to pick values from each individual chunk, but most importantly,
it will try to preserve the input chunksize as closely as possible.&lt;/p&gt;

&lt;p&gt;For our initial example, it will put every group into a single chunk. This means that we will
end up with the number of chunks along the time axis being equal to the number of groups, i.e. 365.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Python repr output of a 1 TiB Dask array with 31164, 43 MiB chunks&quot; src=&quot;/images/dask-detrending/output-array-new.png&quot; style=&quot;width: 800px;&quot; /&gt;&lt;/p&gt;
&lt;/figure&gt;

&lt;p&gt;The algorithm reduces the number of chunks from 2 million to roughly 30 thousand, which is a huge improvement
and a scale that Dask can easily handle. The graph is now much smaller, and the follow-up operations
will run a lot faster as well.&lt;/p&gt;

&lt;p&gt;This improvement will help every operation that we listed above and make the scale a lot more
reliably than before. The algorithm is used very widely across Dask and Xarray and thus, influences
many methods.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;Xarray selects one group at a time for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;groupby(...).map(...)&lt;/code&gt;, i.e. this requires one operation
per group. This will hurt scalability if the dataset has a very large number of groups, because
the computation will create a very expensive graph. There is currently an effort to implement alternative
APIs that are shuffle-based to circumvent that problem. A current PR is available &lt;a href=&quot;https://github.com/pydata/xarray/pull/9320&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The fragmentation of the output chunks by indexing is something that will hurt every workflow that is selecting data in a random
pattern. This also includes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.sel&lt;/code&gt; if you aren’t using slices explicitly&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.isel&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.sortby&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;groupby(...).quantile()&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;and many more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We expect all of these workloads to be substantially improved now.&lt;/p&gt;

&lt;p&gt;Additionally, &lt;a href=&quot;https://docs.dask.org/en/stable/changelog.html#v2024-11-1&quot;&gt;Dask improved a lot of things&lt;/a&gt; related to either increasing chunksizes or fragmentation
of chunks over the cycle of a workload with more improvements to come. This will help a lot of
users to get better and more reliable performance.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask DataFrame is Fast Now</title>
   <link href="https://blog.dask.org/2024/05/30/dask-is-fast"/>
   <updated>2024-05-30T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2024/05/30/dask-is-fast</id>
   
   <category>dask</category>
   
   <category>query optimizer</category>
   
   <category>dataframe</category>
   
   <content type="html">
&lt;meta content=&quot;Dask DataFrame is faster and more reliable, especially for TBs of data. This is due to engineering improvements like adding a query optimizer, integrating with Apache Arrow, and more efficient data shuffling.&quot; name=&quot;description&quot; /&gt;

&lt;p&gt;&lt;em&gt;This work was engineered and supported by &lt;a href=&quot;https://coiled.io/?utm_source=dask-blog&amp;amp;utm_medium=dask-expr&quot;&gt;Coiled&lt;/a&gt; and &lt;a href=&quot;https://www.nvidia.com/&quot;&gt;NVIDIA&lt;/a&gt;. Thanks to &lt;a href=&quot;https://github.com/phofl&quot;&gt;Patrick Hoefler&lt;/a&gt; and &lt;a href=&quot;https://github.com/rjzamora&quot;&gt;Rick Zamora&lt;/a&gt;, in particular. Original version of this post appears on &lt;a href=&quot;https://docs.coiled.io/blog/dask-dataframe-is-fast.html?utm_source=dask-blog&amp;amp;utm_medium=dask-is-fast&quot;&gt;docs.coiled.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Bar chart showing a nearly 20x improvement in Dask DataFrame performance with the addition of Arrow stings, more efficient shufffling, and a query optimizer.&quot; src=&quot;/images/dask-improvement.png&quot; style=&quot;width: 600px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;Performance Improvements for Dask DataFrames&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;/h2&gt;

&lt;p&gt;Dask DataFrame scales out pandas DataFrames to operate at the 100GB-100TB scale.&lt;/p&gt;

&lt;p&gt;Historically, &lt;a href=&quot;https://www.dask.org/&quot;&gt;Dask&lt;/a&gt; was pretty slow compared to other tools in this space (like Spark). Due to a number of improvements focused on performance,
it’s now pretty fast (about 20x faster than before). The new implementation moved Dask from getting destroyed by
Spark on every benchmark to regularly outperforming Spark on TPC-H queries by a significant margin.&lt;/p&gt;

&lt;p&gt;Dask DataFrame workloads struggled with many things. Performance and memory usage were
commonly seen pain points, shuffling was unstable for bigger datasets, making scaling out
hard. Writing efficient code required understanding too much of the internals of Dask.&lt;/p&gt;

&lt;p&gt;The new implementation changed all of this. Things that didn’t work were completely rewritten from scratch and existing
implementations were improved upon. This puts Dask DataFrames on a solid foundation that
allows faster iteration cycles in the future.&lt;/p&gt;

&lt;p&gt;We’ll go through the three most prominent changes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;#arrow&quot;&gt;Apache Arrow support&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#p2p&quot;&gt;Faster joins&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#optimizer&quot;&gt;Query optimization&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’ll cover how these changes impact performance and make it easier to use Dask efficiently, even for users that are new to distributed computing. We’ll also discuss plans for future improvements.&lt;/p&gt;

&lt;p&gt;&lt;a name=&quot;arrow&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;1-apache-arrow-support-efficient-string-datatype&quot;&gt;1. Apache Arrow Support: Efficient String Datatype&lt;/h2&gt;

&lt;p&gt;A Dask DataFrame consists of many pandas DataFrames. Historically, pandas used NumPy for numeric data,
but Python objects for text data, which are inefficient and blow up memory usage. Operations on
object data also hold the GIL, which doesn’t matter much for pandas, but is a catastrophy for
performance with a parallel system like Dask.&lt;/p&gt;

&lt;p&gt;The pandas 2.0 release introduced support for general-purpose Arrow datatypes, so &lt;a href=&quot;https://docs.coiled.io/blog/pyarrow-in-pandas-and-dask.html?utm_source=dask-blog&amp;amp;utm_medium=dask-is-fast&quot;&gt;Dask now uses PyArrow-backed
strings by default&lt;/a&gt;. These are &lt;em&gt;much&lt;/em&gt; better. PyArrow strings reduce memory usage by up to 80% and
unlock multi-threading for string operations. Workloads that previously
struggled with available memory now fit comfortably in much less space, and are
a lot faster because they no longer constantly spill excess data to disk.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Bar chart comparing memory usage (GB) for Dask DataFrame with and without PyArrow strings. Dask DataFrame uses up to 80% less memory with PyArrow strings.&quot; src=&quot;/images/arrow-strings-memory-usage.png&quot; style=&quot;width: 600px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;Memory Usage of the Legacy DataFrames Compared with Arrow Strings&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;a name=&quot;p2p&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;2-faster-joins-with-a-new-shuffle-algorithm&quot;&gt;2. Faster Joins with a New Shuffle Algorithm&lt;/h2&gt;

&lt;p&gt;Shuffling is an essential component of distributed systems to enable sorting, joins, and complex group by operations. It is an all-to-all, network-intensive operation that’s often the most expensive component in a workflow. Dask has a new shuffling system, which greatly impacts overall performance, especially on complex, data-intensive workloads.&lt;/p&gt;

&lt;p&gt;A shuffle operation is intrinsically an all-to-all communication operation where every
input partition has to provide a tiny slice of data to every output partition. Dask was already
using it’s own task-based algorithm that managed to reduce the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;O(n * n)&lt;/code&gt; task
complexity to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;O(log(n) * n)&lt;/code&gt; where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n&lt;/code&gt; is the number of partitions. This was a drastic
reduction in the number of tasks, but the non-linear scaling ultimately did not allow Dask to process
arbitrarily large datasets.&lt;/p&gt;

&lt;p&gt;Dask introduced a new &lt;a href=&quot;https://docs.coiled.io/blog/shuffling-large-data-at-constant-memory.html?utm_source=dask-blog&amp;amp;utm_medium=dask-is-fast&quot;&gt;P2P (peer-to-peer) shuffle method&lt;/a&gt; that reduced the task complexity to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;O(n)&lt;/code&gt;
which scales linearly with the size of the dataset and the size of the cluster. It also
incorporates an efficient disk integration which allows easily shuffling datasets which are much
larger than memory. The new system is extremely stable and “just works” across any scale of data.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Line plot of memory usage (GB) over time (seconds) comparing Dask DataFrame with the peer-to-peer shuffling to task-based shuffling. With P2P shuffling, Dask DataFrame memory usage remains consistently low throughout the computation.&quot; src=&quot;/images/shuffle-memory-comparison.png&quot; style=&quot;width: 600px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;Memory Usage of the Legacy Shuffle Compared with P2P&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;a name=&quot;optimizer&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;3-optimizer&quot;&gt;3. Optimizer&lt;/h2&gt;

&lt;p&gt;Dask itself is lazy, which means that it registers your whole query before doing any actual work.
This is a powerful concept that enables a lot of optimizations, but historically Dask wasn’t taking advantage of this
knowledge in the past. Dask also did a bad job of hiding internal complexities and
left users on their own while navigating the difficulties of distributed computing and running
large scale queries. It made writing efficient code painful for non-experts.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.dask.org/en/stable/changelog.html#query-planning&quot;&gt;The Dask release in March&lt;/a&gt; includes a complete re-implementation of the DataFrame API to support query optimization. This is a big deal.
The new engine centers around a query optimizer that rewrites your code to make it more efficient and
better tailored to Dask’s strengths. Let’s dive into some optimization strategies, how they make
Dask run faster and scale better.&lt;/p&gt;

&lt;p&gt;We will start with a couple general-purpose optimizations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;#column-projection&quot;&gt;Column projection&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#filter-pushdown&quot;&gt;Filter pushdown&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And then dive into more specific techniques that are tailored to distributed systems generally
and Dask more specifically:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;#partition-resizing&quot;&gt;Automatic partition resizing&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#trivial-merge&quot;&gt;Trivial merge and join operations&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a name=&quot;column-projection&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;31-column-projection&quot;&gt;3.1 Column Projection&lt;/h3&gt;

&lt;p&gt;Most datasets have more columns than needed. Dropping them requires foresight (“What columns will I need for this query? 🤔”) so most people don’t think about this when loading data. This is bad for performance because carrying around lots of excess data slows everything down.
Column Projection drops columns as soon as they aren’t needed anymore. It’s a straightforward optimization, but highly beneficial.&lt;/p&gt;

&lt;p&gt;The legacy implementation always reads all columns from storage and only drops columns when explicitly specified by the user.
Simply operating on less data is a big win for performance and memory usage.&lt;/p&gt;

&lt;p&gt;The optimizer looks at the query and figures out which columns are needed for each operation.
It looks at the final step of the query and then works backwards step by
step to the data source, injecting drop operations to get rid of unnecessary columns.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Diagram explaining how column projection works for the Dask DataFrame optimizer.&quot; src=&quot;/images/projection.png&quot; style=&quot;width: 600px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;Only require a subset of columns are needed. Replace doesn’t need access to all columns, so Dask drops unnecessary columns directly in the IO step.&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;a name=&quot;filter-pushdown&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;32-filter-pushdown&quot;&gt;3.2 Filter Pushdown&lt;/h3&gt;

&lt;p&gt;Filter pushdown is another general-purpose optimization with
the same goal as column projection: operate on less data. The legacy implementation did not reorder filter operations. The new implementation executes filter operations as early as
possible while maintaining the same results.&lt;/p&gt;

&lt;p&gt;The optimizer identifies every filter in the query and looks at the previous operation to see if we
can move the filter closer to the data source. It will repeat this until it finds an operation that
can’t be switched with a filter. This is a bit harder than
column projections, because Dask has to make sure that the operations don’t change the values of the
DataFrame. For example, switching a filter and a merge operation is fine (values don’t change), but switching a filter
and a replace operation is invalid, because the values might change and rows that would previously have been filtered out now won’t be, or vice versa.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Diagram explaining how filter pushdown (or predicate pushdown) works to reduce the amount of data being processed in the Dask DataFrame query optimizer.&quot; src=&quot;/images/filter.png&quot; style=&quot;width: 600px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;Initially, the filter happens after the Dropna, but Dask can execute the filter before Dropna without changing the result. This allows Dask to push the filter into the IO step.&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Additionally, if the filter is strong enough then Dask can potentially drop complete files in the IO step.
This is a best-case scenario, where an earlier filter brings a huge performance improvement and even
requires reading less data from remote storage.&lt;/p&gt;

&lt;p&gt;&lt;a name=&quot;partition-resizing&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;33-automatically-resizing-partitions&quot;&gt;3.3 Automatically Resizing Partitions&lt;/h3&gt;

&lt;p&gt;In addition to implementing the common optimization techniques described above, we’ve also improved a
common pain point specific to distributed systems generally and Dask users specifically: optimal partition sizes.&lt;/p&gt;

&lt;p&gt;Dask DataFrames consist of many small pandas DataFrames called &lt;em&gt;partitions&lt;/em&gt;. Often, the number of
partitions is decided for you and Dask users are advised to manually “repartition” after reducing
or expanding their data (for example by dropping columns, filtering data, or expanding with joins) (see the &lt;a href=&quot;https://docs.dask.org/en/stable/dataframe-best-practices.html#repartition-to-reduce-overhead&quot;&gt;Dask docs&lt;/a&gt;).
Without this extra step,
the (usually small) overhead from Dask can become a bottleneck if the pandas DataFrames
become too small, making Dask workflows painfully slow.&lt;/p&gt;

&lt;p&gt;Manually controlling the partition size is a difficult task that we, as Dask users, shouldn’t have
to worry about. It is also slow because it requires network transfer of some partitions.
Dask DataFrame now automatically does two things to help when the partitions get
too small:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Keeps the size of each partition constant, based on the ratio of data you want to compute vs.
the original file size. If, for example, you filter out 80% of the original dataset, Dask will
automatically combine the resulting smaller partitions into fewer, larger partitions.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Combines too-small partitions into larger partitions, based on an absolute minimum
(default is 75 MB). If, for example, your original dataset is split into many tiny files,
Dask will automatically combine them.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Diagram representing how column selection can reduce the size of a partition when reading parquet data.&quot; src=&quot;/images/automatic_repartitioning_1.png&quot; style=&quot;width: 800px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;Select two columns that take up 40 MB of memory out of the 200 MB from the whole parquet file.&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The optimizer will look at the number of columns and the size of the data within those. It
calculates a ratio that is used to combine multiple files into one partition.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Diagram showing how automatic repartitioning works for Dask DataFrame.&quot; src=&quot;/images/automatic_repartitioning_2.png&quot; style=&quot;width: 600px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;The ratio of 40/200 results in combining five files into a single partition.&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This step is currently limited to IO operations (like reading in a parquet dataset), but we plan
to extend it to other operations that allow cheaply combining partitions.&lt;/p&gt;

&lt;p&gt;&lt;a name=&quot;trivial-merge&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;34-trivial-merge-and-join-operations&quot;&gt;3.4 Trivial Merge and Join Operations&lt;/h3&gt;

&lt;p&gt;Merge and join operations are typically cheap on a single machine with pandas but expensive in a
distributed setting. Merging data in shared memory is cheap, while merging data across a network is quite slow,
due to the shuffle operations explained earlier.&lt;/p&gt;

&lt;p&gt;This is one of the most expensive operations in a distributed system. The legacy implementation triggered
a network transfer of both input DataFrames for every merge operation. This is sometimes necessary, but very
expensive.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Diagram representing how an expensive shuffle operation is avoided automatically if two DataFrames are already aligned before joining.&quot; src=&quot;/images/avoiding-shuffles.png&quot; style=&quot;width: 800px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;Both joins are performed on the same column. The left DataFrame is already properly partitioned after the first join, so Dask can avoid shuffling again with the new implementation.&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The optimizer will determine when shuffling is necessary versus when
a trivial join is sufficient because the data is already aligned properly. This can make individual merges
an order of magnitude faster. This also applies to other operations that normally require a shuffle
like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;groupby().apply()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dask merges used to be inefficient, which caused long runtimes. The optimizer fixes this for
the trivial case where these operations happen after each other, but the technique isn’t very
advanced yet. There is still a lot of potential for improvement.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Diagram showing how the query optimizer for Dask DataFrame automatically shuffles data earlier to make a groupby aggregation more efficient.&quot; src=&quot;/images/avoiding-shuffles-advanced.png&quot; style=&quot;width: 800px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;The current implementation shuffles both branches that originate from the same table. Injecting a shuffle node further up avoids one of the expensive operations.&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The optimizer will look at the expression and inject shuffle nodes where necessary to avoid
unnecessary shuffles.&lt;/p&gt;

&lt;h2 id=&quot;how-do-the-improvements-stack-up-compared-to-the-legacy-implementation&quot;&gt;How do the improvements stack up compared to the legacy implementation?&lt;/h2&gt;

&lt;p&gt;Dask is now 20x faster than before. This improvement applies to the entire
DataFrame API (not just isolated components), with no known
performance regressions. Dask now runs workloads that were impossible to
complete in an acceptable timeframe before. This performance boost is due to many
improvements all layered on top of each other. It’s not about doing one thing
especially well, but about doing nothing especially poorly.&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Bar chart showing a nearly 20x improvement in Dask DataFrame performance with the addition of Arrow stings, more efficient shufffling, and a query optimizer.&quot; src=&quot;/images/dask-improvement.png&quot; style=&quot;width: 600px;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;Performance Improvements on Query 3 of the TPC-H Benchmarks from &lt;a class=&quot;reference external&quot; href=&quot;https://github.com/coiled/benchmarks/tree/main/tests/tpch&quot;&gt;https://github.com/coiled/benchmarks/tree/main/tests/tpch&lt;/a&gt; &lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Performance, while the most enticing improvement, is not the only thing that got better. The
optimizer hides a lot of complexity from the user and makes the transition from pandas to Dask a
lot easier because it’s now much more difficult to write poorly performing code.
The whole system is more robust.&lt;/p&gt;

&lt;p&gt;The new architecture of the API is a lot easier to work with as well. The legacy implementation leaked
a lot of internal complexities into high-level API implementations, making changes cumbersome. Improvements
are almost trivial to add now.&lt;/p&gt;

&lt;h2 id=&quot;whats-to-come&quot;&gt;What’s to come?&lt;/h2&gt;

&lt;p&gt;Dask DataFrame changed a lot over the last 18 months. The legacy API was often difficult to work with and
struggled with scaling out. The new implementation dropped things that didn’t work and
improved existing implementations. The heavy lifting is finished now, which allows for
faster iteration cycles to improve upon the status quo. Incremental improvements are now
trivial to add.&lt;/p&gt;

&lt;p&gt;A few things that are on the immediate roadmap:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Auto repartitioning:&lt;/strong&gt; this is partially implemented, but there is more potential to choose a more
efficient partition size during optimization.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Faster Joins:&lt;/strong&gt; there’s still lots of fine-tuning to be done here.
For example, there is a PR in flight with a 30-40% improvement.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Join Reordering:&lt;/strong&gt; Dask doesn’t do this yet, but it’s on the immediate roadmap&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;learn-more&quot;&gt;Learn more&lt;/h2&gt;

&lt;p&gt;This article focuses on a number of improvements to Dask DataFrame and how much faster and more reliable it is as a result. If you’re choosing between Dask and other popular DataFrame tools, you might also consider:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.coiled.io/blog/tpch.html?utm_source=dask-blog&amp;amp;utm_medium=dask-is-fast&quot;&gt;DataFrames at Scale Comparison: TPC-H&lt;/a&gt; which compares Dask, Spark, Polars, and DuckDB performance on datasets ranging from 10 GB to 10 TB both locally and on the cloud&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>High Level Query Optimization in Dask</title>
   <link href="https://blog.dask.org/2023/08/25/dask-expr-introduction"/>
   <updated>2023-08-25T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2023/08/25/dask-expr-introduction</id>
   
   <category>dask</category>
   
   <category>query optimizer</category>
   
   <category>performance</category>
   
   <content type="html">&lt;p&gt;&lt;em&gt;This work was engineered and supported by &lt;a href=&quot;https://coiled.io/?utm_source=dask-blog&amp;amp;utm_medium=dask-expr&quot;&gt;Coiled&lt;/a&gt; and &lt;a href=&quot;https://www.nvidia.com/&quot;&gt;NVIDIA&lt;/a&gt;. Thanks to &lt;a href=&quot;https://github.com/phofl&quot;&gt;Patrick Hoefler&lt;/a&gt; and &lt;a href=&quot;https://github.com/rjzamora&quot;&gt;Rick Zamora&lt;/a&gt;, in particular. Original version of this post appears on &lt;a href=&quot;https://blog.coiled.io/blog/dask-expr-introduction.html?utm_source=dask-blog&amp;amp;utm_medium=dask-expr&quot;&gt;blog.coiled.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Expression tree encoded by dask-expr&quot; src=&quot;/images/dask_expr/dask-expr-introduction-title.png&quot; style=&quot;width: 70%;&quot; /&gt;&lt;/p&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Dask DataFrame doesn’t currently optimize your code for you (like Spark or a SQL database would).
This means that users waste a lot of computation. Let’s look at a common example
which looks ok at first glance, but is actually pretty inefficient.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;s3://coiled-datasets/uber-lyft-tlc/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# unnecessarily reads all rows and columns
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hvfhs_license_num&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;HV0003&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# could push the filter into the read parquet call
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numeric_only&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tips&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;                                &lt;span class=&quot;c1&quot;&gt;# should read only necessary columns
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can make this run much faster with a few simple steps:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;s3://coiled-datasets/uber-lyft-tlc/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hvfhs_license_num&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;==&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;HV0003&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tips&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tips&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Currently, Dask DataFrame wouldn’t optimize this for you, but a new effort that is built around
logical query planning in Dask DataFrame will do this for you. This article introduces some of
those changes that are developed in &lt;a href=&quot;https://github.com/dask-contrib/dask-expr&quot;&gt;dask-expr&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can install and try &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-expr&lt;/code&gt; with:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;pip&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We are using the &lt;a href=&quot;https://www.nyc.gov/site/tlc/about/tlc-trip-record-data.page&quot;&gt;NYC Taxi&lt;/a&gt;
dataset in this post.&lt;/p&gt;

&lt;h2 id=&quot;dask-expressions&quot;&gt;Dask Expressions&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/dask-contrib/dask-expr&quot;&gt;Dask expressions&lt;/a&gt; provides a logical query planning layer on
top of Dask DataFrames. Let’s look at our initial example and investigate how we can improve the efficiency
through a query optimization layer. As noted initially, there are a couple of things that aren’t ideal:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We are reading all rows into memory instead of filtering while reading the parquet files.&lt;/li&gt;
  &lt;li&gt;We are reading all columns into memory instead of only the columns that are necessary.&lt;/li&gt;
  &lt;li&gt;We are applying the filter and the aggregation onto all columns instead of only &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;tips&quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The query optimization layer from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-expr&lt;/code&gt; can help us with that. It will look at this expression
and determine that not all rows are needed. An intermediate layer will transpile the filter into
a valid filter-expression for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_parquet&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;s3://coiled-datasets/uber-lyft-tlc/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hvfhs_license_num&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;==&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;HV0003&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numeric_only&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tips&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This still reads every column into memory and will compute the sum of every numeric column. The
next optimization step is to push the column selection into the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_parquet&lt;/code&gt; call as well.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;s3://coiled-datasets/uber-lyft-tlc/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tips&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hvfhs_license_num&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;==&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;HV0003&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numeric_only&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is a basic example that you could rewrite by hand. Use cases that are closer to real
workflows might potentially have hundreds of columns, which makes rewriting them very strenuous
if you need a non-trivial subset of them.&lt;/p&gt;

&lt;p&gt;Let’s take a look at how we can achieve this. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-expr&lt;/code&gt; records the expression as given by the
user in an expression tree:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pprint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;Projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;tips&apos;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numeric_only&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;ReadParquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;s3://coiled-datasets/uber-lyft-tlc/&apos;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;EQ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;HV0003&apos;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Projection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;hvfhs_license_num&apos;&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;ReadParquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;s3://coiled-datasets/uber-lyft-tlc/&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This tree represents the expression as is. We can observe that we would read the whole dataset into
memory before we apply the projections and filters. One observation of note: It seems like we
are reading the dataset twice, but Dask is able to fuse tasks that are doing the same to avoid
computing these things twice. Let’s reorder the expression to make it more efficient:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;simplify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pprint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;Sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numeric_only&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;ReadParquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;s3://coiled-datasets/uber-lyft-tlc/&apos;&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;tips&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;filters&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;hvfhs_license_num&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;==&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;HV0003&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This looks quite a bit simpler. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-expr&lt;/code&gt; reordered the query and pushed the filter and the column
projection into the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_parquet&lt;/code&gt; call. We were able to remove quite a few steps from our expression
tree and make the remaining expressions more efficient as well. This represents the steps that
we did manually in the beginning. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-expr&lt;/code&gt; performs these steps for arbitrary many columns without
increasing the burden on the developers.&lt;/p&gt;

&lt;p&gt;These are only the two most common and easy to illustrate optimization techniques from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-expr&lt;/code&gt;.
Some other useful optimizations are already available:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;len(...)&lt;/code&gt; will only use the Index to compute the length; additionally we can ignore many operations
that won’t change the shape of a DataFrame, like a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;replace&lt;/code&gt; call.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;set_index&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sort_values&lt;/code&gt; won’t eagerly trigger computations.&lt;/li&gt;
  &lt;li&gt;Better informed selection of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;merge&lt;/code&gt; algorithms.&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are still adding more optimization techniques to make Dask DataFrame queries more efficient.&lt;/p&gt;

&lt;h2 id=&quot;try-it-out&quot;&gt;Try it out&lt;/h2&gt;

&lt;p&gt;The project is in a state where interested users should try it out. We published a couple of
releases. The API covers a big chunk of the Dask DataFrame API, and we keep adding more.
We have already observed very impressive performance improvements for workflows that would benefit
from query optimization. Memory usage is down for these workflows as well.&lt;/p&gt;

&lt;p&gt;We are very much looking for feedback and potential avenues to improve the library. Please give it
a shot and share your experience with us.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-expr&lt;/code&gt; is not integrated into the main Dask DataFrame implementation yet. You can install it
with:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;pip&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The API is very similar to what Dask DataFrame provides. It exposes mostly the same methods as
Dask DataFrame does. You can use the same methods in most cases.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;import dask_expr as dd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can find a list of supported operations in the
&lt;a href=&quot;https://github.com/dask-contrib/dask-expr#api-coverage&quot;&gt;Readme&lt;/a&gt;. This project is still very much
in progress. The API might change without warning. We are aiming for weekly releases to push new
features out as fast as possible.&lt;/p&gt;

&lt;h2 id=&quot;why-are-we-adding-this-now&quot;&gt;Why are we adding this now?&lt;/h2&gt;

&lt;p&gt;Historically, Dask focused on flexibility and smart scheduling instead of query optimization.
The distributed scheduler built into Dask uses sophisticated algorithms to ensure ideal scheduling
of individual tasks. It tries to ensure that your resources are utilized as efficient as possible.
The graph construction process enables Dask users to build very
flexible and complicated graphs that reach beyond SQL operations. The flexibility that is provided
by the &lt;a href=&quot;https://docs.dask.org/en/latest/futures.html&quot;&gt;Dask futures API&lt;/a&gt; requires very intelligent
algorithms, but it enables users to build highly sophisticated graphs. The following picture shows
the graph for a credit risk model:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/dask_expr/graph_credit_risk_model.png&quot;&gt;
&lt;img src=&quot;/images/dask_expr/graph_credit_risk_model.png&quot; width=&quot;70%&quot; alt=&quot;Computation graph representing a credit risk model&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The nature of the powerful scheduler and the physical optimizations enables us to build very
complicated programs that will then run efficiently. Unfortunately, the nature of these optimizations
does not enable us to avoid scheduling work that is not necessary. This is where the current effort
to build high level query optimization into Dask comes in.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Dask comes with a very smart distributed scheduler but without much logical query planning. This
is something we are rectifying now through building a high level query optimizer into Dask
DataFrame. We expect to improve performance and reduce memory usage for an average Dask workflow.&lt;/p&gt;

&lt;p&gt;This API is read for interested users to play around with. It covers a good chunk of the DataFrame
API. The library is under active development, we expect to add many more interesting things over
the coming weeks and months.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Upstream testing in Dask</title>
   <link href="https://blog.dask.org/2023/04/18/dask-upstream-testing"/>
   <updated>2023-04-18T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2023/04/18/dask-upstream-testing</id>
   
   <category>dask</category>
   
   <category>ecosystem</category>
   
   <category>pydata</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;Original version of this post appears on &lt;a href=&quot;https://blog.coiled.io/blog/dask-upstream-testing.html?utm_source=dask-blog&amp;amp;utm_medium=dask-upstream-testing&quot;&gt;blog.coiled.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.dask.org/&quot;&gt;Dask&lt;/a&gt; has deep integrations with other libraries in the PyData ecosystem like NumPy, pandas, Zarr, PyArrow, and more.
Part of providing a good experience for Dask users is making sure that Dask continues to work well with this community
of libraries as they push out new releases. This post walks through how Dask maintainers proactively ensure Dask
continuously works with its surrounding ecosystem.&lt;/p&gt;

&lt;h2 id=&quot;nightly-testing&quot;&gt;Nightly testing&lt;/h2&gt;

&lt;p&gt;Dask has a &lt;a href=&quot;https://github.com/dask/dask/blob/834a19eaeb6a5d756ca4ea90b56ca9ac943cb051/.github/workflows/upstream.yml&quot;&gt;dedicated CI build&lt;/a&gt;
that runs Dask’s normal test suite once a day with unreleased, nightly versions of
several libraries installed. This lets us check whether or not a recent change in a library like NumPy or pandas
breaks some aspect of Dask’s functionality.&lt;/p&gt;

&lt;p&gt;To increase visibility when such a breakage occurs, as part of the upstream CI build, an
issue is automatically opened that provides a summary of what tests failed and links to the build
logs for the corresponding failure (&lt;a href=&quot;https://github.com/dask/dask/issues/9736&quot;&gt;here’s an example issue&lt;/a&gt;).&lt;/p&gt;

&lt;div align=&quot;center&quot;&gt;

  &lt;p&gt;&lt;img src=&quot;/images/example-upstream-CI-issue.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;This makes it less likely that a failing upstream build goes unnoticed.&lt;/p&gt;

&lt;h2 id=&quot;how-things-can-break-and-are-fixed&quot;&gt;How things can break and are fixed&lt;/h2&gt;

&lt;p&gt;There are usually two different ways in which things break. Either:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A library made an intentional change in behavior and a corresponding compatibility change needs to be made in
Dask (the next section has an example of this case).&lt;/li&gt;
  &lt;li&gt;There was some unintentional consequence of a change made in a library that resulted in a breakage in Dask.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When the latter case occurs, Dask maintainers can then engage with other library maintainers to resolve the
unintended breakage. This all happens before any libraries push out a new release, so no user code breaks.&lt;/p&gt;

&lt;h2 id=&quot;example-pandas-20&quot;&gt;Example: pandas 2.0&lt;/h2&gt;

&lt;p&gt;One specific example of this process in action is the recent pandas 2.0 release.
This is a major version release and contains significant breaking changes like removing deprecated functionality.&lt;/p&gt;

&lt;p&gt;As these breaking changes were merged into pandas, we started seeing related failures in Dask’s upstream CI build.
Dask maintainers were then able to add
&lt;a href=&quot;https://github.com/dask/dask/pulls?q=is%3Apr+%22pandas+2.0%22+in%3Atitle&quot;&gt;a variety of compatibility changes&lt;/a&gt; so
that Dask works well with pandas 2.0 immediately.&lt;/p&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;Special thanks to &lt;a href=&quot;https://github.com/keewis&quot;&gt;Justus Magin&lt;/a&gt; for his work on the
&lt;a href=&quot;https://github.com/xarray-contrib/issue-from-pytest-log&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xarray-contrib/issue-from-pytest-log&lt;/code&gt;&lt;/a&gt; GitHub action.
We’ve found this to be really convenient for easily opening up GitHub issues when test failures occur.&lt;/p&gt;

&lt;p&gt;Also, thanks to &lt;a href=&quot;https://github.com/j-bennet&quot;&gt;Irina Truong&lt;/a&gt; (&lt;a href=&quot;https://www.coiled.io/?utm_source=dask-blog&amp;amp;utm_medium=dask-upstream-testing&quot;&gt;Coiled&lt;/a&gt;), &lt;a href=&quot;https://github.com/phofl&quot;&gt;Patrick Hoefler&lt;/a&gt; (&lt;a href=&quot;https://www.coiled.io/?utm_source=dask-blog&amp;amp;utm_medium=dask-upstream-testing&quot;&gt;Coiled&lt;/a&gt;),
and &lt;a href=&quot;https://github.com/mroeschke&quot;&gt;Matthew Roeschke&lt;/a&gt; (&lt;a href=&quot;https://rapids.ai/&quot;&gt;NVIDIA&lt;/a&gt;) for their efforts ensuring pandas and Dask
continue to work together.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Do you need consistent environments between the client, scheduler and workers?</title>
   <link href="https://blog.dask.org/2023/04/14/scheduler-environment-requirements"/>
   <updated>2023-04-14T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2023/04/14/scheduler-environment-requirements</id>
   
   <category>dataframe</category>
   
   <category>IO</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;Update May 3rd 2023: &lt;a href=&quot;https://github.com/dask/dask-blog/pull/166&quot;&gt;Clarify GPU recommendations&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With the release &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2023.4.0&lt;/code&gt; of dask and distributed we are making a change which may require the Dask scheduler to have consistent software and hardware capabilities as the client and workers.&lt;/p&gt;

&lt;p&gt;It has always been recommended that your client and workers have a consistent software and hardware environment so that data structures and dependencies can be pickled and passed between them. However recent changes to the Dask scheduler mean that we now also require your scheduler to have the same consistent environment as everything else.&lt;/p&gt;

&lt;h2 id=&quot;what-does-this-mean-for-me&quot;&gt;What does this mean for me?&lt;/h2&gt;

&lt;p&gt;For most users, this change should go unnoticed as it is common to run all Dask components in the same conda environment or docker image and typically on homogenous machines.&lt;/p&gt;

&lt;p&gt;However, for folks who may have optimized their schedulers to use cut-down environments, or for users with specialized hardware such as GPUs available on their client/workers but not the scheduler there may be some impact.&lt;/p&gt;

&lt;h2 id=&quot;what-will-the-impact-be&quot;&gt;What will the impact be?&lt;/h2&gt;

&lt;p&gt;If you run into errors such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;RuntimeError: Error during deserialization of the task graph. This frequently occurs if the Scheduler and Client have different environments.&quot;&lt;/code&gt; please ensure your software environment is consistent between your client, scheduler and workers.&lt;/p&gt;

&lt;p&gt;If you are passing GPU objects between the client and workers we now recommend that your scheduler has a GPU too. This recommendation is just so that GPU-backed objects contained in Dask graphs can be deserialized on the scheduler if necessary. Typically the GPU available to the scheduler doesn’t need to be as powerful as long as it has &lt;a href=&quot;https://en.wikipedia.org/wiki/CUDA#GPUs_supported&quot;&gt;similar CUDA compute capabilities&lt;/a&gt;. For example for cost optimization reasons you may want to use A100s on your client and workers and a T4 on your scheduler.&lt;/p&gt;

&lt;p&gt;Users who do not have a GPU on the client and are leveraging GPU workers shouldn’t run into this as the GPU objects will only exist on the workers.&lt;/p&gt;

&lt;h2 id=&quot;why-are-we-doing-this&quot;&gt;Why are we doing this?&lt;/h2&gt;

&lt;p&gt;The reason we now suggest that you have the same hardware/software capabilities on the scheduler is that we are giving the scheduler the ability to deserialize graphs before distributing them to the workers. This will allow the scheduler to make smarter scheduling decisions in the future by having a better understanding of the operation it is performing.&lt;/p&gt;

&lt;p&gt;The downside to this is that graphs can contain complex Python objects created by any number of dependencies on the client side, so in order for the scheduler to deserialize them it needs to have the same libraries installed. Equally, if the client-side packages create GPU objects then the scheduler will also need one.&lt;/p&gt;

&lt;p&gt;We are sure you’ll agree that this breakage for a small percentage of users will be worth it for the long-term improvements to Dask.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Deep Dive into creating a Dask DataFrame Collection with from_map</title>
   <link href="https://blog.dask.org/2023/04/12/from-map"/>
   <updated>2023-04-12T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2023/04/12/from-map</id>
   
   <category>dataframe</category>
   
   <category>IO</category>
   
   <content type="html">
&lt;p&gt;&lt;a href=&quot;https://docs.dask.org/en/stable/dataframe.html&quot;&gt;Dask DataFrame&lt;/a&gt; provides dedicated IO functions for several popular tabular-data formats, like CSV and Parquet. If you are working with a supported format, then the corresponding function (e.g &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_csv&lt;/code&gt;) is likely to be the most reliable way to create a new Dask DataFrame collection. For other workflows, &lt;a href=&quot;https://docs.dask.org/en/stable/generated/dask.dataframe.from_map.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt;&lt;/a&gt; now offers a convenient way to define a DataFrame collection as an arbitrary function mapping. While these kinds of workflows have historically required users to adopt the Dask Delayed API, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; now makes custom collection creation both easier and more performant.&lt;/p&gt;

&lt;h2 id=&quot;what-is-from_map&quot;&gt;What is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; API was added to Dask DataFrame in v2022.05.1 with the intention of replacing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_delayed&lt;/code&gt; as the recommended means of custom DataFrame creation. At its core, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; simply converts each element of an iterable object (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;inputs&lt;/code&gt;) into a distinct Dask DataFrame partition, using a common function (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;func&lt;/code&gt;):&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Callable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iterable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Iterable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The overall behavior is essentially the Dask DataFrame equivalent of the standard-Python &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; function:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Callable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iterable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Iterable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Iterator&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map&lt;/code&gt; actually support an arbitrary number of iterable inputs. However, we will only focus on the use of a single iterable argument in this post.&lt;/p&gt;

&lt;h2 id=&quot;a-simple-example&quot;&gt;A simple example&lt;/h2&gt;

&lt;p&gt;To better understand the behavior of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt;, let’s consider the simple case that we want to interact with Feather-formatted data created with the following Pandas code:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;paths&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;./data.0.feather&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;./data.1.feather&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;xyz&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;A&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;B&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_feather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since Dask does not yet offer a dedicated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_feather&lt;/code&gt; function (as of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-2023.3.1&lt;/code&gt;), most users would assume that the only option to create a Dask DataFrame collection is to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.delayed&lt;/code&gt;. The “best practice” for creating a collection in this case, however, is to wrap &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pd.read_feather&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cudf.read_feather&lt;/code&gt; in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; call like so:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_feather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Structure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                   &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;  &lt;span class=&quot;nb&quot;&gt;object&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;
                 &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
                 &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;read_feather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;graph&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;layer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Which produces the following Pandas (or cuDF) object after computation:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Although the same output can be achieved using the conventional &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dd.from_delayed&lt;/code&gt; strategy, using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; will improve the available opportunities for task-graph optimization within Dask.&lt;/p&gt;

&lt;h2 id=&quot;performance-considerations-specifying-meta-and-divisions&quot;&gt;Performance considerations: Specifying &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;divisions&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Although &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;func&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iterable&lt;/code&gt; are the only &lt;em&gt;required&lt;/em&gt; arguments to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt;, one can significantly improve the overall performance of a workflow by specifying optional arguments like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;divisions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Due to the lazy nature of Dask DataFrame, each collection is required to carry around a schema (column name and dtype information) in the form of an empty Pandas (or cuDF) object. If &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; is not directly provided to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; function, the schema will need to be populated by eagerly materializing the first partition, which can increase the apparent latency of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; API call itself. For this reason, it is always recommended to specify an explicit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; argument if the expected column names and dtypes are known a priori.&lt;/p&gt;

&lt;p&gt;While passing in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; argument is likely to reduce the&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; API call latency, passing in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;divisions&lt;/code&gt; argument makes it possible to reduce the end-to-end compute time. This is because, by specifying &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;divisions&lt;/code&gt;, we are allowing Dask DataFrame to track useful per-partition min/max statistics. Therefore, if the overall workflow involves grouping or joining on the index, Dask can avoid the need to perform unnecessary shuffling operations.&lt;/p&gt;

&lt;h2 id=&quot;using-from_map-to-implement-a-custom-api&quot;&gt;Using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; to implement a custom API&lt;/h2&gt;

&lt;p&gt;Although it is currently difficult to automatically extract division information from the metadata of an arbitrary Feather dataset, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; makes it relatively easy to implement your own highly-functional &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_feather&lt;/code&gt; API using &lt;a href=&quot;https://arrow.apache.org/docs/python/index.html&quot;&gt;PyArrow&lt;/a&gt;. For example, the following code is all that one needs to enable lazy Feather IO with both column projection and index selection:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;from_arrow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;(Optional) Utility to enforce &apos;backend&apos; configuration&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;dataframe.backend&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;cudf&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cudf&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_arrow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;read_feather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Create a Dask DataFrame from Feather files

    Example of a &quot;custom&quot; `from_map` IO function

    Parameters
    ----------
    paths: list
        List of Feather-formatted paths. Each path will
        be mapped to a distinct DataFrame partition.
    columns: list or None, default None
        Optional list of columns to select from each file.
    index: str or None, default None
        Optional column name to set as the DataFrame index.

    Returns
    -------
    dask.dataframe.DataFrame
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pyarrow.dataset&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ds&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Step 1: Extract `meta` from the dataset
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;feather&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from_arrow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;schema&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empty_table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Step 2: Define the `func` argument
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;frag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Create a Pandas DataFrame from a dataset fragment
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# NOTE: In practice, this function should
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# always be defined outside `read_feather`
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;assert&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;read_columns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;read_columns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from_arrow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;frag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Step 3: Define the `iterable` argument
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;iterable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_fragments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Step 4: Call `from_map`
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;iterable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# `func` kwarg
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# `func` kwarg
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here we see that using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; to enable completely-lazy collection creation only requires four steps. First, we use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyarrow.dataset&lt;/code&gt; to define a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; argument for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt;, so that we can avoid the unnecessary overhead of an eager read operation. For some file formats and/or applications, it may also be possible to calculate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;divisions&lt;/code&gt; at this point. However, as explained above, such information is not readily available for this particular example.&lt;/p&gt;

&lt;p&gt;The second step is to define the underlying function (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;func&lt;/code&gt;) that we will use to produce each of our final DataFrame partitions. Third, we define one or more iterable objects containing the unique information needed to produce each partition (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iterable&lt;/code&gt;). In this case, the only iterable object corresponds to a generator of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyarrow.dataset&lt;/code&gt; fragments, which is essentially a wrapper around the input path list.&lt;/p&gt;

&lt;p&gt;The fourth and final step is to use the final &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;func&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;interable&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; information to call the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; API. Note that we also use this opportunity to specify additional key-word arguments, like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;columns&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index&lt;/code&gt;. In contrast to the iterable positional arguments, which are always mapped to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;func&lt;/code&gt;, these key-word arguments will be broadcasted.&lt;/p&gt;

&lt;p&gt;Using the&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_feather&lt;/code&gt; implementation above, it becomes both easy and efficient to convert an arbitrary Feather dataset into a lazy Dask DataFrame collection:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;read_feather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;A&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;index&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Structure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                   &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;
                 &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
                 &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;graph&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;layer&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;advanced-enhancing-column-projection&quot;&gt;Advanced: Enhancing column projection&lt;/h2&gt;

&lt;p&gt;Although a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_feather&lt;/code&gt; implementation like the one above is likely to meet the basic needs of most applications, it is certainly possible that users will often leave out the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;column&lt;/code&gt; argument in practice. For example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;read_feather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;A&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For code like this, as the implementation currently stands, each IO task would be forced to read in an entire Feather file, and then select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;”A”&lt;/code&gt; column from a Pandas/cuDF DataFrame only after it had already been read into memory. The additional overhead is insignificant for the toy-dataset used here. However, avoiding this kind of unnecessary IO can lead to dramatic performance improvements in real-world applications.&lt;/p&gt;

&lt;p&gt;So, how can we modify our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_feather&lt;/code&gt; implementation to take advantage of external column-projection operations (like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddf[&quot;A&quot;]&lt;/code&gt;)? The good news is that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; is already equipped with the necessary graph-optimization hooks to handle this, so long as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;func&lt;/code&gt; object satisfies the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DataFrameIOFunction&lt;/code&gt; protocol:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;runtime_checkable&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DataFrameIOFunction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Protocol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;DataFrame IO function with projectable columns
    Enables column projection in ``DataFrameIOLayer``.
    &quot;&quot;&quot;&lt;/span&gt;

    &lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;property&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Return the current column projection&quot;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NotImplementedError&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;project_columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Return a new DataFrameIOFunction object
        with a new column projection
        &quot;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NotImplementedError&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__call__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Return a new DataFrame partition&quot;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NotImplementedError&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That is, all we need to do is change “Step 2” of our implementation to use the following code instead:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe.io.utils&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrameIOFunction&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ReadFeather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrameIOFunction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Create a Pandas/cuDF DataFrame from a dataset fragment&quot;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_columns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;
            &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;

        &lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;property&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_columns&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;project_columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# Replace this object with one that will only read `columns`
&lt;/span&gt;            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ReadFeather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__call__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;frag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;# Same logic as original `func`
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;read_columns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;read_columns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from_arrow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;frag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_table&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ReadFeather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;It is now easier than ever to create a Dask DataFrame collection from an arbitrary data source. Although the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.delayed&lt;/code&gt; API has already enabled similar functionality for many years, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt; now makes it possible to implement a custom IO function without sacrificing any of the high-level graph optimizations leveraged by the rest of the Dask DataFrame API.&lt;/p&gt;

&lt;p&gt;Start experimenting with &lt;a href=&quot;https://docs.dask.org/en/stable/generated/dask.dataframe.from_map.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_map&lt;/code&gt;&lt;/a&gt; today, and let us know how it goes!&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Shuffling large data at constant memory in Dask</title>
   <link href="https://blog.dask.org/2023/03/15/shuffling-large-data-at-constant-memory"/>
   <updated>2023-03-15T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2023/03/15/shuffling-large-data-at-constant-memory</id>
   
   <category>p2p</category>
   
   <category>shuffling</category>
   
   <category>dask</category>
   
   <category>distributed</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work was engineered and supported by &lt;a href=&quot;https://coiled.io?utm_source=dask-blog&amp;amp;utm_medium=shuffling-large-data-at-constant-memory&quot;&gt;Coiled&lt;/a&gt;. In particular, thanks to &lt;a href=&quot;https://github.com/fjetter&quot;&gt;Florian Jetter&lt;/a&gt;, &lt;a href=&quot;https://github.com/gjoseph92&quot;&gt;Gabe Joseph&lt;/a&gt;, &lt;a href=&quot;https://github.com/hendrikmakait&quot;&gt;Hendrik Makait&lt;/a&gt;, and &lt;a href=&quot;https://matthewrocklin.com/?utm_source=dask-blog&amp;amp;utm_medium=shuffling-large-data-at-constant-memory&quot;&gt;Matt Rocklin&lt;/a&gt;. Original version of this post appears on &lt;a href=&quot;https://blog.coiled.io/blog/shuffling-large-data-at-constant-memory.html?utm_source=dask-blog&amp;amp;utm_medium=shuffling-large-data-at-constant-memory&quot;&gt;blog.coiled.io&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With release &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2023.2.1&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.dataframe&lt;/code&gt; introduces a new shuffling method called P2P, making sorts, merges, and joins faster and using constant memory.
Benchmarks show impressive improvements:&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;P2P shuffling uses constant memory while task-based shuffling scales linearly.&quot; src=&quot;/images/p2p_benchmark_memory_usage.png&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;P2P shuffling (blue) uses constant memory while task-based shuffling (orange) scales linearly.&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;This article describes the problem, the new solution, and the impact on performance.&lt;/p&gt;

&lt;h2 id=&quot;what-is-shuffling&quot;&gt;What is Shuffling?&lt;/h2&gt;

&lt;p&gt;Shuffling is a key primitive in data processing systems.
It is used whenever we move a dataset around in an all-to-all fashion, such as occurs in sorting, dataframe joins, or array rechunking.
Shuffling is a challenging computation to run efficiently, with lots of small tasks sharding the data.&lt;/p&gt;

&lt;h2 id=&quot;task-based-shuffling-scales-poorly&quot;&gt;Task-based shuffling scales poorly&lt;/h2&gt;

&lt;p&gt;While systems like distributed databases and Apache Spark use a dedicated shuffle service to move data around the cluster, Dask builds on task-based scheduling.
Task-based systems are more flexible for general-purpose parallel computing but less suitable for all-to-all shuffling.
This results in three main issues:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Scheduler strain:&lt;/strong&gt; The scheduler hangs due to the sheer amount of tasks required for shuffling.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Full dataset materialization:&lt;/strong&gt; Workers materialize the entire dataset causing the cluster to run out of memory.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Many small operations:&lt;/strong&gt; Intermediate tasks are too small and bring down hardware performance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Together, these issues make large-scale shuffles inefficient, causing users to over-provision clusters.
Fortunately, we can design a system to address these concerns.
Early work on this started back &lt;a href=&quot;https://www.coiled.io/blog/better-shuffling-in-dask-a-proof-of-concept?utm_source=dask-blog&amp;amp;utm_medium=shuffling-large-data-at-constant-memory&quot;&gt;in 2021&lt;/a&gt; and has now matured into the P2P shuffling system:&lt;/p&gt;

&lt;h2 id=&quot;p2p-shuffling&quot;&gt;P2P shuffling&lt;/h2&gt;

&lt;p&gt;With release &lt;a href=&quot;https://distributed.dask.org/en/stable/changelog.html#v2023-2-1&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2023.2.1&lt;/code&gt;&lt;/a&gt;, Dask introduces a new shuffle method called P2P, making sorts, merges, and joins run faster and in constant memory.&lt;/p&gt;

&lt;p&gt;This system is designed with three aspects, mirroring the problems listed above:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Peer-to-Peer communication:&lt;/strong&gt; Reduce the involvement of the scheduler&lt;/p&gt;

    &lt;p&gt;Shuffling becomes an O(n) operation from the scheduler’s perspective, removing a key bottleneck.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;P2P shuffling uses fewer tasks than task-based shuffling.&quot; src=&quot;/images/shuffling_tasks.png&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;
&lt;/figure&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Disk by default:&lt;/strong&gt; Store data as it arrives on disk, efficiently.&lt;/p&gt;

    &lt;p&gt;Dask can now shuffle datasets of arbitrary size in small memory, reducing the need to fiddle with right-sizing clusters.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Buffer network and disk with memory:&lt;/strong&gt; Avoid many small writes by buffering sensitive hardware with in-memory stores.&lt;/p&gt;

    &lt;p&gt;Shuffling involves CPU, network, and disk, each of which brings its own bottlenecks when dealing with many small pieces of data.
We use memory judiciously to trade off between these bottlenecks, balancing network and disk I/O to maximize the overall throughput.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In addition to these three aspects, P2P shuffling implements many minor optimizations to improve performance, and it relies on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyarrow&amp;gt;=7.0&lt;/code&gt; for efficient data handling and (de)serialization.&lt;/p&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;To evaluate P2P shuffling, we benchmark against task-based shuffling on common workloads from our benchmark suite.
For more information on this benchmark suite, see the &lt;a href=&quot;https://github.com/coiled/coiled-runtime/tree/main/tests/benchmarks&quot;&gt;GitHub repository&lt;/a&gt; or the &lt;a href=&quot;https://benchmarks.coiled.io/&quot;&gt;latest test results&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;memory-stability&quot;&gt;Memory stability&lt;/h3&gt;

&lt;p&gt;The biggest benefit of P2P shuffling is constant memory usage.
Memory usage drops and stays constant across all workloads:&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;P2P shuffling uses significantly less memory than task-based shuffling on all workloads.&quot; src=&quot;/images/p2p_benchmark_suite.png&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;P2P shuffling (blue) uses constant memory while task-based shuffling (orange) scales linearly.&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;For the tested workloads, we saw up to &lt;strong&gt;10x lower memory&lt;/strong&gt;.
For even larger workloads, this gap only increases.&lt;/p&gt;

&lt;h3 id=&quot;performance-and-speed&quot;&gt;Performance and Speed&lt;/h3&gt;

&lt;p&gt;In the above plot, we can two performance improvements:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Faster execution:&lt;/strong&gt; Workloads run up to 45% faster.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Quicker startup:&lt;/strong&gt; Smaller graphs mean P2P shuffling starts sooner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comparing scheduler dashboards for P2P and task-based shuffling side-by-side
helps to understand what causes these performance gains:&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;Task-based shuffling shows bigger gaps in the task stream and spilling compared to P2P shuffling.&quot; src=&quot;/images/dashboard-comparison.png&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;
    &lt;p&gt;&lt;em&gt;Task-based shuffling (left) shows bigger gaps in the task stream and spilling compared to P2P shuffling (right).&lt;/em&gt;&lt;/p&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Graph size:&lt;/strong&gt; 10x fewer tasks are faster to deploy and easier on the scheduler.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Controlled I/O:&lt;/strong&gt; P2P shuffling handles I/O explicitly, which avoids less performant spilling by Dask.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fewer interruptions:&lt;/strong&gt; I/O is well balanced, so we see fewer gaps in work in the task stream.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, P2P shuffling leverages our hardware far more effectively.&lt;/p&gt;

&lt;h2 id=&quot;changing-defaults&quot;&gt;Changing defaults&lt;/h2&gt;

&lt;p&gt;These results benefit most users, so P2P shuffling is now the default starting from release &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2023.2.1&lt;/code&gt;,
as long as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyarrow&amp;gt;=7.0.0&lt;/code&gt; is installed. Dataframe operations like the following will benefit:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df.set_index(...)&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df.merge(...)&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df.groupby(...).apply(...)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;share-your-experience&quot;&gt;Share your experience&lt;/h3&gt;

&lt;p&gt;To understand how P2P performs on the vast range of workloads out there in the wild, and to ensure that making it the default was the right choice, we would love to learn about your experiences running it.
We have opened a &lt;a href=&quot;https://github.com/dask/distributed/discussions/7509&quot;&gt;discussion issue&lt;/a&gt; on GitHub for feedback on this change.
Please let us know how it helps (or doesn’t).&lt;/p&gt;

&lt;h3 id=&quot;keep-old-behavior&quot;&gt;Keep old behavior&lt;/h3&gt;

&lt;p&gt;If P2P shuffling does not work for you, you can deactivate it by setting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dataframe.shuffle.method&lt;/code&gt; config value to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;tasks&quot;&lt;/code&gt; or explicitly setting a keyword argument, for example:&lt;/p&gt;

&lt;p&gt;with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yaml&lt;/code&gt; config&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;dataframe&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;tasks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or when using a cluster manager&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-python3&quot;&gt;import dask
from dask.distributed import LocalCluster

# The dataframe.shuffle.method config is available since 2023.3.1
with dask.config.set({&quot;dataframe.shuffle.method&quot;: &quot;tasks&quot;}):
    cluster = LocalCluster(...)  # many cluster managers send current dask config automatically
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For more information on deactivating P2P shuffle, see the &lt;a href=&quot;https://github.com/dask/distributed/discussions/7509&quot;&gt;discussion #7509&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-about-arrays&quot;&gt;What about arrays?&lt;/h2&gt;

&lt;p&gt;While the original motivation was to optimize large-scale dataframe joins, the P2P system is useful for all problems requiring lots of communication between tasks.
For array workloads, this often occurs when rechunking data, such as when organizing a matrix by rows when it was stored by columns.
Similar to dataframe joins, array rechunking has been inefficient in the past, which has become such a problem that the array community built specialized tools like &lt;a href=&quot;https://github.com/pangeo-data/rechunker&quot;&gt;rechunker&lt;/a&gt; to avoid it entirely.&lt;/p&gt;

&lt;p&gt;There is a &lt;a href=&quot;https://github.com/dask/distributed/pull/7534&quot;&gt;naive implementation&lt;/a&gt; of array rechunking using the P2P system available for experimental use.
Benchmarking this implementation shows mixed results:&lt;/p&gt;

&lt;figure class=&quot;align-center&quot;&gt;
  &lt;p&gt;&lt;img alt=&quot;P2P rechunking uses constant memory.&quot; src=&quot;/images/p2p_benchmark_arrays.png&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;👍 &lt;strong&gt;Constant memory use:&lt;/strong&gt; As with dataframe operations, memory use is constant.&lt;/li&gt;
  &lt;li&gt;❓ &lt;strong&gt;Variable runtime:&lt;/strong&gt; The runtime of workloads may increase with P2P.&lt;/li&gt;
  &lt;li&gt;👎 &lt;strong&gt;Memory overhead:&lt;/strong&gt; There is a large memory overhead for many small partitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The constant memory use is a very promising result.
There are several ways to tackle the current limitations.
We expect this to improve as we work with collaborators from the array computing community.&lt;/p&gt;

&lt;h2 id=&quot;next-steps&quot;&gt;Next steps&lt;/h2&gt;

&lt;p&gt;Development on P2P shuffling is not done yet.
For the future we plan the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.array&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

    &lt;p&gt;While the early prototype of array rechunking is promising, it’s not there yet.
We plan to do the following:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Intelligently select which algorithm to use (task-based rechunking is better sometimes)&lt;/li&gt;
      &lt;li&gt;Work with collaborators on rechunking to improve performance&lt;/li&gt;
      &lt;li&gt;Seek out other use cases, like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt;, where this might be helpful&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Failure recovery&lt;/strong&gt;:&lt;/p&gt;

    &lt;p&gt;Make P2P shuffling resilient to worker loss; currently, it has to restart entirely.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Performance tuning&lt;/strong&gt;:&lt;/p&gt;

    &lt;p&gt;Performance today is good, but not yet at peak hardware speeds.
We can improve this in a few ways:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Hiding disk I/O&lt;/li&gt;
      &lt;li&gt;Using more memory when appropriate for smaller shuffles&lt;/li&gt;
      &lt;li&gt;Improved batching of small operations&lt;/li&gt;
      &lt;li&gt;More efficient serialization&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To follow along with the development, subscribe to the &lt;a href=&quot;https://github.com/dask/distributed/issues/7507&quot;&gt;tracking issue&lt;/a&gt; on GitHub.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Shuffling data is a common operation in dataframe workloads.
Since &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2023.2.1&lt;/code&gt;, Dask defaults to P2P shuffling for distributed clusters and shuffles data faster and at constant memory.
This improvement unlocks previously un-runnable workload sizes and efficiently uses your clusters.
Finally, P2P shuffling demonstrates extending Dask to add new paradigms while leveraging the foundations of its distributed engine.&lt;/p&gt;

&lt;p&gt;Share results in &lt;a href=&quot;https://github.com/dask/distributed/issues/7507&quot;&gt;this discussion thread&lt;/a&gt; or follow development at this &lt;a href=&quot;https://github.com/dask/distributed/issues/7507&quot;&gt;tracking issue&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Managing dask workloads with Flyte</title>
   <link href="https://blog.dask.org/2023/02/13/dask-on-flyte"/>
   <updated>2023-02-13T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2023/02/13/dask-on-flyte</id>
   
   <category>Python</category>
   
   <category>dask</category>
   
   <category>Flyte</category>
   
   <category>Kubernetes</category>
   
   <content type="html">&lt;p&gt;It is now possible to manage &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; workloads using &lt;a href=&quot;https://flyte.org/&quot;&gt;Flyte&lt;/a&gt; 🎉!&lt;/p&gt;

&lt;p&gt;The major advantages are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Each &lt;a href=&quot;https://docs.flyte.org/projects/flytekit/en/latest/generated/flytekit.task.html&quot;&gt;Flyte &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task&lt;/code&gt;&lt;/a&gt; spins up its own ephemeral &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; cluster using a Docker image tailored to the task, ensuring consistency in the Python environment across the client, scheduler, and workers.&lt;/li&gt;
  &lt;li&gt;Flyte will use the existing &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; infrastructure to spin up &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; clusters.&lt;/li&gt;
  &lt;li&gt;Spot/Preemtible instances are natively supported.&lt;/li&gt;
  &lt;li&gt;The whole &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; task can be cached.&lt;/li&gt;
  &lt;li&gt;Enabling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; support in an already running Flyte setup can be done in just a few minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what a Flyte &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;task&lt;/code&gt; backed by a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; cluster with four workers looks like:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;typing&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;flytekit&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Resources&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;flytekitplugins.dask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WorkerGroup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;task_config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Resources&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WorkerGroup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;number_of_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;limits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Resources&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;32Gi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;increment_numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;list_length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;futures&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;list_length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gather&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;futures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This task can run locally using a standard &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;distributed.Client()&lt;/code&gt; and can scale to arbitrary cluster sizes once &lt;a href=&quot;https://docs.flyte.org/projects/cookbook/en/latest/getting_started/package_register.html&quot;&gt;registered with Flyte&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-is-flyte&quot;&gt;What is Flyte?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://flyte.org/&quot;&gt;Flyte&lt;/a&gt; is a Kubernetes native workflow orchestration engine. Originally developed at &lt;a href=&quot;https://www.lyft.com/&quot;&gt;Lyft&lt;/a&gt;, it is now an open-source (&lt;a href=&quot;https://github.com/flyteorg/flyte&quot;&gt;Github&lt;/a&gt;) and a graduate project under the Linux Foundation. It stands out among similar tools such as &lt;a href=&quot;https://airflow.apache.org/&quot;&gt;Airflow&lt;/a&gt; or &lt;a href=&quot;https://argoproj.github.io/&quot;&gt;Argo&lt;/a&gt; due to its key features, which include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Caching/Memoization of previously executed tasks for improved performance&lt;/li&gt;
  &lt;li&gt;Kubernetes native&lt;/li&gt;
  &lt;li&gt;Workflow definitions in Python, not e.g.,&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YAML&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Strong typing between tasks and workflows using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Protobuf&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Dynamic generation of workflow DAGs at runtime&lt;/li&gt;
  &lt;li&gt;Ability to run workflows locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple workflow would look something like the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;typing&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;flytekit&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;workflow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Resources&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;flytekitplugins.dask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WorkerGroup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;task_config&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Resources&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WorkerGroup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;number_of_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;limits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Resources&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;32Gi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;expensive_data_preparation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_files&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Expensive, highly parallel `dask` code
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Some large DataFrame, Flyte will handle serialization
&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Model training, can also use GPU, etc.
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;s3://path-to-model&quot;&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workflow&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;train_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_files&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;prepared_data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;expensive_data_preparation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_files&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_files&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;input_data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prepared_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the above, both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;expensive_data_preparation()&lt;/code&gt; as well as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;train()&lt;/code&gt; would be run in their own Pod(s) in Kubernetes, while the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;train_model()&lt;/code&gt; workflow is a DSL which creates a Directed Acyclic Graph (DAG) of the workflow. It will determine the order of tasks based on their inputs and outputs. Input and output types (based on the type hints) will be validated at registration time to avoid surprises at runtime.&lt;/p&gt;

&lt;p&gt;After registration with Flyte, the workflow can be started from the UI:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-flyte-workflow.png&quot; alt=&quot;Dask workflow in the Flyte UI&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;why-use-the-dask-plugin-for-flyte&quot;&gt;Why use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; plugin for Flyte?&lt;/h2&gt;

&lt;p&gt;At first glance, Flyte and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; look similar in what they are trying to achieve, both capable of creating a DAG from user functions, managing inputs and outputs, etc. However, the major conceptual difference lies in their approach. While &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; has long-lived workers to run tasks, a Flyte task is a designated Kubernetes Pod that creates a significant overhead in task-runtime.&lt;/p&gt;

&lt;p&gt;While &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; tasks incur an overhead of around one millisecond (refer to the &lt;a href=&quot;https://distributed.dask.org/en/stable/efficiency.html#use-larger-tasks&quot;&gt;docs&lt;/a&gt;), spinning up a new Kubernetes pod takes several seconds. The long-lived nature of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; workers allows for optimization of the DAG, running tasks that operate on the same data on the same node, reducing the need for inter-worker data serialization (known as shuffling). With Flyte tasks being ephemeral, this optimization is not possible, and task outputs are serialized to a blob storage instead.&lt;/p&gt;

&lt;p&gt;Given the limitations discussed above, why use Flyte? Flyte is not intended to replace tools such as dask or Apache Spark, but rather provides an orchestration layer on top. While workloads can be run directly in Flyte, such as training a single GPU model, Flyte offers &lt;a href=&quot;https://flyte.org/integrations&quot;&gt;numerous integrations&lt;/a&gt; with other popular data processing tools.&lt;/p&gt;

&lt;p&gt;With Flyte managing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; cluster lifecycle, each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; Flyte task will run on its own dedicated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; cluster made up of Kubernetes pods. When the Flyte task is triggered from the UI, Flyte will spin up a dask cluster tailored to the task, which will then be used to execute the user code. This enables the use of different Docker images with varying dependencies for different tasks, whilst always ensuring that the dependencies of the client, scheduler, and workers are consistent.&lt;/p&gt;

&lt;h2 id=&quot;what-prerequisites-are-required-to-run-dask-tasks-in-flyte&quot;&gt;What prerequisites are required to run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; tasks in Flyte?&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;The Kubernetes cluster needs to have the &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator.html&quot;&gt;dask operator&lt;/a&gt; installed.&lt;/li&gt;
  &lt;li&gt;Flyte version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1.3.0&lt;/code&gt; or higher is required.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; plugin needs to be enabled in the Flyte propeller config. (refer to the &lt;a href=&quot;https://docs.flyte.org/en/latest/deployment/plugins/k8s/index.html#specify-plugin-configuration&quot;&gt;docs&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;The Docker image associated with the task must have the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flytekitplugins-dask&lt;/code&gt; package installed in its Python environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;how-do-things-work-under-the-hood&quot;&gt;How do things work under the hood?&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Note: The following is for reference only and is not necessary for users who only use the plugin. However, it could be useful for easier debugging.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On a high-level overview, the following steps occur when a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; task is initiated in Flyte:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;FlyteWorkflow&lt;/code&gt; &lt;a href=&quot;https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/&quot;&gt;Custom Resource (CR)&lt;/a&gt; is created in Kubernetes.&lt;/li&gt;
  &lt;li&gt;Flyte Propeller, a &lt;a href=&quot;https://kubernetes.io/docs/concepts/extend-kubernetes/operator/&quot;&gt;Kubernetes Operator&lt;/a&gt;), detects the creation of the workflow.&lt;/li&gt;
  &lt;li&gt;The operator inspects the task’s spec and identifies it as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; task. It verifies if it has the required plugin associated with it and locates the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; plugin.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; plugin within Flyte Propeller picks up the task defintion and creates a &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskjob&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskJob&lt;/code&gt; Custom Resource&lt;/a&gt; using the &lt;a href=&quot;https://github.com/bstadlbauer/dask-k8s-operator-go-client/&quot;&gt;dask-k8s-operator-go-client&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator.html&quot;&gt;dask operator&lt;/a&gt; picks up the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskJob&lt;/code&gt; resource and runs the job accordingly. It spins up a pod to run the client/job-runner, one for the scheduler, and additional worker pods as designated in the Flyte task decorator.&lt;/li&gt;
  &lt;li&gt;While the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; task is running, Flyte Propeller continuously monitors the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskJob&lt;/code&gt; resource, waiting on it to report success or failure. Once the job has finished or the Flyte task has been terminated, all &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt; related resources will be cleaned up.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;useful-links&quot;&gt;Useful links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.flyte.org/en/latest/&quot;&gt;Flyte documentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://flyte.org/community&quot;&gt;Flyte community&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.flyte.org/projects/cookbook/en/latest/auto/integrations/kubernetes/k8s_dask/index.html&quot;&gt;flytekitplugins-dask user documentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.flyte.org/en/latest/deployment/plugins/k8s/index.html&quot;&gt;flytekitplugins-dask deployment documentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://kubernetes.dask.org/en/latest/&quot;&gt;dask-kubernetes documentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.dask.org/2022/11/09/dask-kubernetes-operator&quot;&gt;Blog post on the dask kubernetes operator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In case there are any questions or concerns, don’t hesitate to reach out. You can contact Bernhard Stadlbauer via the &lt;a href=&quot;https://slack.flyte.org/&quot;&gt;Flyte Slack&lt;/a&gt; or via &lt;a href=&quot;https://github.com/bstadlbauer&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would like to give shoutouts to &lt;a href=&quot;https://jacobtomlinson.dev/&quot;&gt;Jacob Tomlinson&lt;/a&gt; (Dask) and &lt;a href=&quot;https://github.com/hamersaw&quot;&gt;Dan Rammer&lt;/a&gt; (Flyte) for all of the help I’ve received. This would not have been possible without your support!&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Easy CPU/GPU Arrays and Dataframes</title>
   <link href="https://blog.dask.org/2023/02/02/easy-cpu-gpu"/>
   <updated>2023-02-02T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2023/02/02/easy-cpu-gpu</id>
   
   <category>GPU</category>
   
   <content type="html">&lt;p&gt;&lt;em&gt;This article was originally posted on the &lt;a href=&quot;https://medium.com/rapids-ai/easy-cpu-gpu-arrays-and-dataframes-run-your-dask-code-where-youd-like-e349d92351d&quot;&gt;RAPIDS blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s now easy to switch between CPU (NumPy / Pandas) and GPU (CuPy / cuDF) in Dask.
As of Dask 2022.10.0, users can optionally select the backend engine for input IO and data creation. In the short-term, the goal of the backend-configuration system is to enable Dask users to write code that will run on both CPU and GPU systems.&lt;/p&gt;

&lt;p&gt;The preferred backend can be configured using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;array.backend&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dataframe.backend&lt;/code&gt; options with the standard Dask configuration system:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;array.backend&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;cupy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;dataframe.backend&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;cudf&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;dispatching-for-array-creation&quot;&gt;Dispatching for Array Creation&lt;/h2&gt;

&lt;p&gt;To see how users can easily switch between NumPy and CuPy, let’s start by creating an array of ones:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;array.backend&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;cupy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}):&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;darr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,))&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Get cupy-backed collection
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;darr&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones_like&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunksize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunktype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chunktype&lt;/code&gt; informs us that the array is constructed with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cupy.ndarray&lt;/code&gt;
objects instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;numpy.ndarray&lt;/code&gt; objects.&lt;/p&gt;

&lt;p&gt;We’ve also improved the user experience for random array creation. Previously, if a user wanted to create a CuPy-backed Dask array, they were required to define an explicit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomState&lt;/code&gt; object in Dask using CuPy. For example, the following code worked prior to Dask 2022.10.0, but seems rather verbose:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;darr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;darr&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunksize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunktype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, we can leverage the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;array.backend&lt;/code&gt; configuration to create a CuPy-backed dask array for random data:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;array.backend&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;cupy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}):&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;darr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Get cupy-backed collection
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;darr&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunksize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunktype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;array.backend&lt;/code&gt; is significantly easier and much more ergonomic – it supports all basic array creation methods including: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ones&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zeros&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;empty&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;full&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arange&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;random&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_array&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_zarr&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_tiledb&lt;/code&gt; have not yet been implemented
with this functionality&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;dispatching-for-dataframe-creation&quot;&gt;Dispatching for Dataframe Creation&lt;/h2&gt;

&lt;p&gt;When creating Dask Dataframes backed by either Pandas or cuDF, the beginning is often the input I/O methods: read_csv, read_parquet, etc. We’ll first start by constructing a dataframe on the fly with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_dict&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;dataframe.backend&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;cudf&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}):&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;b&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask_cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here we can tell we have a cuDF backed dataframe and we are using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-cudf&lt;/code&gt;
because the repr shows us the type: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;dask_cudf.DataFrame | 2 tasks | 2 npartitions&amp;gt;&lt;/code&gt;.
Let’s also demonstrate the read functionality by generating CSV and
Parquet data.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;example.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;single_file&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;example.parquet&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now we are simply repeating the config setting but instead using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_csv&lt;/code&gt;
and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_parquet&lt;/code&gt; methods:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; with dask.config.set({&quot;dataframe.backend&quot;: &quot;cudf&quot;}):
...     ddf = dd.read_csv(&apos;example.csv&apos;)
...     print(type(ddf))
...
&amp;lt;class &apos;dask_cudf.core.DataFrame&apos;&amp;gt;
&amp;gt;&amp;gt;&amp;gt; with dask.config.set({&quot;dataframe.backend&quot;: &quot;cudf&quot;}):
...     ddf = dd.read_parquet(&apos;example.parquet&apos;)
...     type(ddf)
...
&amp;lt;class &apos;dask_cudf.core.DataFrame&apos;&amp;gt;
&amp;gt;&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;why-is-this-useful-&quot;&gt;Why is this Useful ?&lt;/h2&gt;

&lt;p&gt;As hardware changes in exciting and exotic ways with: GPUs, TPUs, IPUs,
etc., we want to provide the same interface and treat hardware as an
abstraction. For example, many PyTorch workflows start with the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;device&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;cuda&apos;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;torch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cuda&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;is_available&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;cpu&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And what follows is typically standard hardware agnostic PyTorch. This is
incredibly powerful as the user (in most cases) should not care what hardware
underlies the source. As such, it enables the user to develop PyTorch anywhere
and everywhere. The new Dask backend selection configurations gives users a
similar freedom.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Our long-term goal of this feature is to enable Dask users to use any backend library in dask.array and dask.dataframe, as long as that library conforms to the minimal “array” or “dataframe” standard defined by the data-api consortium, respectively.&lt;/p&gt;

&lt;p&gt;The RAPIDS team consistently works with the open-source community to understand and address emerging needs. If you’re an open-source maintainer interested in bringing GPU-acceleration to your project, please reach out on Github or Twitter. The RAPIDS team would love to learn how potential new algorithms or toolkits would impact your work.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Demo Day November 2022</title>
   <link href="https://blog.dask.org/2022/11/21/november-demo-day"/>
   <updated>2022-11-21T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2022/11/21/november-demo-day</id>
   
   <category>Community</category>
   
   <content type="html">
&lt;p&gt;Once a month, the Dask Community team hosts Dask Demo Day: an informal and fun online hangout where folks can showcase new or lesser-known Dask features and the rest of us can learn about all the things we didn’t know Dask could do 😁&lt;/p&gt;

&lt;p&gt;November’s Dask Demo Day had five great demos. We learned about:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#visualization-at-lightning-speed&quot;&gt;Visualizing 2-billion lightning flashes with Dask, RAPIDS and Datashader&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#the-new-dask-cli&quot;&gt;The new Dask CLI&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#xgboost-hpo-with-dask-and-optuna&quot;&gt;The Dask-Optuna integration for distributed hyperparameter optimization&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#dask-for-awkward-arrays&quot;&gt;Dask-Awkward&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#profiling-dask-on-a-cluster-with-py-spy&quot;&gt;Profiling your Dask code with Dask-PySpy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This blog gives you a quick overview of the five demos and demonstrates how they might be useful to you. You can &lt;a href=&quot;https://www.youtube.com/embed/_x7oaSEJDjA&quot;&gt;watch the full recording below&lt;/a&gt;.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/_x7oaSEJDjA&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;visualization-at-lightning-speed&quot;&gt;Visualization at Lightning Speed&lt;/h2&gt;

&lt;p&gt;Would it be possible to interactively visualize all the lightning strikes in his dataset, &lt;a href=&quot;https://www.albany.edu/daes/faculty/kevin-tyle&quot;&gt;Kevin Tyle&lt;/a&gt; (University of Albany) recently asked himself. In this demo, Kevin shows you how he leveraged &lt;a href=&quot;https://developer.nvidia.com/cuda-zone&quot;&gt;CUDA&lt;/a&gt;, &lt;a href=&quot;https://rapids.ai/&quot;&gt;RAPIDS-AI&lt;/a&gt;, &lt;a href=&quot;https://www.dask.org/&quot;&gt;Dask&lt;/a&gt; and &lt;a href=&quot;https://datashader.org/&quot;&gt;Datashader&lt;/a&gt; to build a smooth interactive visualization of 8 years’ worth of lightning strikes. That’s over 2 billion rows of data.&lt;/p&gt;

&lt;p&gt;Kevin shows you how to finetune performance of such a large-scale data processing workflow by:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Leveraging GPUs&lt;/li&gt;
  &lt;li&gt;Using a Dask cluster to maximize hardware usage&lt;/li&gt;
  &lt;li&gt;Making smart choices about file types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img alt=&quot;Heatmap of lightning strikes in the US&quot; src=&quot;/images/2022-11-demo-day/lightning.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Watch the &lt;a href=&quot;https://youtu.be/_x7oaSEJDjA?t=167&quot;&gt;full demo&lt;/a&gt; or read more about &lt;a href=&quot;https://www.coiled.io/blog/datashader-data-visualisation-performance&quot;&gt;high-performance visualization strategies&lt;/a&gt; with Dask and Datashader.&lt;/p&gt;

&lt;h2 id=&quot;the-new-dask-cli&quot;&gt;The New Dask CLI&lt;/h2&gt;

&lt;p&gt;During the Dask Sprint at &lt;a href=&quot;https://conference.scipy.org/&quot;&gt;SciPy&lt;/a&gt; this year, a group of Dask maintainers began work on an upgraded, high-level &lt;a href=&quot;https://docs.dask.org/en/stable/cli.html&quot;&gt;Dask CLI&lt;/a&gt;. &lt;a href=&quot;https://ddavis.io/about/&quot;&gt;Doug Davis&lt;/a&gt; (Anaconda) walks us through how the CLI works and all the things you can do with it. After installing dask, you can access the CLI by typing dask into your terminal. The tool is designed to be easily extensible by anyone working on Dask. Doug shows you how to add your own components to the Dask CLI.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Screenshot of the new Dask CLI in action&quot; src=&quot;/images/2022-11-demo-day/dask-cli.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Watch the &lt;a href=&quot;https://youtu.be/_x7oaSEJDjA?t=882&quot;&gt;full demo&lt;/a&gt; or read the &lt;a href=&quot;https://docs.dask.org/en/stable/cli.html&quot;&gt;Dask CLI documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;xgboost-hpo-with-dask-and-optuna&quot;&gt;XGBoost HPO with Dask and Optuna&lt;/h2&gt;

&lt;p&gt;Have you ever wanted to speed up your hyperparameter searches by running them in parallel? &lt;a href=&quot;https://www.jamesbourbeau.com/about/&quot;&gt;James Bourbeau&lt;/a&gt; (Coiled) shows you how you can use the brand-new &lt;a href=&quot;https://jrbourbeau.github.io/dask-optuna/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-optuna&lt;/code&gt;&lt;/a&gt; integration to run hundreds of hyperparameter searches in parallel on a Dask cluster. Running your Optuna HPO searches on a Dask cluster requires only two changes to your existing optuna code. After making those changes, we’re then able to run 500 HPO iterations in parallel in 25 seconds.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Screenshot of Dask-Optuna running&quot; src=&quot;/images/2022-11-demo-day/optuna-dask.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Watch the &lt;a href=&quot;https://youtu.be/_x7oaSEJDjA?t=1300&quot;&gt;full demo&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;dask-for-awkward-arrays&quot;&gt;Dask for Awkward Arrays&lt;/h2&gt;

&lt;p&gt;The PyData ecosystem has historically focused on rectilinear data structures like DataFrames and regular arrays. &lt;a href=&quot;https://awkward-array.readthedocs.io/en/stable/&quot;&gt;Awkward Arrays&lt;/a&gt; brings NumPy-like operations to non-rectilinear data structures and &lt;a href=&quot;https://github.com/ContinuumIO/dask-awkward&quot;&gt;dask-awkward&lt;/a&gt; enables you to work with awkward arrays on a distributed cluster in parallel. &lt;a href=&quot;https://ddavis.io/about/&quot;&gt;Doug Davis&lt;/a&gt; (Anaconda) walks you through a quick demo of how to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-awkward&lt;/code&gt; on a local cluster. This is a helpful tool if you find yourself working with nested data structures at scale.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Screenshot of dask-awkward&quot; src=&quot;/images/2022-11-demo-day/awkward.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Watch the &lt;a href=&quot;https://youtu.be/_x7oaSEJDjA?t=2033&quot;&gt;full demo&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;profiling-dask-on-a-cluster-with-py-spy&quot;&gt;Profiling Dask on a Cluster with py-spy&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/benfred/py-spy&quot;&gt;py-spy&lt;/a&gt; is a Python profiler that lets you dig deeper into your code than just your Python functions. &lt;a href=&quot;https://github.com/gjoseph92&quot;&gt;Gabe Joseph&lt;/a&gt; (Coiled) shows you how you can use &lt;a href=&quot;https://github.com/gjoseph92/dask-pyspy&quot;&gt;dask-pyspy&lt;/a&gt; to profile code on a Dask cluster. By digging down into compiled code, dask-pyspy is able to discover valuable insights about why your Dask code might be running slow and what you might be able to do to resolve this.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Screenshot of dask-pyspy in action&quot; src=&quot;/images/2022-11-demo-day/pyspy.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Watch the &lt;a href=&quot;https://youtu.be/_x7oaSEJDjA?t=2758&quot;&gt;full demo&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;join-us-for-the-next-demo-day&quot;&gt;Join us for the next Demo Day!&lt;/h2&gt;

&lt;p&gt;Dask Demo Day is a great opportunity to learn about the latest developments and features in Dask. It’s also a fun hangout where you can ask questions and interact with some of Dask’s core maintainers in an informal, casual online setting. We’d love to see you at the next Demo Day on December 15th!&lt;/p&gt;

&lt;p&gt;Curious how you can stay connected and find out about the latest Dask news and events?&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;follow us on Twitter &lt;a href=&quot;https://twitter.com/dask_dev&quot;&gt;@dask_dev&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;subscribe to the Dask newsletter by sending a blank email to newsletter+subscribe@dask.org&lt;/li&gt;
  &lt;li&gt;subscribe to the &lt;a href=&quot;https://docs.dask.org/en/latest/support.html&quot;&gt;Dask community calendar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Reducing memory usage in Dask workloads by 80%</title>
   <link href="https://blog.dask.org/2022/11/15/queuing"/>
   <updated>2022-11-15T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2022/11/15/queuing</id>
   
   <content type="html">&lt;p&gt;&lt;em&gt;Original version of this post appears on https://www.coiled.io/blog/reducing-dask-memory-usage&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2022-queuing/hero.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;!-- Collection page image: double-diff.png --&gt;

&lt;p&gt;There’s a saying in emergency response: “slow is smooth, smooth is fast”.&lt;/p&gt;

&lt;p&gt;That saying has always bothered me, because it doesn’t make sense at first, yet it’s entirely correct.&lt;/p&gt;

&lt;p&gt;By applying this philosophy to the scheduling algorithm in the latest release of Dask, &lt;strong&gt;we’re seeing common workloads use up to 80% less memory than before. This means some workloads that used to be outright un-runnable are now running smoothly&lt;/strong&gt;—an infinity-X speedup!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/dask/distributed/issues/2602&quot;&gt;The second-most upvoted and commented issue of all time&lt;/a&gt; on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask/distributed&lt;/code&gt; repo describes, “tasks early in my graph generate data faster than it can be consumed downstream, causing data to pile up, eventually overwhelming my workers”.&lt;/p&gt;

&lt;p&gt;Dask users often struggle with workloads that run out of memory like this. Studying these situations, we realized that the Dask scheduler wasn’t following this “slow is smooth, smooth is fast” adage.&lt;/p&gt;

&lt;p&gt;Here’s what the problem was, and &lt;a href=&quot;https://github.com/dask/distributed/pull/6614&quot;&gt;how we’ve addressed it&lt;/a&gt;:&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Historically, Dask tried hard to get each individual task done as fast as possible: if a task &lt;em&gt;could&lt;/em&gt; run, it &lt;em&gt;would&lt;/em&gt;. So sometimes, tasks would run even if their outputs weren’t going to be used immediately—leaving them sitting around in memory.&lt;/p&gt;

&lt;p&gt;If you had thousands of initial tasks loading data—say, fetching Parquet from S3, CSVs from disk, or rows from a database—all those tasks would be scheduled and sent to workers up front.&lt;/p&gt;

&lt;p&gt;The workers would churn through them, fetching chunks of data (and accumulating it in memory) as quickly as possible. A worker would tell the scheduler when each chunk was loaded, and the scheduler would respond with what to do with it next—but until that message arrived, there were more data-loading tasks runnable right now, so why not run them?&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;root task overproduction&quot; src=&quot;/images/2022-queuing/overproduction.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This slight gap in timing—between the worker immediately starting on a less-useful task, then only later finding out about a more-useful task it should have run instead—allowed this lower-priority data to pile up in memory. We call this “root task overproduction”.&lt;/p&gt;

&lt;p&gt;Overall, there could be at least twice as much initial data in memory at once as necessary—and, therefore, twice as many intermediate results. (See &lt;a href=&quot;https://github.com/dask/distributed/pull/6614#discussion_r956515223&quot;&gt;this comment&lt;/a&gt; for a detailed explanation of why the 2x happens.)&lt;/p&gt;

&lt;p&gt;When this put workers under memory pressure, this initial problem would snowball into a bigger one. Workers had to spill data to disk (slow), then read it back from disk to use it or transfer it (slow). Workers might exceed their memory limits and crash, losing progress and requiring tasks to be recomputed on a pool of workers that were already struggling.&lt;/p&gt;

&lt;p&gt;In the end, this meant that a whole class of workloads were slow, or even un-runnable, without using hugely oversized clusters.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;There were plenty of ways to approach this problem, but we wanted to try the simplest thing first: just don’t tell the workers about more tasks than they can run at once.&lt;/p&gt;

&lt;p&gt;We’re calling this mode of scheduling &lt;a href=&quot;https://distributed.dask.org/en/stable/scheduling-policies.html#queuing&quot;&gt;“queuing”&lt;/a&gt;, or “root task withholding”. The scheduler puts data-loading tasks in an internal queue, and only drips one out to a worker once it’s finished its current work &lt;em&gt;and&lt;/em&gt; there’s nothing more useful to run instead that utilizes the work it just completed.&lt;/p&gt;

&lt;!-- We let the scheduler choose to do nothing, even when there was something it could do. --&gt;

&lt;p&gt;&lt;img alt=&quot;screenshot showing non-queuing dashboard on left, with all root tasks in processing, vs queueing dashboard on the right, with the hash-marked progress bar indicating tasks are queued on the scheduler, instead of workers&quot; src=&quot;/images/2022-queuing/dashboard.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;slow-is-smooth&quot;&gt;Slow is smooth&lt;/h2&gt;

&lt;p&gt;Queuing adds a cost in latency. Every time workers finish a task, they have to ask the scheduler what to do next and sit under-utilized, or even idle, until they get an answer. (Before, they had a backlog of things they could do before the answer came back.)&lt;/p&gt;

&lt;p&gt;For a while, we hadn’t considered this approach, because intuitively, we assumed the latency would be too much of a slow-down.&lt;/p&gt;

&lt;p&gt;However, by slowing down the pace of task assignment, and running only the best tasks, scheduling gets much smoother. And with that smoothness, we see that most benchmark workloads use much less memory across the board:&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;img alt=&quot;percent memory change from baseline. only long blue bars to the left&quot; src=&quot;/images/2022-queuing/memory-benchmarks.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;
    &lt;figcaption&gt;Percent decrease in peak memory use in the latest release. Notice the axes: up to 80% reduction.&lt;/figcaption&gt;
&lt;/figure&gt; --&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;img alt=&quot;percent memory change from baseline. only long blue bars to the left&quot; src=&quot;/images/2022-queuing/memory-benchmarks.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Percent decrease in peak memory used in the latest release. Notice the axes: up to 80% reduction.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;This large a reduction in memory use is a big deal!&lt;/p&gt;

&lt;p&gt;For many users, this might mean that workloads that weren’t runnable before can now run smoothly.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;img alt=&quot;Julius Busecke said quote by setting worker saturation, I can reliably calculate a trend over time for the first time endquote&quot; src=&quot;/images/2022-queuing/julius-quote-2.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;
    &lt;figcaption&gt;Julius Busecke [reports](https://github.com/dask/distributed/discussions/7128#discussioncomment-3964014) that a common geoscience task which used to always crash now works out of the box with the new scheduling mode.&lt;/figcaption&gt;
&lt;/figure&gt; --&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;img alt=&quot;Julius Busecke said quote by setting worker saturation, I can reliably calculate a trend over time for the first time endquote&quot; src=&quot;/images/2022-queuing/julius-quote-2.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Julius Busecke &lt;a href=&quot;https://github.com/dask/distributed/discussions/7128#discussioncomment-3964014&quot;&gt;reports&lt;/a&gt; that a common geoscience task which used to always crash now works out of the box with the new scheduling mode.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Some workloads will also be cheaper to run in the cloud, since they can use instances with less memory. We see some benchmarks that could, in theory, be run for 30-50% less total cost. This is not universal: others would cost &lt;em&gt;more&lt;/em&gt; because they get slower. More on that later.&lt;/p&gt;

&lt;p&gt;Beyond this, execution is just more predictable. Memory usage is much more consistent and less likely to spike rapidly.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;constant vs peak-y memory usage: anom_mean, dataframe_align, double_diff, vorticity&quot; src=&quot;/images/2022-queuing/constant-memory.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;smooth-is-fast&quot;&gt;Smooth is fast&lt;/h2&gt;

&lt;p&gt;In a few cases, it turns out that smooth scheduling can be even faster.&lt;/p&gt;

&lt;p&gt;On average, one representative oceanography workload ran 20% faster. A few other workloads showed modest speedups as well. This is mostly because they no longer load too much data into memory and then have to spill it to disk, which creates significant slowdowns.&lt;/p&gt;

&lt;p&gt;Additionally, we found that the extra latency we were worried about didn’t actually slow things down in typical cases. There was no measurable change in pure task throughput on a cluster with fast networking and multi-CPU workers, like &lt;a href=&quot;https://coiled.io&quot;&gt;Coiled clusters&lt;/a&gt; or &lt;a href=&quot;https://docs.dask.org/en/latest/deploying-python.html&quot;&gt;a single-machine &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCluster&lt;/code&gt;&lt;/a&gt;. This was a good lesson in trying the simplest thing first.&lt;/p&gt;

&lt;h2 id=&quot;sometimes-slow-is-still-slow-but-not-why-youd-expect&quot;&gt;Sometimes, slow is still slow (but not why you’d expect)&lt;/h2&gt;

&lt;p&gt;However, we did notice that a few benchmarks run slower with scheduler-side queuing. The typical slowdown is 5-10%, but in the worst case, they are ~50% slower (though they also use about half the memory).&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Memory profiles of slow workloads, showing increased runtime but decreased memory (`anom_mean`, `basic_sum`)&quot; src=&quot;/images/2022-queuing/slow-memory-profiles.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The problem is that implementing queuing meant giving up a scheduling feature &lt;a href=&quot;https://github.com/dask/distributed/pull/4967&quot;&gt;introduced last year&lt;/a&gt; called &lt;em&gt;co-assignment&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;As described &lt;a href=&quot;https://distributed.dask.org/en/stable/scheduling-policies.html#initial-task-placement&quot;&gt;in the docs&lt;/a&gt;, co-assignment tries to schedule initial tasks on the same worker if their outputs will be combined later. This avoids having to transfer data from one worker to another when the downstream task runs, because all the data is already on one worker.&lt;/p&gt;

&lt;p&gt;In a graph like this, we’d want &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;b&lt;/code&gt; to run on the same worker. Otherwise, one of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;e&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f&lt;/code&gt; would have to be transferred between workers before &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt; can run.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  i       j
 / \     / \
e   f   g   h
|   |   |   |
a   b   c   d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Avoiding these transfers speeds things up, because network is &lt;a href=&quot;https://medium.com/@hondanhon/more-latency-numbers-every-programmer-should-know-3142f0cf614d&quot;&gt;relatively slow&lt;/a&gt;. It also reduces memory usage by avoiding having to hold replicas of the same data on multiple workers.&lt;/p&gt;

&lt;p&gt;Unfortunately, the current implementation of co-assignment isn’t compatible with queuing, and updating it is non-trivial. We plan to do this next, to get the best of both worlds.&lt;/p&gt;

&lt;p&gt;But in the short term, we had to decide if queuing was beneficial enough to be worth enabling by default right away, despite the loss of co-assignment.&lt;/p&gt;

&lt;h2 id=&quot;a-new-default-for-scheduling&quot;&gt;A new default for scheduling&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://observablehq.com/@gjoseph92/snakebench?commits=2d37536&amp;amp;commits=f6ef40b&amp;amp;commits=cfe91dd&amp;amp;measure=peak_memory&amp;amp;groupby=branch&amp;amp;show=passed&quot;&gt;After running a number of benchmarks&lt;/a&gt;, and getting some &lt;a href=&quot;https://github.com/dask/distributed/discussions/7128&quot;&gt;initial community feedback&lt;/a&gt;, we think it is.&lt;/p&gt;

&lt;p&gt;Queuing makes things possible that used to not work at all. But it doesn’t break anything that works today: everything will still work, some things just could be slower. We feel that that’s a worthwhile enough tradeoff to enable it by default—especially given how much dask users have struggled with memory issues.&lt;/p&gt;

&lt;p&gt;Additionally, to avoid impacting workloads that could become latency-bound, the new algorithm is still doing a &lt;em&gt;little&lt;/em&gt; overproduction. It’s pushing a handful of extra root tasks to the worker in advance (as opposed to all of them, like before). This comes at the price of some extra memory use, but prevents painful slowdowns in high-latency clusters.&lt;/p&gt;

&lt;p&gt;So in the latest release, queuing is enabled by default. Most memory-intensive Array and DataFrame workloads should see reductions in memory use out of the box, ranging from noticeable to 🤩.&lt;/p&gt;

&lt;h2 id=&quot;let-us-know-how-it-goes&quot;&gt;Let us know how it goes&lt;/h2&gt;

&lt;p&gt;We’ve opened a &lt;a href=&quot;https://github.com/dask/distributed/discussions/7128&quot;&gt;discussion on GitHub&lt;/a&gt; for feedback on this change. Please let us know how it helps (or doesn’t).&lt;/p&gt;

&lt;h2 id=&quot;keeping-old-behavior&quot;&gt;Keeping old behavior&lt;/h2&gt;

&lt;p&gt;For users who are sensitive to runtime and have low memory use, you can deactivate queuing and use the old scheduling mode (including co-assignment) via &lt;a href=&quot;https://docs.dask.org/en/stable/configuration.html&quot;&gt;Dask configuration&lt;/a&gt;, by setting the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;distributed.scheduler.worker-saturation&lt;/code&gt; config value to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;inf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can read more about adjusting this setting &lt;a href=&quot;https://distributed.dask.org/en/latest/scheduling-policies.html#adjusting-or-disabling-queuing&quot;&gt;in the docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On Coiled, you can set it with:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;coiled&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;distributed.scheduler.worker-saturation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;inf&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;coiled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# coiled sends current dask config automatically
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can see examples of setting this configuration for various deployment systems on the &lt;a href=&quot;https://github.com/dask/distributed/discussions/7128&quot;&gt;discussion issue&lt;/a&gt; (when copy-pasting, be sure to change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1.0&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;inf&lt;/code&gt;!). And if you find the need to set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;worker-saturation&lt;/code&gt; back to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;inf&lt;/code&gt;, please let us know on the discussion.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Kubernetes Operator</title>
   <link href="https://blog.dask.org/2022/11/09/dask-kubernetes-operator"/>
   <updated>2022-11-09T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2022/11/09/dask-kubernetes-operator</id>
   
   <category>kubernetes</category>
   
   <category>dask-kubernetes</category>
   
   <category>deployment</category>
   
   <category>clusters</category>
   
   <content type="html">
&lt;p&gt;We are excited to announce that the &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator.html&quot;&gt;Dask Kubernetes Operator&lt;/a&gt; is now generally available 🎉!&lt;/p&gt;

&lt;p&gt;Notable new features include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Dask Clusters are now &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html&quot;&gt;native custom resources&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Clusters can be managed with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl&lt;/code&gt; or the &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_kubecluster.html&quot;&gt;Python API&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Cascaded deletions allow for proper teardown&lt;/li&gt;
  &lt;li&gt;Multiple &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskworkergroup&quot;&gt;worker groups&lt;/a&gt; enable heterogenous/tagged deployments&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskjob&quot;&gt;DaskJob&lt;/a&gt;: running dask workloads with K8s batched job infrastructure&lt;/li&gt;
  &lt;li&gt;Clusters can be reused between different Python processes&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskautoscaler&quot;&gt;Autoscaling&lt;/a&gt; is handled by a custom Kubernetes controller instead of the user code&lt;/li&gt;
  &lt;li&gt;Scheduler and worker Pods and Services are &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskcluster&quot;&gt;fully configurable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;kubectl get daskcluster
&lt;span class=&quot;go&quot;&gt;NAME         AGE
my-cluster   4m3s

&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;kubectl get all &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; dask.org/cluster-name&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;my-cluster
&lt;span class=&quot;go&quot;&gt;NAMESPACE   NAME                                       READY   STATUS    RESTARTS   AGE
default     pod/my-cluster-default-worker-22bd39e33a   1/1     Running   0          3m43s
default     pod/my-cluster-default-worker-5f4f2c989a   1/1     Running   0          3m43s
default     pod/my-cluster-default-worker-72418a589f   1/1     Running   0          3m43s
default     pod/my-cluster-default-worker-9b00a4e1fd   1/1     Running   0          3m43s
default     pod/my-cluster-default-worker-d6fc172526   1/1     Running   0          3m43s
default     pod/my-cluster-scheduler                   1/1     Running   0          4m21s

NAMESPACE   NAME                           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;default     service/my-cluster-scheduler   ClusterIP   10.96.33.67   &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;8786/TCP,8787/TCP   4m21s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;At the start of 2022 we began the large undertaking of rewriting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-kubernetes&lt;/code&gt; package in the &lt;a href=&quot;https://kubernetes.io/docs/concepts/extend-kubernetes/operator/&quot;&gt;operator pattern&lt;/a&gt;. This design pattern has become very popular in the Kubernetes community with companies like &lt;a href=&quot;https://www.redhat.com/en/technologies/cloud-computing/openshift/what-are-openshift-operators&quot;&gt;Red Hat building their whole Kubernetes offering Openshift around it&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-is-an-operator&quot;&gt;What is an operator?&lt;/h2&gt;

&lt;p&gt;If you’ve spent any time in the Kubernetes community you’ll have heard the term operator being thrown around seen projects like &lt;a href=&quot;https://github.com/operator-framework&quot;&gt;Golang’s Operator Framework&lt;/a&gt; being used to deploy modern applications.&lt;/p&gt;

&lt;p&gt;At it’s core an operator is made up of a data structure for describing the thing you want to deploy (in our case a Dask cluster) and a controller which does the actual deploying. In Kubernetes the templates for these data structures are called &lt;a href=&quot;https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/&quot;&gt;Custom Resource Definitions&lt;/a&gt; (CRDs) and allow you to extend the Kubernetes API with new resource types of your own design.&lt;/p&gt;

&lt;p&gt;For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-kubernetes&lt;/code&gt; we have created a few CRDs to describe things like &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskcluster&quot;&gt;Dask clusters&lt;/a&gt;, groups of &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskworkergroup&quot;&gt;Dask workers&lt;/a&gt;, &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskjob&quot;&gt;adaptive autoscalers&lt;/a&gt; and a new &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskautoscaler&quot;&gt;Dask powered batch job&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We also built a controller using &lt;a href=&quot;https://kopf.readthedocs.io/en/stable/&quot;&gt;kopf&lt;/a&gt; that handles watching for changes to any of these resources and creates/updates/deletes lower level Kubernetes resources like Pods and Services.&lt;/p&gt;

&lt;h2 id=&quot;why-did-we-build-this&quot;&gt;Why did we build this?&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://kubernetes.dask.org/en/latest/history.html&quot;&gt;original implementation&lt;/a&gt; of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-kubernetes&lt;/code&gt; was started shortly after Kubernetes went &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1.0&lt;/code&gt; and before any established design patterns had emerged. Its model was based on spawning Dask workers as subprocesses, except those subprocesses are Pods running in Kubernetes. This is the same way &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-jobqueue&lt;/code&gt; launches workers as individual job scheduler allocations or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-ssh&lt;/code&gt; opens many SSH connections to various machines.&lt;/p&gt;

&lt;p&gt;Over time this has been refactored, rewritten and extended multiple times. One long-asked-for change was to also place the Dask scheduler inside the Kubernetes cluster to simplify scheduler-worker communication and network connectivity. Naturally this lead to more feature requests around configuring the scheduler service and having more control over the cluster. As we extended more and more the original premise of spawning worker subprocesses on a remote system became less helpful.&lt;/p&gt;

&lt;p&gt;The final straw in the original design was folks asking for the ability to leave a cluster running and come back to it later. Either to reuse a cluster between separate jobs, or just different stages in a multi-stage pipeline. The premise of spawning subprocesses leads to an assumption that the parent process will be around for the lifetime of the cluster which makes it a reasonable place to hold state such as the template for launching new workers when scaling up. We attempted to implement this feature but it just wasn’t possible with the current design. Moving to a model where the parent process can die and new processes can pick up means that state needs to be moved elsewhere and things were too entangled to successfully pull this out.&lt;/p&gt;

&lt;p&gt;The classic implementation that had served us well for so long was creaking and becoming increasingly difficult to modify and maintain. The time had come to pay down our technical debt by rebuilding from scratch under a new model, the operator pattern.&lt;/p&gt;

&lt;p&gt;In this new model a Dask cluster is an abstract object that exists within a Kubernetes cluster. We use custom resources to store the state for each cluster and a custom controller to map that state onto reality by creating the individual components that make up the cluster. Want to scale up your cluster? Instead of having some Python code locally that spawns a new Pod on Kubernetes we just modify the state of the Dask cluster resource to specify the desired number of workers and the controller handles adding/removing Pods to match.&lt;/p&gt;

&lt;h2 id=&quot;new-features&quot;&gt;New features&lt;/h2&gt;

&lt;p&gt;While our primary goal was allowing cluster reuse between Python processes and paying down technical debt switching to the operator pattern has allowed us to add a bunch of nice new features. So let’s explore those.&lt;/p&gt;

&lt;h3 id=&quot;python-or-yaml-api&quot;&gt;Python or YAML API&lt;/h3&gt;

&lt;p&gt;With our new implementation we create Dask clusters by creating a &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskcluster&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; resource&lt;/a&gt; on our Kubernetes cluster. The controller sees this appear and spawns child resources for the scheduler, workers, etc.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Diagram of a DaskCluster resource and its child resources&quot; src=&quot;/images/2022-kubernetes/daskcluster.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We modify our cluster by editing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; resource and our controller reacts to those changes and updates the child resources accordingly.&lt;/p&gt;

&lt;p&gt;We delete our cluster by deleting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; resource and Kubernetes handles the rest (see the next section on cascade deletion).&lt;/p&gt;

&lt;p&gt;By storing all of our state in the resource and all of our logic in the controller this means the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; class is now much simpler. It’s actually so simple that it is entirely optional.&lt;/p&gt;

&lt;p&gt;The primary purpose of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; class now is to provide a nice clean API for creating/scaling/deleting your clusters in Python. It can take a small number of keyword arguments and generate all of the YAML to submit to Kubernetes.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_kubernetes.operator&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;my-cluster&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;FOO&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;bar&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The above snippet creates the following resource.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kubernetes.dask.org/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;DaskCluster&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;my-cluster&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;tcp-comm&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8786&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;TCP&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;targetPort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;tcp-comm&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http-dashboard&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8787&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;TCP&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;targetPort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http-dashboard&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;dask.org/cluster-name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;my-cluster&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;dask.org/component&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;scheduler&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ClusterIP&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dask-scheduler&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;--host&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;0.0.0.0&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;FOO&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bar&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ghcr.io/dask/dask:latest&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;livenessProbe&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;httpGet&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/health&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http-dashboard&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;initialDelaySeconds&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;15&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;periodSeconds&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;20&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;scheduler&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;containerPort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8786&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;tcp-comm&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;TCP&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;containerPort&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8787&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http-dashboard&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;protocol&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;TCP&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;readinessProbe&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;httpGet&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/health&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http-dashboard&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;initialDelaySeconds&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;
            &lt;span class=&quot;na&quot;&gt;periodSeconds&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;null&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;my-cluster&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;replicas&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dask-worker&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;--name&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$(DASK_WORKER_NAME)&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;FOO&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bar&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ghcr.io/dask/dask:latest&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;worker&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If I want to scale up my workers to 5 I can do this in Python.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;All this does is apply a patch to the resource and modify the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;spec.worker.replicas&lt;/code&gt; value to be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;5&lt;/code&gt; and the controller handles the rest.&lt;/p&gt;

&lt;p&gt;Ultimately our Python API is generating YAML and handing it to Kubernetes to action. Everything about our cluster is contained in that YAML. If we prefer we can write and store this YAML ourselves and manage our cluster entirely via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If we put the above YAML example into a file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my-cluster.yaml&lt;/code&gt; we can create it like this. No Python necessary.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;kubectl apply &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; my-cluster.yaml
&lt;span class=&quot;go&quot;&gt;daskcluster.kubernetes.dask.org/my-cluster created
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can also scale our cluster with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;kubectl scale &lt;span class=&quot;nt&quot;&gt;--replicas&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;5 daskworkergroup my-cluster-default
&lt;span class=&quot;go&quot;&gt;daskworkergroup.kubernetes.dask.org/my-cluster-default
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is extremely powerful for advanced users who want to integrate with existing Kubernetes tooling and really modify everything about their Dask cluster.&lt;/p&gt;

&lt;p&gt;You can still construct a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; object in the future and point it to this existing cluster for convenience.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_kubernetes.operator&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;my-cluster&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;cascade-deletion&quot;&gt;Cascade deletion&lt;/h3&gt;

&lt;p&gt;Having a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; resource also makes deletion much more pleasant.&lt;/p&gt;

&lt;p&gt;In the old implementation your local Python process would spawn a bunch of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pod&lt;/code&gt; resources along with supporting ones like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Service&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PodDisruptionBudget&lt;/code&gt; resources. It also had some teardown functionality that was either called directly or via a finalizer that deleted all of these resources when you are done.&lt;/p&gt;

&lt;p&gt;One downside of this was that if something went wrong either due to a bug in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-kubernetes&lt;/code&gt; or a more severe failure that caused the Python process to exit without calling finalizers you would be left with a ton of resources that you had to clean up manually. I expect some folks have a label based selector command stored in their snippet manager somewhere but most folks would do this cleanup manually.&lt;/p&gt;

&lt;p&gt;With the new model the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; resource is set as the &lt;a href=&quot;https://kubernetes.io/docs/concepts/overview/working-with-objects/owners-dependents/&quot;&gt;owner&lt;/a&gt; of all of the other resources spawned by the controller. This means we can take advantage of &lt;a href=&quot;https://kubernetes.io/docs/tasks/administer-cluster/use-cascading-deletion/&quot;&gt;cascade deletion&lt;/a&gt; for our cleanup. Regardless of how you create your cluster or whether the initial Python process still exists you can just delete the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; resource and Kubernetes will know to automatically delete all of its children.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;kubectl get daskcluster  &lt;span class=&quot;c&quot;&gt;# Here we see our Dask cluster resource&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;NAME         AGE
my-cluster   4m3s

&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;kubectl get all &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; dask.org/cluster-name&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;my-cluster  &lt;span class=&quot;c&quot;&gt;# and all of its child resources&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;NAMESPACE   NAME                                       READY   STATUS    RESTARTS   AGE
default     pod/my-cluster-default-worker-22bd39e33a   1/1     Running   0          3m43s
default     pod/my-cluster-default-worker-5f4f2c989a   1/1     Running   0          3m43s
default     pod/my-cluster-default-worker-72418a589f   1/1     Running   0          3m43s
default     pod/my-cluster-default-worker-9b00a4e1fd   1/1     Running   0          3m43s
default     pod/my-cluster-default-worker-d6fc172526   1/1     Running   0          3m43s
default     pod/my-cluster-scheduler                   1/1     Running   0          4m21s

NAMESPACE   NAME                           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;default     service/my-cluster-scheduler   ClusterIP   10.96.33.67   &amp;lt;none&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;        &lt;/span&gt;8786/TCP,8787/TCP   4m21s
&lt;span class=&quot;go&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;kubectl delete daskcluster my-cluster  &lt;span class=&quot;c&quot;&gt;# We can delete the daskcluster resource&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;daskcluster.kubernetes.dask.org &quot;my-cluster&quot; deleted

&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;kubectl get all &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; dask.org/cluster-name&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;my-cluster  &lt;span class=&quot;c&quot;&gt;# all of the children are removed&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;No resources found
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;multiple-worker-groups&quot;&gt;Multiple worker groups&lt;/h3&gt;

&lt;p&gt;We also took this opportunity to add support for &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskworkergroup&quot;&gt;multiple worker groups&lt;/a&gt; as a first class principle. Some workflows benefit from having a few workers in your cluster with some additional resources. This may be a couple of workers with much higher memory than the rest, or GPUs for accelerated compute. Using &lt;a href=&quot;https://distributed.dask.org/en/stable/resources.html&quot;&gt;resource annotations&lt;/a&gt; you can steer certain tasks to those workers, so if you have a single step that creates a large amount of intermediate memory you can ensure that task ends up on a worker with enough memory.&lt;/p&gt;

&lt;p&gt;By default when you create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; resource it creates a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskWorkerGroup&lt;/code&gt; which in turn creates the worker &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pod&lt;/code&gt; resources for our cluster. If you wish you can add more worker group resources yourself with different resource configurations.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Diagram of a DaskWorkerGroup resource and its child resources&quot; src=&quot;/images/2022-kubernetes/daskworkergroup.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here is an example of creating a cluster with five workers that have 16GB of memory and two additional workers with 64GB of memory.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_kubernetes.operator&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;foo&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;n_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                          &lt;span class=&quot;s&quot;&gt;&quot;requests&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;memory&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;16Gi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                          &lt;span class=&quot;s&quot;&gt;&quot;limits&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;memory&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;16Gi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                      &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_worker_group&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;highmem&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                         &lt;span class=&quot;n&quot;&gt;n_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                         &lt;span class=&quot;n&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                             &lt;span class=&quot;s&quot;&gt;&quot;requests&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;memory&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;64Gi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                             &lt;span class=&quot;s&quot;&gt;&quot;limits&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;memory&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;64Gi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                         &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;autoscaling&quot;&gt;Autoscaling&lt;/h3&gt;

&lt;p&gt;One of the much loved features of the classic implementation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; was adaptive autoscaling. When enabled the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; object would regularly communicate with the scheduler and ask if it wanted to change the number of workers and then add/remove pods accordingly.&lt;/p&gt;

&lt;p&gt;In the new implementation this logic has moved to the controller so the cluster can autoscale even when there is no &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; object in existence.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Diagram of a DaskAutoscaler resource and how it interacts with other resources&quot; src=&quot;/images/2022-kubernetes/daskautoscaler.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The Python API remains the same so you can still use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; to put your cluster into adaptive mode.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_kubernetes.operator&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;my-cluster&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;adapt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minimum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;maximum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This call creates a &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskautoscaler&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskAutoscaler&lt;/code&gt; resource&lt;/a&gt; which the controller sees and periodically takes action on by asking the scheduler how many workers it wants and updating the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskWorkerGroup&lt;/code&gt; within the configured bounds.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;kubernetes.dask.org/v1&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;DaskAutoscaler&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;my-cluster&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;my-cluster&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;minimum&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;maximum&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cluster.scale(5)&lt;/code&gt; will also delete this resource and set the number of workers back to 5.&lt;/p&gt;

&lt;h3 id=&quot;daskjob&quot;&gt;DaskJob&lt;/h3&gt;

&lt;p&gt;Having composable cluster resources also allows us to put together a &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_resources.html#daskjob&quot;&gt;new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskJob&lt;/code&gt; resource&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kubernetes has some built-in &lt;a href=&quot;https://kubernetes.io/docs/concepts/workloads/controllers/job/&quot;&gt;batch job style resources&lt;/a&gt; which ensure a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pod&lt;/code&gt; is run to completion one or more times. You can control how many times is should run and how many concurrent pods there should be. This is useful for fire-and-forget jobs that you want to process a specific workload.&lt;/p&gt;

&lt;p&gt;The Dask Operator introduces a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskJob&lt;/code&gt; resource which creates a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; alongside a single client &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pod&lt;/code&gt; which it attempts to run to completion. If the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pod&lt;/code&gt; exits unhappily it will be restarted until it returns a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; exit code, at which point the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; is automatically cleaned up.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Diagram of a DaskJob resource and its child resources&quot; src=&quot;/images/2022-kubernetes/daskjob.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The client &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pod&lt;/code&gt; has all of the configuration for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; injected at runtime via environment variables, this means your client code doesn’t need to know anything about how the Dask cluster was constructed it just connects and makes use of it. This allows for excellent separation of concerns between your business logic and your deployment tooling.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# We don&apos;t need to tell the Client anything about the cluster as
# it will find everything it needs in the environment variables
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Do some work...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This new resource type is useful for some batch workflows, but also demonstrates how you could extend the Dask Operator with your own new resource types and hook them together with a controller plugin.&lt;/p&gt;

&lt;h3 id=&quot;extensibility-and-plugins&quot;&gt;Extensibility and plugins&lt;/h3&gt;

&lt;p&gt;By moving to native Kubernetes resources and support for the YAML API power users can treat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskCluster&lt;/code&gt; resources (or any of the new Dask resources) as building blocks in larger applications. One of Kubernetes’s superpowers is managing everything as composable resources that can be combined to create complex and flexible applications.&lt;/p&gt;

&lt;p&gt;Does your Kubernetes cluster have an opinionated configuration with additional tools like &lt;a href=&quot;https://istio.io&quot;&gt;Istio&lt;/a&gt; installed? Have you struggled in the last to integrate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-kubernetes&lt;/code&gt; with your existing tooling because it relied on Python to create clusters?&lt;/p&gt;

&lt;p&gt;It’s increasingly common for users to need additional resources to be created alongside their Dask cluster like &lt;a href=&quot;https://istio.io/latest/docs/reference/config/networking/gateway/&quot;&gt;Istio Gateway&lt;/a&gt; resources or &lt;a href=&quot;https://cert-manager.io/docs/concepts/certificate/&quot;&gt;cert-manager Certificate&lt;/a&gt; resources. Now that everything in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-kubernetes&lt;/code&gt; uses custom resources users can mix and match resources from many different operators to construct their application.&lt;/p&gt;

&lt;p&gt;If this isn’t enough you can also &lt;a href=&quot;https://kubernetes.dask.org/en/latest/operator_extending.html&quot;&gt;extend our custom controller&lt;/a&gt;. We built the controller with &lt;a href=&quot;https://kopf.readthedocs.io/en/stable/&quot;&gt;kopf&lt;/a&gt; primarily because the Dask community is strong in Python and less so in Golang (the most common way to build operators). It made sense to play into our strengths rather than using the most popular option.&lt;/p&gt;

&lt;p&gt;This also means our users should be able to more easily modify the controller logic and we’ve included a plugin system that allows you to add extra logic rules by installing a custom package into the controller container image and registering them via entry points.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Source for my_controller_plugin.plugin
&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;kopf&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kopf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;service&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;dask.org/component&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;scheduler&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;handle_scheduler_service_create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
   &lt;span class=&quot;c1&quot;&gt;# Do something here like create an Istio Gateway
&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# See https://kopf.readthedocs.io/en/stable/handlers for documentation on what is possible here
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-toml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# pyproject.toml for my_controller_plugin&lt;/span&gt;

&lt;span class=&quot;nn&quot;&gt;[option.entry_points]&lt;/span&gt;
&lt;span class=&quot;py&quot;&gt;dask_operator_plugin&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;
   &lt;span class=&quot;py&quot;&gt;my_controller_plugin&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;my_controller_plugin.plugin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-dockerfile highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Dockerfile&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; ghcr.io/dask/dask-kubernetes-operator:2022.10.0&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;RUN &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;my-controller-plugin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That’s it, when the controller starts up it will also import all &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@kopf&lt;/code&gt; methods from modules listed in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask_operator_plugin&lt;/code&gt; entry point alongside the core functionality.&lt;/p&gt;

&lt;h2 id=&quot;migrating&quot;&gt;Migrating&lt;/h2&gt;

&lt;p&gt;One caveat to switching to the operator model is that you need to install the CRDs and controller on your Kubernetes before you can start using it. While a small hurdle this is a break in the user experience compared to the classic implementation.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;helm repo add dask https://helm.dask.org &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; helm repo update
kubectl create ns dask-operator
helm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--namespace&lt;/span&gt; dask-operator dask-operator dask/dask-kubernetes-operator
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We also took this opportunity to make breaking changes to the constructor of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; to simplify usage for beginners or folks who are happy with the default options. By adopting the YAML API power users can tinker and tweak to their hearts content without having to modify the Python library, so it made sense to make the Python library simpler and more pleasant to use for the majority of users.&lt;/p&gt;

&lt;p&gt;We made an explicit decision not to just replace the old &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; with the new one in place because people’s code will just stop working if we did. Instead we are asking folks to &lt;a href=&quot;https://kubernetes.dask.org/en/latest/kubecluster_migrating.html&quot;&gt;read the migration guide&lt;/a&gt; and update your imports and construction code. Users of the classic cluster manager will start seeing a deprecation warning as of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2022.10.0&lt;/code&gt; and at some point the classic implementation will be removed all together. If migrating is challenging to do quickly you can always pin your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-kubernetes&lt;/code&gt; version, and from then on you are clearly not getting bug fixes or enhancements. But in all honesty those have been few and far between for the classic implementation lately anyway.&lt;/p&gt;

&lt;p&gt;We are optimistic that the new cleaner implementation, faster cluster startup times and bucket of new features is enough to convince you that it’s worth the migration effort.&lt;/p&gt;

&lt;p&gt;If you want some help migrating and the migration guide doesn’t cover your use case then don’t hesitate to &lt;a href=&quot;https://dask.discourse.group&quot;&gt;reach out on the forum&lt;/a&gt;. We’ve also worked hard to ensure the new implementation has feature parity with the classic one, but if anything is missing or broken then please &lt;a href=&quot;https://github.com/dask/dask-kubernetes/issues&quot;&gt;open an issue on GitHub&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Understanding Dask’s meta keyword argument</title>
   <link href="https://blog.dask.org/2022/08/09/understanding-meta-keyword-argument"/>
   <updated>2022-08-09T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2022/08/09/understanding-meta-keyword-argument</id>
   
   <category>dataframe</category>
   
   <content type="html">
&lt;p&gt;If you have worked with Dask DataFrames or Dask Arrays, you have probably come across the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; keyword argument. Perhaps, while using methods like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply()&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datasets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timeseries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;my_custom_arithmetic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;


&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;my_computation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;my_custom_arithmetic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Series&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;float64&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Output:
#
#                        id    name         x         y  my_computation
# timestamp
# 2000-01-01 00:00:00  1055  Victor -0.575374  0.868320        2.067696
# 2000-01-01 00:00:01   994   Zelda  0.963684  0.972240        0.000000
# 2000-01-01 00:00:02   982  George -0.997531 -0.876222        0.000000
# 2000-01-01 00:00:03   981  Ingrid  0.852159 -0.419733        0.000000
# 2000-01-01 00:00:04  1029   Jerry -0.839431 -0.736572       -0.768500
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You might have also seen one or more of the following warnings/errors:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;UserWarning: You did not provide metadata, so Dask is running your function on a small dataset to guess output types. It is possible that Dask will guess incorrectly.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ValueError: Metadata inference failed in …
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If the above messages look familiar, this blog post is for you. :)&lt;/p&gt;

&lt;p&gt;We will discuss:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;what the is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; keyword argument,&lt;/li&gt;
  &lt;li&gt;why does Dask need &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt;, and&lt;/li&gt;
  &lt;li&gt;how to use it effectively.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will look at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; mainly in the context of Dask DataFrames, however, similar principles also apply to Dask Arrays.&lt;/p&gt;

&lt;h2 id=&quot;what-is-meta&quot;&gt;What is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;Before answering this, let’s quickly discuss &lt;a href=&quot;https://docs.dask.org/en/stable/dataframe.html&quot;&gt;Dask DataFrames&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A Dask DataFrame is a lazy object composed of multiple &lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html&quot;&gt;pandas DataFrames&lt;/a&gt;, where each pandas DataFrame is called a “partition”. These are stacked along the index and Dask keeps track of these partitions using “divisions”, which is a tuple representing the start and end index of each partition.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://docs.dask.org/en/stable/_images/dask-dataframe.svg&quot; alt=&quot;Dask DataFrame consists of multiple pandas DataFrames&quot; width=&quot;50%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When you create a Dask DataFrame, you usually see something like the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;         &lt;span class=&quot;s&quot;&gt;&quot;x&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;         &lt;span class=&quot;s&quot;&gt;&quot;y&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Structure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                   &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;      &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;              &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;                &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;                &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, Dask has created the structure of the DataFrame using some “metadata” information about the &lt;em&gt;column names&lt;/em&gt; and their &lt;em&gt;datatypes&lt;/em&gt;. This metadata information is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt;. Dask uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; for understanding Dask operations and creating accurate task graphs (i.e., the logic of your computation).&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; &lt;em&gt;keyword argument&lt;/em&gt; in various Dask DataFrame functions allows you to explicitly share this metadata information with Dask. Note that the keyword argument is concerned with the metadata of the &lt;em&gt;output&lt;/em&gt; of those functions.&lt;/p&gt;

&lt;h2 id=&quot;why-does-dask-need-meta&quot;&gt;Why does Dask need &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;Dask computations are evaluated &lt;em&gt;lazily&lt;/em&gt;. This means Dask creates the logic and flow, called task graph, of the computation immediately, but evaluates them only when necessary – usually, on calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.compute()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;An example task graph generated to compute the sum of the DataFrame:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Series&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Structure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;      &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataframe&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;agg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/understanding-meta-task-graph.png&quot; alt=&quot;Dask task graph, starts with two partitions thatare input to a dataframe-sum-chunk task each. Their results are input to a single dataframe-sum-agg which produces the final output.&quot; width=&quot;50%&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;15&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;75&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is a single operation, but Dask workflows usually have multiple such operation chained together. Therefore, to create the task graph effectively, Dask needs to know the strucutre and datatypes of the DataFame after each operation. Especially because Dask does not know the actual values/structure of the DataFrame yet.&lt;/p&gt;

&lt;p&gt;This is where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; is comes in.&lt;/p&gt;

&lt;p&gt;In the above example, the Dask DataFrame changed into a Series after &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum()&lt;/code&gt;. Dask knows this (even before we call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute()&lt;/code&gt;) only becasue of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Internally, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; is represented as an empty pandas &lt;a href=&quot;https://docs.dask.org/en/stable/dataframe.html&quot;&gt;DataFrame&lt;/a&gt; or &lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html&quot;&gt;Series&lt;/a&gt;, which has the same structure as the Dask DataFrame. To learn more about how &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; is defined internally, check out the &lt;a href=&quot;https://docs.dask.org/en/stable/dataframe-design.html#metadata&quot;&gt;DataFrame Internal Design documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To see the actual metadata information for a collection, you can look at the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;._meta&lt;/code&gt; attribute[1]:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_meta&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Series&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;how-to-specify-meta&quot;&gt;How to specify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;You can specify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; in a few different ways, but the recommended way for Dask DataFrame is:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“An empty &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pd.DataFrame&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pd.Series&lt;/code&gt; that matches the dtypes and column names of the output.”&lt;/p&gt;

  &lt;p&gt;~ &lt;a href=&quot;https://docs.dask.org/en/stable/generated/dask.dataframe.DataFrame.apply.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DataFrame.apply()&lt;/code&gt; docstring&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta_df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;x&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;y&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta_df&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;Empty&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta_df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf2&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href=&quot;https://docs.dask.org/en/stable/dataframe-design.html#metadata&quot;&gt;other ways you can describe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt;&lt;/a&gt; are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;For a DataFrame, you can specify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; as a:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Python dictionary: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{column_name_1: dtype_1, column_name_2: dtype_2, …}&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Iterable of tuples: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[(column_name_1, dtype_1), (columns_name_2, dtype_2, …)]&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; that while describing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; as shown above, using a dictionary or iterable of tuples, the order in which you mention column names is important. Dask will use the same order to create the pandas DataFrame for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt;. If the orders don’t match, you will see the following error:&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ValueError: The columns in the computed data do not match the columns in the provided metadata
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;For a Series output, you can specify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; using a single tuple: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(coulmn_name, dtype)&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should &lt;strong&gt;not&lt;/strong&gt; describe &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; using just a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dtype&lt;/code&gt; (like: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta=&quot;int64&quot;&lt;/code&gt;), even for scalar outputs. If you do, you will see the following warning:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FutureWarning: Meta is not valid, `map_partitions` and `map_overlap` expects output to be a pandas object. Try passing a pandas object as meta or a dict or tuple representing the (name, dtype) of the columns. In the future the meta you passed will not work.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;During operations like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_partitions&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt; (which uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_partitions&lt;/code&gt; internally), Dask coerces the scalar output of each partition into a pandas object. So, the output of functions that take &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; will never be scalar.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repartition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_partitions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;core&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;series&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Series&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, the Dask DataFrame &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddf&lt;/code&gt; has only one partition. Hence, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;len(x)&lt;/code&gt; on that one partition would result in a scalar output of integer dtype. However, when we compute it, we see a pandas Series. This confirms that Dask is coercing the outputs to pandas objects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Another note&lt;/strong&gt;, Dask Arrays may not always do this conversion. You can look at the &lt;a href=&quot;https://docs.dask.org/en/stable/array-api.html&quot;&gt;API reference&lt;/a&gt; for your particular Array operation for details.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_arr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_arr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;meta-does-not-force-the-structure-or-dtypes&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; does not &lt;em&gt;force&lt;/em&gt; the structure or dtypes&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; can be thought of as a suggestion to Dask. Dask uses this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; to generate the task graph until it can infer the actual metadata from the values. It &lt;strong&gt;does not&lt;/strong&gt; force the output to have the structure or dtype of the specified &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Consider the following example, and remember that we defined &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddf&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt; column names in the previous sections.&lt;/p&gt;

&lt;p&gt;If we provide different column names (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;b&lt;/code&gt;) in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; description, Dask uses these new names to create the task graph:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta_df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;b&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta_df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Structure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                   &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;      &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;              &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;                &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;                &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, if we compute &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;result&lt;/code&gt;, we will get the following error:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; result.compute()
ValueError: The columns in the computed data do not match the columns in the provided metadata
  Extra:   [&apos;x&apos;, &apos;y&apos;]
  Missing: [&apos;a&apos;, &apos;b&apos;]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;While computing, Dask evaluates the actual metadata with columns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt;. This does not match the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; that we provided, and hence, Dask raises a helpful error message. Notice how Dask does not change the output to have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;b&lt;/code&gt; here, rather uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;b&lt;/code&gt; column names only for intermediate task graphs.&lt;/p&gt;

&lt;h2 id=&quot;using-_meta-directly&quot;&gt;Using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;._meta&lt;/code&gt; directly&lt;/h2&gt;

&lt;p&gt;In some rare case, you can also set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;._meta&lt;/code&gt; attribute[1] directly for a Dask DataFrame. For example, if the DataFrame was created with incorrect dtypes, like:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;         &lt;span class=&quot;s&quot;&gt;&quot;x&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;         &lt;span class=&quot;s&quot;&gt;&quot;y&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Note the “object” dtype
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Structure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;              &lt;span class=&quot;nb&quot;&gt;object&lt;/span&gt;  &lt;span class=&quot;nb&quot;&gt;object&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;                 &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;                 &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The values are clearly integers but the dtype says &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;object&lt;/code&gt;, so we can’t perform integer operations like addition:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;ValueError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Metadata&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inference&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;failed&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`add`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;Original&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;below&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;------------------------&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;TypeError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;can only concatenate str (not &quot;int&quot;) to str&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, we can explicitly define &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;._meta&lt;/code&gt;[1]:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_meta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;x&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;y&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;int64&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then, perform the addition:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Structure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                   &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;      &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;              &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;                &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;                &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;Have you run into issues with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; before? Please let us know on &lt;a href=&quot;https://dask.discourse.group/&quot;&gt;Discourse&lt;/a&gt;, and we will consider including it here, or updating the Dask documentation. :)&lt;/p&gt;

&lt;p&gt;[1] NOTE: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;._meta&lt;/code&gt; is not a public property, so we recommend using it only when necessary. There is &lt;a href=&quot;https://github.com/dask/dask/issues/8585&quot;&gt;an ongoing discussion&lt;/a&gt; around creating public methods to get, set, and view the information in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;._meta&lt;/code&gt;, and this blog post will be updated to use the public methods when they’re created.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Data Proximate Computation on a Dask Cluster Distributed Between Data Centres</title>
   <link href="https://blog.dask.org/2022/07/19/dask-multi-cloud"/>
   <updated>2022-07-19T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2022/07/19/dask-multi-cloud</id>
   
   <category>distributed</category>
   
   <category>deployment</category>
   
   <content type="html">&lt;p&gt;&lt;em&gt;This work is a joint venture between the &lt;a href=&quot;https://www.metoffice.gov.uk&quot;&gt;Met Office&lt;/a&gt; and the &lt;a href=&quot;https://www.europeanweather.cloud/&quot;&gt;European Weather Cloud&lt;/a&gt;, which is a partnership of &lt;a href=&quot;https://ecmwf.int&quot;&gt;ECMWF&lt;/a&gt; and &lt;a href=&quot;https://eumetsat.int/&quot;&gt;EUMETSAT&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;We have devised a technique for creating a Dask cluster where worker nodes are hosted in different data centres, connected by a mesh VPN that allows the scheduler and workers to communicate and exchange results.&lt;/p&gt;

&lt;p&gt;A novel (ab)use of Dask resources allows us to run data processing tasks on the workers in the cluster closest to the source data, so that communication between data centres is minimised. If combined with zarr to give access to huge hyper-cube datasets in object storage, we believe that the technique could realise the potential of data-proximate distributed computing in the Cloud.&lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;The UK Met Office has been carrying out a study into data-proximate computing in collaboration with the European Weather Cloud. We identified Dask as a key technology, but whilst existing Dask techniques focus on parallel computation in a single data centre, we looked to extend this to computation across data centres. This way, when the data required is hosted in multiple locations, tasks can be run where the data is rather than copying it.&lt;/p&gt;

&lt;p&gt;Dask worker nodes exchange data chunks over a network, coordinated by a scheduler. There is an assumption that all nodes are freely able to communicate, which is not generally true across data centres due to firewalls, NAT, etc, so a truly distributed approach has to solve this problem. In addition, it has to manage data transfer efficiently, because moving data chunks between data centres is much more costly than between workers in the same cloud.&lt;/p&gt;

&lt;p&gt;This notebook documents a running proof-of-concept that addresses these problems. It runs a computation in 3 locations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;This computer, where the client and scheduler are running. This was run on AWS during development.&lt;/li&gt;
  &lt;li&gt;The ECMWF data centre. This has compute resources, and hosts data containing &lt;em&gt;predictions&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;The EUMETSAT data centre, with compute resources and data on &lt;em&gt;observations&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;IPython.display&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Image&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;images/datacentres.png&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# this because GitHub doesn&apos;t render markup images in private repos
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-multi-cloud_1_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The idea is that tasks accessing data available in a location should be run there. Meanwhile the computation can be defined, invoked, and the results rendered, elsewhere. All this with minimal hinting to the computation as to how this should be done.&lt;/p&gt;

&lt;h2 id=&quot;setup&quot;&gt;Setup&lt;/h2&gt;

&lt;p&gt;First some imports and conveniences&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;os&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;performance_report&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_task_stream&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_worker_pools&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;propagate_pools&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pytest&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ipytest&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;xarray&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;orgs&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_org&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;tree&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tree&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ipytest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;autoconfig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this case we are using a control plane IPv4 &lt;a href=&quot;https://www.wireguard.com/&quot;&gt;WireGuard&lt;/a&gt; network on 10.8.0.0/24 to set up the cluster - this is not a necessity, but simplifies this proof of concept. WireGuard peers are running on ECMWF and EUMETSAT machines already, but we have to start one here:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;4: mo-aws-ec2: &amp;lt;POINTOPOINT,NOARP,UP,LOWER_UP&amp;gt; mtu 8921 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.8.0.3/24 scope global mo-aws-ec2
       valid_lft forever preferred_lft forever
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We have worker machines configured in both ECMWF and EUMETSAT, one in each. They are accessible on the control plane network as&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;ecmwf_host&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;10.8.0.4&apos;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ECMWF_HOST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ecmwf_host&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;eumetsat_host&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;10.8.0.2&apos;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;env&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EUMETSAT_HOST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;eumetsat_host&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;env: ECMWF_HOST=10.8.0.4
env: EUMETSAT_HOST=10.8.0.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;mount-the-data&quot;&gt;Mount the Data&lt;/h2&gt;

&lt;p&gt;This machine needs access to the data files over the network in order to read NetCDF metadata. The workers are sharing their data with NFS, so we mount them here. (In this proof of concept, the control plane network is used for NFS, but the data plane network could equally be used, or a more appropriate technology such as &lt;a href=&quot;https://zarr.readthedocs.io/en/stable/&quot;&gt;zarr&lt;/a&gt; accessing object storage.)&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;%%bash
&lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt; ./data-reset.sh

&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; /data/ecmwf
&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; /data/eumetsat
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount &lt;span class=&quot;nv&quot;&gt;$ECMWF_HOST&lt;/span&gt;:/data/ecmwf /data/ecmwf
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount &lt;span class=&quot;nv&quot;&gt;$EUMETSAT_HOST&lt;/span&gt;:/eumetsatdata/ /data/eumetsat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;images/datacentres-data.png&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-multi-cloud_11_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;access-to-data&quot;&gt;Access to Data&lt;/h2&gt;

&lt;p&gt;For this demonstration, we have two large data files that we want to process. On ECMWF we have predictions in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/data/ecmwf/000490262cdd067721a34112963bcaa2b44860ab.nc&lt;/code&gt;. Workers running in ECMWF can see the file&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id_rsa_rcar_infra&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;rcar&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ECMWF_HOST&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;tree /data/&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/data/
└── ecmwf
    └── 000490262cdd067721a34112963bcaa2b44860ab.nc

1 directory, 1 file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and because that directory is mounted here over NFS, so can this computer&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tree&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ecmwf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/data/ecmwf
└── 000490262cdd067721a34112963bcaa2b44860ab.nc

0 directories, 1 file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is a big file&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lh&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ecmwf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;total 2.8G
-rw-rw-r-- 1 ec2-user ec2-user 2.8G Mar 25 13:09 000490262cdd067721a34112963bcaa2b44860ab.nc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On EUMETSAT we have &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;observations.nc&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id_rsa_rcar_infra&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;rcar&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EUMETSAT_HOST&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;tree /data/eumetsat/ad-hoc&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/data/eumetsat/ad-hoc
└── observations.nc

0 directories, 1 file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;similarly visible on this computer&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lh&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;eumetsat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ad&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hoc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;-rw-rw-r-- 1 613600004 613600004 4.8M May 20 10:57 /data/eumetsat/ad-hoc/observations.nc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Crucially, ECMWF data is not visible in the EUMETSAT data centre, and vice versa.&lt;/p&gt;

&lt;h2 id=&quot;our-calculation&quot;&gt;Our Calculation&lt;/h2&gt;

&lt;p&gt;We want to compare the predictions against the observations.&lt;/p&gt;

&lt;p&gt;We can open the predictions file with xarray&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/ecmwf/000490262cdd067721a34112963bcaa2b44860ab.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;xarray.Dataset&amp;gt;
Dimensions:                  (realization: 18, height: 33, latitude: 960,
longitude: 1280, bnds: 2)
Coordinates:
* realization              (realization) int32 0 18 19 20 21 ... 31 32 33 34
* height                   (height) float32 5.0 10.0 20.0 ... 5.5e+03 6e+03
* latitude                 (latitude) float32 -89.91 -89.72 ... 89.72 89.91
* longitude                (longitude) float32 -179.9 -179.6 ... 179.6 179.9
  forecast_period          timedelta64[ns] 1 days 18:00:00
  forecast_reference_time  datetime64[ns] 2021-11-07T06:00:00
  time                     datetime64[ns] 2021-11-09
  Dimensions without coordinates: bnds
  Data variables:
  air_pressure             (realization, height, latitude, longitude) float32 dask.array&amp;lt;chunksize=(18, 33, 192, 160), meta=np.ndarray&amp;gt;
  latitude_longitude       int32 -2147483647
  latitude_bnds            (latitude, bnds) float32 dask.array&amp;lt;chunksize=(960, 2), meta=np.ndarray&amp;gt;
  longitude_bnds           (longitude, bnds) float32 dask.array&amp;lt;chunksize=(1280, 2), meta=np.ndarray&amp;gt;
  Attributes:
  history:                      2021-11-07T10:27:38Z: StaGE Decoupler
  institution:                  Met Office
  least_significant_digit:      1
  mosg__forecast_run_duration:  PT198H
  mosg__grid_domain:            global
  mosg__grid_type:              standard
  mosg__grid_version:           1.6.0
  mosg__model_configuration:    gl_ens
  source:                       Met Office Unified Model
  title:                        MOGREPS-G Model Forecast on Global 20 km St...
  um_version:                   11.5
  Conventions:                  CF-1.7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dask code running on this machine has read the metadata for the file via NFS, but has not yet read in the data arrays themselves.&lt;/p&gt;

&lt;p&gt;Likewise we can see the observations, so we can perform a calculation locally. Here we average the predictions over the realisations and then compare them with the observations at a particular height. (This is a deliberately inefficient calculation, as we could average at only the required height, but you get the point.)&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/ecmwf/000490262cdd067721a34112963bcaa2b44860ab.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/eumetsat/ad-hoc/observations.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;averages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;realization&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;averages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;#scope()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CPU times: user 10 µs, sys: 2 µs, total: 12 µs
Wall time: 13.8 µs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When we uncomment &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scope()&lt;/code&gt; and actually run this, it takes over 14 minutes to complete! Accessing the data over NFS between data centres (we run this notebook in AWS) is just too slow.&lt;/p&gt;

&lt;p&gt;In fact just copying the data files onto the computer running this notebook takes the same sort of time. At least 2.8 GiB + 4.8 MiB of data must pass from the data centres to this machine to perform the calculation.&lt;/p&gt;

&lt;p&gt;Instead we should obviously run the Dask tasks where the data is. We can do that on a Dask cluster.&lt;/p&gt;

&lt;h2 id=&quot;running-up-a-cluster&quot;&gt;Running Up a Cluster&lt;/h2&gt;

&lt;p&gt;The cluster is run up with a single command. It takes a while though&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;subprocess&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;scheduler_process&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Popen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&apos;../dask_multicloud/dask-boot.sh&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rcar@&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ecmwf_host&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rcar@&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;eumetsat_host&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[#] ip link add dasklocal type wireguard
[#] wg setconf dasklocal /dev/fd/63
[#] ip -6 address add fda5:c0ff:eeee:0::1/64 dev dasklocal
[#] ip link set mtu 1420 up dev dasklocal
[#] ip -6 route add fda5:c0ff:eeee:2::/64 dev dasklocal
[#] ip -6 route add fda5:c0ff:eeee:1::/64 dev dasklocal
2022-06-29 14:46:57,237 - distributed.scheduler - INFO - -----------------------------------------------
2022-06-29 14:46:58,602 - distributed.http.proxy - INFO - To route to workers diagnostics web server please install jupyter-server-proxy: python -m pip install jupyter-server-proxy
2022-06-29 14:46:58,643 - distributed.scheduler - INFO - -----------------------------------------------
2022-06-29 14:46:58,644 - distributed.scheduler - INFO - Clear task state
2022-06-29 14:46:58,646 - distributed.scheduler - INFO -   Scheduler at:     tcp://172.17.0.2:8786
2022-06-29 14:46:58,646 - distributed.scheduler - INFO -   dashboard at:                     :8787
2022-06-29 14:47:16,104 - distributed.scheduler - INFO - Register worker &amp;lt;WorkerState &apos;tcp://[fda5:c0ff:eeee:1::11]:37977&apos;, name: ecmwf-1-2, status: undefined, memory: 0, processing: 0&amp;gt;
2022-06-29 14:47:16,107 - distributed.scheduler - INFO - Starting worker compute stream, tcp://[fda5:c0ff:eeee:1::11]:37977
2022-06-29 14:47:16,108 - distributed.core - INFO - Starting established connection
2022-06-29 14:47:16,108 - distributed.scheduler - INFO - Register worker &amp;lt;WorkerState &apos;tcp://[fda5:c0ff:eeee:1::11]:44575&apos;, name: ecmwf-1-3, status: undefined, memory: 0, processing: 0&amp;gt;
2022-06-29 14:47:16,109 - distributed.scheduler - INFO - Starting worker compute stream, tcp://[fda5:c0ff:eeee:1::11]:44575
2022-06-29 14:47:16,109 - distributed.core - INFO - Starting established connection
2022-06-29 14:47:16,113 - distributed.scheduler - INFO - Register worker &amp;lt;WorkerState &apos;tcp://[fda5:c0ff:eeee:1::11]:40121&apos;, name: ecmwf-1-1, status: undefined, memory: 0, processing: 0&amp;gt;
2022-06-29 14:47:16,114 - distributed.scheduler - INFO - Starting worker compute stream, tcp://[fda5:c0ff:eeee:1::11]:40121
2022-06-29 14:47:16,114 - distributed.core - INFO - Starting established connection
2022-06-29 14:47:16,119 - distributed.scheduler - INFO - Register worker &amp;lt;WorkerState &apos;tcp://[fda5:c0ff:eeee:1::11]:40989&apos;, name: ecmwf-1-0, status: undefined, memory: 0, processing: 0&amp;gt;
2022-06-29 14:47:16,121 - distributed.scheduler - INFO - Starting worker compute stream, tcp://[fda5:c0ff:eeee:1::11]:40989
2022-06-29 14:47:16,121 - distributed.core - INFO - Starting established connection
2022-06-29 14:47:23,342 - distributed.scheduler - INFO - Register worker &amp;lt;WorkerState &apos;tcp://[fda5:c0ff:eeee:2::11]:33423&apos;, name: eumetsat-2-0, status: undefined, memory: 0, processing: 0&amp;gt;
2022-06-29 14:47:23,343 - distributed.scheduler - INFO - Starting worker compute stream, tcp://[fda5:c0ff:eeee:2::11]:33423
2022-06-29 14:47:23,343 - distributed.core - INFO - Starting established connection
2022-06-29 14:47:23,346 - distributed.scheduler - INFO - Register worker &amp;lt;WorkerState &apos;tcp://[fda5:c0ff:eeee:2::11]:43953&apos;, name: eumetsat-2-1, status: undefined, memory: 0, processing: 0&amp;gt;
2022-06-29 14:47:23,348 - distributed.scheduler - INFO - Starting worker compute stream, tcp://[fda5:c0ff:eeee:2::11]:43953
2022-06-29 14:47:23,348 - distributed.core - INFO - Starting established connection
2022-06-29 14:47:23,350 - distributed.scheduler - INFO - Register worker &amp;lt;WorkerState &apos;tcp://[fda5:c0ff:eeee:2::11]:46089&apos;, name: eumetsat-2-3, status: undefined, memory: 0, processing: 0&amp;gt;
2022-06-29 14:47:23,352 - distributed.scheduler - INFO - Starting worker compute stream, tcp://[fda5:c0ff:eeee:2::11]:46089
2022-06-29 14:47:23,352 - distributed.core - INFO - Starting established connection
2022-06-29 14:47:23,357 - distributed.scheduler - INFO - Register worker &amp;lt;WorkerState &apos;tcp://[fda5:c0ff:eeee:2::11]:43727&apos;, name: eumetsat-2-2, status: undefined, memory: 0, processing: 0&amp;gt;
2022-06-29 14:47:23,358 - distributed.scheduler - INFO - Starting worker compute stream, tcp://[fda5:c0ff:eeee:2::11]:43727
2022-06-29 14:47:23,358 - distributed.core - INFO - Starting established connection
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We need to wait for 8 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;distributed.core - INFO - Starting established connection&lt;/code&gt; lines - one from each of 4 worker processes on each of 2 worker machines.&lt;/p&gt;

&lt;p&gt;What has happened here is:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;start-scheduler.sh&lt;/code&gt; runs up a Docker container on this computer.&lt;/li&gt;
  &lt;li&gt;The container creates a WireGuard IPv6 data plane VPN. This involves generating shared keys for all the nodes and a network interface inside itself. This data plane VPN is transient and unique to this cluster.&lt;/li&gt;
  &lt;li&gt;The container runs a Dask scheduler, hosted on the data plane network.&lt;/li&gt;
  &lt;li&gt;It then asks each data centre to provision workers and routing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each data centre hosts a control process, accessible over the control plane network. On invocation:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The control process creates a WireGuard network interface on the data plane network. This acts as a router between the workers inside the data centres and the scheduler.&lt;/li&gt;
  &lt;li&gt;It starts Docker containers on compute instances. These containers have their own WireGuard network interface on the data plane network, routing via the control process instance.&lt;/li&gt;
  &lt;li&gt;The Docker containers spawn (4) Dask worker processes, each of which connects via the data plane network back to the scheduler created at the beginning.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is one container on this computer running the scheduler, talking to a container on each worker machine, over a throw-away data plane WireGuard IPv6 network which allows each of the (in this case 8) Dask worker processes to communicate with each other and the scheduler, even though they are partitioned over 3 data centres.&lt;/p&gt;

&lt;p&gt;Something like this&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;images/datacentres-dask.png&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-multi-cloud_35_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Key&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;span style=&quot;color: blue&quot;&gt;Data plane network&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: green&quot;&gt;Dask&lt;/span&gt;&lt;/li&gt;
  &lt;li&gt;&lt;span style=&quot;color: red&quot;&gt;NetCDF data&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;connecting-to-the-cluster&quot;&gt;Connecting to the Cluster&lt;/h2&gt;

&lt;p&gt;The scheduler for the cluster is now running in a Docker container on this machine and is exposed on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost&lt;/code&gt;, so we can create a client talking to it&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;localhost:8786&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;2022-06-29 14:47:35,535 - distributed.scheduler - INFO - Receive client connection: Client-69f22f41-f7ba-11ec-a0a2-0acd18a5c05a
2022-06-29 14:47:35,536 - distributed.core - INFO - Starting established connection
/home/ec2-user/miniconda3/envs/jupyter/lib/python3.10/site-packages/distributed/client.py:1287: VersionMismatchWarning: Mismatched versions found

+---------+--------+-----------+---------+
| Package | client | scheduler | workers |
+---------+--------+-----------+---------+
| msgpack | 1.0.4  | 1.0.3     | 1.0.3   |
| numpy   | 1.23.0 | 1.22.3    | 1.22.3  |
| pandas  | 1.4.3  | 1.4.2     | 1.4.2   |
+---------+--------+-----------+---------+
Notes:
-  msgpack: Variation is ok, as long as everything is above 0.6
  warnings.warn(version_module.VersionMismatchWarning(msg[0][&quot;warning&quot;]))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you click through the client you should see the workers under the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduler Info&lt;/code&gt; node&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# client
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also click through to the Dashboard on http://localhost:8787/status. There we can show the workers on the task stream&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;show_all_workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;my_org&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ecmwf-1-0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;my_org&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ecmwf-1-1&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;my_org&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ecmwf-1-2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;my_org&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ecmwf-1-3&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;my_org&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;eumetsat-2-0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;my_org&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;eumetsat-2-1&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;my_org&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;eumetsat-2-2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;my_org&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;eumetsat-2-3&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;show_all_workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;running-on-the-cluster&quot;&gt;Running on the Cluster&lt;/h2&gt;

&lt;p&gt;Now that there is a Dask client in scope, calculations will be run on the cluster. We can define the tasks to be run&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/ecmwf/000490262cdd067721a34112963bcaa2b44860ab.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/eumetsat/ad-hoc/observations.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;averages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;realization&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;averages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But when we try to perform the calculation it fails&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pytest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;raises&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;FileNotFoundError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;excinfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;show_all_workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;excinfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&quot;[Errno 2] No such file or directory: b&apos;/data/eumetsat/ad-hoc/observations.nc&apos;&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It fails because the Dask scheduler has sent some of the tasks to read the data to workers running in EUMETSAT. They cannot see the data in ECMWF, and nor do we want them too, because reading all that data between data centres would be too slow.&lt;/p&gt;

&lt;h2 id=&quot;data-proximate-computation&quot;&gt;Data-Proximate Computation&lt;/h2&gt;

&lt;p&gt;Dask has the concept of &lt;a href=&quot;https://distributed.dask.org/en/stable/resources.html&quot;&gt;resources&lt;/a&gt;. Tasks can be scheduled to run only where a resource (such as a GPU or amount of RAM) is available. We can &lt;a href=&quot;https://dask.discourse.group/t/understanding-work-stealing/335/13&quot;&gt;abuse this mechanism&lt;/a&gt; to pin tasks to a data centre, by treating the data centre as a resource.&lt;/p&gt;

&lt;p&gt;To do this, when we create the workers we mark them as having a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pool-ecmwf&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pool-eumetsat&lt;/code&gt; resource. Then when we want to create tasks that can only run in one data centre, we annotate them as requiring the appropriate resource&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;pool-ecmwf&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;realization&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can hide that boilerplate inside a Python context manager - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pool&lt;/code&gt; - and write&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ecmwf&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;realization&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pool&lt;/code&gt; context manager is a collaboration with the Dask developers, and is &lt;a href=&quot;https://github.com/gjoseph92/dask-worker-pools&quot;&gt;published on GitHub&lt;/a&gt;. You can read more on the evolution of the concept on the &lt;a href=&quot;https://dask.discourse.group/t/understanding-work-stealing/335&quot;&gt;Dask Discourse&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We can do better than annotating the computation tasks though. If we load the data inside the context manager block, the data loading tasks will carry the annotation with them&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ecmwf&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/ecmwf/000490262cdd067721a34112963bcaa2b44860ab.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this case we need another context manager in the library, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;propagate_pools&lt;/code&gt;, to ensure that the annotation is not lost when the task graph is processed and executed&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;propagate_pools&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;realization&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The two context managers allow us to annotate data with its pool, and hence where the loading tasks will run&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ecmwf&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/ecmwf/000490262cdd067721a34112963bcaa2b44860ab.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;eumetsat&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/eumetsat/ad-hoc/observations.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;define some deferred calculations oblivious to the data’s provenance&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;averaged_predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;realization&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;averaged_predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and then perform the final calculation&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;propagate_pools&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;show_all_workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CPU times: user 127 ms, sys: 6.34 ms, total: 133 ms
Wall time: 4.88 s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Remember, our aim was to distribute a calculation across data centres, whilst preventing workers reading foreign bulk data.&lt;/p&gt;

&lt;p&gt;Here we know that data is only being read by workers in the appropriate location, because neither data centre can read the other’s data. Once data is in memory, Dask prefers to schedule tasks on the workers that have it, so that the local workers will tend to perform follow-on calcuations, and data chunks will tend to stay in the data centre that they were read from.&lt;/p&gt;

&lt;p&gt;Ordinarily though, if workers are idle, Dask would use them to perform calculations even if they don’t have the data. If allowed, this work stealing would result in data being moved between data centres unnecessarly, a potentially expensive operation. To prevent this, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;propagate_pools&lt;/code&gt; context manager installs a scheduler optimisation that disallows work-stealing between workers in different pools.&lt;/p&gt;

&lt;p&gt;Once data loaded in one pool needs to be combined with data from another (the substraction in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;averaged_predictions.isel(height=10) - observations&lt;/code&gt; above), this is no longer classified as work stealing, and Dask will move data between data centres as required.&lt;/p&gt;

&lt;p&gt;That calculation in one go looks like this&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ecmwf&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/ecmwf/000490262cdd067721a34112963bcaa2b44860ab.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;eumetsat&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/eumetsat/ad-hoc/observations.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;averages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;realization&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;averages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;propagate_pools&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;show_all_workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figsize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,...,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;origin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;lower&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CPU times: user 234 ms, sys: 27.6 ms, total: 261 ms
Wall time: 6.04 s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-multi-cloud_65_1.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In terms of code, compared with the local version above, this has only added the use of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;with&lt;/code&gt; blocks to label data and manage execution, and executes some 100 times faster.&lt;/p&gt;

&lt;p&gt;This is a best case, because in the demonstrator the files are actually hosted on the worker machines, so the speed difference between reading the files locally and reading them over NFS is maximized. Perhaps more persuasive is the measured volume of network traffic.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Method&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Time Taken&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Measured Network Traffic&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Calculation over NFS&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&amp;gt; 14 minutes&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;2.8 GiB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Distributed Calculation&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;~ 10 seconds&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;8 MiB&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Apart from some control and status messages, only the data required to paint the picture is sent over the network to this computer.&lt;/p&gt;

&lt;p&gt;Looking at the task stream we see the ECMWF workers (on the bottom) doing the bulk of the reading and computation, with the red transfer tasks joining this with data on EUMETSAT.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;Image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;images/task-graph.png&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-multi-cloud_67_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;catalogs&quot;&gt;Catalogs&lt;/h2&gt;

&lt;p&gt;We can simplify this code even more. Because the data-loading tasks are labelled with their resource pool, this can be opaque to the scientist. So we can write&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;load_from_catalog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pool&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;allowing us to ignore where the data came from&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;load_from_catalog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/ecmwf/000490262cdd067721a34112963bcaa2b44860ab.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;load_from_catalog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/eumetsat/ad-hoc/observations.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;averages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;predictions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;realization&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;averages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;observations&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;propagate_pools&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;show_all_workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;diff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Of course the cluster would have to be provisioned with compute resources in the appropriate data centres, although with some work this could be made dynamic as part of the catalog code.&lt;/p&gt;

&lt;h2 id=&quot;more-information&quot;&gt;More Information&lt;/h2&gt;

&lt;p&gt;This &lt;a href=&quot;https://github.com/dmcg/dask-multicloud-poc/blob/main/demo/dask-multi-cloud.ipynb&quot;&gt;notebook&lt;/a&gt;, and the code behind it, are published in a &lt;a href=&quot;https://github.com/dmcg/dask-multicloud-poc&quot;&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For details of the prototype implementation, and ideas for enhancements, see
&lt;a href=&quot;https://github.com/dmcg/dask-multicloud-poc/blob/main/demo/dask-multi-cloud-details.ipynb&quot;&gt;dask-multi-cloud-details.ipynb&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;Thank you to Armagan Karatosun (EUMETSAT) and Vasileios Baousis (ECMWF) for their help and support with the infrastructure to support this proof of concept.
Gabe Joseph (Coiled) wrote the clever pool context managers, and Jacob Tomlinson (NVIDIA) reviewed this document.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Crown Copyright 2022&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Documentation Framework</title>
   <link href="https://blog.dask.org/2022/07/15/documentation-framework"/>
   <updated>2022-07-15T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2022/07/15/documentation-framework</id>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;Yesterday at the Dask BOF at &lt;a href=&quot;https://www.scipy2022.scipy.org/&quot;&gt;SciPy&lt;/a&gt; we were talking about the recent docs work and how we can fill holes in our documentation. We want to come up with a strategy to improve things.&lt;/p&gt;

&lt;p&gt;For a while, we’ve been exploring moving our documentation to the &lt;a href=&quot;https://diataxis.fr/&quot;&gt;Diátaxis Framework&lt;/a&gt;, and after catching up with other maintainers at SciPy it is clear that many projects are converging on this framework and we are confident about continuing on this journey. This post lays out how we will take the existing docs and apply the framework to make content clearer and easier to find. NOTE: This blog post sketches out where we are going, but the change will happen incrementally.&lt;/p&gt;

&lt;p&gt;We want the docs to quickly answer questions like:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I know my workflow is parallizable - can Dask help?&lt;/li&gt;
  &lt;li&gt;How do I find my logs for a particular worker?&lt;/li&gt;
  &lt;li&gt;Should I be using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.persist()&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#theory&quot;&gt;Theory&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#current-documentation&quot;&gt;Current Documentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#new-structure&quot;&gt;New Structure&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#how-you-can-help&quot;&gt;How you can help&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;theory&quot;&gt;Theory&lt;/h2&gt;

&lt;p&gt;The Diataxis Framework proposes that the documentation be split into 4 entirely separate sections.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/diataxis-framework.png&quot; alt=&quot;Diataxis Framework&quot; /&gt;
&lt;em&gt;Credit: https://diataxis.fr/&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each section serves a unique purpose.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Tutorials&lt;/strong&gt; provide a narrative that addresses a particular larger objective such as predicting global temperature or analyzing financial data.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;How-Tos&lt;/strong&gt; target people who already know &lt;em&gt;what&lt;/em&gt; they want to do and are trying to figure out &lt;em&gt;how&lt;/em&gt; to do it. These people might ask questions like:
    &lt;ul&gt;
      &lt;li&gt;How do I apply a rolling mean to a timeseries?&lt;/li&gt;
      &lt;li&gt;How do I groupby a column?&lt;/li&gt;
      &lt;li&gt;How do I write to a geotiff?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reference&lt;/strong&gt; provides the exact arguments and outputs of a particular operation.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Explanation&lt;/strong&gt; gives context and includes descriptions of how operations work internally.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;current-documentation&quot;&gt;Current Documentation&lt;/h2&gt;

&lt;p&gt;There are several different sites that comprise different aspects of dask documentation. Of particular interest are &lt;a href=&quot;https://examples.dask.org&quot;&gt;Examples&lt;/a&gt;, &lt;a href=&quot;https://tutorial.dask.org&quot;&gt;Tutorials&lt;/a&gt; and &lt;a href=&quot;https://docs.dask.org&quot;&gt;Docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The bulk of the documentation that we currently have on &lt;a href=&quot;https://docs.dask.org&quot;&gt;Docs&lt;/a&gt; falls under “Explanation” and “Reference” but they are pretty intermingled. There are also some small “How-Tos” sprinkled in, particularly in the API docs.&lt;/p&gt;

&lt;p&gt;The material on &lt;a href=&quot;https://tutorial.dask.org&quot;&gt;Tutorials&lt;/a&gt; is a mixture of “Tutorial” and “Explanation”. They answer questions like: “What can I do with Dask Dataframes?” &lt;em&gt;and&lt;/em&gt; questions like “What is a Dask Dataframe?”. These are styled like lectures in that there is often no motivating example and the assumption is that the audience wants to learn both about how to do specific operations in dask and how those operations work. This type of material can be consumed as standalone content and runs on binder.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://examples.dask.org&quot;&gt;Examples&lt;/a&gt; pretty much falls under “How-To” but there is a fair amount of setup and each example isn’t split into small enough bits. They answer questions like: “How do I use dask dataframes?” and they have some more longer workflows.&lt;/p&gt;

&lt;h3 id=&quot;which-pages-are-most-used&quot;&gt;Which pages are most used?&lt;/h3&gt;

&lt;p&gt;From Google Analytics we can see the most commonly viewed pages.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/docs-google-analytics.png&quot; width=&quot;70%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It is hard to understand whether those pages are the most visible, or if they actually contain the information that people are trying to find. But either way, it conveys the importance of navigation in directing users.&lt;/p&gt;

&lt;h2 id=&quot;new-structure&quot;&gt;New Structure&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://tutorial.dask.org&quot;&gt;Tutorial&lt;/a&gt; will be left as is and treated as a long-form overview.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://examples.dask.org&quot;&gt;Examples&lt;/a&gt; will be presented more as &lt;strong&gt;How-Tos&lt;/strong&gt; with little explanation and more code. This will be similar to gallery or cookbook style documentation that you may see in other projects. Historically one of the current roles of examples is to demonstrate what Dask looks like, that role is now subsumed by “10 Minutes to Dask”.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.dask.org&quot;&gt;Docs&lt;/a&gt; will be reorganized and the left-nav will be slimmed down dramatically to provide direction. One idea for the left-nav is:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Installation&lt;/li&gt;
  &lt;li&gt;10 Minutes to Dask (&lt;strong&gt;How-To&lt;/strong&gt;)&lt;/li&gt;
  &lt;li&gt;Tutorials &amp;amp; Talks (&lt;strong&gt;Tutorial&lt;/strong&gt;)&lt;/li&gt;
  &lt;li&gt;Examples (&lt;strong&gt;How-To&lt;/strong&gt;)- this will be a landing page that points to individual sections of &lt;a href=&quot;https://examples.dask.org&quot;&gt;Examples&lt;/a&gt; or API Reference.&lt;/li&gt;
  &lt;li&gt;Best Practices (&lt;strong&gt;Explanation&lt;/strong&gt;)&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;API (&lt;strong&gt;Reference&lt;/strong&gt;)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;User Guide (&lt;strong&gt;Explanation&lt;/strong&gt;)&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;DataFrame - explains what a dataframe is - links out aggressively to reference docs.&lt;/li&gt;
      &lt;li&gt;Array&lt;/li&gt;
      &lt;li&gt;Bag&lt;/li&gt;
      &lt;li&gt;Delayed&lt;/li&gt;
      &lt;li&gt;Futures&lt;/li&gt;
      &lt;li&gt;Task Graphs&lt;/li&gt;
      &lt;li&gt;Scheduling&lt;/li&gt;
      &lt;li&gt;Diagnostic Dashboard&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Configuration (&lt;strong&gt;Reference&lt;/strong&gt;)&lt;/li&gt;
  &lt;li&gt;Deploy Dask Clusters (&lt;strong&gt;Reference&lt;/strong&gt;)&lt;/li&gt;
  &lt;li&gt;Development Guidelines (&lt;strong&gt;Reference&lt;/strong&gt;)&lt;/li&gt;
  &lt;li&gt;Changelog (&lt;strong&gt;Reference&lt;/strong&gt;)&lt;/li&gt;
  &lt;li&gt;FAQs (&lt;strong&gt;Reference&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many docstrings (aka &lt;strong&gt;Reference&lt;/strong&gt;) already contain their own short-form &lt;strong&gt;How-To&lt;/strong&gt; docs. I think this is a good place for these and we can thoroughly link from other places to these canonical docs.&lt;/p&gt;

&lt;h2 id=&quot;how-you-can-help&quot;&gt;How you can help&lt;/h2&gt;

&lt;p&gt;Please raise issues on the dask issue tracker when you find holes in the docs! The largest gaps we see now are in “how to” which commonly are found via Google. So if you search for how to do something in Dask, and you’re looking for copy-paste examples but can’t find any then let us know.&lt;/p&gt;

&lt;p&gt;If you see other gaps please let us know about those too. And if you know how your needs fit into the diataxis framework even better :)&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>How to run different worker types with the Dask Helm Chart</title>
   <link href="https://blog.dask.org/2022/02/17/helm-multiple-worker-groups"/>
   <updated>2022-02-17T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2022/02/17/helm-multiple-worker-groups</id>
   
   <category>Kubernetes</category>
   
   <category>Helm</category>
   
   <content type="html">&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Today, we’ll learn how to deploy &lt;a href=&quot;https://dask.org/&quot;&gt;Dask&lt;/a&gt; on a &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; cluster with the Dask Helm Chart and then run and scale different worker types with annotations.&lt;/p&gt;

&lt;h3 id=&quot;what-is-the-dask-helm-chart&quot;&gt;What is the Dask Helm Chart?&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/dask/helm-chart&quot;&gt;Dask Helm Chart&lt;/a&gt; is a convenient way of deploying Dask using &lt;a href=&quot;https://helm.sh/&quot;&gt;Helm&lt;/a&gt;, a package manager for Kubernetes applications. After deploying Dask with the Dask Helm Chart, we can connect to our HelmCluster and begin scaling out workers.&lt;/p&gt;

&lt;h3 id=&quot;what-is-dask-kubernetes&quot;&gt;What is Dask Kubernetes?&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://kubernetes.dask.org/en/latest/&quot;&gt;Dask Kubernetes&lt;/a&gt; allows you to deploy and manage your Dask deployment on a Kubernetes cluster. The Dask Kubernetes Python package has a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HelmCluster&lt;/code&gt; class (among other things) that will enable you to manage your cluster from Python. In this tutorial, we will use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HelmCluster&lt;/code&gt; as our cluster manager.&lt;/p&gt;

&lt;h3 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;To have Helm installed and be able to run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;helm&lt;/code&gt; commands&lt;/li&gt;
  &lt;li&gt;To have a running Kubernetes cluster. It doesn’t matter whether you’re running Kubernetes locally using &lt;a href=&quot;https://minikube.sigs.k8s.io/docs/&quot;&gt;MiniKube&lt;/a&gt; or &lt;a href=&quot;https://kind.sigs.k8s.io/&quot;&gt;Kind&lt;/a&gt; or you’re using a cloud provider like AWS or GCP. But your cluster will need to have access to &lt;a href=&quot;https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/&quot;&gt;GPU nodes&lt;/a&gt; to run GPU workers. You’ll also need to install &lt;a href=&quot;https://rapids.ai/&quot;&gt;RAPIDS&lt;/a&gt; to run the GPU worker example.&lt;/li&gt;
  &lt;li&gt;To have &lt;a href=&quot;https://kubernetes.io/docs/tasks/tools/&quot;&gt;kubectl&lt;/a&gt; installed. Although this is not required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it, let’s get started!&lt;/p&gt;

&lt;h2 id=&quot;install-dask-kubernetes&quot;&gt;Install Dask Kubernetes&lt;/h2&gt;

&lt;p&gt;From the &lt;a href=&quot;https://kubernetes.dask.org/en/latest/installing.html&quot;&gt;documentation&lt;/a&gt;,&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;pip install dask-kubernetes --upgrade
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;conda install dask-kubernetes -c conda-forge
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;install-the-dask-helm-chart&quot;&gt;Install the Dask Helm Chart&lt;/h2&gt;

&lt;p&gt;First, deploy Dask on Kubernetes with Helm:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;helm repo add dask https://helm.dask.org/
helm repo update
helm install my-dask dask/dask
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you should have Dask running on your Kubernetes cluster. If you have kubectl installed, you can run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl get all -n default&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/default-dask-cluster.png&quot; alt=&quot;Default Dask Cluster Installed with Helm&quot; width=&quot;661&quot; height=&quot;373&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can see that we’ve created a few resources! The main thing to know is that we start with three dask workers.&lt;/p&gt;

&lt;h2 id=&quot;add-gpu-worker-group-to-our-dask-deployment&quot;&gt;Add GPU worker group to our Dask Deployment&lt;/h2&gt;

&lt;p&gt;The Helm Chart has default values that it uses out of the box to deploy our Dask cluster on Kubernetes. But now, because we want to create some GPU workers, we need to change the default values in the Dask Helm Chart. To do this, we can create a copy of the current &lt;a href=&quot;https://github.com/dask/helm-chart/blob/main/dask/values.yaml&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;values.yaml&lt;/code&gt;&lt;/a&gt;, update it to add a GPU worker group and then update our helm deployment.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;First, you can copy the contents of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;values.yaml&lt;/code&gt; file in the Dask Helm Chart and create a new file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my-values.yaml&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Next, we’re going to update the section in the file called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;additional_worker_groups&lt;/code&gt;. The section looks like this:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;additional_worker_groups&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Additional groups of workers to create&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# - name: high-mem-workers  # Dask worker group name.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#   resources:&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#     limits:&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#       memory: 32G&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#     requests:&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;#       memory: 32G&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# (Defaults will be taken from the primary worker configuration)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Now we’re going to edit the section to look like this:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;additional_worker_groups&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Additional groups of workers to create&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;gpu-workers&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Dask worker group name.&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;replicas&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rapidsai/rapidsai-core&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;tag&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;21.12-cuda11.5-runtime-ubuntu20.04-py3.8&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;dask_worker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;dask-cuda-worker&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;extraArgs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;--resources&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;GPU=1&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;limits&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;nvidia.com/gpu&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Now we can update our deployment with our new values in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my-values.yaml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;helm upgrade -f my-values.yaml my-dask dask/dask
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Again, you can run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl get all -n default&lt;/code&gt;, and you’ll see our new GPU worker pod running:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/gpu-worker-dask-cluster.png&quot; alt=&quot;Dask Cluster Installed with Helm with a GPU worker&quot; width=&quot;653&quot; height=&quot;428&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Now we can open up a jupyter notebook or any editor to write some code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;scaling-the-workers-updown&quot;&gt;Scaling the workers Up/Down&lt;/h2&gt;

&lt;p&gt;We’ll start by importing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HelmCluster&lt;/code&gt; cluster manager from Dask Kubernetes. Next, we connect our cluster manager to our dask cluster by passing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;release_name&lt;/code&gt; of our Dask cluster as an argument. That’s it, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HelmCluster&lt;/code&gt; automatically port-forwards the scheduler to us and can give us quick access to &lt;a href=&quot;https://kubernetes.dask.org/en/latest/helmcluster.html#dask_kubernetes.HelmCluster.get_logs&quot;&gt;logs&lt;/a&gt;. Next, we’re going to scale our Dask cluster.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_kubernetes&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HelmCluster&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HelmCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;release_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;my-dask&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-cluster-four-workers.png&quot; alt=&quot;Dask Cluster with four workers&quot; width=&quot;1002&quot; height=&quot;659&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To scale our cluster, we need to provide our desired number of workers as an argument to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HelmCluster&lt;/code&gt;’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scale&lt;/code&gt; method. By default, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scale&lt;/code&gt; method scales our default worker group. You can see in the first example we scaled the default worker group from three to five workers, giving us six workers in total. In the second example, we use the handy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;worker_group&lt;/code&gt; keyword argument to scale our GPU worker group from one to two workers, giving us seven workers in total.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# scale the default worker group from 3 to 5 workers
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-cluster-six-workers.png&quot; alt=&quot;Dask Cluster with six workers&quot; width=&quot;1002&quot; height=&quot;802&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;worker_group&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;gpu-workers&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# scale the GPU worker group from 1 to 2 workers
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-cluster-seven-workers.png&quot; alt=&quot;Dask Cluster with seven cluster&quot; width=&quot;992&quot; height=&quot;845&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;example-finding-the-average-new-york-city-taxi-trip-distance-in-april-2020&quot;&gt;Example: Finding the average New York City taxi trip distance in April 2020&lt;/h2&gt;

&lt;p&gt;This example will find the average distance traveled by a yellow taxi in New York City in April 2020 using the &lt;a href=&quot;https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page&quot;&gt;NY Taxi Dataset&lt;/a&gt;. We’ll compute this distance in two different ways. The first way will employ our default dask workers, and the second way will utilize our GPU worker group. We’ll load the NY Taxi dataset as a data frame in both examples and compute the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mean&lt;/code&gt; of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trip_distance&lt;/code&gt; column. The main difference is that we need to run our GPU-specific computations using our GPU worker group. We can do this by utilizing Dask annotations.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://s3.amazonaws.com/nyc-tlc/trip+data/yellow_tripdata_2020-04.csv&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;link&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;assume_missing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;avg_trip_distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;trip_distance&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;In January 2021, the average trip distance for yellow taxis was &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;avg_trip_distance&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; miles.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;annotate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;GPU&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}):&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dask_cdf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_partitions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;avg_trip_distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_cdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;trip_distance&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;In January 2021, the average trip distance for yellow taxis was &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;avg_trip_distance&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; miles.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;closing&quot;&gt;Closing&lt;/h2&gt;

&lt;p&gt;That’s it! We’ve deployed Dask with Helm, created an additional GPU worker type, and used our workers to run an example calculation using the NY Taxi dataset. We’ve learned several new things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The Dask Helm Chart lets you create multiple worker groups with different worker types. We saw this when we made two different groups of Dask Workers: CPU and GPU workers.&lt;/li&gt;
  &lt;li&gt;You can run specific computations on your workers of choice with annotations. Our example computed the average taxi distance using the RAPIDS libraries &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cudf&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask_cudf&lt;/code&gt; on our GPU worker group.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HelmCluster&lt;/code&gt; cluster manager in Dask Kubernetes lets you scale your worker groups quickly from python. We scaled our GPU worker group by conveniently passing the worker group name as a keyword argument in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HelmCluster&lt;/code&gt; scale method.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;future-work&quot;&gt;Future Work&lt;/h2&gt;

&lt;p&gt;We’re thinking a lot about the concept of worker groups in the Dask community. Until now, most Dask deployments have homogenous workers, but as Dask users push Dask further, there is a growing demand for heterogeneous clusters with special-purpose workers. So we want to add worker groups throughout Dask.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Reflections on one year as the Dask life science fellow</title>
   <link href="https://blog.dask.org/2021/12/15/dask-fellow-reflections"/>
   <updated>2021-12-15T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/12/15/dask-fellow-reflections</id>
   
   <category>life science</category>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/GenevieveBuckley/&quot;&gt;Genevieve Buckley&lt;/a&gt; was hired as a Dask Life Science Fellow in 2021 &lt;a href=&quot;https://chanzuckerberg.com/eoss/proposals/&quot;&gt;funded by CZI&lt;/a&gt;. The goal was to improve Dask, with a &lt;a href=&quot;https://blog.dask.org/2021/03/04/the-life-science-community&quot;&gt;specific focus on the life science community&lt;/a&gt;. This blogpost contains another progress update, and some personal reflections looking back over this year.&lt;/p&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#progress-update&quot;&gt;Progress update&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#personal-reflections&quot;&gt;Personal reflections&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#highlights-from-this-year&quot;&gt;Highlights from this year&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#what-worked-well&quot;&gt;What worked well&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#what-didnt-work-so-well&quot;&gt;What didn’t work so well&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#whats-next-in-dask&quot;&gt;What’s next in Dask?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;progress-update&quot;&gt;Progress update&lt;/h2&gt;

&lt;p&gt;A previous progress update for February to September 2021 is &lt;a href=&quot;https://blog.dask.org/2021/10/20/czi-eoss-update&quot;&gt;available here&lt;/a&gt;. Read on for a progress update for the period September to December 2021.&lt;/p&gt;

&lt;p&gt;To summarize, between September and December 2021 inclusive, there were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;32 merged pull requests acorss 7 repositories (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;distributed&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-tutorial&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ITK&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;napari&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;napari.github.io&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;8 pending pull requests&lt;/li&gt;
  &lt;li&gt;1 new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt; release&lt;/li&gt;
  &lt;li&gt;1 Dask tutorial run, and assisted with a second tutorial.&lt;/li&gt;
  &lt;li&gt;4 new Dask blogposts published (five, if we count this one)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read on for a more detailed description of special projects within this time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dask stale issues sprint&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In two weeks I was able to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;close 117 stale issues, and&lt;/li&gt;
  &lt;li&gt;identify another 25 potential easy wins for the maintainer team to investigate further.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lots of other people did work around the same time, following up on old pull requests and other maintanence work. The sprint was very successful overall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dask user survey results analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In September I analyzed the results from the 2021 Dask user survey.
This was a really fun task. Because we asked a lot more questions in 2021 (18 new questions, 43 questions in total) there was was a lot more data to dig into, compared with previous years. You can read the &lt;a href=&quot;https://blog.dask.org/2021/09/15/user-survey&quot;&gt;full details about it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The biggest benefit from this work is that now we can use this data to prioritize improvements to the documentation and examples.
The top two user requests are for more documentation and more examples from their industry. But it wasn’t until this year that we started asking what industries people worked in, so we can target new narrative documentation to the areas that need it most (geoscience, life science, and finance).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ITK compatibility with Dask&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I implemented &lt;a href=&quot;https://github.com/InsightSoftwareConsortium/ITK/pull/2829/&quot;&gt;pickle serialization for itk images (ITK PR #2829)&lt;/a&gt;. This should be one of the last major pieces of the puzzle needed to make ITK images compatible with Dask. It builds on earlier work by Matt McCormick and John Kirkham (you can read a blog post about their earlier work &lt;a href=&quot;https://blog.dask.org/2019/08/09/image-itk&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Better cross-compatibility for Dask with other projects was a major goal of mine, so this is an important piece of work. I outline the next steps in the section &lt;a href=&quot;#whats-next-in-dask&quot;&gt;What’s next in Dask?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Improve rechunking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I implemented &lt;a href=&quot;https://github.com/dask/dask/pull/8124&quot;&gt;PR #8124&lt;/a&gt; fix a bug where reshaping a Dask array can cause an output array with chunks that are much too large to fit in memory.
Feedback from the life science user survey indicates that improving Dask’s performance around rechunking is a priority. This work helps to address that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High level graph work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A major piece of work earlier this year was introducing high level graphs for array slicing and array overlap operations. That is a big effort requiring a lot of ongoing work.
&lt;a href=&quot;https://github.com/dask/dask/pull/8467&quot;&gt;PR #8467&lt;/a&gt; tackles one of the next steps for this work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Find objects function for dask-image&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I implemented a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;find_objects&lt;/code&gt; function for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt; in &lt;a href=&quot;https://github.com/dask/dask-image/pull/240&quot;&gt;PR #240&lt;/a&gt;. This implementation does not need to know the maximum label number ahead of time, a subtantial improement over the previous attempt. This is a major step forward, because it removes a major blocker to introducing scikit-image like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;regionprops&lt;/code&gt; functionality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blogposts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dask blogposts published between September through to December 2021 include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/11/02/choosing-dask-chunk-sizes&quot;&gt;Choosing good chunk sizes in Dask&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;This blogpost addresses some very common concerns and questions about using Dask.
I’m very pleased with this article, due to several thoughtful reviewers the final work is a much stronger and more comprehensive than the &lt;a href=&quot;https://twitter.com/DataNerdery/status/1424953376043790341&quot;&gt;twitter thread&lt;/a&gt; that inspired it.&lt;/li&gt;
      &lt;li&gt;It’s also high impact work. In the Dask survey the most common request is for more documentation, and this content helps to address that. Twitter analytics also show much higher engagement with this content than for other similar tweets, indicating a demand in the community for this type of explanation.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/12/01/mosaic-fusion&quot;&gt;Mosaic Image Fusion&lt;/a&gt; (co-authored with Volker Hisenstein and Marvin Albert)
    &lt;ul&gt;
      &lt;li&gt;This blogpost was several months in the making (started in mid-August and published in December). It’s fantastic to have people sharing some of the very cool work they do with Dask on real world problems.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/10/20/czi-eoss-update&quot;&gt;CZI EOSS Update&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;This blogpost shares with the community an interim progress update provided to CZI.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/09/15/user-survey&quot;&gt;2021 Dask user survey results&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Discussed in more detail above, the analysis results from the Dask User Survey were published in September 2021.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tutorials&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I presented a Dask tutorial at the &lt;a href=&quot;https://resbaz.github.io/resbaz2021/sydney/&quot;&gt;ResBaz Sydney online conference&lt;/a&gt; on the 25th of November 2021. Thanks to the ResBaz organisers and to David McFarlane, Svetlana Tkachenko, and Oksana Tkachenko for monitoring the chat for questions on the day.&lt;/li&gt;
  &lt;li&gt;Naty Clementi ran a Dask tutorial for the Women Who Code DC meetup on the 4th of November 2021. I assisted Naty, mostly by monitoring questions in the chat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;personal-reflections&quot;&gt;Personal reflections&lt;/h2&gt;

&lt;p&gt;Reflecting back over the whole year, there were some things that worked well and some things that were less successful.&lt;/p&gt;

&lt;h3 id=&quot;highlights-from-this-year&quot;&gt;Highlights from this year&lt;/h3&gt;

&lt;p&gt;My personal highlights include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ITK + Dask integration work (discussed in more detail above).&lt;/li&gt;
  &lt;li&gt;A find objects fucntion for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt; (discussed in more detail above).&lt;/li&gt;
  &lt;li&gt;Visualization work, because it’s very high impact. We’re solving issues raised by life science groups, but the improved tools benefit EVERYONE who uses Dask.&lt;/li&gt;
  &lt;li&gt;This bugfix from &lt;a href=&quot;https://github.com/dask/dask/pull/7391&quot;&gt;dask PR #7391&lt;/a&gt;, because this single change fixed problems in four places at once (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scikit-image&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-ml&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xgcm/xhistogram&lt;/code&gt;, and the cupy dask tests).&lt;/li&gt;
  &lt;li&gt;Community building, conferences, and engagement. Lots of effort went into events over this year, and it’s certainly paid dividends.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;what-worked-well&quot;&gt;What worked well&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dask stale issues sprint&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;This was useful for the project, as well as useful for me.
Sorting through old issues was an incredibly effective way to get familiar with who the experts are for particular topics. It would have been even better if this happened in the first few months of working on Dask, instead of the last few months.&lt;/li&gt;
  &lt;li&gt;It’s been suggested that one good way to gain familiarity is spending 6 months full time managing the issue tracker. Maybe that’s true, but the much shorter stale issue sprint was a very efficient way of getting a lot of the same benefits in a short space of time. I’d recommend it for new maintainers or triage team members.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Community building events&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We had a very successful year in terms of community building and events. This included tutorials, workshops, conferences, and community outreach. Summary of major events:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Led a Dask tutorial at &lt;a href=&quot;https://resbaz.github.io/resbaz2021/sydney/&quot;&gt;ResBaz Sydney 2021&lt;/a&gt; in November.&lt;/li&gt;
  &lt;li&gt;Co-led a half-day tutorial on napari and Dask at the &lt;a href=&quot;https://www.lmameeting.com.au/&quot;&gt;Light Microscopy Australia Meeting&lt;/a&gt; in August.&lt;/li&gt;
  &lt;li&gt;SciPy 2021 presentation &lt;a href=&quot;https://www.youtube.com/watch?v=tY_lCGS1BMk&amp;amp;t=60s&quot;&gt;Scaling Science: leveraging Dask for life sciences&lt;/a&gt; in July.&lt;/li&gt;
  &lt;li&gt;Organized the &lt;a href=&quot;https://blog.dask.org/2021/05/24/life-science-summit-workshop&quot;&gt;Dask Life Science workshop&lt;/a&gt; at the Dask Summit in May 2021. The life science workshop included 15 pre-recorded talks, and 3 interactive discussions.&lt;/li&gt;
  &lt;li&gt;Co-organised the &lt;a href=&quot;https://blog.dask.org/2021/06/25/dask-down-under&quot;&gt;Dask Down Under&lt;/a&gt; workshop for the Dask Summit in May 2021. Dask Down Under contained 5 talks, 2 tutorials, 1 panel discussion, and 1 meet and greet networking event.
Dask Down Under&lt;/li&gt;
  &lt;li&gt;Expert panelist at the &lt;a href=&quot;https://www.vis2021.com.au/&quot;&gt;VIS2021 symposium&lt;/a&gt; in February.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Visualization work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This has been very high impact work, and I’m pleased with what we’ve achieved. Improved tools for visualization were requested by users in our survey of the life science community. This was a high priority, because improvements to visuzliation tools benefit EVERYONE who uses Dask.&lt;/p&gt;

&lt;h3 id=&quot;what-didnt-work-so-well&quot;&gt;What didn’t work so well&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Technical resources&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We never really solved the problem of finding someone I could go to with technical questions. I did have people to ask about some specific projects, but in most cases I didn’t have a good way to direct questions to the right people. This is a challenging problem, especially because most Dask maintainers and contributors have full time jobs doing other things too. In my opinion, this negatively impacted the work and what we were able to achieve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Being added to the @dask/maintenance team&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There’s no point getting notifications if you don’t have GitHub permissions to do anything about them. In future I think we should add only people with at least triage or write permissions to the github teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real time interaction&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We tried out “Ask a maintainer” office hours for the life science community, but they were poorly attended, so we cancelled this.&lt;/li&gt;
  &lt;li&gt;We added some “Dask social chat” events to the calendar, but they were not very well attended outside of the first few. Most often, zero people attended. (There is another social chat for the Americas/Europe time zones, which is at a more convenient time for most people and might be more popular.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Slack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Slack works well to DM specific people to set up meeting times, etc, but the public channels didn’t end up being very useful for me personally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lack of integration with other project teams&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can only get so much done as a solo developer. We had hoped that I would naturally end up working with teams from several different projects, but this didn’t really end up being the case. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;napari&lt;/code&gt; project is an exception to this, and that relationship was well established before starting work for Dask. Perhaps there’s something more we could have done here to facilitate more interaction.&lt;/p&gt;

&lt;h2 id=&quot;whats-next-for-genevieve&quot;&gt;What’s next for Genevieve?&lt;/h2&gt;

&lt;p&gt;Genevieve will be starting a new job next year, you can find her on GitHub &lt;a href=&quot;https://github.com/GenevieveBuckley/&quot;&gt;@GeneviveeBuckley&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;whats-next-in-dask&quot;&gt;What’s next in Dask?&lt;/h2&gt;

&lt;p&gt;Lots of stuff has happened in Dask, but there is still lots left to do.
Here is a summary of the next steps for several projects. We’d love it if new people would like to take up the torch and contribute to any of these projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ITK image compatibility with Dask&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The next steps for the ITK + Dask project require ITK release candidate 5.3rc3 or above to become available (likely early in 2022).&lt;/li&gt;
  &lt;li&gt;When the release is available, the next step is to try to re-run the code from the original &lt;a href=&quot;https://blog.dask.org/2019/08/09/image-itk&quot;&gt;ITK blogpost&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;If there’s still work to be done we’ll need to open issues for the remaining blockers. And if it all works well, we’d like someone to write a second ITK + Dask blogpost to publicize the new functionality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Improving performance around rechunking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;More performance improvements related to rechunking is required (see &lt;a href=&quot;https://github.com/dask/dask/pull/7950&quot;&gt;#7950&lt;/a&gt; and &lt;a href=&quot;https://github.com/dask/dask/pull/7980&quot;&gt;#7980&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High level graph work for arrays and slicing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The high level graph work for slicing and overlapping arrays has a number of next steps.
Ian Rose has written &lt;a href=&quot;https://gist.github.com/ian-r-rose/4221ebf52f3423203640c498fb815f21&quot;&gt;an excellent summary here&lt;/a&gt;. Briefly, the&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cull&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_output_keys&lt;/code&gt; methods must be implemented, then low level fusion and optimizations can be done.&lt;/p&gt;

&lt;p&gt;Relevant links:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Implement &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cull&lt;/code&gt; method for ArrayOverlapLayer &lt;a href=&quot;https://github.com/dask/dask/issues/7789&quot;&gt;#7789&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Implement &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_output_keys&lt;/code&gt; method for ArrayOverlapLayer &lt;a href=&quot;https://github.com/dask/dask/issues/7791&quot;&gt;#7791&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/7655&quot;&gt;Array slicing HighLevelGraph layer #7655&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Dask needs better documentation for high level graphs. Both &lt;a href=&quot;https://github.com/dask/dask/issues/7709&quot;&gt;user documentation&lt;/a&gt; and &lt;a href=&quot;https://github.com/dask/dask/issues/7755&quot;&gt;developer documentation&lt;/a&gt; is required.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;At some future point, it might be worthwhile integrating blogpost content from
&lt;a href=&quot;https://blog.dask.org/2021/11/02/choosing-dask-chunk-sizes&quot;&gt;Choosing good chunk sizes in Dask&lt;/a&gt; into the main &lt;a href=&quot;https://docs.dask.org/en/latest/&quot;&gt;Dask documentation&lt;/a&gt;, for better discoverability.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Mosaic Image Fusion</title>
   <link href="https://blog.dask.org/2021/12/01/mosaic-fusion"/>
   <updated>2021-12-01T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/12/01/mosaic-fusion</id>
   
   <category>life science</category>
   
   <category>image analysis</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;This blogpost shows a case study where a researcher uses Dask for mosaic image fusion.
Mosaic image fusion is when you combine multiple smaller images taken at known locations and stitch them together into a single image with a very large field of view. Full code examples are available on GitHub from the &lt;a href=&quot;https://github.com/VolkerH/DaskFusion&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskFusion&lt;/code&gt;&lt;/a&gt; repository:
&lt;a href=&quot;https://github.com/VolkerH/DaskFusion&quot;&gt;https://github.com/VolkerH/DaskFusion&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;/h2&gt;

&lt;h3 id=&quot;image-mosaicing-in-microscopy&quot;&gt;Image mosaicing in microscopy&lt;/h3&gt;

&lt;p&gt;In optical microscopy, a single field of view captured with a 20x objective typically
has a diagonal on the order of a few 100 μm (exact dimensions depend on other
parts of the optical system, including the size of the camera chip). A typical
sample slide has a size of 25mm by 75mm.
Therefore, when imaging a whole slide, one has to acquire hundreds of images, typically
with some overlap between individual tiles. With increasing magnification,
the required number of images increases accordingly.&lt;/p&gt;

&lt;p&gt;To obtain an overview one has to fuse this large number of individual
image tiles into a large mosaic image. Here, we assume that the information required for
positioning and alignment of the individual image tiles is known. In the example presented here,
this information is available as metadata recorded by the microscope, namely the microscope stage
position and the pixel scale. Alternatively, this
information could also be derived from the image data directly, e.g. through a
registration step that matches corresponding image features in the areas where tiles overlap.&lt;/p&gt;

&lt;h2 id=&quot;the-solution&quot;&gt;The solution&lt;/h2&gt;

&lt;p&gt;The array that can hold the resulting mosaic image will often have a size that is too large
to fit in RAM, therefore we will use Dask arrays and the &lt;a href=&quot;https://docs.dask.org/en/latest/generated/dask.array.map_blocks.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt;&lt;/a&gt; function to enable
out-of-core processing. The &lt;a href=&quot;https://docs.dask.org/en/latest/generated/dask.array.map_blocks.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt;&lt;/a&gt;
function will process smaller blocks (a.k.a chunks) of the output array individually, thus eliminating the need to
hold the whole output array in memory. If sufficient resources are available, dask will also distribute the processing of blocks across several workers,
thus we also get parallel processing for free, which can help speed up the fusion process.&lt;/p&gt;

&lt;p&gt;Typically whenever we want to join Dask arrays, we use &lt;a href=&quot;https://docs.dask.org/en/latest/array-stack.html&quot;&gt;Stack, Concatenate, and Block&lt;/a&gt;. However, these are not good tools for mosaic image fusion, because:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The image tiles will be be overlapping,&lt;/li&gt;
  &lt;li&gt;Tiles may not be positioned on an exact grid and will typically also have slight rotations as the alignment of stage and camera is not perfect. In the most general case, for example in panaromic photo mosaics,
individual image tiles could be arbitrarily rotated or skewed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The starting point for this mosaic prototype was some code that reads in the stage metadate for all tiles and calculates an affine transformation for each tile that would place it at the correct location
in the output array.&lt;/p&gt;

&lt;p&gt;The image below shows preliminary work placing mosaic image tiles into the correct positions using the napari image viewer.
Shown here is a small example with 63 image tiles.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mosaic-fusion/NapariMosaics.png&quot; alt=&quot;Mosaic fusion images in the napari image viewer&quot; width=&quot;700&quot; height=&quot;265&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And here is an animation of placing the individual tiles.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mosaic-fusion/Lama_whole_slide.gif&quot; alt=&quot;Animation of whole slide mosaic fusion images&quot; width=&quot;700&quot; height=&quot;361&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To leverage processing with Dask we created a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fuse&lt;/code&gt; function that generates a small block of the final mosaic and is invoked by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; for each chunk of the output array.
On each invocation of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fuse&lt;/code&gt; function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; passes a dictionary (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_info&lt;/code&gt;). From the &lt;a href=&quot;https://docs.dask.org/en/latest/generated/dask.array.map_blocks.html?highlight=block_info#dask.array.map_blocks&quot;&gt;Dask documentation&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Your block function gets information about where it is in the array by accepting a special &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_info&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_id&lt;/code&gt; keyword argument.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The basic outline of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fuse&lt;/code&gt; function of the mosaic workflow is as follows.
For each chunk of the output array:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Determine which source image tiles intersect with the chunk.&lt;/li&gt;
  &lt;li&gt;Adjust the image tiles’ affine transformations to take the offset of the chunk within the array into account.&lt;/li&gt;
  &lt;li&gt;Load all intersectiong image tiles and apply their respective adjusted affine transformation to map them into the chunk.&lt;/li&gt;
  &lt;li&gt;Blend the tiles using a simple maximum projection.&lt;/li&gt;
  &lt;li&gt;Return the blended chunk.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using a maximum projection to blend areas with overlapping tiles can lead to artifacts such as ghost images and visible tile
seams, so you would typically want to use something more sophisticated in production.&lt;/p&gt;

&lt;h3 id=&quot;results&quot;&gt;Results&lt;/h3&gt;

&lt;p&gt;For datasets with many image tiles (~500-1000 tiles), we could speed up the mosaic generation from several hours to tens of minutes using this Dask based method
(compared to a previous workflow using ImageJ plugins runnning on the same workstation).
Due to Dask’s ability to handle data out-of-core and chunked array storage using zarr it is also possible to run the
fusion on hardware with limited RAM.&lt;/p&gt;

&lt;p&gt;Finally, we have the final mosaic fusion result.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mosaic-fusion/final-mosaic-fusion-result.png&quot; alt=&quot;Final mosaic fusion result&quot; width=&quot;700&quot; height=&quot;486&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;code&quot;&gt;Code&lt;/h3&gt;

&lt;p&gt;Code relatiing to this mosaic image fusion project can be found in the &lt;a href=&quot;https://github.com/VolkerH/DaskFusion&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DaskFusion&lt;/code&gt;&lt;/a&gt; GitHub repository here:
&lt;a href=&quot;https://github.com/VolkerH/DaskFusion&quot;&gt;https://github.com/VolkerH/DaskFusion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a self-contained example available in &lt;a href=&quot;https://github.com/VolkerH/DaskFusion/blob/main/DaskFusion_Example.ipynb&quot;&gt;this notebook&lt;/a&gt;, which downloads reduced-size example data to demonstrate the process.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;Currently, the DaskFusion code is a proof of concept for single-channel 2D images and simple maximum projection for blending the tiles in overlapping areas, it is not production code.
However, the same principle can be used for fusing multi-channel image volumes,
such as from Light-Sheet data if the tile chunk intersection calculation is extended to higher-dimensional arrays.
Such even larger datasets will benefit even more from leveraging dask,
as the processing can be distributed across multiple nodes of a HPC cluster using &lt;a href=&quot;http://jobqueue.dask.org/en/latest/&quot;&gt;dask jobqueue&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;also-see&quot;&gt;Also see&lt;/h3&gt;

&lt;p&gt;Marvin’s lightning talk on multi-view image fusion:
&lt;a href=&quot;https://www.youtube.com/watch?v=YIblUvonMvo&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&amp;amp;index=10&quot;&gt;15 minute video available here on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The GitHub repository &lt;a href=&quot;https://github.com/m-albert/MVRegFus&quot;&gt;MVRegFus&lt;/a&gt; that Marvin talks about in the video is available here:
&lt;a href=&quot;https://github.com/m-albert/MVRegFus&quot;&gt;https://github.com/m-albert/MVRegFus&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/manzt/napari-lazy-openslide&quot;&gt;napari-lazy-openslide&lt;/a&gt; visualization plugin by &lt;a href=&quot;https://github.com/manzt&quot;&gt;Trevor Manz&lt;/a&gt;: &lt;em&gt;“An experimental plugin to lazily load multiscale whole-slide tiff images with openslide and dask.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For further information on alternative approaches to image stitching:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ASHLAR: Alignment by Simultaneous Harmonization of Layer / Adjacency Registration
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://labsyspharm.github.io/ashlar/&quot;&gt;ASHLAR homepage&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/labsyspharm/ashlar&quot;&gt;ASHLAR GitHub repository&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://doi.org/10.1101/2021.04.20.440625&quot;&gt;ASHLAR biorxiv pre-print&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Microscopy Image Stitching Tool (MIST)
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://pages.nist.gov/MIST/&quot;&gt;MIST homepage&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/usnistgov/MIST&quot;&gt;MIST GitHub repository&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/wiki/USNISTGOV/MIST/assets/mist-algorithm-documentation.pdf&quot;&gt;MIST algorithm documentation (PDF)&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;https://github.com/yfukai/m2stitch&quot;&gt;m2stitch&lt;/a&gt; python package by &lt;a href=&quot;https://github.com/yfukai&quot;&gt;Yohsuke T. Fukai&lt;/a&gt;: &lt;em&gt;“Provides robust stitching of tiled microscope images on a regular grid”&lt;/em&gt; (based on the MIST algorithm)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;This computational work was done by Volker Hilsenstein, in conjunction with Marvin Albert.
Volker Hilsenstein is a scientific software developer at &lt;a href=&quot;https://www.embl.org/groups/alexandrov/&quot;&gt;EMBL in Theodore Alexandrov’s lab&lt;/a&gt; with a focus on spatial metabolomics and bio-image analysis.&lt;/p&gt;

&lt;p&gt;The sample images were prepared and imaged by Mohammed Shahraz from the Alexandrov lab at EMBL Heidelberg.&lt;/p&gt;

&lt;p&gt;Genevieve Buckley and Volker Hilsenstein wrote this blogpost.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Choosing good chunk sizes in Dask</title>
   <link href="https://blog.dask.org/2021/11/02/choosing-dask-chunk-sizes"/>
   <updated>2021-11-02T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/11/02/choosing-dask-chunk-sizes</id>
   
   <category>performance</category>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Confused about choosing &lt;a href=&quot;https://docs.dask.org/en/latest/array-best-practices.html#select-a-good-chunk-size&quot;&gt;a good chunk size&lt;/a&gt; for Dask arrays?&lt;/p&gt;

&lt;p&gt;Array chunks can’t be too big (we’ll run out of memory), or too small (the overhead introduced by Dask becomes overwhelming). So how can we get it right?&lt;/p&gt;

&lt;p&gt;It’s a two step process:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;First, start by choosing a chunk size similar to data you know can be processed entirely within memory (i.e. without Dask), using these &lt;a href=&quot;#rough-rules-of-thumb&quot;&gt;rough rules of thumb&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Then, watch the Dask dashboard task stream and worker memory plots, and adjust if needed. &lt;a href=&quot;#what-to-watch-for-on-the-dashboard&quot;&gt;Here are the signs to watch out for&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#what-are-dask-array-chunks&quot;&gt;What are Dask array chunks?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#too-small-is-a-problemg&quot;&gt;Too small is a problem&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#too-big-is-also-a-problem&quot;&gt;Too big is also a problem&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#choosing-an-initial-chunk-size&quot;&gt;Choosing an initial chunk size&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#rough-rules-of-thumb&quot;&gt;Rough rules of thumb&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#chunks-should-be-aligned-with-array-storage-on-disk&quot;&gt;Chunks should be aligned with array storage on disk&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#using-the-dask-dashboard&quot;&gt;Using the Dask dashboard&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#what-to-watch-for-on-the-dashboard&quot;&gt;What to watch for on the dashboard
&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#rechunking-arrays&quot;&gt;Rechunking arrays&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#unmanaged-memory&quot;&gt;Unmanaged memory&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#thanks-for-reading&quot;&gt;Thanks for reading&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-are-dask-array-chunks&quot;&gt;What are Dask array chunks?&lt;/h2&gt;

&lt;p&gt;Dask arrays are big structures, made out of many small chunks.
Typically, each small chunk is an individual &lt;a href=&quot;https://numpy.org/&quot;&gt;numpy array&lt;/a&gt;, and they are arranged together to make a much larger Dask array.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/dask/dask/ac01ddc9074365e40d888f80f5bcd955ba01e872/docs/source/images/dask-array-black-text.svg&quot; alt=&quot;Diagram: Dask array chunks&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can find more information about Dask array chunks on this page of the documentation: &lt;a href=&quot;https://docs.dask.org/en/latest/array-chunks.html&quot;&gt;https://docs.dask.org/en/latest/array-chunks.html&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-do-i-know-what-chunks-my-array-has&quot;&gt;How do I know what chunks my array has?&lt;/h3&gt;

&lt;p&gt;If you have a Dask array, you can use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chunksize&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chunks&lt;/code&gt; attribues to see information about the chunks. You can also visualize this with the Dask array HTML representation.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/choosing-good-chunk-sizes/examine-dask-array-chunks.png&quot; alt=&quot;Visualizating Dask array chunks with the HTML repr&quot; width=&quot;611&quot; height=&quot;523&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arr.chunksize&lt;/code&gt; shows the largest chunk size. For arrays where you expect roughly uniform chunk sizes, this is a good way to summarize chunk size information.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arr.chunks&lt;/code&gt; shows fully explicit sizes of all chunks along all dimensions within the Dask array (see &lt;a href=&quot;https://docs.dask.org/en/stable/array-chunks.html#specifying-chunk-shapes&quot;&gt;item 3 here&lt;/a&gt;). This is more verbose, and is a good choice with arrays that have irregular chunks.&lt;/p&gt;

&lt;h2 id=&quot;too-small-is-a-problem&quot;&gt;Too small is a problem&lt;/h2&gt;

&lt;p&gt;If array chunks are too small, it’s inefficient. Why is this?&lt;/p&gt;

&lt;p&gt;Using Dask introduces some amount of overhead for each task in your computation.
This overhead is the reason the Dask best practices advise you to &lt;a href=&quot;https://docs.dask.org/en/latest/best-practices.html#avoid-very-large-graphs&quot;&gt;avoid too-large graphs&lt;/a&gt;.
This is because if the amount of actual work done by each task is very tiny, then the percentage of overhead time vs useful work time is not good.&lt;/p&gt;

&lt;p&gt;Typically, the Dask scheduler takes 1 millisecond to coordinate a single task. That means we want the computation time for each task to be comparitively larger, eg: seconds instead of milliseconds.&lt;/p&gt;

&lt;p&gt;It might be hard to understand this intuitively, so here’s an analogy. Let’s imagine we’re building a house. It’s a pretty big job, and if there were only one worker it would take much too long to build.
So we have a team of workers and a site foreman. The site foreman is equivalent to the Dask scheduler: their job is to tell the workers what tasks they need to do.&lt;/p&gt;

&lt;p&gt;Say we have a big pile of bricks to build a wall, sitting in the corner of the building site.
If the foreman (the Dask scheduler) tells workers to go and fetch a single brick at a time, then bring each one to where the wall is being built, you can see how this is going to be very slow and inefficient! The workers are spending most of their time moving between the wall and the pile of bricks. Much less time is going towards doing the actual work of mortaring bricks onto the wall.&lt;/p&gt;

&lt;p&gt;Instead, we can do this in a smarter way. The foreman (Dask scheduler) can tell the workers to go and bring one full wheelbarrow load of bricks back each time. Now workers are spending much less time moving between the wall and the pile of bricks, and the wall will be finished much quicker.&lt;/p&gt;

&lt;h2 id=&quot;too-big-is-also-a-problem&quot;&gt;Too big is also a problem&lt;/h2&gt;

&lt;p&gt;If the Dask array chunks are too big, this is also bad. Why?
Chunks that are too large are bad because then you are likely to run out of working memory.
You may see out of memory errors happening, or you might see performance decrease substantially as data spills to disk.&lt;/p&gt;

&lt;p&gt;When too much data is loaded in memory on too few workers, Dask will try to spill data to disk instead of crashing.
Spilling data to disk makes things run very slowly, because all the extra read/write operations to disk. Things don’t just get a little bit slower, they get a LOT slower, so it’s smart to watch out for this.&lt;/p&gt;

&lt;p&gt;To watch out for this, look at the &lt;strong&gt;worker memory plot&lt;/strong&gt; on the Dask dashboard.
Orange bars are a warning you are close to the limit, and gray means data is being spilled to disk - not good!
For more tips, see the section on &lt;a href=&quot;#using-the-Dask-dashboard&quot;&gt;using the Dask dashboard&lt;/a&gt; below.&lt;/p&gt;

&lt;h2 id=&quot;choosing-an-initial-chunk-size&quot;&gt;Choosing an initial chunk size&lt;/h2&gt;

&lt;h3 id=&quot;rough-rules-of-thumb&quot;&gt;Rough rules of thumb&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;If you already created a prototype, which may not involve Dask at all, using a small subset of the data you intend to process, you’ll have a clear idea of what size of data can be processed easily for this workflow. You can use this knowledge to choose similar sized chunks in Dask.&lt;/li&gt;
  &lt;li&gt;Some people have observed that chunk sizes below 1MB are almost always bad. Chunk size between 100MB and 1GB are generally good, going over 1 or 2GB means you have a really big dataset and/or a lot of memory available per core,&lt;/li&gt;
  &lt;li&gt;Upper bound: Avoid too large task graphs. More than 10,000 or 100,000 chunks may start to perform poorly.&lt;/li&gt;
  &lt;li&gt;Lower bound: To get the advantage of parallelization, you need the number of chunks to at least equal the number of worker cores available (or better, the number of worker cores times 2). Otherwise, some workers will stay idle.&lt;/li&gt;
  &lt;li&gt;The time taken to compute each task should be much larger than the time needed to schedule the task. The Dask scheduler takes roughly 1 millisecond to coordinate a single task, so a good task computation time would be measured in seconds (not milliseconds).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;chunks-should-be-aligned-with-array-storage-on-disk&quot;&gt;Chunks should be aligned with array storage on disk&lt;/h3&gt;

&lt;p&gt;If you are reading data from disk, the storage structure will inform what shape your Dask array chunks should be. For best performance, choose chunks that are well aligned with the way data is stored.&lt;/p&gt;

&lt;p&gt;From the Dask best practices on how to &lt;a href=&quot;https://docs.dask.org/en/stable/array-best-practices.html#orient-your-chunks&quot;&gt;orient your chunks&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When reading data you should align your chunks with your storage format. Most array storage formats store data in chunks themselves. If your Dask array chunks aren’t multiples of these chunk shapes then you will have to read the same data repeatedly, which can be expensive. Note though that often storage formats choose chunk sizes that are much smaller than is ideal for Dask, closer to 1MB than 100MB. In these cases you should choose a Dask chunk size that aligns with the storage chunk size and that every Dask chunk dimension is a multiple of the storage chunk dimension.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some examples of data storage structures on disk include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A HDF5 or &lt;a href=&quot;https://zarr.readthedocs.io/en/stable/api/core.html&quot;&gt;Zarr array&lt;/a&gt;. The size and shape of chunks/blocks stored on disk should align well with the Dask array chunks you select.&lt;/li&gt;
  &lt;li&gt;A folder full of tiff files. You might decide that each tiff file should become a single chunk in the Dask array (or that multiple tiff files should be grouped into a single chunk).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;using-the-dask-dashboard&quot;&gt;Using the Dask dashboard&lt;/h2&gt;

&lt;p&gt;The second part of choosing a good chunk size is monitoring the Dask dashboard to see if you need to make any adjustments.&lt;/p&gt;

&lt;p&gt;If you’re not very familiar with the Dask dashboard, or you just sometimes forget where to find certain dashboard plots (like the worker memory plot), then you’ll probably enjoy these quick video tutorials:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=N_GqzcuGLCY&quot;&gt;Intro to the Dask dashboard (18 minute video)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=EX_voquHdk0&quot;&gt;Dask Jupyterlab extension (6 minute video)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://distributed.dask.org/en/latest/diagnosing-performance.html&quot;&gt;Dask dashboard documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We recommend always having the dashboard up when you’re working with Dask.
It’s a fantastic way to get a sense of what’s working well, or poorly, so you can make adjustments.&lt;/p&gt;

&lt;h3 id=&quot;what-to-watch-for-on-the-dashboard&quot;&gt;What to watch for on the dashboard&lt;/h3&gt;

&lt;p&gt;Bad signs to watch out for include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Lots of white space in the task stream plot is a bad sign. White space means nothing is happening. Chunks may be too small.&lt;/li&gt;
  &lt;li&gt;Lots and lots of red in the task stream plot is a bad sign. Red means worker communication. Dask workers need some communication, but if they are doing almost nothing except communication then there is not much productive work going on.&lt;/li&gt;
  &lt;li&gt;On the worker memory plot, watch out for orange bars which are a sign you are getting close to the memory limit. Chunks may be too big.&lt;/li&gt;
  &lt;li&gt;On the worker memory plot, watch out for grey bars which mean data is being spilled to disk. Chunks may be too big.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is an example of the Dask dashboard during a good computation (&lt;a href=&quot;https://youtu.be/N_GqzcuGLCY?t=372&quot;&gt;time 6:12 in this video&lt;/a&gt;).
&lt;img src=&quot;/images/choosing-good-chunk-sizes/good-dask-dashboard.png&quot; alt=&quot;Visualizating Dask array chunks with the HTML repr&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For comparison, here is an example of the Dask dashboard during a bad computation (&lt;a href=&quot;https://youtu.be/N_GqzcuGLCY?t=417&quot;&gt;time 6:57 in this video&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;In this example, it’s inefficient because the chunks are much too small, so we see a lot of white space and red worker communication in the task stream plot.
&lt;img src=&quot;/images/choosing-good-chunk-sizes/bad-dask-dashboard-zoomedin.png&quot; alt=&quot;Visualizating Dask array chunks with the HTML repr&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;rechunking-arrays&quot;&gt;Rechunking arrays&lt;/h2&gt;

&lt;p&gt;If you need to change the chunking of a Dask array in the middle of a computation, you can do that with the &lt;a href=&quot;https://docs.dask.org/en/latest/generated/dask.array.rechunk.html&quot;&gt;rechunk&lt;/a&gt; method.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;rechunked_array&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;original_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rechunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Rechunking Dask arrays comes at a cost.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The Dask graph must be rearranged to accomodate the new chunk structure. This happens immediately, and will block any other interaction with python until Dask has rearranged the task graph.&lt;/li&gt;
  &lt;li&gt;This also inserts new tasks into the Dask graph. At compute time, there are now more tasks to execute.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For these reasons, it is best to choose a good initial chunk size and avoid rechunking.&lt;/p&gt;

&lt;p&gt;However, sometimes the data is stored on disk is not well aligned and rechunking may be necessary.
For an example of this, here is Draga Doncila Pop &lt;a href=&quot;https://youtu.be/10Ws59NGDaE?t=833&quot;&gt;talking about chunk alignment&lt;/a&gt; with satellite image data.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://rechunker.readthedocs.io/en/latest/&quot;&gt;rechunker&lt;/a&gt; library can be useful in these situations:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Rechunker takes an input array (or group of arrays) stored in a persistent storage device (such as a filesystem or a cloud storage bucket) and writes out an array (or group of arrays) with the same data, but different chunking scheme, to a new location. Rechunker is designed to be used within a parallel execution framework such as Dask.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;unmanaged-memory&quot;&gt;Unmanaged memory&lt;/h2&gt;

&lt;p&gt;Last, remember that you don’t only need to consider the size of the array chunks in memory, but also the working memory consumed by your analysis functions. Sometimes that is called “unmanaged memory” in Dask.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Unmanaged memory is RAM that the Dask scheduler is not directly aware of and which can cause workers to run out of memory and cause computations to hang and crash.” – Guido Imperiale&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are some tips for handling unmanaged memory:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://coiled.io/blog/tackling-unmanaged-memory-with-dask/&quot;&gt;Tackling unmanaged memory with Dask (Coiled blogpost)&lt;/a&gt; by Guido Imperiale&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/nwR6iGR0mb0&quot;&gt;Handle Unmanaged Memory in Dask (8 minute video)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;thanks-for-reading&quot;&gt;Thanks for reading&lt;/h2&gt;

&lt;p&gt;We hope this was helpful figuring out how to choose good chunk sizes for Dask. This blogpost was inspired by &lt;a href=&quot;https://twitter.com/DataNerdery/status/1424953376043790341&quot;&gt;this twitter thread&lt;/a&gt;. If you’d like to follow Dask on Twitter, you can do that at &lt;a href=&quot;https://twitter.com/dask_dev&quot;&gt;https://twitter.com/dask_dev&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>CZI EOSS Update</title>
   <link href="https://blog.dask.org/2021/10/20/czi-eoss-update"/>
   <updated>2021-10-20T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/10/20/czi-eoss-update</id>
   
   <category>life science</category>
   
   <content type="html">
&lt;p&gt;Dask was awarded funding last year in round 2 of the &lt;a href=&quot;https://chanzuckerberg.com/eoss/proposals/&quot;&gt;CZI Essential Open Source Software&lt;/a&gt; grant program.
That funding was used to hire &lt;a href=&quot;https://github.com/GenevieveBuckley/&quot;&gt;Genevieve Buckley&lt;/a&gt; to work on Dask with a focus on &lt;a href=&quot;https://blog.dask.org/2021/03/04/the-life-science-community&quot;&gt;life sciences&lt;/a&gt;.
Last month Dask submitted an interim progress report to CZI, covering the period from February to September 2021.
That progress update is published verbatim below, to share with the wider Dask community.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;progress-overview&quot;&gt;Progress Overview&lt;/h2&gt;

&lt;h3 id=&quot;brief-summary&quot;&gt;Brief summary&lt;/h3&gt;

&lt;p&gt;The scope of work performed by the Dask fellow includes code contributions, conference presentations and tutorials, community engagement, and outreach including blogposts.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The primary deliverable of this proposal is consistency and the success of neighboring software
projects&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Project work to date includes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;38 pull requests merged (plus 6 draft pull requests) across 5 different repositories.&lt;/li&gt;
  &lt;li&gt;3 conferences (presentations and organising of specialist workshops)&lt;/li&gt;
  &lt;li&gt;1 half day workshop (plus another one upcoming)&lt;/li&gt;
  &lt;li&gt;Student supervision for Dask’s Google Summer of Code project&lt;/li&gt;
  &lt;li&gt;9 blogposts (plus 2 drafts for upcoming publication)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;code-contributions&quot;&gt;Code contributions&lt;/h3&gt;

&lt;p&gt;Code contributions are not limiteed to the main Dask repository, but also neighbouring software projects which use Dask as well (like the &lt;a href=&quot;https://napari.org/&quot;&gt;napari&lt;/a&gt; software project), including: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-examples&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;napari&lt;/code&gt;, &amp;amp; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;napari.github.io&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To date, across the five repositories named above the Dask fellow has contributed:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;38 pull requests&lt;/li&gt;
  &lt;li&gt;6 draft pull requests&lt;/li&gt;
  &lt;li&gt;12 closed pull requests (not merged, discarded in favour of another approach)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Dask fellow is an official maintainer of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt; project, and additional milestones achieved for that project include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The maintainer team has been grown by one (we welcome Marvin Albert to our ranks)&lt;/li&gt;
  &lt;li&gt;2 new dask-image releases in 2020&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;code-contribution-highlights&quot;&gt;Code contribution highlights&lt;/h3&gt;

&lt;p&gt;Highlights include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Bugfixes benefitting the broader community
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/7391&quot;&gt;dask PR #7391&lt;/a&gt;: This PR fixed slicing the output from Dask’s bincount function. The impact of this fix was substantial, as it solved issues filed in four separate projects: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scikit-image&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-ml&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xgcm/xhistogram&lt;/code&gt; and the cupy dask tests.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Expanded GPU support
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/6680&quot;&gt;dask PR #6680&lt;/a&gt;: This PR provided support for different array types in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*_like&lt;/code&gt; array creation functions. Now users can create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cupy&lt;/code&gt; like Dask arrays for GPU processing, or indeed any other array type (eg: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sparse&lt;/code&gt;).&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-image/pull/157&quot;&gt;dask-image PR #157&lt;/a&gt;: This PR provided GPU support for binary morphological functions in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt; project.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Visualization tools benefitting all Dask users
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/7716&quot;&gt;dask PR #7716&lt;/a&gt;: This PR automatically displays the high level graph visualization in the jupyter notebook cell output (somthing already done automatically for low level graphs).&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/7763&quot;&gt;dask PR #7763&lt;/a&gt;: This PR introduced a HTML representation for Dask &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HighLevelGraph&lt;/code&gt; objects. This allows users and developers a much easier way to inspect the structure and status of HighLevelGraphs.&lt;/li&gt;
      &lt;li&gt;Further developed on during the Dask Google Summer of Code project, full report available &lt;a href=&quot;https://blog.dask.org/2021/08/23/gsoc-2021-project&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;High Level Graphs
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/7595&quot;&gt;dask PR #7595&lt;/a&gt;: This PR introduced a high level graph layer for array overlaps. High level graphs are a tool we can use to optimize Dask’s performance.&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/7655&quot;&gt;dask PR #7655&lt;/a&gt; (ongoing): This PR introduces a high level graph for Dask array slicing operations.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Memory improvements (ongoing)
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/8124&quot;&gt;dask PR #8124&lt;/a&gt; (ongoing): This PR investigates improved automatic rechunking strategies for &lt;a href=&quot;https://github.com/dask/dask/issues/8110&quot;&gt;memory problems&lt;/a&gt; caused by reshaping Dask arrays.&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/7950&quot;&gt;dask PR #7950&lt;/a&gt; (ongoing): This PR aims to improve memory and performance of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tensordot&lt;/code&gt; function with auto-rechunking of Dask arrays.&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/7980&quot;&gt;dask PR #7980&lt;/a&gt; (ongoing): This PR aims to fix the unbounded memory use problem in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tensordot&lt;/code&gt;, reported &lt;a href=&quot;https://github.com/dask/dask/issues/6916&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;conferences&quot;&gt;Conferences&lt;/h3&gt;

&lt;p&gt;Notable conference events in 2021 included the SciPy conference, the Dask Summit, and VIS2021.&lt;/p&gt;

&lt;h4 id=&quot;scipy-conference&quot;&gt;SciPy conference&lt;/h4&gt;

&lt;p&gt;The Dask fellow presented a talk titled &lt;em&gt;“Scaling Science: leveraging Dask for life sciences”&lt;/em&gt; at the 2021 SciPy conference. Full recording &lt;a href=&quot;https://www.youtube.com/watch?v=tY_lCGS1BMk&amp;amp;t=60s&quot;&gt;available here&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;dask-summit&quot;&gt;Dask Summit&lt;/h4&gt;

&lt;p&gt;The Dask fellow organised two workshops at the 2021 &lt;a href=&quot;https://summit.dask.org/&quot;&gt;Dask Summit&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Dask Down Under (co-organised with Nick Mortimer), and&lt;/li&gt;
  &lt;li&gt;The Dask life science workshop&lt;/li&gt;
&lt;/ol&gt;

&lt;h5 id=&quot;dask-down-under&quot;&gt;Dask Down Under&lt;/h5&gt;

&lt;p&gt;The scope of Dask Down Under was more like a mini-conference for Australian timezones, rather than a typical workshop. Dask Down Under involved two days of events, covering:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;5 talks&lt;/li&gt;
  &lt;li&gt;2 tutorials&lt;/li&gt;
  &lt;li&gt;1 panel discussion&lt;/li&gt;
  &lt;li&gt;1 meet and greet networking event&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was very well recieved by the community. A full report on the Dask Down under events is available &lt;a href=&quot;https://blog.dask.org/2021/06/25/dask-down-under&quot;&gt;here&lt;/a&gt;. A YouTube playlist of the Dask Down Under events is available &lt;a href=&quot;https://www.youtube.com/watch?v=10Ws59NGDaE&amp;amp;list=PLJ0vO2F_f6OAXBfb_SAF2EbJve9k1vkQX&quot;&gt;here on the Dask YouTube channel&lt;/a&gt;.&lt;/p&gt;

&lt;h5 id=&quot;dask-life-science-workshop&quot;&gt;Dask life science workshop&lt;/h5&gt;

&lt;p&gt;The Dask life science workshop involved:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;15 pre-recorded lightning talks&lt;/li&gt;
  &lt;li&gt;3 interactive discussion times (accessible across timezones in Europe, Oceania, and the Americas)&lt;/li&gt;
  &lt;li&gt;Asynchronous text chat throughout the Dask Summit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A full report on the Dask life science workshop is available &lt;a href=&quot;https://blog.dask.org/2021/05/24/life-science-summit-workshop&quot;&gt;here&lt;/a&gt;. A YouTube playlist of all the Dask life science lightning talks is available &lt;a href=&quot;https://www.youtube.com/watch?v=6PerbQhcupM&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&quot;&gt;here on the Dask YouTube channel&lt;/a&gt;.&lt;/p&gt;

&lt;h5 id=&quot;vis2021-symposium&quot;&gt;VIS2021 symposium&lt;/h5&gt;

&lt;p&gt;The Dask fellow was an invited panellist at the &lt;a href=&quot;https://www.vis2021.com.au/&quot;&gt;VIS2021 symposium&lt;/a&gt; in February 2021. The “Problem Solver” panel discussion covered practical problems in image analysis and how tools like Dask and napari can help solve them.&lt;/p&gt;

&lt;h3 id=&quot;tutorials-and-workshops&quot;&gt;Tutorials and workshops&lt;/h3&gt;

&lt;p&gt;The Dask fellow co-presented a half-day workshop (five hours) at the 2021 &lt;a href=&quot;https://www.lmameeting.com.au/&quot;&gt;Light Microscopy Australia Meeting&lt;/a&gt; with Juan Nunez-Iglesias. &lt;a href=&quot;https://napari.org/&quot;&gt;napari&lt;/a&gt; is an open source multidimensional image viewer built using Dask for out-of-core image processing. Workshop content is available at this link: &lt;a href=&quot;https://github.com/jni/lma-2021-bioimage-analysis-python/&quot;&gt;https://github.com/jni/lma-2021-bioimage-analysis-python/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upcoming workshop:&lt;/strong&gt;
The Dask fellow has been invited to deliver a workshop on &lt;a href=&quot;https://napari.org/&quot;&gt;napari&lt;/a&gt; and big data using &lt;a href=&quot;https://dask.org/&quot;&gt;Dask&lt;/a&gt; at an upcoming &lt;a href=&quot;http://eubias.org/NEUBIAS/training-schools/neubias-academy-home/&quot;&gt;NEUBIAS Academy&lt;/a&gt;. Workshop content is available at this link: &lt;a href=&quot;https://github.com/GenevieveBuckley/napari-big-data-training&quot;&gt;https://github.com/GenevieveBuckley/napari-big-data-training&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;google-summer-of-code&quot;&gt;Google Summer of Code&lt;/h3&gt;

&lt;p&gt;The Dask fellow supervised a Google Summer of Code student in 2021. Martin Durant acted as a secondary supervisor. The project ran over a 3 month period, and involved implementing a number of features to improve visualization of Dask graphs and objects. A full report on the Dask GSOC project is available &lt;a href=&quot;https://blog.dask.org/2021/08/23/gsoc-2021-project&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;blogposts&quot;&gt;Blogposts&lt;/h3&gt;

&lt;p&gt;We set a goal of one blogpost per month, and exceeded it. To date, nine blogposts have been published by the Dask fellow, with another two currently in draft status.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/03/04/the-life-science-community&quot;&gt;Getting to know the life science community&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/03/29/apply-pretrained-pytorch-model&quot;&gt;Dask with PyTorch for large scale image analysis&lt;/a&gt; (co-authored with Nick Sofreniew)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/05/07/skeleton-analysis&quot;&gt;Skeleton analysis&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/05/24/life-science-summit-workshop&quot;&gt;Life sciences at the 2021 Dask Summit&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/05/25/user-survey&quot;&gt;The 2021 Dask User Survey is out now&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/06/25/dask-down-under&quot;&gt;Dask Down Under&lt;/a&gt; (co-authored with Nick Mortimer)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/07/02/ragged-output&quot;&gt;Ragged output, how to handle awkward shaped results&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/07/07/high-level-graphs&quot;&gt;High Level Graphs update&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2021/08/23/gsoc-2021-project&quot;&gt;Google Summer of Code 2021 - Dask Project&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Draft status, will be published soon:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-blog/pull/108&quot;&gt;Mosaic Image Fusion&lt;/a&gt; (co-authored with Volker Hisenstein)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-blog/pull/109&quot;&gt;2021 Dask user survey results&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>2021 Dask User Survey</title>
   <link href="https://blog.dask.org/2021/09/15/user-survey"/>
   <updated>2021-09-15T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/09/15/user-survey</id>
   
   <category>User Survey</category>
   
   <content type="html">
&lt;p&gt;This post presents the results of the 2021 Dask User Survey, which ran earlier this year.
Thanks to everyone who took the time to fill out the survey!
These results help us better understand the Dask community and will guide future development efforts.&lt;/p&gt;

&lt;p&gt;The raw data, as well as the start of an analysis, can be found in this binder:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://mybinder.org/v2/gh/dask/dask-examples/main?urlpath=%2Ftree%2Fsurveys%2F2021.ipynb&quot;&gt;&lt;img src=&quot;https://mybinder.org/badge_logo.svg&quot; alt=&quot;Binder&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let us know if you find anything in the data.&lt;/p&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#highlights&quot;&gt;Highlights&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#who-are-dask-users&quot;&gt;Who are Dask users?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#how-people-like-to-use-dask&quot;&gt;How people like to use Dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#diagnostics&quot;&gt;Diagnostics&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#stability&quot;&gt;Stability&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#user-satisfaction&quot;&gt;User satisfaction, support, and documentation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#suggestions-for-improvement&quot;&gt;Suggestions for improvement&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#previous-survey-results&quot;&gt;Previous survey results&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;highlights-&quot;&gt;Highlights &lt;a class=&quot;anchor&quot; id=&quot;highlights&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;We had 247 responses to the survey (roughly the same as last year, which had just under 240 responses). Overall, responses were similar to previous years.&lt;/p&gt;

&lt;p&gt;We asked 43 questions in the survey (an increase of 18 questions compared to the year before). We asked a bunch of new questions about the types of datasets people work with, the stability of Dask, and what kinds of industries people work in.&lt;/p&gt;

&lt;p&gt;Our community wants:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;More documentation and examples&lt;/li&gt;
  &lt;li&gt;More intermediate level documentation&lt;/li&gt;
  &lt;li&gt;To improve the resiliency of Dask (i.e. do computations complete?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users also value these features:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Improved scaling&lt;/li&gt;
  &lt;li&gt;Ease of deployment&lt;/li&gt;
  &lt;li&gt;Better scikit-learn &amp;amp; machine learning support&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-typical-dask-user&quot;&gt;The typical Dask user&lt;/h3&gt;

&lt;p&gt;The survey shows us there is a lot of diversity in our community, and there is no one way to use Dask. That said, our hypothetical “typical” Dask user:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Works with gigabyte sized datasets&lt;/li&gt;
  &lt;li&gt;Stored on a local filesystem&lt;/li&gt;
  &lt;li&gt;Has been using Dask between 1 and 3 years&lt;/li&gt;
  &lt;li&gt;Uses Dask occasionally, not every day&lt;/li&gt;
  &lt;li&gt;Uses Dask interactively at least part of the time&lt;/li&gt;
  &lt;li&gt;Uses a compute cluster (probably)&lt;/li&gt;
  &lt;li&gt;Likes to view the Dask dashboard with a web browser&lt;/li&gt;
  &lt;li&gt;For the most part, Dask is stable enough for their needs, but improving the Dask’s resiliancy would be helpful&lt;/li&gt;
  &lt;li&gt;Uses the Dask dataframe, delayed, and maybe the Dask Array API, alongside numpy/pandas and other python libraries&lt;/li&gt;
  &lt;li&gt;The most useful thing that would help this person is more documentation, and more examples using Dask in their field.&lt;/li&gt;
  &lt;li&gt;They likely work in a scientific field (perhaps geoscience, life science, physics, or astronomy), or alternatively they might work in accounting, finance, insurance, or as a tech worker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can read the survey results from previous years here: &lt;a href=&quot;https://blog.dask.org/2020/09/22/user_survey&quot;&gt;2020 survey results&lt;/a&gt;, &lt;a href=&quot;https://blog.dask.org/2019/08/05/user-survey&quot;&gt;2019 survey results&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Let&apos;s load in the survey data...
&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;matplotlib&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inline&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pprint&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pprint&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;seaborn&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;textwrap&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;re&lt;/span&gt;


&lt;span class=&quot;n&quot;&gt;df2019&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;data/2019-user-survey-results.csv.gz&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parse_dates&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Timestamp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;How often do you use Dask?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;I use Dask all the time, even when I sleep&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Every day&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df2020&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;data/2020-user-survey-results.csv.gz&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Timestamp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_datetime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Timestamp&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%Y/%m/%d %H:%M:%S %p %Z&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;datetime64[ns]&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;How often do you use Dask?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;I use Dask all the time, even when I sleep&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Every day&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;data/2021-user-survey-results.csv.gz&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Timestamp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_datetime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Timestamp&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;datetime64[ns]&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;How often do you use Dask?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;I use Dask all the time, even when I sleep&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Every day&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;common&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2019&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;intersection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2020&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;intersection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;added&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;difference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2020&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dropped&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2020&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;difference&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2019&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2020&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Year&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Timestamp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;year&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Year&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Timestamp&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sort_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;who-are-dask-users-&quot;&gt;Who are Dask users? &lt;a class=&quot;anchor&quot; id=&quot;who-are-dask-users&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Most people said they use Dask occasionally, while a smaller group use Dask every day. There is a wide variety in how long people have used Dask for, with the most common response being between one and three years.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;How often do you use Dask?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_7_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;How long have you used Dask?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;More than 3 years&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;1 - 3 years&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;3 months - 1 year&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Less than 3 months&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;I&apos;ve never used Dask&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_8_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Just over half of respondants use Dask with other people (their team or organisation), and the other half use Dask on their own.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Do you use Dask as part of a larger group?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;I use Dask mostly on my own&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;My team or research group also use Dask&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;Beyond my group, many people throughout my institution use Dask&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_10_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the last year, there has been an increase in the number of people who say that many people throughout their institution use Dask (32 people said this in 2021, compared to 19 in 2020). Between 2019 and 2020, there was a drop in the number of people who said their immediate team also uses Dask (121 people said this in 2019, compared to 94 in 2020). It’s not clear why we saw either of these changes, so it will be interesting to see what happens in future years.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Do you use Dask as part of a larger group?&apos;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Year&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reset_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_12_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-industry-do-you-work-in&quot;&gt;What industry do you work in?&lt;/h3&gt;

&lt;p&gt;There was a wide variety of industries represented in the survey.&lt;/p&gt;

&lt;p&gt;Almost half of responses were in an industry related to science, academia, or a governmant laboratory. Geoscicence had the most responses, while life sciences, physics, and astronomy were also popular fields.&lt;/p&gt;

&lt;p&gt;Around 30 percent of responses were from people in businesss and tech. Of these, there was a roughly even split between people in accounting/finance/insurance vs other tech workers.&lt;/p&gt;

&lt;p&gt;Around 10 percent of responses belonged to manufacturing, engineering, and other industry (energy, aerospace, etc). The remaining responses were difficult to categorise.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;What industry do you work in?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_level_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_14_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-easy-is-it-for-you-to-upgrade-to-newer-versions-of-python-libraries&quot;&gt;How easy is it for you to upgrade to newer versions of Python libraries?&lt;/h3&gt;

&lt;p&gt;The majority of users are able to easily upgrade to newer versoins of python libraries when they want.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;How easy is it for you to upgrade to newer versions of Python libraries&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_ylabel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Scale from 1 (Difficult) to 4 (Easy)&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_16_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-people-like-to-use-dask-&quot;&gt;How people like to use Dask &lt;a class=&quot;anchor&quot; id=&quot;how-people-like-to-use-dask&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;People like to use Dask in conjunction with numpy and pandas, along with a range of other python libraries.
The most popular Dask APIs are &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe.html&quot;&gt;Dask Dataframes&lt;/a&gt;, &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;Dask Delayed&lt;/a&gt;, and &lt;a href=&quot;https://docs.dask.org/en/latest/array.html&quot;&gt;Dask Arrays&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The vast majority of people like to use Dask interactively with Jupyter or IPython at least part of the time, and most people view the &lt;a href=&quot;https://docs.dask.org/en/latest/diagnostics-distributed.html&quot;&gt;Dask Dashboard&lt;/a&gt; with a web browser.&lt;/p&gt;

&lt;h3 id=&quot;what-are-some-other-libraries-that-you-often-use-with-dask&quot;&gt;What are some other libraries that you often use with Dask?”&lt;/h3&gt;

&lt;p&gt;The ten most common libraries people use with Dask are: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;numpy&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pandas&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xarray&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scikit-learn&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scipy&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;statsmodels&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;matplotlib&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xgboost&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;numba&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;joblib&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;What are some other libraries that you often use with Dask?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;labels&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iloc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;labels&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_ylabel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_20_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;dask-apis&quot;&gt;Dask APIs&lt;/h2&gt;

&lt;p&gt;The three most popular Dask APIs people use are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.dask.org/en/latest/dataframe.html&quot;&gt;Dask Dataframes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;Dask Delayed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.dask.org/en/latest/array.html&quot;&gt;Dask Arrays&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In 2021, we saw a small increase in the number of people who use &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;dask delayed&lt;/a&gt;, compared with previous years. This might be a good thing, it’s possible that as people develop experience and confidence with Dask, they are more likely to start using more advanced features such as &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;delayed&lt;/a&gt;. Besides this change, preferences were pretty simliar to the results from previous years.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;apis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Dask APIs&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;top&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;apis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;apis&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;apis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reset_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Dask APIs&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;apis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_22_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;interactive-or-batch&quot;&gt;Interactive or Batch?&lt;/h3&gt;

&lt;p&gt;The vast majority of people like to use Dask interactively with Jupyter or IPython at least part of the time. Less than 15% of Dask users only use Dask in batch mode (submitting scripts that run in the future).&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Interactive or Batch?&apos;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Interactive:  I use Dask with Jupyter or IPython when playing with data, Batch: I submit scripts that run in the future&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Interactive and Batch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Interactive:  I use Dask with Jupyter or IPython when playing with data&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Interactive&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Batch: I submit scripts that run in the future&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Batch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Interactive and Batch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Interactive&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Batch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_ylabel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_24_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-do-you-view-dasks-dashboard&quot;&gt;How do you view Dask’s dashboard?&lt;/h3&gt;

&lt;p&gt;Most people look at the Dask dashboard using a web browser. A smaller group use the &lt;a href=&quot;https://github.com/dask/dask-labextension&quot;&gt;dask jupyterlab extension&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A few people are still not sure what the dashboard is all about. If that’s you too, you might like to watch &lt;a href=&quot;https://youtu.be/N_GqzcuGLCY&quot;&gt;this 20 minute video&lt;/a&gt; that explains why the dashboard is super useful, or see the rest of the docs &lt;a href=&quot;https://docs.dask.org/en/latest/diagnostics-distributed.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;How do you view Dask&apos;s dashboard?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_26_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;local-machine-or-cluster&quot;&gt;Local machine or Cluster?&lt;/h3&gt;

&lt;p&gt;Roughly two thirds of respondants use a computing cluster at least part of the time.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Local machine or Cluster?&apos;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;contains&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Cluster&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Year&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Year
2019    0.654902
2020    0.666667
2021    0.630081
Name: Local machine or Cluster?, dtype: float64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Local machine or Cluster?&apos;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;Personal laptop&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;Large workstation&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;Cluster of 2-10 machines&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;Cluster with 10-100 machines&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;Cluster with 100+ machines&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_29_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;if-you-use-a-cluster-how-do-you-launch-dask&quot;&gt;If you use a cluster, how do you launch Dask?&lt;/h4&gt;

&lt;p&gt;SSH is the most common way to launch Dask on a compute cluster, followed by a HPC resource manager, then Kubernetes.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;If you use a cluster, how do you launch Dask? &quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;HPC resource manager (SLURM, PBS, SGE, LSF or similar)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;HPC resource manager (SLURM PBS SGE LSF or similar)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;regex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;I don&apos;t know, someone else does this for me&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;I don&apos;t know someone else does this for me&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;regex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_level_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_31_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;if-you-use-a-cluster-do-you-have-a-need-for-multiple-worker-types-in-the-same-cluster&quot;&gt;If you use a cluster, do you have a need for multiple worker types in the same cluster?&lt;/h4&gt;

&lt;p&gt;Of the people who use compute clusters, a little less than half have a need for multiple worker types in the same cluster. Examples of this might include mixed workers with GPU vs no GPU, mixed workers with low or high memory allocations, etc.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;If you use a cluster, do you have a need for multiple worker / machine types (e.g. GPU / no GPU, low / high memory) in the same cluster?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Do you need multiple worker/machine types on a cluster?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_33_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;datasets&quot;&gt;Datasets&lt;/h3&gt;

&lt;h4 id=&quot;how-large-are-your-datasets-typically&quot;&gt;How large are your datasets typically?&lt;/h4&gt;

&lt;p&gt;Dask users most commonly work with gigabyte sized datasets. Very few users work with petabyte sized datasets.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;How large are your datasets typically?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_35_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;where-are-your-datasets-typically-stored&quot;&gt;Where are your datasets typically stored?&lt;/h4&gt;

&lt;p&gt;Most people store their data on a local filesystem.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Where are your datasets typically stored?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_level_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_37_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;what-file-formats-do-you-typically-work-with&quot;&gt;What file formats do you typically work with?&lt;/h4&gt;

&lt;p&gt;The two most common file formats (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;csv&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;parquet&lt;/code&gt;) are popular among Dask Dataframe users. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JSON&lt;/code&gt; file format is also very commonly used with Dask. The fourth and fifth most common filetypes (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HDF5&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zarr&lt;/code&gt;) are popular among Dask Array users. This fits with what we know about the Dask Dataframe API being the most popular, with Dask Arrays close behind.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;What file formats do you typically work with?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_level_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_39_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This survey question had a long tail: a very wide variety of specialized file formats were reported, most only being used by one or two individuals who replied to the survey.&lt;/p&gt;

&lt;p&gt;A lot of these specialized file formats store image data, specific to particular fields (astronomy, geoscience, microscopy, etc.).&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_level_values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[&apos;proprietary measurement format&apos;,
 &apos;netCDF3&apos;,
 &apos;czi&apos;,
 &apos;specifically NetCDF4&apos;,
 &apos;grib2&apos;,
 &apos;in-house npy-like array format&apos;,
 &apos;jpeg2000&apos;,
 &apos;netCDF4 (based on HDF5)&apos;,
 &apos;proprietary microscopy file types. Often I convert to Zarr with a loss of metadata.&apos;,
 &apos;sas7bdat&apos;,
 &apos;npy&apos;,
 &apos;npy and pickle&apos;,
 &apos;root with uproot&apos;,
 &apos;root&apos;,
 &apos;regular GeoTiff&apos;,
 &apos;.npy&apos;,
 &apos;Text&apos;,
 &apos;VCF BAM CRAM&apos;,
 &apos;UM&apos;,
 &apos;CASA measurement sets&apos;,
 &apos;Casa Tables (Radio Astronomy specific)&apos;,
 &apos;Custom binary&apos;,
 &apos;FITS&apos;,
 &apos;FITS (astronomical images)&apos;,
 &apos;FITS and a custom semi-relational table specification that I want to kill and replace with something better&apos;,
 &apos;Feather (Arrow)&apos;,
 &apos;GPKG&apos;,
 &apos;GeoTIFF&apos;,
 &apos;NetCDF4&apos;,
 &apos;Netcdf&apos;,
 &apos;Netcdf4&apos;,
 &apos;PP&apos;,
 &apos;SQL&apos;,
 &apos;SQL query to remote DB&apos;,
 &apos;SQL to Dataframe&apos;,
 &apos;Seismic data (miniSEED)&apos;,
 &apos;TFRecords&apos;,
 &apos;TIFF&apos;,
 &apos;Testing with all file formats. Just want it as a replacement for spark. &apos;,
 &apos;.raw image files&apos;,
 &apos;ugh&apos;]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://imgs.xkcd.com/comics/standards.png&quot; alt=&quot;XKCD comic 927: Standards&quot; /&gt;&lt;/p&gt;

&lt;p&gt;XKCD comic “Standards” https://xkcd.com/927/&lt;/p&gt;

&lt;h3 id=&quot;preferred-cloud&quot;&gt;Preferred Cloud?&lt;/h3&gt;

&lt;p&gt;The most popular cloud solution is Amazon Web Services (AWS), followed by Google Cloud Platform (GCP) and Microsoft Azure.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Preferred Cloud?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Amazon Web Services (AWS)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Google Cloud Platform (GCP)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Microsoft Azure&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Digital Ocean&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_44_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;do-you-use-dask-projects-to-deploy&quot;&gt;Do you use Dask projects to deploy?&lt;/h3&gt;

&lt;p&gt;Among those who use dask projects to deploy, &lt;a href=&quot;https://github.com/dask/dask-jobqueue&quot;&gt;dask-jobqueue&lt;/a&gt;
and &lt;a href=&quot;https://github.com/dask/helm-chart&quot;&gt;dask helm chart&lt;/a&gt; are the two most popular options.
There was a wide variety of projects people used for deployment.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Do you use Dask projects to deploy?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dask-jobqueue&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dask&apos;s helm chart&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dask-kubernetes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dask&apos;s docker image at daskdev/dask&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dask-gateway&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dask-ssh&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dask-cloudprovider&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dask-yarn&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;qhub&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dask-mpi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_46_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;diagnostics-&quot;&gt;Diagnostics &lt;a class=&quot;anchor&quot; id=&quot;diagnostics&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;We saw earlier that most people like to view the Dask Dashboard using their web browser.&lt;/p&gt;

&lt;p&gt;In the dashboard, people said the most useful diagnostics plots were:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The task stream plot&lt;/li&gt;
  &lt;li&gt;The progress plot, and&lt;/li&gt;
  &lt;li&gt;The memory useage per worker plot&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Which Diagnostic plots are most useful?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_48_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We also asked some new questions about diagnostics in 2021.&lt;/p&gt;

&lt;p&gt;We found that most people (65 percent) do not use &lt;a href=&quot;https://distributed.dask.org/en/latest/diagnosing-performance.html#performance-reports&quot;&gt;Dask performance reports&lt;/a&gt;, which is a way to save the diagnostic dashboard to static HTML plots for later review.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Do you use Dask&apos;s Performance reports?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Yes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;No&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_50_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Very few people use Dask’s &lt;a href=&quot;https://docs.dask.org/en/latest/setup/prometheus.html&quot;&gt;Prometheus metrics&lt;/a&gt;. Jacob Tomlinson has an excellent article on &lt;a href=&quot;https://medium.com/rapids-ai/monitoring-dask-rapids-with-prometheus-grafana-96eaf6b8f3a0&quot;&gt;Monitoring Dask + RAPIDS with Prometheus + Grafana&lt;/a&gt;, if you’re interested in learning more about how to use this feature.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Do you use Dask&apos;s Prometheus Metrics?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Yes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;No&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_52_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;stability-&quot;&gt;Stability &lt;a class=&quot;anchor&quot; id=&quot;stability&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;We asked a number of questions around the stability of Dask, many of them new questions in 2021.&lt;/p&gt;

&lt;p&gt;The majority of people said Dask was resiliant enough for them (eg: computations complete).
However this is an area we could improve in, as 36 percent of people are not satisfied.
This was a new question 2021, so we can’t say how people opinion of Dask’s resiliancy has changed over time.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Is Dask resilient enough for you? (e.g. computations complete).&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# new question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Yes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;No&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Is Dask resilient enough for you?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_54_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Most people say Dask in general is stable enough for them (eg: between different version releases). This is similar to the survey results from previous years.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Is Dask stable enough for you?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Yes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;No&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_56_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;People also say that the API of Dask is stable enough for them too.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Is Dask&apos;s API stable enough for you?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Yes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;No&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_58_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The vast majority of people are satisfied with the current release frequency (roughly once every two weeks).&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;How is Dask&apos;s release frequency?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_60_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Most people say they would pin their code to a long term support release, if one was available for Dask.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;If Dask had Long-term support (LTS) releases, would you pin your code to use them?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Yes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;No&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Would you pin to a long term support release?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_62_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;user-satisfaction-support-and-documentation-&quot;&gt;User satisfaction, support, and documentation &lt;a class=&quot;anchor&quot; id=&quot;user-satisfaction&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;We asked a bunch of new questions about user satisfaction in the 2021 survey.&lt;/p&gt;

&lt;h3 id=&quot;how-easy-is-dask-to-use&quot;&gt;How easy is Dask to use?&lt;/h3&gt;

&lt;p&gt;The majority of people say that Dask is moderately easy to use, the same as in previous surveys.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;On a scale of 1 - 5 (1 being hardest, 5 being easiest) how easy is Dask to use?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;1 = Difficult, 5 = Easy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;How easy is Dask to use?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_65_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-is-dasks-documentation&quot;&gt;How is Dask’s documentation?&lt;/h3&gt;

&lt;p&gt;Most people think that Dask’s documentation is pretty good.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;How is Dask&apos;s documentation?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;1 = Not good, 5 = Great&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_67_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-satisfied-are-you-with-maintainer-responsiveness-on-github&quot;&gt;How satisfied are you with maintainer responsiveness on GitHub?&lt;/h3&gt;

&lt;p&gt;Almost everybody who responded feels positively about Dask’s maintainer responsiveness on GitHub .&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;How satisfied are you with maintainer responsiveness on GitHub?&quot;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New question in 2021
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;1 = Not satisfied, 5 = Thrilled&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_69_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-dask-resources-have-you-used-for-support-in-the-last-six-months&quot;&gt;What Dask resources have you used for support in the last six months?&lt;/h3&gt;

&lt;p&gt;The documentation at &lt;a href=&quot;https://dask.org/&quot;&gt;dask.org&lt;/a&gt; is the first place most users look for help.&lt;/p&gt;

&lt;p&gt;The breakdown of responses to this question in 2021 was very similar to previous years, with the exception that no-one seemed to know that the &lt;a href=&quot;https://www.youtube.com/c/Dask-dev/videos&quot;&gt;Dask YouTube channel&lt;/a&gt; or Gitter chat existed in 2019.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;What Dask resources have you used for support in the last six months?&apos;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;resource_map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Tutorial&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Tutorial at tutorial.dask.org&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;YouTube&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;YouTube channel&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;gitter&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Gitter chat&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Make separator values consistent
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resource_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;top&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;top&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;fig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subplots&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figsize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Year&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reset_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_71_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;suggestions-for-improvement-&quot;&gt;Suggestions for improvement &lt;a class=&quot;anchor&quot; id=&quot;suggestions-for-improvement&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;h3 id=&quot;which-would-help-you-most-right-now&quot;&gt;Which would help you most right now?&lt;/h3&gt;

&lt;p&gt;The two top priorities people said would help most right now are both related to documentation. People want more documentation, and more examples in their field. Performance improvements were also commonly mentioned as something that would help the most right now.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Which would help you most right now?&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;More documentation&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;More examples in my field&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Performance improvements&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;New features&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Bug fixes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_74_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-can-dask-improve&quot;&gt;How can Dask improve?&lt;/h3&gt;

&lt;p&gt;We also gave people the opportunity for a free text response to the question “How can Dask imporove?”&lt;/p&gt;

&lt;p&gt;Matt has previously written an &lt;a href=&quot;https://blog.dask.org/2021/06/18/early-survey&quot;&gt;early anecdotes blogpost&lt;/a&gt;
that dives into the responses to this question in more detail.&lt;/p&gt;

&lt;p&gt;He found these recurring themes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Intermediate Documentation&lt;/li&gt;
  &lt;li&gt;Documentation Organization&lt;/li&gt;
  &lt;li&gt;Functionality&lt;/li&gt;
  &lt;li&gt;High Level Optimization&lt;/li&gt;
  &lt;li&gt;Runtime Stability and Advanced Troubleshooting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since more documentation and examples were the two most requested improvements, I’ll summarize some of the steps forward in that area here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Regarding more intermediate documentation, Matt says:&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;There is a lot of good potential material that advanced users have around performance and debugging that could be fun to publish.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Matt points out that Dask has excellent &lt;em&gt;reference documentation&lt;/em&gt;, but lacks a lot of good &lt;em&gt;narrative documentation&lt;/em&gt;. To address this, Julia Signell is currently investigating how we could improve the organization of Dask’s documentation (you can subscribe to &lt;a href=&quot;https://github.com/dask/community/issues/170&quot;&gt;this issue thread&lt;/a&gt; if you want to follow that discussion)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Matt comments that it’s hard to have good &lt;em&gt;narrative documentation&lt;/em&gt; when there are so many different &lt;em&gt;user narratives&lt;/em&gt; (i.e. Dask is used by people from many different industries). This year, we added a new question to the survey asking for the industry people work in. We added this because &lt;em&gt;“More examples in my field”&lt;/em&gt; has been one of the top two requests for the last three years. Now we can use that information to better target narrative documentation to the areas that need it most (geoscience, life science, and finance).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;What industry do you work in?&apos;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Which would help you most right now?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;More examples in my field&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;countplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dropna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;explode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;What field do you want more documentation examples for?&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_76_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-common-feature-requests-do-you-care-about-most&quot;&gt;What common feature requests do you care about most?&lt;/h3&gt;

&lt;p&gt;Good support for numpy and pandas is critical for most users.
Users also value:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Improved scaling&lt;/li&gt;
  &lt;li&gt;Ease of deployment&lt;/li&gt;
  &lt;li&gt;Resiliancy of Dask&lt;/li&gt;
  &lt;li&gt;Better scikit-learn &amp;amp; machine learning support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most feature requests are similar to the survey results from previous years, although there was an increase in the number of people who say better scikit-learn/ML support is critical to them. We also added a new question about Dask’s resiliancy in 2021.&lt;/p&gt;

&lt;p&gt;In the figure below you can see how people rated the importance of each feature request, for each of the three years we’ve run this survey.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;common&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;startswith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;What common feature&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]]&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lstrip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;What common feature requests do you care about most?[&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rstrip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;]&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;common&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2019&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reset_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;level_0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Question&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;level_1&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Importance&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Year&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2019&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;common&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2020&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reset_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;level_0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Question&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;level_1&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Importance&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Year&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2020&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;common&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reset_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;level_0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Question&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;level_1&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Importance&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;assign&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Year&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2021&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;counts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ignore_index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;common&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reset_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;level_2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Feature&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Importance&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Not relevant for me&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Somewhat useful&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Critical to me&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;catplot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Importance&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Feature&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;count&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;col&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Year&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sharex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;order&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021_survey/2021_survey_78_0.png&quot; alt=&quot;png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;previous-survey-results-&quot;&gt;Previous survey results &lt;a class=&quot;anchor&quot; id=&quot;previous-survey-results&quot;&gt;&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Thanks to everyone who took the survey!&lt;/p&gt;

&lt;p&gt;If you want to read more about the 2021 Dask survey, the blogpost on early anecdotes from the Dask 2021 survey &lt;a href=&quot;https://blog.dask.org/2021/06/18/early-survey&quot;&gt;is available here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can read the survey results from previous years here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2020/09/22/user_survey&quot;&gt;2020 survey results&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2019/08/05/user-survey&quot;&gt;2019 survey results&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Google Summer of Code 2021 - Dask Project</title>
   <link href="https://blog.dask.org/2021/08/23/gsoc-2021-project"/>
   <updated>2021-08-23T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/08/23/gsoc-2021-project</id>
   
   <content type="html">
&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;

&lt;p&gt;Here’s an update on new features related to visualizing Dask graphs and HTML representations. You can try these new features today with version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2021.08.1&lt;/code&gt; or above. This work was done by Freyam Mehta during the Google Summer of Code 2021. Dask took part in the program under the NumFOCUS umbrella organization.&lt;/p&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#visualizing-dask-graphs&quot;&gt;Visualizing Dask graphs&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#graphviz-node-size-scaling&quot;&gt;Graphviz node size scaling&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#new-tooltips&quot;&gt;New tooltips&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#color-by-layer-type&quot;&gt;Color by layer type&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#bugfix-in-visualize-method&quot;&gt;Bugfix in visualize method&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#html-representations&quot;&gt;HTML Representations&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#array-images-in-html-repr-for-high-level-graphs&quot;&gt;Array images in HTML repr for high level graphs&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#new-html-repr-for-processinterface-class&quot;&gt;New HTML repr for ProcessInterface class&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#new-html-repr-for-security-class&quot;&gt;New HTML repr for Security class&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;visualizing-dask-graphs&quot;&gt;Visualizing Dask graphs&lt;/h2&gt;

&lt;p&gt;There are several new features involving Dask &lt;a href=&quot;https://docs.dask.org/en/latest/graphs.html&quot;&gt;task graph&lt;/a&gt; visualization. Task graphs are a visual representation of the order and dependencies of each individual task within a dask computation. They are a very userful diagnostic tool, and have been used for a long time.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/gsoc21/dask-simple.png&quot; alt=&quot;An example task graph visualization.&quot; height=&quot;300&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Freyam worked on making these visualizations more illustrative, engaging, and informative. The &lt;a href=&quot;https://docs.dask.org/en/latest/graphviz.html&quot;&gt;Graphviz&lt;/a&gt; library boasts a great set of attributes which can be modifified to create a more visually appealing output.&lt;/p&gt;

&lt;p&gt;These features primarily improve the Dask &lt;a href=&quot;https://docs.dask.org/en/latest/high-level-graphs.html&quot;&gt;high level graph&lt;/a&gt; visualizations. Both low level and high level Dask graphs can be accessed with very similar methods:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Dask low level graph: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;result.visualize()&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Dask high level graph: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;result.dask.visualize()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;result&lt;/code&gt; is a dask object or collection.&lt;/p&gt;

&lt;h3 id=&quot;graphviz-node-size-scaling&quot;&gt;Graphviz node size scaling&lt;/h3&gt;

&lt;p&gt;The first change you may notice to the Dask high level graphs, is that the node sizes have been adjusted to scale with the number of tasks in each layer. Layers with more tasks would appear larger than the rest.&lt;/p&gt;

&lt;p&gt;This is a helpful feature to have, because now users can get a much more intuitive sense of where the bulk of their computation takes place.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Dask high level graph
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/gsoc21/7869.png&quot; alt=&quot;Example: graphviz node size scaling, pull request #7869&quot; height=&quot;414&quot; width=&quot;736&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note: this change only affects the graphviz output for Dask high level graphs. Low level graphs are left unchanged, because each visual node corresponds to one task.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href=&quot;https://github.com/dask/dask/pull/7869&quot;&gt;Pull request #7869 by Freyam Mehta &lt;em&gt;“Add node size scaling to the Graphviz output for the high level graphs”&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;new-tooltips&quot;&gt;New tooltips&lt;/h3&gt;

&lt;p&gt;Dask high level graphs now include hover tooltips to provide a brief summary of more detailed information. To use the tooltips, generate a dask high level graph (eg: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;result.dask.visualize()&lt;/code&gt;) then hover your mouse above the layer you are interested in.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/gsoc21/7973.png&quot; alt=&quot;Example: tooltips provide extra information, pull request #7973&quot; height=&quot;414&quot; width=&quot;736&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tooltips provide information such as the layer type and number of tasks associated with it. There is additional information provided for specific dask collections, like dask arrays and dataframes.&lt;/p&gt;

&lt;p&gt;Dask array tooltip information additionally includes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Array shape&lt;/li&gt;
  &lt;li&gt;Chunk size&lt;/li&gt;
  &lt;li&gt;Chunk type (eg: are the array chunks numpy, cupy, sparse, etc.)&lt;/li&gt;
  &lt;li&gt;Data type (eg: are the array values float, integer, boolean, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dask dataframe tooltip information additionally includes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Number of partitions&lt;/li&gt;
  &lt;li&gt;Dataframe type&lt;/li&gt;
  &lt;li&gt;Dataframe columns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users have asked for a less overwhelming view into the dask task graph. We hope the high level graph view coupled with more detailed tooltip information can provide this middle ground, with enough information to be useful, but not so much as to become overwhelming (like the low level task graphs for large computations).&lt;/p&gt;

&lt;p&gt;Note: This feature is available for SVG output. Other image formats, like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.png&lt;/code&gt;, etc. do not support tooltips.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href=&quot;https://github.com/dask/dask/pull/7973&quot;&gt;Pull request #7973 by Freyam Mehta &lt;em&gt;“Add tooltips to graphviz”&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;color-by-layer-type&quot;&gt;Color by layer type&lt;/h3&gt;

&lt;p&gt;There is also a new feature enabling users to color code a high level graph according to layer type. This option can be enabled by passing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;color=&quot;layer_type&quot;&lt;/code&gt; keyword argument, eg: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;result.dask.visualize(color=&quot;layer_type&quot;)&lt;/code&gt;. This change is intended to make it easier for users to see which layer types predominate.&lt;/p&gt;

&lt;p&gt;While there are no hard and fast rules about what makes a Dask computation efficient, there are some general guidelines:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Dataframe shuffles are particularly expensive operations. You can &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-best-practices.html#avoid-full-data-shuffling&quot;&gt;read more about this here&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Reading and writing data to/from storage/network services is often high-latency and therefore a bottleneck.&lt;/li&gt;
  &lt;li&gt;Blockwise layers are generally efficient for computation.&lt;/li&gt;
  &lt;li&gt;All layers are materialized during computation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the &lt;a href=&quot;https://docs.dask.org/en/latest/best-practices.html&quot;&gt;Dask best pracices&lt;/a&gt; pages for more information on creating more efficient Dask computations.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datasets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timeseries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;layer_type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Dask high level graph with colored nodes by layer type
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/gsoc21/7974.png&quot; alt=&quot;Example: Dask graph colored by layer type, pull request #7974&quot; height=&quot;414&quot; width=&quot;736&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href=&quot;https://github.com/dask/dask/pull/7974&quot;&gt;Pull request #7974 by Freyam Mehta &lt;em&gt;“Add colors to represent high level layer types”&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;bugfix-in-visualize-method&quot;&gt;Bugfix in visualize method&lt;/h3&gt;

&lt;p&gt;Freyam also fixed a bug which caused an error when users tried to call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.visualize()&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filename=None&lt;/code&gt; (issue &lt;a href=&quot;https://github.com/dask/dask/issues/7685&quot;&gt;#7685&lt;/a&gt;, fixed by pull request &lt;a href=&quot;https://github.com/dask/dask/pull/7740&quot;&gt;#7740&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The bug was fixed by adding an extra condition before it reaches the error. If the format is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt;, Dask now uses use a default &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;png&lt;/code&gt; format.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# success
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Reference: &lt;a href=&quot;https://github.com/dask/dask/pull/7740&quot;&gt;Pull request #7740 by Freyam Mehta &lt;em&gt;“Fixing calling .visualize() with filename=None”&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;html-representations&quot;&gt;HTML representations&lt;/h2&gt;

&lt;p&gt;Dask makes use of HTML representations in several places, for example in Dask collections like the Array and Dataframe classes (for background reading, see &lt;a href=&quot;https://matthewrocklin.com/blog/2019/07/04/html-repr&quot;&gt;this blogpost&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;More recently, we’ve introduced HTML representations for high level graphs into Dask, and Jacob Tomlinson has implemented HTML representations in several places in the dask distributed library (for further reading, see &lt;a href=&quot;https://blog.dask.org/2021/07/07/high-level-graphs#visualization&quot;&gt;this other blogpost&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;During Freyam’s Google Summer of Code project, he extended the HTML representations for Dask high level graphs to include images, and introduced two entirely new HTML representations to the dask distributed library.&lt;/p&gt;

&lt;h3 id=&quot;array-images-in-html-repr-for-high-level-graphs&quot;&gt;Array images in HTML repr for high level graphs&lt;/h3&gt;

&lt;p&gt;The HTML representation for dask high level graphs has been extended, and now includes SVG images of dask arrays at intermediate stages of computation.&lt;/p&gt;

&lt;p&gt;The motivation for this feature is similar to the motivation behind adding tooltips, discussed above. Users want easier ways to access information about the way a Dask computation changes as it moves through each stage of computation. We hope this improvement to the HTML representation for Dask high level graphs will provide an at a glance summary of array shape and chunk size at each stage.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# shows the HTML representation in Jupyter
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/gsoc21/7886.png&quot; alt=&quot;Example: Array images now included in HTML representation of Dask high level graphs, pull request #7886&quot; height=&quot;414&quot; width=&quot;736&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href=&quot;https://github.com/dask/dask/pull/7886&quot;&gt;Pull request #7886 by Freyam Mehta &lt;em&gt;“Add dask.array SVG to the HTML Repr”&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;new-html-repr-for-processinterface-class&quot;&gt;New HTML repr for ProcessInterface class&lt;/h3&gt;

&lt;p&gt;A new HTML representation has been created for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProcessInterface&lt;/code&gt; class in &lt;a href=&quot;https://github.com/dask/distributed/&quot;&gt;dask distributed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The HTML representation displays the status, address, and external address of the process.&lt;/p&gt;

&lt;p&gt;There are three possible status options:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Process created, not yet running (blue icon)&lt;/li&gt;
  &lt;li&gt;Process is running (green icon)&lt;/li&gt;
  &lt;li&gt;Process closed (orange icon)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/gsoc21/5181-1.png&quot; alt=&quot;Example: New HTML representation for distributed ProcessInterface class, pull request #5181&quot; height=&quot;414&quot; width=&quot;736&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProcessInterface&lt;/code&gt; class is not intended to be used directly. Instead, more typically this information will be accessed via subclasses such as the SSH scheduler or workers.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# HTML representation for the SSH scheduler, shown in Jupyter
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# dict of all the workers
# or
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# HTML representation for the first SSH worker in the cluster
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/gsoc21/5181-2.png&quot; alt=&quot;Example: New HTML representation for distributed ProcessInterface class, pull request #5181&quot; height=&quot;414&quot; width=&quot;736&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href=&quot;https://github.com/dask/distributed/pull/5181&quot;&gt;Pull request #5181 by Freyam Mehta &lt;em&gt;“Add HTML Repr for ProcessInterface Class and all its subclasses”&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;new-html-repr-for-security-class&quot;&gt;New HTML repr for Security class&lt;/h3&gt;

&lt;p&gt;Pull request &lt;a href=&quot;https://github.com/dask/distributed/pull/5178&quot;&gt;#5178&lt;/a&gt; added a new HTML representation for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Security&lt;/code&gt; class in the &lt;a href=&quot;https://github.com/dask/distributed/&quot;&gt;dask distributed library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Security&lt;/code&gt; HTML representation shows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Whether encryption is required&lt;/li&gt;
  &lt;li&gt;Whether the object instance was created using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Security.temporary()&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Security(**paths_to_keys)&lt;/code&gt;.
    &lt;ul&gt;
      &lt;li&gt;For temporary security objects, keys are generated dynamically and the only copy is kept in memory.&lt;/li&gt;
      &lt;li&gt;For security objects created using keys stored on disk, the HTML representation will show the full filepath to the relevant security certificates on disk.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example: temporary security object&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Security&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Security&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;temporary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# shows the HTML representation in Jupyter
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Example: security object using certificates saved to disk&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Security&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Security&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;require_encryption&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tls_ca_file&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ca.pem&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tls_scheduler_cert&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;scert.pem&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# shows the HTML representation in Jupyter
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/gsoc21/5178-2.png&quot; alt=&quot;Example: New HTML representation for distributed Security class, pull request #5178&quot; height=&quot;414&quot; width=&quot;736&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In addition, the text representation has also been updated to reflect the same information shown in the HTML representation.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/gsoc21/5178-1.png&quot; alt=&quot;Example: New text representation for distributed Security class, pull request #5178&quot; height=&quot;414&quot; width=&quot;736&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href=&quot;https://github.com/dask/distributed/pull/5178/&quot;&gt;Pull request #5178 by Freyam Mehta &lt;em&gt;“Add HTML Repr for Security Class”&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>High Level Graphs update</title>
   <link href="https://blog.dask.org/2021/07/07/high-level-graphs"/>
   <updated>2021-07-07T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/07/07/high-level-graphs</id>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;There is a lot of work happening in Dask right now on high level graphs. We’d like to share a snapshot of current work in this area. This post is for people interested in technical details of behind the scenes work improving performance in Dask. You don’t need to know anything about it in order to use Dask.&lt;/p&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#brief-background&quot;&gt;Brief background&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#blockwise-layers-progress&quot;&gt;Blockwise layers progress&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#a-high-level-graph-for-map-overlap&quot;&gt;A high level graph for map overlap&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#slicing-and-high-level-graphs&quot;&gt;Slicing and high level graphs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#visualization&quot;&gt;Visualization&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#documentation&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;brief-background&quot;&gt;Brief background&lt;/h2&gt;

&lt;h3 id=&quot;what-are-high-level-graphs&quot;&gt;What are high level graphs?&lt;/h3&gt;

&lt;p&gt;High level graphs are a more compact representation of instructions needed to generate the full low level task graph.
The documentation page on Dask high level graphs is here:
https://docs.dask.org/en/latest/high-level-graphs.html&lt;/p&gt;

&lt;h3 id=&quot;why-are-they-useful&quot;&gt;Why are they useful?&lt;/h3&gt;

&lt;p&gt;High level graphs are useful for faster scheduling.
Instead of sending very large task graphs between the scheduler and the workers, we can instead send the smaller high level graph representation to the worker. Reducing the amount of data that needs to be passed around allows us to improve the overall performance.&lt;/p&gt;

&lt;p&gt;You can read more about faster scheduling in &lt;a href=&quot;https://blog.dask.org/2020/07/21/faster-scheduling&quot;&gt;our previous blogpost&lt;/a&gt;.
More recently, Adam Breindel has written about this over on the Coiled blog (&lt;a href=&quot;https://coiled.io/blog/dask-under-the-hood-scheduler-refactor/&quot;&gt;link&lt;/a&gt;).&lt;/p&gt;

&lt;h3 id=&quot;do-i-need-to-change-my-code-to-use-them&quot;&gt;Do I need to change my code to use them?&lt;/h3&gt;

&lt;p&gt;No, you won’t need to change anything. This work is being done under the hood in Dask, and you should see some speed improvements without having to change anything in your code.&lt;/p&gt;

&lt;p&gt;In fact, you might already be benefitting from high level graphs:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Starting with Dask 2021.05.0, Dask DataFrame computations will start sending HighLevelGraph’s directly from the client to the scheduler by default. Because of this, users should observe a much smaller delay between when they call .compute() and when the corresponding tasks begin running on workers for large DataFrame computations” https://coiled.io/blog/dask-heartbeat-by-coiled-2021-06-10/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read on for a snapshot of progress in other areas.&lt;/p&gt;

&lt;h2 id=&quot;blockwise-layers-progress&quot;&gt;Blockwise layers progress&lt;/h2&gt;

&lt;h3 id=&quot;summary&quot;&gt;Summary&lt;/h3&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Blockwise&lt;/code&gt; high level graph layer was introduced in the 2020.12.0 Dask release. Since then, there has been a lot of effort made to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Blockwise&lt;/code&gt; high level graph layer whereever possible for improved performance, most especially for IO operations. The following is a non-exhaustive list.&lt;/p&gt;

&lt;h3 id=&quot;work-to-date&quot;&gt;Work to date&lt;/h3&gt;

&lt;p&gt;Highlights include (in no particular order):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Merged PR by Rick Zamora: &lt;a href=&quot;https://github.com/dask/dask/pull/7415&quot;&gt;Use Blockwise for DataFrame IO (parquet, csv, and orc) #7415&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Merged PR by Rick Zamora: &lt;a href=&quot;https://github.com/dask/dask/pull/7625&quot;&gt;Move read_hdf to Blockwise 7625&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Merged PR by Rick Zamora: &lt;a href=&quot;https://github.com/dask/dask/pull/7615&quot;&gt;Move timeseries and daily-stock to Blockwise #7615&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Merged PR by John Kirkham: &lt;a href=&quot;https://github.com/dask/dask/pull/7704&quot;&gt;Rewrite da.fromfunction w/ da.blockwise #7704&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;ongoing-work&quot;&gt;Ongoing work&lt;/h3&gt;

&lt;p&gt;Lots of other work with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Blockwise&lt;/code&gt; is currently in progress:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Ian Rose: &lt;a href=&quot;https://github.com/dask/dask/pull/7417&quot;&gt;Blockwise array creation redux #7417&lt;/a&gt;. This PR creates blockwise implementations for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_array&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_zarr&lt;/code&gt; functions.&lt;/li&gt;
  &lt;li&gt;Rick Zamora: &lt;a href=&quot;https://github.com/dask/dask/pull/7628&quot;&gt;Move DataFrame from_array and from_pandas to Blockwise #7628&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Bruce Merry: &lt;a href=&quot;https://github.com/dask/dask/pull/7686&quot;&gt;Use BlockwiseDep for map_blocks with block_id or block_info #7686&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;a-high-level-graph-for-map-overlap&quot;&gt;A high level graph for map overlap&lt;/h2&gt;

&lt;h3 id=&quot;summary-1&quot;&gt;Summary&lt;/h3&gt;

&lt;p&gt;Investigating a high level graph for Dask’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt; is a project driven by &lt;a href=&quot;https://github.com/dask/dask/discussions/7404&quot;&gt;user needs&lt;/a&gt;. People have told us that the time taken just to generate the task graph (before any actual computation takes place) can sometimes be a big user experience problem. So, we’re looking in to ways to improve it.&lt;/p&gt;

&lt;h3 id=&quot;work-to-date-1&quot;&gt;Work to date&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Merged PR by Genevieve Buckley: &lt;a href=&quot;https://github.com/dask/dask/pull/7595&quot;&gt;A HighLevelGraph abstract layer for map_overlap #7595&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This PR defers much of the computation involved in creating the Dask task graph, but does not does not reduce the total end-to-end computation time. Further optimization is therefore required.&lt;/p&gt;

&lt;h3 id=&quot;ongoing-work-1&quot;&gt;Ongoing work&lt;/h3&gt;

&lt;p&gt;Followup work includes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Find number of tasks in overlap layer without materializing the layer #7788 https://github.com/dask/dask/issues/7788&lt;/li&gt;
  &lt;li&gt;Implement cull method for ArrayOverlapLayer #7789 https://github.com/dask/dask/issues/7789 (culling is simplifying a Dask graph by removing unnecessary tasks)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;slicing-and-high-level-graphs&quot;&gt;Slicing and high level graphs&lt;/h2&gt;

&lt;h3 id=&quot;summary-2&quot;&gt;Summary&lt;/h3&gt;

&lt;p&gt;Profiling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt;, we saw that a lot of time is being spent in slicing operations. So, slicing was a logical next step to investigate possible performance improvements with high level graphs.&lt;/p&gt;

&lt;p&gt;Meanwhile, Rick Zamora has been working on the dataframe side of Dask, using high level graphs to improve dataframe slicing/selections.&lt;/p&gt;

&lt;h3 id=&quot;work-to-date-2&quot;&gt;Work to date&lt;/h3&gt;

&lt;p&gt;A couple of minor bugfixes/improvements:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Merged PR by Genevieve Buckley: &lt;a href=&quot;https://github.com/dask/dask/pull/7787&quot;&gt;SimpleShuffleLayer should compare parts_out with set(self.parts_out) #7787&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Merged PR by Genevieve Buckley: &lt;a href=&quot;https://github.com/dask/dask/pull/7775&quot;&gt;Make Layer get_output_keys officially an abstract method #7775&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;ongoing-work-2&quot;&gt;Ongoing work&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Rick Zamora: &lt;a href=&quot;https://github.com/dask/dask/pull/7663&quot;&gt;[WIP] Add DataFrameGetitemLayer to simplify HLG Optimizations #7663&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Genevieve Buckley: &lt;a href=&quot;https://github.com/dask/dask/pull/7655&quot;&gt;Array slicing HighLevelGraph layer #7655&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;visualization&quot;&gt;Visualization&lt;/h2&gt;

&lt;h3 id=&quot;summary-3&quot;&gt;Summary&lt;/h3&gt;

&lt;p&gt;We’ve also put some work into making better visualizations for Dask objects (including high level graphs).&lt;/p&gt;

&lt;p&gt;Defining a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_repr_html_&lt;/code&gt; method for your classes is a great way to get nice HTML output when you’re working with jupyter notebooks. You can read &lt;a href=&quot;http://matthewrocklin.com/blog/2019/07/04/html-repr&quot;&gt;this post&lt;/a&gt; to see more neat HTML representations in other scientific python libraries.&lt;/p&gt;

&lt;p&gt;Dask already uses HTML representations in lots of places (like the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Array&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Dataframe&lt;/code&gt; classes). We now have new HTML representations for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HighLevelGraph&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Layer&lt;/code&gt; objects, as well as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scheduler&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client&lt;/code&gt; objects in Dask distributed.&lt;/p&gt;

&lt;h3 id=&quot;work-to-date-3&quot;&gt;Work to date&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Merged PR by Jacob Tomlinson: &lt;a href=&quot;https://github.com/dask/distributed/pull/4857&quot;&gt;Add HTML repr to scheduler_info and incorporate into client and cluster reprs #4857&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Merged PR by Jacob Tomlinson: &lt;a href=&quot;https://github.com/dask/distributed/pull/4853&quot;&gt;HTML reprs CLient.who_has &amp;amp; Client.has_what&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Merged PR by Genevieve Buckley: Implementation of HTML repr for HighLevelGraph layers #7763 https://github.com/dask/dask/pull/7763&lt;/li&gt;
  &lt;li&gt;Merged PR by Genevieve Buckley &lt;a href=&quot;https://github.com/dask/dask/pull/7716&quot;&gt;Automatically show graph visualization in jupyter notebooks #771&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Merged PR by Genevivee Buckley: &lt;a href=&quot;https://github.com/dask/dask/pull/7309&quot;&gt;Adding chunks and type information to dask high level graphs #7309&lt;/a&gt;. This PR inserts extra information into the high level graph, so that we can create richer visualizations using this extra context later on.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;example&quot;&gt;Example&lt;/h3&gt;

&lt;h4 id=&quot;before&quot;&gt;Before:&lt;/h4&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;lt;dask.highlevelgraph.HighLevelGraph at 0x7f9851b7e4f0&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;after-html-representation&quot;&gt;After (HTML representation):&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-highlevelgraph-html-repr.png&quot; alt=&quot;HTML representation for a Dask high level graph&quot; width=&quot;700&quot; height=&quot;470&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;after-text-only-representation&quot;&gt;After (text-only representation):&lt;/h4&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.datasets&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timeseries&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timeseries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tasks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;HighLevelGraph with 3 layers.
&amp;lt;dask.highlevelgraph.HighLevelGraph object at 0x7fc259015b80&amp;gt;
 0. make-timeseries-94aab6e7236cbd9828bcbfb35fe6caee
 1. simple-shuffle-cd01443e43b7a6eb9810ad67992c40b6
 2. head-1-5-simple-shuffle-cd01443e43b7a6eb9810ad67992c40b6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This gives us a much more meaningful representation, and is already being used by developers working on high level graphs.&lt;/p&gt;

&lt;h2 id=&quot;documentation&quot;&gt;Documentation&lt;/h2&gt;

&lt;p&gt;Finally, the documentation around high level graphs is sparse. This is because they’re relatively new, and have also been undergoing quite a bit of change. However, this makes it difficult for people. We’re planning to improve the documentation, for both users and devlopers of Dask.&lt;/p&gt;

&lt;p&gt;If you’d like to follow these discussions, or help out, you can subscribe to the issues:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;For Dask users: &lt;a href=&quot;https://github.com/dask/dask/issues/7709&quot;&gt;Update HighLevelGraph documentation #7709&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;For Dask developers: &lt;a href=&quot;https://github.com/dask/dask/issues/7755&quot;&gt;Document dev process around high level graphs #7755&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Ragged output, how to handle awkward shaped results</title>
   <link href="https://blog.dask.org/2021/07/02/ragged-output"/>
   <updated>2021-07-02T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/07/02/ragged-output</id>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;This blogpost explains some of the difficulties associated with distributed computation and ragged or irregularly shaped outputs. We present a recommended method for using Dask in these circumstances.&lt;/p&gt;

&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;

&lt;p&gt;Often, we come across workflows where analyzing the data involves searching for features (which may or may not be present) then computing some results from those features.
Because we don’t know ahead of time how many features will be found, we can expect the processing output size to vary.&lt;/p&gt;

&lt;p&gt;For distributed workloads, we need to split up the data, process it, and then recombine the results. That means ragged output can cause cause problems (like broadcasting errors) when Dask combines the output.&lt;/p&gt;

&lt;h2 id=&quot;problem-constraints&quot;&gt;Problem constraints&lt;/h2&gt;

&lt;p&gt;In this blogpost, we’ll look at an example with the following constraints:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Input array data&lt;/li&gt;
  &lt;li&gt;A processing function requiring overlap between chunks&lt;/li&gt;
  &lt;li&gt;The output returned&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;solution&quot;&gt;Solution&lt;/h2&gt;

&lt;p&gt;The simplest strategy is a two step process:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Expand the array chunks using the &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html?#dask.array.overlap.overlap&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;overlap&lt;/code&gt; function&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Use &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.map_blocks&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt;&lt;/a&gt; with the &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.map_blocks&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;drop_axis&lt;/code&gt; keyword argument&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;example-code&quot;&gt;Example code&lt;/h2&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;arr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# example input data
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;expanded&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boundary&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;reflect&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;expanded&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;processing_func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drop_axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;multiple-output-types-supported&quot;&gt;Multiple output types supported&lt;/h2&gt;

&lt;p&gt;This pattern supports multiple types of output from the processing function, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;numpy arrays&lt;/li&gt;
  &lt;li&gt;pandas Series&lt;/li&gt;
  &lt;li&gt;pandas DataFrames&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can try this for yourself using any of the example processing functions below, generating dummy data output. Or, you can try out a function of your own.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Random length, 1D output returned
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# function returns numpy array
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;processing_func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# function returns pandas series
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;processing_func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;output_series&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Series&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output_series&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# function returns pandas dataframe
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;processing_func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x_data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;y_data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;x&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;y&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;why-cant-i-use-map_overlap-or-reduction&quot;&gt;Why can’t I use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reduction&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;Ragged output sizes can cause &lt;a href=&quot;https://numpy.org/doc/stable/user/basics.broadcasting.html&quot;&gt;broadcasting&lt;/a&gt; errors when the outputs are combined for some Dask functions.&lt;/p&gt;

&lt;p&gt;However, if ragged output sizes aren’t a constraint for your particular programming problem, then you can continue to use the Dask &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html?#dask.array.overlap.map_overlap&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html?#dask.array.reduction&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reduction&lt;/code&gt;&lt;/a&gt; functions as much as you like.&lt;/p&gt;

&lt;h2 id=&quot;alternative-solution&quot;&gt;Alternative solution&lt;/h2&gt;

&lt;h3 id=&quot;dask-delayed&quot;&gt;Dask delayed&lt;/h3&gt;

&lt;p&gt;As an alternative solution, you can use &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;Dask delayed&lt;/a&gt; (a tutorial is &lt;a href=&quot;https://tutorial.dask.org/01_dask.delayed.html&quot;&gt;available here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Your processing function can have any type of output (it not restricted to numpy or pandas objects)&lt;/li&gt;
  &lt;li&gt;There is more flexibility in the ways you can use Dask delayed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disadvantages:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You will have to handle combining the outputs yourself.&lt;/li&gt;
  &lt;li&gt;You will have to be more careful about performance:
    &lt;ul&gt;
      &lt;li&gt;For example, because the code below uses delayed in a list comprehension, it’s very important for performance reasons that we pass in the expected metadata. Fortunately, dask has a &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-api.html#dask.dataframe.utils.make_meta&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make_meta&lt;/code&gt;&lt;/a&gt; function available.&lt;/li&gt;
      &lt;li&gt;You can read more about performance considerations for Dask delayed and &lt;a href=&quot;https://docs.dask.org/en/latest/delayed-best-practices.html&quot;&gt;best practices here&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example code:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;arr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;processing_func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# returns dummy dataframe output
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;x&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                         &lt;span class=&quot;s&quot;&gt;&apos;y&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)})&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;utils&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;x&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;y&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;expanded&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;boundary&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;reflect&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;blocks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;expanded&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ravel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;processing_func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;summing-up&quot;&gt;Summing up&lt;/h2&gt;

&lt;p&gt;That’s it! We’ve learned how to avoid common errors when working with processing functions returning ragged outputs. The method recommended here works well with multiple output types including: numpy arrays, pandas series, and pandas DataFrames.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Down Under</title>
   <link href="https://blog.dask.org/2021/06/25/dask-down-under"/>
   <updated>2021-06-25T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/06/25/dask-down-under</id>
   
   <category>Dask Summit</category>
   
   <category>Australia</category>
   
   <category>geoscience</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;Dask Down Under was a special event held for the first time last month during the 2021 Dask Summit.
It featured talks, tutorials, and events tailored specifically for an Australian (and wider Oceania) audience.&lt;/p&gt;

&lt;p&gt;To get involved in the new Pangeo Oceania community group,
&lt;a href=&quot;https://confirmsubscription.com/h/j/E30A9F4EAC96EA73&quot;&gt;register your interest here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#what-is-dask-down-under&quot;&gt;What is Dask Down Under?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#who-came&quot;&gt;Who came?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#watch-the-talks&quot;&gt;Watch the talks&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#whats-next&quot;&gt;What’s next? Here’s how to get involved!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-is-dask-down-under&quot;&gt;What is Dask Down Under?&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dask down under is a chance for everyone in Oceania to forge links and build community here in our backyard. Dask down under we feature talks, tutorials and panel discussions on using Dask to accelerate research. All levels from beginner to expert are encouraged to attend.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dask Down Under involved two days of events:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;5 talks&lt;/li&gt;
  &lt;li&gt;2 tutorials&lt;/li&gt;
  &lt;li&gt;1 panel discussion&lt;/li&gt;
  &lt;li&gt;1 meet and greet networking event&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;who-came&quot;&gt;Who came?&lt;/h2&gt;

&lt;p&gt;There was a strong geoscience theme across Dask Down Under. This reflects the strong scientific community we have in these areas. People came from government organisations, universities, and industry.&lt;/p&gt;

&lt;p&gt;We expected most attendees would be based in the Asia-Pacific region, since those were the timezones targeted by these events.&lt;/p&gt;

&lt;p&gt;Unexpectedly, we also saw a lot of extra traffic at the talks on day one, likely from US timezones. Publicity from Dask Summit emails and tweets mentioning Dask Down Under resulted in a lot of people stopping by to watch. This more than doubled our live attendance during the first event. It was great to see so much interest coming from other parts of the world, too.&lt;/p&gt;

&lt;h2 id=&quot;watch-the-talks&quot;&gt;Watch the talks&lt;/h2&gt;

&lt;p&gt;You can watch the talks and tutorials from the Dask Dwon Under workshop on the Dask youtube channel.
The &lt;a href=&quot;https://www.youtube.com/playlist?list=PLJ0vO2F_f6OAXBfb_SAF2EbJve9k1vkQX&quot;&gt;full playlist for the workshop is available here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;panel-discussion&quot;&gt;Panel discussion&lt;/h3&gt;

&lt;p&gt;A panel discussion was held, bringing together a diverse group of users from novice to expert, academic to commercial. We hope this discussion will start a conversation about using Dask in Australia, how we build our community, contribute and stay in touch with the rest of the world. You can &lt;a href=&quot;https://www.youtube.com/watch?v=WlSw7rhwGrA&quot;&gt;watch it here&lt;/a&gt;:&lt;/p&gt;

&lt;iframe width=&quot;900&quot; height=&quot;506&quot; src=&quot;https://www.youtube.com/watch?v=WlSw7rhwGrA&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Moderator: Draga Doncila Pop&lt;br /&gt;
Panelists:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ben Leighton, CSIRO&lt;/li&gt;
  &lt;li&gt;Tisham Dhar, Geoscience Australia&lt;/li&gt;
  &lt;li&gt;Genevieve Buckley, Dask life science fellow&lt;/li&gt;
  &lt;li&gt;Hugo Bowne-Anderson, Coiled&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;invited-talks&quot;&gt;Invited talks&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;https://www.youtube.com/playlist?list=PLJ0vO2F_f6OAXBfb_SAF2EbJve9k1vkQX&quot;&gt;full playlist for the workshop is available here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Featured talks include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Draga Doncila Pop, &lt;a href=&quot;https://www.youtube.com/watch?v=10Ws59NGDaE&amp;amp;list=PLJ0vO2F_f6OAXBfb_SAF2EbJve9k1vkQX&amp;amp;index=2&quot;&gt;Interactive visualization and near real-time analysis on out-of-core satellite images&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Tisham Dhar: &lt;a href=&quot;https://www.youtube.com/watch?v=MderTABZvyA&amp;amp;list=PLJ0vO2F_f6OAXBfb_SAF2EbJve9k1vkQX&amp;amp;index=3&quot;&gt;Dask DevOps for Remote Sensing&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kirill Kouzoubov: &lt;a href=&quot;https://www.youtube.com/watch?v=9-zBmUSk29Q&amp;amp;list=PLJ0vO2F_f6OAXBfb_SAF2EbJve9k1vkQX&amp;amp;index=4&quot;&gt;Patterns for large scale temporal processing of geo-spatial data using Dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Ben Leighton and Kim Opie: &lt;a href=&quot;https://www.youtube.com/watch?v=Fbh07T1K_IE&amp;amp;list=PLJ0vO2F_f6OAXBfb_SAF2EbJve9k1vkQX&amp;amp;index=6&quot;&gt;Image Processing Using Dask - Using dask and skimage to identity vegetation morphology across the Australian landscape&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Nick Mortimer: &lt;a href=&quot;https://www.youtube.com/watch?v=YF_GNJdQRQ4&amp;amp;list=PLJ0vO2F_f6OAXBfb_SAF2EbJve9k1vkQX&amp;amp;index=7&quot;&gt;Making the most of your schedule: From HPC to Local Cluster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;Here’s how you can get involved:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Several people have discussed setting up a new Pangeo Oceania group. You can
&lt;a href=&quot;https://confirmsubscription.com/h/j/E30A9F4EAC96EA73&quot;&gt;register your interest here&lt;/a&gt;.&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&amp;gt; Soon we&apos;ll start holding regular Pangeo Oceania meetups for sharing information, support, training, and workflow advocacy across our region.  We look forward to you helping to shape the Pangeo Oceania community. And if you have a friend or colleague that should be here too, please share this sign-up link: http://bit.ly/Pangeo_email_signup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The Python for Atmosphere and Ocean Science (PyAOS) provides information and resources to the user community: https://pyaos.github.io/
To keep the site up-to-date, the first ever PyAOS census is being conducted. It would be great if Python users in the atmosphere and/or ocean science community could take a few minutes to fill out the survey.
https://forms.gle/L84W7bsxmP86G3Ji9&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Survey 2021, early anecdotes</title>
   <link href="https://blog.dask.org/2021/06/18/early-survey"/>
   <updated>2021-06-18T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/06/18/early-survey</id>
   
   <content type="html">
&lt;p&gt;The annual Dask user survey is under way and currently accepting responses at &lt;a href=&quot;https://dask.org/survey&quot;&gt;dask.org/survey&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This post provides a preview into early results, focusing on anecdotal responses.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;The Dask user survey helps developers focus and prioritize our larger efforts.  It’s also a fascinating and rewarding dataset of anecdotal use cases of how people use Dask today.  Thank you to everyone who has participated so far, you make a difference.&lt;/p&gt;

&lt;p&gt;The survey is still open, and I encourage people to speak up about their experience.  This blogpost is intended to encourage participation by giving you a sense for how it affects development, and by sharing user stories provided within the survey.&lt;/p&gt;

&lt;p&gt;This article skips all of the quantitative data that we collect, and focuses in on direct feedback listed in the final comments.  For a more quantitative analysis see the posts from previous years by Tom at &lt;a href=&quot;https://blog.dask.org/2020/09/22/user_survey&quot;&gt;2020 Dask User Survey Results&lt;/a&gt; and  &lt;a href=&quot;https://blog.dask.org/2019/08/05/user-survey&quot;&gt;2019 Dask User Survey Results&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-can-dask-improve&quot;&gt;How can Dask Improve?&lt;/h2&gt;

&lt;p&gt;In this post we’re going to look at answers to this one question. This was a long-form response field asking &lt;em&gt;“How can Dask Improve?”&lt;/em&gt;. Looking through some of the responses we see that a few of them fall into some common themes. I’ve grouped them here.&lt;/p&gt;

&lt;p&gt;In each section we’ll include raw responses, followed up with a few comments from me in response.&lt;/p&gt;

&lt;h2 id=&quot;intermediate-documentation&quot;&gt;Intermediate Documentation&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;More long-form content about the internals of Dask to understand when things don’t work and why. The “Hacking Dask” tutorial in the Dask 2021 summit was precisely the kind of content I really need, because 90% of my time with Dask is spent not understanding why I’m running out of memory and I feel like I’ve ready all the documentation pages 5 times already (although sometimes I also stumble upon a useful page I’ve never seen before).&lt;/p&gt;

  &lt;p&gt;There’s also a dearth of documentation of intermediate topics like blockwise in dask.array. (I think I ended up reverse engineering how it worked from docs, GitHub issue comments, reading the code, and black-box reverse engineering with different functions before I finally “got it”.)&lt;/p&gt;

  &lt;p&gt;Improve documentation and error messages to cover more of the 2nd-level problems that people run into beyond the first-level tutorial examples.&lt;/p&gt;

  &lt;p&gt;more examples for complex concepts (passing metadata to custom functions, for example). more examples/support for using dask arrays and cupy.&lt;/p&gt;

  &lt;p&gt;I think the hardest thing about Dask is debugging performance issues with dask delayed and complex mixing of other libraries and not knowing when things are being pickled or not. I am getting better at reading the performance reports, but I think that better documentation and tutorials surrounding understanding the reports would help me greater than new features. For example, make a tutorial that does some non-trivial dask-delayed work (ie not just computing a mean) that is written against best practices and show how the performance improves with each adopted best practice/explain why things were slow with each step. I think there could also be improvements to the performance reports to point out the slowest 5 parts of your code and what lines they are, and possibly relevant docs links.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;response&quot;&gt;Response&lt;/h3&gt;

&lt;p&gt;I really like this theme.  We now have a solid community of intermediate-advanced Dask users that we should empower.  We usually write materials that target the broad base of beginning users, but maybe we should rethink this a bit.  There is a lot of good potential material that advanced users have around performance and debugging that could be fun to publish.&lt;/p&gt;

&lt;h2 id=&quot;documentation-organization&quot;&gt;Documentation Organization&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Documentation website is sometimes confusing to navigate, better separation of API and examples would help. Maybe this can inspire: &lt;a href=&quot;https://documentation.divio.com/&quot;&gt;https://documentation.divio.com/&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;I actually think Dask’s documentation is pretty good. But the docs could use some reorganizing – it is often difficult to find the relevant APIs. And there is an incredible amount of HPC insider knowledge that is required to launch a typical workflow - right now much of this knowledge is hidden in the github issues (which is great! but more of it could be pushed into the FAQs to make it more accessible).&lt;/p&gt;

  &lt;p&gt;More detailed documentation and examples. Start to finish examples that do not assume I know very much (about Dask, command line tools, Cloud technologies, Kubernetes, etc.).&lt;/p&gt;

  &lt;p&gt;I think an easier introduction to delayed/bags and additional examples for more complex use-cases could be helpful.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;response-1&quot;&gt;Response&lt;/h3&gt;

&lt;p&gt;We get alternating praise and scorn for our documentation.  We have what I would call excellent &lt;em&gt;reference documentation&lt;/em&gt;.  In fact, if anyone wants to build a dynamic distributed task scheduler today I’m going to claim that distributed.dask.org is probably the most comprehensive reference out there.&lt;/p&gt;

&lt;p&gt;However, we lack good &lt;em&gt;narrative documentation&lt;/em&gt;, which is the concern raised by most of these comments. This is hard to do because Dask is used in so many &lt;em&gt;different user narratives&lt;/em&gt;.  It’s challenging to orient the Dask documentation around all of them simultaneously.&lt;/p&gt;

&lt;p&gt;I appreciated the direct reference in the first comment to a website with a framework.  In general I’d love to talk to people who lay out documentation semi-professionally and learn more.&lt;/p&gt;

&lt;h2 id=&quot;functionality&quot;&gt;Functionality&lt;/h2&gt;

&lt;p&gt;Here is a soup of various feature requests, there are a few themes among them&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Have a better pandas support (like multi-index), which can help me migrate my existing code to Dask.&lt;/p&gt;

  &lt;p&gt;I’d like to see better support for actors. I think having a remote object is a common use case.&lt;/p&gt;

  &lt;p&gt;Improve Dataframes - multi index!! More feature parity with Pandas API.&lt;/p&gt;

  &lt;p&gt;Maybe a little less machine learning, more “classical” big data applications (CDF, PDEs, particle physics etc.). Not everything is map-reducable.&lt;/p&gt;

  &lt;p&gt;Better database integration. Re-writing an SQL query in SQL Alchemy can be very impractical. Would also be great if there were better ways to ensure the process didn’t die from misjudging how much memory was needed per chunk.&lt;/p&gt;

  &lt;p&gt;Better diagnostic tools; what operations are bottlenecking a task graph? Support for multiindex.&lt;/p&gt;

  &lt;p&gt;I do work that regularly requires sorting a DataFrame by multiple columns. Pandas can do this single-core; H2O and Spark can do this multicore and distributed. But dask cannot sort_values() on multiple columns at all (such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df.sort_values([ &quot;col1&quot;, &quot;col2&quot; ,&quot;col3&quot; ], ascending=False)&lt;/code&gt;).&lt;/p&gt;

  &lt;p&gt;Type-hints! It is very tedious using Dask in a huge ML-Application without even having the option to do some static type-checking.&lt;/p&gt;

  &lt;p&gt;Additionally it is very frustrating that Dask tries to mimic Pandas API, but then 40% of the API doesn’t work (isn’t implemented), or deviates so far from the Pandas API that some parameters aren’t implemented. Only way to find out about that is to read the docs. With some typehints one could mitigate much of this trial-and-error process when switching from Pandas to Dask.&lt;/p&gt;

  &lt;p&gt;It’s hard to track everything around dask!!! Actors are a bit unloved, but I find them super useful&lt;/p&gt;

  &lt;p&gt;Type annotations for all methods for better IDE (VSCode) support&lt;/p&gt;

  &lt;p&gt;I think the Actor model could use a little love&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;response-2&quot;&gt;Response&lt;/h3&gt;

&lt;p&gt;Interesting trends, not many that I would have expected&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;MultiIndex (well, this was expected)&lt;/li&gt;
  &lt;li&gt;Actors&lt;/li&gt;
  &lt;li&gt;Type hinting for IDE support&lt;/li&gt;
  &lt;li&gt;SQL access&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;high-level-optimization&quot;&gt;High Level Optimization&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Needs better physical data independence. Manual data chunking, memory management, query optimization are all a big hassle. Automate those more.&lt;/p&gt;

  &lt;p&gt;Dask makes it easy for users with no parallel computing experience to scale up quickly (me), but we have no sense of how to judge our resource needs. It’d be great if Dask had some tools or tutorials that helped me judge the size of my problem (e.g. memory usage). These may already exist, but examples of how to do it may be hard to find.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;runtime-stability-and-advanced-troubleshooting&quot;&gt;Runtime Stability and Advanced Troubleshooting&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Stability is the most important factor&lt;/p&gt;

  &lt;p&gt;I have answered no to the Long Term Support version of dask but often the really great opportunities are those that arre on demand. The problem is that when these fixes are released, their not well advertised and something under the hood has changed. So, it ends up breaking something else or my particular knowledge of the workings are no longer correct. Dask maintainers have a bit of a weird clique and it can feel as a newbie or a learner that your talked down to or in reality. They don’t have the time to help someone. So they should probably have some more maintainers answering some of the more mundane questions via the blog or via some other method, Things we have seen people do wrong or having difficulty in . A bit of basic, a bit of intermediate and a bit of advanced. If the underlying dask API has changed, then these should be updated with new posts with updates of what has changed. Showing a breakdown of doing it the hard way. So people can see what is done step by step with standard workflows that work. Then vs dask, with less boilerplate and/or speed improvement. If there are places where speed isn’t improved. Show that the difference of where it doesnt work alongside the workflow where it might.&lt;/p&gt;

  &lt;p&gt;We have long deployed dask clusters (weeks to months) and have noticed that they sometimes go into a wonky state. We’ve been unable to identify root cause(s). Redeployment is simple and easy when it does occur, but slightly annoying nonetheless.&lt;/p&gt;

  &lt;p&gt;My biggest pain point is the scheduler, as I tend to spend time writing infrastructure to manage the scheduler and breaking apart / rewriting tasks graphs to minimize impact on the scheduler.&lt;/p&gt;

  &lt;p&gt;As my answers make clear (and from previous conversations with Matt, James, and Genevieve) the biggest improvement I’d like to see is stable releases. Stable from both a runtime point of view (i.e. rock solid Dask distributed), and from an API point of view (so I don’t have to fix my code every couple of weeks). So a big +1 to LTS releases.&lt;/p&gt;

  &lt;p&gt;Better error handling/descriptions of errors, better interoperability between (slightly) different versions&lt;/p&gt;

  &lt;p&gt;If something goes wrong (in Dask, the batch system, or the interaction between Dask and the batch system), the problem is very opaque and difficult to diagnose. Dask needs significant additional documentation, and probably additional features, to make debugging easier and more transparent.&lt;/p&gt;

  &lt;p&gt;Better ways of getting out logs of worker memory usage, especially after dask crashes/failures. Ways of getting performance reports written to log files, rather than html files which don’t write if the dask client process fails.&lt;/p&gt;

  &lt;p&gt;Two big problems for me are when dask fails determining what when wrong and how to fix it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;response-3&quot;&gt;Response&lt;/h3&gt;

&lt;p&gt;Stability definitely took a dive last December.  I’m feeling good right now though.  There is a lot of good work that should be merged in and released in the next few weeks that I think will significantly improve many of the common pain points.&lt;/p&gt;

&lt;p&gt;However, there are still many significant improvements yet to be made.  I in particular like the theme above in reporting and logging when things fail.  We’re ok at this today, but there is a lot of room for growth.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next?&lt;/h2&gt;

&lt;p&gt;Do the views above fully express your thoughts on where Dask should go, or is there something missing?&lt;/p&gt;

&lt;p&gt;Share your perspective at &lt;a href=&quot;https://dask.org/survey&quot;&gt;&lt;strong&gt;dask.org/survey&lt;/strong&gt;&lt;/a&gt;.  The whole process should take less than five minutes.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>The evolution of a Dask Distributed user</title>
   <link href="https://blog.dask.org/2021/06/01/dask-distributed-user-journey"/>
   <updated>2021-06-01T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/06/01/dask-distributed-user-journey</id>
   
   <category>Distributed</category>
   
   <category>Tools</category>
   
   <category>Organisations</category>
   
   <content type="html">
&lt;p&gt;This week was the 2021 Dask Summit and &lt;a href=&quot;https://summit.dask.org/schedule/presentation/20/deploying-dask/&quot;&gt;one of the workshops&lt;/a&gt; that we ran covered many deployment options for Dask Distributed.&lt;/p&gt;

&lt;p&gt;We covered local deployments, SSH, Hadoop, Kubernetes, the Cloud and managed services, but one question that came up a few times was “where do I start?”.&lt;/p&gt;

&lt;p&gt;I wanted to share the journey that I’ve seen many Dask users take in the hopes that you may recognize yourself as being somewhere along this path and it may inform you where to look next.&lt;/p&gt;

&lt;h2 id=&quot;in-the-beginning&quot;&gt;In the beginning&lt;/h2&gt;

&lt;p&gt;As a user who is new to Dask you’re likely working your way through &lt;a href=&quot;https://docs.dask.org/en/latest/index.html&quot;&gt;the documentation&lt;/a&gt; or perhaps &lt;a href=&quot;https://github.com/dask/dask-tutorial&quot;&gt;a tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We often introduce the concept of the distributed scheduler early on, but you don’t need it to get initial benefits from Dask. Switching from Pandas to Dask for larger than memory datasets is a common entry point and performs perfectly well using the default threaded scheduler.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Switching from this
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/.../2018-*-*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;account_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# To this
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/.../2018-*-*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;account_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But by the time you’re a few pages into the documentation you’re already being encouraged to create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client()&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCluster()&lt;/code&gt; objects.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;: When you create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client()&lt;/code&gt; with no arguments/config set Dask will launch a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCluster()&lt;/code&gt; object for you under the hood. So often &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client()&lt;/code&gt; is equivalent to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client(LocalCluster())&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a common area for users to stick around in, launch a local distributed scheduler and do your work maximising the resources on your local machine.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/data/.../2018-*-*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;account_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;breaking-free-from-your-machine&quot;&gt;Breaking free from your machine&lt;/h2&gt;

&lt;p&gt;Once you get used to task graphs and work scheduling you may begin thinking about how you can expand your computation beyond your local machine.&lt;/p&gt;

&lt;p&gt;Our code doesn’t really need to change much, we are already connecting a client and doing Dask work, all we need are more networked machines with the same user environments, data, etc.&lt;/p&gt;

&lt;p&gt;Personally I used to work in an organisation where every researcher was given a Linux desktop under their desk. These machines were on a LAN and had Active Directory and user home directories stored on a storage server. This meant you could sit down at any desk and log in and have a consistent experience. This also meant you could SSH to another machine on the network and your home directory would be there with all your files including your data and conda environments.&lt;/p&gt;

&lt;p&gt;This is a common setup in many organisations and it can be tempting to SSH onto the machines of folks who may not be fully utilising their machine and run your work there. And I’m sure you ask first right!&lt;/p&gt;

&lt;p&gt;Organisations may also have servers in racks designated for computational use and the setup will be similar. You can SSH onto them and home directories and data are available via network storage.&lt;/p&gt;

&lt;p&gt;With Dask Distributed you can start to expand your workload onto these machines using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSHCluster&lt;/code&gt;. All you need is your SSH keys set up so you can log into those machines without a password.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;localhost&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;alices-desktop.lan&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;bobs-desktop.lan&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;team-server.lan&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/data/.../2018-*-*.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;account_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now the same workload can run on all of the CPUs in our little ad-hoc cluster, using all the memory and pulling data from the same shared storage.&lt;/p&gt;

&lt;h2 id=&quot;moving-to-a-compute-platform&quot;&gt;Moving to a compute platform&lt;/h2&gt;

&lt;p&gt;Using (and abusing) hardware like desktops and shared servers will get you reasonably far, but probably to the dismay of your IT team.&lt;/p&gt;

&lt;p&gt;Organisations who have many users trying to perform large compute workloads will probably be thinking about or already have some kind of platform that is designated for running this work.&lt;/p&gt;

&lt;p&gt;The platforms your organisation has will be the result of many somewhat arbitrary technology choices. What programming languages does your company use? What deals did vendors offer at the time of procurement? What skills do the current IT staff have? What did your CTO have for breakfast the day they chose a vendor?&lt;/p&gt;

&lt;p&gt;I’m not saying these decisions are made thoughtlessly, but the criteria that are considered are often orthogonal to how the resource will ultimately be used by you. At Dask we support whatever platform decisions your organisations make. We try to build deployment tools for as many popular platforms as we can including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hadoop via &lt;a href=&quot;https://github.com/dask/dask-yarn&quot;&gt;dask-yarn&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kubernetes via &lt;a href=&quot;https://github.com/dask/dask-kubernetes&quot;&gt;dask-kubernetes&lt;/a&gt; and the &lt;a href=&quot;https://github.com/dask/helm-chart&quot;&gt;helm chart&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;HPC (with schedulers like SLURM, PBS and SGE) via &lt;a href=&quot;https://github.com/dask/dask-jobqueue&quot;&gt;dask-jobqueue&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Cloud platforms (including AWS, Azure and GCP) with &lt;a href=&quot;https://github.com/dask/dask-cloudprovider&quot;&gt;dask-cloudprovider&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a user within an organisations you may have been onboarded to one of these platforms. You’ve probably been given some credentials and a little training on how to launch jobs on it.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-foo&lt;/code&gt; tools listed above are designed to sit on top of those platforms and submit jobs on your behalf as if they were individual compute jobs. But instead of submitting a Python script to the platform we submit Dask schedulers and workers and then connect to them to leverage the provisioned resource. Clusters on top of clusters.&lt;/p&gt;

&lt;p&gt;With this approach your IT team has full control over the compute resource. They can ensure folks get their fair share with quotas and queues. But you as a user gets the same Dask experience you are used to on your local machine.&lt;/p&gt;

&lt;p&gt;Your data may be in a slightly different place on these platforms though. Perhaps you are on the cloud and your data is in object storage for example. Thankfully we have tools built on &lt;a href=&quot;https://filesystem-spec.readthedocs.io/en/latest/&quot;&gt;fsspec&lt;/a&gt; like &lt;a href=&quot;https://github.com/dask/s3fs&quot;&gt;s3fs&lt;/a&gt; or &lt;a href=&quot;https://pypi.org/project/adlfs/&quot;&gt;adlfs&lt;/a&gt; we can read this data in pretty much the same way. So still not much change to your workflow.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cloudprovider.azure&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AzureVMCluster&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AzureVMCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resource_group&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&amp;lt;resource group&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                         &lt;span class=&quot;n&quot;&gt;vnet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&amp;lt;vnet&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                         &lt;span class=&quot;n&quot;&gt;security_group&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&amp;lt;security group&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                         &lt;span class=&quot;n&quot;&gt;n_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;adl://.../2018-*-*.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;account_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;centralizing-your-dask-resources&quot;&gt;Centralizing your Dask resources&lt;/h2&gt;

&lt;p&gt;When your organisation gets enough folks adopting and using Dask it may be time for your IT team to step in and provide you with a managed service. Having many users submitting many ad-hoc clusters in a myriad of ways is likely to be less efficient than a centrally managed and more importantly ordained service from IT.&lt;/p&gt;

&lt;p&gt;The motivation to move to a managed service is often driven at the organisational level rather than by individuals. Once you’ve reached this stage of Dask usage you’re probably quite comfortable with your workflows and it may be inconvenient to change them. However the level of Dask deployment knowledge you’ve acquired to reach this stage is probably quite large, and as Dask usage at your organization grows it’s not practical to expect everyone to reach the same level of competency.&lt;/p&gt;

&lt;p&gt;At the end of the day being an expert in deploying distributed systems is probably not listed in your job description and you probably have something more important to be getting on with like data science, finance, physics, biology or whatever it is Dask is helping you do.&lt;/p&gt;

&lt;p&gt;You may also be feeling some pressure from IT. You are running clusters on top of clusters and to them your Dask cluster is a black box and this can make them comfortable as they are the ones responsible for this hardware. It is common to feel constrained by your IT team, I know because I’ve been a sysadmin and used to constrain folks. But the motivations of your IT team are good ones, they are trying to save the organisation money, make best use of limited resources and ultimately get the IT out of your way so that you can get on with your job. So lean into this, engage with them, share your Dask knowledge and offer to become a pilot user for whatever solution they end up building.&lt;/p&gt;

&lt;p&gt;One approach you could recommend they take is to deploy &lt;a href=&quot;https://gateway.dask.org/&quot;&gt;Dask Gateway&lt;/a&gt;. This can be deployed by an administrator and provides a central hub which launches Dask clusters on behalf of users. It supports many types of authentication so it can hook into whatever your organisation uses and supports many of the same backend compute platforms that the standalone tools do, including Kubernetes, Hadoop and HPC.&lt;/p&gt;

&lt;p&gt;This will allow them to ensure security settings are correct and consistent across clusters. If you are using containers they probably want you to use some official images which are regularly updated and vulnerability scanned. It may also give them more insight into what types of workloads folks are running and plan future systems more accurately. By using Dask Gateway this puts the control and responsibility of these things onto their side of the fence.&lt;/p&gt;

&lt;p&gt;Users will need to authenticate with the gateway, but then can launch Dask clusters in a platform agnostic way.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_gateway&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gateway&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gateway&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Gateway&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://daskgateway.myorg.com&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;auth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;kerberos&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gateway&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new_cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/data/.../2018-*-*.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;account_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;balance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Again reading your data requires some knowledge on how it is stored on the underlying compute platform you the gateway is using, but the changes required are minimal.&lt;/p&gt;

&lt;h2 id=&quot;managed-services&quot;&gt;Managed services&lt;/h2&gt;

&lt;p&gt;If your organisation is too small to have an IT team to manage this for you, or you just have a preference for managed services, there are startups popping up to provide this to you as a service including &lt;a href=&quot;https://coiled.io/&quot;&gt;Coiled&lt;/a&gt; and &lt;a href=&quot;https://www.saturncloud.io/s/home/&quot;&gt;Saturn Cloud&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;future-platforms&quot;&gt;Future platforms&lt;/h2&gt;

&lt;p&gt;Today the large cloud vendors have managed data science platforms including &lt;a href=&quot;https://aws.amazon.com/sagemaker/&quot;&gt;AWS Sagemaker&lt;/a&gt;, &lt;a href=&quot;https://azure.microsoft.com/en-gb/services/machine-learning/&quot;&gt;Azure Machine Learning&lt;/a&gt; and &lt;a href=&quot;https://cloud.google.com/vertex-ai&quot;&gt;Google Cloud AI Platform&lt;/a&gt;. But these do not include Dask as a service.&lt;/p&gt;

&lt;p&gt;These cloud services are focussed on batch processing and machine learning today, but these clouds also have managed services for Spark and other compute cluster offerings. With Dask’s increasing popularity it wouldn’t surprise me if managed Dask services are released by these cloud vendors in the years to follow.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;One of the most powerful features of Dask is that your code can stay pretty much the same regardless of how big or complex the distributed compute cluster is. It scales from a single machine to thousands of servers with ease.&lt;/p&gt;

&lt;p&gt;But scaling up requires both user and organisational growth and folks already seem to be treading a common path on that journey.&lt;/p&gt;

&lt;p&gt;Hopefully this post will give you an idea of where you are on that path and where to jump to next. Whether you’re new to the community and discovering the power of multi-core computing or an old hand who is trying to wrangle hundreds of users who all love Dask, good luck!&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>The 2021 Dask User Survey is out now</title>
   <link href="https://blog.dask.org/2021/05/25/user-survey"/>
   <updated>2021-05-25T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/05/25/user-survey</id>
   
   <category>User Survey</category>
   
   <content type="html">
&lt;p&gt;The Dask User Survey is out again! Tell us how you use Dask, and help us make it better for everyone.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://forms.gle/F7QSGpSHwBWu8NCg8&quot;&gt;Click this link to take the survey&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;why-take-the-survey&quot;&gt;Why take the survey?&lt;/h2&gt;

&lt;p&gt;Feedback from users is very important. It helps give us a clear picture who our users are and what is important to them. Your responses will inform prioritization for Dask development and improve the experience for the Dask community.&lt;/p&gt;

&lt;p&gt;We expect the survey to take no more than 5-10 minutes. It has the following short sections:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;How do you use Dask?&lt;/li&gt;
  &lt;li&gt;How could Dask improve?&lt;/li&gt;
  &lt;li&gt;What other tools do you use with Dask?&lt;/li&gt;
  &lt;li&gt;Optional: What do you work on?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;survey-results-from-previous-years&quot;&gt;Survey results from previous years&lt;/h2&gt;

&lt;p&gt;We will also publish answers to non-sensitive questions in our annual survey review to help keep everyone informed.&lt;/p&gt;

&lt;p&gt;You can see the results from previous user surveys here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2020/09/22/user_survey&quot;&gt;2020 Dask User Survey Results&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2019/08/05/user-survey&quot;&gt;2019 Dask User Survey Results&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Life sciences at the 2021 Dask Summit</title>
   <link href="https://blog.dask.org/2021/05/24/life-science-summit-workshop"/>
   <updated>2021-05-24T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/05/24/life-science-summit-workshop</id>
   
   <category>Dask Summit</category>
   
   <category>life science</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;The Dask life science workshop ran as part of the 2021 Dask Summit. Lightning talks from this workshop are &lt;a href=&quot;https://www.youtube.com/playlist?list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&quot;&gt;available here&lt;/a&gt;, and you can read on for a summary of the event.&lt;/p&gt;

&lt;h2 id=&quot;what-is-the-dask-life-science-workshop&quot;&gt;What is the Dask life science workshop?&lt;/h2&gt;

&lt;p&gt;The Dask life science workshop ran as part of the 2021 Dask Summit. Currently many people in life sciences use Dask, but individual groups are relatively isolated from one another. This workshop gave us an opportunity to learn from each other, as well as opportunities to identify common frustrations and areas for improvement.&lt;/p&gt;

&lt;p&gt;The workshop involved:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pre-recorded lightning talks&lt;/li&gt;
  &lt;li&gt;Interactive discussion times (accessible across timezones in Europe, Oceania, and the Americas)&lt;/li&gt;
  &lt;li&gt;Asynchronous text chat throughout the Dask Summit&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;if-i-missed-it-how-can-i-catch-up&quot;&gt;If I missed it, how can I catch up?&lt;/h2&gt;

&lt;p&gt;If you missed the Dask Summit, you can catch up on YouTube.
There is a playlist of all the life science lightning talks &lt;a href=&quot;https://www.youtube.com/playlist?list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&quot;&gt;available here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also join our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#life-science&lt;/code&gt; channel on Slack:
&lt;a href=&quot;https://join.slack.com/t/dask/shared_invite/zt-mfmh7quc-nIrXL6ocgiUH2haLYA914g&quot;&gt;Click here for an invitation link&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;who-came&quot;&gt;Who came?&lt;/h2&gt;

&lt;p&gt;We invited attendees at the life science workshop to do a short Q&amp;amp;A about their work with Dask. This is a small subset of the people who joined us, many people came to the conference and did not do a Q&amp;amp;A.&lt;/p&gt;

&lt;p&gt;The responses give us an overview of the diversity of work people in the community are doing. In no particular order, here are some of those Q&amp;amp;As:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Tom White&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; EU/UK&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; Statistical genetics&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask?&lt;/strong&gt; Run per-row linear regressions at scale.&lt;br /&gt;
&lt;strong&gt;What do you want to do next with Dask?&lt;/strong&gt; Collaborative optimization of a public workflow (GWAS).&lt;br /&gt;
&lt;strong&gt;Lightning talk:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=qt6YsHoPpZs&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&amp;amp;index=2&quot;&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Giovanni Palla&lt;br /&gt;
&lt;strong&gt;Affiliation:&lt;/strong&gt; Helmholtz Center Munich&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; Europe&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; Computational Biology and Spatial transcriptomics&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask?&lt;/strong&gt; &lt;a href=&quot;http://image.dask.org/en/latest/&quot;&gt;dask-image&lt;/a&gt; for image processing.&lt;br /&gt;
**What do you want to do next with Dask? Further integration with &lt;a href=&quot;https://squidpy.readthedocs.io/en/latest/&quot;&gt;Squidpy&lt;/a&gt;.&lt;br /&gt;
**Lightning talk:** &lt;a href=&quot;https://www.youtube.com/watch?v=sGr7O8spfvE&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&amp;amp;index=8&quot;&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Isaac Virshup&lt;br /&gt;
&lt;strong&gt;Affiliation:&lt;/strong&gt; University of Melbourne. Open source projects Scanpy and AnnData
&lt;strong&gt;Timezone:&lt;/strong&gt; AEST&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; Single cell omics data.&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask?&lt;/strong&gt;&lt;br /&gt;
I’ve used dask for some nested embarrassingly parallel calculations. Having an intelligent scheduler with good monitoring made this task as easy as it should be, especially compared with multiprocessing or joblib.&lt;br /&gt;
&lt;strong&gt;What do you want to do next with Dask?&lt;/strong&gt;&lt;br /&gt;
I would love to get AnnData, a container for working with single cell assays integrated with dask. Dataset sizes in this field are constantly increasing, and it would be good to be able to work with the coolest new dataset regardless of available RAM.&lt;br /&gt;
Since we rely heavily on sparse arrays, a key step towards this will be getting better sparse array support (CSC and CSR especially) inside dask. After all, it’s not great if our strategy for scaling out requires many times the total memory! As a maintainer, I’m interested in hearing people’s experience with distributing tools that integrate well with dask.&lt;br /&gt;
&lt;strong&gt;Lightning talk:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=e8pWpRo5Ars&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&amp;amp;index=14&quot;&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Anna Kreshuk&lt;br /&gt;
&lt;strong&gt;Affiliation:&lt;/strong&gt; European Molecular Biology Laboratory&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; CEST (GMT+2)&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; Machine learning for microscopy image analysis.&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask?&lt;/strong&gt; We run a lot of image processing workflows and want to see how Dask can be exploited in this context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Beth Cimini&lt;br /&gt;
&lt;strong&gt;Affiliation:&lt;/strong&gt; Broad Institute&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; US-East&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; User friendly image analysis tools for microscopy imaging.&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask?&lt;/strong&gt; Making Dask work in CellProfiler, to make it easy to analyze big images in high throughput!&lt;br /&gt;
&lt;strong&gt;Lightning talk:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/playlist?list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&quot;&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Volker Hilsenstein&lt;br /&gt;
&lt;strong&gt;Affiliation:&lt;/strong&gt; EMBL / Alexandrov lab&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; Central European Summer Time&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; Spatial Metabolomics, combining microscopy and mass spectrometry.&lt;br /&gt;
&lt;strong&gt;Something I would like to try with dask:&lt;/strong&gt; fusing large mosaics of individual images or image volumes for which affine transformation into a joint coordinate system are available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Marvin Albert&lt;br /&gt;
&lt;strong&gt;Affiliation:&lt;/strong&gt; University of Zurich&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; UTC/GMT +2&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; Life sciences / image analysis&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask? What do you want to do next with Dask?&lt;/strong&gt; Parallelise / reduce the memory footprint of image processing tasks and define workflows that can run on different compute environments.&lt;br /&gt;
&lt;strong&gt;Lightning talk:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=YIblUvonMvo&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&amp;amp;index=9&quot;&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Jordao Bragantini&lt;br /&gt;
&lt;strong&gt;Affiliation:&lt;/strong&gt; CZ Biohub&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; Pacific Daylight Time (UTC -7)&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; Light-sheet microscopy&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask?&lt;/strong&gt; Image processing of very large data.&lt;br /&gt;
&lt;strong&gt;What do you want to do next with Dask?&lt;/strong&gt; Implement algorithms for cell segmentation.&lt;br /&gt;
&lt;strong&gt;Lightning talk:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=xadb-oXMFKI&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&amp;amp;index=3&quot;&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Josh Moore&lt;br /&gt;
&lt;strong&gt;Affiliation:&lt;/strong&gt; Open Microscopy Environment (OME)&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; CEST&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; Bioimaging (infrastructure for RDM)&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask?&lt;/strong&gt; Accessing large image (Zarr) volumes over HTTP, primarily.
What do you want to do next with Dask? Improve pre-fetching for typical usage patterns, possibly integrating multiscale data (i.e. google maps zooming)&lt;br /&gt;
&lt;strong&gt;Lightning talk:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=6PerbQhcupM&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&amp;amp;index=1&quot;&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Jackson Maxfield Brown&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; PST&lt;br /&gt;
&lt;strong&gt;What kind of science do you work in?&lt;/strong&gt; Cell biology, specifically microscopy and computational biology.&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask?&lt;/strong&gt; Built a metadata aware / backed microscopy imaging reading library that uses Dask to read any size image w/ chunking by metadata dimension information. As well as TB-scale image processing pipelines using Dask + Prefect.&lt;br /&gt;
&lt;strong&gt;What do you want to do next with Dask?&lt;/strong&gt; Tighter integration with other libraries. I see cuCim from the RAPIDs team and would love to extend work with them to have a more general “bio-image-spec” so we can all play nicely together.&lt;br /&gt;
&lt;strong&gt;Lightning talk:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=LNa_gGpSnvc&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&amp;amp;index=8&quot;&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; Gregory R. Lee&lt;br /&gt;
&lt;strong&gt;Affiliation:&lt;/strong&gt; Quansight&lt;br /&gt;
&lt;strong&gt;Timezone:&lt;/strong&gt; EST (UTC-5)&lt;br /&gt;
&lt;strong&gt;What kind of science do you work on?&lt;/strong&gt; Scientific software development (with a background doing research in magnetic resonance imaging).&lt;br /&gt;
&lt;strong&gt;Something you’ve tried (or would like to try) with Dask?&lt;/strong&gt;&lt;br /&gt;
In past research work, I used Dask primarily in two scenarios, both on a single workstation:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;To achieve multi-threading by processing image blocks in parallel on the CPU (e.g. like in dask-image)&lt;/li&gt;
  &lt;li&gt;Serial blockwise processing of large volumetric data on the GPU (i.e. CuPy arrays of 10-100 GB in size) to reduce peak memory requirements.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What do you want to do next with Dask?&lt;/strong&gt;&lt;br /&gt;
Audit scikit-image functions to determine which can easily be accelerated using block-wise approaches as in dask-image. Ideally a subset of functions would work directly with dask-arrays as inputs rather than requiring users to learn about Dask’s map_overlap, etc. to use this feature.&lt;br /&gt;
&lt;strong&gt;Lightning talk:&lt;/strong&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=vPorCnEhM6g&amp;amp;list=PLJ0vO2F_f6OBAY6hjRHM_mIQ9yh32mWr0&amp;amp;index=16&quot;&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;Dask is now considering holding “office hours” for the life science community. If we can find enough maintainers able to host one-hour Q&amp;amp;A sessions, then we’ll trial this for a short period of time.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Stability of the Dask library</title>
   <link href="https://blog.dask.org/2021/05/21/stability"/>
   <updated>2021-05-21T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/05/21/stability</id>
   
   <content type="html">
&lt;p&gt;Dask is moving fast these days. Sometimes we break things as a result.&lt;/p&gt;

&lt;p&gt;Historically this hasn’t been a problem, according to our survey last year
most users were fairly happy with Dask’s stability.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020_survey/2020_27_0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;However the last year has seen a lot of evolution of the project,
which in turn causes code churn.
This can cause friction for downstream users today,
but also means more-than-incremental changes for the future.
We’ve optimized a little bit for long-term growth over short-term stability.&lt;/p&gt;

&lt;h3 id=&quot;motivation-for-change&quot;&gt;Motivation for change&lt;/h3&gt;

&lt;p&gt;There are two structural things driving some of these changes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;An increase in computational scale&lt;/li&gt;
  &lt;li&gt;An increase in organizational scale&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;computational-scale&quot;&gt;Computational Scale&lt;/h3&gt;

&lt;p&gt;Dask today is used across a wider range of problems,
a more diverse set of hardware,
and at larger scales more routinely than before.&lt;/p&gt;

&lt;p&gt;Addressing this increase in scale across many dimensions has caused us to
redesign Dask’s internal infrastructure in several ways.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We’ve changed how Dask graphs are represented and communicated to the scheduler&lt;/li&gt;
  &lt;li&gt;We’ve pulled out Dask’s internal state machines and made them more formalized&lt;/li&gt;
  &lt;li&gt;We’ve rewritten large chunks of the scheduler in Cython&lt;/li&gt;
  &lt;li&gt;We’ve overhauled how we serialize messages that go between all Dask servers&lt;/li&gt;
  &lt;li&gt;We’re now tracking memory with much finer granularity than we did before&lt;/li&gt;
  &lt;li&gt;… and more&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’ve been doing all of these internal changes with minimal impact to the
myriad of downstream user communities (Xarray, Prefect, RAPIDS, XGBoost, …).
This is largely due to those downstream developer communities,
who help to identify, isolate, and work through the subtle tremors that occur
on the surface when we make these subsurface shifts.&lt;/p&gt;

&lt;h3 id=&quot;organizational-scale&quot;&gt;Organizational scale&lt;/h3&gt;

&lt;p&gt;Historically Dask’s core was maintained by a relatively small set of people,
mostly at Anaconda.
There were dozens of developers that worked on various &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-foo&lt;/code&gt; projects, but
only a small group that thought about things like serialization, state
machines, and so on.
In particular I personally tracked every issue and knew the entire project.
Whenever a potential conflict arose I was usually able to identify it early.&lt;/p&gt;

&lt;p&gt;This has all changed dramatically.&lt;/p&gt;

&lt;p&gt;First, there are now several multi-company teams working on different parts of
Dask internals.&lt;/p&gt;

&lt;p&gt;Second, we’ve also taken some time to redesign parts of Dask internals to make them more maintainable.
Dask scheduling is like a finely made clock.
Historically parts of that clock were built and designed by individuals with a craftsman-like approach.
Now we’re redesigning things with more of a group mindset.
This results in more maintainable designs,
but it also means that we’re taking apart the clock and putting it back together.
It takes a little while to find all of the missing parts :)&lt;/p&gt;

&lt;h3 id=&quot;how-this-affects-you-today&quot;&gt;How this affects you today&lt;/h3&gt;

&lt;p&gt;This all started around when we switched to Calendar Versioning at the end of last year
(Dask version &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2.30.1&lt;/code&gt; rolled over into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2020.12.0&lt;/code&gt; last December). You may
have noticed&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;an increased sensitivity to version mismatches (as we change the Dask
protocol different versions of Dask can no longer talk to each other well)&lt;/li&gt;
  &lt;li&gt;releases with stability issues (2020.12 was particularly rough)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/community/issues/155&quot;&gt;tighter pinning&lt;/a&gt; between dask and distributed versions during releases&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;how-this-will-affect-you&quot;&gt;How this will affect you&lt;/h3&gt;

&lt;p&gt;We’ve merged in a &lt;a href=&quot;https://github.com/dask/dask/pull/7620&quot;&gt;PR&lt;/a&gt;
to change the default behavior when moving &lt;a href=&quot;https://docs.dask.org/en/latest/high-level-graphs.html&quot;&gt;high level graphs&lt;/a&gt;
to the scheduler for Dask Dataframes. This should result in much
less delay when submitting large computations and almost no delay in
optimization. It also opens up a conduit for us to send &lt;em&gt;a lot&lt;/em&gt; more semantic
information to the scheduler about your computation, which can result in new
visualizations and smarter scheduling in the future.&lt;/p&gt;

&lt;p&gt;It will also probably break some things.&lt;/p&gt;

&lt;p&gt;To be clear, all tests pass among Dask, distributed, xarray, prefect, rapids,
and other downstream projects. We’ve done our homework here, but almost certainly we’ve missed something.&lt;/p&gt;

&lt;p&gt;This is only one of several larger changes happening in the coming months.
We appreciate your patience and your engagement as we make some of these larger shifts.
For better or worse end users are the final testing suite :)&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Skeleton analysis</title>
   <link href="https://blog.dask.org/2021/05/07/skeleton-analysis"/>
   <updated>2021-05-07T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/05/07/skeleton-analysis</id>
   
   <category>imaging</category>
   
   <category>life science</category>
   
   <category>skan</category>
   
   <category>skeleton analysis</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;In this blogpost, we show how to modify a skeleton network analysis with Dask to work with constrained RAM (eg: on your laptop). This makes it more accessible: it can run on a small laptop, instead of requiring access to a supercomputing cluster. Example code is also &lt;a href=&quot;https://github.com/GenevieveBuckley/distributed-skeleton-analysis/blob/main/distributed-skeleton-analysis-with-dask.ipynb&quot;&gt;provided here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#skeleton-structures-are-everywhere&quot;&gt;Skeleton structures are everywhere&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#the-scientific-problem&quot;&gt;The scientific problem&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#the-compute-problem&quot;&gt;The compute problem&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#our-approach&quot;&gt;Our approach&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#results&quot;&gt;Results&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#limitations&quot;&gt;Limitations&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#problems-encountered&quot;&gt;Problems encountered&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#how-we-solved-them&quot;&gt;How we solved them&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#problem-1-the-skeletonize-function-from-scikit-image-crashes-due-to-lack-of-ram&quot;&gt;Problem 1: The skeletonize function from scikit-image crashes due to lack of RAM&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#problem-2-ragged-or-non-uniform-output-from-dask-array-chunks&quot;&gt;Problem 2: Ragged or non-uniform output from Dask array chunks&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#problem-3-grabbing-the-image-chunks-with-an-overlap&quot;&gt;Problem 3: Grabbing the image chunks with an overlap&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#problem-4-summary-statistics-with-skan&quot;&gt;Problem 4: Summary statistics with skan&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#what&apos;s-next&quot;&gt;What’s next&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#how-you-can-help&quot;&gt;How you can help&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;skeleton-structures-are-everywhere&quot;&gt;Skeleton structures are everywhere&lt;/h2&gt;

&lt;p&gt;Lots of biological structures have a skeleton or network-like shape. We see these in all kinds of places, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;blood vessel branching&lt;/li&gt;
  &lt;li&gt;the branching of airways&lt;/li&gt;
  &lt;li&gt;neuron networks in the brain&lt;/li&gt;
  &lt;li&gt;the root structure of plants&lt;/li&gt;
  &lt;li&gt;the capillaries in leaves&lt;/li&gt;
  &lt;li&gt;… and many more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Analysing the structure of these skeletons can give us important information about the biology of that system.&lt;/p&gt;

&lt;h2 id=&quot;the-scientific-problem&quot;&gt;The scientific problem&lt;/h2&gt;

&lt;p&gt;For this bogpost, we will look at the blood vessels inside of a lung. This data was shared with us by &lt;a href=&quot;https://research.monash.edu/en/persons/marcus-kitchen&quot;&gt;Marcus Kitchen&lt;/a&gt;, &lt;a href=&quot;https://hudson.org.au/researcher-profile/andrew-stainsby/&quot;&gt;Andrew Stainsby&lt;/a&gt;, and their team of collaborators.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/skeleton-analysis/skeleton-screenshot-crop.jpg&quot; alt=&quot;Skeleton network of blood vessels within a healthy lung&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This research group focusses on lung development.
We want to compare the blood vessels in a healthy lung, against a lung from a hernia model. In the hernia model the lung is underdeveloped, squashed, and smaller.&lt;/p&gt;

&lt;h2 id=&quot;the-compute-problem&quot;&gt;The compute problem&lt;/h2&gt;

&lt;p&gt;These image volumes have a shape of roughtly 1000x1000x1000 pixels.
That doesn’t seem huge but given the high RAM consumption involved in processing the analysis, it crashes when running on a laptop.&lt;/p&gt;

&lt;p&gt;If you’re running out of RAM, there are two possible appoaches:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Get more RAM. Run things on a bigger computer, or move things to a supercomputing cluster. This has the advantage that you don’t need to rewrite your code, but it does require access to more powerful computer hardware.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Manage the RAM you’ve got. Dask is good for this. If we use Dask, and some reasonable chunking of our arrays, we can manage things so that we never hit the RAM ceiling and crash. This has the advantage that you don’t need to buy more computer hardware, but it will require re-writing some code.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;our-approach&quot;&gt;Our approach&lt;/h2&gt;

&lt;p&gt;We took the second approach, using Dask so we can run our analysis on a small laptop with constrained RAM without crashing. This makes it more accessible, to more people.&lt;/p&gt;

&lt;p&gt;All the image pre-processing steps will be done with &lt;a href=&quot;http://image.dask.org/en/latest/&quot;&gt;dask-image&lt;/a&gt;, and the &lt;a href=&quot;https://scikit-image.org/docs/dev/auto_examples/edges/plot_skeleton.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skeletonize&lt;/code&gt;&lt;/a&gt; function of &lt;a href=&quot;https://scikit-image.org/&quot;&gt;scikit-image&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We use &lt;a href=&quot;https://jni.github.io/skan/&quot;&gt;skan&lt;/a&gt; as the backbone of our analysis pipeline. &lt;a href=&quot;https://jni.github.io/skan/&quot;&gt;skan&lt;/a&gt; is a library for skeleton image analysis. Given a skeleton image, it can describe statistics of the branches. To make it fast, the library is accelerated with &lt;a href=&quot;https://numba.pydata.org/&quot;&gt;numba&lt;/a&gt; (if you’re curious, you can hear more about that in &lt;a href=&quot;https://www.youtube.com/watch?v=0pUPNMglnaE&quot;&gt;this talk&lt;/a&gt; and its &lt;a href=&quot;https://github.com/jni/skan-talk-scipy-2019&quot;&gt;related notebook&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;There is an example notebook containing the full details of the skeleton analysis &lt;a href=&quot;https://github.com/GenevieveBuckley/distributed-skeleton-analysis/blob/main/distributed-skeleton-analysis-with-dask.ipynb&quot;&gt;available here&lt;/a&gt;. You can read on to hear just the highlights.&lt;/p&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;The statistics from the blood vessel branches in the healthy and herniated lung shows clear differences between the two.&lt;/p&gt;

&lt;p&gt;Most striking is the difference in the number of blood vessel branches.
The herniated lung has less than 40% of the number of blood vessel branches in the healthy lung.&lt;/p&gt;

&lt;p&gt;There are also quantitative differences in the sizes of the blood vessels.
Here is a violin plot showing the distribution of the distances between the start and end points of each blood vessel branch. We can see that overall the blood vessel branches start and end closer together in the herniated lung. This is consistent with what we might expect, since the healthy lung is more well developed than the lung from the hernia model and the hernia has compressed that lung into a smaller overall space.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/skeleton-analysis/compare-euclidean-distance.png&quot; alt=&quot;Violin plot comparing blood vessel thickness between a healthy and herniated lung&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;EDIT: This blogpost previously described the euclidean distance violin plot as measuring the thickness of the blood vessels. This is incorrect, and the mistake was not caught in the review process before publication. This post has been updated to correctly describe the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;euclidean-distance&lt;/code&gt; measuremet as the distance between the start and end of branches, as if you pulled a string taught between those points. An alternative measurement, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;branch-length&lt;/code&gt; describes the total branch length, including any winding twists and turns.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;limitations&quot;&gt;Limitations&lt;/h2&gt;

&lt;p&gt;We rely on one big assumption: once skeletonized the reduced non-zero pixel data will fit into memory. While this holds true for datasets of this size (the cropped rabbit lung datasets are roughly 1000 x 1000 x 1000 pixels), it may not hold true for much larger data.&lt;/p&gt;

&lt;p&gt;Dask computation is also triggered at a few points through our prototype workflow. Ideally all computation would be delayed until the very final stage.&lt;/p&gt;

&lt;h2 id=&quot;problems-encountered&quot;&gt;Problems encountered&lt;/h2&gt;

&lt;p&gt;This project was originally intended to be a quick &amp;amp; easy one. Famous last words!&lt;/p&gt;

&lt;p&gt;What I wanted to do was to put the image data in a Dask array, and then use the &lt;a href=&quot;https://docs.dask.org/en/latest/array-overlap.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt;&lt;/a&gt; function to do the image filtering, thresholding, skeletonizing, and skeleton analysis. What I soon found was that although the image filtering, thresholding, and skeletonization worked well, the skeleton analysis step had some problems:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Dask’s map_overlap function doesn’t handle ragged or non-uniformly shaped results from different image chunks very well, and…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Internal function in the skan library were written in a way that was incompatible with distributed computation.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;how-we-solved-them&quot;&gt;How we solved them&lt;/h2&gt;

&lt;h3 id=&quot;problem-1-the-skeletonize-function-from-scikit-image-crashes-due-to-lack-of-ram&quot;&gt;Problem 1: The skeletonize function from scikit-image crashes due to lack of RAM&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;https://scikit-image.org/docs/dev/auto_examples/edges/plot_skeleton.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skeletonize&lt;/code&gt;&lt;/a&gt; function of &lt;a href=&quot;https://scikit-image.org/&quot;&gt;scikit-image&lt;/a&gt; is very memory intensive, and was crashing on a laptop with 16GB RAM.&lt;/p&gt;

&lt;p&gt;We solved this by:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Putting our image data into a Dask array with &lt;a href=&quot;http://image.dask.org/en/latest/dask_image.imread.html&quot;&gt;dask-image &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;imread&lt;/code&gt;&lt;/a&gt;,&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.dask.org/en/latest/array-chunks.html?highlight=rechunk#rechunking&quot;&gt;Rechunking&lt;/a&gt; the Dask array. We need to change the chunk shapes from 2D slices to small cuboid volumes, so the next step in the computation is efficient. We can choose the overall size of the chunks so that we can stay under the memory threshold needed for skeletonize.&lt;/li&gt;
  &lt;li&gt;Finally, we run the &lt;a href=&quot;https://scikit-image.org/docs/dev/auto_examples/edges/plot_skeleton.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skeletonize&lt;/code&gt; function&lt;/a&gt; on the Dask array chunks using the &lt;a href=&quot;https://docs.dask.org/en/latest/array-overlap.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt; function&lt;/a&gt;. By limiting the size of the array chunks, we stay under our memory threshold!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;problem-2-ragged-or-non-uniform-output-from-dask-array-chunks&quot;&gt;Problem 2: Ragged or non-uniform output from Dask array chunks&lt;/h3&gt;

&lt;p&gt;The skeleton analysis functions will return results with ragged or non-uniform length for each image chunk. This is unsurpising, because different chunks will have different numbers of non-zero pixels in our skeleton shape.&lt;/p&gt;

&lt;p&gt;When working with Dask arrays, there are two very commonly used functions: &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.map_blocks&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://docs.dask.org/en/latest/array-overlap.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt;&lt;/a&gt;. Here’s what happens when we try a function with ragged outputs with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; versus &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# our dummy analysis function
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random_length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt;, everything works well:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drop_axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# this works well
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But if we need some overlap for function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;foo&lt;/code&gt; to work correctly, then we run into problems:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drop_axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# incorrect results
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here, the first and last element of the results from foo are trimmed off before the results are concatenated, which we don’t want! Setting the keyword argument &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trim=False&lt;/code&gt; would help avoid this problem, except then we get an error:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drop_axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# ValueError
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Unfortunately for us, it’s really important to have a 1 pixel overlap in our array chunks, so that we can tell if a skeleton branch is ending or continuing on into the next chunk.&lt;/p&gt;

&lt;p&gt;There’s some complexity in the way &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt; results are concatenated back together so rather than diving into that, a more straightforward solution is to use &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;Dask delayed&lt;/a&gt; instead. &lt;a href=&quot;https://github.com/chrisroat&quot;&gt;Chris Roat&lt;/a&gt; shows a nice example of how we can use &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;Dask delayed&lt;/a&gt; in a list comprehension that is then concatenated with Dask (&lt;a href=&quot;https://github.com/dask/dask/issues/7589&quot;&gt;link to original discussion&lt;/a&gt;).&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Make each dataframe a different size
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;x&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                         &lt;span class=&quot;s&quot;&gt;&apos;y&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)})&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;utils&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;x&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;y&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;blocks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ravel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# no overlap
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; It’s very important to pass in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; keyword argument to the function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_delayed&lt;/code&gt;. Without it, things will be extremely inefficient!&lt;/p&gt;

&lt;p&gt;If the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; keyword argument is not given, Dask will try and work out what it should be. Ordinarily that might be a good thing, but inside a list comprehension that means those tasks are computed slowly and sequentially before the main computation even begins, which is horribly inefficient. Since we know ahead of time what kinds of results we expect from our analysis function (we just don’t know the length of each set of results), we can use the &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-api.html#dask.dataframe.utils.make_meta&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;utils.make_meta&lt;/code&gt;&lt;/a&gt; function to help us here.&lt;/p&gt;

&lt;h3 id=&quot;problem-3-grabbing-the-image-chunks-with-an-overlap&quot;&gt;Problem 3: Grabbing the image chunks with an overlap&lt;/h3&gt;

&lt;p&gt;Now that we’re using &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;Dask delayed&lt;/a&gt; to piece together our skeleton analysis results, it’s up to us to handle the array chunks overlap ourselves.&lt;/p&gt;

&lt;p&gt;We’ll do that by modifying Dask’s &lt;a href=&quot;https://github.com/dask/dask/blob/21aaf44d4d25bdba05951b85f3f2d943b823e82d/dask/array/core.py#L209-L225&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.array.core.slices_from_chunks&lt;/code&gt;&lt;/a&gt; function, into something that will be able to handle an overlap. Some special handling is required at the boundaries of the Dask array, so that we don’t try to slice past the edge of the array.&lt;/p&gt;

&lt;p&gt;Here’s what that looks like (&lt;a href=&quot;https://gist.github.com/GenevieveBuckley/decd23c22ee3417f7d78e87f791bc081&quot;&gt;gist&lt;/a&gt;):&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;itertools&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;product&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array.slicing&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cached_cumsum&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;slices_from_chunks_overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cumdims&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cached_cumsum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;initial_zero&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bds&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;slices&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;starts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shapes&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cumdims&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;inner_slices&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;maxshape&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;starts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shapes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;array_shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;slice_start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;slice_stop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dim&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slice_start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;slice_start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slice_stop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;maxshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;slice_stop&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;inner_slices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slice_start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;slice_stop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;slices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inner_slices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;product&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;slices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now that we can slice an image chunk plus an extra pixel of overlap, all we need is a way to do that for all the chunks in an array. Drawing inspiration from this &lt;a href=&quot;https://github.com/dask/dask-image/blob/63543bf2f6553a8150f45289492bf614e1945ac0/dask_image/ndmeasure/__init__.py#L299-L303&quot;&gt;block iteration&lt;/a&gt; we make a similar iterator.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;block_iter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndindex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numblocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;functools&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;partial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;operator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getitem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;slices_from_chunks_overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;utils&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;row&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;col&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;data&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;intermediate_results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skeleton_graph_func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;intermediate_results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;drop_duplicates&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# we need to drop duplicates because it counts pixels in the overlapping region twice
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With these results, we’re able to create the sparse skeleton graph.&lt;/p&gt;

&lt;h3 id=&quot;problem-4-summary-statistics-with-skan&quot;&gt;Problem 4: Summary statistics with skan&lt;/h3&gt;

&lt;p&gt;Skeleton branch statistics can be calculate with the &lt;a href=&quot;https://jni.github.io/skan/api/skan.csr.html#skan.csr.summarize&quot;&gt;skan &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;summarize&lt;/code&gt;&lt;/a&gt; function. The problem here is that the function expects a &lt;a href=&quot;https://jni.github.io/skan/api/skan.csr.html#skan.csr.Skeleton&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Skeleton&lt;/code&gt;&lt;/a&gt; object instance, but initializing a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Skeleton&lt;/code&gt; object calls methods that are not compatible for distributed analysis.&lt;/p&gt;

&lt;p&gt;We’ll solve this problem by first initializing a &lt;a href=&quot;https://jni.github.io/skan/api/skan.csr.html#skan.csr.Skeleton&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Skeleton&lt;/code&gt;&lt;/a&gt; object instance with a tiny dummy dataset, then overwriting the attributes of the skeleton object with our real results. This is a hack, but it lets us achieve our goal: summary branch statistics for our large dataset.&lt;/p&gt;

&lt;p&gt;First we make a Skeleton object instance with dummy data:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;skan._testdata&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;skeleton0&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;skeleton_object&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Skeleton&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skeleton0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# initialize with dummy data
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then we overwrite the attributes with the previously calculated results:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;skeleton_object.skeleton_image = ...
skeleton_object.graph = ...
skeleton_object.coordinates
skeleton_object.degrees = ...
skeleton_object.distances = ...
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then finally we can calculate the summary branch statistics:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;skan&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;summarize&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;statistics&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;summarize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skel_obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;statistics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt; &lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;skeleton-id&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;node-id-src&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;node-id-dst&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;branch-distance&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;branch-type&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;mean-pixel-value&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;stdev-pixel-value&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-src-0&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-src-1&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-src-2&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-dst-0&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-dst-1&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-dst-2&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-src-0&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-src-1&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-src-2&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-dst-0&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-dst-1&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-dst-2&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;euclidean-distance&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.474584&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.00262514&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;400&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;595&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;400&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;596&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;400&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;595&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;400&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;596&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;3&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;9&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;8.19615&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.464662&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.00299629&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;37&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;400&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;622&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;43&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;392&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;590&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;37&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;400&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;622&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;43&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;392&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;590&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;33.5261&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;3&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;10&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;11&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.483393&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.00771038&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;49&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;391&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;589&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;50&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;391&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;589&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;49&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;391&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;589&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;50&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;391&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;589&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;3&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;13&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;19&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;6.82843&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.464325&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.0139064&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;52&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;389&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;588&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;55&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;385&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;588&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;52&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;389&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;588&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;55&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;385&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;588&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;5&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;4&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;7&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;21&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;23&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.45862&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.0104024&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;57&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;382&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;587&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;58&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;380&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;586&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;57&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;382&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;587&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;58&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;380&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;586&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2.44949&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;statistics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt; &lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;skeleton-id&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;node-id-src&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;node-id-dst&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;branch-distance&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;branch-type&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;mean-pixel-value&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;stdev-pixel-value&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-src-0&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-src-1&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-src-2&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-dst-0&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-dst-1&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;image-coord-dst-2&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-src-0&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-src-1&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-src-2&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-dst-0&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-dst-1&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;coord-dst-2&lt;/th&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;euclidean-distance&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;count&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1095&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;mean&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2089.38&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;11520.1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;11608.6&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22.9079&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2.00091&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.663422&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.0418607&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;591.939&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;430.303&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;377.409&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;594.325&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;436.596&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;373.419&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;591.939&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;430.303&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;377.409&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;594.325&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;436.596&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;373.419&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;190.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;std&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;636.377&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;6057.61&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;6061.18&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;24.2646&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.0302199&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.242828&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.0559064&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;174.04&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;194.499&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;97.0219&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;173.353&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;188.708&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;96.8276&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;174.04&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;194.499&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;97.0219&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;173.353&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;188.708&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;96.8276&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;151.171&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;min&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.414659&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;6.79493e-06&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;39&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;116&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;39&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;114&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;39&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;116&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;22&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;39&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;114&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;25%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1586&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;6215.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;6429.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.73205&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.482&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.00710439&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;468.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;278.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;313&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;475&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;299.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;307&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;468.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;278.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;313&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;475&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;299.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;307&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;72.6946&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;50%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2431&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;11977&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;12010&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;16.6814&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.552626&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.0189069&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;626&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;405&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;388&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;627&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;410&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;381&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;626&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;405&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;388&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;627&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;410&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;381&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;161.059&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;75%&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2542.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;16526.5&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;16583&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;35.0433&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.768359&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.0528814&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;732&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;579&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;434&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;734&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;590&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;432&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;732&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;579&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;434&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;734&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;590&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;432&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;265.948&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;max&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;8034&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;26820&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;26822&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;197.147&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;3&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;1.29687&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;0.357193&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;976&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;833&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;622&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;976&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;841&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;606&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;976&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;833&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;622&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;976&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;841&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;606&lt;/td&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;737.835&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Success!&lt;/p&gt;

&lt;p&gt;We’ve achieved distributed skeleton analysis with Dask.
You can see the example notebook containing the full details of the skeleton analysis &lt;a href=&quot;https://github.com/GenevieveBuckley/distributed-skeleton-analysis/blob/main/distributed-skeleton-analysis-with-dask.ipynb&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;A good next step is modifing the &lt;a href=&quot;https://github.com/jni/skan&quot;&gt;skan&lt;/a&gt; library code so that it directly supports distributed skeleton analysis.&lt;/p&gt;

&lt;h2 id=&quot;how-you-can-help&quot;&gt;How you can help&lt;/h2&gt;

&lt;p&gt;If you’d like to get involved, there are a couple of options:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Try a similar analysis on your own data. The notebook with the full example code is &lt;a href=&quot;https://github.com/GenevieveBuckley/distributed-skeleton-analysis/blob/main/distributed-skeleton-analysis-with-dask.ipynb&quot;&gt;available here&lt;/a&gt;. You can share or ask questions in the &lt;a href=&quot;https://join.slack.com/t/dask/shared_invite/zt-mfmh7quc-nIrXL6ocgiUH2haLYA914g&quot;&gt;Dask slack&lt;/a&gt; or &lt;a href=&quot;twitter.com/dask_dev&quot;&gt;on twitter&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Help add support for distributed skeleton analysis to skan. Head on over to the &lt;a href=&quot;https://github.com/jni/skan/issues/&quot;&gt;skan issues page&lt;/a&gt; and leave a comment if you’d like to join in.&lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask with PyTorch for large scale image analysis</title>
   <link href="https://blog.dask.org/2021/03/29/apply-pretrained-pytorch-model"/>
   <updated>2021-03-29T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/03/29/apply-pretrained-pytorch-model</id>
   
   <category>imaging</category>
   
   <category>deep learning</category>
   
   <category>PyTorch</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;This post explores applying a pre-trained &lt;a href=&quot;https://pytorch.org/&quot;&gt;PyTorch&lt;/a&gt; model in parallel with Dask Array.&lt;/p&gt;

&lt;p&gt;We cover a simple example applying a pre-trained UNet to a stack of images to generate features for every pixel.&lt;/p&gt;

&lt;h2 id=&quot;a-worked-example&quot;&gt;A Worked Example&lt;/h2&gt;

&lt;p&gt;Let’s start with an example applying a pre-trained &lt;a href=&quot;https://arxiv.org/abs/1505.04597&quot;&gt;UNet&lt;/a&gt; to a stack of light sheet microscopy data.&lt;/p&gt;

&lt;p&gt;In this example, we:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Load the image data from Zarr into a multi-chunked Dask array&lt;/li&gt;
  &lt;li&gt;Load a pre-trained PyTorch model that featurizes images&lt;/li&gt;
  &lt;li&gt;Construct a function to apply the model onto each chunk&lt;/li&gt;
  &lt;li&gt;Apply that function across the Dask array with the dask.array.map_blocks function.&lt;/li&gt;
  &lt;li&gt;Store the result back into Zarr format&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;step-1-load-the-image-data&quot;&gt;Step 1. Load the image data&lt;/h3&gt;

&lt;p&gt;First, we load the image data into a Dask array.&lt;/p&gt;

&lt;p&gt;The example dataset we’re using here is lattice lightsheet microscopy of the tail region of a zebrafish embryo. It is described in &lt;a href=&quot;http://dx.doi.org/10.1126/science.aaq1392&quot;&gt;this Science paper&lt;/a&gt; (see Figure 4), and provided with permission from Srigokul Upadhyayula.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Liu &lt;em&gt;et al.&lt;/em&gt; 2018 “Observing the cell in its native state: Imaging subcellular dynamics in multicellular organisms” &lt;em&gt;Science&lt;/em&gt;, Vol. 360, Issue 6386, eaaq1392 DOI: 10.1126/science.aaq1392 (&lt;a href=&quot;http://dx.doi.org/10.1126/science.aaq1392&quot;&gt;link&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the same data that we analysed in our last &lt;a href=&quot;https://blog.dask.org/2019/08/09/image-itk&quot;&gt;blogpost on Dask and ITK&lt;/a&gt;. You should note the similarities to that workflow even though we are now using new libaries and performing different analyses.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd &apos;/Users/nicholassofroniew/Github/image-demos/data/LLSM&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Load our data
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_zarr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;AOLLSM_m4_560nm.zarr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dask.array&amp;lt;from-zarr, shape=(20, 199, 768, 1024), dtype=float32, chunksize=(1, 1, 768, 1024)&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;step-2-load-a-pre-trained-pytorch-model&quot;&gt;Step 2. Load a pre-trained PyTorch model&lt;/h3&gt;

&lt;p&gt;Next, we load our pre-trained UNet model.&lt;/p&gt;

&lt;p&gt;This UNet model takes in an 2D image and returns a 2D x 16 array, where each pixel is now associate with a feature vector of length 16.&lt;/p&gt;

&lt;p&gt;We thank Mars Huang for training this particular UNet on a corpous of biological images to produce biologically relevant feature vectors, as part of his work on &lt;a href=&quot;https://github.com/transformify-plugins/segmentify&quot;&gt;interactive bio-image segmentation&lt;/a&gt;. These features can then be used for more downstream image processing tasks such as image segmentation.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Load our pretrained UNet¶
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;torch&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;segmentify.model&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UNet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;load_unet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Load a pretrained UNet model.&quot;&quot;&quot;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# load in saved model
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;pth&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;torch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model_args&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;model_args&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model_state&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;model_state&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;UNet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;load_state_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# remove last layer and activation
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;segment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Identity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;activate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;layers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Identity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;eval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;load_unet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;HPA_3.pth&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;step-3-construct-a-function-to-apply-the-model-to-each-chunk&quot;&gt;Step 3. Construct a function to apply the model to each chunk&lt;/h3&gt;

&lt;p&gt;We make a function to apply our pre-trained UNet model to each chunk of the Dask array.&lt;/p&gt;

&lt;p&gt;Because Dask arrays are just made out of Numpy arrays which are easily converted to Torch arrays, we’re able to leverage the power of machine learning at scale.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Apply UNet featurization
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;unet_featurize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Featurize pixels in an image using pretrained UNet model.
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;torch&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Extract the 2D image data from the Dask array
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Original Dask array dimensions were (time, z-slice, y, x)
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Put the data into a shape PyTorch expects
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Expected dimensions are (Batch x Channel x Width x Height)
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# convert image to torch Tensor
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;torch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Tensor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# pass image through model
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;torch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;no_grad&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;features&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# generate feature vectors (w,h,f)
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;features&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transpose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Add back the leading length-one dimensions
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note: Very observant readers might notice that the steps for extracting the 2D image data and then putting it into a shape PyTorch expects appear to be redundant. It is redundant for our particular example, but that might easily not have been the case.&lt;/p&gt;

&lt;p&gt;To explain this in more detail, the UNet expects 4D input, with dimensions &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(Batch x Channel x Width x Height)&lt;/code&gt;. The original Dask array dimensions were &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(time, z-slice, y, x)&lt;/code&gt;. In our example it just so happens those match in a way that makes removing and then adding the leading dimensions redundant, but depending on the shape of the original Dask array this might not have been true.&lt;/p&gt;

&lt;h3 id=&quot;step-4-apply-that-function-across-the-dask-array&quot;&gt;Step 4. Apply that function across the Dask array&lt;/h3&gt;

&lt;p&gt;Now we apply that function to the data in our Dask array using &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html?highlight=map_blocks#dask.array.map_blocks&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.array.map_blocks&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Apply UNet featurization
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unet_featurize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;new_axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dask.array&amp;lt;unet_featurize, shape=(20, 199, 768, 1024, 16), dtype=float32, chunksize=(1, 1, 768, 1024, 16)&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;step-5-store-the-result-back-into-zarr-format&quot;&gt;Step 5. Store the result back into Zarr format&lt;/h3&gt;

&lt;p&gt;Last, we store the result from the UNet model featurization as a zarr array.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Trigger computation and store
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_zarr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;AOLLSM_featurized.zarr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;overwrite&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now we’ve saved our output, these features can be used for more downstream image processing tasks such as image segmentation.&lt;/p&gt;

&lt;h3 id=&quot;summing-up&quot;&gt;Summing up&lt;/h3&gt;

&lt;p&gt;Here we’ve shown how to apply a pre-trained PyTorch model to a Dask array of image data.&lt;/p&gt;

&lt;p&gt;Because our Dask array chunks are Numpy arrays, they can be easily converted to Torch arrays. This way, we’re able to leverage the power of machine learning at scale.&lt;/p&gt;

&lt;p&gt;This workflow was very similar to &lt;a href=&quot;https://blog.dask.org/2019/08/09/image-itk&quot;&gt;our example&lt;/a&gt; using the dask.array.map_blocks function with ITK to perform image deconvolution. This shows you can easily adapt the same type of workflow to achieve many different types of analysis with Dask.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Image segmentation with Dask</title>
   <link href="https://blog.dask.org/2021/03/19/image-segmentation"/>
   <updated>2021-03-19T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/03/19/image-segmentation</id>
   
   <category>imaging</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;We look at how to create a basic image segmentation pipeline, using the &lt;a href=&quot;http://image.dask.org/en/latest/&quot;&gt;dask-image&lt;/a&gt; library.&lt;/p&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#just-show-me-the-code&quot;&gt;Just show me the code&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#image-segmentation-pipeline&quot;&gt;Image segmentation pipeline&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#set-up-your-python-environment&quot;&gt;Set up your python environment&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#download-the-example-data&quot;&gt;Download the example data&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step-1-reading-in-data&quot;&gt;Step 1: Reading in data&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step-2-siltering-images&quot;&gt;Step 2: Filtering images&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step-3-segmenting-objects&quot;&gt;Step 3: Segmenting objects&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step-4-morphological-operations&quot;&gt;Step 4: Morphological operations&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#step-5-measuring-objects&quot;&gt;Step 5: Measuring objects&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#custom-functions&quot;&gt;Custom functions&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#dask-map_overlap-and-map_blocks&quot;&gt;Dask map_overlap and map_blocks&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#dask-delayed&quot;&gt;Dask delayed decorator&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#scikit-image-apply_parallel-function&quot;&gt;scikit-image apply_parallel&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#scaling-up-computation&quot;&gt;Scaling up computation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#bonus-content-using-arrays-on-gpu&quot;&gt;Bonus content: using arrays on GPU&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#how-you-can-get-involved&quot;&gt;How you can get involved&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The content of this blog post originally appeared as &lt;a href=&quot;https://github.com/genevieveBuckley/dask-image-talk-2020&quot;&gt;a conference talk in 2020&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;just-show-me-the-code&quot;&gt;Just show me the code&lt;/h2&gt;

&lt;p&gt;If you want to run this yourself, you’ll need to download the example data from the Broad Bioimage Benchmark Collection: https://bbbc.broadinstitute.org/BBBC039&lt;/p&gt;

&lt;p&gt;And install these requirements:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask-image&amp;gt;=0.4.0 tifffile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here’s our full pipeline:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image.imread&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndfilters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmorph&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmeasure&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;data/BBBC039/images/*.tif&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;smoothed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndfilters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gaussian_filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sigma&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;thresh&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndfilters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;threshold_local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;smoothed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;blocksize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunksize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;threshold_images&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smoothed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;thresh&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;structuring_element&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;binary_images&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmorph&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;binary_closing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;threshold_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;structure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;structuring_element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;label_images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_features&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmeasure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;binary_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;area&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmeasure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;area&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label_images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;mean_intensity&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmeasure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label_images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can keep reading for a step by step walkthrough of this image segmentation pipeline, or you can skip ahead to the sections on &lt;a href=&quot;#Custom-functions&quot;&gt;custom functions&lt;/a&gt;, &lt;a href=&quot;#Scaling-up-computation&quot;&gt;scaling up computation&lt;/a&gt;, or &lt;a href=&quot;#Bonus-content:-using-arrays-on-GPU&quot;&gt;GPU acceleration&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;image-segmentation-pipeline&quot;&gt;Image segmentation pipeline&lt;/h2&gt;

&lt;p&gt;Our basic image segmentation pipeline has five steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Reading in data&lt;/li&gt;
  &lt;li&gt;Filtering images&lt;/li&gt;
  &lt;li&gt;Segmenting objects&lt;/li&gt;
  &lt;li&gt;Morphological operations&lt;/li&gt;
  &lt;li&gt;Measuring objects&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;set-up-your-python-environment&quot;&gt;Set up your python environment&lt;/h3&gt;

&lt;p&gt;Before we begin, we’ll need to set up our python virtual environment.&lt;/p&gt;

&lt;p&gt;At a minimum, you’ll need:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask-image&amp;gt;=0.4.0 tifffile matplotlib
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Optionally, you can also install the &lt;a href=&quot;https://napari.org/&quot;&gt;napari&lt;/a&gt; image viewer to visualize the image segmentation.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install &quot;napari[all]&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To use napari from IPython or jupyter, run the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%gui qt&lt;/code&gt; magic in a cell before calling napari. See the &lt;a href=&quot;https://napari.org/&quot;&gt;napari documentation&lt;/a&gt; for more details.&lt;/p&gt;

&lt;h3 id=&quot;download-the-example-data&quot;&gt;Download the example data&lt;/h3&gt;

&lt;p&gt;We’ll use the publically available image dataset &lt;a href=&quot;https://bbbc.broadinstitute.org/BBBC039&quot;&gt;BBBC039&lt;/a&gt; Caicedo et al. 2018, available from the Broad Bioimage Benchmark Collection &lt;a href=&quot;http://dx.doi.org/10.1038/nmeth.2083&quot;&gt;Ljosa et al., Nature Methods, 2012&lt;/a&gt;. You can download the dataset here: &lt;a href=&quot;https://bbbc.broadinstitute.org/BBBC039&quot;&gt;https://bbbc.broadinstitute.org/BBBC039&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-image-segmentation/BBBC039-example-image.png&quot; alt=&quot;Example image from the BBBC039 dataset, Broad Bioimage Benchmark Collection&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These are fluorescence microscopy images, where we see the nuclei in individual cells.&lt;/p&gt;

&lt;h3 id=&quot;step-1-reading-in-data&quot;&gt;Step 1: Reading in data&lt;/h3&gt;

&lt;p&gt;Step one in our image segmentation pipeline is to read in the image data. We can do that with the &lt;a href=&quot;http://image.dask.org/en/latest/dask_image.imread.html&quot;&gt;dask-image imread function&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We pass the path to the folder full of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.tif&lt;/code&gt; images from our example data.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image.imread&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;data/BBBC039/images/*.tif&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-image-segmentation/dask-array-html-repr.png&quot; alt=&quot;HTML reprsentation of a Dask array&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By default, each individual &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.tif&lt;/code&gt; file on disk has become one chunk in our Dask array.&lt;/p&gt;

&lt;h3 id=&quot;step-2-filtering-images&quot;&gt;Step 2: Filtering images&lt;/h3&gt;

&lt;p&gt;Denoising images with a small amount of blur can improve segmentation later on. This is a common first step in a lot of image segmentation pipelines. We can do this with the dask-image &lt;a href=&quot;http://image.dask.org/en/latest/dask_image.ndfilters.html#dask_image.ndfilters.gaussian_filter&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gaussian_filter&lt;/code&gt;&lt;/a&gt; function.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndfilters&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;smoothed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndfilters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gaussian_filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sigma&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;step-3-segmenting-objects&quot;&gt;Step 3: Segmenting objects&lt;/h3&gt;

&lt;p&gt;Next, we want to separate the objects in our images from the background. There are lots of different ways we could do this. Because we have fluorescent microscopy images, we’ll use a thresholding method.&lt;/p&gt;

&lt;h4 id=&quot;absolute-threshold&quot;&gt;Absolute threshold&lt;/h4&gt;

&lt;p&gt;We could set an absolute threshold value, where we’d consider pixels with intensity values below this threshold to be part of the background.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;absolute_threshold&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smoothed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;160&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let’s have a look at these images with the napari image viewer. First we’ll need to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%gui qt&lt;/code&gt; magic:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gui&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;qt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And now we can look a the images with napari:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;napari&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;viewer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;napari&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Viewer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;viewer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;absolute_threshold&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;viewer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;contrast_limits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-image-segmentation/napari-absolute-threshold.png&quot; alt=&quot;Absolute threshold napari screenshot&quot; width=&quot;700&quot; height=&quot;476&quot; /&gt;&lt;/p&gt;

&lt;p&gt;But there’s a problem here.&lt;/p&gt;

&lt;p&gt;When we look at the results for different image frames, it becomes clear that there is no “one size fits all” we can use for an absolute threshold value. Some images in the dataset have quite bright backgrounds, others have fluorescent nuclei with low brightness. We’ll have to try a different kind of thresholding method.&lt;/p&gt;

&lt;h4 id=&quot;local-threshold&quot;&gt;Local threshold&lt;/h4&gt;

&lt;p&gt;We can improve the segmentation using a local thresholding method.&lt;/p&gt;

&lt;p&gt;If we calculate a threshold value independently for each image frame then we can avoid the problem caused by fluctuating background intensity between frames.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;thresh&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndfilters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;threshold_local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;smoothed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunksize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;threshold_images&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smoothed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;thresh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Let&apos;s take a look at the images with napari
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;viewer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;threshold_images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-image-segmentation/napari-local-threshold.png&quot; alt=&quot;Local threshold napari screenshot&quot; width=&quot;700&quot; height=&quot;476&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The results here look much better, this is a much cleaner separation of nuclei from the background and it looks good for all the image frames.&lt;/p&gt;

&lt;h3 id=&quot;step-4-morphological-operations&quot;&gt;Step 4: Morphological operations&lt;/h3&gt;

&lt;p&gt;Now that we have a binary mask from our threshold, we can clean it up a bit with some morphological operations.&lt;/p&gt;

&lt;p&gt;Morphological operations are changes we make to the shape of structures a binary image. We’ll briefly describe some of the basic concepts here, but for a more detailed reference you can look at &lt;a href=&quot;https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html&quot;&gt;this excellent page of the OpenCV documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Erosion&lt;/strong&gt; is an operation where the edges of structures in a binary image are eaten away, or eroded.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-image-segmentation/erosion.png&quot; alt=&quot;Example: Erosion of a binary image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Image credit: &lt;a href=&quot;https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html&quot;&gt;OpenCV documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dilation&lt;/strong&gt; is the opposite of an erosion. With dilation, the edges of structures in a binary image are expanded.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-image-segmentation/dilation.png&quot; alt=&quot;Example: Dilation of a binary image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Image credit: &lt;a href=&quot;https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html&quot;&gt;OpenCV documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can combine morphological operations in different ways to get useful effects.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;morphological opening&lt;/strong&gt; operation is an erosion, followed by a dilation.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-image-segmentation/opening.png&quot; alt=&quot;Example: Morphological opening of a binary image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Image credit: &lt;a href=&quot;https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html&quot;&gt;OpenCV documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the example image above, we can see the left hand side has a noisy, speckled background. If the structuring element used for the morphological operations is larger than the size of the noisy speckles, they will disappear completely in the first erosion step. Then when it is time to do the second dilation step, there’s nothing left of the noise in the background to dilate. So we have removed the noise in the background, while the major structures we are interested in (in this example, the J shape) are restored almost perfectly.&lt;/p&gt;

&lt;p&gt;Let’s use this morphological opening trick to clean up the binary images in our segmentation pipeline.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmorph&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;structuring_element&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;binary_images&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmorph&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;binary_opening&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;threshold_images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;structure&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;structuring_element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You’ll notice here that we need to be a little bit careful about the structuring element. All our image frames are combined in a single Dask array, but we only want to apply the morphological operation independently to each frame.
To do this, we sandwich the default 2D structuring element between two layers of zeros. This means the neighbouring image frames have no effect on the result.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Default 2D structuring element
&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;step-5-measuring-objects&quot;&gt;Step 5: Measuring objects&lt;/h3&gt;

&lt;p&gt;The last step in any image processing pipeline is to make some kind of measurement. We’ll turn our binary mask into a label image, and then measure the intensity and size of those objects.&lt;/p&gt;

&lt;p&gt;For the sake of keeping the computation time in this tutorial nice and quick, we’ll measure only a small subset of the data. Let’s measure all the objects in the first three image frames (roughly 300 nuclei).&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmeasure&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Create labelled mask
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label_images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_features&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmeasure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;binary_images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;structuring_element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;num_features&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# [1, 2, 3, ...num_features]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here’s a screenshot of the label image generated from our mask.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-image-segmentation/napari-label-image.png&quot; alt=&quot;Label image napari screenshot&quot; width=&quot;700&quot; height=&quot;476&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Number of nuclei:&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;Number&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nuclei&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;271&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;measure-objects-in-images&quot;&gt;Measure objects in images&lt;/h4&gt;

&lt;p&gt;The dask-image &lt;a href=&quot;http://image.dask.org/en/latest/dask_image.ndmeasure.html&quot;&gt;ndmeasure subpackage&lt;/a&gt; includes a number of different measurement functions. In this example, we’ll choose to measure:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The area in pixels of each object, and&lt;/li&gt;
  &lt;li&gt;The average intensity of each object.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;area&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmeasure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;area&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label_images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;mean_intensity&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ndmeasure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;label_images&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;run-computation-and-plot-results&quot;&gt;Run computation and plot results&lt;/h4&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;area&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mean_intensity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gca&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Area vs mean intensity&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xlabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Area (pixels)&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ylabel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Mean intensity&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2021-image-segmentation/dask-image-matplotlib-output.png&quot; alt=&quot;Matplotlib graph of dask-image measurement results: &quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;custom-functions&quot;&gt;Custom functions&lt;/h2&gt;

&lt;p&gt;What if you want to do something that isn’t included in the dask-image API? There are several options we can use to write custom functions.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;dask &lt;a href=&quot;https://docs.dask.org/en/latest/array-overlap.html?highlight=map_overlap#dask.array.map_overlap&quot;&gt;map_overlap&lt;/a&gt; / &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html?highlight=map_blocks#dask.array.map_blocks&quot;&gt;map_blocks&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;dask &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;delayed&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;scikit-image &lt;a href=&quot;https://scikit-image.org/docs/dev/api/skimage.util.html#skimage.util.apply_parallel&quot;&gt;apply_parallel()&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;dask-map_overlap-and-map_blocks&quot;&gt;Dask map_overlap and map_blocks&lt;/h3&gt;

&lt;p&gt;The Dask array &lt;a href=&quot;https://docs.dask.org/en/latest/array-overlap.html#dask.array.map_overlap&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.map_blocks&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt;&lt;/a&gt; are what is used to build most of the functions in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt;. You can use them yourself too. They will apply a function to each chunk in a Dask array.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;my_custom_function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ... does something really cool
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;my_custom_function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;my_dask_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can read more about &lt;a href=&quot;https://docs.dask.org/en/latest/array-overlap.html&quot;&gt;overlapping computations here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;dask-delayed&quot;&gt;Dask delayed&lt;/h3&gt;

&lt;p&gt;If you want more flexibility and fine-grained control over your computation, then you can use &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;Dask delayed&lt;/a&gt;. You can get started &lt;a href=&quot;https://tutorial.dask.org/01_dask.delayed.html&quot;&gt;with the Dask delayed tutorial here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;scikit-image-apply_parallel-function&quot;&gt;scikit-image apply_parallel function&lt;/h3&gt;

&lt;p&gt;If you’re a person who does a lot of image processing in python, one tool you’re likely to already be using is &lt;a href=&quot;https://scikit-image.org/&quot;&gt;scikit-image&lt;/a&gt;. I’d like to draw your attention to the &lt;a href=&quot;https://scikit-image.org/docs/dev/api/skimage.util.html?highlight=apply_parallel#skimage.util.apply_parallel&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply_parallel&lt;/code&gt;&lt;/a&gt; function available in scikit-image. It uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map-overlap&lt;/code&gt;, and can be very helpful.&lt;/p&gt;

&lt;p&gt;It’s useful not only when when you have big data, but also in cases where your data fits into memory but the computation you want to apply to the data is memory intensive. This might cause you to exceed the available RAM, and &lt;a href=&quot;https://scikit-image.org/docs/dev/api/skimage.util.html?highlight=apply_parallel#skimage.util.apply_parallel&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply_parallel&lt;/code&gt;&lt;/a&gt; is great for these situations too.&lt;/p&gt;

&lt;h2 id=&quot;scaling-up-computation&quot;&gt;Scaling up computation&lt;/h2&gt;

&lt;p&gt;When you want to scale up from a laptop onto a supercomputing cluster, you can use &lt;a href=&quot;https://distributed.dask.org/en/latest/&quot;&gt;dask-distributed&lt;/a&gt; to handle that.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Setup a local cluster
# By default this sets up 1 worker per core
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;See the &lt;a href=&quot;https://distributed.dask.org/en/latest/&quot;&gt;documentation here&lt;/a&gt; to get set up for your system.&lt;/p&gt;

&lt;h2 id=&quot;bonus-content-using-arrays-on-gpu&quot;&gt;Bonus content: using arrays on GPU&lt;/h2&gt;

&lt;p&gt;We’ve recently been adding GPU support to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We’re able to add GPU support using a library called &lt;a href=&quot;https://cupy.dev/&quot;&gt;CuPy&lt;/a&gt;. &lt;a href=&quot;https://cupy.dev/&quot;&gt;CuPy&lt;/a&gt; is an array library with a numpy-like API, accelerated with NVIDIA CUDA. Instead of having Dask arrays which contain numpy chunks, we can have Dask arrays containing cupy chunks instead. This &lt;a href=&quot;https://blog.dask.org/2019/01/03/dask-array-gpus-first-steps&quot;&gt;blogpost&lt;/a&gt; explains the benefits of GPU acceleration and gives some benchmarks for computations on CPU, a single GPU, and multiple GPUs.&lt;/p&gt;

&lt;h3 id=&quot;gpu-support-available-in-dask-image&quot;&gt;GPU support available in dask-image&lt;/h3&gt;

&lt;p&gt;From &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt; version 0.6.0, there is GPU array support for four of the six subpackages:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;imread&lt;/li&gt;
  &lt;li&gt;ndfilters&lt;/li&gt;
  &lt;li&gt;ndinterp&lt;/li&gt;
  &lt;li&gt;ndmorph&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subpackages of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-image&lt;/code&gt; that do &lt;em&gt;not&lt;/em&gt; yet have GPU support are.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ndfourier&lt;/li&gt;
  &lt;li&gt;ndmeasure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We hope to add GPU support to these in the future.&lt;/p&gt;

&lt;h3 id=&quot;an-example&quot;&gt;An example&lt;/h3&gt;

&lt;p&gt;Here’s an example of an image convolution with Dask on the CPU:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# CPU example
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image.ndfilters&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;convolve&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prod&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndim&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;convolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And here’s the same example of an image convolution with Dask on the GPU. The only thing necessary to change is the type of input arrays.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Same example moved to the GPU
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# &amp;lt;- import cupy instead of numpy (version &amp;gt;=7.7.0)
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image.ndfilters&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;convolve&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prod&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reshape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# &amp;lt;- cupy dask array
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndim&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,))&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# &amp;lt;- cupy array
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;convolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can’t mix arrays on the CPU and arrays on the GPU in the same computation. This is why the weights &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;w&lt;/code&gt; must be a cupy array in the second example above.&lt;/p&gt;

&lt;p&gt;Additionally, you can transfer data between the CPU and GPU. So in situations where the GPU speedup is larger than than cost associated with transferring data, this may be useful to do.&lt;/p&gt;

&lt;h3 id=&quot;reading-in-images-onto-the-gpu&quot;&gt;Reading in images onto the GPU&lt;/h3&gt;

&lt;p&gt;Generally, we want to start our image processing by reading in data from images stored on disk. We can use the &lt;a href=&quot;http://image.dask.org/en/latest/dask_image.imread.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;imread&lt;/code&gt;&lt;/a&gt; function with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arraytype=cupy&lt;/code&gt; keyword argument to do this.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image.imread&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;images&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;data/BBBC039/images/*.tif&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;images_on_gpu&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;data/BBBC039/images/*.tif&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;arraytype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cupy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;how-you-can-get-involved&quot;&gt;How you can get involved&lt;/h2&gt;

&lt;p&gt;Create and share your own segmentation or image processing workflows with Dask (&lt;a href=&quot;https://github.com/dask/dask-blog/issues/47&quot;&gt;join the current discussion on segmentation&lt;/a&gt; or &lt;a href=&quot;https://github.com/dask/dask-blog/issues/new?assignees=&amp;amp;labels=%5B%22type%2Ffeature%22%2C+%22needs-triage%22%5D&amp;amp;template=feature-request.md&quot;&gt;propose a new blogpost topic here&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Contribute to adding GPU support to dask-image: https://github.com/dask/dask-image/issues/133&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Measuring Dask memory usage with dask-memusage</title>
   <link href="https://blog.dask.org/2021/03/11/dask_memory_usage"/>
   <updated>2021-03-11T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/03/11/dask_memory_usage</id>
   
   <category>memory</category>
   
   <category>dask</category>
   
   <category>distributed</category>
   
   <category>profiling</category>
   
   <category>ram</category>
   
   <content type="html">
&lt;p&gt;Using too much computing resources can get expensive when you’re scaling up in the cloud.&lt;/p&gt;

&lt;p&gt;To give a real example, I was working on the image processing pipeline for a spatial gene sequencing device, which could report not just which genes were being expressed but also where they were in a 3D volume of cells.
In order to get this information, a specialized microscope took snapshots of the cell culture or tissue, and the resulting data was run through a Dask pipeline.&lt;/p&gt;

&lt;p&gt;The pipeline was fairly slow, so I did some back-of-the-envelope math to figure out our computing costs would be once we started running more data for customers.
&lt;strong&gt;It turned out that we’d be using 70% of our revenue just paying for cloud computing!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clearly I needed to optimize this code.&lt;/p&gt;

&lt;p&gt;When we think about the bottlenecks in large-scale computation, we often focus on CPU: we want to use more CPU cores in order to get faster results.
Paying for all that CPU can be expensive, as in this case, and I did successfully reduce CPU usage by quite a lot.&lt;/p&gt;

&lt;p&gt;But high memory usage was also a problem, and fixing that problem led me to build a series of tools, tools that can also help you optimize and reduce your Dask memory usage.&lt;/p&gt;

&lt;p&gt;In the rest of this article you will learn:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#problem&quot;&gt;How high memory usage can drive up your computing costs&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;How a tool called &lt;a href=&quot;https://github.com/itamarst/dask-memusage/&quot;&gt;dask-memusage&lt;/a&gt; can help you &lt;a href=&quot;#dask-memusage&quot;&gt;find peak memory usage of the tasks in your Dask execution graph&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;How to &lt;a href=&quot;#fil&quot;&gt;further pinpoint high memory usage&lt;/a&gt; using the &lt;a href=&quot;https://pythonspeed.com/fil&quot;&gt;Fil memory profiler&lt;/a&gt;, so you can reduce memory usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;problem&quot;&gt;The problem: fixed processing chunks and a high memory/CPU ratio&lt;/h2&gt;

&lt;p&gt;As a reminder, I was working on a Dask pipeline that processed data from a specialized microscope.
The resulting data volume was quite large, and certain subsets of images had to be processed together as a unit.
From a computational standpoint, we effectively had a series of inputs X0, X1, X2, … that could be independently processed by a function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The internal processing of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f()&lt;/code&gt; could not easily be parallelized further.
From a CPU scheduling perspective, this was fine, it was still an embarrassingly parallel problem given the large of number of X inputs.&lt;/p&gt;

&lt;p&gt;For example, if I provisioned a virtual machine with 4 CPU cores, to process the data I could start four processes, and each would max out a single core.
If I had 12 inputs and each processing step took about the same time, they might run as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CPU0: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X0)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X4)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X8)&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;CPU1: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X1)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X5)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X9)&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;CPU2: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X2)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X6)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X10)&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;CPU3: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X3)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X7)&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(X11)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I could make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f()&lt;/code&gt; faster, the pipeline as a whole would also run faster.&lt;/p&gt;

&lt;p&gt;CPU is not the only resource used in computation, however: RAM can also be a bottleneck.
For example, let’s say each call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;f(Xi)&lt;/code&gt; took 12GB of RAM.
That means to fully utilize 4 CPUs, I would need 48GB of RAM—but what if my computer only has 16GB of RAM?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Even though my computer has 4 CPUs, I can only utilize one CPU on a computer with 16GB RAM, because I don’t have enough RAM to run more than one task in parallel.&lt;/strong&gt;
In practice, these tasks ran in the cloud, where I could ensure the necessary RAM/core ratio was preserved by choosing the right pre-configured VM instances.
And on some clouds you can freely set the amount of RAM and number of CPU cores for each virtual machine you spin up.&lt;/p&gt;

&lt;p&gt;However, I didn’t quite know how much memory was used at peak, so I’d had to limit parallelism to reduce out-of-memory errors.
As a result, the default virtual machines we were using had half their CPUs resting idle, resources were paying for but not using.&lt;/p&gt;

&lt;p&gt;In order to provision hardware appropriately and max out all the CPUs, I needed to know how much peak memory each task was using.
And to do that, I created a new tool.&lt;/p&gt;

&lt;h2 id=&quot;dask-memusage&quot;&gt;Measuring peak task memory usage with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt; is a tool for measuring peak memory usage for each task in the Dask execution graph.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Per &lt;em&gt;task&lt;/em&gt; because Dask executes code as a graph of tasks, and the graph determines how much parallelism can be used.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Peak&lt;/em&gt; memory is important, because that is the bottleneck.
It doesn’t matter if average memory usage per task is 4GB, if two parallel tasks in the graph need 12GB each at the same time, you’re going to need 24GB of RAM if you want to to run both tasks on the same computer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;using-dask-memusage&quot;&gt;Using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Since the gene sequencing code is proprietary and quite complex, let’s use a different example.
We’re going to count the occurrence of words in some text files, and then report the top-10 most common words in each file.
You can imagine combining the data later on, but we won’t bother with that in this simple example.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sys&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;gc&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pathlib&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.bag&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from_sequence&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;collections&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Counter&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_memusage&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;calculate_top_10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;gc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;collect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# See notes below
&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Load the file
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Count the words
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;counts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;word&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;word&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;.,&apos;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lower&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Choose the top 10:
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;by_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# See notes below
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;file_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;by_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Setup the calculation:
&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Create a 4-process cluster (running locally). Note only one thread
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# per-worker: because polling is per-process, you can&apos;t run multiple
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# threads per worker, otherwise you&apos;ll get results that combine memory
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# usage of multiple tasks.
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;threads_per_worker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                           &lt;span class=&quot;n&quot;&gt;memory_limit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Install dask-memusage:
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;dask_memusage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;memusage.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Create the task graph:
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;files&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from_sequence&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iterdir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;graph&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;files&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;calculate_top_10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;graph&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;example2.png&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rankdir&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;TD&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Run the calculations:
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;graph&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# ... do something with results ...
&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;__main__&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here’s what the task graph looks like:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask_memusage/example2.png&quot; style=&quot;width: 75%; margin: 2em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Plenty of parallelism!&lt;/p&gt;

&lt;p&gt;We can run the program on some files:&lt;/p&gt;

&lt;div class=&quot;language-shell-session highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;dask[bag] dask_memusage
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;python example2.py files/
&lt;span class=&quot;go&quot;&gt;(&apos;frankenstein.txt&apos;, [(&apos;that&apos;, 1016), (&apos;was&apos;, 1021), (&apos;in&apos;, 1180), (&apos;a&apos;, 1438), (&apos;my&apos;, 1751), (&apos;to&apos;, 2164), (&apos;i&apos;, 2754), (&apos;of&apos;, 2761), (&apos;and&apos;, 3025), (&apos;the&apos;, 4339)])
(&apos;pride_and_prejudice.txt&apos;, [(&apos;she&apos;, 1660), (&apos;i&apos;, 1730), (&apos;was&apos;, 1832), (&apos;in&apos;, 1904), (&apos;a&apos;, 1981), (&apos;her&apos;, 2142), (&apos;and&apos;, 3503), (&apos;of&apos;, 3705), (&apos;to&apos;, 4188), (&apos;the&apos;, 4492)])
(&apos;greatgatsby.txt&apos;, [(&apos;that&apos;, 564), (&apos;was&apos;, 760), (&apos;he&apos;, 770), (&apos;in&apos;, 849), (&apos;i&apos;, 999), (&apos;to&apos;, 1197), (&apos;of&apos;, 1224), (&apos;a&apos;, 1440), (&apos;and&apos;, 1565), (&apos;the&apos;, 2543)])
(&apos;big.txt&apos;, [(&apos;his&apos;, 40032), (&apos;was&apos;, 45356), (&apos;that&apos;, 47924), (&apos;he&apos;, 48276), (&apos;a&apos;, 83228), (&apos;in&apos;, 86832), (&apos;to&apos;, 114184), (&apos;and&apos;, 152284), (&apos;of&apos;, 159888), (&apos;the&apos;, 314908)])
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As one would expect, the most common words are stem words, but there is still some variation in order.&lt;/p&gt;

&lt;p&gt;Next, let’s look at the results from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;dask-memusage-output-and-how-it-works&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt; output, and how it works&lt;/h3&gt;

&lt;p&gt;You’ll notice that the actual use of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt; involves just one extra line, other than the import:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;dask_memusage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;install&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;memusage.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What this will do is poll the process at 10ms intervals for peak memory usage, broken down by task.
In this case, here’s what &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memusage.csv&lt;/code&gt; looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-csv&quot;&gt;task_key,min_memory_mb,max_memory_mb
&quot;(&apos;from_sequence-3637e6ff937ef8488894df60a80f62ed&apos;, 3)&quot;,51.2421875,51.2421875
&quot;(&apos;from_sequence-3637e6ff937ef8488894df60a80f62ed&apos;, 0)&quot;,51.70703125,51.70703125
&quot;(&apos;from_sequence-3637e6ff937ef8488894df60a80f62ed&apos;, 1)&quot;,51.28125,51.78515625
&quot;(&apos;from_sequence-3637e6ff937ef8488894df60a80f62ed&apos;, 2)&quot;,51.30859375,51.30859375
&quot;(&apos;calculate_top_10-afc867e38c3bd0aac8c18bb00d3634ca&apos;, 2)&quot;,56.19140625,56.19140625
&quot;(&apos;calculate_top_10-afc867e38c3bd0aac8c18bb00d3634ca&apos;, 0)&quot;,51.70703125,54.26953125
&quot;(&apos;calculate_top_10-afc867e38c3bd0aac8c18bb00d3634ca&apos;, 1)&quot;,52.30078125,52.30078125
&quot;(&apos;calculate_top_10-afc867e38c3bd0aac8c18bb00d3634ca&apos;, 3)&quot;,51.48046875,384.00390625
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For each task in the graph we are told minimum memory usage and peak memory usage, in MB.&lt;/p&gt;

&lt;p&gt;In more readable form:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;task_key&lt;/th&gt;
      &lt;th&gt;min_memory_mb&lt;/th&gt;
      &lt;th&gt;max_memory_mb&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;”(‘from_sequence-3637e6ff937ef8488894df60a80f62ed’, 3)”&lt;/td&gt;
      &lt;td&gt;51.2421875&lt;/td&gt;
      &lt;td&gt;51.2421875&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;”(‘from_sequence-3637e6ff937ef8488894df60a80f62ed’, 0)”&lt;/td&gt;
      &lt;td&gt;51.70703125&lt;/td&gt;
      &lt;td&gt;51.70703125&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;”(‘from_sequence-3637e6ff937ef8488894df60a80f62ed’, 1)”&lt;/td&gt;
      &lt;td&gt;51.28125&lt;/td&gt;
      &lt;td&gt;51.78515625&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;”(‘from_sequence-3637e6ff937ef8488894df60a80f62ed’, 2)”&lt;/td&gt;
      &lt;td&gt;51.30859375&lt;/td&gt;
      &lt;td&gt;51.30859375&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;”(‘calculate_top_10-afc867e38c3bd0aac8c18bb00d3634ca’, 2)”&lt;/td&gt;
      &lt;td&gt;56.19140625&lt;/td&gt;
      &lt;td&gt;56.19140625&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;”(‘calculate_top_10-afc867e38c3bd0aac8c18bb00d3634ca’, 0)”&lt;/td&gt;
      &lt;td&gt;51.70703125&lt;/td&gt;
      &lt;td&gt;54.26953125&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;”(‘calculate_top_10-afc867e38c3bd0aac8c18bb00d3634ca’, 1)”&lt;/td&gt;
      &lt;td&gt;52.30078125&lt;/td&gt;
      &lt;td&gt;52.30078125&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;”(‘calculate_top_10-afc867e38c3bd0aac8c18bb00d3634ca’, 3)”&lt;/td&gt;
      &lt;td&gt;51.48046875&lt;/td&gt;
      &lt;td&gt;384.00390625&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The bottom four lines are the interesting ones; all four start with a minimum memory usage of ~50MB RAM, and then memory may or may not increase as the code runs.
How much it increases presumably depends on the size of the files; most of them are quite small, so memory usage doesn’t change much.
&lt;strong&gt;One file uses much more maximum memory than the others, 384MB of RAM; presumably it’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;big.txt&lt;/code&gt; which is 25MB, since the other files are all smaller than 1MB.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mechanism used, polling peak process memory, has some limitations:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You’ll notice there’s a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gc.collect()&lt;/code&gt; at the top of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calculate_top_10()&lt;/code&gt;; this ensures we don’t count memory from previous code that hasn’t been cleaned up yet.&lt;/li&gt;
  &lt;li&gt;There’s also a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sleep()&lt;/code&gt; at the bottom of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calculate_top_10()&lt;/code&gt;.
Because polling is used, tasks that run too quickly won’t get accurate information—the polling happens every 10ms or so, so you want to sleep at least 20ms.&lt;/li&gt;
  &lt;li&gt;Finally, because polling is per-process, you can’t run multiple threads per worker, otherwise you’ll get results that combine memory usage of multiple tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;interpreting-the-data&quot;&gt;Interpreting the data&lt;/h3&gt;

&lt;p&gt;What we’ve learned is that memory usage of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calculate_top_10()&lt;/code&gt; grows with file size; this can be used to &lt;a href=&quot;https://pythonspeed.com/articles/estimating-memory-usage/&quot;&gt;characterize the memory requirements for the workload&lt;/a&gt;.
That is, we can create a model that links data input sizes and required RAM, and then we can calculate the required RAM for any given level of parallelism.
And that can guide our choice of hardware, if we assume one task per CPU core.&lt;/p&gt;

&lt;p&gt;Going back to my original motivating problem, the gene sequencing pipeline: using the data from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt;, I was able to come up with a formula saying “for this size input, this much memory is necessary”.
Whenever we ran a batch job we could therefore set the parallelism as high as possible given the number of CPUs and RAM on the machine.&lt;/p&gt;

&lt;p&gt;While this allowed for more parallelism, it still wasn’t sufficient—processing was still using a huge amount of RAM, RAM that we had to pay for either with time (by using less CPUs) or money (by paying for more expensive virtual machines that more RAM).
So the next step was to reduce memory usage.&lt;/p&gt;

&lt;h2 id=&quot;fil&quot;&gt;Reducing memory usage with Fil&lt;/h2&gt;

&lt;p&gt;If we look at the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt; output for our word-counting example, the memory usage seems rather high: for a 25MB file, we’re using 330MB of RAM to count words.
Thinking through how an ideal version of this code might work, we ought to be able to process the file with much less memory (for example we could redesign our code to process the file line by line, reducing memory).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And that’s another way in which &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt; can be helpful: it can point us at specific code that needs memory usage optimized, at the granularity of a task.&lt;/strong&gt;
A task can be a rather large chunk of code, though, so the next step is to use a memory profiler that can point to specific lines of code.&lt;/p&gt;

&lt;p&gt;When working on the gene sequencing tool I used the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;memory_profiler&lt;/code&gt; package, and while that worked, and I managed to reduce memory usage quite a bit, I found it quite difficult to use.
It turns out that for batch data processing, the typical use case for Dask, &lt;a href=&quot;https://pythonspeed.com/articles/memory-profiler-data-scientists/&quot;&gt;you want a different kind of memory profiler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So after I’d left that job, I created &lt;a href=&quot;https://pythonspeed.com/fil&quot;&gt;a memory profiler called Fil&lt;/a&gt; that is expressly designed for finding peak memory usage.
Unlike &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt;, which can be run on production workloads, Fil slows down your execution and has other limitations I’m currently working on (it doesn’t support multiple processes, as of March 2021), so for now it’s better used for manual profiling.&lt;/p&gt;

&lt;p&gt;We can write a little script that only runs on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;big.txt&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pathlib&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;example2&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;calculate_top_10&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;calculate_top_10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;files/big.txt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Run it under Fil:&lt;/p&gt;

&lt;div class=&quot;language-shell-session highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;pip install filprofiler
fil-profile run example3.py
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the result shows us where the bulk of the memory is being allocated:&lt;/p&gt;

&lt;iframe id=&quot;peak&quot; src=&quot;/images/dask_memusage/peak-memory.svg&quot; width=&quot;100%&quot; height=&quot;300&quot; scrolling=&quot;auto&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Reading in the file takes 8% of memory, but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data.split()&lt;/code&gt; is responsible for 84% of memory.
Perhaps we shouldn’t be loading the whole file into memory and splitting the whole file into words, and instead we should be processing the file line by line.
A good next step if this were real code would be to fix the way &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;calculate_top_10()&lt;/code&gt; is implemented.&lt;/p&gt;

&lt;h2 id=&quot;next-steps&quot;&gt;Next steps&lt;/h2&gt;

&lt;p&gt;What should you do if your Dask workload is using too much memory?&lt;/p&gt;

&lt;p&gt;If you’re running Dask workloads with the Distributed backend, and you’re fine with only having one thread per worker, running with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt; will give you real-world per-task memory usage on production workloads.
You can then use the resulting information in a variety of ways:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;As a starting point for optimizing memory usage.
Once you know which tasks use the most memory, you can then &lt;a href=&quot;https://pythonspeed.com/articles/memory-profiler-data-scientists/&quot;&gt;use Fil to figure out which lines of code are responsible&lt;/a&gt; and then use &lt;a href=&quot;https://pythonspeed.com/articles/data-doesnt-fit-in-memory/&quot;&gt;a variety of techniques to reduce memory usage&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;When possible, you can fine tune your chunking size; smaller chunks will use less memory.
If you’re using Dask Arrays you can &lt;a href=&quot;https://docs.dask.org/en/latest/array-chunks.html&quot;&gt;set the chunk size&lt;/a&gt;; with Dask Dataframes you can &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-best-practices.html#repartition-to-reduce-overhead&quot;&gt;ensure good partition sizes&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;You can fine tune your hardware configuration, so you’re not wasting RAM or CPU cores.
For example, on AWS you can &lt;a href=&quot;https://instances.vantage.sh/&quot;&gt;choose a variety of instance sizes&lt;/a&gt; with different RAM/CPU ratios, one of which may match your workload characteristics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my original use case, the gene sequencing pipeline, I was able to use a combination of lower memory use and lower CPU use to reduce costs to a much more modest level.
And when doing R&amp;amp;D, I was able to get faster results with the same hardware costs.&lt;/p&gt;

&lt;p&gt;You can &lt;a href=&quot;github.com/itamarst/dask-memusage/&quot;&gt;learn more about &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-memusage&lt;/code&gt; here&lt;/a&gt;, and &lt;a href=&quot;https://pythonspeed.com/fil&quot;&gt;learn more about the Fil memory profiler here&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Getting to know the life science community</title>
   <link href="https://blog.dask.org/2021/03/04/the-life-science-community"/>
   <updated>2021-03-04T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/03/04/the-life-science-community</id>
   
   <category>imaging</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;Dask wants to better support the needs of life scientists. We’ve been getting to know the community, in order to better understand:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Who is out there?&lt;/li&gt;
  &lt;li&gt;What kind of problems are they trying to solve?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’ve learned that:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Lots of people want more examples tailored to their specific scientifc domain.&lt;/li&gt;
  &lt;li&gt;Better integration of Dask into other software is considered very important.&lt;/li&gt;
  &lt;li&gt;Managing memory constraints when working with big data is a common pain point.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our strategic plan for this year involves three parallel streams:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#infrastructure&quot;&gt;INFRASTRUCTURE&lt;/a&gt; (60%) - improvements to Dask, or to other software with many life science users.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#outreach&quot;&gt;OUTREACH&lt;/a&gt; (20%) - blogposts, talks, webinars, tutorials, and examples.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#applications&quot;&gt;APPLICATIONS&lt;/a&gt; (20%) - the application of Dask to a specific life science problem, collaborating with individual labs or groups.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you still want to have your say, it’s not too late -
&lt;a href=&quot;https://t.co/0NeknSdrO9?amp=1&quot;&gt;click this link to get in touch!&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;contents&quot;&gt;Contents&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#background&quot;&gt;Background&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#what-we-learned&quot;&gt;What we learned&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#from-dask-users&quot;&gt;From Dask users&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#from-other-software-libraries&quot;&gt;From other software libraries&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#opportunities-we-see&quot;&gt;Opportunities we see&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#strategic-plan&quot;&gt;Strategic plan&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#limitations&quot;&gt;Limitations&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#methods&quot;&gt;Methods&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;

&lt;p&gt;Recently Dask &lt;a href=&quot;https://chanzuckerberg.com/eoss/proposals/&quot;&gt;won some funding&lt;/a&gt; to hire a developer (&lt;a href=&quot;https://github.com/GenevieveBuckley/&quot;&gt;Genevieve Buckley&lt;/a&gt;) to improve Dask specifically for life sciences.&lt;/p&gt;

&lt;p&gt;Working with scientists is a really great way to drive growth in open source projects. Both scientists and software developers benefit. Early on, Dask had a lot of success integrating with the geosciences community. It’d be great to see similar success for life sciences too.&lt;/p&gt;

&lt;p&gt;There are several areas of life science where we see Dask being used today:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Biological image processing&lt;/li&gt;
  &lt;li&gt;Single cell analysis&lt;/li&gt;
  &lt;li&gt;Statistical genetics&lt;/li&gt;
  &lt;li&gt;…and many more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ve solicited feedback from the life science community, to come up with a strategic plan to direct our effort over the next year.&lt;/p&gt;

&lt;h2 id=&quot;what-we-learned&quot;&gt;What we learned&lt;/h2&gt;

&lt;h3 id=&quot;from-dask-users&quot;&gt;From Dask users&lt;/h3&gt;

&lt;p&gt;When we talked to individual Dask users, we heard a lot of similar themes in their comments.&lt;/p&gt;

&lt;p&gt;People wanted:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Better documentation and examples&lt;/li&gt;
  &lt;li&gt;Better support for working with constrained resources&lt;/li&gt;
  &lt;li&gt;Better interoperability with other software tools&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most common request was for better documentation with more examples. People across many different areas of life science all said this could help them a lot. A corresponding challenge here is the multitude of different areas of life science, all of which require targeted documentation.&lt;/p&gt;

&lt;p&gt;GPU support was also commonly mentioned. Comments about GPUs fit into two of the categories above: GPU memory is often a constraint, and life scientists also want it to be easier to apply deep learning models to their data.&lt;/p&gt;

&lt;h3 id=&quot;from-other-software-libraries&quot;&gt;From other software libraries&lt;/h3&gt;

&lt;p&gt;We didn’t only talk with individual users of Dask. We also spoke to developers of scientific software projects.&lt;/p&gt;

&lt;h4 id=&quot;why-would-other-software-libraries-adopt-dask&quot;&gt;Why would other software libraries adopt Dask?&lt;/h4&gt;

&lt;p&gt;Software projects wanted to solve problems related to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Easier deployment to distributed clusters&lt;/li&gt;
  &lt;li&gt;Managing memory when processing large datasets&lt;/li&gt;
  &lt;li&gt;Parallelization of existing functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dask is good at solving those kinds of problems, and might be a good solution for this.&lt;/p&gt;

&lt;h4 id=&quot;who-weve-talked-to&quot;&gt;Who we’ve talked to&lt;/h4&gt;

&lt;p&gt;Some of the software projects we spoke to include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://napari.org/&quot;&gt;napari&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://pystatgen.github.io/sgkit/latest/&quot;&gt;sgkit&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://scanpy.readthedocs.io/en/stable/&quot;&gt;scanpy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://squidpy.readthedocs.io/en/latest/&quot;&gt;squidpy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.ilastik.org/&quot;&gt;ilastik&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://cellprofiler.org/&quot;&gt;CellProfiler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;current-status&quot;&gt;Current status&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://napari.org/&quot;&gt;napari&lt;/a&gt; is a python based image viewer. Dask is already well-integrated with napari. Areas for opportunity here include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Improved documentation about how to work efficiently with Dask arrays in napari.&lt;/li&gt;
  &lt;li&gt;Smarter caching of neighbouring image chunks to avoid lag.&lt;/li&gt;
  &lt;li&gt;Guides for how to create plugins for napari, so the community can grow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://pystatgen.github.io/sgkit/latest/&quot;&gt;sgkit&lt;/a&gt; is a statistical genetics toolkit. Dask is already well-integrated with sgkit. The developers would like improved infrastructure in the main Dask repositories that they can benefit from. Wishlist items include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Better ways to understand how things like array chunks change as they move through a Dask computation.&lt;/li&gt;
  &lt;li&gt;Better high level graph visualizations. Graph visualizations showing all the low level operations can be overwhelming.&lt;/li&gt;
  &lt;li&gt;Better ways to identify poorly efficient areas in Dask computations.&lt;/li&gt;
  &lt;li&gt;Stability when new versions of Dask are released&lt;/li&gt;
  &lt;li&gt;Making it easier to run Dask in the cloud. They are currently using &lt;a href=&quot;https://github.com/dask/dask-cloudprovider&quot;&gt;dask-cloudprovider&lt;/a&gt; and finding that very useful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://scanpy.readthedocs.io/en/stable/&quot;&gt;scanpy&lt;/a&gt; is a library for single cell analysis in Python. It is built together with &lt;a href=&quot;https://anndata.readthedocs.io/en/latest/&quot;&gt;anndata&lt;/a&gt;, an annotated data structure.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Data size is less of an issue for scanpy users, although anndata developers do think support for Dask would be a useful thing to add.&lt;/li&gt;
  &lt;li&gt;Support for sparse arrays is very important for these communities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://squidpy.readthedocs.io/en/latest/&quot;&gt;squidpy&lt;/a&gt; is a tool for the analysis and visualization of spatial molecular data. It builds on top of scanpy and anndata. Because squidpy involves large imaging data on top of what we’d normally see for datasets in scanpy/anndata, this is a project with a large area of opportunity for Dask.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Integrating Dask with the squidpy ImageContainer class is a good first step towards handling large image data within the availabe RAM constraints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://www.ilastik.org/&quot;&gt;ilastik&lt;/a&gt; does not currently use Dask at all. They are curious to see if Dask can make it easier to scale up from a single machine to a cluster.
Users generally train an ilastik model interactively, and then want to apply it to many images. This second step is often when people want an easy way to scale up the computing resources available.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://cellprofiler.org/&quot;&gt;CellProfiler&lt;/a&gt; is a pipeline tool for image processing. They have briefly experimented with Dask before.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Primarily, they want to parallelize existing functionality.&lt;/li&gt;
  &lt;li&gt;Most common pipelines fall into three major “user stories” where focussing effort would make the most impact:
    &lt;ol&gt;
      &lt;li&gt;Image processing&lt;/li&gt;
      &lt;li&gt;Object processing&lt;/li&gt;
      &lt;li&gt;Measurements&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;opportunities-we-see&quot;&gt;Opportunities we see&lt;/h2&gt;

&lt;p&gt;Because large scientific software projects have many users, improvements here would be high value for the scientific community. This is a huge area of opportunity. We plan to collaborate with these developer communities as much as possible to drive this forward.&lt;/p&gt;

&lt;p&gt;Another area of opportunity is improving infrastructure for &lt;a href=&quot;https://github.com/dask/dask/issues/7141&quot;&gt;high level graph visualizations&lt;/a&gt;. Power users and novices alike would benefit from better tools for identifying areas of inefficiencies in Dask computations.&lt;/p&gt;

&lt;p&gt;Finally, continuing to build support for Dask arrays with non-numpy chunks is also a high impact area of opportunity. In particular, support for sparse arrays, and support for arrays on the GPU were highlighted as very important to the life science community.&lt;/p&gt;

&lt;h2 id=&quot;strategic-direction&quot;&gt;Strategic direction&lt;/h2&gt;

&lt;p&gt;We’re going to manage this project with three parallel streams:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#infrastructure&quot;&gt;INFRASTRUCTURE&lt;/a&gt; (60%)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#outreach&quot;&gt;OUTREACH&lt;/a&gt; (20%)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#applications&quot;&gt;APPLICATIONS&lt;/a&gt; (20%)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each stream will likely have one primary project at any time, with many more queued. Within each stream, proposed projects will be ranked according to: level of impact, time commitment required, and the availability of other developer resources.&lt;/p&gt;

&lt;h3 id=&quot;infrastructure&quot;&gt;Infrastructure&lt;/h3&gt;

&lt;p&gt;Infrastructure projects are improvements to either:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Projects housed within the &lt;a href=&quot;https://github.com/dask/&quot;&gt;Dask organisation&lt;/a&gt;, or&lt;/li&gt;
  &lt;li&gt;Other software projects involving Dask with large numbers of life science users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll aim to spend around 60% of project effort on infrastructure.&lt;/p&gt;

&lt;h3 id=&quot;outreach&quot;&gt;Outreach&lt;/h3&gt;

&lt;p&gt;Outreach activities include blogposts, talks, webinars, tutorials, and creating examples for documentation. We aim to spend around 20% of project effort on outreach.&lt;/p&gt;

&lt;p&gt;If you have outreach ideas you want to share (perhaps you run a student group or popular meetup) then you can &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScBi8YOx3gGkL9rz8TsRTIZYiRha9qYOvXu4EZx9qGLtjLGCw/viewform?usp=sf_link&quot;&gt;get in touch with us here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;applications&quot;&gt;Applications&lt;/h3&gt;

&lt;p&gt;The final stream focusses on the application of Dask to a specific problem in life science.&lt;/p&gt;

&lt;p&gt;These projects generally involve collaborating with individual labs or group, and have an end goal of summarizing their workflow in a blogpost. This feeds back into our outreach, so others in the community can learn from it.&lt;/p&gt;

&lt;p&gt;Ideally these are short term projects, so we can showcase many different applications of Dask. We aim to spend around 20% of project effort on applications.&lt;/p&gt;

&lt;p&gt;If you use Dask and have an example in mind you’d like to share, then you can &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScBi8YOx3gGkL9rz8TsRTIZYiRha9qYOvXu4EZx9qGLtjLGCw/viewform?usp=sf_link&quot;&gt;get in touch with us here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;how-will-we-know-what-success-looks-like&quot;&gt;How will we know what success looks like?&lt;/h3&gt;

&lt;p&gt;The role of Dask Life Science Fellow has a very broad scope, so there are a lot of different ways we could be successful within this space.&lt;/p&gt;

&lt;p&gt;Some indicators of success are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Bugs being clearly described, or bottlenecks clearly identified&lt;/li&gt;
  &lt;li&gt;Bug fixes&lt;/li&gt;
  &lt;li&gt;Improvements or new features made to Dask infrastructure&lt;/li&gt;
  &lt;li&gt;Improvements or new features made in related project repositories&lt;/li&gt;
  &lt;li&gt;Better integration or support for Dask made in related project repositories for life sciences&lt;/li&gt;
  &lt;li&gt;Better documentation with examples tailored to specific areas of life science&lt;/li&gt;
  &lt;li&gt;Blogposts written (ideally in collaboration with Dask users)&lt;/li&gt;
  &lt;li&gt;Talks given&lt;/li&gt;
  &lt;li&gt;Webinars produced&lt;/li&gt;
  &lt;li&gt;Tutorials created&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We won’t have the time or the resources to do all the things, but we will be able to make an impact by focussing on a subset.&lt;/p&gt;

&lt;h2 id=&quot;limitations&quot;&gt;Limitations&lt;/h2&gt;

&lt;p&gt;The information we discovered talking to the life science community is likely to be biased in a few different ways.&lt;/p&gt;

&lt;p&gt;My (Genevieve’s) network is strongest among imaging scientists, and among people in Australia. It’s much less strong for other fields in life science, as my original training is in physics.&lt;/p&gt;

&lt;p&gt;The Dask project has strong links to other open source python projects, including scientific software. The Dask developer community also has strong links from companies including NVIDIA, Quansight, and others. They are likely to be over-represented among the people we spoke to.&lt;/p&gt;

&lt;p&gt;It’s much harder to find people who aren’t using Dask at all yet but have problems that would be a good fit for it. These people are very unlikely to be, say following &lt;a href=&quot;https://twitter.com/dask_dev/&quot;&gt;Dask on twitter&lt;/a&gt;, and probably won’t be aware that we’re looking for them.&lt;/p&gt;

&lt;p&gt;I don’t think there are any perfect solutions to these problems.
We’ve tried to mitigate these effects by using loose second and third degree connections to spread awareness, as well as posting in science public forums.&lt;/p&gt;

&lt;h2 id=&quot;methods&quot;&gt;Methods&lt;/h2&gt;

&lt;p&gt;We used a variety of approaches to gather feedback from the life science community.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A &lt;a href=&quot;https://t.co/0NeknSdrO9?amp=1&quot;&gt;short survey&lt;/a&gt; was created to gather comments&lt;/li&gt;
  &lt;li&gt;It was advertised by the &lt;a href=&quot;https://twitter.com/dask_dev/&quot;&gt;@dask_dev&lt;/a&gt; twitter account&lt;/li&gt;
  &lt;li&gt;We asked related software projects consider retweeting for reach (&lt;a href=&quot;https://twitter.com/napari_imaging/status/1360090299901505543&quot;&gt;example&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;We posted in scientific Slack groups and online public forums&lt;/li&gt;
  &lt;li&gt;We emailed other life scientists in our network, asking them to let their networks know too&lt;/li&gt;
  &lt;li&gt;We contacted a number of life science researchers directly.&lt;/li&gt;
  &lt;li&gt;We contacted several other scientific software groups directly and spoke with the developers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;join-the-discussion&quot;&gt;Join the discussion&lt;/h2&gt;

&lt;p&gt;Come join us in the Dask slack! We have a #life-science channel so there’s a place to discuss things relevant to the Dask life science community. You can &lt;a href=&quot;https://join.slack.com/t/dask/shared_invite/zt-mfmh7quc-nIrXL6ocgiUH2haLYA914g&quot;&gt;request an invite to the Slack here&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask User Summit 2021</title>
   <link href="https://blog.dask.org/2021/03/03/summit"/>
   <updated>2021-03-03T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2021/03/03/summit</id>
   
   <content type="html">
&lt;p&gt;Dask is organizing a &lt;a href=&quot;https://summit.dask.org&quot;&gt;user summit&lt;/a&gt; in mid-May.
This will be a remote event focused on bringing together developers and users of Dask and the distributed PyData stack in different domains.&lt;/p&gt;

&lt;p&gt;User Summits like this are particularly important for a project like Dask
which serves such a diverse set of use cases.
Dask’s user communities include industries like finance, government, health,
geoscience, imaging, machine learning, and more. These communities often have
very similar problems, but don’t often communicate with each other.&lt;/p&gt;

&lt;p&gt;User summits provide a venue for disparate domains to connect over shared
technology challenges. Often a solution designed for one domain is useful for
others. As technologists, this sharing is critical in order to promote
consistent and high quality software solutions across domains, rather than
silo’ed solutions.&lt;/p&gt;

&lt;h3 id=&quot;history&quot;&gt;History&lt;/h3&gt;

&lt;p&gt;We organized a summit a year ago, focusing mainly on developers.
This was a fantastic time and resulted in a surprising amount of consensus building and forward movement both in technological and domain-specific directions.&lt;/p&gt;

&lt;p&gt;For more on our summit last year, see &lt;a href=&quot;../../../2020/04/28/dask-summit.html&quot;&gt;this post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/ERykEc9XUAEFq-L?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;
&lt;img src=&quot;https://pbs.twimg.com/media/ERzXhHnWAAE_zDA?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;organization&quot;&gt;Organization&lt;/h3&gt;

&lt;p&gt;We’ve asked &lt;a href=&quot;https://numfocus.org&quot;&gt;NumFOCUS&lt;/a&gt; to organize this event for us.
NumFOCUS runs the highly successful and community oriented PyData conference
series, and had great success with their remote-first PyData Global conference
late last year.&lt;/p&gt;

&lt;p&gt;Tickets are intended to be reasonably priced on a sliding scale, with assistance given to any in need.&lt;/p&gt;

&lt;h3 id=&quot;open-cfp&quot;&gt;Open CFP&lt;/h3&gt;

&lt;p&gt;I would like to encourage people submit proposals to talk at &lt;a href=&quot;https://summit.dask.org&quot;&gt;summit.dask.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would like to especially extend an invitation to those who are new to
the Dask community, or new to speaking in general. This year we’re especially
trying to highlight use cases of Dask, rather than developers pushing the
technology forward (although these talks are of course welcome as well).&lt;/p&gt;

&lt;p&gt;If you have an idea for a talk then please submit something and we’ll work
together on making it fit. Alternatively, if you have a colleague that you
think would enjoy or grow from speaking then I encourage you to encourage them
as well.&lt;/p&gt;

&lt;h3 id=&quot;workshops&quot;&gt;Workshops&lt;/h3&gt;

&lt;p&gt;Finally, I’m excited about an experiment that we’re running this year with
&lt;em&gt;workshops&lt;/em&gt;. These are intended to be two-hour blocks of time dedicated to
a particular topic, organized by a specific community member (perhaps you?).
If you have a consistent theme for a set of 3-5 talks then this option gives
you the ability to curate and control a dedicated block of the conference. You
can invite your colleagues and collaborators. We’ll handle the conference
infrastructure while you handle the content.&lt;/p&gt;

&lt;p&gt;We stole this structure from workshops at larger academic conferences. We
think that it fits Dask well specifically because of the federated nature of
our community. We hope that it gives space for sub-communities to assemble and
better establish cohesive working groups.&lt;/p&gt;

&lt;p&gt;Themes in the past have included topics like Pangeo, RAPIDS, workflow
management, imaging, and performance.&lt;/p&gt;

&lt;h3 id=&quot;apply-to-speak&quot;&gt;Apply to speak&lt;/h3&gt;

&lt;p&gt;Again, I encourage you and your colleagues to submit applications to speak this
year in May. The proposal page is at
&lt;a href=&quot;https://summit.dask.org/present/#guidelines&quot;&gt;https://summit.dask.org/present/#guidelines&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Image Analysis Redux</title>
   <link href="https://blog.dask.org/2020/11/12/deconvolution"/>
   <updated>2020-11-12T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/11/12/deconvolution</id>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://blog.dask.org/2019/08/09/image-itk&quot;&gt;Last year&lt;/a&gt; we experimented with
Dask/ITK/Scikit-Image to perform large scale image analysis on a stack of 3D
images. Specifically, we looked at deconvolution, a common method to &lt;em&gt;deblur&lt;/em&gt;
images. Now, a year later, we return to these experiments with a better
understanding of how Dask and CuPy can interact, enhanced serialization
methods, and support from the open-source community. This post looks at the
following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Implementing a common deconvolution method for CPU + GPU&lt;/li&gt;
  &lt;li&gt;Leveraging Dask to perform deconvolution on a larger dataset&lt;/li&gt;
  &lt;li&gt;Exploring the results with the Napari image viewer&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;image-analysis-redux&quot;&gt;Image Analysis Redux&lt;/h2&gt;

&lt;p&gt;Previously we used the &lt;a href=&quot;https://en.wikipedia.org/wiki/Richardson%E2%80%93Lucy_deconvolution&quot;&gt;Richardson Lucy
(RL)&lt;/a&gt;
deconvolution algorithm from ITK and
&lt;a href=&quot;https://github.com/scikit-image/scikit-image/blob/master/skimage/restoration/deconvolution.py#L329&quot;&gt;Scikit-Image&lt;/a&gt;.
We left off at theorizing how GPUs could potentially help accelerate these
workflows. Starting with Scikit-Image’s implementation, we naively tried
replacing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scipy.signal.convolve&lt;/code&gt; calls with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cupyx.scipy.ndimage.convolve&lt;/code&gt;,
and while performance improved, it did not improve &lt;em&gt;significantly&lt;/em&gt; – that is,
we did not get the 100X speed we were looking for.&lt;/p&gt;

&lt;p&gt;As it often turns out in mathematics a problem that can be inefficient to solve
in one representation can often be made more efficent by transforming the data
beforehand. In this new representation we can solve the same problem
(convolution in this case) more easily before transforming the result back into
a more familiar representation. When it comes to convolution, the
transformation we apply is called &lt;a href=&quot;https://en.wikipedia.org/wiki/Fast_Fourier_transform&quot;&gt;Fast-Fourier Transform
(FFT)&lt;/a&gt;. Once this is
applied we are able to convolve data using a simple multiplication.&lt;/p&gt;

&lt;p&gt;As it turns out this FFT transformation is extremely fast on both CPUs and
GPUs. Similarly the algorithm we can write with FFTs is accelerated. This is a
commonly used technique in the image processing field to speed up convolutions.
Despite the added step of doing FFTs, the cost of transformation + the cost of
the algorithm is still lower than performing the original algorithm in real
space. We (and others before us) found this was the case for Richardson Lucy
(on both CPUs and GPUs) and performance continued increasing when we
parallelized with Dask over multiple GPUs.&lt;/p&gt;

&lt;h2 id=&quot;help-from-open-source&quot;&gt;Help from Open-Source&lt;/h2&gt;

&lt;p&gt;An FFT RL equivalent has been around for some time and the good folks at the
&lt;a href=&quot;https://sdo.gsfc.nasa.gov/mission/instruments.php&quot;&gt;Solar Dynamics Observatory&lt;/a&gt;
built and shared a NumPy/CuPy implementation as part the &lt;a href=&quot;https://aiapy.readthedocs.io/en/v0.2.0/_modules/aiapy/psf/deconvolve.html&quot;&gt;Atmospheric Imaging
Assembly&lt;/a&gt;
Python package (aiapy). We slightly modified their implementation to handle 3D
as well as 2D &lt;a href=&quot;https://en.wikipedia.org/wiki/Point_spread_function&quot;&gt;Point Spread
Functions&lt;/a&gt; and to take
advantage of
&lt;a href=&quot;https://numpy.org/neps/nep-0018-array-function-protocol.html&quot;&gt;NEP-18&lt;/a&gt; for
convenient dispatching of NumPy and CuPy to NumPy and CuPy functions:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;deconvolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Pad PSF with zeros to match image shape
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;pad_l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pad_r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;divmod&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;pad_r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pad_l&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pad&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;tuple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pad_l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pad_r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;constant&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;constant_values&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Recenter PSF at the origin
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# Needed to ensure PSF doesn&apos;t introduce an offset when
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# convolving with image
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;roll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Convolution requires FFT of the PSF
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rfftn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Perform deconvolution in-place on a copy of the image
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# (avoids changing the original)
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;img_decon&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ratio&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;irfftn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rfftn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img_decon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;img_decon&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;irfftn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rfftn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ratio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;conj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;conj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img_decon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For a 1.3 GB image we measured the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CuPy ~3 seconds for 20 iterations&lt;/li&gt;
  &lt;li&gt;NumPy ~36 seconds for 2 iterations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We see 10x increase in speed for 10 times the number of iterations – very
close to our desired 100x speedup! Let’s explore how this implementation
performs with real biological data and Dask…&lt;/p&gt;

&lt;h2 id=&quot;define-a-dask-cluster-and-load-the-data&quot;&gt;Define a Dask Cluster and Load the Data&lt;/h2&gt;

&lt;p&gt;We were provided sample data from &lt;a href=&quot;https://www.nibib.nih.gov/about-nibib/staff/hari-shroff&quot;&gt;Prof.
Shroff’s&lt;/a&gt; lab at the
NIH. The data originally was provided as a 3D TIFF file which we subsequently
converted to Zarr with a shape of (950, 2048, 2048).&lt;/p&gt;

&lt;p&gt;We start by creating a Dask cluster on a DGX2 (16 GPUs in a single node) and
loading the image stored in Zarr :&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/quasiben/3a638bb9a4f075ac9041bf66974ebb45&quot;&gt;Example Notebook&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cuda&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCUDACluster&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;rmm&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCUDACluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;local_directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/tmp/bzaitlen&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;enable_nvlink&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rmm_pool_size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;26GB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cuda&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_allocator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rmm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rmm_cupy_allocator&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_zarr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/public/NVMICROSCOPY/y1z1_C1_A.zarr/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 7.97 GB &lt;/td&gt; &lt;td&gt; 8.39 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (950, 2048, 2048) &lt;/td&gt; &lt;td&gt; (1, 2048, 2048) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 951 Tasks &lt;/td&gt;&lt;td&gt; 950 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;212&quot; height=&quot;202&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;42&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;120&quot; x2=&quot;42&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;120&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;2&quot; x2=&quot;12&quot; y2=&quot;122&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;4&quot; x2=&quot;14&quot; y2=&quot;124&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;6&quot; x2=&quot;16&quot; y2=&quot;126&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;8&quot; x2=&quot;18&quot; y2=&quot;128&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;10&quot; x2=&quot;20&quot; y2=&quot;130&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;12&quot; x2=&quot;22&quot; y2=&quot;132&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;14&quot; x2=&quot;24&quot; y2=&quot;134&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;16&quot; x2=&quot;26&quot; y2=&quot;136&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;18&quot; x2=&quot;28&quot; y2=&quot;138&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;20&quot; x2=&quot;30&quot; y2=&quot;140&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;22&quot; x2=&quot;32&quot; y2=&quot;142&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;24&quot; x2=&quot;34&quot; y2=&quot;144&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;26&quot; x2=&quot;36&quot; y2=&quot;146&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;28&quot; x2=&quot;38&quot; y2=&quot;148&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;31&quot; x2=&quot;41&quot; y2=&quot;151&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;42&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 42.743566,32.743566 42.743566,152.743566 10.000000,120.000000&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;130&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;2&quot; x2=&quot;132&quot; y2=&quot;2&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;4&quot; x2=&quot;134&quot; y2=&quot;4&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;6&quot; x2=&quot;136&quot; y2=&quot;6&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;8&quot; x2=&quot;138&quot; y2=&quot;8&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;10&quot; x2=&quot;140&quot; y2=&quot;10&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;12&quot; x2=&quot;142&quot; y2=&quot;12&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;14&quot; x2=&quot;144&quot; y2=&quot;14&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;16&quot; x2=&quot;146&quot; y2=&quot;16&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;18&quot; x2=&quot;148&quot; y2=&quot;18&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;20&quot; x2=&quot;150&quot; y2=&quot;20&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;22&quot; x2=&quot;152&quot; y2=&quot;22&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;24&quot; x2=&quot;154&quot; y2=&quot;24&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;26&quot; x2=&quot;156&quot; y2=&quot;26&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;28&quot; x2=&quot;158&quot; y2=&quot;28&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;31&quot; x2=&quot;161&quot; y2=&quot;31&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;162&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;42&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;130&quot; y1=&quot;0&quot; x2=&quot;162&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 130.000000,0.000000 162.743566,32.743566 42.743566,32.743566&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;162&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;152&quot; x2=&quot;162&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;42&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;162&quot; y1=&quot;32&quot; x2=&quot;162&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;42.743566,32.743566 162.743566,32.743566 162.743566,152.743566 42.743566,152.743566&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;102.743566&quot; y=&quot;172.743566&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;2048&lt;/text&gt;
&lt;text x=&quot;182.743566&quot; y=&quot;92.743566&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,182.743566,92.743566)&quot;&gt;2048&lt;/text&gt;
&lt;text x=&quot;16.371783&quot; y=&quot;156.371783&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,16.371783,156.371783)&quot;&gt;950&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;From the Dask output above you can see the data is a z-stack of 950 images
where each slice is 2048x2048. For this data set, we can improve GPU
performance if we operate on larger chunks. Additionally, we need to ensure
the chunks are are least as big as the PSF which in this case is, (128, 128,
128). As we did our work on a DGX2, which has 16 GPUs, we can comfortably fit
the data and perform deconvolution on each GPU if we &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rechunk&lt;/code&gt; the data
accordingly:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# chunk with respect to PSF shape (128, 128, 128)
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rechunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;190&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;512&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;512&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;td&gt;
  &lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 7.97 GB &lt;/td&gt; &lt;td&gt; 99.61 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (950, 2048, 2048) &lt;/td&gt; &lt;td&gt; (190, 512, 512) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 967 Tasks &lt;/td&gt;&lt;td&gt; 80 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;

&lt;p&gt;Next, we convert to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;float32&lt;/code&gt; as the data may not already be of floating point
type. Also 32-bit is a bit faster than 64-bit when computing and saves a bit on
memory. Below we map &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cupy.asarray&lt;/code&gt; onto each block of data. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cupy.asarray&lt;/code&gt;
moves the data from host memory (NumPy) to the device/GPU (CuPy).&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;c_imgs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;asarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 15.94 GB &lt;/td&gt; &lt;td&gt; 199.23 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (950, 2048, 2048) &lt;/td&gt; &lt;td&gt; (190, 512, 512) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 80 Tasks &lt;/td&gt;&lt;td&gt; 80 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; float32 &lt;/td&gt;&lt;td&gt; cupy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;212&quot; height=&quot;202&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;42&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;30&quot; x2=&quot;42&quot; y2=&quot;62&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;60&quot; x2=&quot;42&quot; y2=&quot;92&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;90&quot; x2=&quot;42&quot; y2=&quot;122&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;120&quot; x2=&quot;42&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;120&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;6&quot; x2=&quot;16&quot; y2=&quot;126&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;13&quot; x2=&quot;23&quot; y2=&quot;133&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;19&quot; x2=&quot;29&quot; y2=&quot;139&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;26&quot; x2=&quot;36&quot; y2=&quot;146&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;42&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.0,0.0 42.74356617647059,32.74356617647059 42.74356617647059,152.74356617647058 10.0,120.0&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;130&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;6&quot; x2=&quot;136&quot; y2=&quot;6&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;13&quot; x2=&quot;143&quot; y2=&quot;13&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;19&quot; x2=&quot;149&quot; y2=&quot;19&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;26&quot; x2=&quot;156&quot; y2=&quot;26&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;162&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;42&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;40&quot; y1=&quot;0&quot; x2=&quot;72&quot; y2=&quot;32&quot; /&gt;
  &lt;line x1=&quot;70&quot; y1=&quot;0&quot; x2=&quot;102&quot; y2=&quot;32&quot; /&gt;
  &lt;line x1=&quot;100&quot; y1=&quot;0&quot; x2=&quot;132&quot; y2=&quot;32&quot; /&gt;
  &lt;line x1=&quot;130&quot; y1=&quot;0&quot; x2=&quot;162&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.0,0.0 130.0,0.0 162.74356617647058,32.74356617647059 42.74356617647059,32.74356617647059&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;162&quot; y2=&quot;32&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;62&quot; x2=&quot;162&quot; y2=&quot;62&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;92&quot; x2=&quot;162&quot; y2=&quot;92&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;122&quot; x2=&quot;162&quot; y2=&quot;122&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;152&quot; x2=&quot;162&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;42&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;72&quot; y1=&quot;32&quot; x2=&quot;72&quot; y2=&quot;152&quot; /&gt;
  &lt;line x1=&quot;102&quot; y1=&quot;32&quot; x2=&quot;102&quot; y2=&quot;152&quot; /&gt;
  &lt;line x1=&quot;132&quot; y1=&quot;32&quot; x2=&quot;132&quot; y2=&quot;152&quot; /&gt;
  &lt;line x1=&quot;162&quot; y1=&quot;32&quot; x2=&quot;162&quot; y2=&quot;152&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;42.74356617647059,32.74356617647059 162.74356617647058,32.74356617647059 162.74356617647058,152.74356617647058 42.74356617647059,152.74356617647058&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;102.743566&quot; y=&quot;172.743566&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;2048&lt;/text&gt;
&lt;text x=&quot;182.743566&quot; y=&quot;92.743566&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,182.743566,92.743566)&quot;&gt;2048&lt;/text&gt;
&lt;text x=&quot;16.371783&quot; y=&quot;156.371783&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,16.371783,156.371783)&quot;&gt;950&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;What we now have is a Dask array composed of 16 CuPy blocks of data. Notice
how Dask provides nice typing information in the SVG output. When we moved
from NumPy to CuPy, the block diagram above displays &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Type: cupy.ndarray&lt;/code&gt; –
this is a nice sanity check.&lt;/p&gt;

&lt;p&gt;The last piece we need before running the deconvolution is the PSF which should
also be loaded onto the GPU:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;skimage.io&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;skimage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/public/NVMICROSCOPY/PSF.tif&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;c_psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;asarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Lastly, we call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt; with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deconvolve&lt;/code&gt; function across the Dask
array:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_overlap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deconvolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;c_imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c_psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c_imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;depth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;tuple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c_psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;boundary&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;periodic&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/images/deconvolve.png&quot;&gt;
    &lt;img src=&quot;/images/deconvolve.png&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The image above is taken from a mouse intestine.&lt;/p&gt;

&lt;p&gt;With Dask and multiple GPUs, we measured deconvolution of an 16GB image in ~30
seconds! But this is just the first step towards accelerated image science.&lt;/p&gt;

&lt;h2 id=&quot;napari&quot;&gt;Napari&lt;/h2&gt;

&lt;p&gt;Deconvolution is just one operation and one tool, an image scientist or
microscopist will need. They will need other tools as they study the
underlying biology. Before getting to those next steps, they will need tools
to visualize the data. &lt;a href=&quot;https://napari.org/&quot;&gt;Napari&lt;/a&gt;, a multi-dimensional image
viewer used in the PyData Bio ecosystem, is a good tool for visualizing this
data. As an experiment, we ran the same workflow on a local workstation with 2
Quadro RTX 8000 GPUs connected with NVLink. &lt;a href=&quot;https://gist.github.com/quasiben/02b3dabba8fb3415e40e685b3cb2ca4a&quot;&gt;Example
Notebook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By adding a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; call to our array, we can move our data &lt;em&gt;back&lt;/em&gt; from
GPU to CPU (device to host).&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;cupy_to_numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;asnumpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;np_out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy_to_numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/images/napari-deconv.png&quot;&gt;
    &lt;img src=&quot;/images/napari-deconv.png&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the user moves the slider on the Napari UI, we are instructing dask to the
following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Load the data from disk onto the GPU (CuPy)&lt;/li&gt;
  &lt;li&gt;Compute the deconvolution&lt;/li&gt;
  &lt;li&gt;Move back to the host (NumPy)&lt;/li&gt;
  &lt;li&gt;Render with Napari&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This has about a second latency which is great for a naive implementation! We
can improve this by adding caching, improving communications with
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_overlap&lt;/code&gt;, and optimizing the deconvolution kernel.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;We have now shown with Dask + CuPy how one can perform Richardson-Lucy
Deconvolution. This required a minimal amount of code. Combining this with an
image viewer (Napari), we were able to inspect the data and our result. All of
this performed reasonably well by assembling PyData libraries: Dask, CuPy,
Zarr, and Napari with a new deconvolution kernel. Hopefully this provides you
a good template to get started analyzing your own data and demonstrates the
richness and easy expression of custom workflows. If you run into any
challenges, please reach out on &lt;a href=&quot;https://github.com/dask/dask/issues&quot;&gt;the Dask issue
tracker&lt;/a&gt; and we would be happy to engage
with you :)&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>2020 Dask User Survey</title>
   <link href="https://blog.dask.org/2020/09/22/user_survey"/>
   <updated>2020-09-22T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/09/22/user_survey</id>
   
   <category>User Survey</category>
   
   <content type="html">
&lt;style type=&quot;text/css&quot;&gt;
table td {
    background: none;
}

table tr.even td {
    background: none;
}

table {
    text-shadow: none;
}

table tr:hover td {
    background: none;
}

&lt;/style&gt;

&lt;p&gt;This post presents the results of the 2020 Dask User Survey,
which ran earlier this summer. Thanks to everyone who took the time to fill out the survey!
These results help us better understand the Dask community and will guide future development efforts.&lt;/p&gt;

&lt;p&gt;The raw data, as well as the start of an analysis, can be found in this binder:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://mybinder.org/v2/gh/dask/dask-examples/main?urlpath=%2Ftree%2Fsurveys%2F2020.ipynb&quot;&gt;&lt;img src=&quot;https://mybinder.org/badge_logo.svg&quot; alt=&quot;Binder&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let us know if you find anything in the data.&lt;/p&gt;

&lt;h2 id=&quot;highlights&quot;&gt;Highlights&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;We had 240 responses to the survey (slightly fewer than last year, which had about 260).&lt;/li&gt;
  &lt;li&gt;Overall, results look mostly similar to last year’s.&lt;/li&gt;
  &lt;li&gt;Our documentation has probably improved relative to last year&lt;/li&gt;
  &lt;li&gt;Respondents care more about performance relative to last year.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;new-questions&quot;&gt;New Questions&lt;/h2&gt;

&lt;p&gt;Most of the questions are the same as in 2019. We added a couple questions about deployment and dashboard usage. Let’s look at those first.&lt;/p&gt;

&lt;p&gt;Among respondents who use a Dask package to deploy a cluster (about 53% of respondents), there’s a wide spread of methods.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020_survey/2020_3_0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Most people access the dashboard through a web browser. Those not using the dashboard are likely (hopefully) just using Dask on a single machine with the threaded scheduler (though the dashboard works fine on a single machine as well).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020_survey/2020_5_0.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;learning-resources&quot;&gt;Learning Resources&lt;/h2&gt;

&lt;p&gt;Respondents’ learning material usage is farily similar to last year. The most notable differences are from
our survey form providing more options (our &lt;a href=&quot;https://www.youtube.com/channel/UCj9eavqmvwaCyKhIlu2GaoA&quot;&gt;YouTube channel&lt;/a&gt; and “Gitter chat”). Other than that, &lt;a href=&quot;https://examples.dask.org&quot;&gt;examples.dask.org&lt;/a&gt; might be relatively more popular.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020_survey/2020_7_0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Just like last year, we’ll look at resource usage grouped by how often they use Dask.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020_survey/2020_10_0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A few observations&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;GitHub issues are becoming relatively less popular, which perhaps reflects better documentation or stability (assuming people go to the issue tracker when they can’t find the answer in the docs or they hit a bug).&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://examples.dask.org&quot;&gt;https://examples.dask.org&lt;/a&gt; is notably now more popular among occasinal users.&lt;/li&gt;
  &lt;li&gt;In response to last year’s survey, we invested time in making &lt;a href=&quot;https://tutorial.dask.org&quot;&gt;https://tutorial.dask.org&lt;/a&gt; better, which we previously felt was lacking. Its usage is still about the same as last year’s (pretty popular), so it’s unclear whether we should dedicate additional focus there.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;how-do-you-use-dask&quot;&gt;How do you use Dask?&lt;/h2&gt;

&lt;p&gt;API usage remains about the same as last year (recall that about 20 fewer people took the survey and people can select multiple, so relative differences are most interesting). We added new choices for RAPIDS, Prefect, and XGBoost, each of which are somewhat popular (in the neighborhood of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.Bag&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020_survey/2020_12_0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;About 65% of our users are using Dask on a cluster at least some of the time, which is similar to last year.&lt;/p&gt;

&lt;h2 id=&quot;how-can-dask-improve&quot;&gt;How can Dask improve?&lt;/h2&gt;

&lt;p&gt;Respondents continue to say that more documentation and examples would be the most valuable improvements to the project.&lt;/p&gt;

&lt;p&gt;One interesting change comes from looking at “Which would help you most right now?” split by API group (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.dataframe&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.array&lt;/code&gt;, etc.). Last year showed that “More examples” in my field was the most important for all API groups (first table below). But in 2020 there are some differences (second table below).&lt;/p&gt;

&lt;style type=&quot;text/css&quot;&gt;
    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col1 {
            background-color:  #cacee5;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col3 {
            background-color:  #f1ebf4;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col4 {
            background-color:  #c4cbe3;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col1 {
            background-color:  #3b92c1;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col3 {
            background-color:  #62a2cb;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col4 {
            background-color:  #bdc8e1;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col1 {
            background-color:  #c2cbe2;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col3 {
            background-color:  #94b6d7;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col4 {
            background-color:  #e0dded;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col1 {
            background-color:  #e6e2ef;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col3 {
            background-color:  #ced0e6;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col4 {
            background-color:  #c5cce3;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col0 {
            background-color:  #dedcec;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col1 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col3 {
            background-color:  #1c7fb8;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col4 {
            background-color:  #73a9cf;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col1 {
            background-color:  #b4c4df;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col3 {
            background-color:  #b4c4df;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col4 {
            background-color:  #eee9f3;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col0 {
            background-color:  #faf2f8;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col1 {
            background-color:  #e7e3f0;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col3 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col4 {
            background-color:  #f4eef6;
            color:  #000000;
        }&lt;/style&gt;
&lt;table id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87&quot;&gt;&lt;caption&gt;2019 normalized by row. Darker means that a higher proporiton of users of that API prefer that priority.&lt;/caption&gt;&lt;thead&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;Which would help you most right now?&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col0&quot;&gt;Bug fixes&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col1&quot;&gt;More documentation&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col2&quot;&gt;More examples in my field&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col3&quot;&gt;New features&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col4&quot;&gt;Performance improvements&lt;/th&gt;    &lt;/tr&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;Dask APIs&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;    &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;

                &lt;tr&gt;
                        &lt;th id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87level0_row0&quot; class=&quot;row_heading level0 row0&quot;&gt;Array&lt;/th&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col0&quot; class=&quot;data row0 col0&quot;&gt;10&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col1&quot; class=&quot;data row0 col1&quot;&gt;24&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col2&quot; class=&quot;data row0 col2&quot;&gt;62&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col3&quot; class=&quot;data row0 col3&quot;&gt;15&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row0_col4&quot; class=&quot;data row0 col4&quot;&gt;25&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87level0_row1&quot; class=&quot;row_heading level0 row1&quot;&gt;Bag&lt;/th&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col0&quot; class=&quot;data row1 col0&quot;&gt;3&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col1&quot; class=&quot;data row1 col1&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col2&quot; class=&quot;data row1 col2&quot;&gt;16&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col3&quot; class=&quot;data row1 col3&quot;&gt;10&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row1_col4&quot; class=&quot;data row1 col4&quot;&gt;7&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87level0_row2&quot; class=&quot;row_heading level0 row2&quot;&gt;DataFrame&lt;/th&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col0&quot; class=&quot;data row2 col0&quot;&gt;16&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col1&quot; class=&quot;data row2 col1&quot;&gt;32&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col2&quot; class=&quot;data row2 col2&quot;&gt;71&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col3&quot; class=&quot;data row2 col3&quot;&gt;39&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row2_col4&quot; class=&quot;data row2 col4&quot;&gt;26&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87level0_row3&quot; class=&quot;row_heading level0 row3&quot;&gt;Delayed&lt;/th&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col0&quot; class=&quot;data row3 col0&quot;&gt;16&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col1&quot; class=&quot;data row3 col1&quot;&gt;22&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col2&quot; class=&quot;data row3 col2&quot;&gt;55&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col3&quot; class=&quot;data row3 col3&quot;&gt;26&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row3_col4&quot; class=&quot;data row3 col4&quot;&gt;27&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87level0_row4&quot; class=&quot;row_heading level0 row4&quot;&gt;Futures&lt;/th&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col0&quot; class=&quot;data row4 col0&quot;&gt;12&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col1&quot; class=&quot;data row4 col1&quot;&gt;9&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col2&quot; class=&quot;data row4 col2&quot;&gt;25&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col3&quot; class=&quot;data row4 col3&quot;&gt;20&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row4_col4&quot; class=&quot;data row4 col4&quot;&gt;17&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87level0_row5&quot; class=&quot;row_heading level0 row5&quot;&gt;ML&lt;/th&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col0&quot; class=&quot;data row5 col0&quot;&gt;5&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col1&quot; class=&quot;data row5 col1&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col2&quot; class=&quot;data row5 col2&quot;&gt;23&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col3&quot; class=&quot;data row5 col3&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row5_col4&quot; class=&quot;data row5 col4&quot;&gt;7&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87level0_row6&quot; class=&quot;row_heading level0 row6&quot;&gt;Xarray&lt;/th&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col0&quot; class=&quot;data row6 col0&quot;&gt;8&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col1&quot; class=&quot;data row6 col1&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col2&quot; class=&quot;data row6 col2&quot;&gt;34&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col3&quot; class=&quot;data row6 col3&quot;&gt;7&lt;/td&gt;
                        &lt;td id=&quot;T_0a8701b8_e96b_11ea_9e95_186590cd1c87row6_col4&quot; class=&quot;data row6 col4&quot;&gt;9&lt;/td&gt;
            &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;

&lt;style type=&quot;text/css&quot;&gt;
    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col1 {
            background-color:  #f1ebf5;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col3 {
            background-color:  #f5eef6;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col4 {
            background-color:  #d0d1e6;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col0 {
            background-color:  #f0eaf4;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col1 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col3 {
            background-color:  #f0eaf4;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col4 {
            background-color:  #4c99c5;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col0 {
            background-color:  #f5eff6;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col1 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col3 {
            background-color:  #fcf4fa;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col4 {
            background-color:  #8eb3d5;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col1 {
            background-color:  #ebe6f2;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col3 {
            background-color:  #f5eff6;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col4 {
            background-color:  #3d93c2;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col1 {
            background-color:  #f5eef6;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col2 {
            background-color:  #0567a2;
            color:  #f1f1f1;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col3 {
            background-color:  #cacee5;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col4 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col0 {
            background-color:  #ede8f3;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col1 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col3 {
            background-color:  #c1cae2;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col4 {
            background-color:  #80aed2;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col1 {
            background-color:  #f8f1f8;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col3 {
            background-color:  #c9cee4;
            color:  #000000;
        }    #T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col4 {
            background-color:  #86b0d3;
            color:  #000000;
        }&lt;/style&gt;
&lt;table id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87&quot;&gt;&lt;caption&gt;2020 normalized by row. Darker means that a higher proporiton of users of that API prefer that priority.&lt;/caption&gt;&lt;thead&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;Which would help you most right now?&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col0&quot;&gt;Bug fixes&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col1&quot;&gt;More documentation&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col2&quot;&gt;More examples in my field&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col3&quot;&gt;New features&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col4&quot;&gt;Performance improvements&lt;/th&gt;    &lt;/tr&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;Dask APIs&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;    &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;

                &lt;tr&gt;
                        &lt;th id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87level0_row0&quot; class=&quot;row_heading level0 row0&quot;&gt;Array&lt;/th&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col0&quot; class=&quot;data row0 col0&quot;&gt;12&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col1&quot; class=&quot;data row0 col1&quot;&gt;16&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col2&quot; class=&quot;data row0 col2&quot;&gt;56&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col3&quot; class=&quot;data row0 col3&quot;&gt;15&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row0_col4&quot; class=&quot;data row0 col4&quot;&gt;23&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87level0_row1&quot; class=&quot;row_heading level0 row1&quot;&gt;Bag&lt;/th&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col0&quot; class=&quot;data row1 col0&quot;&gt;7&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col1&quot; class=&quot;data row1 col1&quot;&gt;5&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col2&quot; class=&quot;data row1 col2&quot;&gt;24&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col3&quot; class=&quot;data row1 col3&quot;&gt;7&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row1_col4&quot; class=&quot;data row1 col4&quot;&gt;16&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87level0_row2&quot; class=&quot;row_heading level0 row2&quot;&gt;DataFrame&lt;/th&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col0&quot; class=&quot;data row2 col0&quot;&gt;24&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col1&quot; class=&quot;data row2 col1&quot;&gt;21&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col2&quot; class=&quot;data row2 col2&quot;&gt;67&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col3&quot; class=&quot;data row2 col3&quot;&gt;22&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row2_col4&quot; class=&quot;data row2 col4&quot;&gt;41&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87level0_row3&quot; class=&quot;row_heading level0 row3&quot;&gt;Delayed&lt;/th&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col0&quot; class=&quot;data row3 col0&quot;&gt;15&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col1&quot; class=&quot;data row3 col1&quot;&gt;19&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col2&quot; class=&quot;data row3 col2&quot;&gt;46&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col3&quot; class=&quot;data row3 col3&quot;&gt;17&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row3_col4&quot; class=&quot;data row3 col4&quot;&gt;34&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87level0_row4&quot; class=&quot;row_heading level0 row4&quot;&gt;Futures&lt;/th&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col0&quot; class=&quot;data row4 col0&quot;&gt;9&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col1&quot; class=&quot;data row4 col1&quot;&gt;10&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col2&quot; class=&quot;data row4 col2&quot;&gt;21&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col3&quot; class=&quot;data row4 col3&quot;&gt;13&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row4_col4&quot; class=&quot;data row4 col4&quot;&gt;24&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87level0_row5&quot; class=&quot;row_heading level0 row5&quot;&gt;ML&lt;/th&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col0&quot; class=&quot;data row5 col0&quot;&gt;6&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col1&quot; class=&quot;data row5 col1&quot;&gt;4&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col2&quot; class=&quot;data row5 col2&quot;&gt;21&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col3&quot; class=&quot;data row5 col3&quot;&gt;9&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row5_col4&quot; class=&quot;data row5 col4&quot;&gt;12&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87level0_row6&quot; class=&quot;row_heading level0 row6&quot;&gt;Xarray&lt;/th&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col0&quot; class=&quot;data row6 col0&quot;&gt;3&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col1&quot; class=&quot;data row6 col1&quot;&gt;4&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col2&quot; class=&quot;data row6 col2&quot;&gt;25&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col3&quot; class=&quot;data row6 col3&quot;&gt;9&lt;/td&gt;
                        &lt;td id=&quot;T_0a8d3eac_e96b_11ea_9e95_186590cd1c87row6_col4&quot; class=&quot;data row6 col4&quot;&gt;13&lt;/td&gt;
            &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Examples are again the most important (for all API groups except &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Futures&lt;/code&gt;). But “Performance improvements” is now the second-most important improvement (except for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Futures&lt;/code&gt; where it’s most important). How should we interpret this? A charitable interpretation is that Dask’s users are scaling to larger problems and are running into new scaling challenges. A less charitable interpretation is that our user’s workflows are the same but Dask is getting slower!&lt;/p&gt;

&lt;h2 id=&quot;what-other-systems-do-you-use&quot;&gt;What other systems do you use?&lt;/h2&gt;

&lt;p&gt;SSH continues to be the most popular “cluster resource mananger”. This was the big surprise last year, so we put in some work to make it nicer. Aside from that, not much has changed.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020_survey/2020_25_0.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And Dask users are about as happy with its stability as last year.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020_survey/2020_27_0.png&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;takeaways&quot;&gt;Takeaways&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Overall, most things are similar to last year.&lt;/li&gt;
  &lt;li&gt;Documentation, especially domain-specific examples, continues to be important. That said, our documentation is probably better than it was last year.&lt;/li&gt;
  &lt;li&gt;More users are pushing Dask further. Investing in performance is likely to be valuable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thanks again to all the respondents!&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Announcing the DaskHub Helm Chart</title>
   <link href="https://blog.dask.org/2020/08/31/helm_daskhub"/>
   <updated>2020-08-31T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/08/31/helm_daskhub</id>
   
   <category>Helm</category>
   
   <category>Dask Gateway</category>
   
   <category>Deployment</category>
   
   <content type="html">&lt;p&gt;Today we’re announcing the release of the
&lt;a href=&quot;https://github.com/dask/helm-chart/blob/master/daskhub/README.md&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;daskhub&lt;/code&gt;&lt;/a&gt;
helm chart. This is a &lt;a href=&quot;https://helm.sh/&quot;&gt;Helm&lt;/a&gt; chart to easily install
&lt;a href=&quot;https://jupyter.org/hub&quot;&gt;JupyterHub&lt;/a&gt; and Dask for multiple users on a
Kubernetes Cluster. If you’re managing deployment for many people that needs
interactive, scalable computing (say for a class of students, a data science
team, or a research lab) then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask/daskhub&lt;/code&gt; might be right for you.&lt;/p&gt;

&lt;p&gt;You can install &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask/daskhub&lt;/code&gt; on a Kubernetes cluster today with&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;go&quot;&gt;helm repo add dask https://helm.dask.org/
helm repo update
helm upgrade --install dhub dask/daskhub
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;history&quot;&gt;History&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask/daskhub&lt;/code&gt; helm chart is an evolution of the &lt;a href=&quot;http://pangeo.io/&quot;&gt;Pangeo&lt;/a&gt;
helm chart, which came out of that community’s attempts to do big data
geoscience on the cloud. We’re very grateful to have years of experience using
Dask and JupyterHub together. Pangeo was always aware that there wasn’t anything
geoscience-specific to their Helm chart and so were eager to contribute it to
Dask to share the maintenance burden. In the process of moving it over to Dask’s
chart repository we took the opportunity to clean up a few rough edges.&lt;/p&gt;

&lt;p&gt;It’s interesting to read the &lt;a href=&quot;https://blog.dask.org/2018/01/22/pangeo-2&quot;&gt;original
announcement&lt;/a&gt; of Pangeo’s JupyterHub
deployment. A lot has improved, and we hope that this helm chart assists more
groups in deploying JupyterHubs capable of scalable computations with Dask.&lt;/p&gt;

&lt;h2 id=&quot;details&quot;&gt;Details&lt;/h2&gt;

&lt;p&gt;Internally, the DaskHub helm chart is relatively simple combination of the
&lt;a href=&quot;https://github.com/jupyterhub/zero-to-jupyterhub-k8s&quot;&gt;JupyterHub&lt;/a&gt; and &lt;a href=&quot;https://github.com/dask/dask-gateway/&quot;&gt;Dask
Gateway&lt;/a&gt; helm charts. The only additional
magic is some configuration to&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Register Dask Gateway as a &lt;a href=&quot;https://jupyterhub.readthedocs.io/en/stable/reference/services.html&quot;&gt;JupyterHub
service&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Set environment variables to make using Dask Gateway easy for your users.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With the default configuration, your users will be able to create and connect to
Dask Clusters, including their dashboards, with a simple&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_gateway&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GatewayCluster&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GatewayCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Check out the
&lt;a href=&quot;https://docs.dask.org/en/latest/setup/kubernetes-helm.html&quot;&gt;documentation&lt;/a&gt; for
details and let us know if you run into any difficulties.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Running tutorials</title>
   <link href="https://blog.dask.org/2020/08/21/running-tutorials"/>
   <updated>2020-08-21T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/08/21/running-tutorials</id>
   
   <category>Tutorials</category>
   
   <category>Community</category>
   
   <content type="html">
&lt;p&gt;For the last couple of months we’ve been running community tutorials every three weeks or so. The response from the community has been great and we’ve had 50-100 people at each 90 minute session.&lt;/p&gt;

&lt;h2 id=&quot;why-should-open-source-projects-run-tutorials&quot;&gt;Why should open source projects run tutorials&lt;/h2&gt;

&lt;p&gt;The Dask team has historically run tutorials at conferences such as SciPy. With 2020 turning out the way that it has much of this content is being presented virtually this year. As more people are becoming accustomed to participating in virtual tutorials we felt it would be a good service to our community to start running regular virtual tutorials independent of conferences we may be attending or speaking at.&lt;/p&gt;

&lt;p&gt;Tutorials are great for open source projects as they appeal to multiple types of learner.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The tutorial material provides a great foundation for &lt;em&gt;written and visual learners&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;Using an interactive tool like Jupyter Notebooks allows &lt;em&gt;kinesthetic learners&lt;/em&gt; to follow along and take their own paths.&lt;/li&gt;
  &lt;li&gt;Having an instructor run through the material in real time provides a spoken source for &lt;em&gt;auditory learners&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;It’s also just fun to have a bunch of people from around the world participate in a live event. There is a greater sense of community.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many open source projects provide documentation, some also make instructional videos on YouTube, but you really can’t beat a tutorial for producing a single set of content that is valuable to many users.&lt;/p&gt;

&lt;p&gt;The more users can share knowledge, information and skills with the more they are going to use and engage with the project. Having a great source of learning material is critical for converting interested newcomers to users and users to contributors.&lt;/p&gt;

&lt;p&gt;It is also great for the maintainers too. Dask is a large project made up of many open source repositories all with different functions. Each maintainer tends to participate in their specialist areas, but do not engage with everything on a day-to-day basis. Having maintainers run tutorials encourages them to increase their knowledge of areas they rarely touch in order to deliver the material, and this benefits the project as a whole.&lt;/p&gt;

&lt;h2 id=&quot;how&quot;&gt;How&lt;/h2&gt;

&lt;p&gt;For the rest of this post we will discuss the preparation and logistics we have undertaken to provide our tutorials. Hopefully this will provide a blueprint for others waning to run similar activities.&lt;/p&gt;

&lt;h3 id=&quot;writing-the-material&quot;&gt;Writing the material&lt;/h3&gt;

&lt;p&gt;When starting to compile material is it important to consider a few questions; “Who is this for?”, “How long should it be?” and “What already exists today?”.&lt;/p&gt;

&lt;p&gt;For the Dask tutorial we were targeting users who were either new to Dask, or had been using it for a while but wanted to learn more about the wider project. Dask is a large project after all and there are many features that you may not discover when trying to solve your specific challenges with it.&lt;/p&gt;

&lt;p&gt;At large conferences is it quite normal to run a three hour tutorial, however when trying to schedule a tutorial as part of a person’s normal working day that is probably too much to ask of them. Folks are accustomed to scheduling in work meetings that are typically 30-60 minutes, but that may not be enough to run a tutorial. So we settled on 90 minutes, enough to get through a good amount of content, but not too long that folks will be put off.&lt;/p&gt;

&lt;p&gt;We already have an &lt;a href=&quot;https://github.com/dask/dask-tutorial&quot;&gt;“official” tutorial&lt;/a&gt; which is designed to fill the three hours of a SciPy tutorial. This tutorial is also designed as a “Dask from first principals” style tutorial where we explore how Dask works and eventually scale up to how Dask implements familiar APIs like Numpy and Pandas. This is great for giving folks a thorough understanding of Dask but given that we decided on 90 minutes we may not want to start with low level code as we may run out of time before getting to general usage.&lt;/p&gt;

&lt;p&gt;While researching what already exists I was pointed to the &lt;a href=&quot;https://github.com/adbreind/dask-mini-2019&quot;&gt;Mini Dask 2019 tutorial&lt;/a&gt; which was created for an &lt;a href=&quot;https://www.oreilly.com/live-training/courses/scale-your-python-processing-with-dask/0636920319573/&quot;&gt;O’Reilly event&lt;/a&gt;. This tutorial starts with familiar APIs such as dataframes and arrays and eventually digs down into Dask fundamentals. As tutorial content like this is often licensed as open source and made available on GitHub it’s great to be able to build upon the work of others.&lt;/p&gt;

&lt;p&gt;The result of combining the two tutorials was the &lt;a href=&quot;https://github.com/jacobtomlinson/dask-video-tutorial-2020&quot;&gt;Dask Video Tutorial 2020&lt;/a&gt;. It follows the same structure as the mini tutorial starting with high level APIs and digging further down. It also includes some new content on deployment and distributed methods.&lt;/p&gt;

&lt;h4 id=&quot;structuring-content&quot;&gt;Structuring content&lt;/h4&gt;

&lt;p&gt;To ensure this content targets the different learner types that we discussed earlier we need to ensure our content has a few things.&lt;/p&gt;

&lt;p&gt;As a foundation we should put together a series of pages/documents with a written version of the information we are trying to communicate for &lt;em&gt;written learners&lt;/em&gt;. We should also endeavor to include diagrams and pictures to illustrate this information for &lt;em&gt;visual learners&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;As we are sharing knowledge on an open source software project we should also make things as interactive as possible. Using Jupyter Notebooks as our document format means we can include many code examples which both provide written examples but are also editable and executable to empower &lt;em&gt;kinesthetic learners&lt;/em&gt; to feel how things work in practice.&lt;/p&gt;

&lt;p&gt;When the content is being delivered the instructor will be running through the content at the same time and narrating what they are doing for &lt;em&gt;auditory learners&lt;/em&gt;. It is important to try and structure things in a way where you explain each section of the content out loud, but without directly reading the text from the screen as that can be off-putting.&lt;/p&gt;

&lt;p&gt;We also want to ensure folks are taking things in, and labs are a great way to include small tests in the content. Having a section at the end of an example which is incomplete means that you can give the audience some time to try and figure things our for themselves. Some folks will be able to fill things in with no problems. For others they will hit errors or make mistakes, this is good for teaching how to debug and troubleshoot your project. And for those who are having awful flashbacks to pop-quizzes they can simply skip it without worrying that someone will check up on them.&lt;/p&gt;

&lt;p&gt;For each section of content you want to include in your tutorial I recommend you create a notebook with an explanation, an example and some things for the audience to figure out. Doing this for each section (in the Dask tutorial we had 9 sections) the audience will quickly become familiar with the process and be able to anticipate what is coming next. This will make them feel comfortable.&lt;/p&gt;

&lt;h3 id=&quot;hosting-the-material&quot;&gt;Hosting the material&lt;/h3&gt;

&lt;p&gt;Once you have put your material together you need to share it with your attendees.&lt;/p&gt;

&lt;p&gt;GitHub is a great place to put things, especially if you include an open license with it. For narrative tutorial content a creative commons license if often used which requires modifications to also be shared.&lt;/p&gt;

&lt;p&gt;As we have put our content together as Jupyter Notebooks we can use &lt;a href=&quot;https://mybinder.org/&quot;&gt;Binder&lt;/a&gt; to make it possible for folks to run the material without having to download it locally or ensure their Python environment is set up correctly.&lt;/p&gt;

&lt;h3 id=&quot;choosing-a-video-platform&quot;&gt;Choosing a video platform&lt;/h3&gt;

&lt;p&gt;Next we have to decide how we will present the material. As this is a virtual tutorial we will want to use some kind of video conferences or streaming software.&lt;/p&gt;

&lt;p&gt;These tools tend to fall into two categories; private meetings with a tool like Zoom, Hangouts or Teams and public broadcasts on websites like YouTube or Twitch.&lt;/p&gt;

&lt;p&gt;Any of these options will likely be a good choice, they allow the presenter to share their video, audio and screen with participants and participants can communicate back with a range of tools.&lt;/p&gt;

&lt;p&gt;The main decision you will have to make is around whether you want to restrict numbers or not. The more interactivity you want to have in the tutorial the more you will need a handle on numbers. For our initial tutorials we wanted to enable participants to ask questions at any time and get a quick response, so we opted to use Zoom and limit our numbers to allow us to not get overwhelmed with questions. However if you want to present to as many people as possible and accept that you may not be able to address them all individually you may want to use a streaming platform instead.&lt;/p&gt;

&lt;p&gt;It is also possible to do both at the same time. Zoom can stream directly to YouTube for example. This can be useful if you want to open things to as many folks as possible, but also limit the interactivity to a select group (probably on a first-come-first-served basis). For the Dask tutorials we decided to not livestream and instead run multiple tutorials so that everyone gets an interactive experience, but we are fortunate to have the resources to do that.&lt;/p&gt;

&lt;h3 id=&quot;registering-attendees&quot;&gt;Registering attendees&lt;/h3&gt;

&lt;p&gt;There are a couple of reasons why you may wish to register attendees ahead of time.&lt;/p&gt;

&lt;p&gt;If you want to limit numbers you will certainly need some way to register people and put a cap on that number. But even if you are streaming generally you may want to get folks to register ahead of time as that allows you to send them reminder emails in the run up to the event, which likely will add more certainty to the attendance numbers.&lt;/p&gt;

&lt;p&gt;As our event was private we registered folks with &lt;a href=&quot;https://www.eventbrite.com/&quot;&gt;Eventbrite&lt;/a&gt;. This allowed us to cap numbers and also schedule automated emails to act as a reminder but also share the details of the private Zoom meeting.&lt;/p&gt;

&lt;p&gt;When running the Dask tutorials we found about 50% of the folks who registered actually turned up, so we accounted for this an set out limit to around double the number we wanted.&lt;/p&gt;

&lt;p&gt;Here’s an example of the event details what we created:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Event Title&lt;/strong&gt;: Dask Tutorial&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Organizer&lt;/strong&gt;: Presenter’s name&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Event Type&lt;/strong&gt;: Seminar or talk, Science and Technology, Online event&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;: dask, pydata, python, tutorial&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Location&lt;/strong&gt;: Online event&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Date and time&lt;/strong&gt;: Single Event, add times&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Details&lt;/strong&gt;:&lt;/p&gt;

  &lt;p&gt;Come learn about Dask at this online free tutorial provided by the Dask maintainers.&lt;/p&gt;

  &lt;p&gt;This ninety minute course will mix overview discussion and demonstration by a leader in the Dask community, as well as interactive exercises in live notebook sessions for attendees. The computing environment will be provided.&lt;/p&gt;

  &lt;p&gt;If you want to get a sample of similar content, take a look at https://tutorial.dask.org (although this tutorial will cover different material appropriate for this shorter session).&lt;/p&gt;

  &lt;p&gt;We look forward to seeing you there!&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Image&lt;/strong&gt;: https://i.imgur.com/2i1tMNG.png&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Live video content&lt;/strong&gt;: NA&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Text and media&lt;/strong&gt;: NA&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Links to resources&lt;/strong&gt;:
Tutorial Content (Online Jupyter Notebooks)
https://github.com/jacobtomlinson/dask-video-tutorial-2020&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Ticket Cost&lt;/strong&gt;: Free&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;Ticket Attendee limit&lt;/strong&gt;: 150 people&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;count-down-to-the-tutorial&quot;&gt;Count down to the tutorial&lt;/h3&gt;

&lt;p&gt;We also set up a series of automated emails. You can find this under &lt;strong&gt;Manage Attendees &amp;gt; Emails to Attendees&lt;/strong&gt; in the event management page.&lt;/p&gt;

&lt;p&gt;We scheduled emails for two days before, two hours before and 10 minutes before to let folks know where to go and another a few hours after to gather feedback. &lt;em&gt;We will discuss the feedback email shortly&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You’ll need to ensure you have links to the materials and meeting location ready for this. In our case we pushed the content to GitHub and scheduled the Zoom call ahead of time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two days and two hours before&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hi Everyone!&lt;/p&gt;

  &lt;table&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;We look forward to seeing you &amp;lt;tomorrow&lt;/td&gt;
        &lt;td&gt;soon&amp;gt;. We wanted to share some important links with you to help you connect to the meeting.&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;

  &lt;p&gt;The materials for the course are available on GitHub here at the link below:&lt;/p&gt;

  &lt;p&gt;&amp;lt;Link to materials&amp;gt;&lt;/p&gt;

  &lt;p&gt;This repository contains Jupyter notebooks that we’ll go through together as a group. You do not need to install anything before the tutorial. We will run the notebooks on the online service, mybinder.org . All you need is a web connection.&lt;/p&gt;

  &lt;p&gt;The meeting itself will be held by video call at the following Zoom link:&lt;/p&gt;

  &lt;p&gt;&amp;lt;Zoom link and pin&amp;gt;&lt;/p&gt;

  &lt;p&gt;We look forward to seeing you soon!&lt;/p&gt;

  &lt;p&gt;&amp;lt;Organisers names&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Ten minutes before&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hi Everyone!&lt;/p&gt;

  &lt;p&gt;We are about to get started. Here’s a final reminder of the meeting details.&lt;/p&gt;

  &lt;p&gt;&amp;lt;Zoom link and pin&amp;gt;&lt;/p&gt;

  &lt;p&gt;See you in a minute!&lt;/p&gt;

  &lt;p&gt;&amp;lt;Organisers names&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Few hours after&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hi Everyone!&lt;/p&gt;

  &lt;p&gt;Thank you so much for attending the Dask tutorial. We really hope you found it valuable.&lt;/p&gt;

  &lt;p&gt;We would really appreciate it if you could answer a couple of quick feedback questions to help us improve things for next time.&lt;/p&gt;

  &lt;p&gt;&amp;lt;Google form link &amp;gt;&lt;/p&gt;

  &lt;p&gt;Also we want to remind you that the tutorial materials are always available on GitHub and you can run through them any time or share them with others.&lt;/p&gt;

  &lt;p&gt;&amp;lt;Link to materials&amp;gt;&lt;/p&gt;

  &lt;p&gt;Thanks,&lt;/p&gt;

  &lt;p&gt;&amp;lt;Organisers names&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;getting-the-word-out&quot;&gt;Getting the word out&lt;/h3&gt;

&lt;p&gt;Now that we have an Eventbrite page we need to tell people about it.&lt;/p&gt;

&lt;p&gt;You may already have existing channels where you can contact your community. For Dask we have an active twitter account with a good number of followers, so tweeting out the link to the event a couple of times the week running up to the tutorial was enough to fill the spaces.&lt;/p&gt;

&lt;p&gt;If you have a mailing list, or any other platform you will probably want to share it there.&lt;/p&gt;

&lt;h3 id=&quot;setting-up-the-call&quot;&gt;Setting up the call&lt;/h3&gt;

&lt;p&gt;Be sure to join the call ahead of the attendees. I would make sure this is at least before the final reminder email goes out. Personally I join 20 minutes or so before hand. This allows you to ensure the call is being recorded and that attendees were muted when they join.&lt;/p&gt;

&lt;p&gt;Consider the experience of the user’s here. They will have signed up for an event online, received a few emails with Zoom call details and then they will join the call. If there is no indication that they are in the right place within a few seconds they may become anxious.&lt;/p&gt;

&lt;p&gt;To combat this I tend to show some graphic which lets people know they are in the right place. You could either use a tool like &lt;a href=&quot;https://jacobtomlinson.dev/posts/2020/how-to-use-obs-studio-with-zoom-hangouts-teams-and-more-on-macos/&quot;&gt;OBS with Zoom&lt;/a&gt; to create a custom scene or just share your screen with a simple slide saying something like “The Dask tutorial will start soon”.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The only downside to sharing your screen is you can’t continue to use your computer in the run up to the tutorial.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When we ran our first few tutorials we were also running our Dask user survey so also included a link to that on the waiting screen to give folks something to do.&lt;/p&gt;

&lt;h3 id=&quot;greeting-and-getting-folks-set-up&quot;&gt;Greeting and getting folks set up&lt;/h3&gt;

&lt;p&gt;Say hi on the hour and welcome everyone to the tutorial. But as the event is virtual folks will be late, so don’t kick off until around five minutes in, otherwise you’ll just get a flood of questions asking what’s going on.&lt;/p&gt;

&lt;h3 id=&quot;interactivity&quot;&gt;Interactivity&lt;/h3&gt;

&lt;p&gt;A fun thing to do during this waiting period is get everyone to introduce themselves in the chat. Say something like “Please say hi in that chat and give your name and where you are joining from”.&lt;/p&gt;

&lt;p&gt;This is nice feedback for you as the instructor to see where folks are joining from, but it also gives the attendees a sense of being in a room full of people. One of the benefits of an event like this is that it is interactive, so be sure to say hi back to people.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I’m awful at pronouncing names correctly so I tend to list the places they said they are from instead. It still makes them feel like their message has been seen.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once you’re ready to start introduce yourself and a general overview of the tutorial content. Then make use of any interaction tools you may have in your chat application. In zoom there are buttons that participants can click with labels like “go faster”, “go slower”, “yes” and “no”. These are great for getting feedback from the audience when running the tutorial, but it’s good to make sure everyone knows where they are and has a go at using them. I tend to explain where the buttons are and then ask questions like “have you managed to launch the binder?”, “have you used Dask before?” or “are you a Pandas user?”. You learn a little about your audience and they get familiar with the controls.&lt;/p&gt;

&lt;p&gt;Being interactive means you can also respond to user questions. In Dask tutorials we mute everyone by default and encourage folks to type in the text chat. We also have an additional instructor who is not delivering the material who is able to watch the chat and answer questions in real time. If they feel like a question/answer would be beneficial to the whole group they can unmute and interrupt the presenter in order to bubble it up. Be prepared for a wide range of questions from the chat, including topics that are not being actively covered in the tutorial. This is often the only time that attendees have real-time access to core maintainers.&lt;/p&gt;

&lt;p&gt;You may not have the resources to have two instructors for every tutorial, Dask is fortunate to have a strong maintainer team, so instead you may want to allocate breaks at the end of each section to answer questions. During the labs can be a good time to go back and review any questions.&lt;/p&gt;

&lt;p&gt;Interactivity is one of the big benefits a live tutorial has over a video.&lt;/p&gt;

&lt;h3 id=&quot;run-through-the-material&quot;&gt;Run through the material&lt;/h3&gt;

&lt;p&gt;Once you’re all set up and everyone is in it’s time to run through the material. Given the amount of preparation we did before hand to construct the material this is relatively straight forward. Everything is laid out in front of us and we just need to go through the motions of talking through it.&lt;/p&gt;

&lt;p&gt;I find it very helpful to have a list of the sections with timings written down that I can refer to in order to pace things.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;Overview of Dask with Dask Dataframe (10 mins)&lt;/li&gt;
    &lt;li&gt;Introductory Lab (10 mins) and results (5 mins)&lt;/li&gt;
    &lt;li&gt;Dask GUI and dashboards (10 mins)&lt;/li&gt;
    &lt;li&gt;Dask Array (10 mins)&lt;/li&gt;
    &lt;li&gt;Dask ML with lab (10 mins) and results (5 mins)&lt;/li&gt;
    &lt;li&gt;Bags and Futures (10 mins)&lt;/li&gt;
    &lt;li&gt;Distributed (10 mins)&lt;/li&gt;
    &lt;li&gt;Wrapup and close (5 mins)&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;As we have another instructor answering questions I tend to ignore the chat and run through each section as slowly as I can without going over time. Personally my default is to go too fast, so forcing myself to be slow but having some timings to keep me on track seems to work well. But you should do whatever works for you.&lt;/p&gt;

&lt;p&gt;During the labs I tend to mute my microphone and join in with answering questions on the chat.&lt;/p&gt;

&lt;h3 id=&quot;wrapping-things-up&quot;&gt;Wrapping things up&lt;/h3&gt;

&lt;p&gt;When you’re nearing the end it’s good to have some time for any final questions. People may want to ask things that they didn’t get a chance to earlier or have questions which haven’t fit in with any particular area.&lt;/p&gt;

&lt;p&gt;If you get complex questions or want to go in to depth you may want to offer to stay after and continue talking, but your attendees will appreciate you finishing at the scheduled time as they may have other things booked immediately after.&lt;/p&gt;

&lt;p&gt;It’s always good to leave folks with some extra resources, whether that is links to the documentation, community places they can learn more like a Gitter chat, etc.&lt;/p&gt;

&lt;h3 id=&quot;sharing-the-content-later&quot;&gt;Sharing the content later&lt;/h3&gt;

&lt;p&gt;Once you’re done it is also beneficial to upload a recording of the tutorial to YouTube. If you’ve livestreamed then this may happen automatically. If you used a tool like Zoom you’ll need to upload it to yourself.&lt;/p&gt;

&lt;p&gt;Anyone watching in the future won’t get the benefit of the interactivity, but should still be able to get much of the benefit from following through the material.&lt;/p&gt;

&lt;h3 id=&quot;gathering-feedback-and-planning-for-next-time&quot;&gt;Gathering feedback and planning for next time&lt;/h3&gt;

&lt;p&gt;The last thing for you to do is plan for next time. The Dask team have decided to run tutorials every month or so but rotate around timezones to try and cover as many users as possible. We’ve also discussed having special deep dive tutorials which follow the same length and format but dive into one topic in particular.&lt;/p&gt;

&lt;p&gt;To help you plan for future events you will likely want feedback from your participants. You can use tools like Google Forms to create a short questionnaire which you can send out to participants afterwards. In our experience about 20% of participants will fill in a survey that is 10 questions long.&lt;/p&gt;

&lt;p&gt;This feedback can be very helpful for making changes to the content or format. For example in our first tutorial we use OBS for both the intro screen and screen sharing throughout. However Zoom limits webcams to 720p and adds heavy compression, so the quality for participants was not good and 50% of the surveys mentioned poor video. In later tutorials we only used OBS for the intro screen and then used the built in screen sharing utility in Zoom which provided a better experience and no user reported any audio/video issues in the survey.&lt;/p&gt;

&lt;p&gt;Here are some examples of questions we asked and how they were answered for our tutorial.&lt;/p&gt;

&lt;h4 id=&quot;have-you-used-dask-before&quot;&gt;Have you used Dask before?&lt;/h4&gt;

&lt;p&gt;When writing our material we said we were “targeting users who were either new to Dask, or had been using it for a while but wanted to learn more about the wider project.”. Our feedback results confirm that we are hitting these groups.&lt;/p&gt;

&lt;p&gt;We could’ve been more specific and asked folks to rank their ability. But the more complex the questions the less likely folks will fill them out, so it’s a balancing act.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/T1loyeb.png&quot; alt=&quot;Forms response chart. Question title: Have you used Dask before? 39% no, 61% yes.&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;did-we-cover-all-the-topics-you-were-expecting-and-if-not-what-was-missing&quot;&gt;Did we cover all the topics you were expecting? And if not, what was missing?&lt;/h4&gt;

&lt;p&gt;Depending on the complexity of your project you may have to make compromises on what you can cover in the time you have. Dask is a large project and so we couldn’t cover everything, so we wanted to check we had covered the basics.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/la3dqrA.png&quot; alt=&quot;Forms response chart. Question title: Did we cover all the topics you expected? 22% no, 78% yes.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Most of the feedback we had from folks who answered no were asking about advanced topics like Kubernetes, Google Cloud deployments, deep dives into internal workings, etc. I’m satisfied that this shouldn’t have been in this tutorial, but it adds weight to our plans to run deep dives in the future.&lt;/p&gt;

&lt;p&gt;Once useful bit of feedback we had here was “When should I use Dask and when should I stick with Pandas?”. This is something which definitely should be covered by an intro tutorial, so our material is clearly lacking here. As a result we can go back and make modifications and improve the content.&lt;/p&gt;

&lt;h4 id=&quot;how-was-the-pace&quot;&gt;How was the pace?&lt;/h4&gt;

&lt;p&gt;Setting the pace is hard. If you’re targeting a range of abilities then it’s easy to go too fast or slow for a big chunk of the attendees.&lt;/p&gt;

&lt;p&gt;Our feedback shows that folks were generally happy, but we are leaning on the side of being too fast. Given that we are filling our allocated time this probably indicates that we should cut a little content in order to slow things down.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/mHPNmwp.png&quot; alt=&quot;Forms response chart. Question title: How was the pace? 70% Just right, 26% Too fast, 4% Too slow.&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;which-sections-did-you-find-more-informative&quot;&gt;Which sections did you find more informative?&lt;/h4&gt;

&lt;p&gt;By asking what sections were most informative we can identify things to cut in future if we do need to slow things down. It also shows areas where we may want to spend more time and add more content.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/XLzSEw4.png&quot; alt=&quot;Forms response chart. Question title: Which sections did you find more informative?&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;what-would-be-your-preferred-platform-for-a-tutorial-like-this&quot;&gt;What would be your preferred platform for a tutorial like this?&lt;/h4&gt;

&lt;p&gt;We had to make a decision on which video platform to use based on the criteria we discussed earlier. For our tutorials we chose Zoom. By doing a user survey we were able to check that this worked for people and also see if there is an alternative that folks prefer.&lt;/p&gt;

&lt;p&gt;Our results confirmed that folks were happy with Zoom. These results may be a little biased given that we used Zoom, but I’m confident that we can keep using it and folks will have a good experience.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/fMxTZOK.png&quot; alt=&quot;Forms response chart. Question title: What would be your preferred platform for a tutorial like this? 70% Zoom, &amp;lt;5% for options including YouTube, Twitch, Jitsi, and No preference&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;would-you-recommend-the-tutorial-to-a-colleague&quot;&gt;Would you recommend the tutorial to a colleague?&lt;/h4&gt;

&lt;p&gt;The last thing to check is that folks had a good time. It gives you great pleasure as an instructor to see 100% of folks say they would recommend to a colleague.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;These results may be biased because if folks wouldn’t recommend it they probably wouldn’t bother to fill out a survey. But hey, I’ll take it!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/RzrXvfn.png&quot; alt=&quot;Forms response chart. Question title: Would you recommend the tutorial to a colleague? 100% Yes.&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;wrap-up&quot;&gt;Wrap up&lt;/h2&gt;

&lt;p&gt;In this post we have covered why and how you can run community tutorials for open source projects.&lt;/p&gt;

&lt;p&gt;In summary you should run tutorials because:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You can share knowledge with a range of people with different learning styles&lt;/li&gt;
  &lt;li&gt;You can give back to your community&lt;/li&gt;
  &lt;li&gt;You can grow your community&lt;/li&gt;
  &lt;li&gt;You can improve maintainers knowledge of the whole project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you can run a tutorial by following these steps:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Break your project into sections&lt;/li&gt;
  &lt;li&gt;Write up interactive documents on each section with tools like Jupyter notebooks&lt;/li&gt;
  &lt;li&gt;Give people access to this content with services like Binder&lt;/li&gt;
  &lt;li&gt;Manage attendees with services like Eventbrite&lt;/li&gt;
  &lt;li&gt;Advertise your tutorial on social media&lt;/li&gt;
  &lt;li&gt;Get everyone in a video meeting&lt;/li&gt;
  &lt;li&gt;Make use of the interactive tools&lt;/li&gt;
  &lt;li&gt;Deliver your material&lt;/li&gt;
  &lt;li&gt;Gather feedback&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Comparing Dask-ML and Ray Tune's Model Selection Algorithms</title>
   <link href="https://blog.dask.org/2020/08/06/ray-tune"/>
   <updated>2020-08-06T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/08/06/ray-tune</id>
   
   <category>machine-learning</category>
   
   <category>dask-ml</category>
   
   <category>dask</category>
   
   <category>ray</category>
   
   <content type="html">
&lt;p&gt;Hyperparameter optimization is the process of deducing model parameters that
can’t be learned from data. This process is often time- and resource-consuming,
especially in the context of deep learning. A good description of this process
can be found at “&lt;a href=&quot;https://scikit-learn.org/stable/modules/grid_search.html&quot;&gt;Tuning the hyper-parameters of an estimator&lt;/a&gt;,” and
the issues that arise are concisely summarized in Dask-ML’s documentation of
“&lt;a href=&quot;https://ml.dask.org/hyper-parameter-search.html&quot;&gt;Hyper Parameter Searches&lt;/a&gt;.”&lt;/p&gt;

&lt;p&gt;There’s a host of libraries and frameworks out there to address this problem.
&lt;a href=&quot;https://scikit-learn.org/stable/modules/grid_search.html&quot;&gt;Scikit-Learn’s module&lt;/a&gt; has been mirrored &lt;a href=&quot;https://ml.dask.org/hyper-parameter-search.html&quot;&gt;in Dask-ML&lt;/a&gt; and
&lt;a href=&quot;https://automl.github.io/auto-sklearn/master/&quot;&gt;auto-sklearn&lt;/a&gt;, both of which offer advanced hyperparameter optimization
techniques. Other implementations that don’t follow the Scikit-Learn interface
include &lt;a href=&quot;https://docs.ray.io/en/master/tune.html&quot;&gt;Ray Tune&lt;/a&gt;, &lt;a href=&quot;https://www.automl.org/&quot;&gt;AutoML&lt;/a&gt; and &lt;a href=&quot;https://medium.com/optuna/optuna-supports-hyperband-93b0cae1a137&quot;&gt;Optuna&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.ray.io&quot;&gt;Ray&lt;/a&gt; recently provided a wrapper to &lt;a href=&quot;https://docs.ray.io/en/master/tune.html&quot;&gt;Ray Tune&lt;/a&gt; that mirrors the Scikit-Learn
API called tune-sklearn (&lt;a href=&quot;https://docs.ray.io/en/master/tune/api_docs/sklearn.html&quot;&gt;docs&lt;/a&gt;, &lt;a href=&quot;https://github.com/ray-project/tune-sklearn&quot;&gt;source&lt;/a&gt;). &lt;a href=&quot;https://medium.com/distributed-computing-with-ray/gridsearchcv-2-0-new-and-improved-ee56644cbabf&quot;&gt;The introduction&lt;/a&gt; of this library
states the following:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Cutting edge hyperparameter tuning techniques (Bayesian optimization, early
stopping, distributed execution) can provide significant speedups over grid
search and random search.&lt;/p&gt;

  &lt;p&gt;However, the machine learning ecosystem is missing a solution that provides
users with the ability to leverage these new algorithms while allowing users
to stay within the Scikit-Learn API. In this blog post, we introduce
tune-sklearn [Ray’s tuning library] to bridge this gap. Tune-sklearn is a
drop-in replacement for Scikit-Learn’s model selection module with
state-of-the-art optimization features.&lt;/p&gt;

  &lt;p&gt;—&lt;a href=&quot;https://medium.com/distributed-computing-with-ray/gridsearchcv-2-0-new-and-improved-ee56644cbabf&quot;&gt;GridSearchCV 2.0 — New and Improved&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This claim is inaccurate: for over a year Dask-ML has provided access to
“cutting edge hyperparameter tuning techniques” with a Scikit-Learn compatible
API. To correct their statement, let’s look at each of the features that Ray’s
tune-sklearn provides, and compare them to Dask-ML:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Here’s what [Ray’s] tune-sklearn has to offer:&lt;/p&gt;

  &lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;Consistency with Scikit-Learn API&lt;/strong&gt; …&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Modern hyperparameter tuning techniques&lt;/strong&gt; …&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Framework support&lt;/strong&gt; …&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Scale up&lt;/strong&gt; … [to] multiple cores and even multiple machines.&lt;/li&gt;
  &lt;/ol&gt;

  &lt;p&gt;[Ray’s] Tune-sklearn is also &lt;strong&gt;fast&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dask-ML’s model selection module has every one of the features:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Consistency with Scikit-Learn API:&lt;/strong&gt; Dask-ML’s model selection API
mirrors the Scikit-Learn model selection API.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Modern hyperparameter tuning techniques:&lt;/strong&gt; Dask-ML offers state-of-the-art
hyperparameter tuning techniques.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Framework support:&lt;/strong&gt; Dask-ML model selection supports many libraries
including Scikit-Learn, PyTorch, Keras, LightGBM and XGBoost.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scale up:&lt;/strong&gt; Dask-ML supports distributed tuning (how could it not?) and
larger-than-memory datasets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dask-ML is also &lt;strong&gt;fast.&lt;/strong&gt; In “&lt;a href=&quot;#speed&quot;&gt;Speed&lt;/a&gt;” we show a benchmark between
Dask-ML, Ray and Scikit-Learn:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020-model-selection/n_workers=8.png&quot; width=&quot;450px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Only time-to-solution is relevant; all of these methods produce similar model
scores. See “&lt;a href=&quot;#speed&quot;&gt;Speed&lt;/a&gt;” for details.&lt;/p&gt;

&lt;p&gt;Now, let’s walk through the details on how to use Dask-ML to obtain the 5
features above.&lt;/p&gt;

&lt;h3 id=&quot;consistency-with-the-scikit-learn-api&quot;&gt;Consistency with the Scikit-Learn API&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Dask-ML is consistent with the Scikit-Learn API.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here’s how to use Scikit-Learn’s, Dask-ML’s and Ray’s tune-sklearn
hyperparameter optimization:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;## Trimmed example; see appendix for more detail
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RandomizedSearchCV&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RandomizedSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_ml.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;classes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;tune_sklearn&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TuneSearchCV&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TuneSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;classes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The definitions of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;model&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;params&lt;/code&gt; follow the normal Scikit-Learn
definitions as detailed in the &lt;a href=&quot;#full-example-usage&quot;&gt;appendix&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Clearly, both Dask-ML and Ray’s tune-sklearn are Scikit-Learn compatible. Now
let’s focus on how each search performs and how it’s configured.&lt;/p&gt;

&lt;h3 id=&quot;modern-hyperparameter-tuning-techniques&quot;&gt;Modern hyperparameter tuning techniques&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Dask-ML offers state-of-the-art hyperparameter tuning techniques
in a Scikit-Learn interface.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://medium.com/distributed-computing-with-ray/gridsearchcv-2-0-new-and-improved-ee56644cbabf&quot;&gt;The introduction&lt;/a&gt; of Ray’s tune-sklearn made this claim:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;tune-sklearn is the only
Scikit-Learn interface that allows you to easily leverage Bayesian
Optimization, HyperBand and other optimization techniques by simply toggling a few parameters.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The state-of-the-art in hyperparameter optimization is currently
“&lt;a href=&quot;https://arxiv.org/pdf/1603.06560.pdf&quot;&gt;Hyperband&lt;/a&gt;.” Hyperband reduces the amount of computation
required with a &lt;em&gt;principled&lt;/em&gt; early stopping scheme; past that, it’s the same as
Scikit-Learn’s popular &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomizedSearchCV&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Hyperband &lt;em&gt;works.&lt;/em&gt; As such, it’s very popular. After the introduction of
Hyperband in 2016 by Li et. al, &lt;a href=&quot;https://arxiv.org/pdf/1603.06560.pdf&quot;&gt;the paper&lt;/a&gt; has been cited
&lt;a href=&quot;https://scholar.google.com/scholar?cites=10473284631669296057&amp;amp;as_sdt=5,39&amp;amp;sciodt=0,39&amp;amp;hl=en&quot;&gt;over 470 times&lt;/a&gt; and has been implemented in many different libraries
including &lt;a href=&quot;https://ml.dask.org/modules/generated/dask_ml.model_selection.HyperbandSearchCV.html#dask_ml.model_selection.HyperbandSearchCV&quot;&gt;Dask-ML&lt;/a&gt;, &lt;a href=&quot;https://docs.ray.io/en/master/tune/api_docs/schedulers.html#asha-tune-schedulers-ashascheduler&quot;&gt;Ray Tune&lt;/a&gt;, &lt;a href=&quot;https://keras-team.github.io/keras-tuner/documentation/tuners/#hyperband-class&quot;&gt;keras-tune&lt;/a&gt;, &lt;a href=&quot;https://medium.com/optuna/optuna-supports-hyperband-93b0cae1a137&quot;&gt;Optuna&lt;/a&gt;,
&lt;a href=&quot;https://www.automl.org/&quot;&gt;AutoML&lt;/a&gt;,&lt;sup id=&quot;fnref:automl&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:automl&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; and &lt;a href=&quot;https://nni.readthedocs.io/en/latest/Tuner/HyperbandAdvisor.html&quot;&gt;Microsoft’s NNI&lt;/a&gt;. The original paper shows a
rather drastic improvement over all the relevant
implementations,&lt;sup id=&quot;fnref:hyperband-figs&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:hyperband-figs&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; and this drastic improvement persists in
follow-up works.&lt;sup id=&quot;fnref:follow-up&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:follow-up&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; Some illustrative results from Hyperband are
below:&lt;/p&gt;

&lt;p&gt;&lt;img width=&quot;80%&quot; src=&quot;/images/2020-model-selection/hyperband-fig-7-8.png&quot; style=&quot;display: block; margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/p&gt;

&lt;div style=&quot;text-align: center;&quot;&gt;

  &lt;p&gt;&lt;sup&gt;All algorithms are configured to do the same amount of work except “random
2x” which does twice as much work. “hyperband (finite)” is similar Dask-ML’s
default implementation, and “bracket s=4” is similar to Ray’s default
implementation. “random” is a random search. SMAC,&lt;sup id=&quot;fnref:smac&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:smac&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;
spearmint,&lt;sup id=&quot;fnref:spearmint&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:spearmint&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt; and TPE&lt;sup id=&quot;fnref:tpe&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:tpe&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt; are popular Bayesian algorithms. &lt;/sup&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;p&gt;Hyperband is undoubtedly a “cutting edge” hyperparameter optimization
technique. Dask-ML and Ray offer Scikit-Learn implementations of this algorithm
that rely on similar implementations, and Dask-ML’s implementation also has a
&lt;a href=&quot;https://ml.dask.org/hyper-parameter-search.html#hyperband-parameters-rule-of-thumb&quot;&gt;rule of thumb&lt;/a&gt; for configuration. Both Dask-ML’s and Ray’s documentation
encourages use of Hyperband.&lt;/p&gt;

&lt;p&gt;Ray does support using their Hyperband implementation on top of a technique
called Bayesian sampling. This changes the hyperparameter sampling scheme for
model initialization. This can be used in conjunction with Hyperband’s early
stopping scheme. Adding this option to Dask-ML’s Hyperband implementation is
future work for Dask-ML.&lt;/p&gt;

&lt;h3 id=&quot;framework-support&quot;&gt;Framework support&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Dask-ML model selection supports many libraries including Scikit-Learn, PyTorch, Keras, LightGBM and XGBoost.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ray’s tune-sklearn supports these frameworks:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;tune-sklearn is used primarily for tuning
Scikit-Learn models, but it also supports and provides examples for many
other frameworks with Scikit-Learn wrappers such as Skorch (Pytorch),
KerasClassifiers (Keras), and XGBoostClassifiers (XGBoost).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Clearly, both Dask-ML and Ray support the many of the same libraries.&lt;/p&gt;

&lt;p&gt;However, both Dask-ML and Ray have some qualifications. Certain libraries don’t
offer an implementation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt;,&lt;sup id=&quot;fnref:ray-pf&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:ray-pf&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;7&lt;/a&gt;&lt;/sup&gt; so not all of the modern
hyperparameter optimization techniques can be offered. Here’s a table comparing
different libraries and their support in Dask-ML’s model selection and Ray’s
tune-sklearn:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Model Library&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Dask-ML support&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Ray support&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Dask-ML: early stopping?&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;Ray: early stopping?&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;https://scikit-learn.org/&quot;&gt;Scikit-Learn&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔*&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔*&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;https://pytorch.org/&quot;&gt;PyTorch&lt;/a&gt; (via &lt;a href=&quot;https://skorch.readthedocs.io/&quot;&gt;Skorch&lt;/a&gt;)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;https://keras.io/&quot;&gt;Keras&lt;/a&gt; (via &lt;a href=&quot;https://github.com/adriangb/scikeras&quot;&gt;SciKeras&lt;/a&gt;)&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔**&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔**&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;https://lightgbm.readthedocs.io/&quot;&gt;LightGBM&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;❌&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;❌&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;https://xgboost.ai/&quot;&gt;XGBoost&lt;/a&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;✔&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;❌&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;❌&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;sup&gt;* Only for &lt;a href=&quot;https://scikit-learn.org/stable/modules/computing.html#incremental-learning&quot;&gt;the models that implement &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt;&lt;/a&gt;.&lt;/sup&gt;&lt;br /&gt;
&lt;sup&gt;** Thanks to work by the Dask developers around &lt;a href=&quot;https://github.com/adriangb/scikeras/issues/24&quot;&gt;scikeras#24&lt;/a&gt;.&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;By this measure, Dask-ML and Ray model selection have the same level of
framework support. Of course, Dask has tangential integration with LightGBM and
XGBoost through &lt;a href=&quot;https://ml.dask.org/xgboost.html&quot;&gt;Dask-ML’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xgboost&lt;/code&gt; module&lt;/a&gt; and &lt;a href=&quot;https://github.com/dask/dask-lightgbm&quot;&gt;dask-lightgbm&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;scale-up&quot;&gt;Scale up&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Dask-ML supports distributed tuning (how could it not?), aka parallelization
across multiple machines/cores. In addition, it also supports
larger-than-memory data.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;[Ray’s] Tune-sklearn leverages Ray Tune, a library for distributed
hyperparameter tuning, to efficiently and transparently parallelize cross
validation on multiple cores and even multiple machines.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Naturally, Dask-ML also scales to multiple cores/machines because it relies on
Dask. Dask has wide support for &lt;a href=&quot;https://docs.dask.org/en/latest/setup.html&quot;&gt;different deployment options&lt;/a&gt; that span
from your personal machine to supercomputers. Dask will very likely work on top
of any computing system you have available, including Kubernetes, SLURM, YARN
and Hadoop clusters as well as your personal machine.&lt;/p&gt;

&lt;p&gt;Dask-ML’s model selection also scales to larger-than-memory datasets, and is
thoroughly tested. Support for larger-than-memory data is untested in Ray, and
there are no examples detailing how to use Ray Tune with the distributed
dataset implementations in PyTorch/Keras.&lt;/p&gt;

&lt;p&gt;In addition, I have benchmarked Dask-ML’s model selection module to see how the
time-to-solution is affected by the number of Dask workers in “&lt;a href=&quot;https://blog.dask.org/2019/09/30/dask-hyperparam-opt&quot;&gt;Better and
faster hyperparameter optimization with Dask&lt;/a&gt;.” That is, how does the
time to reach a particular accuracy scale with the number of workers $P$? At
first, it’ll scale like $1/P$ but with large number of workers the serial
portion will dictate time to solution according to &lt;a href=&quot;https://en.wikipedia.org/wiki/Amdahl%27s_law&quot;&gt;Amdahl’s Law&lt;/a&gt;. Briefly, I
found Dask-ML’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; speedup started to saturate around 24
workers for a particular search.&lt;/p&gt;

&lt;h3 id=&quot;speed&quot;&gt;Speed&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Both Dask-ML and Ray are much faster than Scikit-Learn.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ray’s tune-sklearn runs some benchmarks in &lt;a href=&quot;https://medium.com/distributed-computing-with-ray/gridsearchcv-2-0-new-and-improved-ee56644cbabf&quot;&gt;the introduction&lt;/a&gt; with the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GridSearchCV&lt;/code&gt; class found in Scikit-Learn and Dask-ML. A more fair benchmark
would be use Dask-ML’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; because it is almost the same as the
algorithm in Ray’s tune-sklearn. To be specific, I’m interested in comparing
these methods:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Scikit-Learn’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomizedSearchCV&lt;/code&gt;. This is a popular implementation, one
that I’ve bootstrapped myself with a custom model.&lt;/li&gt;
  &lt;li&gt;Dask-ML’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt;. This is an early stopping technique for
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomizedSearchCV&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Ray tune-sklearn’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TuneSearchCV&lt;/code&gt;. This is a slightly different early
stopping technique than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt;’s.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each search is configured to perform the same task: sample 100 parameters and
train for no longer than 100 “epochs” or passes through the
data.&lt;sup id=&quot;fnref:random-search&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:random-search&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;8&lt;/a&gt;&lt;/sup&gt; Each estimator is configured as their respective
documentation suggests. Each search uses 8 workers with a single cross
validation split, and a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt; call takes one second with 50,000
examples. The complete setup can be found in &lt;a href=&quot;#appendix&quot;&gt;the appendix&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here’s how long each library takes to complete the same search:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2020-model-selection/n_workers=8.png&quot; width=&quot;450px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Notably, we didn’t improve the Dask-ML codebase for this benchmark, and ran the
code as it’s been for the last year.&lt;sup id=&quot;fnref:priority-impl&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:priority-impl&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;9&lt;/a&gt;&lt;/sup&gt; Regardless, it’s possible that
other artifacts from &lt;a href=&quot;http://matthewrocklin.com/blog/work/2017/03/09/biased-benchmarks&quot;&gt;biased benchmarks&lt;/a&gt; crept into this benchmark.&lt;/p&gt;

&lt;p&gt;Clearly, Ray and Dask-ML offer similar performance for 8 workers when compared
with Scikit-Learn. To Ray’s credit, their implementation is ~15% faster than
Dask-ML’s with 8 workers. We suspect that this performance boost comes from the
fact that Ray implements an asynchronous variant of Hyperband. We should
investigate this difference between Dask and Ray, and how each balances the
tradeoffs, number FLOPs vs. time-to-solution. This will vary with the number
of workers: the asynchronous variant of Hyperband provides no benefit if used
with a single worker.&lt;/p&gt;

&lt;p&gt;Dask-ML reaches scores quickly in serial environments, or when the number of
workers is small. Dask-ML prioritizes fitting high scoring models: if there are
100 models to fit and only 4 workers available, Dask-ML selects the models that
have the highest score. This is most relevant in serial
environments;&lt;sup id=&quot;fnref:priority&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:priority&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;10&lt;/a&gt;&lt;/sup&gt; see “&lt;a href=&quot;https://blog.dask.org/2019/09/30/dask-hyperparam-opt&quot;&gt;Better and faster hyperparameter optimization
with Dask&lt;/a&gt;” for benchmarks. This feature is omitted from this
benchmark, which only focuses on time to solution.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Dask-ML and Ray offer the same features for model selection: state-of-the-art
features with a Scikit-Learn compatible API, and both implementations have
fairly wide support for different frameworks and rely on backends that can
scale to many machines.&lt;/p&gt;

&lt;p&gt;In addition, the Ray implementation has provided motivation for further
development, specifically on the following items:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Adding support for more libraries, including Keras&lt;/strong&gt; (&lt;a href=&quot;https://github.com/dask/dask-ml/issues/696&quot;&gt;dask-ml#696&lt;/a&gt;,
&lt;a href=&quot;https://github.com/dask/dask-ml/pull/713&quot;&gt;dask-ml#713&lt;/a&gt;, &lt;a href=&quot;https://github.com/adriangb/scikeras/issues/24&quot;&gt;scikeras#24&lt;/a&gt;). SciKeras is a Scikit-Learn wrapper for
Keras that (now) works with Dask-ML model selection because SciKeras models
implement the Scikit-Learn model API.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Better documenting the models that Dask-ML supports&lt;/strong&gt;
(&lt;a href=&quot;https://github.com/dask/dask-ml/pull/699&quot;&gt;dask-ml#699&lt;/a&gt;). Dask-ML supports any model that implement the
Scikit-Learn interface, and there are wrappers for Keras, PyTorch, LightGBM
and XGBoost. Now, &lt;a href=&quot;https://ml.dask.org&quot;&gt;Dask-ML’s documentation&lt;/a&gt; prominently highlights this
fact.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Ray implementation has also helped motivate and clarify future work.
Dask-ML should include the following implementations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;A Bayesian sampling scheme for the Hyperband implementation&lt;/strong&gt; that’s
similar to Ray’s and BOHB’s (&lt;a href=&quot;https://github.com/dask/dask-ml/issues/697&quot;&gt;dask-ml#697&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;A configuration of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; that’s well-suited for
exploratory hyperparameter searches.&lt;/strong&gt; An initial implementation is in
&lt;a href=&quot;https://github.com/dask/dask-ml/pull/532&quot;&gt;dask-ml#532&lt;/a&gt;, which should be benchmarked against Ray.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Luckily, all of these pieces of development are straightforward modifications
because the Dask-ML model selection framework is pretty flexible.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you &lt;a href=&quot;https://github.com/TomAugspurger&quot;&gt;Tom Augspurger&lt;/a&gt;, &lt;a href=&quot;https://github.com/mrocklin&quot;&gt;Matthew Rocklin&lt;/a&gt;, &lt;a href=&quot;https://github.com/jsignell&quot;&gt;Julia Signell&lt;/a&gt;, and &lt;a href=&quot;https://github.com/quasiben&quot;&gt;Benjamin
Zaitlen&lt;/a&gt; for your feedback, suggestions and edits.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;appendix&quot;&gt;Appendix&lt;/h2&gt;

&lt;h3 id=&quot;benchmark-setup&quot;&gt;Benchmark setup&lt;/h3&gt;

&lt;p&gt;This is the complete setup for the benchmark between Dask-ML, Scikit-Learn and
Ray. Complete details can be found at
&lt;a href=&quot;https://github.com/stsievert/dask-hyperband-comparison&quot;&gt;stsievert/dask-hyperband-comparison&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let’s create a dummy model that takes 1 second for a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt; call with
50,000 examples. This is appropriate for this benchmark; we’re only interested
in the time required to finish the search, not how well the models do.
Scikit-learn, Ray and Dask-ML have have very similar methods of choosing
hyperparameters to evaluate; they differ in their early stopping techniques.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;scipy.stats&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uniform&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_classification&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;benchmark&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ConstantFunction&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# custom module
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# This model sleeps for `latency * len(X)` seconds before
# reporting a score of `value`.
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ConstantFunction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;latency&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;50e3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uniform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# This dummy dataset mirrors the MNIST dataset
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_classification&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;60e3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;784&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This model will take 2 minutes to train for 100 epochs (aka passes through the
data). Details can be found at &lt;a href=&quot;https://github.com/stsievert/dask-hyperband-comparison&quot;&gt;stsievert/dask-hyperband-comparison&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let’s configure our searches to use 8 workers with a single cross-validation
split:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RandomizedSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ShuffleSplit&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ShuffleSplit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;test_size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_splits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;refit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RandomizedSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_jobs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_iter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 20.88 minutes
&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_ml.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dask_search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test_size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;aggressiveness&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;tune_sklearn&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TuneSearchCV&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ray_search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TuneSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_iter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_iters&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;early_stopping&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;dask_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 2.93 minutes
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ray_search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 2.49 minutes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;full-example-usage&quot;&gt;Full example usage&lt;/h3&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.linear_model&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SGDClassifier&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;scipy.stats&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uniform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loguniform&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.datasets&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_classification&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SGDClassifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;alpha&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loguniform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1e-5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1e-3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;l1_ratio&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uniform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_classification&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RandomizedSearchCV&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RandomizedSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_ml.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;classes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;tune_sklearn&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TuneSearchCV&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TuneSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;classes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:automl&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Their implementation of Hyperband in &lt;a href=&quot;https://github.com/automl/HpBandSter&quot;&gt;HpBandSter&lt;/a&gt; is included in &lt;a href=&quot;https://www.automl.org/wp-content/uploads/2018/09/chapter7-autonet.pdf&quot;&gt;Auto-PyTorch&lt;/a&gt; and &lt;a href=&quot;https://github.com/automl/BOAH&quot;&gt;BOAH&lt;/a&gt;. &lt;a href=&quot;#fnref:automl&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:hyperband-figs&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;See Figures 4, 7 and 8 in “&lt;a href=&quot;https://arxiv.org/pdf/1603.06560.pdf&quot;&gt;Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization&lt;/a&gt;.” &lt;a href=&quot;#fnref:hyperband-figs&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:follow-up&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;See Figure 1 of &lt;a href=&quot;http://proceedings.mlr.press/v80/falkner18a/falkner18a.pdf&quot;&gt;the BOHB paper&lt;/a&gt; and &lt;a href=&quot;https://arxiv.org/pdf/1801.01596.pdf&quot;&gt;a paper&lt;/a&gt; from an augmented reality company. &lt;a href=&quot;#fnref:follow-up&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:smac&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;SMAC is described in “&lt;a href=&quot;https://www.cs.ubc.ca/~hutter/papers/10-TR-SMAC.pdf&quot;&gt;Sequential Model-Based Optimization forGeneral Algorithm Configuration&lt;/a&gt;,” and is available &lt;a href=&quot;https://www.automl.org/automated-algorithm-design/algorithm-configuration/smac/&quot;&gt;in AutoML&lt;/a&gt;. &lt;a href=&quot;#fnref:smac&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:spearmint&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Spearmint is described in “&lt;a href=&quot;https://papers.nips.cc/paper/4522-practical-bayesian-optimization-of-machine-learning-algorithms.pdf&quot;&gt;Practical Bayesian Optimization of MachineLearning Algorithms&lt;/a&gt;,” and is available in &lt;a href=&quot;https://github.com/HIPS/Spearmint&quot;&gt;HIPS/spearmint&lt;/a&gt;. &lt;a href=&quot;#fnref:spearmint&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:tpe&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;TPE is described in Section 4 of “&lt;a href=&quot;http://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf&quot;&gt;Algorithms for Hyperparameter Optimization&lt;/a&gt;,” and is available &lt;a href=&quot;http://hyperopt.github.io/hyperopt/&quot;&gt;through Hyperopt&lt;/a&gt;. &lt;a href=&quot;#fnref:tpe&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:ray-pf&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;From &lt;a href=&quot;https://github.com/ray-project/tune-sklearn/blob/31f228e21ef632a89a74947252d8ad5323cbd043/README.md&quot;&gt;Ray’s README.md&lt;/a&gt;: “If the estimator does not support &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt;, a warning will be shown saying early stopping cannot be done and it will simply run the cross-validation on Ray’s parallel back-end.” &lt;a href=&quot;#fnref:ray-pf&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:random-search&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;I choose to benchmark random searches instead of grid searches because random searches produce better results because grid searches require estimating how important each parameter is; for more detail see “&lt;a href=&quot;http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf&quot;&gt;Random Search for Hyperparameter Optimization&lt;/a&gt;” by Bergstra and Bengio. &lt;a href=&quot;#fnref:random-search&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:priority-impl&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Despite a relevant implementation in &lt;a href=&quot;https://github.com/dask/dask-ml/pull/527&quot;&gt;dask-ml#527&lt;/a&gt;. &lt;a href=&quot;#fnref:priority-impl&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:priority&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Because priority is meaningless if there are an infinite number of workers. &lt;a href=&quot;#fnref:priority&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Configuring a Distributed Dask Cluster</title>
   <link href="https://blog.dask.org/2020/07/30/beginners-config"/>
   <updated>2020-07-30T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/07/30/beginners-config</id>
   
   <category>distributed</category>
   
   <category>config</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;Configuring a Dask cluster can seem daunting at first, but the good news is that the Dask project has a lot of built in heuristics that try its best to anticipate and adapt to your workload based on the machine it is deployed on and the work it receives. Possibly for a long time you can get away with not configuring anything special at all. That being said, if you are looking for some tips to move on from using Dask locally, or have a Dask cluster that you are ready to optimize with some more in-depth configuration, these tips and tricks will help guide you and link you to the best Dask docs on the topic!&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-to-host-a-distributed-dask-cluster&quot;&gt;How to host a distributed Dask cluster&lt;/h2&gt;

&lt;p&gt;The biggest jump for me was from running a local version of Dask for just an hour or so at a time during development, to standing up a production-ready version of Dask. Broadly there are two styles:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;a static dask cluster – one that is always on, always awake, always ready to accept work&lt;/li&gt;
  &lt;li&gt;an ephemeral dask cluster – one that is spun up or down easily with a Python API, and, when on, starts a minimal dask master node that itself only spins up dask workers when work is actually submitted&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Though those are the two broad main categories, there are tons of choices of how to actually achieve that. It depends on a number of factors including what cloud provider products you want to use and if those resources are pre-provisioned for you and whether you want to use a python API or a different deployment tool to actually start the Dask processes. A very exhaustive list of all the different ways you could provision a dask cluster is in the dask docs under &lt;a href=&quot;https://docs.dask.org/en/latest/setup.html&quot;&gt;Setup&lt;/a&gt;. As just a taste of what is described in those docs, you could:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Install and start up the dask processes &lt;a href=&quot;https://docs.dask.org/en/latest/setup/cli.html&quot;&gt;manually from the CLI&lt;/a&gt; on cloud instances you provision, such as AWS EC2 or GCP GCE&lt;/li&gt;
  &lt;li&gt;Use popular deployment interfaces such as &lt;a href=&quot;https://docs.dask.org/en/latest/setup/kubernetes-helm.html&quot;&gt;helm for kubernetes&lt;/a&gt; to deploy dask in cloud container clusters you provision, such as AWS Fargate or GCP GKE&lt;/li&gt;
  &lt;li&gt;Use ‘native’ deployment python APIs, provided by the dask developers, to create (and interactively configure) dask on deployment infrastructure they support, either through the general-purpose &lt;a href=&quot;https://gateway.dask.org/&quot;&gt;Dask Gateway&lt;/a&gt; which supports multiple backends, or directly against cluster managers such as kubernetes with &lt;a href=&quot;https://kubernetes.dask.org/en/latest/&quot;&gt;dask-kubernetes&lt;/a&gt; or YARN with &lt;a href=&quot;https://yarn.dask.org/en/latest/&quot;&gt;dask-yarn&lt;/a&gt;, as long as you’ve already provisioned the kubernetes cluster or hadoop cluster already&lt;/li&gt;
  &lt;li&gt;Use a nearly full-service deployment python API called &lt;a href=&quot;https://cloudprovider.dask.org/en/latest/&quot;&gt;Dask Cloud Provider&lt;/a&gt;, that will go one step farther and provision the cluster for you too, as long as you give it AWS credentials (and as of time of writing, it only supports AWS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see, there are a ton of options. On top of all of those, you might contract a managed service provider to provision and configure your dask cluster for you according to your specs, such as &lt;a href=&quot;https://www.saturncloud.io&quot;&gt;Saturn Cloud&lt;/a&gt; (&lt;em&gt;Disclaimer: one of the authors (Julia Signell) works for Saturn Cloud&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Whatever you choose, the whole point is to unlock the power of parallelism in Python that Dask provides, in as scalable a manner as possible which is what getting it running on distributed infrastructure is all about. Once you know where and with what API you are going to deploy your dask cluster, the real configuration process for your Dask cluster and its workload begins.&lt;/p&gt;

&lt;h2 id=&quot;how-to-choose-instance-type-for-your-cluster&quot;&gt;How to choose instance type for your cluster&lt;/h2&gt;

&lt;p&gt;When you are ready to set up your dask cluster for production, you will need to make some decisions about the infrastructure your scheduler and your workers will be running on, especially if you are using one of the options from &lt;a href=&quot;#how-to-host-a-distributed-dask-cluster&quot;&gt;How to host a distributed dask cluster&lt;/a&gt; that requires pre-provisioned infrastructure. Whether your infrastructure is on-prem or in the cloud, the classic decision points need to be made:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Memory requirements&lt;/li&gt;
  &lt;li&gt;CPU requirements&lt;/li&gt;
  &lt;li&gt;Storage requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have tested your workload locally, a simple heuristic is to multiply the CPU, storage, and memory usage of your work by some multiplier that is related to how scaled down your local experiments are from your expected production usage. For example, if you test your workload locally with a 10% sample of data, multiplying any observed resource usage by at least 10 may get you close to your minimum instance size. Though in reality Dask’s many underlying optimizations means that it shouldn’t regularly require linear growth of resources to work on more data, this simple heuristic may give you a starting point as a good first pass technique.&lt;/p&gt;

&lt;p&gt;In the same vein, choosing the smallest instance and running with a predetermined subset of data and scaling up until it runs effectively gives you a hint towards the minimum instance size. If your local environment is too underpowered to run your flows locally with 10%+ of your source data, if it is a highly divergent environment (for example a different OS, or with many competing applications running in the background), or if it is difficult or annoying to monitor CPU, memory, and storage of your flow’s execution using your local machine, isolating the test case on the smallest workable node is a better option.&lt;/p&gt;

&lt;p&gt;On the flip side, choosing the biggest instance you can afford and observing the discrepancy between max CPU/memory/storage metrics and scaling back based on the ratio of unused resources can be a quicker way to find your ideal size.&lt;/p&gt;

&lt;p&gt;Wherever you land on node size might be heavily influenced by what you want to pay for, but as long as your node size is big enough that you are avoiding strict out of memory errors, the flip side of what you pay for with nodes closest to your minimum run specs is time. Since the point of your Dask cluster is to run distributed, parallel computations, you can get significant time savings if you scale up your instance to allow for more parallelism. If you have long running models that take hours to train that you can reduce to minutes, and get back some of your time or your employee’s time to see the feedback loop quickly, then scaling up over your minimum specs is worth it.&lt;/p&gt;

&lt;p&gt;Should your scheduler node and worker nodes be the same size? It may certainly be tempting to provision them at separate instance sizes to optimize resources. It’s worth a quick dive into the general resource requirements of each to get a good sense.&lt;/p&gt;

&lt;p&gt;For the scheduler, a serialized version of each task is submitted to it is held in memory for as long as it needs to determine which worker should take the work. This is not necessarily the same amount of memory needed to actually execute the task, but skimping too much on memory here may prevent work from being scheduled. From a CPU perspective, the needs of the scheduler are likely much lower than your workers, but starving the scheduler of CPU will cause deadlock, and when the scheduler is stuck or dies your workers also cannot get any work. Storage wise, the Dask scheduler does not persist much to disk, even temporarily, so it’s storage needs are quite low.&lt;/p&gt;

&lt;p&gt;For the workers, the specific resource needs of your task code may overtake any generalizations we can make. If nothing else, they need enough memory and CPU to deserialize each task payload, and serialize it up again to return as a Future to the Dask scheduler. Dask workers may persist the results of computations in memory, including distributed across the memory of the cluster, which you can read more about &lt;a href=&quot;https://distributed.dask.org/en/latest/memory.html&quot;&gt;here&lt;/a&gt;. Regarding storage needs, fundamentally tasks submitted to Dask workers should not write to local storage - the scheduler does not guarantee work will be run on a given worker - so the storage costs should be directly related to the installation footprint of your worker’s dependencies and any ephemeral storage of the dask workers. Temporary files the workers create may include spilling in-memory data to local disk if they run out of memory as long as &lt;a href=&quot;https://docs.dask.org/en/latest/configuration-reference.html#distributed.worker.memory.spill&quot;&gt;that behavior isn’t disabled&lt;/a&gt;, which means that reducing memory can have an effect on your ephemeral storage needs.&lt;/p&gt;

&lt;p&gt;Generally we would recommend simplifying your life and keeping your scheduler and worker nodes the same node size, but if you wanted to optimize them, use the above CPU, memory and storage patterns to give you a starting point for configuring them separately.&lt;/p&gt;

&lt;h2 id=&quot;how-to-choose-number-of-workers&quot;&gt;How to choose number of workers&lt;/h2&gt;

&lt;p&gt;Every dask cluster has one scheduler and any number of workers. The scheduler keeps track of what work needs to be done and what has already been completed. The workers do work, share results between themselves and report back to the scheduler. More background on what this entails is available in the &lt;a href=&quot;https://distributed.dask.org/en/latest/worker.html&quot;&gt;dask.distributed documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When setting up a dask cluster you have to decide how many workers to use. It can be tempting to use many workers, but that isn’t always a good idea. If you use too many workers some may not have enough to do and spend much of their time idle. Even if they have enough to do, they might need to share data with each other which can be slow. Additionally if your machine has finite resources (rather than one node per worker), then each worker will be weaker - they might run out of memory, or take a long time to finish a task.&lt;/p&gt;

&lt;p&gt;On the other hand if you use too few workers you don’t get to take full advantage of the parallelism of dask and your work might take longer to complete overall.&lt;/p&gt;

&lt;p&gt;Before you decide how many workers to use, try using the default. In many cases dask can choose a default that makes use of the size and shape of your machine. If that doesn’t work, then you’ll need some information about the size and shape of your work. In particular you’ll want to know:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;What size is your computer or what types of compute nodes do you have access to?&lt;/li&gt;
  &lt;li&gt;How big is your data?&lt;/li&gt;
  &lt;li&gt;What is the structure of the computation that you are trying to do?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are working on your local machine, then the size of the computer is fixed and knowable. If you are working on HPC or cloud instances then you can choose the resources allotted to each worker. You make the decision about the size of your cluster based on factors we discussed in &lt;a href=&quot;#how-to-choose-instance-type-for-your-cluster&quot;&gt;How to choose instance type for your cluster&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dask is often used in situations where the data are too big to fit in memory. In these cases the data are split into chunks or partitions. Each task is computed on the chunk and then the results are aggregated. You will learn about how to change the shape of your data &lt;a href=&quot;#how-to-host-a-distributed-dask-cluster&quot;&gt;below&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The structure of the computation might be the hardest to reason about. If possible, it can be helpful to try out the computation on a very small subset of the data. You can see the task graph for a particular computation by calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.visualize()&lt;/code&gt;. If the graph is too large to comfortably view inline, then take a look at the &lt;a href=&quot;https://docs.dask.org/en/latest/diagnostics-distributed.html&quot;&gt;Dask dashboard&lt;/a&gt; graph tab. This shows the task graph as it runs and lights up each section. To make dask most efficient, you want a task graph that isn’t too big or too interconnected. The &lt;a href=&quot;https://docs.dask.org/en/latest/best-practices.html#avoid-very-large-graphs&quot;&gt;dask docs&lt;/a&gt; discuss several techniques for optimizing your task graph.&lt;/p&gt;

&lt;p&gt;To pick the number of workers to use, think about how many concurrent tasks are happening at any given part of the graph. If each task contains a non-trivial amount of work, then the fastest way to run dask is to have a worker for each concurrent task. For chunked data, if each worker is able to comfortably hold one data chunk in memory and do some computation on that data, then the number of chunks should be a multiple of the number of workers. This ensures that there is always enough work for a worker to do.&lt;/p&gt;

&lt;p&gt;If you have a highly variable number of tasks, then you can also consider using an adaptive cluster. In an adaptive cluster, you set the minimum and maximum number of workers and let the cluster add and remove workers as needed. When the scheduler determines that some workers aren’t needed anymore it asks the cluster to shut them down, and when more are needed, the scheduler asks the cluster to spin more up. This can work nicely for task graphs that start out with few input tasks then have more tasks in the middle, and then some aggregation or reductions at the end.&lt;/p&gt;

&lt;p&gt;Once you have started up your cluster with some workers, you can monitor their progress in the &lt;a href=&quot;https://docs.dask.org/en/latest/diagnostics-distributed.html&quot;&gt;dask dashboard&lt;/a&gt;. There you can check on their memory consumption, watch their progress through the task graph, and access worker-level logs. Watching your computation in this way, provides insight into potential speedups and builds intuition about the number of workers to use in the future.&lt;/p&gt;

&lt;p&gt;The tricky bit about choosing the number of workers to use is that in practice the size and shape of your machine, data, and task graph can change. Figuring out how many workers to use can end up feeling like an endless fiddling of knobs. If this is starting to drive you crazy then remember that you can always change the number or workers, even while the cluster is running.&lt;/p&gt;

&lt;h2 id=&quot;how-to-choose-nthreads-to-utilize-multithreading&quot;&gt;How to choose nthreads to utilize multithreading&lt;/h2&gt;

&lt;p&gt;When starting dask workers themselves, there are two very important configuration options to play against each other: how many workers and how many threads per worker. You can actually manipulate both on the same worker process with flags, such as in the form &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-worker --nprocs 2 --nthreads 2&lt;/code&gt;, though &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--nprocs&lt;/code&gt; simply spins up another worker in the background so it is cleaner configuration to avoid setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--nprocs&lt;/code&gt; and instead manipulate that configuration with whatever you use to specify total number of workers. We already talked about &lt;a href=&quot;#how-to-host-a-distributed-dask-cluster&quot;&gt;how to choose number of workers&lt;/a&gt;, but you may modify your decision about that if you change a workers’ &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--nthreads&lt;/code&gt; to increase the amount of work an individual worker can do.&lt;/p&gt;

&lt;p&gt;When deciding the best number of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nthreads&lt;/code&gt; for your workers, it all boils down to the type of work you expect those workers to do. The fundamental principle is that multiple threads are best to share data between tasks, but worse if running code that doesn’t release Python’s GIL (“Global Interpreter Lock”). Increasing the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nthreads&lt;/code&gt; for work that does not release the Python’s GIL has no effect; the worker cannot use threading to optimize the speed of computation if the GIL is locked. This is a possible point of confusion for new Dask users who want to increase their parallelism, but don’t see any gains from increasing the threading limit of their workers.&lt;/p&gt;

&lt;p&gt;As discussed in &lt;a href=&quot;[https://distributed.dask.org/en/latest/worker.html](https://distributed.dask.org/en/latest/worker.html)&quot;&gt;the Dask docs on workers&lt;/a&gt;, there are some rules of thumb when to worry about GIL lockages, and thus prefer more workers over heavier individual workers with high &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nthreads&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If your code is mostly pure Python (in non-optimized Python libraries) on non-numerical data&lt;/li&gt;
  &lt;li&gt;If your code causes computations external to Python that are long running and don’t release the GIL explicitly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conveniently, a lot of dask users are running exclusively numerical computations using Python libraries optimized for multithreading, namely NumPy, Pandas, SciPy, etc in the PyData stack. If you do mostly numerical computations using those or similarly optimized libraries, you should emphasize a higher thread count. If you truly are doing mostly numerical computations, you can specify as many total threads as you have cores; if you are doing any work that would cause a thread to pause, for example any I/O (to write results to disk, perhaps), you can specify &lt;em&gt;more&lt;/em&gt; threads than you have cores, since some will be occasionally sitting idle. The ideal number regarding how many more threads than cores to set in that situation is complex to estimate and dependent on your workload, but taking some advice from &lt;a href=&quot;https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor&quot;&gt;concurrent.futures&lt;/a&gt;, 5 times the processors on your machine is a historical upper bound to limit your total thread count to for heavily I/O dependent workloads.&lt;/p&gt;

&lt;h2 id=&quot;how-to-chunk-arrays-and-partition-dataframes&quot;&gt;How to chunk arrays and partition DataFrames&lt;/h2&gt;

&lt;p&gt;There are many different methods of triggering work in dask. For instance: you can wrap functions with delayed or submit work directly to the client (for a comparison of the options see &lt;a href=&quot;https://docs.dask.org/en/latest/user-interfaces.html&quot;&gt;User Interfaces&lt;/a&gt;). If you are loading structured data into dask objects, then you are likely using &lt;a href=&quot;https://docs.dask.org/en/latest/array.html&quot;&gt;dask.array&lt;/a&gt; or &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe.html&quot;&gt;dask.dataframe&lt;/a&gt;. These modules mimic numpy and pandas respectively - making it easier to interact with large arrays and large tabular datasets.&lt;/p&gt;

&lt;p&gt;When using dask.dataframe and dask.array, computations are divided among workers by splitting the data into pieces. In dask.dataframe these pieces are called &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-design.html#partitions&quot;&gt;partitions&lt;/a&gt; and in dask.array they are called &lt;a href=&quot;https://docs.dask.org/en/latest/array-chunks.html&quot;&gt;chunks&lt;/a&gt;, but the principle is the same. In the case of dask.array each chunk holds a numpy array and in the case of dask.dataframe each partition holds a pandas dataframe. Either way, each one contains a small part of the data, but is representative of the whole and must be small enough to comfortably fit in worker memory.&lt;/p&gt;

&lt;p&gt;Often when loading in data, the partitions/chunks will be determined automatically. For instance, when reading from a directory containing many csv files, each file will become a partition. If your data are not split up by default, then it can be done manually using df.set_index or array.rechunk. If they are split up by default and you want to change the shape of the chunks, the file-level chunks should be a multiple of the dask level chunks (read more about this &lt;a href=&quot;https://docs.dask.org/en/latest/array-best-practices.html#orient-your-chunks&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;As the user, you know how the data are going to be used, so you can often partition it in ways that lead to more efficient computations. For instance if you are going to be aggregating to a monthly step, it can make sense to chunk along the time axis. If instead you are going to be looking at a particular feature at different altitudes, it might make sense to chunk along the altitude. More tips for chunking dask.arrays are described in &lt;a href=&quot;https://docs.dask.org/en/latest/array-best-practices.html&quot;&gt;Best Practices&lt;/a&gt;. Another scenario in which it might be helpful to repartition is if you have filtered the data down to a subset of the original. In that case your partitions will likely be too small. See the dask.dataframe &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-best-practices.html#repartition-to-reduce-overhead&quot;&gt;Best Practices&lt;/a&gt; for more details on how to handle that case.&lt;/p&gt;

&lt;p&gt;When choosing the size of chunks it is best to make them neither too small, nor too big (around 100MB is often reasonable). Each chunk needs to be able to fit into the worker memory and operations on that chunk should take some non-trivial amount of time (more than 100ms). For many more recommendations take a look at the docs on &lt;a href=&quot;https://docs.dask.org/en/latest/array-chunks.html&quot;&gt;chunks&lt;/a&gt; and on &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-design.html#partitions&quot;&gt;partitions&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;We hope this helps you make decisions about whether to configure your Dask deployment differently and give you the confidence to try it out. We found all of this great information in the Dask docs, so if you are feeling inspired please follow the links we’ve sprinkled throughout and learn even more about Dask!&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>The current state of distributed Dask clusters</title>
   <link href="https://blog.dask.org/2020/07/23/current-state-of-distributed-dask-clusters"/>
   <updated>2020-07-23T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/07/23/current-state-of-distributed-dask-clusters</id>
   
   <content type="html">&lt;p&gt;Dask enables you to build up a graph of the computation you want to perform and then executes it in parallel for you. This is great for making best use of your computer’s hardware. It is also great when you want to expand beyond the limits of a single machine.&lt;/p&gt;

&lt;p&gt;In this post we will cover:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#manual-setup&quot;&gt;Manual cluster setup&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#cluster-managers&quot;&gt;Review of deployment options today&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#future&quot;&gt;Analysis of that state&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-setup&quot;&gt;Manual setup&lt;/h2&gt;

&lt;p&gt;Let’s dive in by covering the most straight forward way to setup a distributed Dask cluster.&lt;/p&gt;

&lt;h3 id=&quot;setup-scheduler-and-workers&quot;&gt;Setup scheduler and workers&lt;/h3&gt;

&lt;p&gt;Imagine we have three computers, we will call them &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MachineA&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MachineB&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MachineC&lt;/code&gt;. Each of these machines has a functioning Python environment and we have &lt;a href=&quot;https://docs.dask.org/en/latest/install.html&quot;&gt;installed Dask with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;conda install dask&lt;/code&gt;&lt;/a&gt;. If we want to pull them together into a Dask cluster we start by running a scheduler on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MachineA&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;dask-scheduler
&lt;span class=&quot;go&quot;&gt;distributed.scheduler - INFO - -----------------------------------------------
distributed.scheduler - INFO - Local Directory: /tmp/scheduler-btqf8ve1
distributed.scheduler - INFO - -----------------------------------------------
distributed.scheduler - INFO - Clear task state
distributed.scheduler - INFO -   Scheduler at: tcp://MachineA:8786
distributed.scheduler - INFO -   dashboard at:               :8787
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next we need to start a worker process on both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MachineB&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MachineC&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;dask-worker tcp://MachineA:8786
&lt;span class=&quot;go&quot;&gt;distributed.nanny - INFO -         Start Nanny at:    &apos;tcp://127.0.0.1:51224&apos;
distributed.worker - INFO -       Start worker at:      tcp://127.0.0.1:51225
distributed.worker - INFO -          Listening to:      tcp://127.0.0.1:51225
distributed.worker - INFO -          dashboard at:            127.0.0.1:51226
distributed.worker - INFO - Waiting to connect to:        tcp://MachineA:8786
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -               Threads:                          4
distributed.worker - INFO -                Memory:                    8.00 GB
distributed.worker - INFO -       Local Directory:       /tmp/worker-h3wfwg7j
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -         Registered to:        tcp://MachineA:8786
distributed.worker - INFO - -------------------------------------------------
distributed.core - INFO - Starting established connection
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If we start a worker on both of our two space machines Dask will autodetect the resources on the machine and make them available to the scheduler. In the example above the worker has detected 4 CPU cores and 8GB of RAM. Therefore our scheduler has access to a total of 8 cores and 16GB of RAM and it will use these resources to run through the computation graph as quickly as possible. If we add more workers on more machines then the amount of resources available to the scheduler increases and computation times should get faster.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note&lt;/strong&gt;: While the scheduler machine probably has the same resources as the other two these will not be used in the computation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lastly we need to connect to our scheduler from our Python session.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;tcp://MachineA:8786&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Creating this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client&lt;/code&gt; object within the Python global namespace means that any Dask code you execute will detect this and hand the computation off to the scheduler which will then execute on the workers.&lt;/p&gt;

&lt;h3 id=&quot;accessing-the-dashboard&quot;&gt;Accessing the dashboard&lt;/h3&gt;

&lt;p&gt;The Dask distributed scheduler also has a dashboard which can be opened in a web browser. As you can see in the output above the default location for this is on the scheduler machine at port &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;8787&lt;/code&gt;. So you should be able to navigate to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://MachineA:8787&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://i.imgur.com/VzQIVpI.png&quot;&gt;
&lt;img alt=&quot;Dask dashboard&quot; src=&quot;https://i.imgur.com/VzQIVpI.png&quot; width=&quot;100%&quot; align=&quot;center&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are using Jupyter Lab as your Python environment you are also able to open individual plots from the dashboard as windows in Jupyter Lab with the &lt;a href=&quot;https://github.com/dask/dask-labextension&quot;&gt;Dask Lab Extension&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://i.imgur.com/SNk6F0H.png&quot;&gt;
&lt;img alt=&quot;Dask Lab Extension&quot; src=&quot;https://i.imgur.com/SNk6F0H.png&quot; width=&quot;100%&quot; align=&quot;center&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;recap&quot;&gt;Recap&lt;/h3&gt;

&lt;p&gt;In this minimal example we have installed Dask on some machines, ran a distributed scheduler on one of them and workers on the others. We then connected to our cluster from our Python session and opened the dashboard to keep an eye on the cluster.&lt;/p&gt;

&lt;p&gt;What we haven’t covered is where these machines came from in the first place. In the rest of this post we will discuss the different ways that folks tend to run clusters out in the wild and give an overview of the various tools that exist to help you set up Dask clusters on a variety of infrastructure.&lt;/p&gt;

&lt;h2 id=&quot;cluster-requirements&quot;&gt;Cluster requirements&lt;/h2&gt;

&lt;p&gt;In order to run a Dask cluster you must be able to install Dask on a machine and start the scheduler and worker components. These machines need to be able to communicate via a network so that these components can speak to each other.&lt;/p&gt;

&lt;p&gt;You also need to be able to access the scheduler from your Python session via a network in order to connect the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client&lt;/code&gt; and access the dashboard.&lt;/p&gt;

&lt;p&gt;Lastly the Python environment in the Python session where you create your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client&lt;/code&gt; must match the Python environment where the workers are running. This is because Dask uses &lt;a href=&quot;https://github.com/cloudpipe/cloudpickle&quot;&gt;cloudpickle&lt;/a&gt; to serialize objects and send them to workers and to retrieve results. Therefore package versions must match in both locations.&lt;/p&gt;

&lt;p&gt;We will need to bear these requirements in mind as we discuss the different platforms that folks generally want to run Dask on.&lt;/p&gt;

&lt;h2 id=&quot;cluster-types&quot;&gt;Cluster types&lt;/h2&gt;

&lt;p&gt;There are two “types” of clusters that I tend to see folks running. Fixed clusters and ephemeral clusters.&lt;/p&gt;

&lt;h3 id=&quot;fixed-clusters&quot;&gt;Fixed clusters&lt;/h3&gt;

&lt;p&gt;One common way of setting up a cluster is to run the scheduler and worker commands as described above, but leave them running indefinitely. For the purpose of this article I’ll refer to this as a “fixed cluster”. You may use something like &lt;a href=&quot;https://www.freedesktop.org/wiki/Software/systemd/&quot;&gt;systemd&lt;/a&gt; or &lt;a href=&quot;http://supervisord.org/&quot;&gt;supervisord&lt;/a&gt; to manage the processes and ensure they are always running on the machines. The Dask cluster can then be treated as a service.&lt;/p&gt;

&lt;p&gt;In this paradigm once a cluster is set up folks may start their Python session, connect their client to this existing cluster, do some work and disconnect again. They might later come back to that cluster and run further work. The cluster will sit idle in the meantime.&lt;/p&gt;

&lt;p&gt;It is also common in this paradigm for multiple users to share this single cluster, however this is not recommended as the Dask scheduler does not manage users or clients separately and work will be executed on a first come first served bases. Therefore we recommend that users use a cluster one at a time.&lt;/p&gt;

&lt;h3 id=&quot;ephemeral-clusters&quot;&gt;Ephemeral clusters&lt;/h3&gt;

&lt;p&gt;An ephemeral cluster is one which only exists for the duration of the work. In this case a user may SSH onto the machines, run the commands to set up the cluster, connect a client and perform work, then disconnect and exit the Dask processes. A basic way of doing this would be to create a bash script which calls &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ssh&lt;/code&gt; and sets up the cluster. You would run this script in the background while performing your work and then kill it once you are done. We will cover other implementations of this in the coming sections.&lt;/p&gt;

&lt;p&gt;Ephemeral clusters allow you to leverage a bunch of machines but free them up again when you are done. This is especially useful when you are using a system like a cloud service or a batch scheduler where you have limited credits, or are charged for provisioned resources.&lt;/p&gt;

&lt;h2 id=&quot;adaptivity&quot;&gt;Adaptivity&lt;/h2&gt;

&lt;p&gt;Ephemeral clusters are also generally easier to scale as you will likely have an automated mechanism for starting workers. The Dask scheduler maintains an estimate of how long it expects the outstanding work will take to complete. If the scheduler has a mechanism for starting and stopping workers then it will scale up the workers in an attempt to complete all outstanding work within 5 seconds. This is referred to as adaptive mode.&lt;/p&gt;

&lt;p&gt;The mechanisms for starting and stopping workers are added via plugins. Many of the implementations we are about to discuss include this logic.&lt;/p&gt;

&lt;h2 id=&quot;connectivity&quot;&gt;Connectivity&lt;/h2&gt;

&lt;p&gt;Dask uses TCP to communicate between client, scheduler and workers by default. This means that all of these components must be on a TCP/IP network with open routes between the machines. Many connectivity problems step from firewalls or private networks blocking connections between certain components. An example of this would be running Dask on a cloud platform like AWS, but running the Python session and client on your laptop while sitting in a coffee shop using the free wifi. You must ensure you are able to route traffic between components, either by exposing the Dask cluster to the internet or by connecting your laptop to the private network via a VPN or tunnel.&lt;/p&gt;

&lt;p&gt;There is also &lt;a href=&quot;https://blog.dask.org/2019/06/09/ucx-dgx&quot;&gt;ongoing work to add support for UCX&lt;/a&gt; to Dask, which will allow it to make use of InfiniBand or NVLink networks where they are available.&lt;/p&gt;

&lt;h2 id=&quot;cluster-managers&quot;&gt;Cluster Managers&lt;/h2&gt;

&lt;p&gt;In the following section we are going to cover a range of cluster manager implementations which are available within the Dask community.&lt;/p&gt;

&lt;p&gt;In the Dask distributed codebase there is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cluster&lt;/code&gt; superclass which can be subclassed to build various cluster managers for different platforms. Members of the community have taken this and built their own packages which enable creating a Dask cluster on a specific platform, for example &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The design of these classes is that you import the cluster manager into your Python session and instantiate it. The object then handles starting the scheduler and worker processes on the target platform. You can then create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client&lt;/code&gt; object as usual from that cluster object to connect to it.&lt;/p&gt;

&lt;p&gt;All of these cluster manager objects are ephemeral clusters, they only exist for the duration of the Python session and then will be cleaned up.&lt;/p&gt;

&lt;h3 id=&quot;local-cluster&quot;&gt;Local Cluster&lt;/h3&gt;

&lt;p&gt;Let’s start with one of the reference implementations of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cluster&lt;/code&gt; from the Dask distributed codebase &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCluster&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This cluster manager starts a scheduler on your local machine, and then starts a worker for every CPU core that it finds on the machine.&lt;/p&gt;

&lt;h3 id=&quot;ssh-cluster&quot;&gt;SSH Cluster&lt;/h3&gt;

&lt;p&gt;Another reference implementation is &lt;a href=&quot;https://docs.dask.org/en/latest/setup/ssh.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SSHCluster&lt;/code&gt;&lt;/a&gt;. This is one of the most pure and simple ways of using multiple machines with Dask distributed and is very similar to our initial example in this blog post.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;MachineA&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;MachineB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;MachineC&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first argument here is a list of machines which we can SSH into and set up a Dask cluster on. The first machine in the list will be used as the scheduler and the rest as workers.&lt;/p&gt;

&lt;p&gt;As the scheduler will likely use far less resources than the workers you may even want to run that locally and make use of all three remote machines as workers.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;localhost&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;MachineA&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;MachineB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;MachineC&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;speccluster&quot;&gt;SpecCluster&lt;/h3&gt;

&lt;p&gt;The last implementation that is included in the core Dask distributed library is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SpecCluster&lt;/code&gt;. This is actually another superclass and is designed to be subclassed by other developers when building cluster managers. However it goes further than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cluster&lt;/code&gt; in expecting the developer to provide a full specification for schedulers and workers as Python classes. There is also a superclass called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ProcessInterface&lt;/code&gt; which is designed to be used when creating those scheduler and worker classes.&lt;/p&gt;

&lt;p&gt;Having standard interfaces means a more consistent experience for users. Many of the cluster manager we will cover next use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SpecCluster&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;dask-kubernetes&quot;&gt;Dask Kubernetes&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://kubernetes.dask.org/en/latest/&quot;&gt;Dask Kubernetes&lt;/a&gt; provides a cluster manager for &lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kubernetes provides high level APIs and abstract concepts for scheduling linux containers on a cluster of machines. It provides abstracted concepts for processes, containers, networks, storage, etc to empower better use of data centre scale resources.&lt;/p&gt;

&lt;p&gt;As a Dask user it generally doesn’t matter to you how your cluster is set up. But if you’ve been given access to a Kubernetes cluster by your organisation or institution you will need to understand those concepts in order to schedule your work on it.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;KubeCluster&lt;/code&gt; cluster manager further abstracts away those concepts into the Dask terms we are familiar with.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_kubernetes&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster_specific_kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In order for this code to work you will need to have &lt;a href=&quot;https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/&quot;&gt;configured your Kubernetes credentials&lt;/a&gt;, in the same way that for the SSH example you will need to configure your keys.&lt;/p&gt;

&lt;p&gt;Your client will also need to be able to access the Dask scheduler, and you probably want to be able to open the dashboard in your browser. However Kubernetes uses an overlay network which means that the IP addresses assigned to the scheduler and workers are only routable within the cluster. This is fine for them talking to each other but means you wont be able to get in from the outside.&lt;/p&gt;

&lt;p&gt;One way around this is to ensure your Python session is also running inside the Kubernetes cluster. A popular way of setting up an interactive Python environment on Kubernetes is with &lt;a href=&quot;https://zero-to-jupyterhub.readthedocs.io/en/latest/&quot;&gt;Zero to Jupyter Hub&lt;/a&gt;, which gives you access to &lt;a href=&quot;https://jupyter.org/&quot;&gt;Jupyter&lt;/a&gt; notebooks running within the Kubernetes cluster.&lt;/p&gt;

&lt;p&gt;The alternative is exposing your scheduler to the external network. You can do this by &lt;a href=&quot;https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-intro/&quot;&gt;exposing the Kubernetes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Service&lt;/code&gt; object&lt;/a&gt; associated with the scheduler or by &lt;a href=&quot;https://kubernetes.io/docs/concepts/services-networking/ingress/&quot;&gt;setting up and configuring an Ingress component&lt;/a&gt; for your Kubernetes cluster. Both of these options require some knowledge of Kubernetes.&lt;/p&gt;

&lt;h3 id=&quot;dask-helm-chart&quot;&gt;Dask Helm chart&lt;/h3&gt;

&lt;p&gt;Another option for running Dask on a Kubernetes cluster is using the &lt;a href=&quot;https://github.com/dask/helm-chart&quot;&gt;Dask Helm Chart&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is an example of a fixed cluster setup. Helm is a way of installing specific resources on a Kubernetes cluster, similar to a package manager like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yum&lt;/code&gt;. The Dask Helm chart includes a Jupyter notebook, a Dask scheduler and three Dask workers. The workers can be scaled manually by interacting with the Kubernetes API but not adaptively by the Dask scheduler itself.&lt;/p&gt;

&lt;p&gt;This feels like a different approach to what we’ve seen so far. It gives you a Dask cluster which is always available, and a Jupyter notebook to drive the cluster from. You then have to take your work to the cluster’s Jupyter session rather than spawning a cluster from your existing work place.&lt;/p&gt;

&lt;p&gt;One benefit of this approach is that because the Jupyter notebook has been set up as part of the cluster it already has the Lab Extension installed and also has been &lt;a href=&quot;https://github.com/dask/helm-chart/blob/f413647f90d6e278515b172c623977578a535aa2/dask/templates/dask-jupyter-deployment.yaml#L47-L48&quot;&gt;pre-configured&lt;/a&gt; with the location of the Dask cluster. So unlike previous examples where you need to either give the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client&lt;/code&gt; the address of the scheduler or a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cluster&lt;/code&gt; object, in this instance it will auto-detect the cluster from environment variables that are set by the Helm chart.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# The address is loaded from an environment variable
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client&lt;/code&gt; without any arguments in other situations where the scheduler location has not been configured it will automatically create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCluster&lt;/code&gt; object and use that.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;dask-jobqueue&quot;&gt;Dask Jobqueue&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/dask/dask-jobqueue&quot;&gt;Dask Jobqueue&lt;/a&gt; is a set of cluster managers aimed at HPC users.&lt;/p&gt;

&lt;p&gt;When working as a researcher or academic with access to an HPC or Supercomputer you likely have to submit work to that machine via some kind of job queueing system. This is often in the form of a bash script which contains metadata about how much resource you need on the machine and the commands you want to run.&lt;/p&gt;

&lt;p&gt;Dask Jobqueue has cluster manager objects for &lt;a href=&quot;https://en.wikipedia.org/wiki/Portable_Batch_System&quot;&gt;PBS&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Slurm_Workload_Manager&quot;&gt;Slurm&lt;/a&gt;, and &lt;a href=&quot;https://en.wikipedia.org/wiki/Oracle_Grid_Engine&quot;&gt;SGE&lt;/a&gt;. When creating these cluster managers they will construct scripts for the batch scheduler based on your arguments and submit them using your default credentials.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_jobqueue&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PBSCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PBSCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster_specific_kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As batch systems like these often have a long wait time you may not immediately get access to your cluster object and scaling can be slow. Depending on the queueing policies it may be best to think of this as a fixed sized cluster. However if you have a responsive interactive queue then you can use this like any other autoscaling cluster manager.&lt;/p&gt;

&lt;p&gt;Again it is expected that your Python session is able to connect to the IP address of the scheduler. This may vary depending on your HPC centre setup as to how you can ensure this.&lt;/p&gt;

&lt;h3 id=&quot;dask-yarn&quot;&gt;Dask Yarn&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://yarn.dask.org/en/latest/&quot;&gt;Dask Yarn&lt;/a&gt; is a cluster manager for traditional &lt;a href=&quot;https://hadoop.apache.org/&quot;&gt;Hadoop&lt;/a&gt; systems.&lt;/p&gt;

&lt;p&gt;Hadoop is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models. It is a common piece of infrastrcture in Java/Scala ecosystems for processing large volumes of data. However you can also use the scheduling functionality called YARN to schedule Dask workers and leverage the underlying hardware resources.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_yarn&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;YarnCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;YarnCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster_specific_kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dask Yarn is only intended to be used from a Hadoop edge node which will have access to the internal network of the Hadoop cluster.&lt;/p&gt;

&lt;h3 id=&quot;dask-cloudprovider&quot;&gt;Dask Cloudprovider&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://cloudprovider.dask.org/en/latest/&quot;&gt;Dask Cloudprovider&lt;/a&gt; is a collection of cluster managers for leveraging cloud native APIs.&lt;/p&gt;

&lt;p&gt;Cloud providers such as &lt;a href=&quot;https://aws.amazon.com/&quot;&gt;Amazon&lt;/a&gt;, &lt;a href=&quot;https://azure.microsoft.com/&quot;&gt;Microsoft&lt;/a&gt; and &lt;a href=&quot;https://cloud.google.com/&quot;&gt;Google&lt;/a&gt; have many APIs available for building and running various types of infrastructure. These range from traditional virtual servers running linux or Windows to higher level APIs that can execute small snippets of code on demand. They have batch systems, Hadoop systems, machine learning systems and more.&lt;/p&gt;

&lt;p&gt;The ideal scenario for running Dask on a cloud provider would be a service which would allow you to run the scheduler and worker with specified Python environments and then connect to them securely from the outside. Such a service doesn’t quite exist, but similar things do to varying degrees.&lt;/p&gt;

&lt;p&gt;One example is &lt;a href=&quot;https://aws.amazon.com/fargate/&quot;&gt;AWS Fargate&lt;/a&gt; which is a managed container platform. You can run &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker containers&lt;/a&gt; on demand which each have a unique IP address which can be public or private. This means we can run Dask scheduler and worker processes within a &lt;a href=&quot;https://github.com/dask/dask-docker&quot;&gt;Dask container&lt;/a&gt; and connect to them from our Python session. This service is &lt;a href=&quot;https://aws.amazon.com/fargate/pricing/&quot;&gt;billed per second&lt;/a&gt; for the requested resources, so makes most sense as an ephemeral service which has no cost when you aren’t using it.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cloudprovider&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FargateCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FargateCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster_specific_kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This cluster manager uses your &lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html#cli-quick-configuration&quot;&gt;AWS credentials&lt;/a&gt; to authenticate and request AWS resources on Fargate, and then connects your local session to the Dask cluster running on the cloud.&lt;/p&gt;

&lt;p&gt;There are even higher level services such as &lt;a href=&quot;https://aws.amazon.com/lambda/&quot;&gt;AWS Lambda&lt;/a&gt; or &lt;a href=&quot;https://cloud.google.com/functions&quot;&gt;Google Cloud Functions&lt;/a&gt; which allow you to execute code on demand and you are billed for the execution time of the code. These are referred to as “serverless” services as the servers are totally abstracted away. This would be perfect for out Dask cluster as you could submit the scheduler and workers as the code to run. &lt;strong&gt;However&lt;/strong&gt; when running these cloud functions it is not possible to get a network connection between them as they do not have routable IP addresses, so there is no way to set up a Dask cluster made of these executing functions. Maybe one day!&lt;/p&gt;

&lt;h3 id=&quot;dask-gateway&quot;&gt;Dask Gateway&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://gateway.dask.org/&quot;&gt;Dask Gateway&lt;/a&gt; is a central service for managing Dask clusters. It provides a secure API which multiple users can communicate with to request Dask servers. It can spawn Dask clusters on Kubernetes, Yarn or batch systems.&lt;/p&gt;

&lt;p&gt;This tool is targeted at IT administrators who want to enable their users to create Dask clusters, but want to maintain some centralized control instead of each user creating their own thing. This can also be useful for tracking Dask usage and setting per user limits.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_gateway&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GatewayCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GatewayCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster_specific_kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For each user the commands for creating and using a gateway cluster are the same. It is down to the administrator to setup and manage the gateway server and configure &lt;a href=&quot;https://gateway.dask.org/authentication.html#&quot;&gt;authentication via kerberos or Jupyter Hub&lt;/a&gt;. They should also provide &lt;a href=&quot;https://gateway.dask.org/configuration-user.html&quot;&gt;configuration&lt;/a&gt; to their users so that Dask Gateway knows how to connect to the gateway server. In a large organisation or institution the IT department also likely provisions the machines that staff are using, and so should be able to drop configuration files onto users computers.&lt;/p&gt;

&lt;h3 id=&quot;local-cuda-cluster&quot;&gt;Local CUDA Cluster&lt;/h3&gt;

&lt;p&gt;The last cluster manager I’m going to cover is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCUDACluster&lt;/code&gt; from the &lt;a href=&quot;https://github.com/rapidsai/dask-cuda&quot;&gt;Dask CUDA&lt;/a&gt; package.&lt;/p&gt;

&lt;p&gt;This is slightly different than the other cluster managers in that it is constructing a Dask cluster which is specifically optimised for a single piece of hardware. In this case it is targeting machines with GPUs ranging from your laptop with an onboard NVIDIA GPU to an &lt;a href=&quot;https://www.nvidia.com/en-gb/data-center/dgx-2/&quot;&gt;NVIDIA DGX-2&lt;/a&gt; with multiple GPUs running in your datacentre.&lt;/p&gt;

&lt;p&gt;The cluster manager closely follows the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCluster&lt;/code&gt; in that is creates resources locally on the current machine, but instead of creating one worker per CPU core it creates one per GPU. It also changes some of the configuration defaults to ensure good performance of GPU workloads.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cuda&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCUDACluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCUDACluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster_specific_kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This package also has an alternative Dask worker bash command called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-cuda-worker&lt;/code&gt; which also modified the defaults of the Dask worker to ensure it is optimised for GPU work.&lt;/p&gt;

&lt;h2 id=&quot;future&quot;&gt;Future&lt;/h2&gt;

&lt;p&gt;Now that we have laid out the current state of the Dask distributed cluster ecosystem let’s discuss where we could go next.&lt;/p&gt;

&lt;p&gt;As shown at the beginning a Dask cluster is a combination of scheduler, workers and client which enable distributed execution of Python functions. Setting up your own cluster on your own machines is straight forward, but there is such a variety of ways to provision infrastructure that we now have a number of ways of automating this.&lt;/p&gt;

&lt;p&gt;This variation opens up a number of questions about how we can improve things.&lt;/p&gt;

&lt;h3 id=&quot;do-we-need-more-fixed-cluster-options&quot;&gt;Do we need more fixed cluster options?&lt;/h3&gt;

&lt;p&gt;While covering the various cluster managers we only covered one fixed cluster implementation, the Helm chart. Is there a requirement for more fixed clusters? Examples may be &lt;a href=&quot;https://aws.amazon.com/cloudformation/&quot;&gt;CloudFormation&lt;/a&gt; or &lt;a href=&quot;https://www.terraform.io/&quot;&gt;Terraform&lt;/a&gt; templates which follow the same structure as the Helm chart, providing a Jupyter service, Dask scheduler and fixed number of workers.&lt;/p&gt;

&lt;h3 id=&quot;can-we-bridge-some-gaps&quot;&gt;Can we bridge some gaps?&lt;/h3&gt;

&lt;p&gt;Could the Dask Kubernetes cluster manager connect to an existing cluster that was built using the Helm chart to then perform adaptive scaling? I’ve been asked this a lot but it is currently unclear how to get to this position. The cluster manager and Helm chart use different Kubernetes resources to achieve the same goal, so some unification would be needed before this is possible.&lt;/p&gt;

&lt;h3 id=&quot;are-ephemeral-clusters-too-ephemeral&quot;&gt;Are ephemeral clusters too ephemeral?&lt;/h3&gt;

&lt;p&gt;Many of the cluster managers only exist for the duration of the Python session. However some like the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YarnCluster&lt;/code&gt; allow you to disconnect and reconnect from the cluster. This allows you to treat a YARN cluster more like a fixed cluster.&lt;/p&gt;

&lt;p&gt;In other circumstances the Python session may have a timeout or limit and may be killed before the Dask cluster can complete its work. Would there be benefit to letting the Dask cluster continue to exist? With the Python session cleared up the client and futures will also be garbage collected. So perhaps not.&lt;/p&gt;

&lt;h3 id=&quot;can-we-manage-conda-environments-better&quot;&gt;Can we manage conda environments better?&lt;/h3&gt;

&lt;p&gt;Currently it is the responsibility of the person creating the cluster to ensure that the worker’s conda environment matches the one where the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Client&lt;/code&gt; is going to be created. On fixed clusters this can be easier as the Python/Jupyter environment can be provided within the same set of systems. However on ephemeral clusters where you may be reaching into a cloud or batch system they may not match your laptop’s environment for example.&lt;/p&gt;

&lt;p&gt;Perhaps there could be integration between workers and conda to create dynamic environments on the fly. Exploring the performance impact of this would be interesting.&lt;/p&gt;

&lt;p&gt;Another option could be enabling users to start a remote Jupyter kernel on a worker. They wouldn’t have access to the same filesystem, but they would share a conda environment.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Faster Scheduling</title>
   <link href="https://blog.dask.org/2020/07/21/faster-scheduling"/>
   <updated>2020-07-21T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/07/21/faster-scheduling</id>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;This post discusses Dask overhead costs for task scheduling,
and then lays out a rough plan for acceleration.&lt;/p&gt;

&lt;p&gt;This post is written for other maintainers, and often refers to internal
details. It is not intended for broad readability.&lt;/p&gt;

&lt;h2 id=&quot;how-does-this-problem-present&quot;&gt;How does this problem present?&lt;/h2&gt;

&lt;p&gt;When we submit large graphs there is a bit of a delay between us calling
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.compute()&lt;/code&gt; and work actually starting on the workers. In some cases, that
delay can affect usability and performance.&lt;/p&gt;

&lt;p&gt;Additionally, in far fewer cases, the gaps in between tasks can be an issue,
especially if those tasks are very short and for some reason can not be made
longer.&lt;/p&gt;

&lt;h2 id=&quot;who-cares&quot;&gt;Who cares?&lt;/h2&gt;

&lt;p&gt;First, this is a problem that affects about 1-5% of Dask users. These are people
who want to process millions of tasks relatively quickly. Let’s list a few use
cases:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Xarray/Pangeo workloads at the 10-100TB scale&lt;/li&gt;
  &lt;li&gt;NVIDIA RAPIDS workloads on large tabular data (GPUs make computing fast, so other costs become
relatively larger)&lt;/li&gt;
  &lt;li&gt;Some mystery use cases inside of some hedge funds&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It does not affect the everyday user, who processes 100GB to a few TB of data,
and doesn’t mind waiting 10s for things to start running.&lt;/p&gt;

&lt;h2 id=&quot;coarse-breakdown-of-costs&quot;&gt;Coarse breakdown of costs&lt;/h2&gt;

&lt;p&gt;When you call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x.sum().compute()&lt;/code&gt; a few things happen:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Graph generation:&lt;/strong&gt; Some Python code in a Dask collection library, like
dask array, calls the sum function, which generates a task graph on the
client side.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Graph Optimization:&lt;/strong&gt; We then optimize that graph, also on the client
side, in order to remove unnecessary work, fuse tasks, apply important high
level optimizations, and more.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Graph Serializtion:&lt;/strong&gt; We now pack up that graph in a form that can be
sent over to the scheduler.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Graph Communication:&lt;/strong&gt; We fire those bytes across a wire over to the
scheduler&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scheduler.update_graph:&lt;/strong&gt; The scheduler receives these bytes, unpacks
them, and then updates its own internal data structures&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scheduling:&lt;/strong&gt; The scheduler then assigns ready tasks to workers&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Communicate to workers:&lt;/strong&gt; The scheduler sends out lots of smaller
messages to each of the workers with the tasks that they can perform&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Workers work:&lt;/strong&gt; The workers then perform this work, and start
communicating back and forth with the scheduler to receive new instructions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Generally most people today are concerned with steps 1-6. Once things get out
to the workers and progress bars start moving people tend to care a bit less
(but not zero).&lt;/p&gt;

&lt;h2 id=&quot;what-do-other-people-do&quot;&gt;What do other people do?&lt;/h2&gt;

&lt;p&gt;Let’s look at a few things that other projects do, and see if there are things
that we can learn. These are commonly suggested, but there are challenges with
most of them.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Rewrite the scheduler it in C++/Rust/C/Cython&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Proposal: Python is slow. Want to make it faster? Don’t use Python. See
academic projects.&lt;/p&gt;

    &lt;p&gt;Challenge: This makes sense for some parts of the pipeline above, but not
for others. It also makes it harder to attract maintainers.&lt;/p&gt;

    &lt;p&gt;What we should consider: Some parts of the scheduler and optimization
algorithms could be written in a lower level language, maybe Cython. We’ll
need to be careful about maintainability.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Distributed scheduling&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Proposal: The scheduler is slow, maybe have many schedulers? See Ray.&lt;/p&gt;

    &lt;p&gt;Challenge: It’s actually really hard to make the kinds of decisions that
Dask has to make if scheduling state is spread on many computers.
Distributed scheduling works better when the workload is very either
uniform or highly decoupled.
Distributed scheduling is really attractive to people who like solving
interesting/hard problems.&lt;/p&gt;

    &lt;p&gt;What we should consider: We can move some simple logic down to the workers.
We’ve already done this with the easy stuff though.
It’s not clear how much additional benefit there is here.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Build specialty scheduling around collections&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Proposal: If Dask were to become just a dataframe library or just an array
computing library then it could special-case things more effectively. See
Spark, Mars, and others.&lt;/p&gt;

    &lt;p&gt;Challenge: Yes, but Dask is not a dataframe library or an array library.
The three use cases we mention above are all very different.&lt;/p&gt;

    &lt;p&gt;What we should consider: modules like dask array and dask dataframe should
develop high level query blocks, and we should endeavor to
communicate these subgraphs over the wire directly so that they are more
compact.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;what-should-we-actually-do&quot;&gt;What should we actually do?&lt;/h2&gt;

&lt;p&gt;Because our pipeline has many stages, each of which can be slow for different
reasons, we’ll have to do many things. Additionally, this is a hard problem
because changing one piece of the project at this level has repurcussions for
many other pieces. The rest of this post tries to lay out a consistent set of
changes. Let’s start with a summary:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;For Dask array/dataframe let’s use high level graphs more aggressively so
that we can communicate only abstract representations between the client
and scheduler.&lt;/li&gt;
  &lt;li&gt;But this breaks low level graph optimizations, fuse, cull, and slice fusion
in particular. We can make these unnecessary with two changes:
    &lt;ul&gt;
      &lt;li&gt;We can make high level graphs considerably smarter to handle cull and slice fusion&lt;/li&gt;
      &lt;li&gt;We can move a bit more of the scheduling down to the workers to
replicate the advantages of low-level fusion there&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Then, once all of the graph manipulation happens on the scheduler, let’s
try to accelerate it, hopefully in a language that the current dev
community can understand, like Cython&lt;/li&gt;
  &lt;li&gt;At the same time in parallel, let’s take a look at our network stack&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’ll go into these in more depth below&lt;/p&gt;

&lt;h2 id=&quot;graph-generation&quot;&gt;Graph Generation&lt;/h2&gt;

&lt;h3 id=&quot;high-level-graph-history&quot;&gt;High Level Graph History&lt;/h3&gt;

&lt;p&gt;A year or two ago we moved graph generation costs from user-code-typing time to
graph-optimization-time with high level graphs&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;                 &lt;span class=&quot;c1&quot;&gt;# graph generation used to happen here
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;optimize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# now it happens here
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This really improved usability, and also let us do some high level
optimizations which sometimes allowed us to skip some lower-level optimization
costs.&lt;/p&gt;

&lt;h3 id=&quot;can-we-push-this-further&quot;&gt;Can we push this further?&lt;/h3&gt;

&lt;p&gt;The first four stages of our pipeline happen on the client:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Graph generation:&lt;/strong&gt; Some Python code in a Dask collection library, like
dask array, calls the sum function, which generates a task graph on the
client side.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Graph Optimization:&lt;/strong&gt; We then optimize that graph, also on the client
side, in order to remove unnecessary work, fuse tasks, apply important high
level optimizations, and more.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Graph Serializtion:&lt;/strong&gt; We now pack up that graph in a form that can be
sent over to the scheduler.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Graph Communication:&lt;/strong&gt; We fire those bytes across a wire over to the
scheduler&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If we’re able to stay with the high level graph representation through these
stages all the way until graph communication, then we can communicate a far
more compact representation up to the scheduler. We can drop a lot of these
costs, at least for the high level collection APIs (delayed and client.submit
would still be slow, client.map might be ok though).&lt;/p&gt;

&lt;p&gt;This has a couple of other nice benefits:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;User’s code won’t block, and we can alert the user immediately that we’re
on the job&lt;/li&gt;
  &lt;li&gt;We’ve centralized costs in just the scheduler,
so there is now only one place where we might have to think about low-level code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(some conversation here: https://github.com/dask/distributed/issues/3872)&lt;/p&gt;

&lt;h3 id=&quot;however-low-level-graph-optimizations-are-going-to-be-a-problem&quot;&gt;However, low-level graph optimizations are going to be a problem&lt;/h3&gt;

&lt;p&gt;In principle changing the distributed scheduler to accept a variety of graph
layer types is a tedious but straightforward problem. I’m not concerned.&lt;/p&gt;

&lt;p&gt;The bigger concern is what to do with low-level graph optimizations.
Today we have three of these that really matter:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Task fusion: this is what keeps your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_parquet&lt;/code&gt; task merged with your
subsequent blockwise tasks&lt;/li&gt;
  &lt;li&gt;Culling: this is what makes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df.head()&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x[0]&lt;/code&gt; fast&lt;/li&gt;
  &lt;li&gt;Slice fusion: this is why &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x[:100][5]&lt;/code&gt; works well&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In order for us to transmit abstract graph layers up to the scheduler, we need
to remove the need for these low level graph optimizations. I think that we
can do this with a combination of two approaches:&lt;/p&gt;

&lt;h4 id=&quot;more-clever-high-level-graph-manipulation&quot;&gt;More clever high level graph manipulation&lt;/h4&gt;

&lt;p&gt;We already do this a bit with blockwise, which has its own fusion, and which
removes much of the need for fusion generally. But other blockwise-like
operations, like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_*&lt;/code&gt; will probably have to join the Blockwise family.&lt;/p&gt;

&lt;p&gt;Getting culling to work properly may require us to teach each of the individual
graph layers how to track dependencies in each layer type and cull themselves.
This may get tricky.&lt;/p&gt;

&lt;p&gt;Slicing is doable, we just need someone to go in, grok all of the current
slicing optimizations, and make high level graph layers for these
computations. This would be a great project for a sharp masters student&lt;/p&gt;

&lt;h4 id=&quot;send-speculative-tasks-to-the-workers&quot;&gt;Send speculative tasks to the workers&lt;/h4&gt;

&lt;p&gt;High level Blockwise fusion handles many of the use cases for low-level fusion,
but not all. For example I/O layers like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dd.read_parquet&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;da.from_zarr&lt;/code&gt;
aren’t fused at a high level.&lt;/p&gt;

&lt;p&gt;We can resolve this either by making them blockwise layers (this requires
expanding the blockwise abstraction, which may be hard) or alternatively we can
start sending not-yet-ready tasks to workers before all of their dependencies
are finished if we’re highly confident that we know where they’re going to go.
This would give us some of the same results of fusion, but would keep all of
the task types separate (which would be nice for diagnostics) and might still
give us some of the same performance benefits that we get from fusion.&lt;/p&gt;

&lt;h3 id=&quot;unpack-abstract-graph-layers-on-the-scheduler&quot;&gt;Unpack abstract graph layers on the scheduler&lt;/h3&gt;

&lt;p&gt;So after we’ve removed the need for low level optimizations, and we just send
the abstract graph layers up to the scheduler directly, we’ll need to teach the
scheduler how to unpack those graph layers.&lt;/p&gt;

&lt;p&gt;This is a little tricky because the Scheduler can’t run user Python code (for
security reasons). We’ll have to register layer types (like blockwise,
rechunk, dataframe shuffle) that the scheduler knows about and trusts ahead of
time. We’ll still always support custom layers, and these will be at the same
speed that they’ve always been, but hopefully there will be far less need for
these if we go all-in on high level layers.&lt;/p&gt;

&lt;h2 id=&quot;rewrite-scheduler-in-low-level-language&quot;&gt;Rewrite scheduler in low-level language&lt;/h2&gt;

&lt;p&gt;Once most of the finicky bits are moved to the scheduler, we’ll have one place
where we can focus on low level graph state manipulation.&lt;/p&gt;

&lt;p&gt;Dask’s distributed scheduler is two things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;A Tornado TCP application that receives signals from clients and workers
and send signals out to clients and workers&lt;/p&gt;

    &lt;p&gt;This is async-heavy networking code&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A complex state machine internally that responds to those state changes&lt;/p&gt;

    &lt;p&gt;This is a complex data structure heavy Python code&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;networking&quot;&gt;Networking&lt;/h3&gt;

&lt;p&gt;Jim has an interesting project here that shows promise: https://github.com/jcrist/ery
Reducing latency between workers and the scheduler would be good, and would
help to accelerate stages 7-8 in the pipeline listed at the top of this post.&lt;/p&gt;

&lt;h3 id=&quot;state-machine&quot;&gt;State machine&lt;/h3&gt;

&lt;p&gt;Rewriting the state machine in some lower level language would be fine.
Ideally this would be in a language that was easy for the current maintainer
community to maintain, (Cython?) but we may also consider making a more firm
interface here that would allow other groups to experiment safely.&lt;/p&gt;

&lt;p&gt;There are some advantages to this (more experimentation by different groups)
but also some costs (splitting of core efforts and mismatches for users).
Also, I suspect that splitting out also probably means that we’ll probably lose the dashboard,
unless those other groups are very careful to expose the same state to Bokeh.&lt;/p&gt;

&lt;p&gt;There is more exploration to do here. Regardless I think that it probably makes
sense to try to isolate the state machine from the networking system.
Maybe this also makes it easier for people to profile in isolation.&lt;/p&gt;

&lt;p&gt;In speaking with a few different groups most people have expressed reservation
about having multiple different state machine codes. This was done in
MapReduce and Spark and resulted in difficult to maintain community dynamics.&lt;/p&gt;

&lt;h2 id=&quot;high-level-graph-optimizations&quot;&gt;High Level Graph Optimizations&lt;/h2&gt;

&lt;p&gt;Once we have everything in smarter high level graph layers,
we will also be more ripe for optimization.&lt;/p&gt;

&lt;p&gt;We’ll need a better way to write down these optimizations with a separated
traversal system and a set of rules. A few of us have
written these things before, maybe it’s time we revisit them.&lt;/p&gt;

&lt;h2 id=&quot;what-we-need&quot;&gt;What we need&lt;/h2&gt;

&lt;p&gt;This would require some effort, but I think that it would hit several high
profile problems at once. There are a few tricky things to get right:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A framework for high level graph layers&lt;/li&gt;
  &lt;li&gt;An optimization system for high level graph layers&lt;/li&gt;
  &lt;li&gt;Separation of the scheduler into two parts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For this I think that we’ll need people who are fairly familiar with Dask to do this right.&lt;/p&gt;

&lt;p&gt;And there there is a fair amount of follow-on work&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Build a hierarchy of layers for dask dataframe&lt;/li&gt;
  &lt;li&gt;Build a hierarchy of layers for dask array&lt;/li&gt;
  &lt;li&gt;Build optimizations for those to remove the need for low level graph
optimizations&lt;/li&gt;
  &lt;li&gt;Rewrite core parts of the scheduler in Cython&lt;/li&gt;
  &lt;li&gt;Experiment with the networking layer, maybe with a new Comm&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’ve been thinking about the right way to enact this change.
Historically most Dask changes over the past few years have been incremental or
peripheral, due to how burdened the maintainers are. There might be enough
pressure on this problem though that we can get some dedicated engineering
effort from a few organizations though, which might change how possible this is.
We’ve gotten 25% time from a few groups. I’m curious if we can gate 100% time
for some people for a few months.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Last Year in Review</title>
   <link href="https://blog.dask.org/2020/07/17/scipy-2020-maintainers-track"/>
   <updated>2020-07-17T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/07/17/scipy-2020-maintainers-track</id>
   
   <category>SciPy</category>
   
   <category>Community</category>
   
   <category>Talk</category>
   
   <content type="html">
&lt;p&gt;We recently enjoyed the 2020 SciPy conference from the comfort of our own homes this year. The 19th annual Scientific Computing with Python conference was a virtual conference this year due to the global pandemic. The annual SciPy Conference brought together over 1500 participants from industry, academia, and government to showcase their latest projects, learn from skilled users and developers, and collaborate on code development.&lt;/p&gt;

&lt;p&gt;As part of the maintainers track we presented an update on Dask.&lt;/p&gt;

&lt;h2 id=&quot;video&quot;&gt;Video&lt;/h2&gt;

&lt;p&gt;You can find the video on the SciPy YouTube channel. The Dask update runs from 0:00-19:30.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/XC0M76CmzHg&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;slides&quot;&gt;Slides&lt;/h2&gt;

&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;ae0f04df5b7341eaa3e2989221be1889&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;talk-summary&quot;&gt;Talk Summary&lt;/h2&gt;

&lt;p&gt;Here’s a summary of the main topics covered in the talk. You can also check out the &lt;a href=&quot;https://threadreaderapp.com/thread/1280885850914553856.html&quot;&gt;original thread on Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;community-overview&quot;&gt;Community overview&lt;/h3&gt;

&lt;p&gt;We’ve been trying to gauge the size of our community lately. The best proxy we have right now is the number of weekly visitors to the &lt;a href=&quot;https://docs.dask.org/en/latest/&quot;&gt;Dask documentation&lt;/a&gt;. Which currently stands at around 10,000.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Dask documentation analytics showing growth to 10,000 weekly users over the last four years&quot; src=&quot;https://pbs.twimg.com/media/EcaS9DpWkAEBaB4.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Dask also came up in the &lt;a href=&quot;https://www.jetbrains.com/lp/devecosystem-2020/python/&quot;&gt;Jetbrains Python developer survey&lt;/a&gt;. We were excited to see 5% of all the Python developers who filled out the survey said they use Dask. Which shows health in the PyData community as well as Dask.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Jetbrains survey results showing Dask used by 5% of Python users, beaten only by the Spark/hadoop ecosystem&quot; src=&quot;https://pbs.twimg.com/media/EcaTTuiX0AIT2KB.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We are running &lt;a href=&quot;https://dask.org/survey&quot;&gt;our own survey&lt;/a&gt; at the moment. If you are a Dask user please take a few minutes to fill it out. We would really appreciate it.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Link to the Dask survey&quot; src=&quot;https://pbs.twimg.com/media/EcaTlITXYAAVs-y.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;community-events&quot;&gt;Community events&lt;/h3&gt;

&lt;p&gt;In February we had an in-person &lt;a href=&quot;https://blog.dask.org/2020/04/28/dask-summit&quot;&gt;Dask Summit&lt;/a&gt; where a mixture of OSS maintainers and institutional users met. We had talks and workshops to help figure out our challenges and set our direction.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;A room of attendees at the Dask summit&quot; src=&quot;https://pbs.twimg.com/media/EcaUbHLXQAAHckq.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The Dask community also has a &lt;a href=&quot;https://docs.dask.org/en/latest/support.html&quot;&gt;monthly meeting&lt;/a&gt;! It is held on the first Thursday of the month at 10:00 US Central Time. If you’re a Dask user you are welcome to come to hear updates from maintainers and share what you’re working on.&lt;/p&gt;

&lt;h3 id=&quot;community-projects&quot;&gt;Community projects&lt;/h3&gt;

&lt;p&gt;There are many projects built on Dask. Looking at the preliminary results from the 2020 Dask survey shows some that are especially popular.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Graph showing the most popular projects built on Dask; Xarray, RAPIDS, XGBoost, Prefect and Iris&quot; src=&quot;https://pbs.twimg.com/media/EcaVSHpX0AAMDYs.png&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Let’s take a look at each of those.&lt;/p&gt;

&lt;h4 id=&quot;xarray&quot;&gt;Xarray&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://xarray.pydata.org/en/stable/&quot;&gt;Xarray&lt;/a&gt; allows you to work on multi-dimensional datasets that have supporting metadata arrays in a Pandas-like way.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing xarray code example&quot; src=&quot;https://pbs.twimg.com/media/EcaVbOaXkAMQ4SU.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;rapids&quot;&gt;RAPIDS&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://rapids.ai/&quot;&gt;RAPIDS&lt;/a&gt; is an open-source suite of GPU accelerated Python libraries. Using these tools you can execute end-to-end data science and analytics pipelines entirely on GPUs. All using familiar PyData APIs.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing RAPIDS dataframe code example&quot; src=&quot;https://pbs.twimg.com/media/EcaWFfDXkAEX4B_.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;blazingsql&quot;&gt;BlazingSQL&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://blazingsql.com&quot;&gt;BlazingSQL&lt;/a&gt; builds on RAPIDS and Dask to provide an open-source distributed, GPU accelerated SQL engine.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing BlazingSQL code example&quot; src=&quot;https://pbs.twimg.com/media/EcaWW_CXsAM7XP7.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;xgboost&quot;&gt;XGBoost&lt;/h4&gt;

&lt;p&gt;While &lt;a href=&quot;https://examples.dask.org/machine-learning/xgboost.html&quot;&gt;XGBoost&lt;/a&gt; has been around for a long time you can now prepare your data on your Dask cluster and then bootstrap your XGBoost cluster on top of Dask and hand the distributed dataframes straight over.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing XGBoost code example&quot; src=&quot;https://pbs.twimg.com/media/EcaXKlRWsAAjLYe.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;prefect&quot;&gt;Prefect&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://www.prefect.io/&quot;&gt;Prefect&lt;/a&gt; is a workflow manager which is built on top of Dask’s scheduling engine. “Users organize Tasks into Flows, and Prefect takes care of the rest.”&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing Prefect code example&quot; src=&quot;https://pbs.twimg.com/media/EcaXlf-XYAEPY-Z.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;iris&quot;&gt;Iris&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://scitools.org.uk/iris/docs/latest/&quot;&gt;Iris&lt;/a&gt;, part of the &lt;a href=&quot;https://scitools.org.uk&quot;&gt;SciTools&lt;/a&gt; suite of tools, uses the CF data model giving you a format-agnostic interface for working with your data. It excels when working with multi-dimensional Earth Science data, where tabular representations become unwieldy and inefficient.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing Iris code example&quot; src=&quot;https://pbs.twimg.com/media/EcaX3S9XsAAU-Sm.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;more-tools&quot;&gt;More tools&lt;/h4&gt;

&lt;p&gt;These are the tools our community have told us they like so far. But if you use something which didn’t make the list then head to &lt;a href=&quot;https://dask.org/survey&quot;&gt;our survey&lt;/a&gt; and let us know! According to PyPI there are many more out there.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Screenshot of PyPI showing 239 packages with Dask in their name&quot; src=&quot;https://pbs.twimg.com/media/EcaYZmPWoAANYhr.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;user-groups&quot;&gt;User groups&lt;/h3&gt;

&lt;p&gt;There are many user groups who use Dask. Everything from life sciences, geophysical sciences and beamline facilities to finance, retail and logistics. Check out the great &lt;a href=&quot;https://youtu.be/t_GRK4L-bnw&quot;&gt;“Who uses Dask?” talk&lt;/a&gt; from &lt;a href=&quot;https://twitter.com/mrocklin&quot;&gt;Matthew Rocklin&lt;/a&gt; for more info.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Screenshot &apos;Who uses Dask?&apos; YouTube video&quot; src=&quot;https://pbs.twimg.com/media/EcaYj2JXQAEvgV3.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;for-profit-companies&quot;&gt;For profit companies&lt;/h3&gt;

&lt;p&gt;There has been an increase in for-profit companies building tools with Dask. Including &lt;a href=&quot;https://coiled.io/&quot;&gt;Coiled Computing&lt;/a&gt;, &lt;a href=&quot;https://www.prefect.io/&quot;&gt;Prefect&lt;/a&gt; and &lt;a href=&quot;https://www.saturncloud.io/s/&quot;&gt;Saturn Cloud&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide describing the for-profit companies Coiled, Prefect and Saturn Cloud&quot; src=&quot;https://pbs.twimg.com/media/EcaZOqgX0AABFpQ.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We’ve also seen large companies like Microsoft’s &lt;a href=&quot;https://azure.microsoft.com/en-gb/services/machine-learning/&quot;&gt;Azure ML&lt;/a&gt; team contributing a cluster manager to &lt;a href=&quot;https://cloudprovider.dask.org/en/latest/#azure&quot;&gt;Dask Cloudprovider&lt;/a&gt;. This helps folks get up and running with Dask on AzureML quicker and easier.&lt;/p&gt;

&lt;h3 id=&quot;recent-improvements&quot;&gt;Recent improvements&lt;/h3&gt;

&lt;h4 id=&quot;communications&quot;&gt;Communications&lt;/h4&gt;

&lt;p&gt;Moving on to recent improvements there has been a lot of work to get &lt;a href=&quot;https://www.openucx.org/&quot;&gt;Open UCX&lt;/a&gt; supported as a protocol in Dask. Which allows worker-worker communication to be accelerated vastly with hardware that supports &lt;a href=&quot;https://en.wikipedia.org/wiki/InfiniBand&quot;&gt;Infiniband&lt;/a&gt; or &lt;a href=&quot;https://en.wikipedia.org/wiki/NVLink&quot;&gt;NVLink&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing worker communication comparison between UCX/Infiniband and TCP with UCX being much faster&quot; src=&quot;https://pbs.twimg.com/media/EcaaTxiXQAE4TD0.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There have also been some &lt;a href=&quot;https://blogs.nvidia.com/blog/2020/06/22/big-data-analytics-tpcx-bb/&quot;&gt;recent announcements&lt;/a&gt; around NVIDIA blowing away the TPCx-BB benchmark by outperforming the current leader by 20x. This is a huge success for all the open-source projects that were involved, including Dask.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing TPCx-BB benchmark results&quot; src=&quot;https://pbs.twimg.com/media/EcabNUVWoAQGy8e.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;dask-gateway&quot;&gt;Dask Gateway&lt;/h4&gt;

&lt;p&gt;We’ve seen increased adoption of &lt;a href=&quot;https://gateway.dask.org&quot;&gt;Dask Gateway&lt;/a&gt;. Many institutions are using it as a way to provide their staff with on-demand Dask clusters.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing Dask Gateway overview&quot; src=&quot;https://pbs.twimg.com/media/EcabpirWkAYtx-W.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;cluster-map-plot-aka-pew-pew-pew&quot;&gt;Cluster map plot (aka ‘pew pew pew’)&lt;/h4&gt;

&lt;p&gt;The update that got the most 👏 feedback from the SciPy 2020 attendees was the Cluster Map Plot (known to maintainers as the “pew pew pew” plot). This plot shows a high-level overview of your Dask cluster scheduler and workers and the communication between them.&lt;/p&gt;

&lt;video autoplay=&quot;&quot; loop=&quot;&quot; controls=&quot;&quot; poster=&quot;https://pbs.twimg.com/tweet_video_thumb/EcacHRcXkAE53eI.jpg&quot;&gt;&lt;source src=&quot;https://video.twimg.com/tweet_video/EcacHRcXkAE53eI.mp4&quot; type=&quot;video/mp4&quot; /&gt;&lt;img alt=&quot;&quot; src=&quot;https://pbs.twimg.com/tweet_video_thumb/EcacHRcXkAE53eI.jpg&quot; /&gt;&lt;/video&gt;

&lt;h3 id=&quot;next-steps&quot;&gt;Next steps&lt;/h3&gt;

&lt;h4 id=&quot;high-level-graph-optimization&quot;&gt;High-level graph optimization&lt;/h4&gt;

&lt;p&gt;To wrap up with what Dask is going to be doing next we are going to be continuing to work on high-level graph optimization.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Slide showing High Level Graph documentation page&quot; src=&quot;https://pbs.twimg.com/media/EcacZvfWsAIfqTz.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;scheduler-performance&quot;&gt;Scheduler performance&lt;/h4&gt;

&lt;p&gt;With feedback from our community we are also going to be focussing on making the &lt;a href=&quot;https://github.com/dask/distributed/issues/3783&quot;&gt;Dask scheduler more performant&lt;/a&gt;. There are a few things happening including a Rust implementation of the scheduler, dynamic task creation and ongoing benchmarking.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Scheduler performance tasks including a Rust implementation, benchmarking, dynamic tasks and Cython, PyPy and C experiments&quot; src=&quot;https://pbs.twimg.com/media/Ecacr6pWoAEd4Tx.jpg&quot; style=&quot;width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;chan-zuckerberg-foundation-maintainer-post&quot;&gt;Chan Zuckerberg Foundation maintainer post&lt;/h3&gt;

&lt;p&gt;Lastly I’m excited to share that with funding from the &lt;a href=&quot;https://chanzuckerberg.com/eoss/proposals/scaling-python-with-dask/&quot;&gt;Chan Zuckerberg Foundation&lt;/a&gt;, Dask will be hiring a maintainer who will focus on growing usage in the biological sciences field. If that is of interest to you keep an eye on &lt;a href=&quot;https://twitter.com/dask_dev&quot;&gt;our twitter account&lt;/a&gt; for more announcements.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Large SVDs</title>
   <link href="https://blog.dask.org/2020/05/13/large-svds"/>
   <updated>2020-05-13T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/05/13/large-svds</id>
   
   <category>GPU</category>
   
   <category>array</category>
   
   <category>CuPy</category>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;We perform Singular Value Decomposition (SVD) calculations on large datasets.&lt;/p&gt;

&lt;p&gt;We modify the computation both by using fully precise and approximate methods,
and by using both CPUs and GPUs.&lt;/p&gt;

&lt;p&gt;In the end we compute an approximate SVD of 200GB of simulated data and using a mutli-GPU machine in 15-20 seconds.
Then we run this from a dataset stored in the cloud
where we find that I/O is, predictably, a major bottleneck.&lt;/p&gt;

&lt;h2 id=&quot;svd---the-simple-case&quot;&gt;SVD - The simple case&lt;/h2&gt;

&lt;p&gt;Dask arrays contain a relatively sophisticated SVD algorithm that works in the
tall-and-skinny or short-and-fat cases, but not so well in the roughly-square
case. It works by taking QR decompositions of each block of the array,
combining the R matrices, doing another smaller SVD on those, and then
performing some matrix multiplication to get back to the full result. It’s
numerically stable and decently fast, assuming that the intermediate R
matrices of the QR decompositions mostly fit in memory.&lt;/p&gt;

&lt;p&gt;The memory constraints here are that if you have an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n&lt;/code&gt; by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;m&lt;/code&gt; tall and
skinny array (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n &amp;gt;&amp;gt; m&lt;/code&gt;) cut into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;k&lt;/code&gt; blocks then you need to have about &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;m**2 * k&lt;/code&gt; space. This is true in many cases, including typical PCA machine learning
workloads, where you have tabular data with a few columns (hundreds at most)
and many rows.&lt;/p&gt;

&lt;p&gt;It’s easy to use and quite robust.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 1.60 GB &lt;/td&gt; &lt;td&gt; 100.00 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (10000000, 20) &lt;/td&gt; &lt;td&gt; (625000, 20) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 16 Tasks &lt;/td&gt;&lt;td&gt; 16 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; float64 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;75&quot; height=&quot;170&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;7&quot; x2=&quot;25&quot; y2=&quot;7&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;15&quot; x2=&quot;25&quot; y2=&quot;15&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;22&quot; x2=&quot;25&quot; y2=&quot;22&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;30&quot; x2=&quot;25&quot; y2=&quot;30&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;37&quot; x2=&quot;25&quot; y2=&quot;37&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;45&quot; x2=&quot;25&quot; y2=&quot;45&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;52&quot; x2=&quot;25&quot; y2=&quot;52&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;60&quot; x2=&quot;25&quot; y2=&quot;60&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;67&quot; x2=&quot;25&quot; y2=&quot;67&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;75&quot; x2=&quot;25&quot; y2=&quot;75&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;82&quot; x2=&quot;25&quot; y2=&quot;82&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;90&quot; x2=&quot;25&quot; y2=&quot;90&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;97&quot; x2=&quot;25&quot; y2=&quot;97&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;105&quot; x2=&quot;25&quot; y2=&quot;105&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;112&quot; x2=&quot;25&quot; y2=&quot;112&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;120&quot; x2=&quot;25&quot; y2=&quot;120&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;120&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;120&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;0.000000,0.000000 25.412617,0.000000 25.412617,120.000000 0.000000,120.000000&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;12.706308&quot; y=&quot;140.000000&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;20&lt;/text&gt;
&lt;text x=&quot;45.412617&quot; y=&quot;60.000000&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,45.412617,60.000000)&quot;&gt;10000000&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This works fine in the short and fat case too (when you have far more columns
than rows) but we’re always going to assume that one of your dimensions is
unchunked, and that the other dimension has chunks that are quite a bit
longer, otherwise, things might not fit into memory.&lt;/p&gt;

&lt;h2 id=&quot;approximate-svd&quot;&gt;Approximate SVD&lt;/h2&gt;

&lt;p&gt;If your dataset is large in both dimensions then the algorithm above won’t work
as is. However, if you don’t need exact results, or if you only need a few of
the components, then there are a number of excellent approximation algorithms.&lt;/p&gt;

&lt;p&gt;Dask array has one of these approximation algorithms implemented in the
&lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.linalg.svd_compressed&quot;&gt;da.linalg.svd_compressed&lt;/a&gt;
function. And with it we can compute the approximate SVD of very large
matrices.&lt;/p&gt;

&lt;p&gt;We were recently working on a problem (explained below) and found that we were
still running out of memory when dealing with this algorithm. There were two
challenges that we ran into:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The algorithm requires multiple passes over the data, but the Dask task
scheduler was keeping the input matrix in memory after it had been loaded once
in order to avoid recomputation.
Things still worked, but Dask had to move the data to disk and back
repeatedly, which reduced performance significantly.&lt;/p&gt;

    &lt;p&gt;We resolved this by including explicit recomputation steps in the algorithm.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Related chunks of data would be loaded at different times, and so would
need to stick around longer than necessary to wait for their associated
chunks.&lt;/p&gt;

    &lt;p&gt;We resolved this by engaging task fusion as an optimization pass.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before diving further into the technical solution
we quickly provide the use case that was motivating this work.&lt;/p&gt;

&lt;h2 id=&quot;application---genomics&quot;&gt;Application - Genomics&lt;/h2&gt;

&lt;p&gt;Many studies are using genome sequencing to study genetic variation
between different individuals within a species. These includes
studies of human populations, but also other species such as mice,
mosquitoes or disease-causing parasites. These studies will, in
general, find a large number of sites in the genome sequence where
individuals differ from each other. For example, humans have more
than 100 million variable sites in the genome, and modern studies
like the &lt;a href=&quot;https://www.ukbiobank.ac.uk/&quot;&gt;UK BioBank&lt;/a&gt; are working towards
sequencing the genomes of 1 million individuals or more.&lt;/p&gt;

&lt;p&gt;In diploid species like humans, mice or mosquitoes, each individual
carries two genome sequences, one inherited from each parent. At each
of the 100 million variable genome sites there will be two or more
“alleles” that a single genome might carry. One way to think about
this is via the &lt;a href=&quot;https://en.wikipedia.org/wiki/Punnett_square&quot;&gt;Punnett
square&lt;/a&gt;, which
represents the different possible genotypes that one individual might
carry at one of these variable sites:&lt;/p&gt;

&lt;td&gt;
  &lt;p&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/9/93/Punnett_Square_Genetic_Carriers.PNG&quot; alt=&quot;punnet square&quot; height=&quot;40%&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;
&lt;/td&gt;

&lt;p&gt;In the above there are three possible genotypes: AA, Aa, and aa. For
computational genomics, these genotypes can be encoded as 0, 1, or 2.
In a study of a species with M genetic variants assayed in N
individual samples, we can represent these genotypes as an (M x N)
array of integers. For a modern human genetics study, the scale of
this array might approach (100 million x 1 million). (Although in
practice, the size of the first dimension (number of variants) can be
reduced somewhat, by at least an order of magnitude, because many
genetic variants will carry little information and/or be correlated
with each other.)&lt;/p&gt;

&lt;p&gt;These genetic differences are not random, but carry information about
patterns of genetic similarity and shared ancestry between
individuals, because of the way they have been inherited through many
generations. A common task is to perform a dimensionality reduction
analysis on these data, such as a &lt;a href=&quot;https://journals.plos.org/plosgenetics/article?id=10.1371/journal.pgen.0020190&quot;&gt;principal components
analysis&lt;/a&gt;
(SVD), to identify genetic structure reflecting these differencies in
degree of shared ancestry. This is an essential part of discovering
genetic variants associated with different diseases, and for learning
more about the genetic history of populations and species.&lt;/p&gt;

&lt;p&gt;Reducing the time taken to compute an analysis such as SVD, like all
science, allows for exploring larger datasets and testing more
hypotheses in less time. Practically, this means not simply a fast
SVD but an accelerated pipeline end-to-end, from data loading to
analysis, to understanding.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We want to run an experiment in less time than it takes to make a cup of tea&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;performant-svds-w-dask&quot;&gt;Performant SVDs w/ Dask&lt;/h2&gt;

&lt;p&gt;Now that we have that scientific background, let’s transition back to talking about computation.&lt;/p&gt;

&lt;p&gt;To stop Dask from holding onto the data we intentionally trigger computation as
we build up the graph. This is a bit atypical in Dask calculations (we prefer
to have as much of the computation at once before computing) but useful given
the multiple-pass nature of this problem. This was a fairly easy change, and
is available in &lt;a href=&quot;https://github.com/dask/dask/pull/5041&quot;&gt;dask/dask #5041&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, we found that it was helpful to turn on moderately wide task
fusion.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;optimization.fuse.ave-width&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;then-things-work-fine&quot;&gt;Then things work fine&lt;/h2&gt;

&lt;p&gt;We’re going to try this SVD on a few different choices of hardware including:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A MacBook Pro&lt;/li&gt;
  &lt;li&gt;A DGX-2, an NVIDIA worksation with 16 high-end GPUs and fast interconnect&lt;/li&gt;
  &lt;li&gt;A twenty-node cluster on AWS&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;macbook-pro&quot;&gt;Macbook Pro&lt;/h3&gt;

&lt;p&gt;We can happily perform an SVD on a 20GB array on a Macbook Pro&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1_000_000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20_000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20_000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5_000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd_compressed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This call is no longer entirely lazy, and it recomputes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; a couple times, but
it works, and it works using only a few GB of RAM on a consumer laptop.&lt;/p&gt;

&lt;p&gt;It takes around 2min 30s time to compute that on a laptop.
That’s great! It was super easy to try out, didn’t require any special
hardware or setup, and in many cases is fast enough.
By working locally we can iterate quickly.&lt;/p&gt;

&lt;p&gt;Now that things work, we can experiment with different hardware.&lt;/p&gt;

&lt;h3 id=&quot;adding-gpus-a-15-second-svd&quot;&gt;Adding GPUs (a 15 second SVD)&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: one of the authors (Ben Zaitlen) works for NVIDIA&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We can dramatically increase performance by using a multi-GPU machine.
NVIDIA and other manufacturers now make machines with multiple GPUs co-located in the same physical box.
In the following section, we will run the calculations on a &lt;strong&gt;DGX2&lt;/strong&gt;, a machine with 16 GPUs and fast interconnect between the GPUs.&lt;/p&gt;

&lt;p&gt;Below is almost the same code, running in significantly less same time but we make the
following changes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We increase the size of the array by a factor of &lt;strong&gt;10x&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;We switch out NumPy for CuPy, a GPU NumPy implementation&lt;/li&gt;
  &lt;li&gt;We use a sixteen-GPU DGX-2 machine with NVLink interconnects between GPUs (NVLink will dramatically decrease transfer time between workers)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On A DGX2 we can calculate an SVD on a 200GB Dask array between 10 to 15 seconds.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://gist.github.com/quasiben/98ee254920837313946f621e103d41f4&quot;&gt;full notebook is here&lt;/a&gt;,
but the relevant code snippets are below:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Some GPU specific setup
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cuda&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Create the data and run the SVD as normal
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10_000_000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20_000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20_000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5_000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;uint8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd_compressed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;seed&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To see this run, we recommend viewing this screencast:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/6hmt1gARqp0&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h3 id=&quot;read-dataset-from-disk&quot;&gt;Read dataset from Disk&lt;/h3&gt;

&lt;p&gt;While impressive, the computation above is mostly bound by generating random
data and then performing matrix calculations. GPUs are good at both of these
things.&lt;/p&gt;

&lt;p&gt;In practice though, our input array won’t be randomly generated, it will be
coming from some dataset stored on disk or increasingly more common, stored in the cloud.
To make things more realistic we perform a similar calculation with data
stored in a &lt;a href=&quot;https://zarr.readthedocs.io/en/stable/&quot;&gt;Zarr format&lt;/a&gt;
in &lt;a href=&quot;https://cloud.google.com/storage&quot;&gt;GCS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this &lt;a href=&quot;https://gist.github.com/quasiben/e52bc740ae22ae321f30987c65998078&quot;&gt;Zarr SVD example&lt;/a&gt;,
we load a 25GB GCS backed data set onto a DGX2,
run a few processing steps, then perform an SVD.
The combination of preprocessing and SVD calculations ran in 18.7 sec and the data loading took 14.3 seconds.&lt;/p&gt;

&lt;p&gt;Again, on a DGX2, from data loading to SVD we are running in time less than it would take to make a cup of tea.
However, the data loading can be accelerated.
From GCS we are reading into data into the main memory of the machine (host memory), uncompressing the zarr bits,
then moving the data from host memory to the GPU (device memory). Passing data back and forth between host and device memory can significantly decrease performance. Reading directly into the GPU, bypassing host memory, would improve the overall pipeline.&lt;/p&gt;

&lt;p&gt;And so we come back to a common lesson of high performance computing:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;High performance computing isn’t about doing one thing exceedingly well, it’s
about doing nothing poorly&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In this case GPUs made our computation fast enough that we now need to focus on
other components of our system, notably disk bandwidth, and a direct reader for
Zarr data to GPU memory.&lt;/p&gt;

&lt;h3 id=&quot;cloud&quot;&gt;Cloud&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Diclaimer: one of the authors (Matthew Rocklin) works for Coiled Computing&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We can also run this on the cloud with any number of frameworks.
In this case we used the &lt;a href=&quot;https://coiled.io&quot;&gt;Coiled Cloud&lt;/a&gt; service to deploy on AWS&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;coiled_cloud&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Cloud&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Cluster&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cloud&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Cloud&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cloud&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;create_cluster_type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;organization&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;friends&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;genomics&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;worker_cpu&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;worker_memory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;16 GiB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;worker_environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;OMP_NUM_THREADS&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;OPENBLAS_NUM_THREADS&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# &quot;EXTRA_PIP_PACKAGES&quot;: &quot;zarr&quot;
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;organization&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;friends&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;typename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;genomics&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;n_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# then proceed as normal
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Using 20 machines with a total of 80 CPU cores on a dataset that was 10x larger
than the MacBook pro example we were able to run in about the same amount of
time. This shows near optimal scaling for this problem, which is nice to see
given how complex the SVD calculation is.&lt;/p&gt;

&lt;p&gt;A screencast of this problem is viewable here&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/qaJcAvhgLy4&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;compression&quot;&gt;Compression&lt;/h2&gt;

&lt;p&gt;One of the easiest ways for us to improve performance is to reduce the size of
this data through compression.
This data is highly compressible for two reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The real-world data itself has structure and repetition
(although the random play data does not)&lt;/li&gt;
  &lt;li&gt;We’re storing entries that take on only four values.
We’re using eight-bit integers when we only needed two-bit integers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s solve the second problem first.&lt;/p&gt;

&lt;h3 id=&quot;compression-with-bit-twiddling&quot;&gt;Compression with bit twiddling&lt;/h3&gt;

&lt;p&gt;Ideally Numpy would have a two-bit integer datatype.
Unfortunately it doesn’t, and this is hard because memory in computers is
generally thought of in full bytes.&lt;/p&gt;

&lt;p&gt;To work around this we can use bit arithmetic to shove four values into a single value
Here are functions that do that, assuming that our array is square,
and the last dimension is divisible by four.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;compress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros_like&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;decompress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;back&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros_like&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;back&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mb&quot;&gt;0b00000011&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;back&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mb&quot;&gt;0b00001100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;back&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mb&quot;&gt;0b00110000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;back&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;mb&quot;&gt;0b11000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;back&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then, we can use these functions along with Dask to store our data in a
compressed state, but lazily decompress on-demand.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;decompress&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That’s it. We compress each block our data and store that in memory.
However the output variable that we have, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; will decompress each chunk before
we operate on it, so we don’t need to worry about handling compressed blocks.&lt;/p&gt;

&lt;h3 id=&quot;compression-with-zarr&quot;&gt;Compression with Zarr&lt;/h3&gt;

&lt;p&gt;A slightly more general but probably less efficient route would be to compress
our arrays with a proper compression library like Zarr.&lt;/p&gt;

&lt;p&gt;The example below shows how we do this in practice.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;zarr&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numcodecs&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Blosc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;compressor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Blosc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cname&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;lz4&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clevel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Blosc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BITSHUFFLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zarr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compressor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compressor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Additionally, if we’re using the dask-distributed scheduler then we want to
make sure that the Blosc compression library doesn’t use additional threads.
That way we don’t have parallel calls of a parallel library, which can cause
some contention&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;set_no_threads_blosc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot; Stop blosc from using multiple threads &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numcodecs&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;numcodecs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blosc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;use_threads&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Run on all workers
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register_worker_plugin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_no_threads_blosc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This approach is more general, and probably a good trick to have up ones’
sleeve, but it also doesn’t work on GPUs, which in the end is why we ended up
going with the bit-twiddling approach one section above, which uses API that
was uniformly accessible within the Numpy and CuPy libraries.&lt;/p&gt;

&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;

&lt;p&gt;In this post we did a few things, all around a single important problems in
genomics.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We learned a bit of science&lt;/li&gt;
  &lt;li&gt;We translated a science problem into a computational problem,
and in particular into a request to perform large singular value decompositions&lt;/li&gt;
  &lt;li&gt;We used a canned algorithm in dask.array that performed pretty well,
assuming that we’re comfortable going over the array in a few passes&lt;/li&gt;
  &lt;li&gt;We then tried that algorithm on three architectures quickly
    &lt;ol&gt;
      &lt;li&gt;A Macbook Pro&lt;/li&gt;
      &lt;li&gt;A multi-GPU machine&lt;/li&gt;
      &lt;li&gt;A cluster in the cloud&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Finally we talked about some tricks to pack more data into the same memory
with compression&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This problem was nice in that we got to dive deep into a technical science
problem, and yet also try a bunch of architecture quickly to investigate
hardware choices that we might make in the future.&lt;/p&gt;

&lt;p&gt;We used several technologies here today, made by several different communities
and companies. It was great to see how they all worked together seamlessly to
provide a flexible-yet-consistent experience.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Summit</title>
   <link href="https://blog.dask.org/2020/04/28/dask-summit"/>
   <updated>2020-04-28T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/04/28/dask-summit</id>
   
   <content type="html">
&lt;p&gt;In late February members of the Dask community gathered together in Washington, DC.
This was a mix of open source project maintainers
and active users from a broad range of institutions.
This post shares a summary of what happened at this workshop,
including slides, images, and lessons learned.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: this event happened just before the widespread effects of the COVID-19
outbreak in the US and Europe. We were glad to see each other, but wouldn’t recommend doing this today.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;who-came&quot;&gt;Who came?&lt;/h2&gt;

&lt;p&gt;This was an invite-only event of fifty people, with a cap of three people per
organization. We intentionally invited an even mix of half people who
self-identified as open source maintainers, and half people who identified as
institutional users. We had attendees from academia, small startups, tech
companies, government institutions, and large enterprise. It was surprising
how much we all had in common.
We had attendees from the following companies:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Anaconda&lt;/li&gt;
  &lt;li&gt;Berkeley Institute for Datascience&lt;/li&gt;
  &lt;li&gt;Blue Yonder&lt;/li&gt;
  &lt;li&gt;Brookhaven National Lab&lt;/li&gt;
  &lt;li&gt;Capital One&lt;/li&gt;
  &lt;li&gt;Chan Zuckerberg Initiative&lt;/li&gt;
  &lt;li&gt;Coiled Computing&lt;/li&gt;
  &lt;li&gt;Columbia University&lt;/li&gt;
  &lt;li&gt;D. E. Shaw &amp;amp; Co.&lt;/li&gt;
  &lt;li&gt;Flatiron Health&lt;/li&gt;
  &lt;li&gt;Howard Hughes Medial Institute, Janelia Research Campus&lt;/li&gt;
  &lt;li&gt;Inria&lt;/li&gt;
  &lt;li&gt;Kitware&lt;/li&gt;
  &lt;li&gt;Lawrence Berkeley National Lab&lt;/li&gt;
  &lt;li&gt;Los Alamos National Laboratory&lt;/li&gt;
  &lt;li&gt;MetroStar Systems&lt;/li&gt;
  &lt;li&gt;Microsoft&lt;/li&gt;
  &lt;li&gt;NIMH&lt;/li&gt;
  &lt;li&gt;NVIDIA&lt;/li&gt;
  &lt;li&gt;National Center for Atmospheric Research (NCAR)&lt;/li&gt;
  &lt;li&gt;National Energy Research Scientific Computing (NERSC) Center&lt;/li&gt;
  &lt;li&gt;Prefect&lt;/li&gt;
  &lt;li&gt;Quansight&lt;/li&gt;
  &lt;li&gt;Related Sciences&lt;/li&gt;
  &lt;li&gt;Saturn Cloud&lt;/li&gt;
  &lt;li&gt;Smithsonian Institution&lt;/li&gt;
  &lt;li&gt;SymphonyRM&lt;/li&gt;
  &lt;li&gt;The HDF Group&lt;/li&gt;
  &lt;li&gt;USGS&lt;/li&gt;
  &lt;li&gt;Ursa Labs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;objectives&quot;&gt;Objectives&lt;/h2&gt;

&lt;p&gt;The Dask community comes from a broad range of backgrounds.
It’s an odd bunch, all solving very different problems,
but all with a surprisingly common set of needs.
We’ve all known each other on GitHub for several years,
and have a long shared history, but many of us had never met in person.&lt;/p&gt;

&lt;p&gt;In hindsight, this workshop served two main purposes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It helped us to see that we were all struggling with the same problems
and so helped to form direction and motivate future work&lt;/li&gt;
  &lt;li&gt;It helped us to create social bonds and collaborations that help us manage
the day to day challenges of building and maintaining community software
across organizations&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;structure&quot;&gt;Structure&lt;/h2&gt;

&lt;p&gt;We met for three days.&lt;/p&gt;

&lt;p&gt;On days 1-2 we started with quick talks from the attendees and followed with
afternoon working sessions.&lt;/p&gt;

&lt;p&gt;Talks were short around 10-15 minutes
(having only experts in the room meant that we could easily skip the introductory material)
and always had the same structure:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;A brief description of the domain that they’re in and why it’s important&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Example: We look at seismic readings from thousand of measurement devices around
the world to understand and predict catastrophic earthquakes&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;How they use Dask to solve this problem&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Example: this means that we need to cross-correlate thousands of very
long timeseries. We use Xarray on AWS with some custom operations.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;What is wrong with Dask, and what they would like to see improved&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Example: It turns out that our axes labels can grow larger than what
Xarray was designed for. Also, the task graph size for Dask can become a
limitation&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These talks were structured into six sections:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Workflow and pipelines&lt;/li&gt;
  &lt;li&gt;Deployment&lt;/li&gt;
  &lt;li&gt;Imaging&lt;/li&gt;
  &lt;li&gt;General data analysis&lt;/li&gt;
  &lt;li&gt;Performance and tooling&lt;/li&gt;
  &lt;li&gt;Xarray&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We didn’t capture video, but we do have slides from each of the talks below.&lt;/p&gt;

&lt;h2 id=&quot;1-workflow-and-pipelines&quot;&gt;1: Workflow and Pipelines&lt;/h2&gt;

&lt;h3 id=&quot;blue-yonder&quot;&gt;Blue Yonder&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Title: ETL Pipelines for Machine Learning&lt;/li&gt;
  &lt;li&gt;Presenters: Florian Jetter&lt;/li&gt;
  &lt;li&gt;Also attending:
    &lt;ul&gt;
      &lt;li&gt;Nefta Kanilmaz&lt;/li&gt;
      &lt;li&gt;Lucas Rademaker&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSk2zAnSmzpbz5BgK70mpPmeQeV4h1IkCQh-EU8KXrZFJQGHmlMTuHvln3CmOQVTg/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;360&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

&lt;h3 id=&quot;prefect&quot;&gt;Prefect&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Title: Prefect + Dask: Parallel / Distributed Workflows&lt;/li&gt;
  &lt;li&gt;Presenters: Chris White, CTO&lt;/li&gt;
&lt;/ul&gt;

&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/4wiUwkDHmdzVTW&quot; width=&quot;595&quot; height=&quot;485&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;div style=&quot;margin-bottom:5px&quot;&gt;
  &lt;p&gt;&lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/ChrisWhite249/dask-prefect&quot; title=&quot;Dask + Prefect&quot; target=&quot;_blank&quot;&gt;Dask + Prefect&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/ChrisWhite249&quot; target=&quot;_blank&quot;&gt;Chris White&lt;/a&gt;&lt;/strong&gt; &amp;lt;/div&amp;gt;&lt;/p&gt;

  &lt;h3 id=&quot;symphonyrm&quot;&gt;SymphonyRM&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Dask and Prefect for Data Science in Healthcare&lt;/li&gt;
    &lt;li&gt;Presenter: Joe Schmid, CTO&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSCDbXrXtrL9vmA0hQ1NNk5DY0-3Azpcf9FbYgjoLuKV79vf_nm7wdUZl1NsL5DZqRmlUTP--u9HM56/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h2 id=&quot;deployment&quot;&gt;2: Deployment&lt;/h2&gt;

  &lt;h3 id=&quot;quansight&quot;&gt;Quansight&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Building Cloud-based Data Science Platforms with Dask&lt;/li&gt;
    &lt;li&gt;Presenters: Dharhas Pothina&lt;/li&gt;
    &lt;li&gt;Also attending: - James Bourbeau - Dhavide Aruliah&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSZ1fSrkWvzMPlx-f0qk7w2xj_uDp5q-Tg11S9UlynoohZV0VYjdFduDUrAdhptSYfpzFu9Wask1WSN/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;479&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;nvidia-and-microsoftazure&quot;&gt;NVIDIA and Microsoft/Azure&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Native Cloud Deployment with Dask-Cloudprovider&lt;/li&gt;
    &lt;li&gt;Presenters: Jacob Tomlinson, Tom Drabas, and Code Peterson&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vT-B1c0r8MWMF8wvW4lNly-qmOCqhFqKdhshXnVql6UVkYQ-aGprY3Du0VH0PJBccOmM84ncw0lDV77/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;inria&quot;&gt;Inria&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: HPC Deployments with Dask-Jobqueue&lt;/li&gt;
    &lt;li&gt;Presenters: Loïc Esteve&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://lesteve.github.io/talks/2020-dask-jobqueue-dask-workshop/slides.html&quot; frameborder=&quot;0&quot; width=&quot;1000&quot; height=&quot;800&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;anaconda&quot;&gt;Anaconda&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Dask Gateway&lt;/li&gt;
    &lt;li&gt;Presenters: Jim Crist&lt;/li&gt;
    &lt;li&gt;Also attending: - Tom Augspurger - Eric Dill - Jonathan Helmus
      &lt;style&gt;
    iframe {
        overflow:hidden;
    }
&lt;/style&gt;
    &lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;http://jcrist.github.io/talks/dask_summit_2020/slides.html&quot; frameborder=&quot;1&quot; width=&quot;600&quot; height=&quot;355&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;

  &lt;h2 id=&quot;imaging&quot;&gt;3: Imaging&lt;/h2&gt;

  &lt;h3 id=&quot;kitware&quot;&gt;Kitware&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Scientific Image Analysis and Visualization with ITK&lt;/li&gt;
    &lt;li&gt;Presenters: Matt McCormick&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vRz2SV2G-1LEXXCF0n9vugF13s7ABpLDT-yH3WtxQEOjt2FVHE7apl3nQhqkOiLeY9kSzM_Mrs6fJOk/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;kitware-1&quot;&gt;Kitware&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Image processing with X-rays and electrons&lt;/li&gt;
    &lt;li&gt;Presenters: Marcus Hanwell&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vRT--l76IcSPlIP_N6ClUtm2ECZaxkvIGrBNyyoFmJNQu6kS6CilWoleIMCur2FQ7ZpEkkCsw7UXnRd/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;national-institutes-of-mental-health&quot;&gt;National Institutes of Mental Health&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Brain imaging&lt;/li&gt;
    &lt;li&gt;Presenters: John Lee&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vTH1X0cSjozmCDvSQ8CtcxPPYejkLROC_b92W6uwznG5litWq_MwKJzUMnAQi0Prw/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;janelia--howard-hughes-medical-institute&quot;&gt;Janelia / Howard Hughes Medical Institute&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Spark, Dask, and FlyEM HPC&lt;/li&gt;
    &lt;li&gt;Presenters: Stuart Berg&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSnZ-JgHAoAOUirqmLcI3GaKyC4oVo3vThZZ4oyx8vZjJ66An09JIhbcoy6k7ufTw/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;479&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h2 id=&quot;general-data-analysis&quot;&gt;4: General Data Analysis&lt;/h2&gt;

  &lt;h3 id=&quot;brookhaven-national-labs&quot;&gt;Brookhaven National Labs&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Dask at DOE Light Sources&lt;/li&gt;
    &lt;li&gt;Presenters: Dan Allan&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vRd8PVHjW7Umjo1rUjR7XWDT95CcEoE_3jH-ceDHsN_lMv_4M2qnlFiFvtMl9SX0Eb1EFQTGkzUWCDy/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;de-shaw-group&quot;&gt;D.E. Shaw Group&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Dask at D.E. Shaw&lt;/li&gt;
    &lt;li&gt;Presenters: Akihiro Matsukawa&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h3 id=&quot;anaconda-1&quot;&gt;Anaconda&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Dask Dataframes and Dask-ML summary&lt;/li&gt;
    &lt;li&gt;Presenters: Tom Augspurger&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vTs6nNsMkV92Uj4QUns1VB8pKlKSsRgUAGwvcbTOPqMazSAhxtawVNgb04YmHVFmb0z8-no-cdS8mE8/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h2 id=&quot;performance-and-tooling&quot;&gt;5: Performance and Tooling&lt;/h2&gt;

  &lt;h3 id=&quot;berkeley-institute-for-data-science&quot;&gt;Berkeley Institute for Data Science&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Numpy APIs&lt;/li&gt;
    &lt;li&gt;Presenters: Sebastian Berg&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h3 id=&quot;ursa-labs&quot;&gt;Ursa Labs&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Arrow&lt;/li&gt;
    &lt;li&gt;Presenters: Joris Van den Bossche&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vQY3ubjCFkMcU_b8p2xmuXN8VVR1BxxSWZDe5Vy-ftnH2CstZILvTo2pRBv5R_VDk85rNjVoWew2AJl/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;nvidia&quot;&gt;NVIDIA&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: RAPIDS&lt;/li&gt;
    &lt;li&gt;Presenters: Keith Kraus&lt;/li&gt;
    &lt;li&gt;Also attending: - Mike Beaumont - Richard Zamora&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vQiNrupzQlSqsu95AAHqIhU1V_iVUav_0WlIp4dXdSE6Izze1BL8mkFbIzg7p8CndEi9bjWaC2OVlyu/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;nvidia-1&quot;&gt;NVIDIA&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: UCX&lt;/li&gt;
    &lt;li&gt;Presenters: Ben Zaitlen&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vRU-vsXsnXgeLKdmtWZkZVV_-mOojsNesCbQKJgmWkwSjxj5ZdwkmS6X4tOt3HpFrIOfNROSlV_8l84/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h2 id=&quot;xarray&quot;&gt;6: Xarray&lt;/h2&gt;

  &lt;h3 id=&quot;usgs-and-ncar&quot;&gt;USGS and NCAR&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Dask in Pangeo&lt;/li&gt;
    &lt;li&gt;Presenters: Rich Signell and Anderson Banihirwe&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vStqGiQy6pJDYhRgF-BZylQussINK5BGlhnidOVCUECo_ebYqRH9cSY4e-2z7BfFFvTfvkqq_M1jXBX/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;366&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h3 id=&quot;lbnl&quot;&gt;LBNL&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Accelerating Experimental Science with Dask&lt;/li&gt;
    &lt;li&gt;Presenters: Matt Henderson&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/1DVVzYmhkDhO2xs0tmxpPCkxx5c4o63bO/view&quot;&gt;Slides&lt;/a&gt; - Fill too large to preview&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h3 id=&quot;lanl&quot;&gt;LANL&lt;/h3&gt;

  &lt;ul&gt;
    &lt;li&gt;Title: Seismic Analysis&lt;/li&gt;
    &lt;li&gt;Presenters: Jonathan MacCarthy&lt;/li&gt;
  &lt;/ul&gt;

  &lt;iframe src=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSWAgKLxt1tBZxXjQfIRQNFPvAMFYZ-z0hkMy7euPnOHwO9pomH_gM8cKUTKXA68w/embed?start=false&amp;amp;loop=false&amp;amp;delayms=3000&quot; frameborder=&quot;0&quot; width=&quot;600&quot; height=&quot;404&quot; allowfullscreen=&quot;true&quot; mozallowfullscreen=&quot;true&quot; webkitallowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;

  &lt;h2 id=&quot;unstructured-time&quot;&gt;Unstructured Time&lt;/h2&gt;

  &lt;p&gt;Having rapid fire talks in the morning, followed by unstructured time in the
afternoon was a productive combination. Below you’ll see pictures from
geo-scientists and quants talking about the same challenges, and library
maintainers from Pandas/Arrow/RAPDIS/Dask all working together on joint
solutions.&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/ERykEc9XUAEFq-L?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;
&lt;img src=&quot;https://pbs.twimg.com/media/ERzEcEeXkAU35sg?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/ERyz7B5X0AIrDkn?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;
&lt;img src=&quot;https://pbs.twimg.com/media/ERzXhHnWAAE_zDA?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/ERz3GDgXsAcE6Id?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;
&lt;img src=&quot;https://pbs.twimg.com/media/ERz4ur2WkAAGJwm?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/ER0sZceUYAAF5fW?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;
&lt;img src=&quot;https://pbs.twimg.com/media/ER0yY2rX0AEFfXi?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;img src=&quot;https://pbs.twimg.com/media/ERyz98YWAAAmJbE?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;
&lt;img src=&quot;https://pbs.twimg.com/media/ERz5S2dWoAEhFHc?format=jpg&amp;amp;name=large&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;

  &lt;p&gt;This unstructured time is a productive combination that we would recommend to
other technically diverse groups in the future. Engagement and productivity was
really high throughout the workshop.&lt;/p&gt;

  &lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;

  &lt;p&gt;Dask’s strength comes from this broad community of stakeholders.&lt;/p&gt;

  &lt;p&gt;An early technical focus on simplicity and pragmatism allowed the project to be
quickly adopted within many different domains. As a result, the practitioners
within these domains are largely the ones driving the project forward today.
This Community Driven Development brings an incredible diversity of technical
and cultural challenges and experience that force the project to quickly evolve
in a way that is constrained towards pragmatism.&lt;/p&gt;

  &lt;p&gt;There is still plenty of work to do.
Short term this workshop brought up many technical challenges that are shared
by all (simpler deployments, scheduling under task constraints, active memory
management). Longer term we need to welcome more people into this community,
both by increasing the diversity of domains, and the diversity of individuals
(the vast majority of attendees were white men in their thirties from the US
and western Europe).&lt;/p&gt;

  &lt;p&gt;We’re in a good position to effect this change.
Dask’s recent growth has captured the attention of many different institutions.
Now is a critical time to be intentional about the projects growth to make sure
that the project and community continue to reflect a broad and ethical set of
principles.&lt;/p&gt;

  &lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

  &lt;h3 id=&quot;sponsors&quot;&gt;Sponsors&lt;/h3&gt;

  &lt;p&gt;Without the support of our sponsors, this workshop would not have been possible.
Thanks to Anaconda, Capital One and NVIDIA for their support and generous
donations toward this event.&lt;/p&gt;

  &lt;h3 id=&quot;organizers&quot;&gt;Organizers&lt;/h3&gt;

  &lt;p&gt;Thank you very much to the organizers who took time from their busy schedules
and worked so hard to put together this event.&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;Brittany Treadway (Capital One)&lt;/li&gt;
    &lt;li&gt;Keith Kraus (NVIDIA)&lt;/li&gt;
    &lt;li&gt;Matthew Rocklin (Coiled Computing)&lt;/li&gt;
    &lt;li&gt;Mike Beaumont (NVIDIA)&lt;/li&gt;
    &lt;li&gt;Mike McCarty (Capital One)&lt;/li&gt;
    &lt;li&gt;Neia Woodson (Capital One)&lt;/li&gt;
    &lt;li&gt;Jake Schmitt (Capital One)&lt;/li&gt;
    &lt;li&gt;Jim Crist (Anaconda)&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Estimating Users</title>
   <link href="https://blog.dask.org/2020/01/14/estimating-users"/>
   <updated>2020-01-14T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2020/01/14/estimating-users</id>
   
   <content type="html">
&lt;p&gt;People often ask me &lt;em&gt;“How many people use Dask?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As with any non-invasive open source software, the answer to this is
&lt;em&gt;“I don’t know”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;There are many possible proxies for user counts, like downloads, GitHub stars,
and so on, but most of them are wildly incorrect.
As a project maintainer who tries to find employment for other maintainers,
I’m incentivized to take the highest number I can find,
but that is somewhat dishonest.
That number today is in the form of this likely false statement.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dask has 50-100k daily downloads.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This number comes from looking at the Python Package Index (PyPI)
(image from &lt;a href=&quot;https://pypistats.org&quot;&gt;pypistats.org&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/dask-pypi-downloads-total.png&quot;&gt;&lt;img src=&quot;/images/dask-pypi-downloads-total.png&quot; width=&quot;100%&quot; alt=&quot;Total Dask downloads&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a huge number, but is almost certainly misleading.
Common sense tells us that there are not 100k new Dask users every day.&lt;/p&gt;

&lt;h2 id=&quot;bots-dominate-download-counts&quot;&gt;Bots dominate download counts&lt;/h2&gt;

&lt;p&gt;If you dive in more deeply to numbers like these you will find that they are
almost entirely due to automated processes. For example, of Dask’s 100k new
users, a surprising number of them seem to be running Linux.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/linux-reigns.png&quot;&gt;&lt;img src=&quot;/images/linux-reigns.png&quot; width=&quot;100%&quot; alt=&quot;Linux dominates download counts&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While it’s true that Dask is frequently run on Linux because it is a
distributed library, it would be odd to see every machine in that deployment
individually &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pip install dask&lt;/code&gt;. It’s more likely that these downloads are the
result of automated systems, rather than individual users.&lt;/p&gt;

&lt;p&gt;Anecdotally, if you get access to fine grained download data, one finds that a
small set of IPs dominate download counts. These tend to come mostly from
continuous integration services like Travis and Circle, are coming from AWS,
or are coming from a few outliers in the world (sometimes people in China try
to mirror everything)..&lt;/p&gt;

&lt;h2 id=&quot;check-windows&quot;&gt;Check Windows&lt;/h2&gt;

&lt;p&gt;So, in an effort to avoid this effect we start looking at just Windows
downloads.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/dask-windows-downloads.png&quot;&gt;&lt;img src=&quot;/images/dask-windows-downloads.png&quot; width=&quot;100%&quot; alt=&quot;Dask Monthly Windows Downloads&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The magnitudes here seem more honest to me. These monthly numbers translate to
about 1000 downloads a day (perhaps multiplied by two or three for OSX and
Linux), which seems more in line with my expectations.&lt;/p&gt;

&lt;p&gt;However even this is strange. The structure doesn’t match my personal experience.
Why the big change in adoption in 2018?
What is the big spike in 2019?
Anecdotally maintainers did not notice a significant jump in users there.
Instead, we’ve experienced smooth continuous growth of adoption over time
(this is what most long-term software growth looks like).
It’s also odd that there hasn’t been continued growth since 2018. Anecdotally
Dask seems to have grown somewhat constantly over the last few years. Phase
transitions like these don’t match observed reality (at least in so far as I
personally have observed it).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://nbviewer.jupyter.org/gist/mrocklin/ef6f9b6a649a6d78b2221d8fdeea5f2a&quot;&gt;&lt;em&gt;Notebook for plot available here&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;documentation-views&quot;&gt;Documentation views&lt;/h2&gt;

&lt;p&gt;My favorite metric is looking at weekly unique users to documentation.&lt;/p&gt;

&lt;p&gt;This is an over-estimate of users because many people look at the documentation
without using the project. This is also an under-estimate because many users
don’t consult our documentation on a weekly basis (oh I wish).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/dask-weekly-users.png&quot;&gt;&lt;img src=&quot;/images/dask-weekly-users.png&quot; width=&quot;100%&quot; alt=&quot;Dask weekly users on documentation&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This growth pattern matches my expectations and my experience with maintaining
a project that has steadily gained traction over several years.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Plot taken from Google Analytics&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;dependencies&quot;&gt;Dependencies&lt;/h2&gt;

&lt;p&gt;It’s also important to look at dependencies of a project. For example many
users in the earth and geo sciences use Dask through another project,
&lt;a href=&quot;https://xarray.pydata.org&quot;&gt;Xarray&lt;/a&gt;. These users are much less likely to touch
Dask directly, but often use Dask as infrastructure underneath the Xarray
library. We should probably add in something like half of Xarray’s users as
well.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/xarray-weekly-users.png&quot;&gt;&lt;img src=&quot;/images/xarray-weekly-users.png&quot; width=&quot;100%&quot; alt=&quot;Xarray weekly users on documentation&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Plot taken from Google Analytics, supplied by &lt;a href=&quot;https://joehamman.com/&quot;&gt;Joe Hamman&lt;/a&gt; from Xarray&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Dask has somewhere between 100k new users every day (download counts)
or something like 10k users total (weekly unique IPs). The 10k number sounds
more likely to me, maybe bumping up to 15k due to dependencies.
The fact is though that no one really knows.&lt;/p&gt;

&lt;p&gt;Judging the use of community maintained OSS is important as we try to value its
impact on society. This is also a fundamentally difficult problem.
I hope that this post helps to highlight how these numbers may be misleading,
and encourages us all to think more deeply about estimating impact.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Deployment Updates</title>
   <link href="https://blog.dask.org/2019/11/01/deployment-updates"/>
   <updated>2019-11-01T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/11/01/deployment-updates</id>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Over the last six months many Dask developers have worked on making Dask easier
to deploy in a wide variety of situations. This post summarizes those
efforts, and provides links to ongoing work.&lt;/p&gt;

&lt;h2 id=&quot;what-we-mean-by-deployment&quot;&gt;What we mean by Deployment&lt;/h2&gt;

&lt;p&gt;In order to run Dask on a cluster, you need to setup a scheduler on one
machine:&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;dask-scheduler
&lt;span class=&quot;go&quot;&gt;Scheduler running at tcp://192.168.0.1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And start Dask workers on many other machines&lt;/p&gt;

&lt;div class=&quot;language-console highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;dask-worker tcp://192.168.0.1
&lt;span class=&quot;go&quot;&gt;Waiting to connect to:       tcp://scheduler:8786

&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;dask-worker tcp://192.168.0.1
&lt;span class=&quot;go&quot;&gt;Waiting to connect to:       tcp://scheduler:8786

&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;dask-worker tcp://192.168.0.1
&lt;span class=&quot;go&quot;&gt;Waiting to connect to:       tcp://scheduler:8786

&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;dask-worker tcp://192.168.0.1
&lt;span class=&quot;go&quot;&gt;Waiting to connect to:       tcp://scheduler:8786
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For informal clusters people might do this manually, by logging into each
machine and running these commands themselves. However it’s much more common
to use a cluster resource manager such as Kubernetes, Yarn (Hadoop/Spark),
HPC batch schedulers (SGE, PBS, SLURM, LSF …), some cloud service or some custom system.&lt;/p&gt;

&lt;p&gt;As Dask is used by more institutions and used more broadly within those
institutions, making deployment smooth and natural becomes increasingly
important. This is so important in fact, that there have been seven separate
efforts to improve deployment in some regard or another by a few different
groups.&lt;/p&gt;

&lt;p&gt;We’ll briefly summarize and link to this work below, and then we’ll finish up
by talking about some internal design that helped to make this work more
consistent.&lt;/p&gt;

&lt;h2 id=&quot;dask-ssh&quot;&gt;Dask-SSH&lt;/h2&gt;

&lt;p&gt;According to our user survey, the most common deployment mechanism was still
SSH. Dask has had a &lt;a href=&quot;https://docs.dask.org/en/latest/setup/ssh.html#command-line&quot;&gt;command line dask-ssh
tool&lt;/a&gt; to make it
easier to deploy with SSH for some time. We recently updated this to also
include a Python interface, which provides more control.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;host1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;host2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;host3&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;host4&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;connect_options&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;known_hosts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;worker_options&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;nthreads&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;scheduler_options&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;dashboard_address&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;:8797&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This isn’t what we recommend for large institutions, but it can be helpful for
more informal groups who are just getting started.&lt;/p&gt;

&lt;h2 id=&quot;dask-jobqueue-and-dask-kubernetes-rewrite&quot;&gt;Dask-Jobqueue and Dask-Kubernetes Rewrite&lt;/h2&gt;

&lt;p&gt;We’ve rewritten Dask-Jobqueue for SLURM/PBS/LSF/SGE cluster managers typically
found in HPC centers and Dask-Kubernetes. These now share a common codebase
along with Dask SSH, and so are much more consistent and hopefully bug free.&lt;/p&gt;

&lt;p&gt;Ideally users shouldn’t notice much difference with existing workloads,
but new features like asynchronous operation, integration with the Dask
JupyterLab extension, and so on are more consistently available. Also, we’ve
been able to unify development and reduce our maintenance burden considerably.&lt;/p&gt;

&lt;p&gt;The new version of Dask Jobqueue where these changes take place is 0.7.0, and
the work was done in &lt;a href=&quot;https://github.com/dask/dask-jobqueue/pull/307&quot;&gt;dask/dask-jobqueue #307&lt;/a&gt;.
The new version of Dask Kubernetes is 0.10.0 and the work was done in
&lt;a href=&quot;https://github.com/dask/dask-kubernetes/pull/162&quot;&gt;dask/dask-kubernetes #162&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;dask-cloudprovider&quot;&gt;Dask-CloudProvider&lt;/h2&gt;

&lt;p&gt;For cloud deployments we generally recommend using a hosted Kubernetes or Yarn
service, and then using Dask-Kubernetes or Dask-Yarn on top of these.&lt;/p&gt;

&lt;p&gt;However, some institutions have made decisions or commitments to use
certain vendor specific technologies, and it’s more convenient to use APIs that
are more native to the particular cloud. The new package &lt;a href=&quot;https://cloudprovider.dask.org&quot;&gt;Dask
Cloudprovider&lt;/a&gt; handles this today for Amazon’s
ECS API, which has been around for a long while and is more universally
accepted.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cloudprovider&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ECSCluster&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ECSCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster_arn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;arn:aws:ecs:&amp;lt;region&amp;gt;:&amp;lt;acctid&amp;gt;:cluster/&amp;lt;clustername&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cloudprovider&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FargateCluster&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FargateCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;dask-gateway&quot;&gt;Dask-Gateway&lt;/h2&gt;

&lt;p&gt;In some cases users may not have access to the cluster manager. For example
the institution may not give all of their data science users access to the Yarn
or Kubernetes cluster. In this case the &lt;a href=&quot;https://gateway.dask.org&quot;&gt;Dask-Gateway&lt;/a&gt;
project may be useful.
It can launch and manage Dask jobs,
and provide a proxy connection to these jobs if necessary.
It is typically deployed with elevated permissions but managed directly by IT,
giving them a point of greater control.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://gateway.dask.org/_images/architecture.svg&quot; width=&quot;50%&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;gpus-and-dask-cuda&quot;&gt;GPUs and Dask-CUDA&lt;/h2&gt;

&lt;p&gt;While using Dask with multi-GPU deployments the &lt;a href=&quot;https://rapids.ai&quot;&gt;NVIDIA
RAPIDS&lt;/a&gt; has needed the ability to specify increasingly
complex setups of Dask workers. They recommend the following deployment
strategy:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;One Dask-worker per GPU on a machine&lt;/li&gt;
  &lt;li&gt;Specify the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/code&gt; environment variable to pin that worker
to that GPU&lt;/li&gt;
  &lt;li&gt;If your machine has multiple network interfaces then choose the network interface that has the best connection to that GPU&lt;/li&gt;
  &lt;li&gt;If your machine has multiple CPUs then set thread affinities to use the closest CPU&lt;/li&gt;
  &lt;li&gt;… and more&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For this reason we wanted to specify these configurations in code, like the
following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;specification&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;worker-0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;cls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;distributed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Nanny&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;nthreads&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CUDA_VISIBLE_DEVICES&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;0,1,2,3&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ib0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;worker-1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;cls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;distributed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Nanny&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;nthreads&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CUDA_VISIBLE_DEVICES&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;1,2,3,0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ib0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;worker-2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;cls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;distributed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Nanny&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;nthreads&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CUDA_VISIBLE_DEVICES&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;2,3,0,1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ib1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;worker-2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;cls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;distributed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Nanny&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;nthreads&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CUDA_VISIBLE_DEVICES&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;3,0,1,2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ib1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the new SpecCluster class to deploy these workers:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SpecCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;specification&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We’ve used this technique in the
&lt;a href=&quot;https://github.com/rapidsai/dask-cuda&quot;&gt;Dask-CUDA&lt;/a&gt; project to provide
convenient functions for deployment on multi-GPU systems.&lt;/p&gt;

&lt;p&gt;This class was generic enough that it ended up forming the base of the SSH,
Jobqueue, and Kubernetes solutions as well.&lt;/p&gt;

&lt;h2 id=&quot;standards-and-conventions&quot;&gt;Standards and Conventions&lt;/h2&gt;

&lt;p&gt;The solutions above are built by different teams that work in different companies.
This is great because those teams have hands-on experience with the
cluster managers in the wild, but has historically been somewhat challenging to
standardize user experience. This is particularly challenging when we build
other tools like IPython widgets or the Dask JupyterLab extension, which want
to interoperate with all of the Dask deployment solutions.&lt;/p&gt;

&lt;p&gt;The recent rewrite of Dask-SSH, Dask-Jobqueue, Dask-Kubernetes, and the new
Dask-Cloudprovider and Dask-CUDA libraries place them
all under the same &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.distributed.SpecCluster&lt;/code&gt; superclass. So we can expect a high degree of
uniformity from them. Additionally, all of the classes now match the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.distributed.Cluster&lt;/code&gt; interface, which standardizes things like
adaptivity, IPython widgets, logs, and some basic reporting.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Cluster
    &lt;ul&gt;
      &lt;li&gt;SpecCluster
        &lt;ul&gt;
          &lt;li&gt;Kubernetes&lt;/li&gt;
          &lt;li&gt;JobQueue (PBS/SLURM/LSF/SGE/Torque/Condor/Moab/OAR)&lt;/li&gt;
          &lt;li&gt;SSH&lt;/li&gt;
          &lt;li&gt;CloudProvider (ECS)&lt;/li&gt;
          &lt;li&gt;CUDA (LocalCUDACluster, DGX)&lt;/li&gt;
          &lt;li&gt;LocalCluster&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Yarn&lt;/li&gt;
      &lt;li&gt;Gateway&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;future-work&quot;&gt;Future Work&lt;/h2&gt;

&lt;p&gt;There is still plenty to do. Here are some of the themes we’ve seen among
current development:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Move the Scheduler off to a separate job/pod/container in the network,
which is often helpful for complex networking situations&lt;/li&gt;
  &lt;li&gt;Improve proxying of the dashboard in these situations&lt;/li&gt;
  &lt;li&gt;Optionally separate the life-cycle of the cluster from the lifetime of the
Python process that requested the cluster&lt;/li&gt;
  &lt;li&gt;Write up best practices how to compose GPU support generally with all of the cluster managers&lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>DataFrame Groupby Aggregations</title>
   <link href="https://blog.dask.org/2019/10/08/df-groupby"/>
   <updated>2019-10-08T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/10/08/df-groupby</id>
   
   <category>dask</category>
   
   <category>dataframe</category>
   
   <content type="html">
&lt;h2 id=&quot;groupby-aggregations-with-dask&quot;&gt;Groupby Aggregations with Dask&lt;/h2&gt;

&lt;p&gt;In this post we’ll dive into how Dask computes groupby aggregations. These are commonly used operations for ETL and analysis in which we split data into groups, apply a function to each group independently, and then combine the results back together. In the PyData/R world this is often referred to as the split-apply-combine strategy (first coined by &lt;a href=&quot;https://www.jstatsoft.org/article/view/v040i01&quot;&gt;Hadley Wickham&lt;/a&gt;) and is used widely throughout the &lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html&quot;&gt;Pandas ecosystem&lt;/a&gt;.&lt;/p&gt;

&lt;div align=&quot;center&quot;&gt;
  &lt;p&gt;&lt;a href=&quot;/images/split-apply-combine.png&quot;&gt;
    &lt;img src=&quot;/images/split-apply-combine.png&quot; width=&quot;80%&quot; align=&quot;center&quot; /&gt;
  &lt;/a&gt;&lt;/p&gt;
  &lt;p align=&quot;center&quot;&gt;&lt;i&gt;Image courtesy of swcarpentry.github.io&lt;/i&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Dask leverages this idea using a similarly catchy name: apply-concat-apply or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aca&lt;/code&gt; for short. Here we’ll explore the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aca&lt;/code&gt; strategy in both simple and complex operations.&lt;/p&gt;

&lt;p&gt;First, recall that a Dask DataFrame is a &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-design.html#internal-design&quot;&gt;collection&lt;/a&gt; of DataFrame objects (e.g. each &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-design.html#partitions&quot;&gt;partition&lt;/a&gt; of a Dask DataFrame is a Pandas DataFrame). For example, let’s say we have the following Pandas DataFrame:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;99&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;                        &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;                        &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;33&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;
     &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;99&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;33&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To create a Dask DataFrame with three partitions from this data, we could partition &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df&lt;/code&gt; between the indices of: (0, 4), (5, 9), and (10, 12). We can perform this partitioning with Dask by using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_pandas&lt;/code&gt; function with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npartitions=3&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The 3 partitions are simply 3 individual Pandas DataFrames:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;partitions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;apply-concat-apply&quot;&gt;Apply-concat-apply&lt;/h2&gt;

&lt;p&gt;When Dask applies a function and/or algorithm (e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mean&lt;/code&gt;, etc.) to a Dask DataFrame, it does so by applying that operation to all the constituent partitions independently, collecting (or concatenating) the outputs into intermediary results, and then applying the operation again to the intermediary results to produce a final result. Internally, Dask re-uses the same apply-concat-apply methodology for many of its internal DataFrame calculations.&lt;/p&gt;

&lt;p&gt;Let’s break down how Dask computes &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddf.groupby([&apos;a&apos;, &apos;b&apos;]).c.sum()&lt;/code&gt; by going through each step in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aca&lt;/code&gt; process. We’ll begin by splitting our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df&lt;/code&gt; Pandas DataFrame into three partitions:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df_1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df_2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df_3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;apply&quot;&gt;Apply&lt;/h3&gt;

&lt;p&gt;Next we perform the same &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;groupby([&apos;a&apos;, &apos;b&apos;]).c.sum()&lt;/code&gt; operation on each of our three partitions:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sr1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sr2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df_2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sr3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df_3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These operations each produce a Series with a &lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html&quot;&gt;MultiIndex&lt;/a&gt;:&lt;/p&gt;

&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;
      &lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; sr1
a  b
1  1     2
   3     4
2  10    5
3  2     3
   3     2
Name: c, dtype: int64
      &lt;/pre&gt;
    &lt;/th&gt;
    &lt;th&gt;
      &lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; sr2
a  b
1  1      5
   3      2
2  10     3
3  3     11
Name: c, dtype: int64
      &lt;/pre&gt;
    &lt;/th&gt;
    &lt;th&gt;
      &lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; sr3
a   b
1   9      2
10  0     33
99  12    44
Name: c, dtype: int64
      &lt;/pre&gt;
    &lt;/th&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;h3 id=&quot;the-concat&quot;&gt;The conCat!&lt;/h3&gt;

&lt;p&gt;After the first &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apply&lt;/code&gt;, the next step is to concatenate the intermediate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sr1&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sr2&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sr3&lt;/code&gt; results. This is fairly straightforward to do using the Pandas &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;concat&lt;/code&gt; function:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sr_concat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sr1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sr2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sr3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sr_concat&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;     &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;     &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;     &lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;      &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;     &lt;span class=&quot;mi&quot;&gt;33&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;99&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;44&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;apply-redux&quot;&gt;Apply Redux&lt;/h3&gt;

&lt;p&gt;Our final step is to apply the same &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;groupby([&apos;a&apos;, &apos;b&apos;]).c.sum()&lt;/code&gt; operation again on the concatenated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sr_concat&lt;/code&gt; Series. However we no longer have columns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;b&lt;/code&gt;, so how should we proceed?&lt;/p&gt;

&lt;p&gt;Zooming out a bit, our goal is to add the values in the column which have the same index. For example, there are two rows with the index &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(1, 1)&lt;/code&gt; with corresponding values: 2, 5. So how can we groupby the indices with the same value? A MutliIndex uses &lt;a href=&quot;https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.MultiIndex.html#pandas.MultiIndex&quot;&gt;levels&lt;/a&gt; to define what the value is at a give index. Dask &lt;a href=&quot;https://github.com/dask/dask/blob/973c6e1b2e38c2d9d6e8c75fb9b4ab7a0d07e6a7/dask/dataframe/groupby.py#L69-L75&quot;&gt;determines&lt;/a&gt; and &lt;a href=&quot;https://github.com/dask/dask/blob/973c6e1b2e38c2d9d6e8c75fb9b4ab7a0d07e6a7/dask/dataframe/groupby.py#L1065&quot;&gt;uses these levels&lt;/a&gt; in the final apply step of the apply-concat-apply calculation. In our case, the level is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[0, 1]&lt;/code&gt;, that is, we want both the index at the 0th level and the 1st level and if we group by both, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0, 1&lt;/code&gt;, we will have effectively grouped the same indices together:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sr_concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;level&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;
      &lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; total
a   b
1   1      7
    3      6
    9      2
2   10     8
3   2      3
    3     13
10  0     33
99  12    44
Name: c, dtype: int64
      &lt;/pre&gt;
    &lt;/th&gt;
    &lt;th&gt;
      &lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; ddf.groupby([&apos;a&apos;, &apos;b&apos;]).c.sum().compute()
a   b
1   1      7
    3      6
2   10     8
3   2      3
    3     13
1   9      2
10  0     33
99  12    44
Name: c, dtype: int64
      &lt;/pre&gt;
    &lt;/th&gt;
    &lt;th&gt;
      &lt;pre&gt;
&amp;gt;&amp;gt;&amp;gt; df.groupby([&apos;a&apos;, &apos;b&apos;]).c.sum()
a   b
1   1      7
    3      6
    9      2
2   10     8
3   2      3
    3     13
10  0     33
99  12    44
Name: c, dtype: int64
      &lt;/pre&gt;
    &lt;/th&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Additionally, we can easily examine the steps of this apply-concat-apply calculation by &lt;a href=&quot;https://docs.dask.org/en/latest/graphviz.html&quot;&gt;visualizing the task graph&lt;/a&gt; for the computation:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/images/sum.svg&quot;&gt;
  &lt;img src=&quot;/images/sum.svg&quot; width=&quot;80%&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum&lt;/code&gt; is rather a straight-forward calculation. What about something a bit more complex like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mean&lt;/code&gt;?&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/images/mean.svg&quot;&gt;
  &lt;img src=&quot;/images/mean.svg&quot; width=&quot;80%&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Mean&lt;/code&gt; is a good example of an operation which doesn’t directly fit in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aca&lt;/code&gt; model – concatenating &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mean&lt;/code&gt; values and taking the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mean&lt;/code&gt; again will yield incorrect results. Like any style of computation: vectorization, Map/Reduce, etc., we sometime need to creatively fit the computation to the style/mode. In the case of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aca&lt;/code&gt; we can often break down the calculation into constituent parts. For &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mean&lt;/code&gt;, this would be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;count&lt;/code&gt;:&lt;/p&gt;

\[\bar{x} = \frac{x_1+x_2+\cdots +x_n}{n}\]

&lt;p&gt;From the task graph above, we can see that two independent tasks for each partition: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;series-groupby-count-chunk&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;series-groupby-sum-chunk&lt;/code&gt;. The results are then aggregated into two final nodes: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;series-groupby-count-agg&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;series-groupby-sum-agg&lt;/code&gt; and then we finally calculate the mean: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;total sum / total count&lt;/code&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Better and faster hyperparameter optimization with Dask</title>
   <link href="https://blog.dask.org/2019/09/30/dask-hyperparam-opt"/>
   <updated>2019-09-30T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/09/30/dask-hyperparam-opt</id>
   
   <category>machine-learning</category>
   
   <category>dask-ml</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://stsievert.com&quot;&gt;Scott Sievert&lt;/a&gt; wrote this post. The original post lives at
&lt;a href=&quot;https://stsievert.com/blog/2019/09/27/dask-hyperparam-opt/&quot;&gt;https://stsievert.com/blog/2019/09/27/dask-hyperparam-opt/&lt;/a&gt; with better
styling. This work is supported by Anaconda, Inc.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://dask.org&quot;&gt;Dask&lt;/a&gt;’s machine learning package, &lt;a href=&quot;https://ml.dask.org/&quot;&gt;Dask-ML&lt;/a&gt; now implements Hyperband, an
advanced “hyperparameter optimization” algorithm that performs rather well.
This post will&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;describe “hyperparameter optimization”, a common problem in machine learning&lt;/li&gt;
  &lt;li&gt;describe Hyperband’s benefits and why it works&lt;/li&gt;
  &lt;li&gt;show how to use Hyperband via example alongside performance comparisons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this post, I’ll walk through a practical example and highlight key portions
of the paper “&lt;a href=&quot;http://conference.scipy.org/proceedings/scipy2019/pdfs/scott_sievert.pdf&quot;&gt;Better and faster hyperparameter optimization with Dask&lt;/a&gt;”, which is also
summarized in a &lt;a href=&quot;https://www.youtube.com/watch?v=x67K9FiPFBQ&quot;&gt;~25 minute SciPy 2019 talk&lt;/a&gt;.&lt;/p&gt;

&lt;!--More--&gt;

&lt;h2 id=&quot;problem&quot;&gt;Problem&lt;/h2&gt;

&lt;p&gt;Machine learning requires data, an untrained model and “hyperparameters”, parameters that are chosen before training begins that
help with cohesion between the model and data. The user needs to specify values
for these hyperparameters in order to use the model. A good example is
adapting ridge regression or LASSO to the amount of noise in the
data with the regularization parameter.&lt;sup id=&quot;fnref:alpha&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:alpha&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Model performance strongly depends on the hyperparameters provided. A fairly complex example is with a particular
visualization tool, &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html&quot;&gt;t-SNE&lt;/a&gt;. This tool requires (at least) three
hyperparameters and performance depends radically on the hyperparameters. In fact, the first section in “&lt;a href=&quot;https://distill.pub/2016/misread-tsne/&quot;&gt;How to Use t-SNE
Effectively&lt;/a&gt;” is titled “Those hyperparameters really matter”.&lt;/p&gt;

&lt;p&gt;Finding good values for these hyperparameters is critical and has an entire
Scikit-learn documentation page, “&lt;a href=&quot;http://scikit-learn.org/stable/modules/grid_search.html&quot;&gt;Tuning the hyperparameters of an
estimator&lt;/a&gt;.” Briefly, finding decent values of hyperparameters
is difficult and requires guessing or searching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How can these hyperparameters be found quickly and efficiently with an
advanced task scheduler like Dask?&lt;/strong&gt; Parallelism will pose some challenges, but
the Dask architecture enables some advanced algorithms.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: this post presumes knowledge of Dask basics. This material is covered in
Dask’s documentation on &lt;a href=&quot;https://docs.dask.org/en/latest/why.html&quot;&gt;Why Dask?&lt;/a&gt;, a ~15 minute &lt;a href=&quot;https://www.youtube.com/watch?v=ods97a5Pzw0&quot;&gt;video introduction to
Dask&lt;/a&gt;, a &lt;a href=&quot;https://www.youtube.com/watch?v=tQBovBvSDvA&quot;&gt;video introduction to Dask-ML&lt;/a&gt; and &lt;a href=&quot;https://stsievert.com/blog/2016/09/09/dask-cluster/&quot;&gt;a
blog post I wrote&lt;/a&gt; on my first use of Dask.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;contributions&quot;&gt;Contributions&lt;/h2&gt;

&lt;p&gt;Dask-ML can quickly find high-performing hyperparameters. I will back this
claim with intuition and experimental evidence.&lt;/p&gt;

&lt;p&gt;Specifically, this is because
Dask-ML now
implements an algorithm introduced by Li et. al. in “&lt;a href=&quot;https://arxiv.org/pdf/1603.06560.pdf&quot;&gt;Hyperband: A novel
bandit-based approach to hyperparameter optimization&lt;/a&gt;”.
Pairing of Dask and Hyperband enables some exciting new performance opportunities,
especially because Hyperband has a simple implementation and Dask is an
advanced task scheduler.&lt;sup id=&quot;fnref:first&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:first&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Let’s go
through the basics of Hyperband then illustrate its use and performance with
an example.
This will highlight some key points of &lt;a href=&quot;http://conference.scipy.org/proceedings/scipy2019/pdfs/scott_sievert.pdf&quot;&gt;the corresponding paper&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;hyperband-basics&quot;&gt;Hyperband basics&lt;/h2&gt;

&lt;p&gt;The motivation for Hyperband is to find high performing hyperparameters with minimal
training. Given this goal, it makes sense to spend more time training high
performing models – why waste more time training time a model if it’s done poorly in the past?&lt;/p&gt;

&lt;p&gt;One method to spend more time on high performing models is to initialize many
models, start training all of them, and then stop training low performing models
before training is finished. That’s what Hyperband does. At the most basic
level, Hyperband is a (principled) early-stopping scheme for
&lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html&quot;&gt;RandomizedSearchCV&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Deciding when to stop the training of models depends on how strongly
the training data effects the score. There are two extremes:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;when only the training data matter
    &lt;ul&gt;
      &lt;li&gt;i.e., when the hyperparameters don’t influence the score at all&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;when only the hyperparameters matter
    &lt;ul&gt;
      &lt;li&gt;i.e., when the training data don’t influence the score at all&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hyperband balances these two extremes by sweeping over how frequently
models are stopped. This sweep allows a mathematical proof that Hyperband
will find the best model possible with minimal &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt;
calls&lt;sup id=&quot;fnref:qual&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:qual&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Hyperband has significant parallelism because it has two “embarrassingly
parallel” for-loops – Dask can exploit this. Hyperband has been implemented
in Dask, specifically in Dask’s machine library Dask-ML.&lt;/p&gt;

&lt;p&gt;How well does it perform? Let’s illustrate via example. Some setup is required
before the performance comparison in &lt;em&gt;&lt;a href=&quot;#performance&quot;&gt;Performance&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;example&quot;&gt;Example&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Note: want to try &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; out yourself? Dask has &lt;a href=&quot;https://examples.dask.org/machine-learning/hyperparam-opt.html&quot;&gt;an example use&lt;/a&gt;.
It can even be run in-browser!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’ll illustrate with a synthetic example. Let’s build a dataset with 4 classes:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;experiment&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_circles&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_circles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_classes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_informative&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-hyperband/synthetic/dataset.png&quot; style=&quot;max-width: 100%;&quot; width=&quot;200px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: this content is pulled from
&lt;a href=&quot;https://github.com/stsievert/dask-hyperband-comparison&quot;&gt;stsievert/dask-hyperband-comparison&lt;/a&gt;, or makes slight modifications.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s build a fully connected neural net with 24 neurons for classification:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.neural_network&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MLPClassifier&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MLPClassifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Building the neural net with PyTorch is also possible&lt;sup id=&quot;fnref:skorch&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:skorch&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; (and what I used in development).&lt;/p&gt;

&lt;p&gt;This neural net’s behavior is dictated by 6 hyperparameters. Only one controls
the model of the optimal architecture (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hidden_layer_sizes&lt;/code&gt;, the number of
neurons in each layer). The rest control finding the best model of that
architecture. Details on the hyperparameters are in the
&lt;em&gt;&lt;a href=&quot;#appendix&quot;&gt;Appendix&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# details in appendix
&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dict_keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;hidden_layer_sizes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;alpha&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;batch_size&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;learning_rate&apos;&lt;/span&gt;
           &lt;span class=&quot;s&quot;&gt;&apos;learning_rate_init&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;power_t&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;momentum&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hidden_layer_sizes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# always 24 neurons
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I choose these hyperparameters to have a complex search space that mimics the
searches performed for most neural networks. These searches typically involve
hyperparameters like “dropout”, “learning rate”, “momentum” and “weight
decay”.&lt;sup id=&quot;fnref:user-facing&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:user-facing&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;
End users don’t care hyperparameters like these; they don’t change the
model architecture, only finding the best model of a particular architecture.&lt;/p&gt;

&lt;p&gt;How can high performing hyperparameter values be found quickly?&lt;/p&gt;

&lt;h2 id=&quot;finding-the-best-parameters&quot;&gt;Finding the best parameters&lt;/h2&gt;

&lt;p&gt;First, let’s look at the parameters required for Dask-ML’s implementation
of Hyperband (which is in the class &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt;).&lt;/p&gt;

&lt;h3 id=&quot;hyperband-parameters-rule-of-thumb&quot;&gt;Hyperband parameters: rule-of-thumb&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; has two inputs:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;max_iter&lt;/code&gt;, which determines how many times to call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;the chunk size of the Dask array, which determines how many data each
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt; call receives.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These fall out pretty naturally once it’s known how long to train the best
model and very approximately how many parameters to sample:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;n_examples&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 50 passes through dataset for best model
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;299&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# sample about 300 parameters
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# inputs to hyperband
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_params&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;chunk_size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_examples&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_params&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The inputs to this rule-of-thumb are exactly what the user cares about:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;a measure of how complex the search space is (via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n_params&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;how long to train the best model (via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n_examples&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notably, there’s no tradeoff between &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n_examples&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n_params&lt;/code&gt; like with
Scikit-learn’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomizedSearchCV&lt;/code&gt; because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n_examples&lt;/code&gt; is only for &lt;em&gt;some&lt;/em&gt;
models, not for &lt;em&gt;all&lt;/em&gt; models. There’s more details on this
rule-of-thumb in the “Notes” section of the &lt;a href=&quot;https://ml.dask.org/modules/generated/dask_ml.model_selection.HyperbandSearchCV.html#dask_ml.model_selection.HyperbandSearchCV&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt;
docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With these inputs a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; object can easily be created.&lt;/p&gt;

&lt;h3 id=&quot;finding-the-best-performing-hyperparameters&quot;&gt;Finding the best performing hyperparameters&lt;/h3&gt;

&lt;p&gt;This model selection algorithm Hyperband is implemented in the class
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt;. Let’s create an instance of that class:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_ml.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;aggressiveness&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aggressiveness&lt;/code&gt; defaults to 3. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aggressiveness=4&lt;/code&gt; is chosen because this is an
&lt;em&gt;initial&lt;/em&gt; search; I know nothing about how this search space. Then, this search
should be more aggressive in culling off bad models.&lt;/p&gt;

&lt;p&gt;Hyperband hides some details from the user (which enables the mathematical
guarantees), specifically the details on the amount of training and
the number of models created. These details are available in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata&lt;/code&gt;
attribute:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;n_models&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;378&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;partial_fit_calls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5721&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now that we have some idea on how long the computation will take, let’s ask it
to find the best set of hyperparameters:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_ml.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;train_test_split&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X_test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_test&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;train_test_split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rechunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rechunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The dashboard will be active during this time&lt;sup id=&quot;fnref:dashboard&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:dashboard&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;

&lt;p&gt;
&lt;video width=&quot;600&quot; style=&quot;max-width: 100%;&quot; autoplay=&quot;&quot; loop=&quot;&quot; controls=&quot;&quot;&gt;
  &lt;source src=&quot;/images/2019-hyperband/dashboard-compress.mp4&quot; type=&quot;video/mp4&quot; /&gt;
  Your browser does not support the video tag.
&lt;/video&gt;
&lt;/p&gt;

&lt;p&gt;How well do these hyperparameters perform?&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;best_score_&lt;/span&gt;
&lt;span class=&quot;mf&quot;&gt;0.9019221418447483&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; mirrors Scikit-learn’s API for &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html&quot;&gt;RandomizedSearchCV&lt;/a&gt;, so it
has access to all the expected attributes and methods:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;best_params_&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;batch_size&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;hidden_layer_sizes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;score&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;mf&quot;&gt;0.8989070100111217&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;best_model_&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MLPClassifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Details on the attributes and methods are in the &lt;a href=&quot;https://ml.dask.org/modules/generated/dask_ml.model_selection.HyperbandSearchCV.html&quot;&gt;HyperbandSearchCV
documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;

&lt;!--
Plot 1: how well does it do?
Plot 2: how does this scale?
Plot 3: what opportunities does Dask enable?
--&gt;

&lt;p&gt;I ran this 200 times on my personal laptop with 4 cores.
Let’s look at the distribution of final validation scores:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-hyperband/synthetic/final-acc.svg&quot; style=&quot;max-width: 100%;&quot; width=&quot;400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The “passive” comparison is really &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomizedSearchCV&lt;/code&gt; configured so it takes
an equal amount of work as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt;. Let’s see how this does over
time:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-hyperband/synthetic/val-acc.svg&quot; style=&quot;max-width: 100%;&quot; width=&quot;400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This graph shows the mean score over the 200 runs with the solid line, and the
shaded region represents the &lt;a href=&quot;https://en.wikipedia.org/wiki/Interquartile_range&quot;&gt;interquartile range&lt;/a&gt;. The dotted green
line indicates the data required to train 4 models to completion.
“Passes through the dataset” is a good proxy
for “time to solution” because there are only 4 workers.&lt;/p&gt;

&lt;p&gt;This graph shows that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; will find parameters at least 3 times
quicker than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomizedSearchCV&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;dask-opportunities&quot;&gt;Dask opportunities&lt;/h3&gt;

&lt;p&gt;What opportunities does combining Hyperband and Dask create?
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; has a lot of internal parallelism and Dask is an advanced task
scheduler.&lt;/p&gt;

&lt;p&gt;The most obvious opportunity involves job prioritization. Hyperband fits many
models in parallel and Dask might not have that
workers available. This means some jobs have to wait for other jobs
to finish. Of course, Dask can prioritize jobs&lt;sup id=&quot;fnref:prior&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:prior&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;7&lt;/a&gt;&lt;/sup&gt; and choose which models
to fit first.&lt;/p&gt;

&lt;p&gt;Let’s assign the priority for fitting a certain model to be the model’s most
recent score. How does this prioritization scheme influence the score? Let’s
compare the prioritization schemes in
a single run of the 200 above:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-hyperband/synthetic/priority.svg&quot; style=&quot;max-width: 100%;&quot; width=&quot;400px&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These two lines are the same in every way except for
the prioritization scheme.
This graph compares the “high scores” prioritization scheme and the Dask’s
default prioritization scheme (“fifo”).&lt;/p&gt;

&lt;p&gt;This graph is certainly helped by the fact that is run with only 4 workers.
Job priority does not matter if every job can be run right away (there’s
nothing to assign priority too!).&lt;/p&gt;

&lt;h3 id=&quot;amenability-to-parallelism&quot;&gt;Amenability to parallelism&lt;/h3&gt;

&lt;p&gt;How does Hyperband scale with the number of workers?&lt;/p&gt;

&lt;p&gt;I ran another separate experiment to measure. This experiment is described more in the &lt;a href=&quot;http://conference.scipy.org/proceedings/scipy2019/pdfs/scott_sievert.pdf&quot;&gt;corresponding
paper&lt;/a&gt;, but the relevant difference is that a &lt;a href=&quot;https://pytorch.org/&quot;&gt;PyTorch&lt;/a&gt; neural network is used
through &lt;a href=&quot;https://skorch.readthedocs.io/en/stable/&quot;&gt;skorch&lt;/a&gt; instead of Scikit-learn’s MLPClassifier.&lt;/p&gt;

&lt;p&gt;I ran the &lt;em&gt;same&lt;/em&gt; experiment with a different number of Dask
workers.&lt;sup id=&quot;fnref:same&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:same&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;8&lt;/a&gt;&lt;/sup&gt; Here’s how &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; scales:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2019-hyperband/image-denoising/scaling-patience.svg&quot; width=&quot;400px&quot; style=&quot;max-width: 100%;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Training one model to completion requires 243 seconds (which is marked by the
white line). This is a comparison with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;patience&lt;/code&gt;, which stops training models
if their scores aren’t increasing enough. Functionally, this is very useful
because the user might accidentally specify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n_examples&lt;/code&gt; to be too large.&lt;/p&gt;

&lt;p&gt;It looks like the speedups start to saturate somewhere
between 16 and 24 workers, at least for this example.
Of course, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;patience&lt;/code&gt; doesn’t work as well for a large number of
workers.&lt;sup id=&quot;fnref:scale-worker&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:scale-worker&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;9&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h2 id=&quot;future-work&quot;&gt;Future work&lt;/h2&gt;

&lt;p&gt;There’s some ongoing pull requests to improve &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt;. The most
significant of these involves tweaking some Hyperband internals so &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt;
works better with initial or very exploratory searches (&lt;a href=&quot;https://github.com/dask/dask-ml/pull/532&quot;&gt;dask/dask-ml #532&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The biggest improvement I see is treating &lt;em&gt;dataset size&lt;/em&gt; as the scarce resource
that needs to be preserved instead of &lt;em&gt;training time&lt;/em&gt;. This would allow
Hyperband to work with any model, instead of only models that implement
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Serialization is an important part of the distributed Hyperband implementation
in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt;. Scikit-learn and PyTorch can easily handle this because
they support the Pickle protocol&lt;sup id=&quot;fnref:pickle-post&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:pickle-post&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;10&lt;/a&gt;&lt;/sup&gt;, but
Keras/Tensorflow/MXNet present challenges. The use of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperbandSearchCV&lt;/code&gt; could
be increased by resolving this issue.&lt;/p&gt;

&lt;h2 id=&quot;appendix&quot;&gt;Appendix&lt;/h2&gt;

&lt;p&gt;I choose to tune 7 hyperparameters, which are&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hidden_layer_sizes&lt;/code&gt;, which controls the activation function used at each
neuron&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;alpha&lt;/code&gt;, which controls the amount of regularization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More hyperparameters control finding the best neural network:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;batch_size&lt;/code&gt;, which controls the number of examples the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;optimizer&lt;/code&gt; uses to
approximate the gradient&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;learning_rate&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;learning_rate_init&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;power_t&lt;/code&gt;, which control some basic
hyperparameters for the SGD optimizer I’ll be using&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;momentum&lt;/code&gt;, a more advanced hyperparameter for SGD with Nesterov’s momentum.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:alpha&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Which amounts to choosing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;alpha&lt;/code&gt; in Scikit-learn’s &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html&quot;&gt;Ridge&lt;/a&gt; or &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Lasso.html&quot;&gt;LASSO&lt;/a&gt; &lt;a href=&quot;#fnref:alpha&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:first&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;To the best of my knowledge, this is the first implementation of Hyperband with an advanced task scheduler &lt;a href=&quot;#fnref:first&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:qual&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;More accurately, Hyperband will find close to the best model possible with $N$ &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt; calls in expected score with high probability, where “close” means “within log terms of the upper bound on score”. For details, see Corollary 1 of the &lt;a href=&quot;http://conference.scipy.org/proceedings/scipy2019/pdfs/scott_sievert.pdf&quot;&gt;corresponding paper&lt;/a&gt; or Theorem 5 of &lt;a href=&quot;https://arxiv.org/pdf/1603.06560.pdf&quot;&gt;Hyperband’s paper&lt;/a&gt;. &lt;a href=&quot;#fnref:qual&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:skorch&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;through the Scikit-learn API wrapper &lt;a href=&quot;https://skorch.readthedocs.io/en/stable/&quot;&gt;skorch&lt;/a&gt; &lt;a href=&quot;#fnref:skorch&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:user-facing&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;There’s less tuning for adaptive step size methods like &lt;a href=&quot;https://arxiv.org/abs/1412.6980&quot;&gt;Adam&lt;/a&gt; or &lt;a href=&quot;http://jmlr.org/papers/v12/duchi11a.html&quot;&gt;Adagrad&lt;/a&gt;, but they might under-perform on the test data (see “&lt;a href=&quot;https://arxiv.org/abs/1705.08292&quot;&gt;The Marginal Value of Adaptive Gradient Methods for Machine Learning&lt;/a&gt;”) &lt;a href=&quot;#fnref:user-facing&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:dashboard&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;But it probably won’t be this fast: the video is sped up by a factor of 3. &lt;a href=&quot;#fnref:dashboard&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:prior&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;See Dask’s documentation on &lt;a href=&quot;https://distributed.dask.org/en/latest/priority.html&quot;&gt;Prioritizing Work&lt;/a&gt; &lt;a href=&quot;#fnref:prior&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:same&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Everything is the same between different runs: the hyperparameters sampled, the model’s internal random state, the data passed for fitting. Only the number of workers varies. &lt;a href=&quot;#fnref:same&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:scale-worker&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;There’s no time benefit to stopping jobs early if there are infinite workers; there’s never a queue of jobs waiting to be run &lt;a href=&quot;#fnref:scale-worker&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:pickle-post&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;“&lt;a href=&quot;http://matthewrocklin.com/blog/work/2018/07/23/protocols-pickle&quot;&gt;Pickle isn’t slow, it’s a protocol&lt;/a&gt;” by Matthew Rocklin &lt;a href=&quot;#fnref:pickle-post&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Co-locating a Jupyter Server and Dask Scheduler</title>
   <link href="https://blog.dask.org/2019/09/13/jupyter-on-dask"/>
   <updated>2019-09-13T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/09/13/jupyter-on-dask</id>
   
   <category>HPC</category>
   
   <content type="html">
&lt;p&gt;If you want, you can have Dask set up a Jupyter notebook server for you,
co-located with the Dask scheduler. There are many ways to do this, but this
blog post lists two.&lt;/p&gt;

&lt;h3 id=&quot;first-why-would-you-do-this&quot;&gt;First, why would you do this?&lt;/h3&gt;

&lt;p&gt;Sometimes people inside of large institutions have complex deployment pains.
It takes them a while to stand up a process running on a machine in their
cluster, with all of the appropriate networking ports open and such.
In that situation, it can sometimes be nice to do this just once, say for Dask,
rather than twice, say for Dask and for Jupyter.&lt;/p&gt;

&lt;p&gt;Probably in these cases people should invest in a long term solution like
&lt;a href=&quot;https://jupyter.org/hub&quot;&gt;JupyterHub&lt;/a&gt;,
or one of its enterprise variants,
but this blogpost gives a couple of hacks in the meantime.&lt;/p&gt;

&lt;h3 id=&quot;hack-1-create-a-jupyter-server-from-a-python-function-call&quot;&gt;Hack 1: Create a Jupyter server from a Python function call&lt;/h3&gt;

&lt;p&gt;If your Dask scheduler is already running, connect to it with a Client and run
a Python function that starts up a Jupyter server.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;scheduler-address:8786&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;start_juptyer_server&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;notebook.notebookapp&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NotebookApp&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NotebookApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([])&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# add command line args here if you want
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run_on_scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start_jupyter_server&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you have a complex networking setup (maybe you’re on the cloud or HPC and
had to open up a port explicitly) then you might want to install
&lt;a href=&quot;https://jupyter-server-proxy.readthedocs.io/en/latest/&quot;&gt;jupyter-server-proxy&lt;/a&gt;
(which Dask also uses by default if installed), and then go to
&lt;a href=&quot;https://example.com&quot;&gt;http://scheduler-address:8787/proxy/8888&lt;/a&gt; . The Dask dashboard can route your
connection to Jupyter (Jupyter is also kind enough to do the same for Dask if
it is the main service).&lt;/p&gt;

&lt;h3 id=&quot;hack-2-preload-script&quot;&gt;Hack 2: Preload script&lt;/h3&gt;

&lt;p&gt;This is also a great opportunity to learn about the various ways of &lt;a href=&quot;https://docs.dask.org/en/latest/setup/custom-startup.html&quot;&gt;adding
custom startup and teardown&lt;/a&gt;.
One such way, is a preload script like the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# jupyter-preload.py
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;notebook.notebookapp&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NotebookApp&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;dask_setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NotebookApp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dask-scheduler &lt;span class=&quot;nt&quot;&gt;--preload&lt;/span&gt; jupyter-preload.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That script will run at an appropriate time during scheduler startup. You can
also put this into configuration&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;distributed&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;preload&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/path/to/jupyter-preload.py&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;really-though-you-should-use-something-else&quot;&gt;Really though, you should use something else&lt;/h3&gt;

&lt;p&gt;This is mostly a hack. If you’re at an institution then you should ask for
something like &lt;a href=&quot;https://jupyter.org/hub&quot;&gt;JuptyerHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Or, you might also want to run this in a separate subprocess, so that Jupyter
and the Dask scheduler don’t collide with each other. This shouldn’t be so
much of a problem (they’re both pretty light weight), but isolating them
probably makes sense.&lt;/p&gt;

&lt;h3 id=&quot;thanks-nick&quot;&gt;Thanks Nick!&lt;/h3&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/bollwyvl&quot;&gt;Nick Bollweg&lt;/a&gt;, who answered a &lt;a href=&quot;https://github.com/jupyter/notebook/issues/4873&quot;&gt;questions on this topic here&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask on HPC: a case study</title>
   <link href="https://blog.dask.org/2019/08/28/dask-on-summit"/>
   <updated>2019-08-28T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/08/28/dask-on-summit</id>
   
   <category>HPC</category>
   
   <content type="html">
&lt;p&gt;Dask is deployed on traditional HPC machines with increasing frequency.
In the past week I’ve personally helped four different groups get set up.
This is a surprisingly individual process,
because every HPC machine has its own idiosyncrasies.
Each machine uses a job scheduler like SLURM/PBS/SGE/LSF/…, a network file
system, and fast interconnect, but each of those sub-systems have slightly
different policies on a machine-by-machine basis, which is where things get tricky.&lt;/p&gt;

&lt;p&gt;Typically we can solve these problems in about 30 minutes if we have both:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Someone familiar with the machine, like a power-user or an IT administrator&lt;/li&gt;
  &lt;li&gt;Someone familiar with setting up Dask&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These systems span a large range of scale. At different ends of this scale
this week I’ve seen both:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A small in-house 24-node SLURM cluster for research work inside of a
bio-imaging lab&lt;/li&gt;
  &lt;li&gt;Summit, the world’s most powerful supercomputer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this post I’m going to share a few notes of what I went through in dealing
with Summit, which was particularly troublesome. Hopefully this gives a sense
for the kinds of situations that arise. These tips likely don’t apply to your
particular system, but hopefully they give a flavor of what can go wrong,
and the processes by which we track things down.&lt;/p&gt;

&lt;h3 id=&quot;power-architecture&quot;&gt;Power Architecture&lt;/h3&gt;

&lt;p&gt;First, Summit is an IBM PowerPC machine, meaning that packages compiled on
normal Intel chips won’t work. Fortunately, Anaconda maintains a download of
their distribution that works well with the Power architecture, so that gave me
a good starting point.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.anaconda.com/distribution/#linux&quot;&gt;https://www.anaconda.com/distribution/#linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Packages do seem to be a few months older than for the normal distribution, but
I can live with that.&lt;/p&gt;

&lt;h3 id=&quot;install-dask-jobqueue-and-configure-basic-information&quot;&gt;Install Dask-Jobqueue and configure basic information&lt;/h3&gt;

&lt;p&gt;We need to tell Dask how many cores and how much memory is on each machine.
This process is fairly straightforward, is well documented at
&lt;a href=&quot;https://jobqueue.dask.org&quot;&gt;jobqueue.dask.org&lt;/a&gt; with an informative screencast,
and even self-directing with error messages.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_jobqueue&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PBSCluster&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PBSCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;ValueError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;You&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;must&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;specify&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;how&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;many&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;per&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;job&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;like&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;``&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;``&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I’m going to skip this section for now because, generally, novice users are
able to handle this. For more information, consider watching this YouTube
video (30m).&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/FXsgmwpRExM?rel=0&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h3 id=&quot;invalid-operations-in-the-job-script&quot;&gt;Invalid operations in the job script&lt;/h3&gt;

&lt;p&gt;So we make a cluster object with all of our information, we call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.scale&lt;/code&gt; and
we get some error message from the job scheduler.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_jobqueue&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LSFCluster&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LSFCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;600 GB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;GEN119&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;walltime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;00:30&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# ask for three nodes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Command:
bsub /tmp/tmp4874eufw.sh
stdout:

Typical usage:
  bsub [LSF arguments] jobscript
  bsub [LSF arguments] -Is $SHELL
  bsub -h[elp] [options]
  bsub -V

NOTES:
 * All jobs must specify a walltime (-W) and project id (-P)
 * Standard jobs must specify a node count (-nnodes) or -ln_slots. These jobs cannot specify a resource string (-R).
 * Expert mode jobs (-csm y) must specify a resource string and cannot specify -nnodes or -ln_slots.

stderr:
ERROR: Resource strings (-R) are not supported in easy mode. Please resubmit without a resource string.
ERROR: -n is no longer supported. Please request nodes with -nnodes.
ERROR: No nodes requested. Please request nodes with -nnodes.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dask-Jobqueue tried to generate a sensible job script from the inputs that you
provided, but the resource manager that you’re using may have additional
policies that are unique to that cluster. We debug this by looking at the
generated script, and comparing against scripts that are known to work on the
HPC machine.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;job_script&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;#BSUB -J dask-worker&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#BSUB -P GEN119&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#BSUB -n 128&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#BSUB -R &quot;span[hosts=1]&quot;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#BSUB -M 600000&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#BSUB -W 00:30&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;JOB_ID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;LSB_JOBID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%.*&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;

/ccs/home/mrocklin/anaconda/bin/python &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; distributed.cli.dask_worker tcp://scheduler:8786 &lt;span class=&quot;nt&quot;&gt;--nthreads&lt;/span&gt; 16 &lt;span class=&quot;nt&quot;&gt;--nprocs&lt;/span&gt; 8 &lt;span class=&quot;nt&quot;&gt;--memory-limit&lt;/span&gt; 75.00GB &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; name &lt;span class=&quot;nt&quot;&gt;--nanny&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--death-timeout&lt;/span&gt; 60 &lt;span class=&quot;nt&quot;&gt;--interface&lt;/span&gt; ib0 &lt;span class=&quot;nt&quot;&gt;--interface&lt;/span&gt; ib0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After comparing notes with existing scripts that we know to work on Summit,
we modify keywords to add and remove certain lines in the header.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LSFCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;500 GB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;GEN119&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;walltime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;00:30&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;job_extra&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;-nnodes 1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# &amp;lt;--- new!
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;header_skip&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;-R&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;-n &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;-M&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# &amp;lt;--- new!
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And when we call scale this seems to make LSF happy. It no longer dumps out
large error messages.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# things seem to pass
&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;workers-dont-connect-to-the-scheduler&quot;&gt;Workers don’t connect to the Scheduler&lt;/h3&gt;

&lt;p&gt;So things seem fine from LSF’s perspective, but when we connect up a client to
our cluster we don’t see anything arriving.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;tcp://10.41.0.34:41107&apos;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;processes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Two things to check, have the jobs actually made it through the queue?
Typically we use a resource manager operation, like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;qstat&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;squeue&lt;/code&gt;, or
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bjobs&lt;/code&gt; for this. Maybe our jobs are trapped in the queue?&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ bash
JOBID   USER       STAT   SLOTS    QUEUE       START_TIME    FINISH_TIME   JOB_NAME
600785  mrocklin   RUN    43       batch       Aug 26 13:11  Aug 26 13:41  dask-worker
600786  mrocklin   RUN    43       batch       Aug 26 13:11  Aug 26 13:41  dask-worker
600784  mrocklin   RUN    43       batch       Aug 26 13:11  Aug 26 13:41  dask-worker
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nope, it looks like they’re in a running state. Now we go and look at their
logs. It can sometimes be tricky to track down the log files from your jobs,
but your IT administrator should know where they are. Often they’re where you
ran your job from, and have the Job ID in the filename.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ cat dask-worker.600784.err
distributed.worker - INFO -       Start worker at: tcp://128.219.134.81:44053
distributed.worker - INFO -          Listening to: tcp://128.219.134.81:44053
distributed.worker - INFO -          dashboard at:       128.219.134.81:34583
distributed.worker - INFO - Waiting to connect to: tcp://128.219.134.74:34153
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -               Threads:                         16
distributed.worker - INFO -                Memory:                   75.00 GB
distributed.worker - INFO -       Local Directory: /autofs/nccs-svm1_home1/mrocklin/worker-ybnhk4ib
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO - Waiting to connect to: tcp://128.219.134.74:34153
distributed.worker - INFO - Waiting to connect to: tcp://128.219.134.74:34153
distributed.worker - INFO - Waiting to connect to: tcp://128.219.134.74:34153
distributed.worker - INFO - Waiting to connect to: tcp://128.219.134.74:34153
distributed.worker - INFO - Waiting to connect to: tcp://128.219.134.74:34153
distributed.worker - INFO - Waiting to connect to: tcp://128.219.134.74:34153
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So the worker processes have started, but they’re having difficulty connecting
to the scheduler. When we ask at IT administrator they identify the address
here as on the wrong network interface:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;128.219.134.74  &amp;lt;--- not accessible network address
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So we run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ifconfig&lt;/code&gt;, and find the infiniband network interface, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ib0&lt;/code&gt;, which
is more broadly accessible.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LSFCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;500 GB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;GEN119&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;walltime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;00:30&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;job_extra&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;-nnodes 1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;header_skip&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;-R&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;-n &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;-M&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ib0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;                    &lt;span class=&quot;c1&quot;&gt;# &amp;lt;--- new!
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We try this out and still, no luck :(&lt;/p&gt;

&lt;h3 id=&quot;interactive-nodes&quot;&gt;Interactive nodes&lt;/h3&gt;

&lt;p&gt;The expert user then says “Oh, our login nodes are pretty locked-down, lets try
this from an interactive compute node. Things tend to work better there”. We
run some arcane bash command (I’ve never seen two of these that look alike so
I’m going to omit it here), and things magically start working. Hooray!&lt;/p&gt;

&lt;p&gt;We run a tiny Dask computation just to prove that we can do some work.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Actually, it turns out that we were eventually able to get things running from
the login nodes on Summit using a slightly different &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bsub&lt;/code&gt; command in LSF, but
I’m going to omit details here because we’re fixing this in Dask and it’s
unlikely to affect future users (I hope?). Locked down login nodes remain a
common cause of no connections across a variety of systems. I’ll say something
like 30% of the systems that I interact with.&lt;/p&gt;

&lt;h3 id=&quot;ssh-tunneling&quot;&gt;SSH Tunneling&lt;/h3&gt;

&lt;p&gt;It’s important to get the dashboard up and running so that you can see what’s
going on. Typically we do this with SSH tunnelling. Most HPC people know how
to do this and it’s covered in the Youtube screencast above, so I’m going to
skip it here.&lt;/p&gt;

&lt;h3 id=&quot;jupyter-lab&quot;&gt;Jupyter Lab&lt;/h3&gt;

&lt;p&gt;Many interactive Dask users on HPC today are moving towards using JupyterLab.
This choice gives them a notebook, terminals, file browser, and Dask’s
dashboard all in a single web tab. This greatly reduces the number of times
they have to SSH in, and, with the magic of web proxies, means that they only
need to tunnel once.&lt;/p&gt;

&lt;p&gt;I conda installed JupyterLab and a proxy library, and then tried to
&lt;a href=&quot;https://github.com/dask/dask-labextension#installation&quot;&gt;set up the Dask JupyterLab extension&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install jupyterlab
pip install jupyter-server-proxy  # to route dashboard through Jupyter&apos;s port
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next, we’re going to install the
&lt;a href=&quot;https://github.com/dask/dask-labextension&quot;&gt;Dask Labextension&lt;/a&gt; into JupyterLab
in order to get the Dask Dashboard directly into our Jupyter session..
For that, we need &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nodejs&lt;/code&gt; in order to install things into JupyterLab.
I thought that this was going to be a pain, given the Power architecture, but
amazingly, this also seems to be in Anaconda’s default Power channel.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mrocklin@login2.summit $ conda install nodejs  # Thanks conda packaging devs!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then I install Dask-Labextension, which is both a Python and a JavaScript
package:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask_labextension
jupyter labextension install dask-labextension
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then I set up a password for my Jupyter sessions&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jupyter notebook password
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And run JupyterLab in a network friendly way&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mrocklin@login2.summit $ jupyter lab --no-browser --ip=&quot;login2&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And set up a single SSH tunnel from my home machine to the login node&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Be sure to match the login node&apos;s hostname and the Jupyter port below

mrocklin@my-laptop $ ssh -L 8888:login2:8888 summit.olcf.ornl.gov
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I can now connect to Jupyter from my laptop by navigating to
&lt;a href=&quot;http://localhost:8888&quot;&gt;http://localhost:8888&lt;/a&gt; , run the cluster commands above in a notebook, and
things work great. Additionally, thanks to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jupyter-server-proxy&lt;/code&gt;, Dask’s
dashboard is also available at &lt;a href=&quot;http://localhost:8888/proxy/####/status&quot;&gt;http://localhost:8888/proxy/####/status&lt;/a&gt; , where
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;####&lt;/code&gt; is the port currently hosting Dask’s dashboard. You can probably find
this by looking at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cluster.dashboard_link&lt;/code&gt;. It defaults to 8787, but if
you’ve started a bunch of Dask schedulers on your system recently it’s possible
that that port is taken up and so Dask had to resort to using random ports.&lt;/p&gt;

&lt;h3 id=&quot;configuration-files&quot;&gt;Configuration files&lt;/h3&gt;

&lt;p&gt;I don’t want to keep typing all of these commands, so now I put things into a
single configuration file, and plop that file into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/dask/summit.yaml&lt;/code&gt;
(any filename that ends in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.yaml&lt;/code&gt; will do).&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;jobqueue&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;lsf&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;128&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;processes&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;8&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;500 GB&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;job-extra&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-nnodes&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;1&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ib0&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;header-skip&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-R&quot;&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-n&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;-M&quot;&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;labextension&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;factory&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;dask_jobqueue&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;LSFCluster&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[]&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;kwargs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;your-project-id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;slow-worker-startup&quot;&gt;Slow worker startup&lt;/h3&gt;

&lt;p&gt;Now that things are easier to use I find myself using the system more, and some
other problems arise.&lt;/p&gt;

&lt;p&gt;I notice that it takes a long time to start up a worker. It seems to hang
intermittently during startup, so I add a few lines to
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;distributed/__init__.py&lt;/code&gt; to print out the state of the main Python thread
every second, to see where this is happening:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;threading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;profile&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;main_thread&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;threading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_ident&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;frame&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_current_frames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main_thread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;profile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;call_stack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;thread&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;threading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;daemon&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;thraed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This prints out a traceback that brings us to this code in Dask:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;is_locking_enabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_lock_path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dir_path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DIR_LOCK_EXT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;assert&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exists&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_lock_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Locking %r...&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_lock_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Avoid a race condition before locking the file
&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# by taking the global lock
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;workspace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_global_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
                    &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_lock_file&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;locket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lock_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_lock_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_lock_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;acquire&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It looks like Dask is trying to use a file-based lock.
Unfortunately some NFS systems don’t like file-based locks, or handle them very
slowly. In the case of Summit, the home directory is actually mounted
read-only from the compute nodes, so a file-based lock will simply fail.
Looking up the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_locking_enabled&lt;/code&gt; function we see that it checks a
configuration value.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;is_locking_enabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;distributed.worker.use-file-locking&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So we add that to our config file. At the same time I switch from the
forkserver to spawn multiprocessing method (I thought that this might help, but
it didn’t), which is relatively harmless.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;distributed:
  worker:
    multiprocessing-method: spawn
    use-file-locking: False

jobqueue:
  lsf:
    cores: 128
    processes: 8
    memory: 500 GB
    job-extra:
      - &quot;-nnodes 1&quot;
    interface: ib0
    header-skip:
    - &quot;-R&quot;
    - &quot;-n &quot;
    - &quot;-M&quot;

labextension:
  factory:
     module: &apos;dask_jobqueue&apos;
     class: &apos;LSFCluster&apos;
     args: []
     kwargs:
       project: your-project-id
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;This post outlines many issues that I ran into when getting Dask to run on
one specific HPC system. These problems aren’t universal, so you may not run
into them, but they’re also not super-rare. Mostly my objective in writing
this up is to give people a sense of the sorts of problems that arise when
Dask and an HPC system interact.&lt;/p&gt;

&lt;p&gt;None of the problems above are that serious. They’ve all happened before and
they all have solutions that can be written down in a configuration file.
Finding what the problem is though can be challenging, and often requires the
combined expertise of individuals that are experienced with Dask and with that
particular HPC system.&lt;/p&gt;

&lt;p&gt;There are a few configuration files posted here
&lt;a href=&quot;https://jobqueue.dask.org/en/latest/configurations.html&quot;&gt;jobqueue.dask.org/en/latest/configurations.html&lt;/a&gt;, which may be informative. The &lt;a href=&quot;https://github.com/dask/dask-jobqueue/issues&quot;&gt;Dask Jobqueue issue tracker&lt;/a&gt; is also a fairly friendly place, full of both IT professionals and Dask experts.&lt;/p&gt;

&lt;p&gt;Also, as a reminder, you don’t need to have an HPC machine in order to use
Dask. Dask is conveniently deployable from other Cloud, Hadoop, and local
systems. See the &lt;a href=&quot;https://docs.dask.org/en/latest/setup.html&quot;&gt;Dask setup
documentation&lt;/a&gt; for more
information.&lt;/p&gt;

&lt;h3 id=&quot;future-work-gpus&quot;&gt;Future work: GPUs&lt;/h3&gt;

&lt;p&gt;Summit is fast because it has a ton of GPUs. I’m going to work on that next,
but that will probably cover enough content to fill up a whole other blogpost :)&lt;/p&gt;

&lt;h3 id=&quot;branches&quot;&gt;Branches&lt;/h3&gt;

&lt;p&gt;For anyone playing along at home (or on Summit). I’m operating from the
following development branches:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed@master&quot;&gt;https://github.com/dask/distributed@master&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/mrocklin/dask-jobqueue@spec-rewrite&quot;&gt;https://github.com/mrocklin/dask-jobqueue@spec-rewrite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although hopefully within a month of writing this article, everything should be
in a nicely released state.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask and ITK for large scale image analysis</title>
   <link href="https://blog.dask.org/2019/08/09/image-itk"/>
   <updated>2019-08-09T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/08/09/image-itk</id>
   
   <category>imaging</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;This post explores using the &lt;a href=&quot;https://www.itk.org&quot;&gt;ITK&lt;/a&gt; suite of image processing utilities in parallel with Dask Array.&lt;/p&gt;

&lt;p&gt;We cover …&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A simple but common example of applying deconvolution across a stack of 3d images&lt;/li&gt;
  &lt;li&gt;Tips on how to make these two libraries work well together&lt;/li&gt;
  &lt;li&gt;Challenges that we ran into and opportunities for future improvements.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;a-worked-example&quot;&gt;A Worked Example&lt;/h2&gt;

&lt;p&gt;Let’s start with a full example applying Richardson Lucy deconvolution to a
stack of light sheet microscopy data. This is the same data that we showed how
to load in our &lt;a href=&quot;https://blog.dask.org/2019/06/20/load-image-data&quot;&gt;last blogpost on image loading&lt;/a&gt;.
You can &lt;a href=&quot;https://drive.google.com/drive/folders/13mpIfqspKTIINkfoWbFsVtFF8D7jbTqJ&quot;&gt;access the data as tiff files from google drive here&lt;/a&gt;, and the access the &lt;a href=&quot;https://drive.google.com/drive/folders/13udO-h9epItG5MNWBp0VxBkKCllYBLQF&quot;&gt;corresponding point spread function images here&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Load our data from last time¶
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_zarr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;AOLLSMData_m4_raw.zarr/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 188.74 GB &lt;/td&gt; &lt;td&gt; 316.15 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (3, 199, 201, 1024, 768) &lt;/td&gt; &lt;td&gt; (1, 1, 201, 1024, 768) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 598 Tasks &lt;/td&gt;&lt;td&gt; 597 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;404&quot; height=&quot;206&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;45&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;9&quot; x2=&quot;45&quot; y2=&quot;9&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;18&quot; x2=&quot;45&quot; y2=&quot;18&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;27&quot; x2=&quot;45&quot; y2=&quot;27&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;27&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;1&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;1&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;1&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;1&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;3&quot; y1=&quot;0&quot; x2=&quot;3&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;3&quot; y1=&quot;0&quot; x2=&quot;3&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;3&quot; y1=&quot;0&quot; x2=&quot;3&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;3&quot; y1=&quot;0&quot; x2=&quot;3&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;4&quot; y1=&quot;0&quot; x2=&quot;4&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;4&quot; y1=&quot;0&quot; x2=&quot;4&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;4&quot; y1=&quot;0&quot; x2=&quot;4&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;4&quot; y1=&quot;0&quot; x2=&quot;4&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;6&quot; y1=&quot;0&quot; x2=&quot;6&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;6&quot; y1=&quot;0&quot; x2=&quot;6&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;6&quot; y1=&quot;0&quot; x2=&quot;6&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;6&quot; y1=&quot;0&quot; x2=&quot;6&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;8&quot; y1=&quot;0&quot; x2=&quot;8&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;8&quot; y1=&quot;0&quot; x2=&quot;8&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;8&quot; y1=&quot;0&quot; x2=&quot;8&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;8&quot; y1=&quot;0&quot; x2=&quot;8&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;9&quot; y1=&quot;0&quot; x2=&quot;9&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;9&quot; y1=&quot;0&quot; x2=&quot;9&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;9&quot; y1=&quot;0&quot; x2=&quot;9&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;9&quot; y1=&quot;0&quot; x2=&quot;9&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;11&quot; y1=&quot;0&quot; x2=&quot;11&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;11&quot; y1=&quot;0&quot; x2=&quot;11&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;11&quot; y1=&quot;0&quot; x2=&quot;11&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;11&quot; y1=&quot;0&quot; x2=&quot;11&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;13&quot; y1=&quot;0&quot; x2=&quot;13&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;13&quot; y1=&quot;0&quot; x2=&quot;13&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;13&quot; y1=&quot;0&quot; x2=&quot;13&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;13&quot; y1=&quot;0&quot; x2=&quot;13&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;0&quot; x2=&quot;14&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;0&quot; x2=&quot;14&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;0&quot; x2=&quot;14&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;0&quot; x2=&quot;14&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;0&quot; x2=&quot;16&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;0&quot; x2=&quot;16&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;0&quot; x2=&quot;16&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;0&quot; x2=&quot;16&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;19&quot; y1=&quot;0&quot; x2=&quot;19&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;19&quot; y1=&quot;0&quot; x2=&quot;19&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;19&quot; y1=&quot;0&quot; x2=&quot;19&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;19&quot; y1=&quot;0&quot; x2=&quot;19&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;0&quot; x2=&quot;21&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;0&quot; x2=&quot;21&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;0&quot; x2=&quot;21&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;0&quot; x2=&quot;21&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;0&quot; x2=&quot;24&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;0&quot; x2=&quot;24&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;0&quot; x2=&quot;24&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;0&quot; x2=&quot;24&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;26&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;26&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;26&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;26&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;0&quot; x2=&quot;28&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;0&quot; x2=&quot;28&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;0&quot; x2=&quot;28&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;0&quot; x2=&quot;28&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;0&quot; x2=&quot;28&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;0&quot; x2=&quot;29&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;0&quot; x2=&quot;29&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;0&quot; x2=&quot;29&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;0&quot; x2=&quot;29&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;0&quot; x2=&quot;30&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;0&quot; x2=&quot;30&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;0&quot; x2=&quot;30&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;0&quot; x2=&quot;30&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;0&quot; x2=&quot;32&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;0&quot; x2=&quot;32&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;0&quot; x2=&quot;32&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;0&quot; x2=&quot;32&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;35&quot; y1=&quot;0&quot; x2=&quot;35&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;35&quot; y1=&quot;0&quot; x2=&quot;35&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;35&quot; y1=&quot;0&quot; x2=&quot;35&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;35&quot; y1=&quot;0&quot; x2=&quot;35&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;0&quot; x2=&quot;36&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;0&quot; x2=&quot;36&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;0&quot; x2=&quot;36&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;0&quot; x2=&quot;36&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;0&quot; x2=&quot;36&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;37&quot; y1=&quot;0&quot; x2=&quot;37&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;37&quot; y1=&quot;0&quot; x2=&quot;37&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;37&quot; y1=&quot;0&quot; x2=&quot;37&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;37&quot; y1=&quot;0&quot; x2=&quot;37&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;40&quot; y1=&quot;0&quot; x2=&quot;40&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;40&quot; y1=&quot;0&quot; x2=&quot;40&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;40&quot; y1=&quot;0&quot; x2=&quot;40&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;40&quot; y1=&quot;0&quot; x2=&quot;40&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;0&quot; x2=&quot;42&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;0&quot; x2=&quot;42&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;0&quot; x2=&quot;42&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;0&quot; x2=&quot;42&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;43&quot; y1=&quot;0&quot; x2=&quot;43&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;43&quot; y1=&quot;0&quot; x2=&quot;43&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;43&quot; y1=&quot;0&quot; x2=&quot;43&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;43&quot; y1=&quot;0&quot; x2=&quot;43&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;44&quot; y1=&quot;0&quot; x2=&quot;44&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;44&quot; y1=&quot;0&quot; x2=&quot;44&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;44&quot; y1=&quot;0&quot; x2=&quot;44&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;44&quot; y1=&quot;0&quot; x2=&quot;44&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;44&quot; y1=&quot;0&quot; x2=&quot;44&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;45&quot; y1=&quot;0&quot; x2=&quot;45&quot; y2=&quot;27&quot; /&gt;
  &lt;line x1=&quot;45&quot; y1=&quot;0&quot; x2=&quot;45&quot; y2=&quot;27&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;0.000000,0.000000 45.378219,0.000000 45.378219,27.530335 0.000000,27.530335&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;22.689110&quot; y=&quot;47.530335&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;199&lt;/text&gt;
&lt;text x=&quot;65.378219&quot; y=&quot;13.765167&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(0,65.378219,13.765167)&quot;&gt;3&lt;/text&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;115&quot; y1=&quot;0&quot; x2=&quot;141&quot; y2=&quot;26&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;115&quot; y1=&quot;130&quot; x2=&quot;141&quot; y2=&quot;156&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;115&quot; y1=&quot;0&quot; x2=&quot;115&quot; y2=&quot;130&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;141&quot; y1=&quot;26&quot; x2=&quot;141&quot; y2=&quot;156&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;115.000000,0.000000 141.720328,26.720328 141.720328,156.720328 115.000000,130.000000&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;115&quot; y1=&quot;0&quot; x2=&quot;212&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;141&quot; y1=&quot;26&quot; x2=&quot;239&quot; y2=&quot;26&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;115&quot; y1=&quot;0&quot; x2=&quot;141&quot; y2=&quot;26&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;212&quot; y1=&quot;0&quot; x2=&quot;239&quot; y2=&quot;26&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;115.000000,0.000000 212.500000,0.000000 239.220328,26.720328 141.720328,26.720328&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;141&quot; y1=&quot;26&quot; x2=&quot;239&quot; y2=&quot;26&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;141&quot; y1=&quot;156&quot; x2=&quot;239&quot; y2=&quot;156&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;141&quot; y1=&quot;26&quot; x2=&quot;141&quot; y2=&quot;156&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;239&quot; y1=&quot;26&quot; x2=&quot;239&quot; y2=&quot;156&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;141.720328,26.720328 239.220328,26.720328 239.220328,156.720328 141.720328,156.720328&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;190.470328&quot; y=&quot;176.720328&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;768&lt;/text&gt;
&lt;text x=&quot;259.220328&quot; y=&quot;91.720328&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,259.220328,91.720328)&quot;&gt;1024&lt;/text&gt;
&lt;text x=&quot;118.360164&quot; y=&quot;163.360164&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,118.360164,163.360164)&quot;&gt;201&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;This dataset has shape &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(3, 199, 201, 1024, 768)&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;3 fluorescence color channels,&lt;/li&gt;
  &lt;li&gt;199 time points,&lt;/li&gt;
  &lt;li&gt;201 z-slices,&lt;/li&gt;
  &lt;li&gt;1024 pixels in the y dimension, and&lt;/li&gt;
  &lt;li&gt;768 pixels in the x dimension.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Load our Point Spread Function (PSF)
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array.image&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;AOLLSMData/m4/psfs_z0p1/*.tif&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[:,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 2.48 MB &lt;/td&gt; &lt;td&gt; 827.39 kB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (3, 1, 101, 64, 64) &lt;/td&gt; &lt;td&gt; (1, 1, 101, 64, 64) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 6 Tasks &lt;/td&gt;&lt;td&gt; 3 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;402&quot; height=&quot;208&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;11&quot; x2=&quot;27&quot; y2=&quot;11&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;22&quot; x2=&quot;27&quot; y2=&quot;22&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;33&quot; x2=&quot;27&quot; y2=&quot;33&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;33&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;33&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;0.000000,0.000000 27.530335,0.000000 27.530335,33.941765 0.000000,33.941765&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;13.765167&quot; y=&quot;53.941765&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;1&lt;/text&gt;
&lt;text x=&quot;47.530335&quot; y=&quot;16.970882&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(0,47.530335,16.970882)&quot;&gt;3&lt;/text&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;97&quot; y1=&quot;0&quot; x2=&quot;173&quot; y2=&quot;76&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;97&quot; y1=&quot;82&quot; x2=&quot;173&quot; y2=&quot;158&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;97&quot; y1=&quot;0&quot; x2=&quot;97&quot; y2=&quot;82&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;173&quot; y1=&quot;76&quot; x2=&quot;173&quot; y2=&quot;158&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;97.000000,0.000000 173.470588,76.470588 173.470588,158.846826 97.000000,82.376238&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;97&quot; y1=&quot;0&quot; x2=&quot;179&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;173&quot; y1=&quot;76&quot; x2=&quot;255&quot; y2=&quot;76&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;97&quot; y1=&quot;0&quot; x2=&quot;173&quot; y2=&quot;76&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;179&quot; y1=&quot;0&quot; x2=&quot;255&quot; y2=&quot;76&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;97.000000,0.000000 179.376238,0.000000 255.846826,76.470588 173.470588,76.470588&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;173&quot; y1=&quot;76&quot; x2=&quot;255&quot; y2=&quot;76&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;173&quot; y1=&quot;158&quot; x2=&quot;255&quot; y2=&quot;158&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;173&quot; y1=&quot;76&quot; x2=&quot;173&quot; y2=&quot;158&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;255&quot; y1=&quot;76&quot; x2=&quot;255&quot; y2=&quot;158&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;173.470588,76.470588 255.846826,76.470588 255.846826,158.846826 173.470588,158.846826&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;214.658707&quot; y=&quot;178.846826&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;64&lt;/text&gt;
&lt;text x=&quot;275.846826&quot; y=&quot;117.658707&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(0,275.846826,117.658707)&quot;&gt;64&lt;/text&gt;
&lt;text x=&quot;125.235294&quot; y=&quot;140.611532&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,125.235294,140.611532)&quot;&gt;101&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Convert data to float32 for computation¶
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Note: the psf needs to be sampled with a voxel spacing
# consistent with the image&apos;s sampling
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;astype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Apply Richardson-Lucy Deconvolution¶
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;richardson_lucy_deconvolution&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot; Apply deconvolution to a single chunk of data &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;itk&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# remove leading two length-one dimensions
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# remove leading two length-one dimensions
&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image_view_from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# Convert to ITK object
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image_view_from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Convert to ITK object
&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deconvolved&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;richardson_lucy_deconvolution_image_filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;kernel_image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;number_of_iterations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_from_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deconvolved&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Convert back to Numpy array
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Add back the leading length-one dimensions
&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;richardson_lucy_deconvolution&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Create a local cluster of dask worker processes
# (this could also point to a distributed cluster if you have it)
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;threads_per_process&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# now dask operations use this cluster by default
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Trigger computation and store
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_zarr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;AOLLSMData_m4_raw.zarr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;deconvolved&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;overwrite&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So in the example above we …&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Load data both from Zarr and TIFF files into multi-chunked Dask arrays&lt;/li&gt;
  &lt;li&gt;Construct a function to apply an ITK routine onto each chunk&lt;/li&gt;
  &lt;li&gt;Apply that function across the dask array with the &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.core.map_blocks&quot;&gt;dask.array.map_blocks&lt;/a&gt; function.&lt;/li&gt;
  &lt;li&gt;Store the result back into Zarr format&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From the perspective of an imaging scientist,
the new piece of technology here is the
&lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.core.map_blocks&quot;&gt;dask.array.map_blocks&lt;/a&gt; function.
Given a Dask array composed of many NumPy arrays and a function, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; applies that function across each block in parallel, returning a Dask array as a result.
It’s a great tool whenever you want to apply an operation across many blocks in a simple fashion.
Because Dask arrays are just made out of Numpy arrays it’s an easy way to
compose Dask with the rest of the Scientific Python ecosystem.&lt;/p&gt;

&lt;h2 id=&quot;building-the-right-function&quot;&gt;Building the right function&lt;/h2&gt;

&lt;p&gt;However in this case there are a few challenges to constructing the right Numpy
-&amp;gt; Numpy function, due to both idiosyncrasies in ITK and Dask Array. Let’s
look at our function again:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;richardson_lucy_deconvolution&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot; Apply deconvolution to a single chunk of data &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;itk&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# remove leading two length-one dimensions
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# remove leading two length-one dimensions
&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image_view_from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# Convert to ITK object
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image_view_from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Convert to ITK object
&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;deconvolved&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;richardson_lucy_deconvolution_image_filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;kernel_image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;number_of_iterations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_from_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deconvolved&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Convert back to Numpy array
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Add back the leading length-one dimensions
&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;richardson_lucy_deconvolution&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is longer than we would like.
Instead, we would have preferred to just use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;itk&lt;/code&gt; function directly,
without all of the steps before and after.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;deconvolved&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;richardson_lucy_deconvolution_image_filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What were the extra steps in our function and why were they necessary?&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Convert to and from ITK Image objects&lt;/strong&gt;: ITK functions don’t consume and
produce Numpy arrays, they consume and produce their own &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Image&lt;/code&gt; data
structure. There are convenient functions to convert back and forth,
so handling this is straightforward, but it does need to be handled each
time. See &lt;a href=&quot;https://github.com/InsightSoftwareConsortium/ITK/issues/1136&quot;&gt;ITK #1136&lt;/a&gt; for a
feature request that would remove the need for this step.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Unpack and pack singleton dimensions&lt;/strong&gt;: Our Dask arrays have shapes like
the following:&lt;/p&gt;

    &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Array Shape: (3, 199, 201, 1024, 768)
Chunk Shape: (1,   1, 201, 1024, 768)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;So our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; function gets NumPy arrays of the chunk size,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(1, 1, 201, 1024, 768)&lt;/code&gt;.
However, our ITK functions are meant to work on 3d arrays, not 5d arrays,
so we need to remove those first two dimensions.&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# remove leading two length-one dimensions
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# remove leading two length-one dimensions
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;And then when we’re done, Dask expects to get back 5d arrays like what it
provided, so we add these singleton dimensions back in&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...]&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Add back the leading length-one dimensions
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Again, this is straightforward for users who are accustomed to NumPy
slicing syntax, but does need to be done each time.
This adds some friction to our development process,
and is another step that can confuse users.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But if you’re comfortable working around things like this,
then ITK and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; can be a powerful combination
if you want to parallelize out ITK operations across a cluster.&lt;/p&gt;

&lt;h2 id=&quot;defining-a-dask-cluster&quot;&gt;Defining a Dask Cluster&lt;/h2&gt;

&lt;p&gt;Above we used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.distributed.LocalCluster&lt;/code&gt; to set up 20 single-threaded
workers on our local workstation:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;threads_per_process&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# now dask operations use this cluster by default
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you had a distributed resource, this is where you would connect it.
You would swap out &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCluster&lt;/code&gt; with one of
&lt;a href=&quot;https://docs.dask.org/en/latest/setup.html&quot;&gt;Dask’s other deployment options&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also, we found that we needed to use many single-threaded processes rather than
one multi-threaded process because ITK functions seem to still hold onto the
GIL. This is fine, we just need to be aware of it so that we set up our Dask
workers appropriately with one thread per process for maximum efficiency.
See &lt;a href=&quot;https://github.com/InsightSoftwareConsortium/ITK/issues/1134&quot;&gt;ITK #1134&lt;/a&gt;
for an active Github issue on this topic.&lt;/p&gt;

&lt;h2 id=&quot;serialization&quot;&gt;Serialization&lt;/h2&gt;

&lt;p&gt;We had some difficulty when using the ITK library across multiple processes,
because the library itself didn’t serialize well. (If you don’t understand
what that means, don’t worry). We solved a bit of this in
&lt;a href=&quot;https://github.com/InsightSoftwareConsortium/ITK/pull/1090&quot;&gt;ITK #1090&lt;/a&gt;,
but some issues still remain.&lt;/p&gt;

&lt;p&gt;We got around this by including the import in the function rather than outside
of it.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;richardson_lucy_deconvolution&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;itk&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# &amp;lt;--- we work around serialization issues by importing within the function
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That way each task imports itk individually, and we sidestep this issue.&lt;/p&gt;

&lt;h2 id=&quot;trying-scikit-image&quot;&gt;Trying Scikit-Image&lt;/h2&gt;

&lt;p&gt;We also tried out the Richardson Lucy deconvolution operation in
&lt;a href=&quot;https://scikit-image.org/&quot;&gt;Scikit-Image&lt;/a&gt;. Scikit-Image is known for being
more Scipy/Numpy native, but not always as fast as ITK. Our experience
confirmed this perception.&lt;/p&gt;

&lt;p&gt;First, we were glad to see that the scikit-image function worked with
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; immediately without any packing/unpacking, dimensionality, or
serialization issues:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;skimage.restoration&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skimage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;restoration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;richardson_lucy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# just works
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So all of that converting to and from image objects or removing and adding
singleton dimensions isn’t necessary here.&lt;/p&gt;

&lt;p&gt;In terms of performance we were also happy to see that Scikit-Image released
the GIL, so we were able to get very high reported CPU utilization when using a
small number of multi-threaded processes. However, even though CPU utilization
was high, our parallel performance was poor enough that we stuck with the ITK
solution, warts and all. More information about this is available in
Github issue &lt;a href=&quot;https://github.com/scikit-image/scikit-image/issues/4083&quot;&gt;scikit-image #4083&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: sequentially on a single chunk, ITK ran in around 2 minutes while
scikit-image ran in 3 minutes. It was only once we started parallelizing that
things became slow.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Regardless, our goal in this experiment was to see how well ITK and Dask
array played together. It was nice to see what smooth integration looks like,
if only to motivate future development in ITK+Dask relations.&lt;/p&gt;

&lt;h2 id=&quot;numba-gufuncs&quot;&gt;Numba GUFuncs&lt;/h2&gt;

&lt;p&gt;An alternative to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;da.map_blocks&lt;/code&gt; are Generalized Universal Functions (gufuncs)
These are functions that have many magical properties, one of which is that
they operate equally well on both NumPy and Dask arrays. If libraries like
ITK or Scikit-Image make their functions into gufuncs then they work without
users having to do anything special.&lt;/p&gt;

&lt;p&gt;The easiest way to implement gufuncs today is with Numba. I did this on our
wrapped &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;richardson_lucy&lt;/code&gt; function, just to show how it could work, in case
other libraries want to take this on in the future.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numba&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guvectorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;float32[:,:,:], float32[:,:,:], float32[:,:,:]&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# we have to specify types
&lt;/span&gt;    &lt;span class=&quot;s&quot;&gt;&quot;(i,j,k),(a,b,c)-&amp;gt;(i,j,k)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;                          &lt;span class=&quot;c1&quot;&gt;# and dimensionality explicitly
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;forceobj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;richardson_lucy_deconvolution&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# &amp;lt;---- no dimension unpacking!
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image_view_from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ascontiguousarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;image_view_from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ascontiguousarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;deconvolved&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;richardson_lucy_deconvolution_image_filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel_image&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kernel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;number_of_iterations&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iterations&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;itk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array_from_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;deconvolved&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Now this function works natively on either NumPy or Dask arrays
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;richardson_lucy_deconvolution&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;psf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# &amp;lt;-- no map_blocks call!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that we’ve both lost the dimension unpacking and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; call.
Our function now knows enough information about how it can broadcast that Dask
can do the parallelization without being told what to do explicitly.&lt;/p&gt;

&lt;p&gt;This adds some burden onto library maintainers,
but makes the user experience much more smooth.&lt;/p&gt;

&lt;h2 id=&quot;gpu-acceleration&quot;&gt;GPU Acceleration&lt;/h2&gt;

&lt;p&gt;When doing some user research on image processing and Dask, almost everyone we
interviewed said that they wanted faster deconvolution. This seemed to be a
major pain point. Now we know why. It’s both very common, and &lt;em&gt;very slow&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Running deconvolution on a single chunk of this size takes around 2-4 minutes,
and we have hundreds of chunks in a single dataset. Multi-core parallelism can
help a bit here, but this problem may also be ripe for GPU acceleration.
Similar operations typically have 100x speedups on GPUs. This might be a more
pragmatic solution than scaling out to large distributed clusters.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;This experiment both …&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Gives us an example&lt;/strong&gt; that other imaging scientists
can copy and modify to be effective with Dask and ITK together.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Highlights areas of improvement&lt;/strong&gt; where developers from the different
libraries can work to remove some of these rough interactions spots in the
future.&lt;/p&gt;

    &lt;p&gt;It’s worth noting that Dask has done this with lots of libraries within the
Scipy ecosystem, including Pandas, Scikit-Image, Scikit-Learn, and others.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re also going to continue with our imaging experiment, while these technical
issues get worked out in the background. Next up, segmentation!&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>2019 Dask User Survey</title>
   <link href="https://blog.dask.org/2019/08/05/user-survey"/>
   <updated>2019-08-05T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/08/05/user-survey</id>
   
   <category>User Survey</category>
   
   <content type="html">
&lt;style type=&quot;text/css&quot;&gt;
table td {
    background: none;
}

table tr.even td {
    background: none;
}

table {
    text-shadow: none;
}

&lt;/style&gt;

&lt;h2 id=&quot;2019-dask-user-survey-results&quot;&gt;2019 Dask User Survey Results&lt;/h2&gt;

&lt;p&gt;This notebook presents the results of the 2019 Dask User Survey,
which ran earlier this summer. Thanks to everyone who took the time to fill out the survey!
These results help us better understand the Dask community and will guide future development efforts.&lt;/p&gt;

&lt;p&gt;The raw data, as well as the start of an analysis, can be found in this binder:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://mybinder.org/v2/gh/dask/dask-examples/main?urlpath=%2Ftree%2Fsurveys%2F2019.ipynb&quot;&gt;&lt;img src=&quot;https://mybinder.org/badge_logo.svg&quot; alt=&quot;Binder&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let us know if you find anything in the data.&lt;/p&gt;

&lt;h2 id=&quot;highlights&quot;&gt;Highlights&lt;/h2&gt;

&lt;p&gt;We had 259 responses to the survey. Overall, we found that the survey respondents really care about improved documentation, and ease of use (including ease of deployment), and scaling. While Dask brings together many different communities (big arrays versus big dataframes, traditional HPC users versus cloud-native resource managers), there was general agreement in what is most important for Dask.&lt;/p&gt;

&lt;p&gt;Now we’ll go through some individual items questions, highlighting particularly interesting results.&lt;/p&gt;

&lt;h2 id=&quot;how-do-you-use-dask&quot;&gt;How do you use Dask?&lt;/h2&gt;

&lt;p&gt;For learning resources, almost every respondent uses the documentation.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/analyze_files/analyze_4_0.svg&quot; alt=&quot;svg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Most respondents use Dask at least occasionally. Fortunately we had a decent number of respondents who are just looking into Dask, yet still spent the time to take the survey.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/analyze_files/analyze_6_0.svg&quot; alt=&quot;svg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’m curiuos about how learning resource usage changes as users become more experienced. We might expect those just looking into Dask to start with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;examples.dask.org&lt;/code&gt;, where they can try out Dask without installing anything.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/analyze_files/analyze_8_0.svg&quot; alt=&quot;svg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Overall, documentation is still the leader across user user groups.&lt;/p&gt;

&lt;p&gt;The usage of the &lt;a href=&quot;https://github.com/dask/dask-tutorial&quot;&gt;Dask tutorial&lt;/a&gt; and the &lt;a href=&quot;examples.dask.org&quot;&gt;dask examples&lt;/a&gt; are relatively consistent across groups. The primary difference between regular and new users is that regular users are more likely to engage on GitHub.&lt;/p&gt;

&lt;p&gt;From StackOverflow questions and GitHub issues, we have a vague idea about which parts of the library are used.
The survey shows that (for our respondents at least) DataFrame and Delayed are the most commonly used APIs.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/analyze_files/analyze_10_0.svg&quot; alt=&quot;svg&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;About 65.49% of our respondests are using Dask on a Cluster.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But the majority of respondents &lt;em&gt;also&lt;/em&gt; use Dask on their laptop.
This highlights the importance of Dask scaling down, either for
prototyping with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCluster&lt;/code&gt;, or for out-of-core analysis
using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCluster&lt;/code&gt; or one of the single-machine schedulers.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/analyze_files/analyze_13_0.svg&quot; alt=&quot;svg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Most respondents use Dask interactively, at least some of the time.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/analyze_files/analyze_15_0.svg&quot; alt=&quot;svg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Most repondents thought that more documentation and examples would be the most valuable improvements to the project. This is especially pronounced among new users. But even among those using Dask everyday more people thought that “More examples” is more valuable than “New features” or “Performance improvements”.&lt;/p&gt;

&lt;style type=&quot;text/css&quot;&gt;
    #T_820ef326_b488_11e9_ad41_186590cd1c87row0_col0 {
            background-color:  #3b92c1;
            color:  #000000;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row0_col1 {
            background-color:  #b4c4df;
            color:  #000000;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row0_col2 {
            background-color:  #dad9ea;
            color:  #000000;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row0_col3 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row0_col4 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row1_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row1_col1 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row1_col2 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row1_col3 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row1_col4 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row2_col0 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row2_col1 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row2_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row2_col3 {
            background-color:  #1b7eb7;
            color:  #000000;
        }    #T_820ef326_b488_11e9_ad41_186590cd1c87row2_col4 {
            background-color:  #589ec8;
            color:  #000000;
        }&lt;/style&gt;
&lt;table id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87&quot;&gt;&lt;caption&gt;Normalized by row. Darker means that a higher proporiton of users with that usage frequency prefer that priority.&lt;/caption&gt;&lt;thead&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;Which would help you most right now?&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col0&quot;&gt;Bug fixes&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col1&quot;&gt;More documentation&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col2&quot;&gt;More examples in my field&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col3&quot;&gt;New features&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col4&quot;&gt;Performance improvements&lt;/th&gt;    &lt;/tr&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;How often do you use Dask?&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;    &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;

                &lt;tr&gt;
                        &lt;th id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87level0_row0&quot; class=&quot;row_heading level0 row0&quot;&gt;Every day&lt;/th&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row0_col0&quot; class=&quot;data row0 col0&quot;&gt;9&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row0_col1&quot; class=&quot;data row0 col1&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row0_col2&quot; class=&quot;data row0 col2&quot;&gt;25&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row0_col3&quot; class=&quot;data row0 col3&quot;&gt;22&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row0_col4&quot; class=&quot;data row0 col4&quot;&gt;23&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87level0_row1&quot; class=&quot;row_heading level0 row1&quot;&gt;Just looking for now&lt;/th&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row1_col0&quot; class=&quot;data row1 col0&quot;&gt;1&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row1_col1&quot; class=&quot;data row1 col1&quot;&gt;3&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row1_col2&quot; class=&quot;data row1 col2&quot;&gt;18&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row1_col3&quot; class=&quot;data row1 col3&quot;&gt;9&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row1_col4&quot; class=&quot;data row1 col4&quot;&gt;5&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87level0_row2&quot; class=&quot;row_heading level0 row2&quot;&gt;Occasionally&lt;/th&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row2_col0&quot; class=&quot;data row2 col0&quot;&gt;14&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row2_col1&quot; class=&quot;data row2 col1&quot;&gt;27&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row2_col2&quot; class=&quot;data row2 col2&quot;&gt;52&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row2_col3&quot; class=&quot;data row2 col3&quot;&gt;18&lt;/td&gt;
                        &lt;td id=&quot;T_820ef326_b488_11e9_ad41_186590cd1c87row2_col4&quot; class=&quot;data row2 col4&quot;&gt;15&lt;/td&gt;
            &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Perhaps users of certain dask APIs feel differenlty from the group as a whole? We perform a similar analysis grouped by API use, rather than frequency of use.&lt;/p&gt;

&lt;style type=&quot;text/css&quot;&gt;
    #T_821479f4_b488_11e9_ad41_186590cd1c87row0_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row0_col1 {
            background-color:  #cacee5;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row0_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row0_col3 {
            background-color:  #f1ebf4;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row0_col4 {
            background-color:  #c4cbe3;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row1_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row1_col1 {
            background-color:  #3b92c1;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row1_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row1_col3 {
            background-color:  #62a2cb;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row1_col4 {
            background-color:  #bdc8e1;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row2_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row2_col1 {
            background-color:  #c2cbe2;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row2_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row2_col3 {
            background-color:  #94b6d7;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row2_col4 {
            background-color:  #e0dded;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row3_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row3_col1 {
            background-color:  #e6e2ef;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row3_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row3_col3 {
            background-color:  #ced0e6;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row3_col4 {
            background-color:  #c5cce3;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row4_col0 {
            background-color:  #dedcec;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row4_col1 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row4_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row4_col3 {
            background-color:  #1c7fb8;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row4_col4 {
            background-color:  #73a9cf;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row5_col0 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row5_col1 {
            background-color:  #b4c4df;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row5_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row5_col3 {
            background-color:  #b4c4df;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row5_col4 {
            background-color:  #eee9f3;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row6_col0 {
            background-color:  #faf2f8;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row6_col1 {
            background-color:  #e7e3f0;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row6_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row6_col3 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_821479f4_b488_11e9_ad41_186590cd1c87row6_col4 {
            background-color:  #f4eef6;
            color:  #000000;
        }&lt;/style&gt;
&lt;table id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87&quot;&gt;&lt;caption&gt;Normalized by row. Darker means that a higher proporiton of users of that API prefer that priority.&lt;/caption&gt;&lt;thead&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;Which would help you most right now?&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col0&quot;&gt;Bug fixes&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col1&quot;&gt;More documentation&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col2&quot;&gt;More examples in my field&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col3&quot;&gt;New features&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col4&quot;&gt;Performance improvements&lt;/th&gt;    &lt;/tr&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;Dask APIs&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;    &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;

                &lt;tr&gt;
                        &lt;th id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87level0_row0&quot; class=&quot;row_heading level0 row0&quot;&gt;Array&lt;/th&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row0_col0&quot; class=&quot;data row0 col0&quot;&gt;10&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row0_col1&quot; class=&quot;data row0 col1&quot;&gt;24&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row0_col2&quot; class=&quot;data row0 col2&quot;&gt;62&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row0_col3&quot; class=&quot;data row0 col3&quot;&gt;15&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row0_col4&quot; class=&quot;data row0 col4&quot;&gt;25&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87level0_row1&quot; class=&quot;row_heading level0 row1&quot;&gt;Bag&lt;/th&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row1_col0&quot; class=&quot;data row1 col0&quot;&gt;3&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row1_col1&quot; class=&quot;data row1 col1&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row1_col2&quot; class=&quot;data row1 col2&quot;&gt;16&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row1_col3&quot; class=&quot;data row1 col3&quot;&gt;10&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row1_col4&quot; class=&quot;data row1 col4&quot;&gt;7&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87level0_row2&quot; class=&quot;row_heading level0 row2&quot;&gt;DataFrame&lt;/th&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row2_col0&quot; class=&quot;data row2 col0&quot;&gt;16&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row2_col1&quot; class=&quot;data row2 col1&quot;&gt;32&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row2_col2&quot; class=&quot;data row2 col2&quot;&gt;71&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row2_col3&quot; class=&quot;data row2 col3&quot;&gt;39&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row2_col4&quot; class=&quot;data row2 col4&quot;&gt;26&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87level0_row3&quot; class=&quot;row_heading level0 row3&quot;&gt;Delayed&lt;/th&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row3_col0&quot; class=&quot;data row3 col0&quot;&gt;16&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row3_col1&quot; class=&quot;data row3 col1&quot;&gt;22&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row3_col2&quot; class=&quot;data row3 col2&quot;&gt;55&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row3_col3&quot; class=&quot;data row3 col3&quot;&gt;26&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row3_col4&quot; class=&quot;data row3 col4&quot;&gt;27&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87level0_row4&quot; class=&quot;row_heading level0 row4&quot;&gt;Futures&lt;/th&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row4_col0&quot; class=&quot;data row4 col0&quot;&gt;12&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row4_col1&quot; class=&quot;data row4 col1&quot;&gt;9&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row4_col2&quot; class=&quot;data row4 col2&quot;&gt;25&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row4_col3&quot; class=&quot;data row4 col3&quot;&gt;20&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row4_col4&quot; class=&quot;data row4 col4&quot;&gt;17&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87level0_row5&quot; class=&quot;row_heading level0 row5&quot;&gt;ML&lt;/th&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row5_col0&quot; class=&quot;data row5 col0&quot;&gt;5&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row5_col1&quot; class=&quot;data row5 col1&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row5_col2&quot; class=&quot;data row5 col2&quot;&gt;23&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row5_col3&quot; class=&quot;data row5 col3&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row5_col4&quot; class=&quot;data row5 col4&quot;&gt;7&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87level0_row6&quot; class=&quot;row_heading level0 row6&quot;&gt;Xarray&lt;/th&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row6_col0&quot; class=&quot;data row6 col0&quot;&gt;8&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row6_col1&quot; class=&quot;data row6 col1&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row6_col2&quot; class=&quot;data row6 col2&quot;&gt;34&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row6_col3&quot; class=&quot;data row6 col3&quot;&gt;7&lt;/td&gt;
                        &lt;td id=&quot;T_821479f4_b488_11e9_ad41_186590cd1c87row6_col4&quot; class=&quot;data row6 col4&quot;&gt;9&lt;/td&gt;
            &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Nothing really stands out. The “futures” users (who we expect to be relatively advanced) may prioritize features and performance over documentation. But everyone agrees that more examples are the highest priority.&lt;/p&gt;

&lt;h2 id=&quot;common-feature-requests&quot;&gt;Common Feature Requests&lt;/h2&gt;

&lt;p&gt;For specific features, we made a list of things that we (as developers) thought might be important.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/analyze_files/analyze_22_0.svg&quot; alt=&quot;svg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The clearest standout is how many people thought “Better NumPy/Pandas support” was “most critical”. In hindsight, it’d be good to have a followup fill-in field to undertand what each respondent meant by that. The parsimonious interpretion is “cover more of the NumPy / pandas API”.&lt;/p&gt;

&lt;p&gt;“Ease of deployment” had a high proportion of “critical to me”. Again in hindsight, I notice a bit of ambiguity. Does this mean people want Dask to be easier to deploy? Or does this mean that Dask, which they currently find easy to deploy, is critically important? Regardless, we can prioritize simplicity in deployment.&lt;/p&gt;

&lt;p&gt;Relatively few respondents care about things like “Managing many users”, though we expect that this would be relatively popular among system administartors, who are a smaller population.&lt;/p&gt;

&lt;p&gt;And of course, we have people pushing Dask to its limits for whom “Improving scaling” is critically important.&lt;/p&gt;

&lt;h2 id=&quot;what-other-systems-do-you-use&quot;&gt;What other systems do you use?&lt;/h2&gt;

&lt;p&gt;A relatively high proportion of respondents use Python 3 (97% compared to 84% in the most recent &lt;a href=&quot;https://www.jetbrains.com/research/python-developers-survey-2018/&quot;&gt;Python Developers Survey&lt;/a&gt;).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;3    97.29%
2     2.71%
Name: Python 2 or 3?, dtype: object
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We were a bit surprised to see that SSH is the most popular “cluster resource manager”.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;SSH                                                       98
Kubernetes                                                73
HPC resource manager (SLURM, PBS, SGE, LSF or similar)    61
My workplace has a custom solution for this               23
I don&apos;t know, someone else does this for me               16
Hadoop / Yarn / EMR                                       14
Name: If you use a cluster, how do you launch Dask? , dtype: int64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;How does cluster-resource manager compare with API usage?&lt;/p&gt;

&lt;style type=&quot;text/css&quot;&gt;
    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col0 {
            background-color:  #056faf;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col1 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col3 {
            background-color:  #034e7b;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col4 {
            background-color:  #2685bb;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col5 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col6 {
            background-color:  #f2ecf5;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col0 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col1 {
            background-color:  #f7f0f7;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col2 {
            background-color:  #0771b1;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col3 {
            background-color:  #0771b1;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col4 {
            background-color:  #c5cce3;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col5 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col6 {
            background-color:  #79abd0;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col0 {
            background-color:  #8bb2d4;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col1 {
            background-color:  #b4c4df;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col3 {
            background-color:  #589ec8;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col4 {
            background-color:  #eee9f3;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col5 {
            background-color:  #8bb2d4;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col6 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col0 {
            background-color:  #4c99c5;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col1 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col3 {
            background-color:  #056dac;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col4 {
            background-color:  #73a9cf;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col5 {
            background-color:  #d9d8ea;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col6 {
            background-color:  #f3edf5;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col0 {
            background-color:  #056ba9;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col1 {
            background-color:  #fff7fb;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col2 {
            background-color:  #023858;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col3 {
            background-color:  #1379b5;
            color:  #f1f1f1;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col4 {
            background-color:  #dfddec;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col5 {
            background-color:  #e8e4f0;
            color:  #000000;
        }    #T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col6 {
            background-color:  #f9f2f8;
            color:  #000000;
        }&lt;/style&gt;
&lt;table id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87&quot;&gt;&lt;thead&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;Dask APIs&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col0&quot;&gt;Array&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col1&quot;&gt;Bag&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col2&quot;&gt;DataFrame&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col3&quot;&gt;Delayed&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col4&quot;&gt;Futures&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col5&quot;&gt;ML&lt;/th&gt;        &lt;th class=&quot;col_heading level0 col6&quot;&gt;Xarray&lt;/th&gt;    &lt;/tr&gt;    &lt;tr&gt;        &lt;th class=&quot;index_name level0&quot;&gt;If you use a cluster, how do you launch Dask? &lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;        &lt;th class=&quot;blank&quot;&gt;&lt;/th&gt;    &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;

                &lt;tr&gt;
                        &lt;th id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87level0_row0&quot; class=&quot;row_heading level0 row0&quot;&gt;Custom&lt;/th&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col0&quot; class=&quot;data row0 col0&quot;&gt;15&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col1&quot; class=&quot;data row0 col1&quot;&gt;6&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col2&quot; class=&quot;data row0 col2&quot;&gt;18&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col3&quot; class=&quot;data row0 col3&quot;&gt;17&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col4&quot; class=&quot;data row0 col4&quot;&gt;14&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col5&quot; class=&quot;data row0 col5&quot;&gt;6&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row0_col6&quot; class=&quot;data row0 col6&quot;&gt;7&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87level0_row1&quot; class=&quot;row_heading level0 row1&quot;&gt;HPC&lt;/th&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col0&quot; class=&quot;data row1 col0&quot;&gt;50&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col1&quot; class=&quot;data row1 col1&quot;&gt;13&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col2&quot; class=&quot;data row1 col2&quot;&gt;40&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col3&quot; class=&quot;data row1 col3&quot;&gt;40&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col4&quot; class=&quot;data row1 col4&quot;&gt;22&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col5&quot; class=&quot;data row1 col5&quot;&gt;11&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row1_col6&quot; class=&quot;data row1 col6&quot;&gt;30&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87level0_row2&quot; class=&quot;row_heading level0 row2&quot;&gt;Hadoop / Yarn / EMR&lt;/th&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col0&quot; class=&quot;data row2 col0&quot;&gt;7&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col1&quot; class=&quot;data row2 col1&quot;&gt;6&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col2&quot; class=&quot;data row2 col2&quot;&gt;12&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col3&quot; class=&quot;data row2 col3&quot;&gt;8&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col4&quot; class=&quot;data row2 col4&quot;&gt;4&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col5&quot; class=&quot;data row2 col5&quot;&gt;7&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row2_col6&quot; class=&quot;data row2 col6&quot;&gt;3&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87level0_row3&quot; class=&quot;row_heading level0 row3&quot;&gt;Kubernetes&lt;/th&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col0&quot; class=&quot;data row3 col0&quot;&gt;40&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col1&quot; class=&quot;data row3 col1&quot;&gt;18&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col2&quot; class=&quot;data row3 col2&quot;&gt;56&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col3&quot; class=&quot;data row3 col3&quot;&gt;47&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col4&quot; class=&quot;data row3 col4&quot;&gt;37&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col5&quot; class=&quot;data row3 col5&quot;&gt;26&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row3_col6&quot; class=&quot;data row3 col6&quot;&gt;21&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                        &lt;th id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87level0_row4&quot; class=&quot;row_heading level0 row4&quot;&gt;SSH&lt;/th&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col0&quot; class=&quot;data row4 col0&quot;&gt;61&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col1&quot; class=&quot;data row4 col1&quot;&gt;23&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col2&quot; class=&quot;data row4 col2&quot;&gt;72&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col3&quot; class=&quot;data row4 col3&quot;&gt;58&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col4&quot; class=&quot;data row4 col4&quot;&gt;32&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col5&quot; class=&quot;data row4 col5&quot;&gt;30&lt;/td&gt;
                        &lt;td id=&quot;T_8326d0f8_b488_11e9_ad41_186590cd1c87row4_col6&quot; class=&quot;data row4 col6&quot;&gt;25&lt;/td&gt;
            &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;HPC users are relatively heavy users of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.array&lt;/code&gt; and xarray.&lt;/p&gt;

&lt;p&gt;Somewhat surprisingly, Dask’s heaviest users find dask stable enough. Perhaps they’ve pushed past the bugs and found workarounds (percentages are normalized by row).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/analyze_files/analyze_32_0.svg&quot; alt=&quot;svg&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;takeaways&quot;&gt;Takeaways&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;We should prioritize improving and expanding our documentation and examples. This may be
accomplished by Dask maintainers seeking examples from the community. Many of the examples
on &lt;a href=&quot;https://examples.dask.org&quot;&gt;https://examples.dask.org&lt;/a&gt; were developed by domain specialist who use Dask.&lt;/li&gt;
  &lt;li&gt;Improved scaling to larger problems is important, but we shouldn’t
sacrifice the single-machine usecase to get there.&lt;/li&gt;
  &lt;li&gt;Both interactive and batch workflows are important.&lt;/li&gt;
  &lt;li&gt;Dask’s various sub-communities are more similar than they are different.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thanks again to all the respondents. We look forward to repeating this process to identify trends over time.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Release 2.2.0</title>
   <link href="https://blog.dask.org/2019/08/02/dask-2.2"/>
   <updated>2019-08-02T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/08/02/dask-2.2</id>
   
   <category>release</category>
   
   <content type="html">
&lt;p&gt;I’m pleased to announce the release of Dask version 2.2.
This is a significant release with bug fixes and new features.
The last blogged release was 2.0 on 2019-06-22.
This blogpost outlines notable changes since the last post.&lt;/p&gt;

&lt;p&gt;You can conda install Dask:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install dask
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or pip install from PyPI:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask[complete] --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Full changelogs are available here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;notable-changes&quot;&gt;Notable Changes&lt;/h2&gt;

&lt;p&gt;As always there are too many changes to list here,
instead we’ll highlight a few that readers may find interesting,
or that break old behavior.
In particular we discuss the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Parquet rewrite&lt;/li&gt;
  &lt;li&gt;Nicer HTML output for Clients and Logs&lt;/li&gt;
  &lt;li&gt;Hyper-parameter selection with Hyperband in Dask-ML&lt;/li&gt;
  &lt;li&gt;Move bytes I/O handling out of Dask to FSSpec&lt;/li&gt;
  &lt;li&gt;async/await everywhere, and cleaner setup for developers&lt;/li&gt;
  &lt;li&gt;A new SSH deployment solution&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;1---parquet-rewrite&quot;&gt;1 - Parquet Rewrite&lt;/h2&gt;

&lt;p&gt;Today Dask DataFrame can read and write Parquet data using either
&lt;a href=&quot;https://fastparquet.readthedocs.io&quot;&gt;fastparquet&lt;/a&gt; or
&lt;a href=&quot;https://arrow.apache.org/&quot;&gt;Apache Arrow&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/path/to/mydata.parquet&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;arrow&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# or
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/path/to/mydata.parquet&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;fastparquet&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Supporting both libraries within Dask has been helpful for
users, but introduced some maintenance burden, especially given that each
library co-evolved with Dask dataframe over the years. The contract between
Dask Dataframe and these libraries was convoluted, making it difficult to
evolve swiftly.&lt;/p&gt;

&lt;p&gt;To address this we’ve formalized what Dask expects of Parquet reader/writers
into a more formal Parquet Engine contract. This keeps maintenance costs
low, enables independent development for each project, and allows for new
engines to emerge.&lt;/p&gt;

&lt;p&gt;Already a GPU-accelerated Parquet reader is available in a PR on the &lt;a href=&quot;https://github.com/rapidsai/cudf/pull/2368&quot;&gt;RAPIDS
cuDF&lt;/a&gt; library.&lt;/p&gt;

&lt;p&gt;As a result, we’ve also been able to fix a number of long-standing bugs, and
improve the functionality with both engines.&lt;/p&gt;

&lt;p&gt;Some fun quotes from &lt;a href=&quot;https://github.com/birdsarah&quot;&gt;Sarah Bird&lt;/a&gt; during development&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I am currently testing this. So far so good. I can load my dataset in a few seconds with 1800 partitions. Game changing!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I am now successfully working on a dataset with 74,000 partitions and no metadata.
Opening dataset and df.head() takes 7 - 30s. (Presumably depending on whether s3fs cache is cold or not). THIS IS HUGE! This was literally impossible before.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The API remains the same, but functionality should be smoother.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/rjzamora&quot;&gt;Rick Zamora&lt;/a&gt;, &lt;a href=&quot;https://github.com/martindurant&quot;&gt;Martin
Durant&lt;/a&gt; for doing most of the work here and to
&lt;a href=&quot;https://github.com/birdsarah&quot;&gt;Sarah Bird&lt;/a&gt;, &lt;a href=&quot;https://github.com/wesm&quot;&gt;Wes
McKinney&lt;/a&gt;, and &lt;a href=&quot;https://github.com/mmccarty&quot;&gt;Mike
McCarty&lt;/a&gt; for providing guidance and review.&lt;/p&gt;

&lt;h2 id=&quot;2---nicer-html-output-for-clients-and-logs&quot;&gt;2 - Nicer HTML output for Clients and Logs&lt;/h2&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table style=&quot;border: 2px solid white;&quot;&gt;
&lt;tr&gt;
&lt;td style=&quot;vertical-align: top; border: 0px solid white&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;Client&lt;/h3&gt;
&lt;ul style=&quot;text-align: left; list-style: none; margin: 0; padding: 0;&quot;&gt;
  &lt;li&gt;&lt;b&gt;Scheduler: &lt;/b&gt;tcp://127.0.0.1:60275&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Dashboard: &lt;/b&gt;&lt;a href=&quot;http://127.0.0.1:8787/status&quot; target=&quot;_blank&quot;&gt;http://127.0.0.1:8787/status&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: top; border: 0px solid white&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;Cluster&lt;/h3&gt;
&lt;ul style=&quot;text-align: left; list-style:none; margin: 0; padding: 0;&quot;&gt;
  &lt;li&gt;&lt;b&gt;Workers: &lt;/b&gt;4&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Cores: &lt;/b&gt;12&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Memory: &lt;/b&gt;17.18 GB&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div&gt;
&lt;details&gt;
&lt;summary&gt;Scheduler&lt;/summary&gt;
&lt;pre&gt;&lt;code&gt;distributed.scheduler - INFO - Clear task state
distributed.scheduler - INFO -   Scheduler at:     tcp://127.0.0.1:60275
distributed.scheduler - INFO -   dashboard at:            127.0.0.1:8787
distributed.scheduler - INFO - Register tcp://127.0.0.1:60281
distributed.scheduler - INFO - Register tcp://127.0.0.1:60282
distributed.scheduler - INFO - Starting worker compute stream, tcp://127.0.0.1:60281
distributed.scheduler - INFO - Starting worker compute stream, tcp://127.0.0.1:60282
distributed.scheduler - INFO - Register tcp://127.0.0.1:60285
distributed.scheduler - INFO - Register tcp://127.0.0.1:60286
distributed.scheduler - INFO - Starting worker compute stream, tcp://127.0.0.1:60285
distributed.scheduler - INFO - Starting worker compute stream, tcp://127.0.0.1:60286
distributed.scheduler - INFO - Receive client connection: Client-6b6ba1d0-b3bd-11e9-9bd0-acde48001122&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;

&lt;details&gt;
&lt;summary&gt;tcp://127.0.0.1:60281&lt;/summary&gt;
&lt;pre&gt;&lt;code&gt;distributed.worker - INFO -       Start worker at:      tcp://127.0.0.1:60281
distributed.worker - INFO -          Listening to:      tcp://127.0.0.1:60281
distributed.worker - INFO - Waiting to connect to:      tcp://127.0.0.1:60275
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -               Threads:                          3
distributed.worker - INFO -                Memory:                    4.29 GB
distributed.worker - INFO -       Local Directory: /Users/mrocklin/workspace/dask/dask-worker-space/worker-c4_44fym
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -         Registered to:      tcp://127.0.0.1:60275
distributed.worker - INFO - -------------------------------------------------&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;tcp://127.0.0.1:60282&lt;/summary&gt;
&lt;pre&gt;&lt;code&gt;distributed.worker - INFO -       Start worker at:      tcp://127.0.0.1:60282
distributed.worker - INFO -          Listening to:      tcp://127.0.0.1:60282
distributed.worker - INFO - Waiting to connect to:      tcp://127.0.0.1:60275
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -               Threads:                          3
distributed.worker - INFO -                Memory:                    4.29 GB
distributed.worker - INFO -       Local Directory: /Users/mrocklin/workspace/dask/dask-worker-space/worker-quu4taje
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -         Registered to:      tcp://127.0.0.1:60275
distributed.worker - INFO - -------------------------------------------------&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;tcp://127.0.0.1:60285&lt;/summary&gt;
&lt;pre&gt;&lt;code&gt;distributed.worker - INFO -       Start worker at:      tcp://127.0.0.1:60285
distributed.worker - INFO -          Listening to:      tcp://127.0.0.1:60285
distributed.worker - INFO - Waiting to connect to:      tcp://127.0.0.1:60275
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -               Threads:                          3
distributed.worker - INFO -                Memory:                    4.29 GB
distributed.worker - INFO -       Local Directory: /Users/mrocklin/workspace/dask/dask-worker-space/worker-ll4cozug
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -         Registered to:      tcp://127.0.0.1:60275
distributed.worker - INFO - -------------------------------------------------&lt;/code&gt;&lt;/pre&gt;
&lt;/details&gt;
&lt;details&gt;&lt;summary&gt;tcp://127.0.0.1:60286&lt;/summary&gt;&lt;pre&gt;&lt;code&gt;distributed.worker - INFO -       Start worker at:      tcp://127.0.0.1:60286
distributed.worker - INFO -          Listening to:      tcp://127.0.0.1:60286
distributed.worker - INFO - Waiting to connect to:      tcp://127.0.0.1:60275
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -               Threads:                          3
distributed.worker - INFO -                Memory:                    4.29 GB
distributed.worker - INFO -       Local Directory: /Users/mrocklin/workspace/dask/dask-worker-space/worker-lpbkkzj6
distributed.worker - INFO - -------------------------------------------------
distributed.worker - INFO -         Registered to:      tcp://127.0.0.1:60275
distributed.worker - INFO - -------------------------------------------------&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: this looks better under any browser other than IE and Edge&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/jacobtomlinson&quot;&gt;Jacob Tomlinson&lt;/a&gt; for this work.&lt;/p&gt;

&lt;h2 id=&quot;3---hyperparameter-selection-with-hyperband&quot;&gt;3 - Hyperparameter selection with HyperBand&lt;/h2&gt;

&lt;p&gt;Dask-ML 1.0 has been released with a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HyperBandSearchCV&lt;/code&gt; meta-estimator for
hyper-parameter optimization. This can be used as an alternative to
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomizedSearchCV&lt;/code&gt; to find similar hyper-parameters in less time by not
wasting time on hyper-parameters that are not promising.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_ml.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_ml.datasets&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_classification&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.linear_model&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SGDClassifier&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_classification&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SGDClassifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tol&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1e-3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;param_dist&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;alpha&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logspace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;               &lt;span class=&quot;s&quot;&gt;&apos;loss&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;hinge&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;log&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;modified_huber&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;squared_hinge&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;               &lt;span class=&quot;s&quot;&gt;&apos;average&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]}&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HyperbandSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;param_dist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;classes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;unique&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;best_params_&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;loss&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;log&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;average&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;alpha&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.0080502&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;http://github.com/stsievert&quot;&gt;Scott Sievert&lt;/a&gt;.
You can see Scott talk about this topic in greater depth by watching his
&lt;a href=&quot;https://youtu.be/x67K9FiPFBQ&quot;&gt;SciPy 2019 talk&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;4---move-bytes-io-handling-out-of-dask-to-fsspec&quot;&gt;4 - Move bytes I/O handling out of Dask to FSSpec&lt;/h2&gt;

&lt;p&gt;We’ve spun out Dask’s internal code to read and write raw data to different
storage systems out to a separate project, &lt;a href=&quot;https://fsspec.readthedocs.io&quot;&gt;fsspec&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is a small example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;fsspec&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fsspec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://github.com/dask/dask/edit/master/README.rst&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fsspec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;s3://bucket/myfile.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fsspec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hdfs:///path/to/myfile.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fsspec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;gcs://bucket/myfile.csv&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dask’s I/O infrastructure to read and write bytes from systems like
HDFS, S3, GCS, Azure, and other remote storage systems is arguably the most
uniform and comprehensive in Python today. Through tooling like
&lt;a href=&quot;https://s3fs.readthedocs.io&quot;&gt;s3fs&lt;/a&gt;, &lt;a href=&quot;https://gcsfs.readthedocs.io&quot;&gt;gcsfs&lt;/a&gt;,
and &lt;del&gt;hdfs3&lt;/del&gt; &lt;a href=&quot;https://arrow.apache.org/docs/python/filesystems.html&quot;&gt;pyarrow.hdfs&lt;/a&gt;,
it’s easy to read and write data in a Pythonic way to a
variety of remote storage systems.&lt;/p&gt;

&lt;p&gt;Early on we decided that we wanted this code to live outside of the mainline
Dask codebase, which is why they are independent projects.
This choice allowed other libraries, like Pandas, Zarr, and others to benefit
from this work, without a strict dependency on Dask.
However, there was still code within Dask that helped to unify them a bit.
We’ve moved this code out to an external project,
&lt;a href=&quot;https://filesystem-spec.readthedocs.io/en/latest&quot;&gt;fsspec&lt;/a&gt; which includes all
of the centralization code that Dask used to provide, as well as a formal
specification for what a remote data system should look like in order to be
compatible. This also helps to unify efforts with other projects like Arrow.&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a href=&quot;https://github.com/martindurant&quot;&gt;Martin Durant&lt;/a&gt; for
shepherding Dask’s I/O infrastructure over the years, and for doing the more
immediate work of splitting out &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fsspec&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can read more about FSSpec and its transition out of Dask
&lt;a href=&quot;https://blog.dask.org/2019/07/23/extracting-fsspec-from-dask&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;5---asyncawait-everywhere-and-cleaner-setup-for-developers&quot;&gt;5 - Async/Await everywhere, and cleaner setup for developers&lt;/h2&gt;

&lt;p&gt;In Dask 2.0 we dropped Python 2 support and now support only Python 3.5 and
above.
This allows us to adopt async and await syntax for concurrent execution rather
than an older coroutine based approach with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;yield&lt;/code&gt;. The differences here
started out as largely aesthetic, but triggered a number of substantive
improvements as we walked through the codebase cleaning things up. Starting
and stopping internal Scheduler, Worker, Nanny, and Client objects is now far
more uniform, reducing the presence of subtle bugs.&lt;/p&gt;

&lt;p&gt;This is discussed in more detail in the &lt;a href=&quot;https://docs.dask.org/en/latest/setup/python-advanced.html&quot;&gt;Python API setup
documentation&lt;/a&gt; and
is encapsulated in this code example from those docs:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;asyncio&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Worker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Worker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Worker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;asynchronous&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;future&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;future&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;asyncio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_event_loop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run_until_complete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As a result of this and other internal cleanup intermittent testing failures in
our CI have disappeared, and developer mood is high :)&lt;/p&gt;

&lt;h2 id=&quot;6---a-new-sshcluster&quot;&gt;6 - A new SSHCluster&lt;/h2&gt;

&lt;p&gt;We’ve added a second SSH cluster deployment solution. It looks like this:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;distributed.deploy.ssh2&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# this will move in future releases
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SSHCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;hosts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;host1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;host2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;host3&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;host4&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# hosts=[&quot;localhost&quot;] * 4  # if you want to try this out locally,
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;worker_kwargs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;nthreads&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;scheduler_kwargs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;connect_kwargs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;known_hosts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note that this object is experimental, and subject to change without notice&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We worked on this for two reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Our user survey showed that a surprising number of people were deploying
Dask with SSH. Anecdotally they seem to be just SSHing into machines and
then using Dask’s normal &lt;a href=&quot;https://docs.dask.org/en/latest/setup/cli.html&quot;&gt;Dask Command Line
Interface&lt;/a&gt;)&lt;/p&gt;

    &lt;p&gt;We wanted a solution that was easier than this.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We’ve been trying to unify the code in the various deployment solutions
(like Kubernetes, SLURM, Yarn/Hadoop) to a central codebase, and having a
simple SSHCluster as a test case has proven valuable for testing and
experimentation.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Also note, Dask already has a
&lt;a href=&quot;https://docs.dask.org/en/latest/setup/ssh.html&quot;&gt;dask-ssh&lt;/a&gt; solution today that is more mature&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We expect that unification of deployment will be a central theme for the next
few months of development.&lt;/p&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;There have been two releases since the last time we had a release blogpost.
The following people contributed to the following repositories since the 2.0
release on June 30th:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask&quot;&gt;dask/dask&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Brett Naul&lt;/li&gt;
      &lt;li&gt;Daniel Saxton&lt;/li&gt;
      &lt;li&gt;David Brochart&lt;/li&gt;
      &lt;li&gt;Davis Bennett&lt;/li&gt;
      &lt;li&gt;Elliott Sales de Andrade&lt;/li&gt;
      &lt;li&gt;GALI PREM SAGAR&lt;/li&gt;
      &lt;li&gt;James Bourbeau&lt;/li&gt;
      &lt;li&gt;Jim Crist&lt;/li&gt;
      &lt;li&gt;Loïc Estève&lt;/li&gt;
      &lt;li&gt;Martin Durant&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Matthias Bussonnier&lt;/li&gt;
      &lt;li&gt;Natalya Rapstine&lt;/li&gt;
      &lt;li&gt;Nick Becker&lt;/li&gt;
      &lt;li&gt;Peter Andreas Entschev&lt;/li&gt;
      &lt;li&gt;Ralf Gommers&lt;/li&gt;
      &lt;li&gt;Richard (Rick) Zamora&lt;/li&gt;
      &lt;li&gt;Sarah Bird&lt;/li&gt;
      &lt;li&gt;Sean McKenna&lt;/li&gt;
      &lt;li&gt;Tom Augspurger&lt;/li&gt;
      &lt;li&gt;Willi Rath&lt;/li&gt;
      &lt;li&gt;Xavier Holt&lt;/li&gt;
      &lt;li&gt;andrethrill&lt;/li&gt;
      &lt;li&gt;asmith26&lt;/li&gt;
      &lt;li&gt;msbrown47&lt;/li&gt;
      &lt;li&gt;tshatrov&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed&quot;&gt;dask/distributed&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Christian Hudon&lt;/li&gt;
      &lt;li&gt;Gabriel Sailer&lt;/li&gt;
      &lt;li&gt;Jacob Tomlinson&lt;/li&gt;
      &lt;li&gt;James Bourbeau&lt;/li&gt;
      &lt;li&gt;Jim Crist&lt;/li&gt;
      &lt;li&gt;Martin Durant&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Pierre Glaser&lt;/li&gt;
      &lt;li&gt;Russ Bubley&lt;/li&gt;
      &lt;li&gt;tjb900&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-jobqueue&quot;&gt;dask/dask-jobqueue&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Guillaume Eynard-Bontemps&lt;/li&gt;
      &lt;li&gt;Leo Singer&lt;/li&gt;
      &lt;li&gt;Loïc Estève&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Stuart Berg&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-examples&quot;&gt;dask/dask-examples&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Chris White&lt;/li&gt;
      &lt;li&gt;Ian Rose&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-mpi&quot;&gt;dask/dask-mpi&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Anderson Banihirwe&lt;/li&gt;
      &lt;li&gt;Kevin Paul&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-kubernetes&quot;&gt;dask/dask-kubernetes&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Tom Augspurger&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml&quot;&gt;dask/dask-ml&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Roman Yurchak&lt;/li&gt;
      &lt;li&gt;Tom Augspurger&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-yarn&quot;&gt;dask/dask-yarn&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Al Johri&lt;/li&gt;
      &lt;li&gt;Jim Crist&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-examples&quot;&gt;dask/dask-examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Extracting fsspec from Dask</title>
   <link href="https://blog.dask.org/2019/07/23/extracting-fsspec-from-dask"/>
   <updated>2019-07-23T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/07/23/extracting-fsspec-from-dask</id>
   
   <category>IO</category>
   
   <content type="html">
&lt;h2 id=&quot;tldr&quot;&gt;TL;DR&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fsspec&lt;/code&gt;, the new base for file system operations in Dask, Intake, s3fs, gcsfs and others,
is now available as a stand-alone interface and central place to develop new backends
and file operations. Although it was developed as part of Dask, you no longer need Dask
to use this functionality.&lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Over the past few years, Dask’s IO capability has grown gradually and organically, to
include a number of file-formats, and the ability to access data seamlessly on various
remote/cloud data systems. This has been achieved through a number of sister packages
for viewing cloud resources as file systems, and dedicated code in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.bytes&lt;/code&gt;.
Some of the storage backends, particularly &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s3fs&lt;/code&gt;, became immediately useful outside of
Dask too, and were picked up as optional dependencies by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pandas&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xarray&lt;/code&gt; and others.&lt;/p&gt;

&lt;p&gt;For the sake of consolidating the behaviours of the
various backends, providing a single reference specification for any new backends,
and to make this set of file system operations available even without Dask, I
created &lt;a href=&quot;https://filesystem-spec.readthedocs.io/en/latest/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fsspec&lt;/code&gt;&lt;/a&gt;.
This last week, Dask changed to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fsspec&lt;/code&gt; directly for its
IO needs, and I would like to describe in detail here the benefits of this change.&lt;/p&gt;

&lt;p&gt;Although this was done initially to easy the maintenance burden, the important takeaway
is that we want to make file systems operations easily available to the whole pydata ecosystem,
with or without Dask.&lt;/p&gt;

&lt;h2 id=&quot;history&quot;&gt;History&lt;/h2&gt;

&lt;p&gt;The first file system I wrote was &lt;a href=&quot;https://github.com/dask/hdfs3&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hdfs3&lt;/code&gt;&lt;/a&gt;, a thin wrapper
around the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;libhdfs3&lt;/code&gt; C library. At the time, Dask had acquired the ability to run on a
distributed cluster, and HDFS was the most popular storage solution for these (in the
commercial world, at least), so a solution was required. The python API closely matched
the C one, which in turn followed the Java API and posix standards. Fortunately, python already
has a &lt;a href=&quot;https://docs.python.org/3/library/io.html#i-o-base-classes&quot;&gt;file-like standard&lt;/a&gt;, so
providing objects that implemented that was enough to make remote bytes available to many
packages.&lt;/p&gt;

&lt;p&gt;Pretty soon, it became apparent that cloud resources would be at least as important as in-cluster
file systems, and so followed &lt;a href=&quot;https://github.com/dask/s3fs&quot;&gt;s3fs&lt;/a&gt;,
&lt;a href=&quot;https://github.com/Azure/azure-data-lake-store-python&quot;&gt;adlfs&lt;/a&gt;, and &lt;a href=&quot;https://github.com/dask/gcsfs&quot;&gt;gcsfs&lt;/a&gt;.
Each followed the same pattern, but with some specific code for the given interface, and
improvements based on the experience of the previous interfaces. During this time, Dask’s
needs also evolved, due to more complex file formats such as parquet. Code to interface to
the different backends and adapt their methods ended up in the Dask repository.&lt;/p&gt;

&lt;p&gt;In the meantime, other file system interfaces arrived, particularly
&lt;a href=&quot;https://arrow.apache.org/docs/python/filesystems.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pyarrow&lt;/code&gt;’s&lt;/a&gt;, which had its own HDFS
implementation and direct parquet reading. But we would like all of the tools in
the ecosystem to work together well, so that Dask can read parquet using either
engine from any of the storage backends.&lt;/p&gt;

&lt;h2 id=&quot;code-duplication&quot;&gt;Code duplication&lt;/h2&gt;

&lt;p&gt;Copying an interface, adapting it and releasing it, as I did with each iteration of the file system,
is certainly a quick way to get a job done. However, when you then want to change the behaviour, or
add new functionality, it turns out you need to repeat the work in each place
(violating the &lt;a href=&quot;https://en.wikipedia.org/wiki/Don%27t_repeat_yourself&quot;&gt;DRY&lt;/a&gt; principle) or have
the interfaces diverge slowly. Good examples of this were &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;glob&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;walk&lt;/code&gt;, which supported various
options for the former, and returned different things (list, versions dir/files iterator) for the
latter.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;bytes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LocalFileSystem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;walk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/home/path/&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iterator&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tuples&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s3fs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;S3FileSystme&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;walk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;bucket/path&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We found that, for Dask’s needs, we needed to build small wrapper
classes to ensure compatible APIs to all backends, as well as a class for operating on the local
file system with the same interface, and finally a registry for all of these with various helper
functions. Very little of this was specific to Dask, with only a couple of
functions concerning themselves with building graphs and deferred execution. It did, however,
raise the important issue that file systems should be serializable and that there should
be a way to specify a file to be opened, which is also serializable (and ideally supports
transparent text and compression).&lt;/p&gt;

&lt;h2 id=&quot;new-file-systems&quot;&gt;New file systems&lt;/h2&gt;

&lt;p&gt;I already mentioned the effort to make a local file system class which met the same interface as
the other ones which already existed. But there are more options that Dask users (and others)
might want, such as ssh, ftp, http, in-memory, and so on. Following requests from users to handle these options,
we started to write more file system interfaces, which all lived within &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.bytes&lt;/code&gt;; but it was unclear
whether they should only support very minimal functionality, just enough to get something done from
Dask, or a full set of file operations.&lt;/p&gt;

&lt;p&gt;The in-memory file system, in particular, existed in an extremely long-lived PR - it’s not
clear how useful such a thing is to Dask, when each worker has it’s own memory, and so sees
a different state of the “file system”.&lt;/p&gt;

&lt;h2 id=&quot;consolidation&quot;&gt;Consolidation&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/intake/filesystem_spec&quot;&gt;file system Spec&lt;/a&gt;, later &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fsspec&lt;/code&gt;, was born out of a desire
to codify and consolidate the behaviours of the storage backends, reduce duplication, and provide the
same functionality to all backends. In the process, it became much easier to write new implementation
classes: see the &lt;a href=&quot;https://filesystem-spec.readthedocs.io/en/latest/api.html#built-in-implementations&quot;&gt;implementation&lt;/a&gt;,
which include interesting and highly experimental options such as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CachingFileSystem&lt;/code&gt;, which
makes local copies of every remote read, for faster access the second time around. However, more
important main-stream implementations also took shape, such as FTP, SSH, Memory and webHDFS
(the latter being the best bet for accessing HDFS from outside the cluster, following all the
problems building and authenticating with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hdfs3&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Furthermore, the new repository gave the opportunity to implement new features, which would then have
further-reaching applicability than if they had been done in just selected repositories. Examples include
FUSE mounting, dictionary-style key-value views on file systems
(such as used by &lt;a href=&quot;https://zarr.readthedocs.io/en/stable/&quot;&gt;zarr&lt;/a&gt;), and transactional writing of
files. All file systems are serializable and pyarrow-compliant.&lt;/p&gt;

&lt;h2 id=&quot;usefulness&quot;&gt;Usefulness&lt;/h2&gt;

&lt;p&gt;Eventually it dawned on my that the operations offered by the file system classes are very useful
for people not using Dask too. Indeed, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s3fs&lt;/code&gt;, for example, sees plenty of use stand-alone, or in
conjunction with something like fastparquet, which can accept file system functions to its method,
or pandas.&lt;/p&gt;

&lt;p&gt;So it seemed to make sense to have a particular repo to write out the spec that a Dask-compliant
file system should adhere to, and I found that I could factor out a lot of common behaviour from
the existing implementations, provide functionality that had existed in only some to all, and
generally improve every implementation along the way.&lt;/p&gt;

&lt;p&gt;However, it was when considering &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fsspec&lt;/code&gt; in conjunction with &lt;a href=&quot;https://github.com/intake/intake/pull/381&quot;&gt;Intake&lt;/a&gt;
that I realised how generally useful a stand-alone file system package can be: the PR
implemented a generalised file selector that can browse files in any file system that we
have available, even being able, for instance, to view a remote zip-file on S3 as a
browseable file system. Note that, similar to the general thrust of this blog, the
file selector itself need not live in the Intake repo and will eventually become either
its own thing, or an optional feature of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fsspec&lt;/code&gt;. You shouldn’t need Intake either just
to get generalised file system operations.&lt;/p&gt;

&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;

&lt;p&gt;This work is not quite on the level of “protocol standards” such as the well-know python buffer
protocol, but I think it is a useful step in making data in various storage services available
to people, since you can operate on each with the same API, expect the same behaviour, and
create real python file-like objects to pass to other functions. Having a single central repo
like this offers an obvious place to discuss and amend the spec, and build extra functionality
onto it.&lt;/p&gt;

&lt;p&gt;Many improvements remain to be done, such as support for globstrings in more functions, or
a single file system which can dispatch to the various backends depending on the form of the
URL provided; but there is now an obvious place for all of this to happen.&lt;/p&gt;
</content>
 </entry>
 
 
 
 
 
 <entry>
   <title>Dask Release 2.0</title>
   <link href="https://blog.dask.org/2019/06/22/dask-2.0"/>
   <updated>2019-06-22T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/06/22/dask-2.0</id>
   
   <category>release</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;Please take the &lt;a href=&quot;https://t.co/OGrIjTLC2G&quot;&gt;Dask User Survey for 2019&lt;/a&gt;.&lt;/em&gt;
&lt;em&gt;Your reponse helps to prioritize future work.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;We are pleased to announce the release of Dask version 2.0.
This is a major release with bug fixes and new features.&lt;/p&gt;

&lt;p&gt;Most major version changes of software signal many new and exciting features.
That is not the case with this release.
Instead, we’re bumping the major version number because
we’ve broken a few APIs to improve maintainability,
and because we decided to drop support for Python 2.&lt;/p&gt;

&lt;p&gt;This blogpost outlines these changes.&lt;/p&gt;

&lt;h2 id=&quot;install&quot;&gt;Install&lt;/h2&gt;

&lt;p&gt;As always, you can conda install Dask:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install dask
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or pip install from PyPI:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install &quot;dask[complete]&quot; --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Full changelogs are available here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;drop-support-for-python-2&quot;&gt;Drop support for Python 2&lt;/h2&gt;

&lt;p&gt;Python 2 reaches end of life in 2020, just six months away. Most major PyData
projects are dropping Python 2 support around now. See the &lt;a href=&quot;https://python3statement.org/&quot;&gt;Python 3
Statement&lt;/a&gt; for more details about some of your
favorite projects.&lt;/p&gt;

&lt;p&gt;Python 2 users can continue to use older versions of Dask, which are in
widespread use today. Institutions looking for long term support of Dask in
Python 2 may wish to reach out to for-profit consulting companies, like
&lt;a href=&quot;https://www.quansight.com/&quot;&gt;Quansight&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dropping Python 2 will allow maintainers to spend more of their time fixing
bugs and developing new features. It will also allow the project to adopt more
modern development practices going forward.&lt;/p&gt;

&lt;h2 id=&quot;small-breaking-changes&quot;&gt;Small breaking changes&lt;/h2&gt;

&lt;p&gt;We now include a list with a brief description of most of the breaking changes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The distributed.bokeh module has moved to distributed.dashboard&lt;/li&gt;
  &lt;li&gt;Various &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ncores&lt;/code&gt; keywords have been moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nthreads&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Client.map/gather/scatter no longer accept iterators and Python queue
objects. Users can handle this themselves with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;submit&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;as_completed&lt;/code&gt; or
can use the &lt;a href=&quot;https://github.com/python-streamz/streamz&quot;&gt;Streamz&lt;/a&gt; library.&lt;/li&gt;
  &lt;li&gt;The worker &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/main&lt;/code&gt; route has moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/status&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Cluster.workers is now a dictionary mapping worker name to worker, rather
than a list as it was before&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;some-larger-fun-changes&quot;&gt;Some larger fun changes&lt;/h2&gt;

&lt;p&gt;We didn’t only break things. We also added some new things :)&lt;/p&gt;

&lt;h3 id=&quot;array-metadata&quot;&gt;Array metadata&lt;/h3&gt;

&lt;p&gt;Previously Dask Arrays were defined by their shape, chunkshape, and datatype,
like float, int, and so on.&lt;/p&gt;

&lt;p&gt;Now, Dask Arrays also know the type of their chunks. Historically this was
almost always a NumPy array, so it didn’t make sense to store, but now that
Dask Arrays are being used more frequently with sparse array chunks and GPU
array chunks we now maintain this information as well in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;._meta&lt;/code&gt; attribute.
This is already how Dask dataframes work, so it should be familiar to advanced
users of that module.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;eye&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_meta&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sparse&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sparse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;COO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_meta&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;COO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nnz&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fill_value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This work was largely done by &lt;a href=&quot;https://github.com/pentschev&quot;&gt;Peter Entschev&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;array-html-output&quot;&gt;Array HTML output&lt;/h3&gt;

&lt;p&gt;Dask arrays now print themselves nicely in Jupyter notebooks, showing a table
of information about their size and chunk size, and also a visual diagram of
their chunk structure.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 80.00 GB &lt;/td&gt; &lt;td&gt; 125.00 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (10000, 1000, 1000) &lt;/td&gt; &lt;td&gt; (250, 250, 250) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 640 Tasks &lt;/td&gt;&lt;td&gt; 640 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; float64 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;241&quot; height=&quot;231&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;127&quot; y2=&quot;117&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;16&quot; x2=&quot;127&quot; y2=&quot;133&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;32&quot; x2=&quot;127&quot; y2=&quot;149&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;48&quot; x2=&quot;127&quot; y2=&quot;165&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;64&quot; x2=&quot;127&quot; y2=&quot;181&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;64&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;2&quot; x2=&quot;12&quot; y2=&quot;67&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;5&quot; x2=&quot;15&quot; y2=&quot;70&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;8&quot; x2=&quot;18&quot; y2=&quot;73&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;11&quot; x2=&quot;21&quot; y2=&quot;76&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;14&quot; x2=&quot;24&quot; y2=&quot;79&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;27&quot; y2=&quot;81&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;20&quot; x2=&quot;30&quot; y2=&quot;84&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;23&quot; x2=&quot;33&quot; y2=&quot;87&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;26&quot; x2=&quot;36&quot; y2=&quot;90&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;29&quot; x2=&quot;39&quot; y2=&quot;93&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;42&quot; y2=&quot;96&quot; /&gt;
  &lt;line x1=&quot;45&quot; y1=&quot;35&quot; x2=&quot;45&quot; y2=&quot;99&quot; /&gt;
  &lt;line x1=&quot;48&quot; y1=&quot;38&quot; x2=&quot;48&quot; y2=&quot;102&quot; /&gt;
  &lt;line x1=&quot;51&quot; y1=&quot;41&quot; x2=&quot;51&quot; y2=&quot;105&quot; /&gt;
  &lt;line x1=&quot;54&quot; y1=&quot;44&quot; x2=&quot;54&quot; y2=&quot;108&quot; /&gt;
  &lt;line x1=&quot;57&quot; y1=&quot;47&quot; x2=&quot;57&quot; y2=&quot;111&quot; /&gt;
  &lt;line x1=&quot;60&quot; y1=&quot;50&quot; x2=&quot;60&quot; y2=&quot;114&quot; /&gt;
  &lt;line x1=&quot;62&quot; y1=&quot;52&quot; x2=&quot;62&quot; y2=&quot;117&quot; /&gt;
  &lt;line x1=&quot;65&quot; y1=&quot;55&quot; x2=&quot;65&quot; y2=&quot;120&quot; /&gt;
  &lt;line x1=&quot;68&quot; y1=&quot;58&quot; x2=&quot;68&quot; y2=&quot;123&quot; /&gt;
  &lt;line x1=&quot;71&quot; y1=&quot;61&quot; x2=&quot;71&quot; y2=&quot;126&quot; /&gt;
  &lt;line x1=&quot;74&quot; y1=&quot;64&quot; x2=&quot;74&quot; y2=&quot;129&quot; /&gt;
  &lt;line x1=&quot;77&quot; y1=&quot;67&quot; x2=&quot;77&quot; y2=&quot;131&quot; /&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;80&quot; y2=&quot;134&quot; /&gt;
  &lt;line x1=&quot;83&quot; y1=&quot;73&quot; x2=&quot;83&quot; y2=&quot;137&quot; /&gt;
  &lt;line x1=&quot;86&quot; y1=&quot;76&quot; x2=&quot;86&quot; y2=&quot;140&quot; /&gt;
  &lt;line x1=&quot;89&quot; y1=&quot;79&quot; x2=&quot;89&quot; y2=&quot;143&quot; /&gt;
  &lt;line x1=&quot;92&quot; y1=&quot;82&quot; x2=&quot;92&quot; y2=&quot;146&quot; /&gt;
  &lt;line x1=&quot;95&quot; y1=&quot;85&quot; x2=&quot;95&quot; y2=&quot;149&quot; /&gt;
  &lt;line x1=&quot;98&quot; y1=&quot;88&quot; x2=&quot;98&quot; y2=&quot;152&quot; /&gt;
  &lt;line x1=&quot;101&quot; y1=&quot;91&quot; x2=&quot;101&quot; y2=&quot;155&quot; /&gt;
  &lt;line x1=&quot;104&quot; y1=&quot;94&quot; x2=&quot;104&quot; y2=&quot;158&quot; /&gt;
  &lt;line x1=&quot;107&quot; y1=&quot;97&quot; x2=&quot;107&quot; y2=&quot;161&quot; /&gt;
  &lt;line x1=&quot;110&quot; y1=&quot;100&quot; x2=&quot;110&quot; y2=&quot;164&quot; /&gt;
  &lt;line x1=&quot;112&quot; y1=&quot;102&quot; x2=&quot;112&quot; y2=&quot;167&quot; /&gt;
  &lt;line x1=&quot;115&quot; y1=&quot;105&quot; x2=&quot;115&quot; y2=&quot;170&quot; /&gt;
  &lt;line x1=&quot;118&quot; y1=&quot;108&quot; x2=&quot;118&quot; y2=&quot;173&quot; /&gt;
  &lt;line x1=&quot;121&quot; y1=&quot;111&quot; x2=&quot;121&quot; y2=&quot;176&quot; /&gt;
  &lt;line x1=&quot;124&quot; y1=&quot;114&quot; x2=&quot;124&quot; y2=&quot;179&quot; /&gt;
  &lt;line x1=&quot;127&quot; y1=&quot;117&quot; x2=&quot;127&quot; y2=&quot;181&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 127.647059,117.647059 127.647059,181.975164 10.000000,64.328105&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;74&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;2&quot; x2=&quot;77&quot; y2=&quot;2&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;5&quot; x2=&quot;80&quot; y2=&quot;5&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;8&quot; x2=&quot;83&quot; y2=&quot;8&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;11&quot; x2=&quot;86&quot; y2=&quot;11&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;14&quot; x2=&quot;89&quot; y2=&quot;14&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;91&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;20&quot; x2=&quot;94&quot; y2=&quot;20&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;23&quot; x2=&quot;97&quot; y2=&quot;23&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;26&quot; x2=&quot;100&quot; y2=&quot;26&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;29&quot; x2=&quot;103&quot; y2=&quot;29&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;32&quot; x2=&quot;106&quot; y2=&quot;32&quot; /&gt;
  &lt;line x1=&quot;45&quot; y1=&quot;35&quot; x2=&quot;109&quot; y2=&quot;35&quot; /&gt;
  &lt;line x1=&quot;48&quot; y1=&quot;38&quot; x2=&quot;112&quot; y2=&quot;38&quot; /&gt;
  &lt;line x1=&quot;51&quot; y1=&quot;41&quot; x2=&quot;115&quot; y2=&quot;41&quot; /&gt;
  &lt;line x1=&quot;54&quot; y1=&quot;44&quot; x2=&quot;118&quot; y2=&quot;44&quot; /&gt;
  &lt;line x1=&quot;57&quot; y1=&quot;47&quot; x2=&quot;121&quot; y2=&quot;47&quot; /&gt;
  &lt;line x1=&quot;60&quot; y1=&quot;50&quot; x2=&quot;124&quot; y2=&quot;50&quot; /&gt;
  &lt;line x1=&quot;62&quot; y1=&quot;52&quot; x2=&quot;127&quot; y2=&quot;52&quot; /&gt;
  &lt;line x1=&quot;65&quot; y1=&quot;55&quot; x2=&quot;130&quot; y2=&quot;55&quot; /&gt;
  &lt;line x1=&quot;68&quot; y1=&quot;58&quot; x2=&quot;133&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;71&quot; y1=&quot;61&quot; x2=&quot;136&quot; y2=&quot;61&quot; /&gt;
  &lt;line x1=&quot;74&quot; y1=&quot;64&quot; x2=&quot;139&quot; y2=&quot;64&quot; /&gt;
  &lt;line x1=&quot;77&quot; y1=&quot;67&quot; x2=&quot;141&quot; y2=&quot;67&quot; /&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;144&quot; y2=&quot;70&quot; /&gt;
  &lt;line x1=&quot;83&quot; y1=&quot;73&quot; x2=&quot;147&quot; y2=&quot;73&quot; /&gt;
  &lt;line x1=&quot;86&quot; y1=&quot;76&quot; x2=&quot;150&quot; y2=&quot;76&quot; /&gt;
  &lt;line x1=&quot;89&quot; y1=&quot;79&quot; x2=&quot;153&quot; y2=&quot;79&quot; /&gt;
  &lt;line x1=&quot;92&quot; y1=&quot;82&quot; x2=&quot;156&quot; y2=&quot;82&quot; /&gt;
  &lt;line x1=&quot;95&quot; y1=&quot;85&quot; x2=&quot;159&quot; y2=&quot;85&quot; /&gt;
  &lt;line x1=&quot;98&quot; y1=&quot;88&quot; x2=&quot;162&quot; y2=&quot;88&quot; /&gt;
  &lt;line x1=&quot;101&quot; y1=&quot;91&quot; x2=&quot;165&quot; y2=&quot;91&quot; /&gt;
  &lt;line x1=&quot;104&quot; y1=&quot;94&quot; x2=&quot;168&quot; y2=&quot;94&quot; /&gt;
  &lt;line x1=&quot;107&quot; y1=&quot;97&quot; x2=&quot;171&quot; y2=&quot;97&quot; /&gt;
  &lt;line x1=&quot;110&quot; y1=&quot;100&quot; x2=&quot;174&quot; y2=&quot;100&quot; /&gt;
  &lt;line x1=&quot;112&quot; y1=&quot;102&quot; x2=&quot;177&quot; y2=&quot;102&quot; /&gt;
  &lt;line x1=&quot;115&quot; y1=&quot;105&quot; x2=&quot;180&quot; y2=&quot;105&quot; /&gt;
  &lt;line x1=&quot;118&quot; y1=&quot;108&quot; x2=&quot;183&quot; y2=&quot;108&quot; /&gt;
  &lt;line x1=&quot;121&quot; y1=&quot;111&quot; x2=&quot;186&quot; y2=&quot;111&quot; /&gt;
  &lt;line x1=&quot;124&quot; y1=&quot;114&quot; x2=&quot;189&quot; y2=&quot;114&quot; /&gt;
  &lt;line x1=&quot;127&quot; y1=&quot;117&quot; x2=&quot;191&quot; y2=&quot;117&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;127&quot; y2=&quot;117&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;143&quot; y2=&quot;117&quot; /&gt;
  &lt;line x1=&quot;42&quot; y1=&quot;0&quot; x2=&quot;159&quot; y2=&quot;117&quot; /&gt;
  &lt;line x1=&quot;58&quot; y1=&quot;0&quot; x2=&quot;175&quot; y2=&quot;117&quot; /&gt;
  &lt;line x1=&quot;74&quot; y1=&quot;0&quot; x2=&quot;191&quot; y2=&quot;117&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 74.328105,0.000000 191.975164,117.647059 127.647059,117.647059&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;127&quot; y1=&quot;117&quot; x2=&quot;191&quot; y2=&quot;117&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;127&quot; y1=&quot;133&quot; x2=&quot;191&quot; y2=&quot;133&quot; /&gt;
  &lt;line x1=&quot;127&quot; y1=&quot;149&quot; x2=&quot;191&quot; y2=&quot;149&quot; /&gt;
  &lt;line x1=&quot;127&quot; y1=&quot;165&quot; x2=&quot;191&quot; y2=&quot;165&quot; /&gt;
  &lt;line x1=&quot;127&quot; y1=&quot;181&quot; x2=&quot;191&quot; y2=&quot;181&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;127&quot; y1=&quot;117&quot; x2=&quot;127&quot; y2=&quot;181&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;143&quot; y1=&quot;117&quot; x2=&quot;143&quot; y2=&quot;181&quot; /&gt;
  &lt;line x1=&quot;159&quot; y1=&quot;117&quot; x2=&quot;159&quot; y2=&quot;181&quot; /&gt;
  &lt;line x1=&quot;175&quot; y1=&quot;117&quot; x2=&quot;175&quot; y2=&quot;181&quot; /&gt;
  &lt;line x1=&quot;191&quot; y1=&quot;117&quot; x2=&quot;191&quot; y2=&quot;181&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;127.647059,117.647059 191.975164,117.647059 191.975164,181.975164 127.647059,181.975164&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;159.811111&quot; y=&quot;201.975164&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;1000&lt;/text&gt;
&lt;text x=&quot;211.975164&quot; y=&quot;149.811111&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,211.975164,149.811111)&quot;&gt;1000&lt;/text&gt;
&lt;text x=&quot;58.823529&quot; y=&quot;143.151634&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,58.823529,143.151634)&quot;&gt;10000&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;h3 id=&quot;proxy-worker-dashboards-from-the-scheduler-dashboard&quot;&gt;Proxy Worker dashboards from the Scheduler dashboard&lt;/h3&gt;

&lt;p&gt;If you’ve used Dask.distributed they you’re probably familiar with Dask’s
scheduler dashboard, which shows the state of computations on the cluster with
a real-time interactive &lt;a href=&quot;https://bokeh.org&quot;&gt;Bokeh&lt;/a&gt; dashboard. However you may
not be aware that Dask workers also have their own dashboard, which shows a
completely separate set of plots for the state of that individual worker.&lt;/p&gt;

&lt;p&gt;Historically these worker dashboards haven’t been as commonly used because it’s
hard to connect to them. Users don’t know their address, or network rules
don’t enable direct web connections. Fortunately, the scheduler dashboard is
now able to proxy a connection from the user to the worker dashbaord.&lt;/p&gt;

&lt;p&gt;You can access this by clicking on the “Info” tab and then selecting the
“dashboard” link next to any of the workers. You will need to also install
&lt;a href=&quot;https://github.com/jupyterhub/jupyter-server-proxy&quot;&gt;jupyter-server-proxy&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install jupyter-server-proxy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/quasiben&quot;&gt;Ben Zaitlen&lt;/a&gt; for this fun addtition.
We hope that now that these plots are made more visible, people will invest
more into developing plots for them.&lt;/p&gt;

&lt;h3 id=&quot;black-everywhere&quot;&gt;Black everywhere&lt;/h3&gt;

&lt;p&gt;We now use the &lt;a href=&quot;https://black.readthedocs.io/&quot;&gt;Black&lt;/a&gt; code formatter throughout
most Dask repositories. These repositories include pre-commit hooks, which we
recommend when developing on the project.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cd /path/to/dask
git checkout master
git pull upstream master

pip install pre-commit
pre-commit install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Git will then call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;black&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flake8&lt;/code&gt; whenever you attempt to commit code.&lt;/p&gt;

&lt;h2 id=&quot;dask-gateway&quot;&gt;Dask Gateway&lt;/h2&gt;

&lt;p&gt;We would also like to inform readers about the somewhat new &lt;a href=&quot;https://github.com/jcrist/dask-gateway&quot;&gt;Dask
Gateway&lt;/a&gt; project that enables
institutions and IT to control many Dask clusters for a variety of users.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://jcrist.github.io/dask-gateway/_images/architecture.svg&quot; width=&quot;70%&quot; alt=&quot;Dask Gateway&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;There have been several releases since the last time we had a release blogpost.
The following people contributed to the following repositories since the 1.1.0
release on January 23rd:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/dask/dask&quot;&gt;dask/dask&lt;/a&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;(Rick) Richard J Zamora&lt;/li&gt;
      &lt;li&gt;Abhinav Ralhan&lt;/li&gt;
      &lt;li&gt;Adam Beberg&lt;/li&gt;
      &lt;li&gt;Alistair Miles&lt;/li&gt;
      &lt;li&gt;Álvaro Abella Bascarán&lt;/li&gt;
      &lt;li&gt;Anderson Banihirwe&lt;/li&gt;
      &lt;li&gt;Aploium&lt;/li&gt;
      &lt;li&gt;Bart Broere&lt;/li&gt;
      &lt;li&gt;Benjamin Zaitlen&lt;/li&gt;
      &lt;li&gt;Bouwe Andela&lt;/li&gt;
      &lt;li&gt;Brett Naul&lt;/li&gt;
      &lt;li&gt;Brian Chu&lt;/li&gt;
      &lt;li&gt;Bruce Merry&lt;/li&gt;
      &lt;li&gt;Christian Hudon&lt;/li&gt;
      &lt;li&gt;Cody Johnson&lt;/li&gt;
      &lt;li&gt;Dan O’Donovan&lt;/li&gt;
      &lt;li&gt;Daniel Saxton&lt;/li&gt;
      &lt;li&gt;Daniel Severo&lt;/li&gt;
      &lt;li&gt;Danilo Horta&lt;/li&gt;
      &lt;li&gt;Dimplexion&lt;/li&gt;
      &lt;li&gt;Elliott Sales de Andrade&lt;/li&gt;
      &lt;li&gt;Endre Mark Borza&lt;/li&gt;
      &lt;li&gt;Genevieve Buckley&lt;/li&gt;
      &lt;li&gt;George Sakkis&lt;/li&gt;
      &lt;li&gt;Guillaume Lemaitre&lt;/li&gt;
      &lt;li&gt;HSR05&lt;/li&gt;
      &lt;li&gt;Hameer Abbasi&lt;/li&gt;
      &lt;li&gt;Henrique Ribeiro&lt;/li&gt;
      &lt;li&gt;Henry Pinkard&lt;/li&gt;
      &lt;li&gt;Hugo&lt;/li&gt;
      &lt;li&gt;Ian Bolliger&lt;/li&gt;
      &lt;li&gt;Ian Rose&lt;/li&gt;
      &lt;li&gt;Isaiah Norton&lt;/li&gt;
      &lt;li&gt;James Bourbeau&lt;/li&gt;
      &lt;li&gt;Janne Vuorela&lt;/li&gt;
      &lt;li&gt;John Kirkham&lt;/li&gt;
      &lt;li&gt;Jim Crist&lt;/li&gt;
      &lt;li&gt;Joe Corbett&lt;/li&gt;
      &lt;li&gt;Jorge Pessoa&lt;/li&gt;
      &lt;li&gt;Julia Signell&lt;/li&gt;
      &lt;li&gt;JulianWgs&lt;/li&gt;
      &lt;li&gt;Justin Poehnelt&lt;/li&gt;
      &lt;li&gt;Justin Waugh&lt;/li&gt;
      &lt;li&gt;Ksenia Bobrova&lt;/li&gt;
      &lt;li&gt;Lijo Jose&lt;/li&gt;
      &lt;li&gt;Marco Neumann&lt;/li&gt;
      &lt;li&gt;Mark Bell&lt;/li&gt;
      &lt;li&gt;Martin Durant&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Michael Eaton&lt;/li&gt;
      &lt;li&gt;Michał Jastrzębski&lt;/li&gt;
      &lt;li&gt;Nathan Matare&lt;/li&gt;
      &lt;li&gt;Nick Becker&lt;/li&gt;
      &lt;li&gt;Paweł Kordek&lt;/li&gt;
      &lt;li&gt;Peter Andreas Entschev&lt;/li&gt;
      &lt;li&gt;Philipp Rudiger&lt;/li&gt;
      &lt;li&gt;Philipp S. Sommer&lt;/li&gt;
      &lt;li&gt;Roma Sokolov&lt;/li&gt;
      &lt;li&gt;Ross Petchler&lt;/li&gt;
      &lt;li&gt;Scott Sievert&lt;/li&gt;
      &lt;li&gt;Shyam Saladi&lt;/li&gt;
      &lt;li&gt;Søren Fuglede Jørgensen&lt;/li&gt;
      &lt;li&gt;Thomas Zilio&lt;/li&gt;
      &lt;li&gt;Tom Augspurger&lt;/li&gt;
      &lt;li&gt;Yu Feng&lt;/li&gt;
      &lt;li&gt;aaronfowles&lt;/li&gt;
      &lt;li&gt;amerkel2&lt;/li&gt;
      &lt;li&gt;asmith26&lt;/li&gt;
      &lt;li&gt;btw08&lt;/li&gt;
      &lt;li&gt;gregrf&lt;/li&gt;
      &lt;li&gt;mbarkhau&lt;/li&gt;
      &lt;li&gt;mcsoini&lt;/li&gt;
      &lt;li&gt;severo&lt;/li&gt;
      &lt;li&gt;tpanza&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/dask/distributed&quot;&gt;dask/distributed&lt;/a&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Adam Beberg&lt;/li&gt;
      &lt;li&gt;Benjamin Zaitlen&lt;/li&gt;
      &lt;li&gt;Brett Jurman&lt;/li&gt;
      &lt;li&gt;Brett Randall&lt;/li&gt;
      &lt;li&gt;Brian Chu&lt;/li&gt;
      &lt;li&gt;Caleb&lt;/li&gt;
      &lt;li&gt;Chris White&lt;/li&gt;
      &lt;li&gt;Daniel Farrell&lt;/li&gt;
      &lt;li&gt;Elliott Sales de Andrade&lt;/li&gt;
      &lt;li&gt;George Sakkis&lt;/li&gt;
      &lt;li&gt;James Bourbeau&lt;/li&gt;
      &lt;li&gt;Jim Crist&lt;/li&gt;
      &lt;li&gt;John Kirkham&lt;/li&gt;
      &lt;li&gt;K.-Michael Aye&lt;/li&gt;
      &lt;li&gt;Loïc Estève&lt;/li&gt;
      &lt;li&gt;Magnus Nord&lt;/li&gt;
      &lt;li&gt;Manuel Garrido&lt;/li&gt;
      &lt;li&gt;Marco Neumann&lt;/li&gt;
      &lt;li&gt;Martin Durant&lt;/li&gt;
      &lt;li&gt;Mathieu Dugré&lt;/li&gt;
      &lt;li&gt;Matt Nicolls&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Michael Delgado&lt;/li&gt;
      &lt;li&gt;Michael Spiegel&lt;/li&gt;
      &lt;li&gt;Muammar El Khatib&lt;/li&gt;
      &lt;li&gt;Nikos Tsaousis&lt;/li&gt;
      &lt;li&gt;Olivier Grisel&lt;/li&gt;
      &lt;li&gt;Peter Andreas Entschev&lt;/li&gt;
      &lt;li&gt;Sam Grayson&lt;/li&gt;
      &lt;li&gt;Scott Sievert&lt;/li&gt;
      &lt;li&gt;Tom Augspurger&lt;/li&gt;
      &lt;li&gt;Torsten Wörtwein&lt;/li&gt;
      &lt;li&gt;amerkel2&lt;/li&gt;
      &lt;li&gt;condoratberlin&lt;/li&gt;
      &lt;li&gt;deepthirajagopalan7&lt;/li&gt;
      &lt;li&gt;jukent&lt;/li&gt;
      &lt;li&gt;plbertrand&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/dask/dask-ml&quot;&gt;dask/dask-ml&lt;/a&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Alejandro&lt;/li&gt;
      &lt;li&gt;Florian Rohrer&lt;/li&gt;
      &lt;li&gt;James Bourbeau&lt;/li&gt;
      &lt;li&gt;Julien Jerphanion&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Nathan Henrie&lt;/li&gt;
      &lt;li&gt;Paul Vecchio&lt;/li&gt;
      &lt;li&gt;Ryan McCormick&lt;/li&gt;
      &lt;li&gt;Saadullah Amin&lt;/li&gt;
      &lt;li&gt;Scott Sievert&lt;/li&gt;
      &lt;li&gt;Sriharsha Atyam&lt;/li&gt;
      &lt;li&gt;Tom Augspurger&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/dask/dask-jobqueue&quot;&gt;dask/dask-jobqueue&lt;/a&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Andrea Zonca&lt;/li&gt;
      &lt;li&gt;Guillaume Eynard-Bontemps&lt;/li&gt;
      &lt;li&gt;Kyle Husmann&lt;/li&gt;
      &lt;li&gt;Levi Naden&lt;/li&gt;
      &lt;li&gt;Loïc Estève&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Matyas Selmeci&lt;/li&gt;
      &lt;li&gt;ocaisa&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/dask/dask-kubernetes&quot;&gt;dask/dask-kubernetes&lt;/a&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Brian Phillips&lt;/li&gt;
      &lt;li&gt;Jacob Tomlinson&lt;/li&gt;
      &lt;li&gt;Jim Crist&lt;/li&gt;
      &lt;li&gt;Joe Hamman&lt;/li&gt;
      &lt;li&gt;Joseph Hamman&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Tom Augspurger&lt;/li&gt;
      &lt;li&gt;Yuvi Panda&lt;/li&gt;
      &lt;li&gt;adam&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/dask/dask-examples&quot;&gt;dask/dask-examples&lt;/a&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Christoph Deil&lt;/li&gt;
      &lt;li&gt;Genevieve Buckley&lt;/li&gt;
      &lt;li&gt;Ian Rose&lt;/li&gt;
      &lt;li&gt;Martin Durant&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Matthias Bussonnier&lt;/li&gt;
      &lt;li&gt;Robert Sare&lt;/li&gt;
      &lt;li&gt;Tom Augspurger&lt;/li&gt;
      &lt;li&gt;Willi Rath&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/dask/dask-labextension&quot;&gt;dask/dask-labextension&lt;/a&gt;&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Daniel Bast&lt;/li&gt;
      &lt;li&gt;Ian Rose&lt;/li&gt;
      &lt;li&gt;Matthew Rocklin&lt;/li&gt;
      &lt;li&gt;Yuvi Panda&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Load Large Image Data with Dask Array</title>
   <link href="https://blog.dask.org/2019/06/20/load-image-data"/>
   <updated>2019-06-20T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/06/20/load-image-data</id>
   
   <category>python</category>
   
   <category>scipy</category>
   
   <category>scikit-image</category>
   
   <category>dask-image</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;This post explores simple workflows to load large stacks of image data with Dask array.&lt;/p&gt;

&lt;p&gt;In particular, we start with a &lt;a href=&quot;https://drive.google.com/drive/folders/13mpIfqspKTIINkfoWbFsVtFF8D7jbTqJ&quot;&gt;directory full of TIFF
files&lt;/a&gt;
of images like the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ $ ls raw/ | head
ex6-2_CamA_ch1_CAM1_stack0000_560nm_0000000msec_0001291795msecAbs_000x_000y_000z_0000t.tif
ex6-2_CamA_ch1_CAM1_stack0001_560nm_0043748msec_0001335543msecAbs_000x_000y_000z_0000t.tif
ex6-2_CamA_ch1_CAM1_stack0002_560nm_0087497msec_0001379292msecAbs_000x_000y_000z_0000t.tif
ex6-2_CamA_ch1_CAM1_stack0003_560nm_0131245msec_0001423040msecAbs_000x_000y_000z_0000t.tif
ex6-2_CamA_ch1_CAM1_stack0004_560nm_0174993msec_0001466788msecAbs_000x_000y_000z_0000t.tif
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and show how to stitch these together into large lazy arrays
using the &lt;a href=&quot;https://image.dask.org/en/latest/&quot;&gt;dask-image&lt;/a&gt; library&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;raw/*.tif&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or by writing your own Dask delayed image reader function.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 3.16 GB &lt;/td&gt; &lt;td&gt; 316.15 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (2010, 1024, 768) &lt;/td&gt; &lt;td&gt; (201, 1024, 768) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 30 Tasks &lt;/td&gt;&lt;td&gt; 10 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;176&quot; height=&quot;181&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;80&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;61&quot; x2=&quot;80&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;61&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;7&quot; x2=&quot;17&quot; y2=&quot;68&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;14&quot; x2=&quot;24&quot; y2=&quot;75&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;21&quot; x2=&quot;31&quot; y2=&quot;82&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;28&quot; x2=&quot;38&quot; y2=&quot;89&quot; /&gt;
  &lt;line x1=&quot;45&quot; y1=&quot;35&quot; x2=&quot;45&quot; y2=&quot;96&quot; /&gt;
  &lt;line x1=&quot;52&quot; y1=&quot;42&quot; x2=&quot;52&quot; y2=&quot;103&quot; /&gt;
  &lt;line x1=&quot;59&quot; y1=&quot;49&quot; x2=&quot;59&quot; y2=&quot;110&quot; /&gt;
  &lt;line x1=&quot;66&quot; y1=&quot;56&quot; x2=&quot;66&quot; y2=&quot;117&quot; /&gt;
  &lt;line x1=&quot;73&quot; y1=&quot;63&quot; x2=&quot;73&quot; y2=&quot;124&quot; /&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;80&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 80.588235,70.588235 80.588235,131.722564 10.000000,61.134328&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;55&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;7&quot; x2=&quot;62&quot; y2=&quot;7&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;14&quot; x2=&quot;69&quot; y2=&quot;14&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;21&quot; x2=&quot;77&quot; y2=&quot;21&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;28&quot; x2=&quot;84&quot; y2=&quot;28&quot; /&gt;
  &lt;line x1=&quot;45&quot; y1=&quot;35&quot; x2=&quot;91&quot; y2=&quot;35&quot; /&gt;
  &lt;line x1=&quot;52&quot; y1=&quot;42&quot; x2=&quot;98&quot; y2=&quot;42&quot; /&gt;
  &lt;line x1=&quot;59&quot; y1=&quot;49&quot; x2=&quot;105&quot; y2=&quot;49&quot; /&gt;
  &lt;line x1=&quot;66&quot; y1=&quot;56&quot; x2=&quot;112&quot; y2=&quot;56&quot; /&gt;
  &lt;line x1=&quot;73&quot; y1=&quot;63&quot; x2=&quot;119&quot; y2=&quot;63&quot; /&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;126&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;80&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;55&quot; y1=&quot;0&quot; x2=&quot;126&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 55.850746,0.000000 126.438982,70.588235 80.588235,70.588235&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;126&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;131&quot; x2=&quot;126&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;80&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;126&quot; y1=&quot;70&quot; x2=&quot;126&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;80.588235,70.588235 126.438982,70.588235 126.438982,131.722564 80.588235,131.722564&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;103.513608&quot; y=&quot;151.722564&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;768&lt;/text&gt;
&lt;text x=&quot;146.438982&quot; y=&quot;101.155399&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,146.438982,101.155399)&quot;&gt;1024&lt;/text&gt;
&lt;text x=&quot;35.294118&quot; y=&quot;116.428446&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,35.294118,116.428446)&quot;&gt;2010&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Some day we’ll eventually be able to perform complex calculations on this dask array.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/mrocklin/raw-host/gh-pages/images/aollsm-index-1.jpg&quot; width=&quot;45%&quot; alt=&quot;Light Microscopy data rendered with NVidia IndeX&quot; /&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/mrocklin/raw-host/gh-pages/images/aollsm-index-2.jpg&quot; width=&quot;45%&quot; alt=&quot;Light Microscopy data rendered with NVidia IndeX&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: we’re not going to produce rendered images like the above in this
post. These were created with &lt;a href=&quot;https://developer.nvidia.com/index&quot;&gt;NVidia
IndeX&lt;/a&gt;, a completely separate tool chain
from what is being discussed here. This post covers the first step of image
loading.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;series-overview&quot;&gt;Series Overview&lt;/h2&gt;

&lt;p&gt;A common case in fields that acquire large amounts of imaging data is to write
out smaller acquisitions into many small files. These files can tile a larger
space, sub-sample from a larger time period, and may contain multiple channels.
The acquisition techniques themselves are often state of the art and constantly
pushing the envelope in term of how large a field of view can be acquired, at
what resolution, and what quality.&lt;/p&gt;

&lt;p&gt;Once acquired this data presents a number of challenges. Algorithms often
designed and tested to work on very small pieces of this data need to be scaled
up to work on the full dataset. It might not be clear at the outset what will
actually work and so exploration still plays a very big part of the whole
process.&lt;/p&gt;

&lt;p&gt;Historically this analytical process has involved a lot of custom code. Often
the analytical process is stitched together by a series of scripts possibly in
several different languages that write various intermediate results to disk.
Thanks to advances in modern tooling these process can be significantly
improved. In this series of blogposts, we will outline ways for image
scientists to leverage different tools to move towards a high level, friendly,
cohesive, interactive analytical pipeline.&lt;/p&gt;

&lt;h2 id=&quot;post-overview&quot;&gt;Post Overview&lt;/h2&gt;

&lt;p&gt;This post in particular focuses on loading and managing large stacks of image
data in parallel from Python.&lt;/p&gt;

&lt;p&gt;Loading large image data can be a complex and often unique problem. Different
groups may choose to store this across many files on disk, a commodity or
custom database solution, or they may opt to store it in the cloud. Not all
datasets within the same group may be treated the same for a variety of
reasons. In short, this means loading data is a hard and expensive problem.&lt;/p&gt;

&lt;p&gt;Despite data being stored in many different ways, often groups want to reapply
the same analytical pipeline to these datasets. However if the data pipeline is
tightly coupled to a particular way of loading the data for later analytical
steps, it may be very difficult if not impossible to reuse an existing
pipeline. In other words, there is friction between the loading and analysis
steps, which frustrates efforts to make things reusable.&lt;/p&gt;

&lt;p&gt;Having a modular and general way to load data makes it easy to present data
stored differently in a standard way. Further having a standard way to present
data to analytical pipelines allows that part of the pipeline to focus on what
it does best, analysis! In general, this should decouple these to components in
a way that improves the experience of users involved in all parts of the
pipeline.&lt;/p&gt;

&lt;p&gt;We will use
&lt;a href=&quot;https://drive.google.com/drive/folders/13mpIfqspKTIINkfoWbFsVtFF8D7jbTqJ&quot;&gt;image data&lt;/a&gt;
generously provided by
&lt;a href=&quot;https://scholar.google.com/citations?user=nxwNAEgAAAAJ&amp;amp;hl=en&quot;&gt;Gokul Upadhyayula&lt;/a&gt;
at the
&lt;a href=&quot;http://microscopy.berkeley.edu/&quot;&gt;Advanced Bioimaging Center&lt;/a&gt;
at UC Berkeley and discussed in
&lt;a href=&quot;https://science.sciencemag.org/content/360/6386/eaaq1392&quot;&gt;this paper&lt;/a&gt;
(&lt;a href=&quot;https://www.biorxiv.org/content/10.1101/243352v2&quot;&gt;preprint&lt;/a&gt;),
though the workloads presented here should work for any kind of imaging data,
or array data generally.&lt;/p&gt;

&lt;h2 id=&quot;load-image-data-with-dask&quot;&gt;Load image data with Dask&lt;/h2&gt;

&lt;p&gt;Let’s start again with our image data from the top of the post:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ $ ls /path/to/files/raw/ | head
ex6-2_CamA_ch1_CAM1_stack0000_560nm_0000000msec_0001291795msecAbs_000x_000y_000z_0000t.tif
ex6-2_CamA_ch1_CAM1_stack0001_560nm_0043748msec_0001335543msecAbs_000x_000y_000z_0000t.tif
ex6-2_CamA_ch1_CAM1_stack0002_560nm_0087497msec_0001379292msecAbs_000x_000y_000z_0000t.tif
ex6-2_CamA_ch1_CAM1_stack0003_560nm_0131245msec_0001423040msecAbs_000x_000y_000z_0000t.tif
ex6-2_CamA_ch1_CAM1_stack0004_560nm_0174993msec_0001466788msecAbs_000x_000y_000z_0000t.tif
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;load-a-single-sample-image-with-scikit-image&quot;&gt;Load a single sample image with Scikit-Image&lt;/h3&gt;

&lt;p&gt;To load a single image, we use &lt;a href=&quot;https://scikit-image.org/&quot;&gt;Scikit-Image&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;glob&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;glob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;glob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/path/to/files/raw/*.tif&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;597&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;imageio&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imageio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;201&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;768&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Each filename corresponds to some 3d chunk of a larger image. We can look at a
few 2d slices of this single 3d chunk to get some context.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;skimage.io&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figsize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;skimage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/mrocklin/raw-host/gh-pages/images/aollsm-sample-1.png&quot; width=&quot;60%&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figsize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;skimage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/mrocklin/raw-host/gh-pages/images/aollsm-sample-2.png&quot; width=&quot;60%&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figsize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;skimage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imshow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/mrocklin/raw-host/gh-pages/images/aollsm-sample-3.png&quot; width=&quot;60%&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;investigate-filename-structure&quot;&gt;Investigate Filename Structure&lt;/h3&gt;

&lt;p&gt;These are slices from only one chunk of a much larger aggregate image.
Our interest here is combining the pieces into a large image stack.
It is common to see a naming structure in the filenames. Each
filename then may indicate a channel, time step, and spatial location with the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;i&amp;gt;&lt;/code&gt; being some numeric values (possibly with units). Individual filenames may
have more or less information and may notate it differently than we have.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mydata_ch&amp;lt;i&amp;gt;_&amp;lt;j&amp;gt;t_&amp;lt;k&amp;gt;x_&amp;lt;l&amp;gt;y_&amp;lt;m&amp;gt;z.tif
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In principle with NumPy we might allocate a giant array and then iteratively
load images and place them into the giant array.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;full_array&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((...,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;imageio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_location_from_filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# We need to write this function
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;full_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However if our data is large then we can’t load it all into memory at once like
this into a single Numpy array, and instead we need to be a bit more clever to
handle it efficiently. One approach here is to use &lt;a href=&quot;https://dask.org&quot;&gt;Dask&lt;/a&gt;,
which handles larger-than-memory workloads easily.&lt;/p&gt;

&lt;h3 id=&quot;lazily-load-images-with-dask-array&quot;&gt;Lazily load images with Dask Array&lt;/h3&gt;

&lt;p&gt;Now we learn how to lazily load and stitch together image data with Dask array.
We’ll start with simple examples first and then move onto the full example with
this more complex dataset afterwards.&lt;/p&gt;

&lt;p&gt;We can delay the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;imageio.imread&lt;/code&gt; calls with &lt;a href=&quot;https://docs.dassk.org/en/latest/delayed.html&quot;&gt;Dask
Delayed&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;lazy_arrays&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imageio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lazy_arrays&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
               &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lazy_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: here we’re assuming that all of the images have the same shape and dtype
as the sample file that we loaded above. This is not always the case. See the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask_image&lt;/code&gt; note below in the Future Work section for an alternative.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We haven’t yet stitched these together. We have hundreds of single-chunk Dask
arrays, each of which lazily loads a single 3d chunk of data from disk. Lets look at a single array.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lazy_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 316.15 MB &lt;/td&gt; &lt;td&gt; 316.15 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (201, 1024, 768) &lt;/td&gt; &lt;td&gt; (201, 1024, 768) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 2 Tasks &lt;/td&gt;&lt;td&gt; 1 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;174&quot; height=&quot;194&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;120&quot; x2=&quot;34&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;120&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;24&quot; x2=&quot;34&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 34.664918,24.664918 34.664918,144.664918 10.000000,120.000000&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;100&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;24&quot; x2=&quot;124&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;100&quot; y1=&quot;0&quot; x2=&quot;124&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 100.000000,0.000000 124.664918,24.664918 34.664918,24.664918&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;24&quot; x2=&quot;124&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;144&quot; x2=&quot;124&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;24&quot; x2=&quot;34&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;124&quot; y1=&quot;24&quot; x2=&quot;124&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;34.664918,24.664918 124.664918,24.664918 124.664918,144.664918 34.664918,144.664918&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;79.664918&quot; y=&quot;164.664918&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;768&lt;/text&gt;
&lt;text x=&quot;144.664918&quot; y=&quot;84.664918&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,144.664918,84.664918)&quot;&gt;1024&lt;/text&gt;
&lt;text x=&quot;12.332459&quot; y=&quot;152.332459&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,12.332459,152.332459)&quot;&gt;201&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;This is a lazy 3-dimensional Dask array of a &lt;em&gt;single&lt;/em&gt; 300MB chunk of data.
That chunk is created by loading in a particular TIFF file. Normally Dask
arrays are composed of &lt;em&gt;many&lt;/em&gt; chunks. We can concatenate many of these
single-chunked Dask arrays into a multi-chunked Dask array with functions like
&lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.concatenate&quot;&gt;da.concatenate&lt;/a&gt;
and
&lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.stack&quot;&gt;da.stack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here we concatenate the first ten Dask arrays along a few axes, to get an
easier-to-understand picture of how this looks. Take a look both at how the
shape changes as we change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;axis=&lt;/code&gt; parameter both in the table on the left
and the image on the right.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concatenate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lazy_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 3.16 GB &lt;/td&gt; &lt;td&gt; 316.15 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (2010, 1024, 768) &lt;/td&gt; &lt;td&gt; (201, 1024, 768) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 30 Tasks &lt;/td&gt;&lt;td&gt; 10 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;176&quot; height=&quot;181&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;80&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;61&quot; x2=&quot;80&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;61&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;7&quot; x2=&quot;17&quot; y2=&quot;68&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;14&quot; x2=&quot;24&quot; y2=&quot;75&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;21&quot; x2=&quot;31&quot; y2=&quot;82&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;28&quot; x2=&quot;38&quot; y2=&quot;89&quot; /&gt;
  &lt;line x1=&quot;45&quot; y1=&quot;35&quot; x2=&quot;45&quot; y2=&quot;96&quot; /&gt;
  &lt;line x1=&quot;52&quot; y1=&quot;42&quot; x2=&quot;52&quot; y2=&quot;103&quot; /&gt;
  &lt;line x1=&quot;59&quot; y1=&quot;49&quot; x2=&quot;59&quot; y2=&quot;110&quot; /&gt;
  &lt;line x1=&quot;66&quot; y1=&quot;56&quot; x2=&quot;66&quot; y2=&quot;117&quot; /&gt;
  &lt;line x1=&quot;73&quot; y1=&quot;63&quot; x2=&quot;73&quot; y2=&quot;124&quot; /&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;80&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 80.588235,70.588235 80.588235,131.722564 10.000000,61.134328&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;55&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;7&quot; x2=&quot;62&quot; y2=&quot;7&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;14&quot; x2=&quot;69&quot; y2=&quot;14&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;21&quot; x2=&quot;77&quot; y2=&quot;21&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;28&quot; x2=&quot;84&quot; y2=&quot;28&quot; /&gt;
  &lt;line x1=&quot;45&quot; y1=&quot;35&quot; x2=&quot;91&quot; y2=&quot;35&quot; /&gt;
  &lt;line x1=&quot;52&quot; y1=&quot;42&quot; x2=&quot;98&quot; y2=&quot;42&quot; /&gt;
  &lt;line x1=&quot;59&quot; y1=&quot;49&quot; x2=&quot;105&quot; y2=&quot;49&quot; /&gt;
  &lt;line x1=&quot;66&quot; y1=&quot;56&quot; x2=&quot;112&quot; y2=&quot;56&quot; /&gt;
  &lt;line x1=&quot;73&quot; y1=&quot;63&quot; x2=&quot;119&quot; y2=&quot;63&quot; /&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;126&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;80&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;55&quot; y1=&quot;0&quot; x2=&quot;126&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 55.850746,0.000000 126.438982,70.588235 80.588235,70.588235&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;126&quot; y2=&quot;70&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;131&quot; x2=&quot;126&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;80&quot; y1=&quot;70&quot; x2=&quot;80&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;126&quot; y1=&quot;70&quot; x2=&quot;126&quot; y2=&quot;131&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;80.588235,70.588235 126.438982,70.588235 126.438982,131.722564 80.588235,131.722564&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;103.513608&quot; y=&quot;151.722564&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;768&lt;/text&gt;
&lt;text x=&quot;146.438982&quot; y=&quot;101.155399&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,146.438982,101.155399)&quot;&gt;1024&lt;/text&gt;
&lt;text x=&quot;35.294118&quot; y=&quot;116.428446&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,35.294118,116.428446)&quot;&gt;2010&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concatenate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lazy_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 3.16 GB &lt;/td&gt; &lt;td&gt; 316.15 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (201, 10240, 768) &lt;/td&gt; &lt;td&gt; (201, 1024, 768) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 30 Tasks &lt;/td&gt;&lt;td&gt; 10 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;113&quot; height=&quot;187&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;12&quot; x2=&quot;27&quot; y2=&quot;29&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;24&quot; x2=&quot;27&quot; y2=&quot;41&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;36&quot; x2=&quot;27&quot; y2=&quot;53&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;48&quot; x2=&quot;27&quot; y2=&quot;65&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;60&quot; x2=&quot;27&quot; y2=&quot;77&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;72&quot; x2=&quot;27&quot; y2=&quot;89&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;84&quot; x2=&quot;27&quot; y2=&quot;101&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;96&quot; x2=&quot;27&quot; y2=&quot;113&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;108&quot; x2=&quot;27&quot; y2=&quot;125&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;120&quot; x2=&quot;27&quot; y2=&quot;137&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;120&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;27&quot; y2=&quot;137&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 27.014952,17.014952 27.014952,137.014952 10.000000,120.000000&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;46&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;63&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;46&quot; y1=&quot;0&quot; x2=&quot;63&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 46.948234,0.000000 63.963186,17.014952 27.014952,17.014952&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;63&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;29&quot; x2=&quot;63&quot; y2=&quot;29&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;41&quot; x2=&quot;63&quot; y2=&quot;41&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;53&quot; x2=&quot;63&quot; y2=&quot;53&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;65&quot; x2=&quot;63&quot; y2=&quot;65&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;77&quot; x2=&quot;63&quot; y2=&quot;77&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;89&quot; x2=&quot;63&quot; y2=&quot;89&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;101&quot; x2=&quot;63&quot; y2=&quot;101&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;113&quot; x2=&quot;63&quot; y2=&quot;113&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;125&quot; x2=&quot;63&quot; y2=&quot;125&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;137&quot; x2=&quot;63&quot; y2=&quot;137&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;27&quot; y2=&quot;137&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;63&quot; y1=&quot;17&quot; x2=&quot;63&quot; y2=&quot;137&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;27.014952,17.014952 63.963186,17.014952 63.963186,137.014952 27.014952,137.014952&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;45.489069&quot; y=&quot;157.014952&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;768&lt;/text&gt;
&lt;text x=&quot;83.963186&quot; y=&quot;77.014952&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,83.963186,77.014952)&quot;&gt;10240&lt;/text&gt;
&lt;text x=&quot;8.507476&quot; y=&quot;148.507476&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,8.507476,148.507476)&quot;&gt;201&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concatenate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lazy_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 3.16 GB &lt;/td&gt; &lt;td&gt; 316.15 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (201, 1024, 7680) &lt;/td&gt; &lt;td&gt; (201, 1024, 768) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 30 Tasks &lt;/td&gt;&lt;td&gt; 10 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;197&quot; height=&quot;108&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;40&quot; x2=&quot;27&quot; y2=&quot;58&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;40&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;27&quot; y2=&quot;58&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 27.988258,17.988258 27.988258,58.112379 10.000000,40.124121&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;130&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;147&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;51&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;46&quot; y1=&quot;0&quot; x2=&quot;63&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;58&quot; y1=&quot;0&quot; x2=&quot;75&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;70&quot; y1=&quot;0&quot; x2=&quot;87&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;82&quot; y1=&quot;0&quot; x2=&quot;99&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;94&quot; y1=&quot;0&quot; x2=&quot;111&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;106&quot; y1=&quot;0&quot; x2=&quot;123&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;118&quot; y1=&quot;0&quot; x2=&quot;135&quot; y2=&quot;17&quot; /&gt;
  &lt;line x1=&quot;130&quot; y1=&quot;0&quot; x2=&quot;147&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;10.000000,0.000000 130.000000,0.000000 147.988258,17.988258 27.988258,17.988258&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;147&quot; y2=&quot;17&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;58&quot; x2=&quot;147&quot; y2=&quot;58&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;17&quot; x2=&quot;27&quot; y2=&quot;58&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;17&quot; x2=&quot;39&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;51&quot; y1=&quot;17&quot; x2=&quot;51&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;63&quot; y1=&quot;17&quot; x2=&quot;63&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;75&quot; y1=&quot;17&quot; x2=&quot;75&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;87&quot; y1=&quot;17&quot; x2=&quot;87&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;99&quot; y1=&quot;17&quot; x2=&quot;99&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;111&quot; y1=&quot;17&quot; x2=&quot;111&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;123&quot; y1=&quot;17&quot; x2=&quot;123&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;135&quot; y1=&quot;17&quot; x2=&quot;135&quot; y2=&quot;58&quot; /&gt;
  &lt;line x1=&quot;147&quot; y1=&quot;17&quot; x2=&quot;147&quot; y2=&quot;58&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;27.988258,17.988258 147.988258,17.988258 147.988258,58.112379 27.988258,58.112379&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;87.988258&quot; y=&quot;78.112379&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;7680&lt;/text&gt;
&lt;text x=&quot;167.988258&quot; y=&quot;38.050318&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,167.988258,38.050318)&quot;&gt;1024&lt;/text&gt;
&lt;text x=&quot;8.994129&quot; y=&quot;69.118250&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,8.994129,69.118250)&quot;&gt;201&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Or, if we wanted to make a new dimension, we would use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;da.stack&lt;/code&gt;. In this
case note that we’ve run out of easily visible dimensions, so you should take
note of the listed shape in the table input on the left more than the picture
on the right. Notice that we’ve stacked these 3d images into a 4d image.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lazy_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 3.16 GB &lt;/td&gt; &lt;td&gt; 316.15 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (10, 201, 1024, 768) &lt;/td&gt; &lt;td&gt; (1, 201, 1024, 768) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 30 Tasks &lt;/td&gt;&lt;td&gt; 10 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;354&quot; height=&quot;194&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;25&quot; x2=&quot;25&quot; y2=&quot;25&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;25&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;25&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;0.000000,0.000000 25.412617,0.000000 25.412617,25.412617 0.000000,25.412617&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;12.706308&quot; y=&quot;45.412617&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;10&lt;/text&gt;
&lt;text x=&quot;45.412617&quot; y=&quot;12.706308&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(0,45.412617,12.706308)&quot;&gt;1&lt;/text&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;95&quot; y1=&quot;0&quot; x2=&quot;119&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;95&quot; y1=&quot;120&quot; x2=&quot;119&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;95&quot; y1=&quot;0&quot; x2=&quot;95&quot; y2=&quot;120&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;119&quot; y1=&quot;24&quot; x2=&quot;119&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;95.000000,0.000000 119.664918,24.664918 119.664918,144.664918 95.000000,120.000000&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;95&quot; y1=&quot;0&quot; x2=&quot;185&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;119&quot; y1=&quot;24&quot; x2=&quot;209&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;95&quot; y1=&quot;0&quot; x2=&quot;119&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;185&quot; y1=&quot;0&quot; x2=&quot;209&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;95.000000,0.000000 185.000000,0.000000 209.664918,24.664918 119.664918,24.664918&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;119&quot; y1=&quot;24&quot; x2=&quot;209&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;119&quot; y1=&quot;144&quot; x2=&quot;209&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;119&quot; y1=&quot;24&quot; x2=&quot;119&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;209&quot; y1=&quot;24&quot; x2=&quot;209&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;119.664918,24.664918 209.664918,24.664918 209.664918,144.664918 119.664918,144.664918&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;164.664918&quot; y=&quot;164.664918&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;768&lt;/text&gt;
&lt;text x=&quot;229.664918&quot; y=&quot;84.664918&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,229.664918,84.664918)&quot;&gt;1024&lt;/text&gt;
&lt;text x=&quot;97.332459&quot; y=&quot;152.332459&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,97.332459,152.332459)&quot;&gt;201&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;These are the common case situations, where you have a single axis along which
you want to stitch images together.&lt;/p&gt;

&lt;h3 id=&quot;full-example&quot;&gt;Full example&lt;/h3&gt;

&lt;p&gt;This works fine for combining along a single axis. However if we need to
combine across multiple we need to perform multiple concatenate steps.
Fortunately there is a simpler option &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.block&quot;&gt;da.block&lt;/a&gt;, which can
concatenate along multiple axes at once if you give it a nested list of dask
arrays.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;laxy_array_00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lazy_array_01&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
              &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lazy_array_10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lazy_array_11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We now do the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Parse each filename to learn where it should live in the larger array&lt;/li&gt;
  &lt;li&gt;See how many files are in each of our relevant dimensions&lt;/li&gt;
  &lt;li&gt;Allocate a NumPy object-dtype array of the appropriate size, where each
element of this array will hold a single-chunk Dask array&lt;/li&gt;
  &lt;li&gt;Go through our filenames and insert the proper Dask array into the right
position&lt;/li&gt;
  &lt;li&gt;Call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;da.block&lt;/code&gt; on the result&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This code is a bit complex, but shows what this looks like in a real-world
setting&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Get various dimensions
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;fn_comp_sets&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;comp&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;splitext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fn_comp_sets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;setdefault&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fn_comp_sets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;comp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;fn_comp_sets&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fn_comp_sets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;remap_comps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;reversed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn_comp_sets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))),&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;reversed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn_comp_sets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Create an empty object array to organize each chunk that loads a TIFF
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;tuple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remap_comps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lazy_arrays&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;_ch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stack&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;_stack&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;_&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Stitch together the many blocks into a single array
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tolist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;table&gt;  &lt;thead&gt;    &lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;th&gt; Array &lt;/th&gt;&lt;th&gt; Chunk &lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;th&gt; Bytes &lt;/th&gt;&lt;td&gt; 188.74 GB &lt;/td&gt; &lt;td&gt; 316.15 MB &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Shape &lt;/th&gt;&lt;td&gt; (3, 199, 201, 1024, 768) &lt;/td&gt; &lt;td&gt; (1, 1, 201, 1024, 768) &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Count &lt;/th&gt;&lt;td&gt; 2985 Tasks &lt;/td&gt;&lt;td&gt; 597 Chunks &lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;th&gt; Type &lt;/th&gt;&lt;td&gt; uint16 &lt;/td&gt;&lt;td&gt; numpy.ndarray &lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;svg width=&quot;386&quot; height=&quot;194&quot; style=&quot;stroke:rgb(0,0,0);stroke-width:1&quot;&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;8&quot; x2=&quot;41&quot; y2=&quot;8&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;16&quot; x2=&quot;41&quot; y2=&quot;16&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;25&quot; x2=&quot;41&quot; y2=&quot;25&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;25&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;0&quot; y1=&quot;0&quot; x2=&quot;0&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;1&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;1&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;1&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;1&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;1&quot; y1=&quot;0&quot; x2=&quot;1&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;2&quot; y1=&quot;0&quot; x2=&quot;2&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;3&quot; y1=&quot;0&quot; x2=&quot;3&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;3&quot; y1=&quot;0&quot; x2=&quot;3&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;3&quot; y1=&quot;0&quot; x2=&quot;3&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;3&quot; y1=&quot;0&quot; x2=&quot;3&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;3&quot; y1=&quot;0&quot; x2=&quot;3&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;4&quot; y1=&quot;0&quot; x2=&quot;4&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;4&quot; y1=&quot;0&quot; x2=&quot;4&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;4&quot; y1=&quot;0&quot; x2=&quot;4&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;4&quot; y1=&quot;0&quot; x2=&quot;4&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;5&quot; y1=&quot;0&quot; x2=&quot;5&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;6&quot; y1=&quot;0&quot; x2=&quot;6&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;6&quot; y1=&quot;0&quot; x2=&quot;6&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;6&quot; y1=&quot;0&quot; x2=&quot;6&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;6&quot; y1=&quot;0&quot; x2=&quot;6&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;6&quot; y1=&quot;0&quot; x2=&quot;6&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;7&quot; y1=&quot;0&quot; x2=&quot;7&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;8&quot; y1=&quot;0&quot; x2=&quot;8&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;8&quot; y1=&quot;0&quot; x2=&quot;8&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;8&quot; y1=&quot;0&quot; x2=&quot;8&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;8&quot; y1=&quot;0&quot; x2=&quot;8&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;9&quot; y1=&quot;0&quot; x2=&quot;9&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;9&quot; y1=&quot;0&quot; x2=&quot;9&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;9&quot; y1=&quot;0&quot; x2=&quot;9&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;9&quot; y1=&quot;0&quot; x2=&quot;9&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;9&quot; y1=&quot;0&quot; x2=&quot;9&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;10&quot; y1=&quot;0&quot; x2=&quot;10&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;11&quot; y1=&quot;0&quot; x2=&quot;11&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;11&quot; y1=&quot;0&quot; x2=&quot;11&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;11&quot; y1=&quot;0&quot; x2=&quot;11&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;11&quot; y1=&quot;0&quot; x2=&quot;11&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;11&quot; y1=&quot;0&quot; x2=&quot;11&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;12&quot; y1=&quot;0&quot; x2=&quot;12&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;13&quot; y1=&quot;0&quot; x2=&quot;13&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;13&quot; y1=&quot;0&quot; x2=&quot;13&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;13&quot; y1=&quot;0&quot; x2=&quot;13&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;13&quot; y1=&quot;0&quot; x2=&quot;13&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;13&quot; y1=&quot;0&quot; x2=&quot;13&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;0&quot; x2=&quot;14&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;0&quot; x2=&quot;14&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;0&quot; x2=&quot;14&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;0&quot; x2=&quot;14&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;14&quot; y1=&quot;0&quot; x2=&quot;14&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;15&quot; y1=&quot;0&quot; x2=&quot;15&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;0&quot; x2=&quot;16&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;0&quot; x2=&quot;16&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;0&quot; x2=&quot;16&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;16&quot; y1=&quot;0&quot; x2=&quot;16&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;17&quot; y1=&quot;0&quot; x2=&quot;17&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;18&quot; y1=&quot;0&quot; x2=&quot;18&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;19&quot; y1=&quot;0&quot; x2=&quot;19&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;19&quot; y1=&quot;0&quot; x2=&quot;19&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;19&quot; y1=&quot;0&quot; x2=&quot;19&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;19&quot; y1=&quot;0&quot; x2=&quot;19&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;19&quot; y1=&quot;0&quot; x2=&quot;19&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;20&quot; y1=&quot;0&quot; x2=&quot;20&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;0&quot; x2=&quot;21&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;0&quot; x2=&quot;21&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;0&quot; x2=&quot;21&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;0&quot; x2=&quot;21&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;21&quot; y1=&quot;0&quot; x2=&quot;21&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;22&quot; y1=&quot;0&quot; x2=&quot;22&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;23&quot; y1=&quot;0&quot; x2=&quot;23&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;0&quot; x2=&quot;24&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;0&quot; x2=&quot;24&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;0&quot; x2=&quot;24&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;24&quot; y1=&quot;0&quot; x2=&quot;24&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;25&quot; y1=&quot;0&quot; x2=&quot;25&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;26&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;26&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;26&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;26&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;26&quot; y1=&quot;0&quot; x2=&quot;26&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;27&quot; y1=&quot;0&quot; x2=&quot;27&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;0&quot; x2=&quot;28&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;0&quot; x2=&quot;28&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;0&quot; x2=&quot;28&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;28&quot; y1=&quot;0&quot; x2=&quot;28&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;0&quot; x2=&quot;29&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;0&quot; x2=&quot;29&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;0&quot; x2=&quot;29&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;0&quot; x2=&quot;29&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;29&quot; y1=&quot;0&quot; x2=&quot;29&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;0&quot; x2=&quot;30&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;0&quot; x2=&quot;30&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;0&quot; x2=&quot;30&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;0&quot; x2=&quot;30&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;30&quot; y1=&quot;0&quot; x2=&quot;30&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;31&quot; y1=&quot;0&quot; x2=&quot;31&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;0&quot; x2=&quot;32&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;0&quot; x2=&quot;32&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;0&quot; x2=&quot;32&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;32&quot; y1=&quot;0&quot; x2=&quot;32&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;33&quot; y1=&quot;0&quot; x2=&quot;33&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;34&quot; y1=&quot;0&quot; x2=&quot;34&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;35&quot; y1=&quot;0&quot; x2=&quot;35&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;35&quot; y1=&quot;0&quot; x2=&quot;35&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;35&quot; y1=&quot;0&quot; x2=&quot;35&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;35&quot; y1=&quot;0&quot; x2=&quot;35&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;35&quot; y1=&quot;0&quot; x2=&quot;35&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;0&quot; x2=&quot;36&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;0&quot; x2=&quot;36&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;0&quot; x2=&quot;36&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;36&quot; y1=&quot;0&quot; x2=&quot;36&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;37&quot; y1=&quot;0&quot; x2=&quot;37&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;37&quot; y1=&quot;0&quot; x2=&quot;37&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;37&quot; y1=&quot;0&quot; x2=&quot;37&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;37&quot; y1=&quot;0&quot; x2=&quot;37&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;37&quot; y1=&quot;0&quot; x2=&quot;37&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;38&quot; y1=&quot;0&quot; x2=&quot;38&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;39&quot; y1=&quot;0&quot; x2=&quot;39&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;40&quot; y1=&quot;0&quot; x2=&quot;40&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;40&quot; y1=&quot;0&quot; x2=&quot;40&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;40&quot; y1=&quot;0&quot; x2=&quot;40&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;40&quot; y1=&quot;0&quot; x2=&quot;40&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;25&quot; /&gt;
  &lt;line x1=&quot;41&quot; y1=&quot;0&quot; x2=&quot;41&quot; y2=&quot;25&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;0.000000,0.000000 41.887587,0.000000 41.887587,25.412617 0.000000,25.412617&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;20.943793&quot; y=&quot;45.412617&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;199&lt;/text&gt;
&lt;text x=&quot;61.887587&quot; y=&quot;12.706308&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(0,61.887587,12.706308)&quot;&gt;3&lt;/text&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;111&quot; y1=&quot;0&quot; x2=&quot;135&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;111&quot; y1=&quot;120&quot; x2=&quot;135&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;111&quot; y1=&quot;0&quot; x2=&quot;111&quot; y2=&quot;120&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;135&quot; y1=&quot;24&quot; x2=&quot;135&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;111.000000,0.000000 135.664918,24.664918 135.664918,144.664918 111.000000,120.000000&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;111&quot; y1=&quot;0&quot; x2=&quot;201&quot; y2=&quot;0&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;135&quot; y1=&quot;24&quot; x2=&quot;225&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;111&quot; y1=&quot;0&quot; x2=&quot;135&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;201&quot; y1=&quot;0&quot; x2=&quot;225&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;111.000000,0.000000 201.000000,0.000000 225.664918,24.664918 135.664918,24.664918&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Horizontal lines --&gt;
  &lt;line x1=&quot;135&quot; y1=&quot;24&quot; x2=&quot;225&quot; y2=&quot;24&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;135&quot; y1=&quot;144&quot; x2=&quot;225&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Vertical lines --&gt;
  &lt;line x1=&quot;135&quot; y1=&quot;24&quot; x2=&quot;135&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;
  &lt;line x1=&quot;225&quot; y1=&quot;24&quot; x2=&quot;225&quot; y2=&quot;144&quot; style=&quot;stroke-width:2&quot; /&gt;

  &lt;!-- Colored Rectangle --&gt;
  &lt;polygon points=&quot;135.664918,24.664918 225.664918,24.664918 225.664918,144.664918 135.664918,144.664918&quot; style=&quot;fill:#ECB172A0;stroke-width:0&quot; /&gt;

  &lt;!-- Text --&gt;

&lt;text x=&quot;180.664918&quot; y=&quot;164.664918&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot;&gt;768&lt;/text&gt;
&lt;text x=&quot;245.664918&quot; y=&quot;84.664918&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(-90,245.664918,84.664918)&quot;&gt;1024&lt;/text&gt;
&lt;text x=&quot;113.332459&quot; y=&quot;152.332459&quot; font-size=&quot;1.0rem&quot; font-weight=&quot;100&quot; text-anchor=&quot;middle&quot; transform=&quot;rotate(45,113.332459,152.332459)&quot;&gt;201&lt;/text&gt;
&lt;/svg&gt;

&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;That’s a 180 GB logical array, composed of around 600 chunks, each of size 300
MB. We can now do normal NumPy like computations on this array using &lt;a href=&quot;https://docs.dask.org/en/latest/array.html&quot;&gt;Dask
Array&lt;/a&gt;, but we’ll save that for a
future post.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# array computations would work fine, and would run in low memory
&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# but we&apos;ll save actual computation for future posts
&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;save-data&quot;&gt;Save Data&lt;/h2&gt;

&lt;p&gt;To simplify data loading in the future, we store this in a large chunked
array format like &lt;a href=&quot;https://zarr.readthedocs.io/&quot;&gt;Zarr&lt;/a&gt; using the &lt;a href=&quot;https://docs.dask.org/en/latest/array-api.html#dask.array.Array.to_zarr&quot;&gt;to_zarr&lt;/a&gt;
method.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_zarr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mydata.zarr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We may add additional information about the image data as &lt;a href=&quot;https://zarr.readthedocs.io/en/stable/tutorial.html#user-attributes&quot;&gt;attributes&lt;/a&gt;. This
both makes things simpler for future users (they can read the full dataset with
a single line using &lt;a href=&quot;http://docs.dask.org/en/latest/array-api.html#dask.array.from_zarr&quot;&gt;da.from_zarr&lt;/a&gt;) and much
more performant because Zarr is an &lt;em&gt;analysis ready format&lt;/em&gt; that is efficiently
encoded for computation.&lt;/p&gt;

&lt;p&gt;Zarr uses the &lt;a href=&quot;http://blosc.org/&quot;&gt;Blosc&lt;/a&gt; library for compression by default.
For scientific imaging data, we can optionally pass compression options that provide
a good compression ratio to speed tradeoff and optimize compression
performance.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numcodecs&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Blosc&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_zarr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;mydata.zarr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compressor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Blosc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cname&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;zstd&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;clevel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Blosc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BITSHUFFLE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;future-work&quot;&gt;Future Work&lt;/h2&gt;

&lt;p&gt;The workload above is generic and straightforward. It works well in simple
cases and also extends well to more complex cases, providing you’re willing to
write some for-loops and parsing code around your custom logic. It works on a
single small-scale laptop as well as a large HPC or Cloud cluster. If you have
a function that turns a filename into a NumPy array, you can generate large
lazy Dask array using that function, &lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;Dask
Delayed&lt;/a&gt; and &lt;a href=&quot;https://docs.dask.org/en/latest/array.html&quot;&gt;Dask
Array&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;dask-image&quot;&gt;Dask Image&lt;/h3&gt;

&lt;p&gt;However, we can make things a bit easier for users if we specialize a bit. For
example the &lt;a href=&quot;https://image.dask.org/en/latest/&quot;&gt;Dask Image&lt;/a&gt; library has a
parallel image reader function, which automates much of our work above in the
simple case.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;raw/*.tif&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Similarly libraries like &lt;a href=&quot;https://xarray.pydata.org/en/stable/&quot;&gt;Xarray&lt;/a&gt; have
readers for other file formats, like GeoTIFF.&lt;/p&gt;

&lt;p&gt;As domains do more and more work like what we did above they tend to write down
common patterns into domain-specific libraries, which then increases the
accessibility and user base of these tools.&lt;/p&gt;

&lt;h3 id=&quot;gpus&quot;&gt;GPUs&lt;/h3&gt;

&lt;p&gt;If we have special hardware lying around like a few GPUs, we can move the data
over to it and perform computations with a library like CuPy, which mimics
NumPy very closely. Thus benefiting from the same operations listed above, but
with the added performance of GPUs behind them.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a_gpu&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;asarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;computation&quot;&gt;Computation&lt;/h3&gt;

&lt;p&gt;Finally, in future blogposts we plan to talk about how to compute on our large
Dask arrays using common image-processing workloads like overlapping stencil
functions, segmentation and deconvolution, and integrating with other libraries
like ITK.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Python and GPUs: A Status Update</title>
   <link href="https://blog.dask.org/2019/06/19/python-gpus-status-update"/>
   <updated>2019-06-19T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/06/19/python-gpus-status-update</id>
   
   <category>python</category>
   
   <category>scipy</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This blogpost was delivered in talk form at the recent &lt;a href=&quot;https://pasc19.pasc-conference.org/&quot;&gt;PASC
2019&lt;/a&gt; conference.
&lt;a href=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSajAH6FzgQH4OwOJD5y-t9mjF9tTKEeljguEsfcjavp18pL4LkpABy4lW2uMykIUvP2dC-1AmhCq6l/pub?start=false&amp;amp;loop=false&amp;amp;delayms=60000&quot;&gt;Slides for that talk are
here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;We’re improving the state of scalable GPU computing in Python.&lt;/p&gt;

&lt;p&gt;This post lays out the current status, and describes future work.
It also summarizes and links to several other more blogposts from recent months that drill down into different topics for the interested reader.&lt;/p&gt;

&lt;p&gt;Broadly we cover briefly the following categories:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Python libraries written in CUDA like CuPy and RAPIDS&lt;/li&gt;
  &lt;li&gt;Python-CUDA compilers, specifically Numba&lt;/li&gt;
  &lt;li&gt;Scaling these libraries out with Dask&lt;/li&gt;
  &lt;li&gt;Network communication with UCX&lt;/li&gt;
  &lt;li&gt;Packaging with Conda&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;performance-of-gpu-accelerated-python-libraries&quot;&gt;Performance of GPU accelerated Python Libraries&lt;/h2&gt;

&lt;p&gt;Probably the easiest way for a Python programmer to get access to GPU
performance is to use a GPU-accelerated Python library. These provide a set of
common operations that are well tuned and integrate well together.&lt;/p&gt;

&lt;p&gt;Many users know libraries for deep learning like PyTorch and TensorFlow, but
there are several other for more general purpose computing. These tend to copy
the APIs of popular Python projects:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Numpy on the GPU: &lt;a href=&quot;https://cupy.chainer.org/&quot;&gt;CuPy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Numpy on the GPU (again): &lt;a href=&quot;https://github.com/google/jax&quot;&gt;Jax&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Pandas on the GPU: &lt;a href=&quot;https://docs.rapids.ai/api/cudf/nightly/&quot;&gt;RAPIDS cuDF&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Scikit-Learn on the GPU: &lt;a href=&quot;https://docs.rapids.ai/api/cuml/nightly/&quot;&gt;RAPIDS cuML&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These libraries build GPU accelerated variants of popular Python
libraries like NumPy, Pandas, and Scikit-Learn. In order to better understand
the relative performance differences
&lt;a href=&quot;https://github.com/pentschev&quot;&gt;Peter Entschev&lt;/a&gt; recently put together a
&lt;a href=&quot;https://github.com/pentschev/pybench&quot;&gt;benchmark suite&lt;/a&gt; to help with comparisons.
He has produced the following image showing the relative speedup between GPU
and CPU:&lt;/p&gt;

&lt;style&gt;
.vega-actions a {
    margin-right: 12px;
    color: #757575;
    font-weight: normal;
    font-size: 13px;
}
.error {
    color: red;
}
&lt;/style&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.jsdelivr.net/npm//vega@5&quot;&gt;&lt;/script&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.jsdelivr.net/npm//vega-lite@3.3.0&quot;&gt;&lt;/script&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.jsdelivr.net/npm//vega-embed@4&quot;&gt;&lt;/script&gt;

&lt;div id=&quot;vis&quot;&gt;&lt;/div&gt;

&lt;p&gt;There are lots of interesting results there.
Peter goes into more depth in this in &lt;a href=&quot;https://blog.dask.org/2019/06/27/single-gpu-cupy-benchmarks&quot;&gt;his blogpost&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;More broadly though, we see that there is variability in performance.
Our mental model for what is fast and slow on the CPU doesn’t neccessarily
carry over to the GPU. Fortunately though, due consistent APIs, users that are
familiar with Python can easily experiment with GPU acceleration without
learning CUDA.&lt;/p&gt;

&lt;h2 id=&quot;numba-compiling-python-to-cuda&quot;&gt;Numba: Compiling Python to CUDA&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;See also this &lt;a href=&quot;https://blog.dask.org/2019/04/09/numba-stencil&quot;&gt;recent blogpost about Numba
stencils&lt;/a&gt; and the attached &lt;a href=&quot;https://gist.github.com/mrocklin/9272bf84a8faffdbbe2cd44b4bc4ce3c&quot;&gt;GPU
notebook&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The built-in operations in GPU libraries like CuPy and RAPIDS cover most common
operations. However, in real-world settings we often find messy situations
that require writing a little bit of custom code. Switching down to C/C++/CUDA
in these cases can be challenging, especially for users that are primarily
Python developers. This is where Numba can come in.&lt;/p&gt;

&lt;p&gt;Python has this same problem on the CPU as well. Users often couldn’t be
bothered to learn C/C++ to write fast custom code. To address this there are
tools like Cython or Numba, which let Python programmers write fast numeric
code without learning much beyond the Python language.&lt;/p&gt;

&lt;p&gt;For example, Numba accelerates the for-loop style code below about 500x on the
CPU, from slow Python speeds up to fast C/Fortran speeds.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numba&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# We added these two lines for a 500x speedup
&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jit&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# We added these two lines for a 500x speedup
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The ability to drop down to low-level performant code without context switching
out of Python is useful, particularly if you don’t already know C/C++ or
have a compiler chain set up for you (which is the case for most Python users
today).&lt;/p&gt;

&lt;p&gt;This benefit is even more pronounced on the GPU. While many Python programmers
know a little bit of C, very few of them know CUDA. Even if they did, they
would probably have difficulty in setting up the compiler tools and development
environment.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href=&quot;https://numba.pydata.org/numba-doc/dev/cuda/index.html&quot;&gt;numba.cuda.jit&lt;/a&gt;
Numba’s backend for CUDA. Numba.cuda.jit allows Python users to author,
compile, and run CUDA code, written in Python, interactively without leaving a
Python session. Here is an image of writing a stencil computation that
smoothes a 2d-image all from within a Jupyter Notebook:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/numba.cuda.jit.png&quot; width=&quot;100%&quot; alt=&quot;Numba.cuda.jit in a Jupyter Notebook&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here is a simplified comparison of Numba CPU/GPU code to compare programming
style..
The GPU code gets a 200x speed improvement over a single CPU core.&lt;/p&gt;

&lt;h3 id=&quot;cpu--600-ms&quot;&gt;CPU – 600 ms&lt;/h3&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jit&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empty_like&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or if we use the fancy numba.stencil decorator …&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stencil&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;gpu--3-ms&quot;&gt;GPU – 3 ms&lt;/h3&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cuda&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;jit&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;smooth_gpu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cuda&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
                     &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
                     &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Numba.cuda.jit has been out in the wild for years.
It’s accessible, mature, and fun to play with.
If you have a machine with a GPU in it and some curiosity
then we strongly recommend that you try it out.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install numba
# or
pip install numba
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numba.cuda&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;scaling-with-dask&quot;&gt;Scaling with Dask&lt;/h2&gt;

&lt;p&gt;As mentioned in previous blogposts
(
&lt;a href=&quot;https://blog.dask.org/2019/01/03/dask-array-gpus-first-steps&quot;&gt;1&lt;/a&gt;,
&lt;a href=&quot;https://blog.dask.org/2019/01/13/dask-cudf-first-steps&quot;&gt;2&lt;/a&gt;,
&lt;a href=&quot;https://blog.dask.org/2019/03/04/building-gpu-groupbys&quot;&gt;3&lt;/a&gt;,
&lt;a href=&quot;https://blog.dask.org/2019/03/18/dask-nep18&quot;&gt;4&lt;/a&gt;
)
we’ve been generalizing &lt;a href=&quot;https://dask.org&quot;&gt;Dask&lt;/a&gt;, to operate not just with
Numpy arrays and Pandas dataframes, but with anything that looks enough like
Numpy (like &lt;a href=&quot;https://cupy.chainer.org/&quot;&gt;CuPy&lt;/a&gt; or
&lt;a href=&quot;https://sparse.pydata.org/en/latest/&quot;&gt;Sparse&lt;/a&gt; or
&lt;a href=&quot;https://github.com/google/jax&quot;&gt;Jax&lt;/a&gt;) or enough like Pandas (like &lt;a href=&quot;https://docs.rapids.ai/api/cudf/nightly/&quot;&gt;RAPIDS
cuDF&lt;/a&gt;)
to scale those libraries out too. This is working out well. Here is a brief
video showing Dask array computing an SVD in parallel, and seeing what happens
when we swap out the Numpy library for CuPy.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/QyyxpzNPuIE?start=1046&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;We see that there is about a 10x speed improvement on the computation. Most
importantly, we were able to switch between a CPU implementation and a GPU
implementation with a small one-line change, but continue using the
sophisticated algorithms with Dask Array, like it’s parallel SVD
implementation.&lt;/p&gt;

&lt;p&gt;We also saw a relative slowdown in communication. In general almost all
non-trivial Dask + GPU work today is becoming communication-bound. We’ve
gotten fast enough at computation that the relative importance of communication
has grown significantly. We’re working to resolve this with our next topic,
UCX.&lt;/p&gt;

&lt;h2 id=&quot;communication-with-ucx&quot;&gt;Communication with UCX&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;See &lt;a href=&quot;https://developer.download.nvidia.com/video/gputechconf/gtc/2019/video/S9679/s9679-ucx-python-a-flexible-communication-library-for-python-applications.mp4&quot;&gt;this talk&lt;/a&gt; by &lt;a href=&quot;https://github.com/Akshay-Venkatesh&quot;&gt;Akshay
Venkatesh&lt;/a&gt; or view &lt;a href=&quot;https://www.slideshare.net/MatthewRocklin/ucxpython-a-flexible-communication-library-for-python-applications&quot;&gt;the
slides&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Also see &lt;a href=&quot;https://blog.dask.org/2019/06/09/ucx-dgx&quot;&gt;this recent blogpost about UCX and
Dask&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We’ve been integrating the &lt;a href=&quot;https://openucx.org&quot;&gt;OpenUCX&lt;/a&gt; library into Python
with &lt;a href=&quot;https://github.com/rapidsai/ucx-py&quot;&gt;UCX-Py&lt;/a&gt;. UCX provides uniform access
to transports like TCP, InfiniBand, shared memory, and NVLink. UCX-Py is the
first time that access to many of these transports has been easily accessible
from the Python language.&lt;/p&gt;

&lt;p&gt;Using UCX and Dask together we’re able to get significant speedups. Here is a
trace of the SVD computation from before both before and after adding UCX:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before UCX&lt;/strong&gt;:&lt;/p&gt;

&lt;iframe src=&quot;https://matthewrocklin.com/raw-host/task_stream_lcc_dgx16.html&quot; width=&quot;100%&quot; height=&quot;200&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;strong&gt;After UCX&lt;/strong&gt;:&lt;/p&gt;

&lt;iframe src=&quot;https://matthewrocklin.com/raw-host/task_stream_dgx_dgx16.html&quot; width=&quot;100%&quot; height=&quot;200&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;There is still a great deal to do here though (the blogpost linked above has
several items in the Future Work section).&lt;/p&gt;

&lt;p&gt;People can try out UCX and UCX-Py with highly experimental conda packages:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda create -n ucx -c conda-forge -c jakirkham/label/ucx cudatoolkit=9.2 ucx-proc=*=gpu ucx ucx-py python=3.7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We hope that this work will also affect non-GPU users on HPC systems with
Infiniband, or even users on consumer hardware due to the easy access to shared
memory communication.&lt;/p&gt;

&lt;h2 id=&quot;packaging&quot;&gt;Packaging&lt;/h2&gt;

&lt;p&gt;In an &lt;a href=&quot;https://matthewrocklin.com/blog/work/2018/12/17/gpu-python-challenges&quot;&gt;earlier blogpost&lt;/a&gt;
we discussed the challenges around installing the wrong versions of CUDA
enabled packages that don’t match the CUDA driver installed on the system.
Fortunately due to recent work from &lt;a href=&quot;https://github.com/seibert&quot;&gt;Stan Seibert&lt;/a&gt;
and &lt;a href=&quot;https://github.com/msarahan&quot;&gt;Michael Sarahan&lt;/a&gt; at Anaconda, Conda 4.7 now
has a special &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cuda&lt;/code&gt; meta-package that is set to the version of the installed
driver. This should make it much easier for users in the future to install the
correct package.&lt;/p&gt;

&lt;p&gt;Conda 4.7 was just releasead, and comes with many new features other than the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cuda&lt;/code&gt; meta-package. You can read more about it &lt;a href=&quot;https://www.anaconda.com/how-we-made-conda-faster-4-7/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda update conda
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There is still plenty of work to do in the packaging space today.
Everyone who builds conda packages does it their own way,
resulting in headache and heterogeneity.
This is largely due to not having centralized infrastructure
to build and test CUDA enabled packages,
like we have in &lt;a href=&quot;https://conda-forge.org&quot;&gt;Conda Forge&lt;/a&gt;.
Fortunately, the Conda Forge community is working together with Anaconda and
NVIDIA to help resolve this, though that will likely take some time.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;This post gave an update of the status of some of the efforts behind GPU
computing in Python. It also provided a variety of links for future reading.
We include them below if you would like to learn more:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/e/2PACX-1vSajAH6FzgQH4OwOJD5y-t9mjF9tTKEeljguEsfcjavp18pL4LkpABy4lW2uMykIUvP2dC-1AmhCq6l/pub?start=false&amp;amp;loop=false&amp;amp;delayms=60000&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Numpy on the GPU: &lt;a href=&quot;https://cupy.chainer.org/&quot;&gt;CuPy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Numpy on the GPU (again): &lt;a href=&quot;https://github.com/google/jax&quot;&gt;Jax&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Pandas on the GPU: &lt;a href=&quot;https://docs.rapids.ai/api/cudf/nightly/&quot;&gt;RAPIDS cuDF&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Scikit-Learn on the GPU: &lt;a href=&quot;https://docs.rapids.ai/api/cuml/nightly/&quot;&gt;RAPIDS cuML&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pentschev/pybench&quot;&gt;Benchmark suite&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/mrocklin/9272bf84a8faffdbbe2cd44b4bc4ce3c&quot;&gt;Numba CUDA JIT notebook&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://developer.download.nvidia.com/video/gputechconf/gtc/2019/video/S9679/s9679-ucx-python-a-flexible-communication-library-for-python-applications.mp4&quot;&gt;A talk on UCX&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org/2019/06/09/ucx-dgx&quot;&gt;A blogpost on UCX and Dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.anaconda.com/how-we-made-conda-faster-4-7/&quot;&gt;Conda 4.7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;script&gt;
  var spec = {
  &quot;config&quot;: {
    &quot;view&quot;: {
      &quot;width&quot;: 300,
      &quot;height&quot;: 200
    },
    &quot;mark&quot;: {
      &quot;tooltip&quot;: null
    },
    &quot;axis&quot;: {
      &quot;grid&quot;: false,
      &quot;labelColor&quot;: &quot;#666666&quot;,
      &quot;labelFontSize&quot;: 16,
      &quot;titleColor&quot;: &quot;#666666&quot;,
      &quot;titleFontSize&quot;: 20
    },
    &quot;axisX&quot;: {
      &quot;labelAngle&quot;: -30,
      &quot;labelColor&quot;: &quot;#666666&quot;,
      &quot;labelFontSize&quot;: 0,
      &quot;titleColor&quot;: &quot;#666666&quot;,
      &quot;titleFontSize&quot;: 0
    },
    &quot;header&quot;: {
      &quot;labelAngle&quot;: -20,
      &quot;labelColor&quot;: &quot;#666666&quot;,
      &quot;labelFontSize&quot;: 16,
      &quot;titleColor&quot;: &quot;#666666&quot;,
      &quot;titleFontSize&quot;: 20
    },
    &quot;legend&quot;: {
      &quot;fillColor&quot;: &quot;#fefefe&quot;,
      &quot;labelColor&quot;: &quot;#666666&quot;,
      &quot;labelFontSize&quot;: 18,
      &quot;padding&quot;: 10,
      &quot;strokeColor&quot;: &quot;gray&quot;,
      &quot;titleColor&quot;: &quot;#666666&quot;,
      &quot;titleFontSize&quot;: 18
    }
  },
  &quot;data&quot;: {
    &quot;name&quot;: &quot;data-4957f64f65957150f8029f7df2e6936f&quot;
  },
  &quot;facet&quot;: {
    &quot;column&quot;: {
      &quot;type&quot;: &quot;nominal&quot;,
      &quot;field&quot;: &quot;operation&quot;,
      &quot;sort&quot;: {
        &quot;field&quot;: &quot;speedup&quot;,
        &quot;op&quot;: &quot;sum&quot;,
        &quot;order&quot;: &quot;descending&quot;
      },
      &quot;title&quot;: &quot;Operation&quot;
    }
  },
  &quot;spec&quot;: {
    &quot;layer&quot;: [
      {
        &quot;mark&quot;: {
          &quot;type&quot;: &quot;bar&quot;,
          &quot;fontSize&quot;: 18,
          &quot;opacity&quot;: 1.0
        },
        &quot;encoding&quot;: {
          &quot;color&quot;: {
            &quot;type&quot;: &quot;nominal&quot;,
            &quot;field&quot;: &quot;size&quot;,
            &quot;scale&quot;: {
              &quot;domain&quot;: [
                &quot;800MB&quot;,
                &quot;8MB&quot;
              ],
              &quot;range&quot;: [
                &quot;#7306ff&quot;,
                &quot;#36c9dd&quot;
              ]
            },
            &quot;title&quot;: &quot;Array Size&quot;
          },
          &quot;x&quot;: {
            &quot;type&quot;: &quot;nominal&quot;,
            &quot;field&quot;: &quot;size&quot;
          },
          &quot;y&quot;: {
            &quot;type&quot;: &quot;quantitative&quot;,
            &quot;axis&quot;: {
              &quot;title&quot;: &quot;GPU Speedup Over CPU&quot;
            },
            &quot;field&quot;: &quot;speedup&quot;,
            &quot;scale&quot;: {
              &quot;domain&quot;: [
                0,
                1000
              ],
              &quot;type&quot;: &quot;symlog&quot;
            },
            &quot;stack&quot;: null
          }
        },
        &quot;height&quot;: 300,
        &quot;width&quot;: 50
      },
      {
        &quot;layer&quot;: [
          {
            &quot;mark&quot;: {
              &quot;type&quot;: &quot;text&quot;,
              &quot;dy&quot;: -5
            },
            &quot;encoding&quot;: {
              &quot;color&quot;: {
                &quot;type&quot;: &quot;nominal&quot;,
                &quot;field&quot;: &quot;size&quot;,
                &quot;scale&quot;: {
                  &quot;domain&quot;: [
                    &quot;800MB&quot;,
                    &quot;8MB&quot;
                  ],
                  &quot;range&quot;: [
                    &quot;#7306ff&quot;,
                    &quot;#36c9dd&quot;
                  ]
                },
                &quot;title&quot;: &quot;Array Size&quot;
              },
              &quot;text&quot;: {
                &quot;type&quot;: &quot;quantitative&quot;,
                &quot;field&quot;: &quot;speedup&quot;
              },
              &quot;x&quot;: {
                &quot;type&quot;: &quot;nominal&quot;,
                &quot;field&quot;: &quot;size&quot;
              },
              &quot;y&quot;: {
                &quot;type&quot;: &quot;quantitative&quot;,
                &quot;axis&quot;: {
                  &quot;title&quot;: &quot;GPU Speedup Over CPU&quot;
                },
                &quot;field&quot;: &quot;speedup&quot;,
                &quot;scale&quot;: {
                  &quot;domain&quot;: [
                    0,
                    1000
                  ],
                  &quot;type&quot;: &quot;symlog&quot;
                },
                &quot;stack&quot;: null
              }
            },
            &quot;height&quot;: 300,
            &quot;width&quot;: 50
          },
          {
            &quot;mark&quot;: {
              &quot;type&quot;: &quot;text&quot;,
              &quot;dy&quot;: 7
            },
            &quot;encoding&quot;: {
              &quot;color&quot;: {
                &quot;type&quot;: &quot;nominal&quot;,
                &quot;field&quot;: &quot;size&quot;,
                &quot;scale&quot;: {
                  &quot;domain&quot;: [
                    &quot;800MB&quot;,
                    &quot;8MB&quot;
                  ],
                  &quot;range&quot;: [
                    &quot;#7306ff&quot;,
                    &quot;#36c9dd&quot;
                  ]
                },
                &quot;title&quot;: &quot;Array Size&quot;
              },
              &quot;text&quot;: {
                &quot;type&quot;: &quot;quantitative&quot;,
                &quot;field&quot;: &quot;speedup&quot;
              },
              &quot;x&quot;: {
                &quot;type&quot;: &quot;nominal&quot;,
                &quot;field&quot;: &quot;size&quot;
              },
              &quot;y&quot;: {
                &quot;type&quot;: &quot;quantitative&quot;,
                &quot;axis&quot;: {
                  &quot;title&quot;: &quot;GPU Speedup Over CPU&quot;
                },
                &quot;field&quot;: &quot;speedup&quot;,
                &quot;scale&quot;: {
                  &quot;domain&quot;: [
                    0,
                    1000
                  ],

                  &quot;type&quot;: &quot;symlog&quot;
                },
                &quot;stack&quot;: null
              }
            },
            &quot;height&quot;: 300,
            &quot;width&quot;: 50
          }
        ]
      }
    ]
  },
  &quot;$schema&quot;: &quot;https://vega.github.io/schema/vega-lite/v3.3.0.json&quot;,
  &quot;datasets&quot;: {
    &quot;data-4957f64f65957150f8029f7df2e6936f&quot;: [
      {
        &quot;operation&quot;: &quot;FFT&quot;,
        &quot;speedup&quot;: 5.3,
        &quot;shape0&quot;: 1000,
        &quot;shape1&quot;: 1000,
        &quot;shape&quot;: &quot;1000x1000&quot;,
        &quot;size&quot;: &quot;8MB&quot;
      },
      {
        &quot;operation&quot;: &quot;FFT&quot;,
        &quot;speedup&quot;: 210.0,
        &quot;shape0&quot;: 10000,
        &quot;shape1&quot;: 10000,
        &quot;shape&quot;: &quot;10000x10000&quot;,
        &quot;size&quot;: &quot;800MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Sum&quot;,
        &quot;speedup&quot;: 8.3,
        &quot;shape0&quot;: 1000,
        &quot;shape1&quot;: 1000,
        &quot;shape&quot;: &quot;1000x1000&quot;,
        &quot;size&quot;: &quot;8MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Sum&quot;,
        &quot;speedup&quot;: 66.0,
        &quot;shape0&quot;: 10000,
        &quot;shape1&quot;: 10000,
        &quot;shape&quot;: &quot;10000x10000&quot;,
        &quot;size&quot;: &quot;800MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Standard Deviation&quot;,
        &quot;speedup&quot;: 1.1,
        &quot;shape0&quot;: 1000,
        &quot;shape1&quot;: 1000,
        &quot;shape&quot;: &quot;1000x1000&quot;,
        &quot;size&quot;: &quot;8MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Standard Deviation&quot;,
        &quot;speedup&quot;: 3.5,
        &quot;shape0&quot;: 10000,
        &quot;shape1&quot;: 10000,
        &quot;shape&quot;: &quot;10000x10000&quot;,
        &quot;size&quot;: &quot;800MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Elementwise&quot;,
        &quot;speedup&quot;: 150.0,
        &quot;shape0&quot;: 1000,
        &quot;shape1&quot;: 1000,
        &quot;shape&quot;: &quot;1000x1000&quot;,
        &quot;size&quot;: &quot;8MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Elementwise&quot;,
        &quot;speedup&quot;: 270.0,
        &quot;shape0&quot;: 10000,
        &quot;shape1&quot;: 10000,
        &quot;shape&quot;: &quot;10000x10000&quot;,
        &quot;size&quot;: &quot;800MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Matrix Multiplication&quot;,
        &quot;speedup&quot;: 18.0,
        &quot;shape0&quot;: 1000,
        &quot;shape1&quot;: 1000,
        &quot;shape&quot;: &quot;1000x1000&quot;,
        &quot;size&quot;: &quot;8MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Matrix Multiplication&quot;,
        &quot;speedup&quot;: 11.0,
        &quot;shape0&quot;: 10000,
        &quot;shape1&quot;: 10000,
        &quot;shape&quot;: &quot;10000x10000&quot;,
        &quot;size&quot;: &quot;800MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Array Slicing&quot;,
        &quot;speedup&quot;: 3.6,
        &quot;shape0&quot;: 1000,
        &quot;shape1&quot;: 1000,
        &quot;shape&quot;: &quot;1000x1000&quot;,
        &quot;size&quot;: &quot;8MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Array Slicing&quot;,
        &quot;speedup&quot;: 190.0,
        &quot;shape0&quot;: 10000,
        &quot;shape1&quot;: 10000,
        &quot;shape&quot;: &quot;10000x10000&quot;,
        &quot;size&quot;: &quot;800MB&quot;
      },
      {
        &quot;operation&quot;: &quot;SVD&quot;,
        &quot;speedup&quot;: 1.5,
        &quot;shape0&quot;: 1000,
        &quot;shape1&quot;: 1000,
        &quot;shape&quot;: &quot;1000x1000&quot;,
        &quot;size&quot;: &quot;8MB&quot;
      },
      {
        &quot;operation&quot;: &quot;SVD&quot;,
        &quot;speedup&quot;: 17.0,
        &quot;shape0&quot;: 10000,
        &quot;shape1&quot;: 1000,
        &quot;shape&quot;: &quot;10000x1000&quot;,
        &quot;size&quot;: &quot;800MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Stencil&quot;,
        &quot;speedup&quot;: 5.1,
        &quot;shape0&quot;: 1000,
        &quot;shape1&quot;: 1000,
        &quot;shape&quot;: &quot;1000x1000&quot;,
        &quot;size&quot;: &quot;8MB&quot;
      },
      {
        &quot;operation&quot;: &quot;Stencil&quot;,
        &quot;speedup&quot;: 150.0,
        &quot;shape0&quot;: 10000,
        &quot;shape1&quot;: 10000,
        &quot;shape&quot;: &quot;10000x10000&quot;,
        &quot;size&quot;: &quot;800MB&quot;
      }
    ]
  }
};

  var embedOpt = {&quot;mode&quot;: &quot;vega-lite&quot;};

  function showError(el, error){
      el.innerHTML = (&apos;&lt;div class=&quot;error&quot; style=&quot;color:red;&quot;&gt;&apos;
                      + &apos;&lt;p&gt;JavaScript Error: &apos; + error.message + &apos;&lt;/p&gt;&apos;
                      + &quot;&lt;p&gt;This usually means there&apos;s a typo in your chart specification. &quot;
                      + &quot;See the javascript console for the full traceback.&lt;/p&gt;&quot;
                      + &apos;&lt;/div&gt;&apos;);
      throw error;
  }
  vegaEmbed(&quot;#vis&quot;, spec, embedOpt)
    .catch(error =&gt; showError(el, error));
&lt;/script&gt;

</content>
 </entry>
 
 
 
 <entry>
   <title>Dask on HPC</title>
   <link href="https://blog.dask.org/2019/06/12/dask-on-hpc"/>
   <updated>2019-06-12T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/06/12/dask-on-hpc</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;We analyze large datasets on HPC systems with Dask, a parallel computing
library that integrates well with the existing Python software ecosystem, and
works comfortably with native HPC hardware.&lt;/p&gt;

&lt;p&gt;This article explains why this approach makes sense for us.
Our motivation is to share our experiences with our colleagues,
and to highlight opportunities for future work.&lt;/p&gt;

&lt;p&gt;We start with six reasons why we use Dask,
followed by seven issues that affect us today.&lt;/p&gt;

&lt;h2 id=&quot;reasons-why-we-use-dask&quot;&gt;Reasons why we use Dask&lt;/h2&gt;

&lt;h3 id=&quot;1-ease-of-use&quot;&gt;1. Ease of use&lt;/h3&gt;

&lt;p&gt;Dask extends libraries like Numpy, Pandas, and Scikit-learn, which are well-known APIs for scientists and engineers. It also extends simpler APIs for
multi-node multiprocessing. This makes it easy for our existing user base to
get up to speed.&lt;/p&gt;

&lt;p&gt;By abstracting the parallelism away from the user/developer, our analysis tools can be written by computer science non-experts, such as the scientists
themselves, meaning that our software engineers can take on more of a supporting role than a leadership role.
Experience has shown that, with tools like Dask and Jupyter, scientists spend less time coding and more time thinking about science, as they should.&lt;/p&gt;

&lt;h3 id=&quot;2-smooth-hpc-integration&quot;&gt;2. Smooth HPC integration&lt;/h3&gt;

&lt;p&gt;With tools like &lt;a href=&quot;https://jobqueue.dask.org&quot;&gt;Dask Jobqueue&lt;/a&gt; and &lt;a href=&quot;https://mpi.dask.org&quot;&gt;Dask MPI&lt;/a&gt; there is no need of any boilerplate shell scripting code commonly found with job queueing systems.&lt;/p&gt;

&lt;p&gt;Dask interacts natively with our existing job schedulers (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SLURM&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SGE&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LSF&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PBS&lt;/code&gt;/…)
so there is no additional system to set up and manage between users and IT.
All the infrastructure that we need is already in place.&lt;/p&gt;

&lt;p&gt;Interactive analysis at scale is powerful, and lets
us use our existing infrastructure in new ways.
Auto scaling improves our occupancy and helps with acceptance by HPC operators / owners.
Dask’s resilience against the death of all or part of its workers offers new ways of leveraging job-preemption when co-locating classical HPC workloads with analytics jobs.&lt;/p&gt;

&lt;h3 id=&quot;3-aimed-for-scientific-processing&quot;&gt;3. Aimed for Scientific Processing&lt;/h3&gt;

&lt;p&gt;In addition to being integrated with the Scipy and PyData software ecosystems,
Dask is compatible with scientific data formats like HDF5, NetCDF, Parquet, and
so on. This is because Dask works with other libraries within the Python
ecosystem, like Xarray, which already have strong support for scientific data
formats and processing, and with C/C++/Fortran codes, such as is common for Python libraries.&lt;/p&gt;

&lt;p&gt;This native support is one of the major advantages that we’ve seen of Dask over Apache Spark.&lt;/p&gt;

&lt;h3 id=&quot;4-versatility-of-apis&quot;&gt;4. Versatility of APIs&lt;/h3&gt;

&lt;p&gt;And yet Dask is not designed for any particular workflow, but instead can
provide infrastructure to cover a variety of different problems within an
institution. Many different kinds of workloads are possible:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You can easily handle Numpy arrays or Pandas Dataframes at scale, doing some numerical work or data analysis/cleaning,&lt;/li&gt;
  &lt;li&gt;You can handle any objects collection, like JSON files, text, or log files,&lt;/li&gt;
  &lt;li&gt;You can express more arbitrary task or job scheduling workloads with Dask Delayed, or real time and reactive processing with Dask Futures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dask covers and simplifies many of the wide range of HPC workflows we’ve seen over the years. Many workflows that were previously implemented using job arrays, simplified MPI (e.g. mpi4py) or plain bash scripts seem to be easier for our users with Dask.&lt;/p&gt;

&lt;h3 id=&quot;5-versatility-of-infrastructure&quot;&gt;5. Versatility of Infrastructure&lt;/h3&gt;

&lt;p&gt;Dask is compatible with laptops, servers, HPC systems, and cloud computing. The environment can change with very little code adaptation which reduces our burden to rewrite code as we migrate analysis between systems such as from a laptop to a supercomputer, or between a supercomputer and the cloud.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Local machines
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# HPC Job Schedulers
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_jobqueue&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SLURMCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PBSCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SGECluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SLURMCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;queue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;default&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ABCD1234&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Hadoop/Spark clusters
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_yarn&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;YARNCluster&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;YarnCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;environment.tar.gz&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;worker_vcores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Cloud/Kubernetes clusters
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_kubernetes&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;KubeCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pod_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{...})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dask is more than just a tool to us; it is a gateway to thinking about a completely different way of providing computing infrastructure to our users. Dask opens up the door to cloud computing technologies (such as elastic scaling and object storage) and makes us rethink what an HPC center should really look like.&lt;/p&gt;

&lt;h3 id=&quot;6-cost-and-collaboration&quot;&gt;6. Cost and Collaboration&lt;/h3&gt;

&lt;p&gt;Dask is free and open source, which means we do not have to rebalance our budget and staff to address the new immediate need of data analysis tools.
We don’t have to pay for licenses, and we have the ability to make changes to the code when necessary. The HPC community has good representation among Dask developers. It’s easy for us to participate and our concerns are well understood.&lt;/p&gt;

&lt;!-- WR: Mention quick response to new use cases / demands as another benefit of the collaborative
approach?  And hint towards dask-mpi here? --&gt;

&lt;h2 id=&quot;what-needs-work&quot;&gt;What needs work&lt;/h2&gt;

&lt;h3 id=&quot;1-heterogeneous-resources-handling&quot;&gt;1. Heterogeneous resources handling&lt;/h3&gt;

&lt;p&gt;Often we want to include different kinds of HPC nodes in the same deployment.
This includes situations like the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Workers with low or high memory,&lt;/li&gt;
  &lt;li&gt;Workers with GPUs,&lt;/li&gt;
  &lt;li&gt;Workers from different node pools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dask provides some support for this heterogeneity already, but not enough.
We see two major opportunities for improvement.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tools like Dask-Jobqueue should make it easier to manage multiple worker
pools within the same cluster. Currently the deployment solution assumes
homogeneity.&lt;/li&gt;
  &lt;li&gt;It should be easier for users to specify which parts of a computation
require different hardware. The solution today works, but requires more
detail from the user than is ideal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-coarse-grained-diagnostics-and-history&quot;&gt;2. Coarse-Grained Diagnostics and History&lt;/h3&gt;

&lt;p&gt;Dask provides a number of profiling tools that deliver real-time diagnostics at the individual task-level, but there is no way today to analyze or profile your Dask application at a coarse-grained level, and no built-in way to track performance over long periods of time.&lt;/p&gt;

&lt;p&gt;Having more tools to analyze bulk performance would be helpful when making design decisions and future architecture choices.&lt;/p&gt;

&lt;p&gt;Having the ability to persist or store history of computations (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute()&lt;/code&gt; calls)
and tasks executed on a scheduler could be really helpful to track problems and potential performance improvements.&lt;/p&gt;

&lt;!-- JJH: One tangible idea here would be a benchmarking suite that helps users make decisions about how to use dask most effectively.
 --&gt;

&lt;h3 id=&quot;3-scheduler-performance-on-large-graphs&quot;&gt;3. Scheduler Performance on Large Graphs&lt;/h3&gt;

&lt;p&gt;HPC users want to analyze Petabyte datasets on clusters of thousands of large nodes.&lt;/p&gt;

&lt;p&gt;While Dask can theoretically handle this scale, it does tend to slow down a bit,
reducing the pleasure of interactive large-scale computing. Handling millions of tasks can lead to tens of seconds latency before a computation actually starts. This is perfectly fine for our Dask batch jobs, but tends to make the interactive Jupyter users frustrated.&lt;/p&gt;

&lt;p&gt;Much of this slowdown is due to task-graph construction time and centralized scheduling, both of which can be accelerated through a variety of means. We expect that, with some cleverness, we can increase the scale at which Dask continues to run smoothly by another order of magnitude.&lt;/p&gt;

&lt;h3 id=&quot;4-launch-batch-jobs-with-mpi&quot;&gt;4. &lt;del&gt;Launch Batch Jobs with MPI&lt;/del&gt;&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;This issue was resolved while we prepared this blogpost.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most Dask workflows today are interactive. People log into a Jupyter notebook, import Dask, and then Dask asks the job scheduler (like SLURM, PBS, …) for resources dynamically. This is great because Dask is able to fit into small gaps in the schedule, release workers when they’re not needed, giving users a pleasant interactive experience while lessening the load on the cluster.&lt;/p&gt;

&lt;p&gt;However not all jobs are interactive. Often scientists want to submit a large job similar to how they submit MPI jobs. They submit a single job script with the necessary resources, walk away, and the resource manager runs that job when those resources become available (which may be many hours from now). While not as novel as the interactive workloads, these workloads are critical to common processes, and important to support.&lt;/p&gt;

&lt;p&gt;This point was raised by Kevin Paul at NCAR during discussion of this blogpost. Between when we started planning and when we released this blogpost Kevin had already solved the problem by prodiving &lt;a href=&quot;https://dask-mpi.readthedocs.org&quot;&gt;dask-mpi&lt;/a&gt;, a project that makes it easy to launch Dask using normal &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mpirun&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mpiexec&lt;/code&gt; commands, making it easy to deploy Dask anywhere that MPI is deployable.&lt;/p&gt;

&lt;h3 id=&quot;5-more-data-formats&quot;&gt;5. More Data Formats&lt;/h3&gt;

&lt;p&gt;Dask works well today with bread-and-butter scientific data formats like HDF5, Grib, and NetCDF, as well as common data science formats like CSV, JSON, Parquet, ORC, and so on.&lt;/p&gt;

&lt;p&gt;However, the space of data formats is vast and Dask users find themselves struggling a little, or even solving the data ingestion problem manually for a number of common formats in different domains:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Remote sensing datasets: GeoTIFF, Jpeg2000,&lt;/li&gt;
  &lt;li&gt;Astronomical data: FITS, VOTable,&lt;/li&gt;
  &lt;li&gt;… and so on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supporting these isn’t hard (indeed many of us have built our own support for them in Dask), but it would be handy to have a high quality centralized solution.&lt;/p&gt;

&lt;h3 id=&quot;6-link-with-deep-learning&quot;&gt;6. Link with Deep Learning&lt;/h3&gt;

&lt;p&gt;Many of our institutions are excited to leverage recent advances in deep learning and integrate powerful tools like Keras, TensorFlow, and PyTorch and powerful hardware like GPUs into our workflows.&lt;/p&gt;

&lt;p&gt;However, we often find that our data and architecture look a bit different from what we find in standard deep learning tutorials. We like using Dask for data ingestion, cleanup, and pre-processing, but would like to establish better practices and smooth tooling to transition from scientific workflows on HPC using Dask to deep learning as efficiently as possible.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For more information, see &lt;a href=&quot;https://github.com/pangeo-data/pangeo/issues/567&quot;&gt;this github
issue&lt;/a&gt; for an example topic.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;7-more-calculation-guidelines&quot;&gt;7. More calculation guidelines&lt;/h3&gt;

&lt;p&gt;While there are means to analyse and diagnose computations interactively, and
a quite decent set of examples for Dask common calculations, trials and error appear to be the norm with big HPC computation before coming to optimized workflows.&lt;/p&gt;

&lt;p&gt;We should develop more guidelines and strategy on how to perform large scale computation, and we need to foster the community around Dask, which is already done in projects such as Pangeo. Note that these guidelines may be infrastructure dependent.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Experiments in High Performance Networking with UCX and DGX</title>
   <link href="https://blog.dask.org/2019/06/09/ucx-dgx"/>
   <updated>2019-06-09T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/06/09/ucx-dgx</id>
   
   <category>python</category>
   
   <category>scipy</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This post is about experimental and rapidly changing software.
Code examples in this post should not be relied upon to work in the future.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;This post talks about connecting UCX, a high performance networking library, to
Dask, a parallel Python library, to accelerate communication-heavy workloads,
particularly when using GPUs.&lt;/p&gt;

&lt;p&gt;Additionally, we do this work on a DGX, a high-end multi-CPU multi-GPU machine
with a complex internal network. Working in this context was good to force
improvements in setting up Dask in heterogeneous situations targeting
different network cards, CPU sockets, GPUs, and so on..&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;Many distributed computing workloads are communication-bound.
This is common in cases like the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Dataframe joins&lt;/li&gt;
  &lt;li&gt;Machine learning algorithms&lt;/li&gt;
  &lt;li&gt;Complex array computations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Communication becomes a bigger bottleneck as we accelerate our computation,
such as when we use GPUs for computing.&lt;/p&gt;

&lt;p&gt;Historically, high performance communication was only available using MPI, or
with custom solutions. This post describes an effort to get close to the
communication bandwidth of MPI while still maintaining the ease of
programmability and accessibility of a dynamic system like Dask.&lt;/p&gt;

&lt;h2 id=&quot;ucx-python-and-dask&quot;&gt;UCX, Python, and Dask&lt;/h2&gt;

&lt;p&gt;To get high performance networking in Dask, we wrapped UCX with Python and
then connected that to Dask.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://www.openucx.org/&quot;&gt;OpenUCX&lt;/a&gt; project provides a uniform API around
various high performance networking libraries like InfiniBand, traditional
networking protocols like TCP/shared memory, and GPU-specific protocols like
NVLink. It is a layer beneath something like OpenMPI (the main user of OpenUCX
today) that figures out which networking system to use.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.openucx.org/wp-content/uploads/2015/07/ucx-architecture-1024x505.jpg&quot;&gt;
&lt;img src=&quot;http://www.openucx.org/wp-content/uploads/2015/07/ucx-architecture-1024x505.jpg&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Python users today don’t have much access to these network libraries, except
through MPI, which is sometimes not ideal. (&lt;a href=&quot;https://pypi.org/search/?q=infiniband&quot;&gt;Try searching for “infiniband” on
PyPI.&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This led us to create &lt;a href=&quot;https://github.com/rapidsai/ucx-py/&quot;&gt;UCX-Py&lt;/a&gt;
.
UCX-Py is a Python wrapper around the UCX C library, which provides a Pythonic
API, both with blocking syntax appropriate for traditional HPC programs, as
well as a non-blocking &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;async/await&lt;/code&gt; syntax for more concurrent programs (like
Dask).
For more information on UCX I recommend watching Akshay’s &lt;a href=&quot;https://on-demand-gtc.gputechconf.com/gtcnew/sessionview.php?sessionName=s9679-ucx-python%3a+a+flexible+communication+library+for+python+applications&quot;&gt;UCX
talk&lt;/a&gt;
from the GPU Technology Conference 2019.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: UCX-Py was primarily developed by &lt;a href=&quot;https://github.com/Akshay-Venkatesh/&quot;&gt;Akshay Venkatesh&lt;/a&gt; (UCX, NVIDIA)
&lt;a href=&quot;https://tomaugspurger.github.io/&quot;&gt;Tom Augspurger&lt;/a&gt; (Dask, Pandas, Anaconda),
and &lt;a href=&quot;https://github.com/quasiben/&quot;&gt;Ben Zaitlen&lt;/a&gt; (NVIDIA, RAPIDS, Dask))&lt;/em&gt;&lt;/p&gt;

&lt;video width=&quot;560&quot; height=&quot;315&quot; controls=&quot;&quot;&gt;
    &lt;source src=&quot;https://developer.download.nvidia.com/video/gputechconf/gtc/2019/video/S9679/s9679-ucx-python-a-flexible-communication-library-for-python-applications.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;

&lt;p&gt;We then &lt;a href=&quot;https://github.com/dask/distributed/blob/master/distributed/comm/ucx.py&quot;&gt;extended Dask communications to optionally use UCX&lt;/a&gt;.
If you have UCX and UCX-Py installed, then you can use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ucx://&lt;/code&gt; protocol in
addresses or the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--protocol ucx&lt;/code&gt; flag when starting things up, something like
this.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ dask-scheduler --protocol ucx
Scheduler started at ucx://127.0.0.1:8786

$ dask-worker ucx://127.0.0.1:8786
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ucx://127.0.0.1:8786&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;experiment&quot;&gt;Experiment&lt;/h2&gt;

&lt;p&gt;We modified our &lt;a href=&quot;https://github.com/mrocklin/dask-gpu-benchmarks/blob/master/cupy-svd.ipynb&quot;&gt;SVD with Dask and CuPy
benchmark&lt;/a&gt;
benchmark to use the UCX protocol for inter-process communication and ran it on
half of a DGX machine, using four GPUs. Here is a minimal implementation of the
UCX-enabled code:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cuda&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DGX&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Define DGX cluster and client
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DGX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Create random data
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Perform distributed SVD
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;By using UCX the overall communication times are reduced by an order of
magnitude. To produce the task-stream figures below, the benchmark was run on a
DGX-1 with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CUDA_VISIBLE_DEVICES=[0,1,2,3]&lt;/code&gt;. It is clear that the red task
bars, corresponding to inter-process communication, are significantly
compressed. Communications that were taking 500ms-1s before now take around 20ms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before UCX&lt;/strong&gt;:&lt;/p&gt;

&lt;iframe src=&quot;https://matthewrocklin.com/raw-host/task_stream_lcc_dgx16.html&quot; width=&quot;100%&quot; height=&quot;200&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;strong&gt;After UCX&lt;/strong&gt;:&lt;/p&gt;

&lt;iframe src=&quot;https://matthewrocklin.com/raw-host/task_stream_dgx_dgx16.html&quot; width=&quot;100%&quot; height=&quot;200&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;diving-into-the-details&quot;&gt;Diving into the Details&lt;/h2&gt;

&lt;p&gt;On a GPU using NVLink we can get somewhere between 5-10 GB/s throughput between
pairs of GPUs. On a CPU this drops down to 1-2 GB/s (which seems well below
optimal).
These speeds can affect all Dask workloads (array, dataframe, xarray, ML, …),
but when the proper hardware is present, other bottlenecks may occur,
such as serialization when dealing with text or JSON-like data.&lt;/p&gt;

&lt;p&gt;This of course, depends on this fancy networking hardware being present.
On the GPU example above we’re mostly relying on NVLink, but we would also get
improved performance on an HPC InfiniBand network or even on a single laptop
machine using shared memory transports.&lt;/p&gt;

&lt;p&gt;The examples above was run on a DGX machine, which includes all of these
transports and more (as well as numerous GPUs).&lt;/p&gt;

&lt;h2 id=&quot;dgx&quot;&gt;DGX&lt;/h2&gt;

&lt;p&gt;The test machine used above was a
&lt;a href=&quot;https://www.nvidia.com/en-us/data-center/dgx-1/&quot;&gt;DGX-1&lt;/a&gt;, which has eight GPUs,
two CPU sockets, four Infiniband network cards, and a complex NVLink
arrangement. This is a good example of non-uniform hardware. Certain CPUs
are closer to certain GPUs and network cards, and understanding this proximity
has an order-of-magnitude effect on performance. This situation isn’t unique
to DGX machines. The same situation arises when we have …&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Multiple workers in one node, with several nodes in a cluster&lt;/li&gt;
  &lt;li&gt;Multiple nodes in one rack, with several racks in a data center&lt;/li&gt;
  &lt;li&gt;Multiple data centers, such as is the case with hybrid cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Working with the DGX was interesting because it forced us to start thinking
about heterogeneity, and making it easier to specify complex deployment scenarios
with Dask.&lt;/p&gt;

&lt;p&gt;Here is a diagram showing how the GPUs, CPUs, and Infiniband
cards are connected to each other in a DGX-1:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.nvidia.com/dgx/bp-dgx/index.html#networking&quot;&gt;
  &lt;img src=&quot;https://docs.nvidia.com/dgx/bp-dgx/graphics/networks.png&quot; width=&quot;100%&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here the output of nvidia-smi showing the NVLink, networking, and CPU affinity
structure (this is mostly orthogonal to the structure displayed above).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ nvidia-smi  topo -m
     GPU0  GPU1  GPU2  GPU3  GPU4  GPU5  GPU6  GPU7   ib0   ib1   ib2   ib3
GPU0   X    NV1   NV1   NV2   NV2   SYS   SYS   SYS   PIX   SYS   PHB   SYS
GPU1  NV1    X    NV2   NV1   SYS   NV2   SYS   SYS   PIX   SYS   PHB   SYS
GPU2  NV1   NV2    X    NV2   SYS   SYS   NV1   SYS   PHB   SYS   PIX   SYS
GPU3  NV2   NV1   NV2    X    SYS   SYS   SYS   NV1   PHB   SYS   PIX   SYS
GPU4  NV2   SYS   SYS   SYS    X    NV1   NV1   NV2   SYS   PIX   SYS   PHB
GPU5  SYS   NV2   SYS   SYS   NV1    X    NV2   NV1   SYS   PIX   SYS   PHB
GPU6  SYS   SYS   NV1   SYS   NV1   NV2    X    NV2   SYS   PHB   SYS   PIX
GPU7  SYS   SYS   SYS   NV1   NV2   NV1   NV2    X    SYS   PHB   SYS   PIX
ib0   PIX   PIX   PHB   PHB   SYS   SYS   SYS   SYS    X    SYS   PHB   SYS
ib1   SYS   SYS   SYS   SYS   PIX   PIX   PHB   PHB   SYS    X    SYS   PHB
ib2   PHB   PHB   PIX   PIX   SYS   SYS   SYS   SYS   PHB   SYS    X    SYS
ib3   SYS   SYS   SYS   SYS   PHB   PHB   PIX   PIX   SYS   PHB   SYS    X

    CPU Affinity
GPU0  0-19,40-59
GPU1  0-19,40-59
GPU2  0-19,40-59
GPU3  0-19,40-59
GPU4  20-39,60-79
GPU5  20-39,60-79
GPU6  20-39,60-79
GPU7  20-39,60-79

Legend:

  X    = Self
  SYS  = Traverse PCIe as well as the SMP interconnect between NUMA nodes
  NODE = Travrese PCIe as well as the interconnect between PCIe Host Bridges
  PHB  = Traverse PCIe as well as a PCIe Host Bridge (typically the CPU)
  PXB  = Traverse multiple PCIe switches (without PCIe Host Bridge)
  PIX  = Traverse a single PCIe switch
  NV#  = Traverse a bonded set of # NVLinks
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The DGX was originally designed for deep learning
applications. The complex network infrastructure above can be well used by
specialized NVIDIA networking libraries like
&lt;a href=&quot;https://developer.nvidia.com/nccl&quot;&gt;NCCL&lt;/a&gt;, which knows how to route things
correctly, but is something of a challenge for other more general purpose
systems like Dask to adapt to.&lt;/p&gt;

&lt;p&gt;Fortunately, in meeting this challenge we were able to clean up a number of
related issues in Dask. In particular we can now:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Specify a more heterogeneous worker configuration when starting up a local cluster
&lt;a href=&quot;https://github.com/dask/distributed/pull/2675&quot;&gt;dask/distributed #2675&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Learn bandwidth over time
&lt;a href=&quot;https://github.com/dask/distributed/pull/2658&quot;&gt;dask/distributed #2658&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add Worker plugins to help handle things like CPU affinity (though this is
quite general)
&lt;a href=&quot;https://github.com/dask/distributed/pull/2453&quot;&gt;dask/distributed #2453&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With these changes we’re now able to describe most of the DGX structure as
configuration in the Python function below:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;os&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Nanny&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SpecCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;distributed.worker&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TOTAL_MEMORY&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cuda.local_cuda_cluster&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cuda_visible_devices&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CPUAffinity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot; A Worker plugin to pin CPU affinity &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sched_setaffinity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;n&quot;&gt;affinity&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# See nvidia-smi topo -m
&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;79&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;DGX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ib&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;dashboard_address&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;:8787&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;threads_per_worker&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;silence_logs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot; A Local Cluster for a DGX 1 machine

    NVIDIA&apos;s DGX-1 machine has a complex architecture mapping CPUs,
    GPUs, and network hardware.  This function creates a local cluster
    that tries to respect this hardware as much as possible.

    It creates one Dask worker process per GPU, and assigns each worker
    process the correct CPU cores and Network interface cards to
    maximize performance.

    That being said, things aren&apos;t perfect.  Today a DGX has very high
    performance between certain sets of GPUs and not others.  A Dask DGX
    cluster that uses only certain tightly coupled parts of the computer
    will have significantly higher bandwidth than a deployment on the
    entire thing.

    Parameters
    ----------
    interface: str
        The interface prefix for the infiniband networking cards.  This is
        often &quot;ib&quot;` or &quot;bond&quot;.  We will add the numeric suffix 0,1,2,3 as
        appropriate.  Defaults to &quot;ib&quot;.
    dashboard_address: str
        The address for the scheduler dashboard.  Defaults to &quot;:8787&quot;.
    CUDA_VISIBLE_DEVICES: str
        String like ``&quot;0,1,2,3&quot;`` or ``[0, 1, 2, 3]`` to restrict
        activity to different GPUs

    Examples
    --------
    &amp;gt;&amp;gt;&amp;gt; from dask_cuda import DGX
    &amp;gt;&amp;gt;&amp;gt; from dask.distributed import Client
    &amp;gt;&amp;gt;&amp;gt; cluster = DGX(interface=&apos;ib&apos;)
    &amp;gt;&amp;gt;&amp;gt; client = Client(cluster)
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;environ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CUDA_VISIBLE_DEVICES&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;0,1,2,3,4,5,6,7&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;memory_limit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TOTAL_MEMORY&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;cls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Nanny&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;env&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;s&quot;&gt;&quot;CUDA_VISIBLE_DEVICES&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cuda_visible_devices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;ii&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                    &lt;span class=&quot;s&quot;&gt;&quot;UCX_TLS&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;rc,cuda_copy,cuda_ipc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;interface&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;protocol&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;ucx&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;ncores&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;threads_per_worker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;data&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;preload&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;dask_cuda.initialize_context&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;dashboard_address&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;:0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;plugins&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CPUAffinity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;affinity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])],&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;silence_logs&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;silence_logs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;s&quot;&gt;&quot;memory_limit&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ii&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;cls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;interface&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;protocol&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;ucx&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;dashboard_address&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dashboard_address&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SpecCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;silence_logs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;silence_logs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, we never got the NVLink structure down. The Dask scheduler currently
still assumes uniform bandwidths between workers. We’ve started to make small
steps towards changing this, but we’re not there yet (this will be useful as
well for people that want to think about in-rack or cross-data-center
deployments).&lt;/p&gt;

&lt;p&gt;As usual, in solving a highly specific problem, we were able to solve a number
of lingering general features, which then made our specific problem easy to
write down.&lt;/p&gt;

&lt;h2 id=&quot;future-work&quot;&gt;Future Work&lt;/h2&gt;

&lt;p&gt;There has been significant effort over the last few months make everything
above work. In particular we …&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Modified UCX to support client-server workloads&lt;/li&gt;
  &lt;li&gt;Wrapped UCX with UCX-Py and design a Python async-await friendly interface&lt;/li&gt;
  &lt;li&gt;Wrapped UCX-Py with Dask&lt;/li&gt;
  &lt;li&gt;Hooked everything together to make generic workloads function well&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is quite nice, especially for more communication heavy workloads.
However there is still plenty to do. This section details what we’re thinking
about now to continue this work.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Routing within complex networks&lt;/strong&gt;:
If you restrict yourself to four of the eight GPUs in a DGX, you can get 5-12 GB/s
between pairs of GPUs. For some workloads this can be significant. It
makes the system feel much more like a single unit than a bunch of isolated
machines.&lt;/p&gt;

    &lt;p&gt;However we still can’t get great performance across the whole DGX because
there are many GPU-pairs that are not connected by NVLink, and so we get 10x
slower speeds. These dominate communication costs if you naively try to use
the full DGX.&lt;/p&gt;

    &lt;p&gt;This might be solved either by:&lt;/p&gt;

    &lt;ol&gt;
      &lt;li&gt;Teaching Dask to avoid these communications&lt;/li&gt;
      &lt;li&gt;Teaching UCX to route communications like these through a chain of
multiple NVLink connections&lt;/li&gt;
      &lt;li&gt;Avoiding complex networks altogether. Newer systems like the DGX-2 use
NVSwitch, which provides uniform connectivity, with each GPU connected
to every other GPU.&lt;/li&gt;
    &lt;/ol&gt;

    &lt;p&gt;&lt;em&gt;Edit&lt;/em&gt;: I’ve since learned that UCX should be able to handle this. We
should still get PCIe speeds (around 4-7 GB/s) even when we don’t have
NVLink once an upstream bug gets fixed. Hooray!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;CPU:&lt;/strong&gt; We can get 1-2 GB/s across InfiniBand, which isn’t bad, but also
wasn’t the full 5-8 GB/s that we were hoping for. This deserves more serious
profiling to determine what is going wrong. The current guess is that this
has to do with memory allocations.&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;0&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000000000&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 1 GB
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CPU&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;248&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;223&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;472&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Wall&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;470&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;----- Around 2 GB/s.  Slower than I expected
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Probably we’re just doing something dumb here.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Package UCX:&lt;/strong&gt; Currently I’m building the UCX and UCX-Py libraries from
source (see appendix below for instructions). Ideally these would become
conda packages. &lt;a href=&quot;https://github.com/jakirkham&quot;&gt;John Kirkham&lt;/a&gt; (Conda Forge,
NVIDIA, Dask) is taking a look at this along with the UCX developers from
Mellanox.&lt;/p&gt;

    &lt;p&gt;See &lt;a href=&quot;https://github.com/rapidsai/ucx-py/issues/65&quot;&gt;ucx-py #65&lt;/a&gt; for
more information.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Learn Heterogeneous Bandwidths:&lt;/strong&gt; In order to make good scheduling
decisions Dask needs to estimate how long it will take to move data between
machines. This question is now becoming much more complex, and depends on
both the source and destination machines (the network topology) the data
type (NumPy array, GPU array, Pandas Dataframe with text) and more. In
complex situations our bandwidths can span a 100x range (100 MB/s to 10
GB/s).&lt;/p&gt;

    &lt;p&gt;Dask will have to develop more complex models for bandwidth, and
learn these over time.&lt;/p&gt;

    &lt;p&gt;See &lt;a href=&quot;https://github.com/dask/distributed/issues/2743&quot;&gt;dask/distributed
#2743&lt;/a&gt; for more
information.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Support other GPU libraries:&lt;/strong&gt; To send GPU data around we need to teach
Dask how to serialize Python objects into GPU buffers. There is code in
the dask/distributed repository to do this for Numba, CuPy, and RAPIDS cuDF
objects, but we’ve really only tested CuPy seriously. We should expand
this by some of the following steps:&lt;/p&gt;

    &lt;ol&gt;
      &lt;li&gt;
        &lt;p&gt;Try a distributed Dask cuDF join computation&lt;/p&gt;

        &lt;p&gt;See &lt;a href=&quot;https://github.com/dask/distributed/pull/2746&quot;&gt;dask/distributed #2746&lt;/a&gt; for initial work here.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Teach Dask to serialize array GPU libraries, like PyTorch and
TensorFlow, or possibly anything that supports the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__cuda_array_interface__&lt;/code&gt; protocol.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Track down communication failures:&lt;/strong&gt; We still occasionally get
unexplained communication failures. We should stress test this system to
discover rough corners.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;TCP&lt;/strong&gt;: Groups with high performing TCP networks can’t yet make use of UCX+Dask (though they can use either one individually).&lt;/p&gt;

    &lt;p&gt;Currently using UCX in a client-server mode as we’re doing with
Dask requires access to RDMA libraries, which are often not found on systems
without networking systems like InfiniBand. This means that groups with
high performing TCP networks can’t make use of UCX+Dask.&lt;/p&gt;

    &lt;p&gt;This is in progress at &lt;a href=&quot;https://github.com/openucx/ucx/pull/3570&quot;&gt;openucx/ucx #3570&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Commodity Hardware&lt;/strong&gt;: Currently this code is only really useful on
high performance Linux systems that have InfiniBand or NVLink. However,
it would be nice to also use this on more commodity systems, including
personal laptop computers using TCP and shared memory.&lt;/p&gt;

    &lt;p&gt;Currently Dask uses TCP for inter-process communication on a single machine.
Using UCX on a personal computer would give us access to shared memory
speeds, which tend to be an order of magnitude faster.&lt;/p&gt;

    &lt;p&gt;See &lt;a href=&quot;https://github.com/openucx/ucx/issues/3663&quot;&gt;openucx/ucx #3663&lt;/a&gt; for more
information.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Tune Performance:&lt;/strong&gt; The 5-10 GB/s bandwidths that we see with NVLink
today are sub-optimal. With UCX-Py alone we’re able to get something like
15 GB/s on large message tranfers. We should benchmark and tune our
implementation to see what is taking up the extra time. Until things work
more robustly though, this is a secondary priority.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;appendix-setup&quot;&gt;Appendix: Setup&lt;/h2&gt;

&lt;p&gt;Performing these experiments depends currently on development branches in a few
repositories. This section includes my current setup.&lt;/p&gt;

&lt;h3 id=&quot;create-conda-environment&quot;&gt;Create Conda Environment&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda create -n ucx python=3.7 libtool cmake automake autoconf cython bokeh pytest pkg-config ipython dask numba -y
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note: for some reason using conda-forge makes the autogen step below fail.&lt;/p&gt;

&lt;h3 id=&quot;set-up-ucx&quot;&gt;Set up UCX&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Clone UCX repository and get branch
git clone https://github.com/openucx/ucx
cd ucx
git remote add Akshay-Venkatesh git@github.com:Akshay-Venkatesh/ucx.git
git remote update Akshay-Venkatesh
git checkout ucx-cuda

# Build
git clean -xfd
export CUDA_HOME=/usr/local/cuda-9.2/
./autogen.sh
mkdir build
cd build
../configure --prefix=$CONDA_PREFIX --enable-debug --with-cuda=$CUDA_HOME --enable-mt --disable-cma CPPFLAGS=&quot;-I//usr/local/cuda-9.2/include&quot;
make -j install

# Verify
ucx_info -d
which ucx_info  # verify that this is in the conda environment

# Verify that we see NVLink speeds
ucx_perftest -t tag_bw -m cuda -s 1048576 -n 1000 &amp;amp; ucx_perftest dgx15 -t tag_bw -m cuda -s 1048576 -n 1000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;set-up-ucx-py&quot;&gt;Set up UCX-Py&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone git@github.com:rapidsai/ucx-py
cd ucx-py

export UCX_PATH=$CONDA_PREFIX
make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;set-up-dask&quot;&gt;Set up Dask&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone git@github.com:dask/dask.git
cd dask
pip install -e .
cd ..
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git clone git@github.com:dask/distributed.git
cd distributed
pip install -e .
cd ..
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;optionally-set-up-cupy&quot;&gt;Optionally set up cupy&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install cupy-cuda92==6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;optionally-set-up-cudf&quot;&gt;Optionally set up cudf&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install -c rapidsai-nightly -c conda-forge -c numba cudf dask-cudf cudatoolkit=9.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;optionally-set-up-jupyterlab&quot;&gt;Optionally set up JupyterLab&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install ipykernel jupyterlab nb_conda_kernels nodejs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For the Dask dashboard&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask_labextension
jupyter labextension install dask-labextension
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;my-benchmark&quot;&gt;My Benchmark&lt;/h3&gt;

&lt;p&gt;I’ve been using the following benchmark to test communication. It allocates a
chunked Dask array, and then adds it to its transpose, which forces a lot of
communication, but not much computation.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;collections&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultdict&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;asyncio&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;time&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pprint&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pprint&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;distributed.utils&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;format_time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;format_bytes&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Set up workers on the local machine
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DGX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;asynchronous&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;silence_logs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;asynchronous&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# Create a simple random array
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;40000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;40000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;128 MiB&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;chunks&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# Add X to its transpose, forcing computation
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# Collect, aggregate, and print peer-to-peer bandwidths
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;incoming_logs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_worker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_worker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;incoming_transfer_log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;bandwidths&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultdict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;L&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;incoming_logs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;total&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1_000_000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;bandwidths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;who&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;bandwidth&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;bandwidths&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;w1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;w2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;format_bytes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;/s&apos;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;quantile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.75&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])]&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;w1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bandwidths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;pprint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bandwidths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;__main__&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;asyncio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_event_loop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run_until_complete&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: most of this example is just getting back diagnostics, which can be
easily ignored. Also, you can drop the async/await code if you like. I think
that there should probably be more examples in the world using Dask with
async/await syntax, so I decided to leave it in.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Composing Dask Array with Numba Stencils</title>
   <link href="https://blog.dask.org/2019/04/09/numba-stencil"/>
   <updated>2019-04-09T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/04/09/numba-stencil</id>
   
   <category>dask</category>
   
   <category>numba</category>
   
   <content type="html">
&lt;p&gt;In this post we explore four array computing technologies, and how they
work together to achieve powerful results.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Numba’s stencil decorator to craft localized compute kernels&lt;/li&gt;
  &lt;li&gt;Numba’s Just-In-Time (JIT) compiler for array computing in Python&lt;/li&gt;
  &lt;li&gt;Dask Array for parallelizing array computations across many chunks&lt;/li&gt;
  &lt;li&gt;NumPy’s Generalized Universal Functions (gufuncs) to tie everything
together&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the end we’ll show how a novice developer can write a small amount of Python
to efficiently compute localized computation on large amounts of data. In
particular we’ll write a simple function to smooth images and apply that in
parallel across a large stack of images.&lt;/p&gt;

&lt;p&gt;Here is the full code, we’ll dive into it piece by piece below.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numba&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stencil&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guvectorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:])],&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;(n, m) -&amp;gt; (n, m)&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;c1&quot;&gt;# If you want fake data
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;int8&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# If you have actual data
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/path/to/*.png&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# dask.array&amp;lt;transpose, shape=(1000000, 1000, 1000), dtype=int8, chunksize=(125, 1000, 1000)&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note: the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;smooth&lt;/code&gt; function above is more commonly referred to as the 2D mean filter in the image processing community.&lt;/p&gt;

&lt;p&gt;Now, lets break this down a bit&lt;/p&gt;

&lt;h2 id=&quot;numba-stencils&quot;&gt;Numba Stencils&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docs:&lt;/strong&gt;: https://numba.pydata.org/numba-doc/dev/user/stencil.html&lt;/p&gt;

&lt;p&gt;Many array computing functions operate only on a local region of the array.
This is common in image processing, signals processing, simulation, the
solution of differential equations, anomaly detection, time series analysis,
and more. Typically we write code that looks like the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;empty_like&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or something similar. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;numba.stencil&lt;/code&gt; decorator makes this a bit easier to
write down. You just write down what happens on every element, and Numba
handles the rest.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stencil&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;numba-jit&quot;&gt;Numba JIT&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docs:&lt;/strong&gt; http://numba.pydata.org/&lt;/p&gt;

&lt;p&gt;When we run this function on a NumPy array, we find that it is slow, operating
at Python speeds.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;timeit&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;527&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;±&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;44.1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;per&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;±&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But if we JIT compile this function with Numba, then it runs more quickly.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;njit&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timeit&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;mf&quot;&gt;70.8&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;µs&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;±&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;6.38&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;µs&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;per&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;±&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;of&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loop&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For those counting, that’s over 1000x faster!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: this function already exists as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scipy.ndimage.uniform_filter&lt;/code&gt;, which
operates at the same speed.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;dask-array&quot;&gt;Dask Array&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docs:&lt;/strong&gt; https://docs.dask.org/en/latest/array.html&lt;/p&gt;

&lt;p&gt;In these applications people often have many such arrays and they want to apply
this function over all of them. In principle they could do this with a for
loop.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;glob&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;glob&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;skimage.io&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;glob&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/path/to/*.png&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;skimage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;skimage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imsave&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;.png&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;.out.png&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If they wanted to then do this in parallel they would maybe use the
multiprocessing or concurrent.futures modules. If they wanted to do this
across a cluster then they could rewrite their code with PySpark or some other
system.&lt;/p&gt;

&lt;p&gt;Or, they could use Dask array, which will handle both the pipelining and the
parallelism (single machine or on a cluster) all while still looking mostly
like a NumPy array.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/path/to/*.png&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# a large lazy array of all of our images
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;int8&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And then because each of the chunks of a Dask array are just NumPy arrays, we
can use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt; function to apply this function across all of our
images, and then save them out.&lt;/p&gt;

&lt;p&gt;This is fine, but lets go a bit further, and discuss generalized universal
functions from NumPy.&lt;/p&gt;

&lt;h2 id=&quot;generalized-universal-functions&quot;&gt;Generalized Universal Functions&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Numba Docs:&lt;/strong&gt; https://numba.pydata.org/numba-doc/dev/user/vectorize.html&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NumPy Docs:&lt;/strong&gt; https://docs.scipy.org/doc/numpy-1.16.0/reference/c-api.generalized-ufuncs.html&lt;/p&gt;

&lt;p&gt;A generalized universal function (gufunc) is a normal function that has been
annotated with typing and dimension information. For example we can redefine
our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;smooth&lt;/code&gt; function as a gufunc as follows:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guvectorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:])],&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;(n, m) -&amp;gt; (n, m)&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This function knows that it consumes a 2d array of int8’s and produces a 2d
array of int8’s of the same dimensions.&lt;/p&gt;

&lt;p&gt;This sort of annotation is a small change, but it gives other systems like Dask
enough information to use it intelligently. Rather than call functions like
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map_blocks&lt;/code&gt;, we can just use the function directly, as if our Dask Array was
just a very large NumPy array.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Before gufuncs
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_blocks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;int8&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# After gufuncs
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is nice. If you write library code with gufunc semantics then that code
just works with systems like Dask, without you having to build in explicit
support for parallel computing. This makes the lives of users much easier.&lt;/p&gt;

&lt;h2 id=&quot;finished-result&quot;&gt;Finished result&lt;/h2&gt;

&lt;p&gt;Lets see the full example one more time.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numba&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stencil&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guvectorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:])],&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;(n, m) -&amp;gt; (n, m)&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;int8&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This code is decently approachable by novice users. They may not understand
the internal details of gufuncs or Dask arrays or JIT compilation, but they can
probably copy-paste-and-modify the example above to suit their needs.&lt;/p&gt;

&lt;p&gt;The parts that they do want to change are easy to change, like the stencil
computation, and creating an array of their own data.&lt;/p&gt;

&lt;p&gt;This workflow is efficient and scalable, using low-level compiled code and
potentially clusters of thousands of computers.&lt;/p&gt;

&lt;h2 id=&quot;what-could-be-better&quot;&gt;What could be better&lt;/h2&gt;

&lt;p&gt;There are a few things that could make this workflow nicer.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;It would be nice not to have to specify dtypes in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;guvectorize&lt;/code&gt;, but
instead specialize to types as they arrive.
&lt;a href=&quot;https://github.com/numba/numba/issues/2979&quot;&gt;numba/numba #2979&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Support GPU accelerators for the stencil computations using
&lt;a href=&quot;https://numba.pydata.org/numba-doc/dev/cuda/index.html&quot;&gt;numba.cuda.jit&lt;/a&gt;.
Stencil computations are obvious candidates for GPU acceleration, and this
is a good accessible point where novice users can specify what they want in
a way that is sufficiently constrained for automated systems to rewrite it
as CUDA somewhat easily.
&lt;a href=&quot;https://github.com/numba/numba/issues/3915&quot;&gt;numba/numba 3915&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It would have been nicer to be able to apply the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@guvectorize&lt;/code&gt; decorator
directly on top of the stencil function like this.&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guvectorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stencil&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Rather than have two functions.
&lt;a href=&quot;https://github.com/numba/numba/issues/3914&quot;&gt;numba/numba #3914&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You may have noticed that our guvectorize function had to assign its result into an
out parameter.&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guvectorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:])],&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&apos;(n, m) -&amp;gt; (n, m)&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;It would have been nicer, perhaps, to just return the output&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;a href=&quot;https://github.com/numba/numba/issues/3916&quot;&gt;numba/numba #3916&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The dask-image library could use a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;imsave&lt;/code&gt; function&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://github.com/dask/dask-image/issues/110&quot;&gt;dask/dask-image #110&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;aspirational-result&quot;&gt;Aspirational Result&lt;/h2&gt;

&lt;p&gt;With all of these, we might then be able to write the code above as follows&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# This is aspirational
&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numba&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_image&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;guvectorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:])],&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;signature&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;(n, m) -&amp;gt; (n, m)&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;gpu&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stencil&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;//&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imread&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;/path/to/*.png&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;smooth&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dask_image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;imsave&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;/path/to/out/*.png&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;update-now-with-gpus&quot;&gt;Update: Now with GPUs!&lt;/h2&gt;

&lt;p&gt;After writing this blogpost I did a small update where I used
&lt;a href=&quot;https://numba.pydata.org/numba-doc/dev/cuda/index.html&quot;&gt;numba.cuda.jit&lt;/a&gt;
to implement the same smooth function on a GPU to achieve a 200x speedup with
only a modest increase to code complexity.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/mrocklin/9272bf84a8faffdbbe2cd44b4bc4ce3c&quot;&gt;That notebook is here&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>cuML and Dask hyperparameter optimization</title>
   <link href="https://blog.dask.org/2019/03/27/dask-cuml"/>
   <updated>2019-03-27T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/03/27/dask-cuml</id>
   
   <category>dask</category>
   
   <category>GPU</category>
   
   <category>RAPIDS</category>
   
   <content type="html">
&lt;h3 id=&quot;setup&quot;&gt;Setup&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;DGX-1 Workstation&lt;/li&gt;
  &lt;li&gt;Host Memory: 512 GB&lt;/li&gt;
  &lt;li&gt;GPU Tesla V100 x 8&lt;/li&gt;
  &lt;li&gt;cudf 0.6&lt;/li&gt;
  &lt;li&gt;cuml 0.6&lt;/li&gt;
  &lt;li&gt;dask 1.1.4&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/quasiben/a96ce952b7eb54356f7f8390319473e4&quot;&gt;Jupyter notebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TLDR; Hyper-parameter Optimization is functional but slow with cuML&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;cuml-and-dask-hyper-parameter-optimization&quot;&gt;cuML and Dask Hyper-parameter Optimization&lt;/h2&gt;

&lt;p&gt;cuML is an open source GPU accelerated machine learning library primarily
developed at NVIDIA which mirrors the &lt;a href=&quot;https://scikit-learn.org/&quot;&gt;Scikit-Learn API&lt;/a&gt;.
The current suite of algorithms includes GLMs, Kalman Filtering, clustering,
and dimensionality reduction. Many of these machine learning algorithms use
hyper-parameters. These are parameters used during the model training process
but are not “learned” during the training. Often these parameters are
coefficients or penalty thresholds and finding the “best” hyper parameter can be
computationally costly. In the PyData community, we often reach to Scikit-Learn’s
&lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html&quot;&gt;GridSearchCV&lt;/a&gt;
or
&lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html#sklearn.model_selection.RandomizedSearchCV&quot;&gt;RandomizedSearchCV&lt;/a&gt;
for easy definition of the search space for hyper-parameters – this is called hyper-parameter
optimization. Within the Dask community, &lt;a href=&quot;https://dask-ml.readthedocs.io/en/latest/&quot;&gt;Dask-ML&lt;/a&gt; has incrementally improved the efficiency of hyper-parameter optimization by leveraging both Scikit-Learn and Dask to use multi-core and
distributed schedulers: &lt;a href=&quot;https://dask-ml.readthedocs.io/en/latest/hyper-parameter-search.html&quot;&gt;Grid and RandomizedSearch with DaskML&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With the newly created drop-in replacement for Scikit-Learn, cuML, we experimented with Dask’s GridSearchCV. In the upcoming 0.6 release of cuML, the estimators are serializable and are functional within the Scikit-Learn/dask-ml framework, but slow compared with Scikit-Learn estimators. And while speeds are slow now, we know how to boost performance, have filed several issues, and hope to show performance gains in future releases.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All code and timing measurements can be found in this &lt;a href=&quot;https://gist.github.com/quasiben/a96ce952b7eb54356f7f8390319473e4&quot;&gt;Jupyter notebook&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;fast-fitting&quot;&gt;Fast Fitting!&lt;/h2&gt;

&lt;p&gt;cuML is fast! But finding that speed requires developing a bit of GPU knowledge and some
intuition. For example, there is a non-zero cost of moving data from device to GPU and, when data is “small” there are little to no performance gains. “Small”, currently might mean less than 100MB.&lt;/p&gt;

&lt;p&gt;In the following example we use the &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html&quot;&gt;diabetes data&lt;/a&gt;
set provided by sklearn and linearly fit the data with &lt;a href=&quot;https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Ridge.html&quot;&gt;RidgeRegression&lt;/a&gt;&lt;/p&gt;

\[\min\limits_w ||y - Xw||^2_2 + alpha \* ||w||^2_2\]

&lt;p&gt;&lt;a href=&quot;https://scikit-learn.org/stable/auto_examples/linear_model/plot_ridge_path.html&quot;&gt;&lt;strong&gt;alpha&lt;/strong&gt;&lt;/a&gt; is the hyper-parameter and we initially set to 1.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cuml&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Ridge&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cumlRidge&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_ml.model_selection&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dcv&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;datasets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linear_model&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.externals.joblib&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parallel_backend&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.model_selection&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;train_test_split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GridSearchCV&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X_test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_test&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;train_test_split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;diabetes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;diabetes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;test_size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ridge&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linear_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Ridge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;cholesky&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cu_ridge&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cumlRidge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;eig&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ridge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cu_ridge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The above ran with a single timing measurement of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Scikit-Learn Ridge: 28 ms&lt;/li&gt;
  &lt;li&gt;cuML Ridge: 1.12 s&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the data is quite small, ~28KB. Increasing the size to ~2.8GB and re-running we see significant gains:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;dup_ridge&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linear_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Ridge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;cholesky&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dup_cu_ridge&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cumlRidge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;eig&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# move data from host to device
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;record_data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;fea%d&apos;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dup_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dup_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gdf_data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;record_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gdf_train&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;train&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dup_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;#sklearn
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dup_ridge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dup_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dup_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# cuml
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dup_cu_ridge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gdf_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gdf_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With new timing measurements of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Scikit-Learn Ridge: 4.82 s ± 694 ms&lt;/li&gt;
  &lt;li&gt;cuML Ridge: 450 ms ± 47.6 ms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With more data we clearly see faster fitting times, but the time to move data to the GPU (through CUDF)
was 19.7s. This cost of data movement is one of the reasons why RAPIDS/cuDF was developed – keep data
on the GPU and avoid having to move back and forth.&lt;/p&gt;

&lt;h2 id=&quot;hyper-parameter-optimization-experiments&quot;&gt;Hyper-Parameter Optimization Experiments&lt;/h2&gt;

&lt;p&gt;So moving to the GPU can be costly, but once there, with larger data sizes, we gain significant performance
optimizations. Naively, we thought, “well, we have GPU machine learning, we have distributed hyper-parameter optimization…
we &lt;em&gt;should&lt;/em&gt; have distributed, GPU-accelerated, hyper-parameter optimization!”&lt;/p&gt;

&lt;p&gt;Scikit-Learn assumes a specific, but well defined API for estimators over which it will perform hyper-parameter
optimization. Most estimators/classifiers in Scikit-Learn look like the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DummyEstimator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BaseEstimator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...):&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;predict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;score&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;get_params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;set_params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...):&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When we started experimenting with hyper-parameter optimization, we found a few API holes missing, these were
resolved, mostly handling matching argument structure and various getters/setters.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;get_params and set_params (&lt;a href=&quot;https://github.com/rapidsai/cuml/pull/271&quot;&gt;#271&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;fix/clf-solver (&lt;a href=&quot;https://github.com/rapidsai/cuml/pull/318&quot;&gt;#318&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;map fit_transform to sklearn implementation (&lt;a href=&quot;https://github.com/rapidsai/cuml/pull/330&quot;&gt;#330&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Fea get params small changes (&lt;a href=&quot;https://github.com/rapidsai/cuml/pull/322&quot;&gt;#322&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With holes plugged up we tested again. Using the same diabetes data set, we are now performing hyper-parameter optimization
and searching over many alpha parameters for the best &lt;em&gt;scoring&lt;/em&gt; alpha.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;alpha&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logspace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;clf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linear_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Ridge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;cholesky&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cu_clf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cumlRidge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;eig&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;grid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GridSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scoring&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;r2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cu_grid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GridSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cu_clf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scoring&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;r2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cu_grid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Again, reminding ourselves that the data is small ~28KB, we don’t expect to observe cuml performing faster than sklearn. Instead, we want to demonstrate functionality.&lt;/p&gt;

&lt;p&gt;Again, reminding ourselves that the data is small ~28KB, we don’t expect to observe cuml performing faster than Scikit-Learn. Instead, we
want to demonstrate functionality. Additionally, we also tried swapping out Dask-ML’s implementation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GridSearchCV&lt;/code&gt;
(which adheres to the same API as Scikit-Learn) to use all of the GPUs we have available in parallel.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;params&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;alpha&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;logspace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;clf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linear_model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Ridge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;cholesky&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cu_clf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cumlRidge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;alpha&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit_intercept&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normalize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;eig&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;grid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dcv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GridSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scoring&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;r2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cu_grid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dcv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GridSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cu_clf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scoring&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;r2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cu_grid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Timing Measurements:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;GridSearchCV&lt;/th&gt;
      &lt;th&gt;sklearn-Ridge&lt;/th&gt;
      &lt;th&gt;cuml-ridge&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Scikit-Learn&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;88.4 ms ± 6.11 ms&lt;/td&gt;
      &lt;td&gt;6.51 s ± 132 ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Dask-ML&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;873 ms ± 347 ms&lt;/td&gt;
      &lt;td&gt;740 ms ± 142 ms&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Unsurprisingly, we see that GridSearchCV and Ridge Regression from Scikit-Learn is the fastest in this context.
There is cost to distributing work and data, and as we previously mentioned, moving data from host to device.&lt;/p&gt;

&lt;h3 id=&quot;how-does-performance-scale-as-we-scale-data&quot;&gt;How does performance scale as we scale data?&lt;/h3&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;two_dup_data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vstack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1e2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;two_dup_train&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hstack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1e2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;three_dup_data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vstack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1e3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;three_dup_train&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hstack&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1e3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cu_grid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dcv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GridSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cu_clf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scoring&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;r2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cu_grid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;two_dup_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;two_dup_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cu_grid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dcv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GridSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cu_clf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scoring&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;r2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cu_grid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;three_dup_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;three_dup_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;grid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dcv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GridSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scoring&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;r2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;three_dup_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;three_dup_train&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Timing Measurements:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Data (MB)&lt;/th&gt;
      &lt;th&gt;cuML+Dask-ML&lt;/th&gt;
      &lt;th&gt;sklearn+Dask-ML&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2.8 MB&lt;/td&gt;
      &lt;td&gt;13.8s&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;28 MB&lt;/td&gt;
      &lt;td&gt;1min 17s&lt;/td&gt;
      &lt;td&gt;4.87 s&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;cuML + dask-ml (Distributed GridSearchCV) does significantly &lt;em&gt;worse&lt;/em&gt; as data sizes increase! Why? Primarily, two reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Non optimized movement of data between host and device compounded by N devices and the size of
the parameter space&lt;/li&gt;
  &lt;li&gt;Scoring methods are not implemented in with cuML&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Below is the Dask graph for the GridSearch&lt;/p&gt;

&lt;p&gt;
  &lt;a href=&quot;/images/cuml_grid.svg&quot;&gt;
    &lt;img src=&quot;/images/cuml_grid.svg&quot; width=&quot;90%&quot; /&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;There are 50 (cv=5 times 10 parameters for alpha) instances of chunking up our test data set and scoring performance. That means 50 times we are moving data back forth between host and device for fitting and 50 times for scoring. That’s not great, but it’s also very solvable – build scoring functions for GPUs!&lt;/p&gt;

&lt;h2 id=&quot;immediate-future-work&quot;&gt;Immediate Future Work&lt;/h2&gt;

&lt;p&gt;We know the problems, GH Issues have been filed, and we are working on these issues – come help!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Built In Scorers (&lt;a href=&quot;https://github.com/rapidsai/cuml/issues/242&quot;&gt;#242&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;DeviceNDArray as input data (&lt;a href=&quot;https://github.com/rapidsai/cuml/issues/369&quot;&gt;#369&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Communication with UCX (&lt;a href=&quot;https://github.com/dask/distributed/issues/2344&quot;&gt;#2344&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask and the __array_function__ protocol</title>
   <link href="https://blog.dask.org/2019/03/18/dask-nep18"/>
   <updated>2019-03-18T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/03/18/dask-nep18</id>
   
   <category>Dask</category>
   
   <category>Dask-GLM</category>
   
   <category>CuPy</category>
   
   <category>Sparse</category>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Dask is versatile for analytics parallelism, but there is still one issue to
leverage it to a broader spectrum: allowing it to transparently work with
&lt;a href=&quot;https://www.numpy.org/&quot;&gt;NumPy&lt;/a&gt;-like libraries. We have previously discussed
how to work with
&lt;a href=&quot;http://blog.dask.org/2019/01/03/dask-array-gpus-first-steps&quot;&gt;GPU Dask Arrays&lt;/a&gt;,
but limited to the scope of the array’s member methods sharing a NumPy-like
interface, for example the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.sum()&lt;/code&gt; method, thus, calling general functionality
from NumPy’s library wasn’t still possible. NumPy recently addressed this issue
in &lt;a href=&quot;https://www.numpy.org/neps/nep-0018-array-function-protocol.html&quot;&gt;NEP-18&lt;/a&gt;
with the introduction of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol. In short, the
protocol allows a NumPy function call to dispatch the appropriate NumPy-like
library implementation, depending on the array type given as input, thus
allowing Dask to remain agnostic of such libraries, internally calling just the
NumPy function, which automatically handles dispatching of the appropriate
library implementation, for example,
&lt;a href=&quot;https://cupy.chainer.org/&quot;&gt;CuPy&lt;/a&gt; or &lt;a href=&quot;https://sparse.pydata.org/&quot;&gt;Sparse&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To understand what’s the end goal of this change, consider the following
example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now consider we want to speedup the SVD computation of a Dask array and offload
that work to a CUDA-capable GPU, we ultimately want to simply replace the NumPy
array &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; by a CuPy array and let NumPy do its magic via
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol and dispatch the appropriate CuPy linear algebra
operations under the hood:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We could do the same for a Sparse array, or any other NumPy-like array that
supports the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol and the computation that we are
trying to perform. In the next section, we will take a look at potential
performance benefits that the protocol helps leveraging.&lt;/p&gt;

&lt;p&gt;Note that the features described in this post are still experimental, some
still under development and review. For a more detailed discussion on the
actual progress of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt;, please refer to the &lt;a href=&quot;#issues&quot;&gt;Issues section&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;

&lt;p&gt;Before going any further, assume the following hardware is utilized for all
performance results described in this entire post:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CPU: 6-core (12-threads) Intel Core i7-7800X @ 3.50GHz&lt;/li&gt;
  &lt;li&gt;Main memory: 16 GB&lt;/li&gt;
  &lt;li&gt;GPU: NVIDIA Quadro GV100&lt;/li&gt;
  &lt;li&gt;OpenBLAS 0.2.18&lt;/li&gt;
  &lt;li&gt;cuBLAS 9.2.174&lt;/li&gt;
  &lt;li&gt;cuSOLVER 9.2.148&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s now check an example to see potential performance benefits of the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol with Dask when using CuPy as a backend. Let’s
start by creating all the arrays that we will use for computing an SVD later.
Please note that my focus here is how Dask can leverage compute performance,
therefore I’m ignoring in this example the time spent on creating or copying
the arrays between CPU and GPU.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;dx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dy&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;asarray&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Seen above we have four arrays:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt;: a NumPy array in main memory;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt;: a CuPy array in GPU memory;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dx&lt;/code&gt;: a NumPy array wrapped in a Dask array;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dy&lt;/code&gt;: a &lt;em&gt;copy&lt;/em&gt; of a CuPy array wrapped in a Dask array; wrapping a CuPy
array in a Dask array as a view (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;asarray=True&lt;/code&gt;) is not supported yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;compute-svd-on-a-numpy-array&quot;&gt;Compute SVD on a NumPy array&lt;/h3&gt;

&lt;p&gt;We can then start by computing the SVD of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; using NumPy, thus, it’s
processed on CPU in a single thread:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The timing information I obtained after that looks like the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CPU times: user 3min 10s, sys: 347 ms, total: 3min 11s
Wall time: 3min 11s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Over 3 minutes seems a bit too slow, so now the question is: Can we do better,
and more importantly, without having to change our entire code?&lt;/p&gt;

&lt;p&gt;The answer to this question is: Yes, we can.&lt;/p&gt;

&lt;p&gt;Let’s look now at other results.&lt;/p&gt;

&lt;h3 id=&quot;compute-svd-on-the-numpy-array-wrapped-in-dask-array&quot;&gt;Compute SVD on the NumPy array wrapped in Dask array&lt;/h3&gt;

&lt;p&gt;First, of all, this is what you had to do &lt;em&gt;before&lt;/em&gt; the introduction of the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The code above might have been very prohibitive for several projects, since one
needs to call the proper library dispatcher in addition to passing the correct
array. In other words, one would need to find all NumPy calls in the code and
replace those by the correct library’s function call, depending on the input
array type. After &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt;, the same NumPy function can be
called, using the Dask array &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dx&lt;/code&gt; as input:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note: Dask defers computation of results until its consumption, therefore we
need to call the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.compute()&lt;/code&gt; function on result arrays to actually compute
them.&lt;/p&gt;

&lt;p&gt;Let’s now take a look at the timing information:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CPU times: user 1min 23s, sys: 460 ms, total: 1min 23s
Wall time: 1min 13s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, without changing any code, besides the wrapping of the NumPy array as a
Dask array, we can see a speedup of 2x. Not too bad. But let’s go back to our
previous question: Can we do better?&lt;/p&gt;

&lt;h3 id=&quot;compute-svd-on-the-cupy-array&quot;&gt;Compute SVD on the CuPy array&lt;/h3&gt;

&lt;p&gt;We can do the same as for the Dask array now and simply call NumPy’s SVD
function on the CuPy array &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The timing information we get now is the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CPU times: user 17.3 s, sys: 1.81 s, total: 19.1 s
Wall time: 19.1 s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We now see a 4-5x speedup with no change in internal calls whatsoever! This is
exactly the sort of benefit that we expect to leverage with the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol, speeding up existing code, for free!&lt;/p&gt;

&lt;p&gt;Let’s go back to our original question one last time: Can we do better?&lt;/p&gt;

&lt;h3 id=&quot;compute-svd-on-the-cupy-array-wrapped-in-dask-array&quot;&gt;Compute SVD on the CuPy array wrapped in Dask array&lt;/h3&gt;

&lt;p&gt;We can now take advantage of the benefits of Dask data chunk splitting &lt;em&gt;and&lt;/em&gt;
the CuPy GPU implementation, in an attempt to keep our GPU busy as much as
possible, this remains as simple as:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;svd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For which we get the following timing:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CPU times: user 8.97 s, sys: 653 ms, total: 9.62 s
Wall time: 9.45 s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Giving us another 2x speedup over the single-threaded CuPy SVD computing.&lt;/p&gt;

&lt;p&gt;To conclude, we started from over 3 minutes and are now down to under 10
seconds by simply dispatching the work on a different array.&lt;/p&gt;

&lt;h2 id=&quot;application&quot;&gt;Application&lt;/h2&gt;

&lt;p&gt;We will now talk a bit about potential applications of the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol. For this, we will discuss the
&lt;a href=&quot;https://dask-glm.readthedocs.io/&quot;&gt;Dask-GLM&lt;/a&gt; library, used for fitting
Generalized Linear Models on large datasets. It’s built on top of Dask and
offers an API compatible with &lt;a href=&quot;https://scikit-learn.org/&quot;&gt;scikit-learn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before the introduction of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol, we would need
to rewrite most of its internal implementation for each and every NumPy-like
library that we wished to use as a backend, therefore, we would need a
specialization of the implementation for Dask, another for CuPy and yet
another for Sparse. Now, thanks to all the functionality that these libraries
share through compatible interface, we don’t have to change the implementation
at all, we simply pass a different array type as input, as simple as that.&lt;/p&gt;

&lt;h3 id=&quot;example-with-scikit-learn&quot;&gt;Example with scikit-learn&lt;/h3&gt;

&lt;p&gt;To demonstrate the ability we acquired, let’s consider the following
scikit-learn example (based on the original example
&lt;a href=&quot;https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py&quot;&gt;here&lt;/a&gt;):&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.linear_model&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LinearRegression&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# x from 0 to N
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;40000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# y = a*x + b with noise
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# create a linear regression model
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;est&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LinearRegression&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can then fit the model,&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and obtain its time measurements:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CPU times: user 3.4 ms, sys: 0 ns, total: 3.4 ms
Wall time: 2.3 ms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can then use it for prediction on some test data,&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# predict y from the data
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_new&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linspace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;y_new&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;predict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;newaxis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And also check its time measurements:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;CPU&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;times&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.16&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;680&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;µs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.84&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Wall&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.58&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And finally plot the results:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# plot the results
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;figsize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scatter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;linewidth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y_new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;black&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_facecolor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.42&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_xlabel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;x&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_ylabel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;y&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;tight&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-nep18-linreg.png&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;example-with-dask-glm&quot;&gt;Example with Dask-GLM&lt;/h3&gt;

&lt;p&gt;The only thing we have to change from the code before is the first block, where
we import libraries and create arrays:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_glm.estimators&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LinearRegression&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# x from 0 to N
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;40000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# y = a*x + b with noise
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# create a linear regression model
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;est&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LinearRegression&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;lbfgs&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The rest of the code and also the plot look alike the previous scikit-learn
example, so we’re ommitting those here for brevity. Note also that we could
have called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LinearRegression()&lt;/code&gt; without any arguments, but for this example
we chose the
&lt;a href=&quot;https://docs.scipy.org/doc/scipy/reference/optimize.minimize-lbfgsb.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lbfgs&lt;/code&gt;&lt;/a&gt;
solver, that converges reasonably fast.&lt;/p&gt;

&lt;p&gt;We can also have a look at the timing results for fitting, followed by those
for predicting with Dask-GLM:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Fitting
CPU times: user 9.66 ms, sys: 116 µs, total: 9.78 ms
Wall time: 8.94 ms

# Predicting
CPU times: user 130 µs, sys: 327 µs, total: 457 µs
Wall time: 1.06 ms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If instead we want to use CuPy to compute, we have to change only 3 lines,
importing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cupy&lt;/code&gt; instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;numpy&lt;/code&gt;, and the two lines where we create the
random arrays, replacing them to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cupy.random&lt;/code&gt; insted of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;np.random&lt;/code&gt;. The
block should then look like this:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_glm.estimators&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LinearRegression&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;plt&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# x from 0 to N
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;N&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;40000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# y = a*x + b with noise
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.5&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# create a linear regression model
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;est&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LinearRegression&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;solver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;lbfgs&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the timing results we obtain in this scenario are:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Fitting
CPU times: user 151 ms, sys: 40.7 ms, total: 191 ms
Wall time: 190 ms

# Predicting
CPU times: user 1.91 ms, sys: 778 µs, total: 2.69 ms
Wall time: 1.37 ms
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For the simple example chosen for this post, scikit-learn outperforms Dask-GLM
using both NumPy and CuPy arrays. There may exist several reasons that
contribute to this, and while we didn’t dive deep into understanding the exact
reasons and their extent, we could cite some likely possibilities:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;scikit-learn may be using solvers that converge faster;&lt;/li&gt;
  &lt;li&gt;Dask-GLM is entirely built on top of Dask, while scikit-learn may be
heavily optimized internally;&lt;/li&gt;
  &lt;li&gt;Too many synchronization steps and data transfer could occur for small
datasets with CuPy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;performance-for-different-dask-glm-solvers&quot;&gt;Performance for different Dask-GLM solvers&lt;/h3&gt;

&lt;p&gt;To verify how Dask-GLM with NumPy arrays would compare with CuPy arrays, we
also did some logistic regression benchmarking of Dask-GLM solvers. The results
below were obtained from a training dataset with 10&lt;sup&gt;2&lt;/sup&gt;,
10&lt;sup&gt;3&lt;/sup&gt;, …, 10&lt;sup&gt;6&lt;/sup&gt; features of 100 dimensions, and matching
number of test features.&lt;/p&gt;

&lt;p&gt;Note: we are intentionally omitting results for Dask arrays, as we have
identified a &lt;a href=&quot;https://github.com/dask/dask-glm/issues/78&quot;&gt;potential bug&lt;/a&gt; that
causes Dask arrays not to converge.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-nep18-fitting.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;From the results observed in the graphs above we can see that CuPy can be one
order of magnitude faster than NumPy for fitting with any of the Dask-GLM
solvers. Please note also that both axis are given in logarithmic scale for
easier visualization.&lt;/p&gt;

&lt;p&gt;Another interesting effect that can be seen is how converging may take longer
for small number of samples. However, as we would normally hope for, compute
time required to converge scales linearly to the number of samples.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-nep18-prediction.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Prediction with CuPy, as seen above, can be proportionally much faster than
NumPy, staying mostly constant for all solvers, and around 3-4 orders of
magnitude faster.&lt;/p&gt;

&lt;h2 id=&quot;issues&quot;&gt;&lt;a name=&quot;issues&quot;&gt;&lt;/a&gt;Issues&lt;/h2&gt;

&lt;p&gt;In this section we describe the work that has been done and is still ongoing
since February, 2019, towards enabling the features described in previous
sections. If you are not interested in all the details, feel free to completely
skip this.&lt;/p&gt;

&lt;h3 id=&quot;fixed-issues&quot;&gt;Fixed Issues&lt;/h3&gt;

&lt;p&gt;Since early February, 2019, substantial progress has been made towards deeper
support of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol in the different projects,
this trend is still going on and will continue in March. Below we see a list
of issues that have been fixed or are in the process of review:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt; protocol dependencies fixed in
&lt;a href=&quot;https://github.com/cupy/cupy/issues/2029&quot;&gt;CuPy PR #2029&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Dask issues using CuPy backend with mean() and moment()
&lt;a href=&quot;https://github.com/dask/dask/issues/4481&quot;&gt;Dask Issue #4481&lt;/a&gt;, fixed in
&lt;a href=&quot;https://github.com/dask/dask/pull/4513&quot;&gt;Dask PR #4513&lt;/a&gt; and
&lt;a href=&quot;https://github.com/dask/dask/pull/4519&quot;&gt;Dask PR #4519&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Replace in SciPy the aliased NumPy functions that may not be available in
libraries like CuPy, fixed in
&lt;a href=&quot;https://github.com/scipy/scipy/pull/9888&quot;&gt;SciPy PR #9888&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Allow creation of arbitrary shaped arrays, using the input array as
reference for the new array to be created, under review in
&lt;a href=&quot;https://github.com/numpy/numpy/issues/13043&quot;&gt;NumPy PR #13043&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Multithreading with CuPy first identified in
&lt;a href=&quot;https://github.com/dask/dask/issues/4487&quot;&gt;Dask Issue #4487&lt;/a&gt;,
&lt;a href=&quot;https://github.com/cupy/cupy/issues/2045&quot;&gt;CuPy Issue #2045&lt;/a&gt; and
&lt;a href=&quot;https://github.com/cupy/cupy/issues/1109&quot;&gt;CuPy Issue #1109&lt;/a&gt;, now under
review in &lt;a href=&quot;https://github.com/cupy/cupy/pull/2053&quot;&gt;CuPy PR #2053&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Calling Dask’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;flatnonzero()&lt;/code&gt; on CuPy array missing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cupy.compress()&lt;/code&gt;,
first identified in
&lt;a href=&quot;https://github.com/dask/dask/issues/4497&quot;&gt;Dask Issue #4497&lt;/a&gt;, under review
in &lt;a href=&quot;https://github.com/dask/dask/pull/4548&quot;&gt;Dask PR #4548&lt;/a&gt;,&lt;/li&gt;
  &lt;li&gt;Dask support for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt;, under review in
&lt;a href=&quot;https://github.com/dask/dask/pull/4567&quot;&gt;Dask PR #4567&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;known-issues&quot;&gt;Known Issues&lt;/h3&gt;

&lt;p&gt;Currently, one of the biggest issues we are tackling relates to the
&lt;a href=&quot;https://github.com/dask/dask/issues/4490&quot;&gt;Dask issue #4490&lt;/a&gt; we first
identified when calling Dask’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;diag()&lt;/code&gt; on a CuPy array. This requires some
change on the Dask &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Array&lt;/code&gt; class, and subsequent changes throughout large
parts of the Dask codebase. I will not go into too much detail here, but the
way we are handling this issue is by adding a new attribute &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_meta&lt;/code&gt; to Dask
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Array&lt;/code&gt; in replacement of the simple &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dtype&lt;/code&gt; that currently exists. This
new attribute will not only hold the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dtype&lt;/code&gt; information, but also an empty
array of the backend type used to create the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Array&lt;/code&gt; in the first place, thus
allowing us to internally reconstruct arrays of the backend type, without
having to know explicitly whether it’s a NumPy, CuPy, Sparse or any other
NumPy-like array. For additional details, please refer to &lt;a href=&quot;https://github.com/dask/dask/issues/2977&quot;&gt;Dask Issue
#2977&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We have identified some more issues with ongoing discussions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Using Sparse as a Dask backend, discussed in
&lt;a href=&quot;https://github.com/dask/dask/issues/4523&quot;&gt;Dask Issue #4523&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Calling Dask’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fix()&lt;/code&gt; on CuPy array depends on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_wrap__&lt;/code&gt;,
discussed in &lt;a href=&quot;https://github.com/dask/dask/issues/4496&quot;&gt;Dask Issue #4496&lt;/a&gt;
and &lt;a href=&quot;https://github.com/cupy/cupy/issues/589&quot;&gt;CuPy Issue #589&lt;/a&gt;;&lt;/li&gt;
  &lt;li&gt;Allow coercing of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_function__&lt;/code&gt;, discussed in
&lt;a href=&quot;https://github.com/numpy/numpy/issues/12974&quot;&gt;NumPy Issue #12974&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;future-work&quot;&gt;Future Work&lt;/h2&gt;

&lt;p&gt;There are several possibilities for a richer experience with Dask, some of which
could be very interesting in the short and mid-term are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Use &lt;a href=&quot;https://github.com/rapidsai/dask-cudf&quot;&gt;Dask-cuDF&lt;/a&gt; alongside with
Dask-GLM to present interesting realistic applications of the whole
ecosystem;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;More comprehensive examples and benchmarks for Dask-GLM;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Support for &lt;a href=&quot;https://scikit-learn.org/stable/modules/linear_model.html&quot;&gt;more models in
Dask-GLM&lt;/a&gt;;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A deeper look into the Dask-GLM versus scikit-learn performance;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Profile CuPy’s performance of matrix-matrix multiplication operations
(GEMM), compare to matrix-vector multiplication operations (GEMV) for
distributed Dask operation.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Building GPU Groupby-Aggregations for Dask</title>
   <link href="https://blog.dask.org/2019/03/04/building-gpu-groupbys"/>
   <updated>2019-03-04T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/03/04/building-gpu-groupbys</id>
   
   <category>dataframe</category>
   
   <category>GPU</category>
   
   <category>RAPIDS</category>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;We’ve sufficiently aligned Dask DataFrame and cuDF to get groupby aggregations
like the following to work well.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;x&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This post describes the kind of work we had to do as a model for future
development.&lt;/p&gt;

&lt;h2 id=&quot;plan&quot;&gt;Plan&lt;/h2&gt;

&lt;p&gt;As outlined in a previous post, &lt;a href=&quot;../../../2019/01/13/dask-cudf-first-steps.html&quot;&gt;Dask, Pandas, and GPUs: first
steps&lt;/a&gt;, our plan to produce
distributed GPU dataframes was to combine &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe.html&quot;&gt;Dask
DataFrame&lt;/a&gt; with
&lt;a href=&quot;https://rapids.ai&quot;&gt;cudf&lt;/a&gt;. In particular, we had to&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;change Dask DataFrame so that it would parallelize not just around the
Pandas DataFrames that it works with today, but around anything that looked
enough like a Pandas DataFrame&lt;/li&gt;
  &lt;li&gt;change cuDF so that it would look enough like a Pandas DataFrame to fit
within the algorithms in Dask DataFrame&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;changes&quot;&gt;Changes&lt;/h2&gt;

&lt;p&gt;On the Dask side this mostly meant replacing&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Replacing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;isinstance(df, pd.DataFrame)&lt;/code&gt; checks with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_dataframe_like(df)&lt;/code&gt;
checks (after defining a suitable
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_dataframe_like&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_series_like&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;is_index_like&lt;/code&gt; functions&lt;/li&gt;
  &lt;li&gt;Avoiding some more exotic functionality in Pandas, and instead trying to
use more common functionality that we can expect to be in most DataFrame
implementations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the cuDF side this means making dozens of tiny changes to align the cuDF API
to the Pandas API, and to add in missing features.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Dask Changes:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/4359&quot;&gt;Remove explicit pandas checks and provide cudf lazy registration #4359&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/4375&quot;&gt;Replace isinstance(…, pandas) with is_dataframe_like #4375&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/4395&quot;&gt;Add has_parallel_type&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/4396&quot;&gt;Lazily register more cudf functions and move to backends file #4396&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/4418&quot;&gt;Avoid checking against types in is_dataframe_like #4418&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/4470&quot;&gt;Replace cudf-specific code with dask-cudf import #4470&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/4482&quot;&gt;Avoid groupby.agg(callable) in groupby-var #4482&lt;/a&gt; – this one is notable in that by simplifying our Pandas usage we actually got a significant speedup on the Pandas side.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;cuDF Changes:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/529&quot;&gt;Build DataFrames from CUDA array libraries #529&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/534&quot;&gt;Groupby AttributeError&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/556&quot;&gt;Support comparison operations on Indexes #556&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/568&quot;&gt;Support byte ranges in read_csv (and other formats) #568&lt;/a&gt;:w&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/824&quot;&gt;Allow “df.index = some_index” #824&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/828&quot;&gt;Support indexing on groupby objects #828&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/831&quot;&gt;Support df.reset_index(drop=True) #831&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/879&quot;&gt;Add Series.groupby #879&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/880&quot;&gt;Support Dataframe/Series groupby level=0 #880&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/900&quot;&gt;Implement division on DataFrame objects #900&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/934&quot;&gt;Groupby objects aren’t indexable by column names #934&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/937&quot;&gt;Support comparisons on index operations #937&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/944&quot;&gt;Add DataFrame.rename #944&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/967&quot;&gt;Set the index of a dataframe/series #967&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/968&quot;&gt;Support concat(…, axis=1) #968&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/969&quot;&gt;Support indexing with a pandas index from columns #969&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/970&quot;&gt;Support indexing a dataframe with another boolean dataframe #970&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don’t really expect anyone to go through all of those issues, but my hope is
that by skimming over the issue titles people will get a sense for the kinds of
changes we’re making here. It’s a large number of small things.&lt;/p&gt;

&lt;p&gt;Also, kudos to &lt;a href=&quot;https://github.com/thomcom&quot;&gt;Thomson Comer&lt;/a&gt; who solved most of
the cuDF issues above.&lt;/p&gt;

&lt;h2 id=&quot;there-are-still-some-pending-issues&quot;&gt;There are still some pending issues&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/1055&quot;&gt;Square Root #1055&lt;/a&gt;, needed for groupby-std&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/483&quot;&gt;cuDF needs multi-index support for columns #483&lt;/a&gt;, needed for:&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gropuby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;agg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;x&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;sum&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;], &apos;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;: [&apos;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;]})
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;but-things-mostly-work&quot;&gt;But things mostly work&lt;/h2&gt;

&lt;p&gt;But generally things work pretty well today:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cudf&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;yellow_tripdata_2016-*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;passenger_count&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;trip_distance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Series&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nrows&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;0.625424&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;4.976895&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;4.470014&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;5.955262&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;4.328076&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;3.079661&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;2.998077&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;3.147452&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;5.165570&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;5.916169&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;experience&quot;&gt;Experience&lt;/h2&gt;

&lt;p&gt;First, most of this work was handled by the cuDF developers (which may be
evident from the relative lengths of the issue lists above). When we started
this process it felt like a never-ending stream of tiny issues. We weren’t
able to see the next set of issues until we had finished the current set.
Fortunately, most of them were pretty easy to fix. Additionally, as we went
on, it seemed to get a bit easier over time.&lt;/p&gt;

&lt;p&gt;Additionally, lots of things work other than groupby-aggregations as a result
of the changes above. From the perspective of someone accustomed to Pandas,
The cuDF library is starting to feel more reliable. We hit missing
functionality less frequently when using cuDF on other operations.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;More recently we’ve been working on the various join/merge operations in Dask
DataFrame like indexed joins on a sorted column, joins between large and small
dataframes (a common special case) and so on. Getting these algorithms from
the mainline Dask DataFrame codebase to work with cuDF is resulting in a
similar set of issues to what we saw above with groupby-aggregations, but so
far the list is much smaller. We hope that this is a trend as we continue on
to other sets of functionality into the future like I/O, time-series
operations, rolling windows, and so on.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Running Dask and MPI programs together</title>
   <link href="https://blog.dask.org/2019/01/31/dask-mpi-experiment"/>
   <updated>2019-01-31T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/01/31/dask-mpi-experiment</id>
   
   <category>MPI</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;We present an experiment on how to pass data from a loosely coupled parallel
computing system like Dask to a tightly coupled parallel computing system like
MPI.&lt;/p&gt;

&lt;p&gt;We give motivation and a complete digestible example.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/mrocklin/193a9671f1536b9d13524214798da4a8&quot;&gt;Here is a gist of the code and results&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;motivation&quot;&gt;Motivation&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: Nothing in this post is polished or production ready. This is an
experiment designed to start conversation. No long-term support is offered.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We often get the following question:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;How do I use Dask to pre-process my data,
but then pass those results to a traditional MPI application?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You might want to do this because you’re supporting legacy code written
in MPI, or because your computation requires tightly coupled parallelism of the
sort that only MPI can deliver.&lt;/p&gt;

&lt;h2 id=&quot;first-solution-write-to-disk&quot;&gt;First solution: Write to disk&lt;/h2&gt;

&lt;p&gt;The simplest thing to do of course is to write your Dask results to disk and
then load them back from disk with MPI. Given the relative cost of your
computation to data loading, this might be a great choice.&lt;/p&gt;

&lt;p&gt;For the rest of this blogpost we’re going to assume that it’s not.&lt;/p&gt;

&lt;h2 id=&quot;second-solution&quot;&gt;Second solution&lt;/h2&gt;

&lt;p&gt;We have a trivial MPI library written in &lt;a href=&quot;https://mpi4py.readthedocs.io/en/stable/&quot;&gt;MPI4Py&lt;/a&gt;
where each rank just prints out all the data that it was given. In principle
though it could call into C++ code, and do arbitrary MPI things.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# my_mpi_lib.py
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;mpi4py&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MPI&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;comm&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MPI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;COMM_WORLD&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;print_data_and_rank&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot; Fake function that mocks out how an MPI function should operate

    -   It takes in a list of chunks of data that are present on this machine
    -   It does whatever it wants to with this data and MPI
        Here for simplicity we just print the data and print the rank
    -   Maybe it returns something
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;rank&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;comm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get_rank&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;on rank:&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rank&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In our dask program we’re going to use Dask normally to load in data, do some
preprocessing, and then hand off all of that data to each MPI rank, which will
call the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;print_data_and_rank&lt;/code&gt; function above to initialize the MPI
computation.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# my_dask_script.py
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Set up Dask workers from within an MPI job using the dask_mpi project
# See https://dask-mpi.readthedocs.io/en/latest/
&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_mpi&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;initialize&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;futures_of&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Use Dask Array to &quot;load&quot; data (actually just create random data here)
&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Find out where data is on each worker
# TODO: This could be improved on the Dask side to reduce boiler plate
&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;toolz&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;collections&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultdict&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;key_to_part_dict&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;part&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;part&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;part&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;futures_of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;who_has&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;who_has&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;worker_map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultdict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;who_has&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;worker_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key_to_part_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;


&lt;span class=&quot;c1&quot;&gt;# Call an MPI-enabled function on the list of data present on each worker
&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;my_mpi_lib&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;print_data_and_rank&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;futures&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print_data_and_rank&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;list_of_parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;list_of_parts&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;worker_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;futures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then we can call this mix of Dask and an MPI program using normal &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mpirun&lt;/code&gt; or
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mpiexec&lt;/code&gt; commands.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mpirun -np 5 python my_dask_script.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;what-just-happened&quot;&gt;What just happened&lt;/h2&gt;

&lt;p&gt;So MPI started up and ran our script.
The &lt;a href=&quot;https://dask-mpi.readthedocs.io/en/latest/&quot;&gt;dask-mpi&lt;/a&gt; project set a Dask
scheduler on rank 0, runs our client code on rank 1, and then runs a bunch of workers on ranks 2+.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Rank 0: Runs a Dask scheduler&lt;/li&gt;
  &lt;li&gt;Rank 1: Runs our script&lt;/li&gt;
  &lt;li&gt;Ranks 2+: Run Dask workers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our script then created a Dask array, though presumably here it would read in
data from some source, do more complex Dask manipulations before continuing on.&lt;/p&gt;

&lt;p&gt;We then wait until all of the Dask work has finished and is in a quiet state.
We then query the state in the scheduler to find out where all of that data
lives. That’s this code here:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Find out where data is on each worker
# TODO: This could be improved on the Dask side to reduce boiler plate
&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;toolz&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;collections&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultdict&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;key_to_part_dict&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;part&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;part&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;part&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;futures_of&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;who_has&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;who_has&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;worker_map&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;defaultdict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;who_has&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;worker_map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;first&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;workers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key_to_part_dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Admittedly, this code is gross, and not particularly friendly or obvious to
non-Dask experts (or even Dask experts themselves, I had to steal this from the
&lt;a href=&quot;http://ml.dask.org/xgboost.html&quot;&gt;Dask XGBoost project&lt;/a&gt;, which does
the same trick).&lt;/p&gt;

&lt;p&gt;But after that we just call our MPI library’s initialize function,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;print_data_and_rank&lt;/code&gt; on all of our data using Dask’s
&lt;a href=&quot;http://docs.dask.org/en/latest/futures.html&quot;&gt;Futures interface&lt;/a&gt;.
That function gets the data directly from local memory (the Dask workers and
MPI ranks are in the same process), and does whatever the MPI application
wants.&lt;/p&gt;

&lt;h2 id=&quot;future-work&quot;&gt;Future work&lt;/h2&gt;

&lt;p&gt;This could be improved in a few ways:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The “gross” code referred to above could probably be placed into some
library code to make this pattern easier for people to use.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Ideally the Dask part of the computation wouldn’t also have to be managed
by MPI, but could maybe start up MPI on its own.&lt;/p&gt;

    &lt;p&gt;You could imagine Dask running on something like Kubernetes doing highly
dynamic work, scaling up and down as necessary. Then it would get to a
point where it needed to run some MPI code so it would, itself, start up
MPI on its worker processes and run the MPI application on its data.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We haven’t really said anything about resilience here. My guess is that
this isn’t hard to do (Dask has plenty of mechanisms to build complex
inter-task relationships) but I didn’t solve it above.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/mrocklin/193a9671f1536b9d13524214798da4a8&quot;&gt;Here is a gist of the code and results&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Single-Node Multi-GPU Dataframe Joins</title>
   <link href="https://blog.dask.org/2019/01/29/cudf-joins"/>
   <updated>2019-01-29T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/01/29/cudf-joins</id>
   
   <category>dataframe</category>
   
   <category>GPU</category>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;We experiment with single-node multi-GPU joins using cuDF and Dask. We find
that the in-GPU computation is faster than communication. We also present
context and plans for near-future work, including improving high performance
communication in Dask with UCX.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/mrocklin/6e2c33c33b32bc324e3965212f202f66&quot;&gt;Here is a notebook of the experiment in this post&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;In a recent post we showed how Dask + cuDF could accelerate reading CSV files
using multiple GPUs in parallel. That operation quickly became bound by the
speed of our disk after we added a few GPUs. Now we try a very different kind
of operation, multi-GPU joins.&lt;/p&gt;

&lt;p&gt;This workload can be communication-heavy, especially if the column on which we
are joining is not sorted nicely, and so provides a good example on the other
extreme from parsing CSV.&lt;/p&gt;

&lt;h2 id=&quot;benchmark&quot;&gt;Benchmark&lt;/h2&gt;

&lt;h3 id=&quot;construct-random-data-using-the-cpu&quot;&gt;Construct random data using the CPU&lt;/h3&gt;

&lt;p&gt;Here we use Dask array and Dask dataframe to construct two random tables with a
shared &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt; column. We can play with the number of rows of each table and the
number of keys to make the join challenging in a variety of ways.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;n_rows&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000000000&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;n_keys&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5000000&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_rows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_dask_dataframe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;x&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_rows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_dask_dataframe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;n_rows&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10000000&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;right&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_rows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_dask_dataframe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;y&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_rows&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_dask_dataframe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;send-to-the-gpus&quot;&gt;Send to the GPUs&lt;/h3&gt;

&lt;p&gt;We have two Dask dataframes composed of many Pandas dataframes of our random
data. We now map the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cudf.from_pandas&lt;/code&gt; function across these to make a Dask
dataframe of cuDF dataframes.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cudf&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gleft&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_partitions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gright&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_partitions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gleft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gright&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gleft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gright&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# persist data in device memory
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What’s nice here is that there wasn’t any special
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask_pandas_dataframe_to_dask_cudf_dataframe&lt;/code&gt; function. Dask composed nicely
with cuDF. We didn’t need to do anything special to support it.&lt;/p&gt;

&lt;p&gt;We’ll also persisted the data in device memory.&lt;/p&gt;

&lt;p&gt;After this, simple operations are easy and fast and use our eight GPUs.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gleft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# this takes 250ms
&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;500004719.254711&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;join&quot;&gt;Join&lt;/h3&gt;

&lt;p&gt;We’ll use standard Pandas syntax to merge the datasets, persist the result in
RAM, and then wait&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;out&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gleft&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gright&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# this is lazy
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;profile-and-analyze-results&quot;&gt;Profile and analyze results&lt;/h2&gt;

&lt;p&gt;We now look at the Dask diagnostic plots for this computation.&lt;/p&gt;

&lt;h3 id=&quot;task-stream-and-communication&quot;&gt;Task stream and communication&lt;/h3&gt;

&lt;p&gt;When we look at Dask’s task stream plot we see that each of our eight threads
(each of which manages a single GPU) spent most of its time in communication
(red is communication time). The actual merge and concat tasks are quite fast
relative to the data transfer time.&lt;/p&gt;

&lt;iframe src=&quot;https://matthewrocklin.com/raw-host/dask-cudf-joins.html&quot; width=&quot;800&quot; height=&quot;400&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;That’s not too surprising. For this computation I’ve turned off any attempt to
communicate between devices (more on this below) so the data is being moved
from the GPU to the CPU memory, then serialized and put onto a TCP socket.
We’re moving tens of GB on a single machine, so we’re seeing about 1GB/s total
throughput of the system, which is typical for TCP-on-localhost in Python.&lt;/p&gt;

&lt;h3 id=&quot;flamegraph-of-computation&quot;&gt;Flamegraph of computation&lt;/h3&gt;

&lt;p&gt;We can also look more deeply at the computational costs in Dask’s
flamegraph-style plot. This shows which lines of our functions were taking up
the most time (down to the Python level at least).&lt;/p&gt;

&lt;iframe src=&quot;http://matthewrocklin.com/raw-host/dask-cudf-join-profile.html&quot; width=&quot;800&quot; height=&quot;400&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;This &lt;a href=&quot;http://www.brendangregg.com/flamegraphs.html&quot;&gt;Flame graph&lt;/a&gt; shows which
lines of cudf code we spent time on while computing (excluding the main
communication costs mentioned above). It may be interesting for those trying
to further optimize performance. It shows that most of our costs are in memory
allocation. Like communication, this has actually also been fixed in RAPIDS’
optional memory management pool, it just isn’t default yet, so I didn’t use it
here.&lt;/p&gt;

&lt;h2 id=&quot;plans-for-efficient-communication&quot;&gt;Plans for efficient communication&lt;/h2&gt;

&lt;p&gt;The cuDF library actually has a decent approach to single-node multi-GPU
communication that I’ve intentionally turned off for this experiment. That
approach cleverly used Dask to communicate device pointer information using
Dask’s normal channels (this is small and fast) and then used that information
to initiate a side-channel communication for the bulk of the data. This
approach was effective, but somewhat fragile. I’m inclined to move on for it
in favor of …&lt;/p&gt;

&lt;p&gt;UCX. The &lt;a href=&quot;http://www.openucx.org/&quot;&gt;UCX&lt;/a&gt; project provides a single API that
wraps around several transports like TCP, Infiniband, shared memory, and also
GPU-specific transports. UCX claims to find the best way to communicate data
between two points given the hardware available. If Dask were able to use this
for communication then it would provide both efficient GPU-to-GPU communication
on a single machine, and also efficient inter-machine communication when
efficient networking hardware like Infiniband was present, even outside the
context of GPUs.&lt;/p&gt;

&lt;p&gt;There is some work we need to do here:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We need to make a Python wrapper around UCX&lt;/li&gt;
  &lt;li&gt;We need to make an optional &lt;a href=&quot;https://distributed.dask.org/en/latest/communications.html&quot;&gt;Dask Comm&lt;/a&gt;
around this ucx-py library that allows users to specify endpoints like
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ucx://path-to-scheduler&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;We need to make Python memoryview-like objects that refer to device memory&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This work is already in progress by &lt;a href=&quot;https://github.com/Akshay-Venkatesh&quot;&gt;Akshay
Vekatesh&lt;/a&gt;, who works on UCX, and &lt;a href=&quot;https://tomaugspurger.github.io/&quot;&gt;Tom
Augspurger&lt;/a&gt; a core Dask/Pandas developer. I
suspect that they’ll write about it soon. I’m looking forward to seeing what
comes of it, both for Dask and for high performance Python generally.&lt;/p&gt;

&lt;p&gt;It’s worth pointing out that this effort won’t just help GPU users. It should
help anyone on advanced networking hardware, including the mainstream
scientific HPC community.&lt;/p&gt;

&lt;h2 id=&quot;summary-1&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Single-node Mutli-GPU joins have a lot of promise. In fact, earlier RAPIDS
developers got this running much faster than I was able to do above through the
clever communication tricks I briefly mentioned. The main purpose of this post
is to provide a benchmark for joins that we can use in the future, and to
highlight when communication can be essential in parallel computing.&lt;/p&gt;

&lt;p&gt;Now that GPUs have accelerated the computation time of each of our chunks of
work we increasingly find that other systems become the bottleneck. We didn’t
care as much about communication before because computational costs were
comparable. Now that computation is an order of magnitude cheaper, other
aspects of our stack become much more important.&lt;/p&gt;

&lt;p&gt;I’m looking forward to seeing where this goes.&lt;/p&gt;

&lt;h3 id=&quot;come-help&quot;&gt;Come help!&lt;/h3&gt;

&lt;p&gt;If the work above sounds interesting to you then come help!
There is a lot of low-hanging and high impact work to do.&lt;/p&gt;

&lt;p&gt;If you’re interested in being paid to focus more on these topics, then consider
applying for a job. NVIDIA’s RAPIDS team is looking to hire engineers for Dask
development with GPUs and other data analytics library development projects.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/US-TX-Austin/Senior-Library-Software-Engineer---RAPIDS_JR1919608-1&quot;&gt;Senior Library Software Engineer - RAPIDS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Release 1.1.0</title>
   <link href="https://blog.dask.org/2019/01/23/dask-1.1.0"/>
   <updated>2019-01-23T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/01/23/dask-1.1.0</id>
   
   <category>release</category>
   
   <content type="html">
&lt;p&gt;I’m pleased to announce the release of Dask version 1.1.0. This is a major
release with bug fixes and new features. The last release was 1.0.0 on
2018-11-29.
This blogpost outlines notable changes since the last release.&lt;/p&gt;

&lt;p&gt;You can conda install Dask:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install dask
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or pip install from PyPI:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask[complete] --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Full changelogs are available here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;notable-changes&quot;&gt;Notable Changes&lt;/h2&gt;

&lt;p&gt;A lot of work has happened over the last couple months, and we encourage people
to look through the changelog to get a sense of the kinds of incremental
changes that developers are working on.&lt;/p&gt;

&lt;p&gt;There are also a few notable changes in this release that we’ll highlight here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Support for the recent Numpy 1.16 and Pandas 0.24 releases&lt;/li&gt;
  &lt;li&gt;Support for Pandas Extension Arrays (see &lt;a href=&quot;../../../2019/01/22/dask-extension-arrays&quot;&gt;Tom Augspurger’s post on the topic&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;High level graph in Dask dataframe and operator fusion in simple cases&lt;/li&gt;
  &lt;li&gt;Increased support for other libraries that look enough like Numpy and Pandas
to work within Dask Array/Dataframe&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;support-for-numpy-116-and-pandas-024&quot;&gt;Support for Numpy 1.16 and Pandas 0.24&lt;/h2&gt;

&lt;p&gt;Both Numpy and Pandas have been evolving quickly over the last few months.
We’re excited about the changes to extensibility arriving in both libraries.
The Dask array/dataframe submodules have been updated to work well with these
recent changes.&lt;/p&gt;

&lt;h2 id=&quot;pandas-extension-arrays&quot;&gt;Pandas Extension Arrays&lt;/h2&gt;

&lt;p&gt;In particular Dask Dataframe supports Pandas Extension arrays,
meaning that it’s easier to use third party Pandas packages like CyberPandas or
Fletcher in parallel with Dask Dataframe.&lt;/p&gt;

&lt;p&gt;For more information see &lt;a href=&quot;../../../2019/01/22/dask-extension-arrays&quot;&gt;Tom Augspurger’s post&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;high-level-graphs-in-dask-dataframe&quot;&gt;High Level Graphs in Dask Dataframe&lt;/h2&gt;

&lt;p&gt;For a while Dask array has had some high level graphs for “atop” operations
(elementwise, broadcasting, transpose, tensordot, reductions), which allow for
reduced overhead and task fusion on computations within this class.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# These operations get fused to a single task
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We’ve renamed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;atop&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;blockwise&lt;/code&gt; to be a bit more generic, and have also
started applying it to Dask Dataframe, which helps to reduce overhead
substantially when doing computations with many simple operations.&lt;/p&gt;

&lt;p&gt;This still needs to be improved to increase the class of cases where it works,
but we’re already seeing nice speedups on previously unseen workloads.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;da.atop&lt;/code&gt; function has been deprecated in favor of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;da.blockwise&lt;/code&gt;. There
is now also a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dd.blockwise&lt;/code&gt; which shares a common code path.&lt;/p&gt;

&lt;h2 id=&quot;non-pandas-dataframe-and-non-numpy-array-types&quot;&gt;Non-Pandas dataframe and Non-Numpy array types&lt;/h2&gt;

&lt;p&gt;We’re working to make Dask a bit more agnostic to the types of in-memory array
and dataframe objects that it can manipulate. Rather than having Dask Array be
a grid of Numpy arrays and Dask Dataframe be a sequence of Pandas dataframes,
we’re relaxing that constraint to a grid of &lt;em&gt;Numpy-like&lt;/em&gt; arrays and a sequence
of &lt;em&gt;Pandas-like&lt;/em&gt; dataframes.&lt;/p&gt;

&lt;p&gt;This is an ongoing effort that has targetted alternate backends like
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scipy.sparse&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pydata/sparse&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cupy&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cudf&lt;/code&gt; and other systems.&lt;/p&gt;

&lt;p&gt;There were some recent posts on
&lt;a href=&quot;../../../2019/01/03/dask-array-gpus-first-steps&quot;&gt;arrays&lt;/a&gt; and
&lt;a href=&quot;../../../2019/01/13/dask-cudf-first-steps&quot;&gt;dataframes&lt;/a&gt; that show proofs of
concept for this with GPUs.&lt;/p&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;There have been several releases since the last time we had a release blogpost.
The following people contributed to the dask/dask repository since the 0.19.0
release on September 5th:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Anderson Banihirwe&lt;/li&gt;
  &lt;li&gt;Antonino Ingargiola&lt;/li&gt;
  &lt;li&gt;Armin Berres&lt;/li&gt;
  &lt;li&gt;Bart Broere&lt;/li&gt;
  &lt;li&gt;Carlos Valiente&lt;/li&gt;
  &lt;li&gt;Daniel Li&lt;/li&gt;
  &lt;li&gt;Daniel Saxton&lt;/li&gt;
  &lt;li&gt;David Hoese&lt;/li&gt;
  &lt;li&gt;Diane Trout&lt;/li&gt;
  &lt;li&gt;Damien Garaud&lt;/li&gt;
  &lt;li&gt;Elliott Sales de Andrade&lt;/li&gt;
  &lt;li&gt;Eric Wolak&lt;/li&gt;
  &lt;li&gt;Gábor Lipták&lt;/li&gt;
  &lt;li&gt;Guido Imperiale&lt;/li&gt;
  &lt;li&gt;Guillaume Eynard-Bontemps&lt;/li&gt;
  &lt;li&gt;Itamar Turner-Trauring&lt;/li&gt;
  &lt;li&gt;James Bourbeau&lt;/li&gt;
  &lt;li&gt;Jan Koch&lt;/li&gt;
  &lt;li&gt;Javad&lt;/li&gt;
  &lt;li&gt;Jendrik Jördening&lt;/li&gt;
  &lt;li&gt;Jim Crist&lt;/li&gt;
  &lt;li&gt;Jonathan Fraine&lt;/li&gt;
  &lt;li&gt;John Kirkham&lt;/li&gt;
  &lt;li&gt;Johnnie Gray&lt;/li&gt;
  &lt;li&gt;Julia Signell&lt;/li&gt;
  &lt;li&gt;Justin Dennison&lt;/li&gt;
  &lt;li&gt;M. Farrajota&lt;/li&gt;
  &lt;li&gt;Marco Neumann&lt;/li&gt;
  &lt;li&gt;Mark Harfouche&lt;/li&gt;
  &lt;li&gt;Markus Gonser&lt;/li&gt;
  &lt;li&gt;Martin Durant&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Matthias Bussonnier&lt;/li&gt;
  &lt;li&gt;Mina Farid&lt;/li&gt;
  &lt;li&gt;Paul Vecchio&lt;/li&gt;
  &lt;li&gt;Prabakaran Kumaresshan&lt;/li&gt;
  &lt;li&gt;Rahul Vaidya&lt;/li&gt;
  &lt;li&gt;Stephan Hoyer&lt;/li&gt;
  &lt;li&gt;Stuart Berg&lt;/li&gt;
  &lt;li&gt;TakaakiFuruse&lt;/li&gt;
  &lt;li&gt;Takahiro Kojima&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Yu Feng&lt;/li&gt;
  &lt;li&gt;Zhenqing Li&lt;/li&gt;
  &lt;li&gt;@milesial&lt;/li&gt;
  &lt;li&gt;@samc0de&lt;/li&gt;
  &lt;li&gt;@slnguyen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following people contributed to the dask/distributed repository since the 0.19.0
release on September 5th:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Adam Klein&lt;/li&gt;
  &lt;li&gt;Brett Naul&lt;/li&gt;
  &lt;li&gt;Daniel Farrell&lt;/li&gt;
  &lt;li&gt;Diane Trout&lt;/li&gt;
  &lt;li&gt;Dirk Petersen&lt;/li&gt;
  &lt;li&gt;Eric Ma&lt;/li&gt;
  &lt;li&gt;Jim Crist&lt;/li&gt;
  &lt;li&gt;John Kirkham&lt;/li&gt;
  &lt;li&gt;Gaurav Sheni&lt;/li&gt;
  &lt;li&gt;Guillaume Eynard-Bontemps&lt;/li&gt;
  &lt;li&gt;Loïc Estève&lt;/li&gt;
  &lt;li&gt;Marius van Niekerk&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Michael Wheeler&lt;/li&gt;
  &lt;li&gt;MikeG&lt;/li&gt;
  &lt;li&gt;NotSqrt&lt;/li&gt;
  &lt;li&gt;Peter Killick&lt;/li&gt;
  &lt;li&gt;Roy Wedge&lt;/li&gt;
  &lt;li&gt;Russ Bubley&lt;/li&gt;
  &lt;li&gt;Stephan Hoyer&lt;/li&gt;
  &lt;li&gt;@tjb900&lt;/li&gt;
  &lt;li&gt;Tom Rochette&lt;/li&gt;
  &lt;li&gt;@fjetter&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Extension Arrays in Dask DataFrame</title>
   <link href="https://blog.dask.org/2019/01/22/dask-extension-arrays"/>
   <updated>2019-01-22T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/01/22/dask-extension-arrays</id>
   
   <category>dask</category>
   
   <category>dataframe</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Dask DataFrame works well with pandas’ new Extension Array interface, including
third-party extension arrays. This lets Dask&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;easily support pandas’ new extension arrays, like their new &lt;a href=&quot;http://pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support&quot;&gt;nullable integer
array&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;support third-party extension array arrays, like &lt;a href=&quot;https://cyberpandas.readthedocs.io&quot;&gt;cyberpandas’s&lt;/a&gt;
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IPArray&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;

&lt;p&gt;Pandas 0.23 introduced the &lt;a href=&quot;http://pandas.pydata.org/pandas-docs/version/0.24/extending.html#extension-types&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExtensionArray&lt;/code&gt;&lt;/a&gt;, a way to store things other
than a simple NumPy array in a DataFrame or Series. Internally pandas uses this
for data types that aren’t handled natively by NumPy like datetimes with
timezones, Categorical, or (the new!) nullable integer arrays.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Series&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;date_range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;2000&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;periods&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tz&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;US/Central&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;02&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;03&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;01&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;04&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;06&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;00&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;datetime64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;US&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.dataframe&lt;/code&gt; has always supported the extension types that pandas defines.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Series&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Structure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;datetime64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;US&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;                           &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;                           &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;datetime64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;US&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Central&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;the-challenge&quot;&gt;The Challenge&lt;/h2&gt;

&lt;p&gt;Newer versions of pandas allow third-party libraries to write custom extension
arrays. These arrays can be placed inside a DataFrame or Series, and work
just as well as any extension array defined within pandas itself. However,
third-party extension arrays provide a slight challenge for Dask.&lt;/p&gt;

&lt;p&gt;Recall: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.dataframe&lt;/code&gt; is lazy. We use a familiar pandas-like API to build up
a task graph, rather than executing immediately. But if Dask DataFrame is lazy,
then how do things like the following work?&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;A&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;B&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]})&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;B&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;columns&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;B&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;object&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ddf[[&apos;B&apos;]]&lt;/code&gt; (lazily) selects the column &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;B&apos;&lt;/code&gt; from the dataframe. But accessing
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.columns&lt;/code&gt; &lt;em&gt;immediately&lt;/em&gt; returns a pandas Index object with just the selected
columns.&lt;/p&gt;

&lt;p&gt;No real computation has happened (you could just as easily swap out the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from_pandas&lt;/code&gt; for a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dd.read_parquet&lt;/code&gt; on a larger-than-memory dataset, and the
behavior would be the same). Dask is able to do these kinds of “metadata-only”
computations, where the output depends only on the columns and the dtypes,
without executing the task graph. Internally, Dask does this by keeping a pair
of dummy pandas DataFrames on each Dask DataFrame.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_meta&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Empty&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Columns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_meta_nonempty&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_meta_nonempty&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We need the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_meta_nonempty&lt;/code&gt;, since some operations in pandas behave differently
on an Empty DataFrame than on a non-empty one (either by design or,
occasionally, a bug in pandas).&lt;/p&gt;

&lt;p&gt;The issue with third-party extension arrays is that Dask doesn’t know what
values to put in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_meta_nonempty&lt;/code&gt;. We’re quite happy to do it for each NumPy
dtype and each of pandas’ own extension dtypes. But any third-party library
could create an ExtensionArray for any type, and Dask would have no way of
knowing what’s a valid value for it.&lt;/p&gt;

&lt;h2 id=&quot;the-solution&quot;&gt;The Solution&lt;/h2&gt;

&lt;p&gt;Rather than Dask guessing what values to use for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_meta_nonempty&lt;/code&gt;, extension
array authors (or users) can register their extension dtype with Dask. Once
registered, Dask will be able to generate the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_meta_nonempty&lt;/code&gt;, and things
should work fine from there. For example, we can register the dummy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DecimalArray&lt;/code&gt;
that pandas uses for testing (this isn’t part of pandas’ public API) with Dask.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;decimal&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas.tests.extension.decimal&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DecimalArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DecimalDtype&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# The actual registration that would be done in the 3rd-party library
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe.extensions&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_array_nonempty&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_array_nonempty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DecimalDtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DecimalArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_from_sequence&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;NaN&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)],&lt;/span&gt;
                                       &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now users of that extension type can place those arrays inside a Dask DataFrame
or Series.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;A&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DecimalArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;1.0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;2.0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;                                       &lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;3.0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])})&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Structure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                     &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;              &lt;span class=&quot;n&quot;&gt;decimal&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;                  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Dask&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtypes&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;decimal&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;object&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And from there, the usual operations just as they would in pandas.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;random&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;choices&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;A&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DecimalArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;choices&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;1.0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;                                               &lt;span class=&quot;n&quot;&gt;Decimal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;2.0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;                                              &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;                    &lt;span class=&quot;s&quot;&gt;&quot;B&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;choice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,))})&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;35&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ddf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;A&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;35&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;
&lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;1.50&lt;/span&gt;
&lt;span class=&quot;mf&quot;&gt;2.0&lt;/span&gt;    &lt;span class=&quot;mf&quot;&gt;1.48&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;the-real-lesson&quot;&gt;The Real Lesson&lt;/h2&gt;

&lt;p&gt;It’s neat that Dask now supports extension arrays. But to me, the exciting thing
is just how little work this took. The
&lt;a href=&quot;https://github.com/dask/dask/pull/4379/files&quot;&gt;PR&lt;/a&gt; implementing support for
third-party extension arrays is quite short, just defining the object that
third-parties register with, and using it to generate the data when dtype is
detected. Supporting the three new extension arrays in pandas 0.24.0
(&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IntegerArray&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PeriodArray&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IntervalArray&lt;/code&gt;), takes a handful of lines
of code&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_array_nonempty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Interval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IntervalArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_breaks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;closed&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;closed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_array_nonempty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Period&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;period_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;freq&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;freq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_array_nonempty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_IntegerDtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;integer_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dask benefits directly from improvements made to pandas. Dask didn’t have to
build out a new parallel extension array interface, and reimplement all the new
extension arrays using the parallel interface. We just re-used what pandas
already did, and it fits into the existing Dask structure.&lt;/p&gt;

&lt;p&gt;For third-party extension array authors, like &lt;a href=&quot;https://cyberpandas.readthedocs.io&quot;&gt;cyberpandas&lt;/a&gt;, the
work is similarly minimal. They don’t need to re-implement everything from the
ground up, just to play well with Dask.&lt;/p&gt;

&lt;p&gt;This highlights the importance of one of the Dask project’s core values: working
with the community. If you visit &lt;a href=&quot;https://dask.org&quot;&gt;dask.org&lt;/a&gt;, you’ll see
phrases like&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Integrates with existing projects&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Built with the broader community&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the start of Dask, the developers &lt;em&gt;could&lt;/em&gt; have gone off and re-written pandas
or NumPy from scratch to be parallel friendly (though we’d probably still be
working on that part today, since that’s such a massive undertaking). Instead,
the Dask developers worked with the community, occasionally nudging it in
directions that would help out dask. For example, many places in pandas &lt;a href=&quot;http://matthewrocklin.com/blog/work/2015/03/10/PyData-GIL&quot;&gt;held
the GIL&lt;/a&gt;, preventing
thread-based parallelism. Rather than abandoning pandas, the Dask and pandas
developers worked together to release the GIL where possible when it was a
bottleneck for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.dataframe&lt;/code&gt;. This benefited Dask and anyone else trying to
do thread-based parallelism with pandas DataFrames.&lt;/p&gt;

&lt;p&gt;And now, when pandas introduces new features like nullable integers,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.dataframe&lt;/code&gt; just needs to register it as an extension type and immediately
benefits from it. And third-party extension array authors can do the same for
their extension arrays.&lt;/p&gt;

&lt;p&gt;If you’re writing an ExtensionArray, make sure to add it to the &lt;a href=&quot;http://pandas.pydata.org/pandas-docs/version/0.24/ecosystem.html#extension-data-types&quot;&gt;pandas
ecosystem&lt;/a&gt; page, and register it with Dask!&lt;/p&gt;

</content>
 </entry>
 
 
 
 <entry>
   <title>Dask, Pandas, and GPUs: first steps</title>
   <link href="https://blog.dask.org/2019/01/13/dask-cudf-first-steps"/>
   <updated>2019-01-13T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/01/13/dask-cudf-first-steps</id>
   
   <category>GPU</category>
   
   <category>Pandas</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;We’re building a distributed GPU Pandas dataframe out of
&lt;a href=&quot;https://github.com/rapidsai/cudf&quot;&gt;cuDF&lt;/a&gt; and
&lt;a href=&quot;https://docs.dask.org/en/latest/dataframe.html&quot;&gt;Dask Dataframe&lt;/a&gt;.
This effort is young.&lt;/p&gt;

&lt;p&gt;This post describes the current situation,
our general approach,
and gives examples of what does and doesn’t work today.
We end with some notes on scaling performance.&lt;/p&gt;

&lt;p&gt;You can also view the experiment in this post as
&lt;a href=&quot;https://gist.github.com/mrocklin/4b1b80d1ae07ec73f75b2a19c8e90e2e&quot;&gt;a notebook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And here is a table of results:&lt;/p&gt;

&lt;table border=&quot;1&quot; class=&quot;dataframe&quot;&gt;
  &lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Architecture&lt;/th&gt;
    &lt;th&gt;Time&lt;/th&gt;
    &lt;th&gt;Bandwidth&lt;/th&gt;
  &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt; Single CPU Core &lt;/th&gt;
      &lt;td&gt; 3min 14s &lt;/td&gt;
      &lt;td&gt; 50 MB/s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Eight CPU Cores &lt;/th&gt;
      &lt;td&gt; 58s &lt;/td&gt;
      &lt;td&gt; 170 MB/s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Forty CPU Cores &lt;/th&gt;
      &lt;td&gt; 35s &lt;/td&gt;
      &lt;td&gt; 285 MB/s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; One GPU &lt;/th&gt;
      &lt;td&gt; 11s &lt;/td&gt;
      &lt;td&gt; 900 MB/s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Eight GPUs &lt;/th&gt;
      &lt;td&gt; 5s &lt;/td&gt;
      &lt;td&gt; 2000 MB/s &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;building-blocks-cudf-and-dask&quot;&gt;Building Blocks: cuDF and Dask&lt;/h2&gt;

&lt;p&gt;Building a distributed GPU-backed dataframe is a large endeavor.
Fortunately we’re starting on a good foundation and
can assemble much of this system from existing components:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;a href=&quot;https://github.com/rapidsai/cudf&quot;&gt;cuDF&lt;/a&gt; library aims to implement the
Pandas API on the GPU. It gets good speedups on standard operations like
reading CSV files, filtering and aggregating columns, joins, and so on.&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cudf&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# looks and feels like Pandas, but runs on the GPU
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;myfile.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Alice&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;cuDF is part of the growing &lt;a href=&quot;https://rapids.ai&quot;&gt;RAPIDS initiative&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;a href=&quot;https://docs.dask.org/en/latest/dataframe.html&quot;&gt;Dask Dataframe&lt;/a&gt;
library provides parallel algorithms around the Pandas API. It composes
large operations like distributed groupbys or distributed joins from a task
graph of many smaller single-node groupbys or joins accordingly (and many
&lt;a href=&quot;https://docs.dask.org/en/latest/dataframe-api.html&quot;&gt;other operations&lt;/a&gt;).&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# looks and feels like Pandas, but runs in parallel
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;myfile.*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Alice&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;a href=&quot;https://distributed.dask.org&quot;&gt;Dask distributed task scheduler&lt;/a&gt;
provides general-purpose parallel execution given complex task graphs.
It’s good for adding multi-node computing into an existing codebase.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Given these building blocks,
our approach is to make the cuDF API close enough to Pandas that
we can reuse the Dask Dataframe algorithms.&lt;/p&gt;

&lt;h2 id=&quot;benefits-and-challenges-to-this-approach&quot;&gt;Benefits and Challenges to this approach&lt;/h2&gt;

&lt;p&gt;This approach has a few benefits:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;We get to reuse the parallel algorithms found in Dask Dataframe originally designed for Pandas.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It consolidates the development effort within a single codebase so that
future effort spent on CPU Dataframes benefits GPU Dataframes and vice
versa. Maintenance costs are shared.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;By building code that works equally with two DataFrame implementations
(CPU and GPU) we establish conventions and protocols that will
make it easier for other projects to do the same, either with these two
Pandas-like libraries, or with future Pandas-like libraries.&lt;/p&gt;

    &lt;p&gt;This approach also aims to demonstrate that the ecosystem should support Pandas-like
libraries, rather than just Pandas. For example, if
(when?) the Arrow library develops a computational system then we’ll be in
a better place to roll that in as well.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;When doing any refactor we tend to clean up existing code.&lt;/p&gt;

    &lt;p&gt;For example, to make dask dataframe ready for a new GPU Parquet reader
we end up &lt;a href=&quot;https://github.com/dask/dask/pull/4336&quot;&gt;refactoring and simplifying our Parquet I/O logic&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The approach also has some drawbacks. Namely, it places API pressure on cuDF to match Pandas so:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Slight differences in API now cause larger problems, such as these:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/251&quot;&gt;Join column ordering differs rapidsai/cudf #251&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/483#issuecomment-453218151&quot;&gt;Groupby aggregation column ordering differs rapidsai/cudf #483&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;cuDF has some pressure on it to repeat what some believe to be mistakes in
the Pandas API.&lt;/p&gt;

    &lt;p&gt;For example, cuDF today supports missing values arguably more sensibly than
Pandas. Should cuDF have to revert to the old way of doing things
just to match Pandas semantics? Dask Dataframe will probably need
to be more flexible in order to handle evolution and small differences
in semantics.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;alternatives&quot;&gt;Alternatives&lt;/h2&gt;

&lt;p&gt;We could also write a new dask-dataframe-style project around cuDF that deviates
from the Pandas/Dask Dataframe API. Until recently this
has actually been the approach, and the
&lt;a href=&quot;https://github.com/rapidsai/dask-cudf&quot;&gt;dask-cudf&lt;/a&gt; project did exactly this.
This was probably a good choice early on to get started and prototype things.
The project was able to implement a wide range of functionality including
groupby-aggregations, joins, and so on using
&lt;a href=&quot;https://docs.dask.org/en/latest/delayed.html&quot;&gt;dask delayed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We’re redoing this now on top of dask dataframe though, which means that we’re
losing some functionality that dask-cudf already had, but hopefully the
functionality that we add now will be more stable and established on a firmer
base.&lt;/p&gt;

&lt;h2 id=&quot;status-today&quot;&gt;Status Today&lt;/h2&gt;

&lt;p&gt;Today very little works, but what does is decently smooth.&lt;/p&gt;

&lt;p&gt;Here is a simple example that reads some data from many CSV files,
picks out a column,
and does some aggregations.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cuda&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCUDACluster&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cudf&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCUDACluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# runs on eight local GPUs
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gdf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask_cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;data/nyc/many/*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# wrap around many CSV files
&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;passenger_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;184464740&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Also note, NYC Taxi ridership is significantly less than it was a few years ago&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-im-excited-about-in-the-example-above&quot;&gt;What I’m excited about in the example above&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;All of the infrastructure surrounding the cuDF code, like the cluster setup,
diagnostics, JupyterLab environment, and so on, came for free, like any
other new Dask project.&lt;/p&gt;

    &lt;p&gt;Here is an image of my JupyterLab setup&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://matthewrocklin.com/blog/images/dask-cudf-environment.png&quot;&gt;
  &lt;img src=&quot;https://matthewrocklin.com/blog/images/dask-cudf-environment.png&quot; alt=&quot;Dask + CUDA + cuDF JupyterLab environment&quot; width=&quot;70%&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;df&lt;/code&gt; object is actually just a normal Dask Dataframe. We didn’t have to
write new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__repr__&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__add__&lt;/code&gt;, or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.sum()&lt;/code&gt; implementations, and probably
many functions we didn’t think about work well today (though also many
don’t).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We’re tightly integrated and more connected to other systems. For example, if
we wanted to convert our dask-cudf-dataframe to a dask-pandas-dataframe then
we would just use the cuDF &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;to_pandas&lt;/code&gt; function:&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;map_partitions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cudf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_pandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;We don’t have to write anything special like a separate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.to_dask_dataframe&lt;/code&gt;
method or handle other special cases.&lt;/p&gt;

    &lt;p&gt;Dask parallelism is orthogonal to the choice of CPU or GPU.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It’s easy to switch hardware. By avoiding separate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-cudf&lt;/code&gt; code paths
it’s easier to add cuDF to an existing Dask+Pandas codebase to run on GPUs,
or to remove cuDF and use Pandas if we want our code to be runnable without GPUs.&lt;/p&gt;

    &lt;p&gt;There are more examples of this in the scaling section below.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;whats-wrong-with-the-example-above&quot;&gt;What’s wrong with the example above&lt;/h2&gt;

&lt;p&gt;In general the answer is &lt;strong&gt;many small things&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cudf.read_csv&lt;/code&gt; function doesn’t yet support reading chunks from a
single CSV file, and so doesn’t work well with very large CSV files. We
had to split our large CSV files into many smaller CSV files first with
normal Dask+Pandas:&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;few-large/*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;repartition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;npartitions&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;many-small/*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;(See &lt;a href=&quot;https://github.com/rapidsai/cudf/issues/568&quot;&gt;rapidsai/cudf #568&lt;/a&gt;)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Many operations that used to work in dask-cudf like groupby-aggregations
and joins no longer work. We’re going to need to slightly modify many cuDF
APIs over the next couple of months to more closely match their Pandas
equivalents.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;I ran the timing cell twice because it currently takes a few seconds to
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;import cudf&lt;/code&gt; today.
&lt;a href=&quot;https://github.com/rapidsai/cudf/issues/627&quot;&gt;rapidsai/cudf #627&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We had to make Dask Dataframe a bit more flexible and assume less about its
constituent dataframes being exactly Pandas dataframes. (see
&lt;a href=&quot;https://github.com/dask/dask/pull/4359&quot;&gt;dask/dask #4359&lt;/a&gt; and
&lt;a href=&quot;https://github.com/dask/dask/pull/4375&quot;&gt;dask/dask #4375&lt;/a&gt; for examples).
I suspect that there will by many more small changes like
these necessary in the future.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These problems are representative of dozens more similar issues. They are
all fixable and indeed, many are actively being fixed today by the &lt;a href=&quot;https://github.com/rapidsai/cudf/graphs/contributors&quot;&gt;good folks
working on RAPIDS&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;near-term-schedule&quot;&gt;Near Term Schedule&lt;/h2&gt;

&lt;p&gt;The RAPIDS group is currently busy working to release 0.5, which includes some
of the fixes necessary to run the example above, and also many unrelated
stability improvements. This will probably keep them busy for a week or two
during which I don’t expect to see much Dask + cuDF work going on other than
planning.&lt;/p&gt;

&lt;p&gt;After that, Dask parallelism support will be a top priority, so
I look forward to seeing some rapid progress here.&lt;/p&gt;

&lt;h2 id=&quot;scaling-results&quot;&gt;Scaling Results&lt;/h2&gt;

&lt;p&gt;In &lt;a href=&quot;../../../2019/01/03/dask-array-gpus-first-steps&quot;&gt;my last post about combining Dask Array with CuPy&lt;/a&gt;,
a GPU-accelerated Numpy,
we saw impressive speedups from using many GPUs on a simple problem that
manipulated some simple random data.&lt;/p&gt;

&lt;h3 id=&quot;dask-array--cupy-on-random-data&quot;&gt;Dask Array + CuPy on Random Data&lt;/h3&gt;

&lt;table border=&quot;1&quot; class=&quot;dataframe&quot;&gt;
  &lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Architecture&lt;/th&gt;
    &lt;th&gt;Time&lt;/th&gt;
  &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt; Single CPU Core &lt;/th&gt;
      &lt;td&gt; 2hr 39min &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Forty CPU Cores &lt;/th&gt;
      &lt;td&gt; 11min 30s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; One GPU &lt;/th&gt;
      &lt;td&gt; 1 min 37s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Eight GPUs &lt;/th&gt;
      &lt;td&gt; 19s &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;That exercise was easy to scale because it was almost entirely bound by the
computation of creating random data.&lt;/p&gt;

&lt;h3 id=&quot;dask-dataframe--cudf-on-csv-data&quot;&gt;Dask DataFrame + cuDF on CSV data&lt;/h3&gt;

&lt;p&gt;We did a similar study on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read_csv&lt;/code&gt; example above, which is bound mostly
by reading CSV data from disk and then parsing it. You can see a notebook
available
&lt;a href=&quot;https://gist.github.com/mrocklin/4b1b80d1ae07ec73f75b2a19c8e90e2e&quot;&gt;here&lt;/a&gt;. We
have similar (though less impressive) numbers to present.&lt;/p&gt;

&lt;table border=&quot;1&quot; class=&quot;dataframe&quot;&gt;
  &lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Architecture&lt;/th&gt;
    &lt;th&gt;Time&lt;/th&gt;
    &lt;th&gt;Bandwidth&lt;/th&gt;
  &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt; Single CPU Core &lt;/th&gt;
      &lt;td&gt; 3min 14s &lt;/td&gt;
      &lt;td&gt; 50 MB/s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Eight CPU Cores &lt;/th&gt;
      &lt;td&gt; 58s &lt;/td&gt;
      &lt;td&gt; 170 MB/s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Forty CPU Cores &lt;/th&gt;
      &lt;td&gt; 35s &lt;/td&gt;
      &lt;td&gt; 285 MB/s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; One GPU &lt;/th&gt;
      &lt;td&gt; 11s &lt;/td&gt;
      &lt;td&gt; 900 MB/s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Eight GPUs &lt;/th&gt;
      &lt;td&gt; 5s &lt;/td&gt;
      &lt;td&gt; 2000 MB/s &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;The bandwidth numbers were computed by noting that the data was around 10 GB on disk&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;analysis&quot;&gt;Analysis&lt;/h2&gt;

&lt;p&gt;First, I want to emphasize again that it’s easy to test a wide variety of
architectures using this setup because of the Pandas API compatibility between
all of the different projects. We’re seeing a wide range of performance (40x
span) across a variety of different hardware with a wide range of cost points.&lt;/p&gt;

&lt;p&gt;Second, note that this problem scales less well than our
&lt;a href=&quot;../../../2019/01/03/dask-array-gpus-first-steps&quot;&gt;previous example with CuPy&lt;/a&gt;,
both on CPU and GPU.
I suspect that this is because this example is also bound by I/O and not just
number-crunching. While the jump from single-CPU to single-GPU is large, the
jump from single-CPU to many-CPU or single-GPU to many-GPU is not as large as
we would have liked. For GPUs for example we got around a 2x speedup when we
added 8x as many GPUs.&lt;/p&gt;

&lt;p&gt;At first one might think that this is because we’re saturating disk read speeds.
However two pieces of evidence go against that guess:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;NVIDIA folks familiar with my current hardware inform me that they’re able to get
much higher I/O throughput when they’re careful&lt;/li&gt;
  &lt;li&gt;The CPU scaling is similarly poor, despite the fact that it’s obviously not
reaching full I/O bandwidth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, it’s likely that we’re just not treating our disks and IO pipelines
carefully.&lt;/p&gt;

&lt;p&gt;We might consider working to think more carefully about data locality within a
single machine. Alternatively, we might just choose to use a smaller machine,
or many smaller machines. My team has been asking me to start playing with
some cheaper systems than a DGX, I may experiment with those soon. It may be
that for data-loading and pre-processing workloads the previous wisdom of “pack
as much computation as you can into a single box” no longer holds
(without us doing more work that is).&lt;/p&gt;

&lt;h3 id=&quot;come-help&quot;&gt;Come help&lt;/h3&gt;

&lt;p&gt;If the work above sounds interesting to you then come help!
There is a lot of low-hanging and high impact work to do.&lt;/p&gt;

&lt;p&gt;If you’re interested in being paid to focus more on these topics, then consider
applying for a job. NVIDIA’s RAPIDS team is looking to hire engineers for Dask
development with GPUs and other data analytics library development projects.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/US-TX-Austin/Senior-Library-Software-Engineer---RAPIDS_JR1919608-1&quot;&gt;Senior Library Software Engineer - RAPIDS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>GPU Dask Arrays, first steps</title>
   <link href="https://blog.dask.org/2019/01/03/dask-array-gpus-first-steps"/>
   <updated>2019-01-03T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2019/01/03/dask-array-gpus-first-steps</id>
   
   <category>GPU</category>
   
   <category>array</category>
   
   <category>cupy</category>
   
   <content type="html">
&lt;p&gt;The following code creates and manipulates 2 TB of randomly generated data.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;500000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;500000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;threads&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On a single CPU, this computation takes two hours.&lt;/p&gt;

&lt;p&gt;On an eight-GPU single-node system this computation takes nineteen seconds.&lt;/p&gt;

&lt;h2 id=&quot;combine-dask-array-with-cupy&quot;&gt;Combine Dask Array with CuPy&lt;/h2&gt;

&lt;p&gt;Actually this computation isn’t that impressive.
It’s a simple workload,
for which most of the time is spent creating and destroying random data.
The computation and communication patterns are simple,
reflecting the simplicity commonly found in data processing workloads.&lt;/p&gt;

&lt;p&gt;What &lt;em&gt;is&lt;/em&gt; impressive is that we were able to create a distributed parallel GPU
array quickly by composing these four existing libraries:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://cupy.chainer.org/&quot;&gt;CuPy&lt;/a&gt; provides a partial implementation of
Numpy on the GPU.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://docs.dask.org/en/latest/array.html&quot;&gt;Dask Array&lt;/a&gt; provides chunked
algorithms on top of Numpy-like libraries like Numpy and CuPy.&lt;/p&gt;

    &lt;p&gt;This enables us to operate on more data than we could fit in memory
by operating on that data in chunks.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;a href=&quot;https://distributed.dask.org&quot;&gt;Dask distributed&lt;/a&gt; task scheduler runs
those algorithms in parallel, easily coordinating work across many CPU
cores.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;a href=&quot;https://github.com/rapidsai/dask-cuda&quot;&gt;Dask CUDA&lt;/a&gt; to extend Dask
distributed with GPU support.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These tools already exist. We had to connect them together with a small amount
of glue code and minor modifications. By mashing these tools together we can
quickly build and switch between different architectures to explore what is
best for our application.&lt;/p&gt;

&lt;p&gt;For this example we relied on the following changes upstream:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/cupy/cupy/pull/1689&quot;&gt;cupy/cupy #1689: Support Numpy arrays as seeds in RandomState&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/4041&quot;&gt;dask/dask #4041 Make da.RandomState accessible to other modules&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/pull/2432&quot;&gt;dask/distributed #2432: Add LocalCUDACluster&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;comparison-among-singlemulti-cpugpu&quot;&gt;Comparison among single/multi CPU/GPU&lt;/h2&gt;

&lt;p&gt;We can now easily run some experiments on different architectures. This is
easy because …&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We can switch between CPU and GPU by switching between Numpy and CuPy.&lt;/li&gt;
  &lt;li&gt;We can switch between single/multi-CPU-core and single/multi-GPU
by switching between Dask’s different task schedulers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These libraries allow us to quickly judge the costs of this computation for
the following hardware choices:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Single-threaded CPU&lt;/li&gt;
  &lt;li&gt;Multi-threaded CPU with 40 cores (80 H/T)&lt;/li&gt;
  &lt;li&gt;Single-GPU&lt;/li&gt;
  &lt;li&gt;Multi-GPU on a single machine with 8 GPUs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We present code for these four choices below,
but first,
we present a table of results.&lt;/p&gt;

&lt;h3 id=&quot;results&quot;&gt;Results&lt;/h3&gt;

&lt;table border=&quot;1&quot; class=&quot;dataframe&quot;&gt;
  &lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Architecture&lt;/th&gt;
    &lt;th&gt;Time&lt;/th&gt;
  &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt; Single CPU Core &lt;/th&gt;
      &lt;td&gt; 2hr 39min &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Forty CPU Cores &lt;/th&gt;
      &lt;td&gt; 11min 30s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; One GPU &lt;/th&gt;
      &lt;td&gt; 1 min 37s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Eight GPUs &lt;/th&gt;
      &lt;td&gt; 19s &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;setup&quot;&gt;Setup&lt;/h3&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# generate chunked dask arrays of mamy numpy random arrays
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;500000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;500000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nbytes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1e9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 2 TB
# 2000.0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;cpu-timing&quot;&gt;CPU timing&lt;/h3&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;single-threaded&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;threads&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;single-gpu-timing&quot;&gt;Single GPU timing&lt;/h3&gt;

&lt;p&gt;We switch from CPU to GPU by changing our data source to generate CuPy arrays
rather than NumPy arrays. Everything else should more or less work the same
without special handling for CuPy.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(This actually isn’t true yet, many things in dask.array will break for
non-NumPy arrays, but we’re working on it actively both within Dask, within
NumPy, and within the GPU array libraries. Regardless, everything in this
example works fine.)&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# generate chunked dask arrays of mamy cupy random arrays
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RandomState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# &amp;lt;-- we specify cupy here
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;500000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;500000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;single-threaded&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;multi-gpu-timing&quot;&gt;Multi GPU timing&lt;/h3&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_cuda&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCUDACluster&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LocalCUDACluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And again, here are the results:&lt;/p&gt;

&lt;table border=&quot;1&quot; class=&quot;dataframe&quot;&gt;
  &lt;thead&gt;
  &lt;tr&gt;
    &lt;th&gt;Architecture&lt;/th&gt;
    &lt;th&gt;Time&lt;/th&gt;
  &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt; Single CPU Core &lt;/th&gt;
      &lt;td&gt; 2hr 39min &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Forty CPU Cores &lt;/th&gt;
      &lt;td&gt; 11min 30s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; One GPU &lt;/th&gt;
      &lt;td&gt; 1 min 37s &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt; Eight GPUs &lt;/th&gt;
      &lt;td&gt; 19s &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;First, this is my first time playing with an 40-core system. I was surprised
to see that many cores. I was also pleased to see that Dask’s normal threaded
scheduler happily saturates many cores.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://matthewrocklin.com/blog/images/python-gil-8000-percent.png&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Although later on it did dive down to around 5000-6000%, and if you do the math
you’ll see that we’re not getting a 40x speedup. My &lt;em&gt;guess&lt;/em&gt; is that
performance would improve if we were to play with some mixture of threads and
processes, like having ten processes with eight threads each.&lt;/p&gt;

&lt;p&gt;The jump from the biggest multi-core CPU to a single GPU is still an order of
magnitude though. The jump to multi-GPU is another order of magnitude, and
brings the computation down to 19s, which is short enough that I’m willing to
wait for it to finish before walking away from my computer.&lt;/p&gt;

&lt;p&gt;Actually, it’s quite fun to watch on the dashboard (especially after you’ve
been waiting for three hours for the sequential solution to run):&lt;/p&gt;

&lt;blockquote class=&quot;imgur-embed-pub&quot; lang=&quot;en&quot; data-id=&quot;a/6hkPPwA&quot;&gt;
  &lt;p&gt;&lt;a href=&quot;//imgur.com/6hkPPwA&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;//s.imgur.com/min/embed.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;This computation was simple, but the range in architecture just explored was
extensive. We swapped out the underlying architecture from CPU to GPU (which
had an entirely different codebase) and tried both multi-core CPU parallelism
as well as multi-GPU many-core parallelism.&lt;/p&gt;

&lt;p&gt;We did this in less than twenty lines of code, making this experiment something
that an undergraduate student or other novice could perform at home.
We’re approaching a point where experimenting with multi-GPU systems is
approachable to non-experts (at least for array computing).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/mrocklin/57be0ca4143974e6015732d0baacc1cb&quot;&gt;Here is a notebook for the experiment above&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;room-for-improvement&quot;&gt;Room for improvement&lt;/h2&gt;

&lt;p&gt;We can work to expand the computation above in a variety of directions.
There is a ton of work we still have to do to make this reliable.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Use more complex array computing workloads&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;The Dask Array algorithms were designed first around Numpy. We’ve only
recently started making them more generic to other kinds of arrays (like
GPU arrays, sparse arrays, and so on). As a result there are still many
bugs when exploring these non-Numpy workloads.&lt;/p&gt;

    &lt;p&gt;For example if you were to switch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum&lt;/code&gt; for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mean&lt;/code&gt; in the computation above
you would get an error because our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mean&lt;/code&gt; computation contains an easy to
fix error that assumes Numpy arrays exactly.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Use Pandas and cuDF instead of Numpy and CuPy&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;The cuDF library aims to reimplement the Pandas API on the GPU,
much like how CuPy reimplements the NumPy API.
Using Dask DataFrame with cuDF will require some work on both sides,
but is quite doable.&lt;/p&gt;

    &lt;p&gt;I believe that there is plenty of low-hanging fruit here.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Improve and move LocalCUDACluster&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LocalCUDAClutster&lt;/code&gt; class used above is an experimental &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cluster&lt;/code&gt; type
that creates as many workers locally as you have GPUs, and assigns each
worker to prefer a different GPU. This makes it easy for people to load
balance across GPUs on a single-node system without thinking too much about
it. This appears to be a common pain-point in the ecosystem today.&lt;/p&gt;

    &lt;p&gt;However, the LocalCUDACluster probably shouldn’t live in the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask/distributed&lt;/code&gt; repository (it seems too CUDA specific) so will probably
move to some dask-cuda repository. Additionally there are still many
questions about how to handle concurrency on top of GPUs, balancing between
CPU cores and GPU cores, and so on.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Multi-node computation&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;There’s no reason that we couldn’t accelerate computations like these
further by using multiple multi-GPU nodes. This is doable today with
manual setup, but we should also improve the existing deployment solutions
&lt;a href=&quot;https://kubernetes.dask.org&quot;&gt;dask-kubernetes&lt;/a&gt;,
&lt;a href=&quot;https://yarn.dask.org&quot;&gt;dask-yarn&lt;/a&gt;, and
&lt;a href=&quot;https://jobqueue.dask.org&quot;&gt;dask-jobqueue&lt;/a&gt;, to make this easier for
non-experts who want to use a cluster of multi-GPU resources.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Expense&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;The machine I ran this on is expensive. Well, it’s nowhere close to as
expensive to own and operate as a traditional cluster that you would need
for these kinds of results, but it’s still well beyond the price point of a
hobbyist or student.&lt;/p&gt;

    &lt;p&gt;It would be useful to run this on a more budget system to get a sense of
the tradeoffs on more reasonably priced systems. I should probably also
learn more about provisioning GPUs on the cloud.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;come-help&quot;&gt;Come help!&lt;/h3&gt;

&lt;p&gt;If the work above sounds interesting to you then come help!
There is a lot of low-hanging and high impact work to do.&lt;/p&gt;

&lt;p&gt;If you’re interested in being paid to focus more on these topics, then consider
applying for a job. The NVIDIA corporation is hiring around the use of Dask
with GPUs.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/US-TX-Austin/Senior-Library-Software-Engineer---RAPIDS_JR1919608-1&quot;&gt;Senior Library Software Engineer - RAPIDS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a fairly generic posting. If you’re interested the posting doesn’t seem
to fit then please apply anyway and we’ll tweak things.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Version 1.0</title>
   <link href="https://blog.dask.org/2018/11/29/version-1.0"/>
   <updated>2018-11-29T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/11/29/version-1.0</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;We are pleased to announce the release of Dask version 1.0.0!&lt;/p&gt;

&lt;p&gt;Usually in release blogposts we outline important features and changes since
the last major version. Because of the 1.0 version number, this post will be a
bit different. Instead we’ll talk about what this version number means to us,
and discuss the broader context of Dask projects more generally.&lt;/p&gt;

&lt;h2 id=&quot;what-10-means-to-us&quot;&gt;What 1.0 means to us&lt;/h2&gt;

&lt;p&gt;Version 1.0 software means different things to different groups.
In some communities it might mean …&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The first version of a package&lt;/li&gt;
  &lt;li&gt;When a package is first ready for production use&lt;/li&gt;
  &lt;li&gt;When a package has reached API stability&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is common in the PyData ecosystem to wait a &lt;em&gt;long time&lt;/em&gt; before releasing a
version 1.0. For example neither Pandas nor Scikit-Learn, arguably two of the
most well used PyData packages in production, have yet declared a 1.0 version
number (today they are at versions 0.23 and 0.20 respectively). And yet each
package is widely used in production by organizations that demand high degrees
of stability.&lt;/p&gt;

&lt;p&gt;Dask is not as API-stable as Pandas or Scikit-Learn, but it’s pretty close.
The project rarely invents new APIs, instead preferring to implement
pre-existing APIs (like the NumPy/Pandas/Scikit-Learn APIs) or standard language
protocols (like async-await, concurrent.futures, Queues, Locks, and so on).
Additionally, Dask is well used in production today across sectors ranging from
risk-tolerant industries like startups and quantitative finance shops, to
risk-averse institutions like banks, large enterprises, and governments.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;When we say that Dask has reached 1.0 we mean that it is ready to be used in
production. We are late in saying this. This happened a long time ago.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;development-will-continue-as-before&quot;&gt;Development will continue as before&lt;/h2&gt;

&lt;p&gt;Dask is living software that exists in a rapidly evolving space. Nothing is
changing about our internal stability practices. We will continue to add new
features, deprecate old ones, and fix bugs with the same policies. We always
try to minimize negative effects on users when making these internal changes
while maximizing the speed at which we can deliver new bugfixes and features.
This is hard and requires care, but we believe that we’ve done this decently in
the past so hopefully you haven’t noticed much. We will continue to operate
the same way into the future.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The 1.0 version change does not affect our development cycle.
There are no LTS versions beyond what we already provide.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;different-dask-packages-move-at-different-speeds&quot;&gt;Different Dask packages move at different speeds&lt;/h2&gt;

&lt;p&gt;Dask is able to evolve and experiment rapidly while maintaining a stable core
because it is split into sub-packages, each of which evolves independently, has
its own maintainers, its own versions, and its own release cycle. Some Dask
subprojects have had versions above 1.0 for a long time, while others are still
unstable.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dask’s version number is hard to define today because it is composed of so
many independent efforts by different groups. This is similar to situation in
Jupyter, or in the Numeric Python ecosystem itself.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;

&lt;p&gt;Finally, we’re grateful to everyone who has contributed to the project over the
years, either by contributing code, reviews, documentation, discussion, bug
reports, well written questions and answers, visual designs, and well wishes.
This means a lot to us.&lt;/p&gt;

&lt;p&gt;Today there are dozens of &lt;a href=&quot;https://pypi.org/search/?q=dask&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-*&lt;/code&gt; packages on
PyPI&lt;/a&gt; that support thousands of users and
several more that incorporate Dask for parallelism. We’re thankful to play a
role in such a vibrant community.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask-jobqueue</title>
   <link href="https://blog.dask.org/2018/10/08/Dask-Jobqueue"/>
   <updated>2018-10-08T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/10/08/Dask-Jobqueue</id>
   
   <category>HPC</category>
   
   <category>distributed</category>
   
   <category>jobqueue</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work was done in collaboration with &lt;a href=&quot;https://github.com/mrocklin&quot;&gt;Matthew Rocklin&lt;/a&gt; (Anaconda), Jim Edwards (NCAR), &lt;a href=&quot;https://github.com/guillaumeeb&quot;&gt;Guillaume Eynard-Bontemps&lt;/a&gt; (CNES), and &lt;a href=&quot;https://github.com/lesteve&quot;&gt;Loïc Estève&lt;/a&gt; (INRIA), and is supported, in part, by the US National Science Foundation &lt;a href=&quot;https://www.earthcube.org/&quot;&gt;Earth Cube program&lt;/a&gt;. The dask-jobqueue package is a spinoff of the &lt;a href=&quot;https://medium.com/pangeo&quot;&gt;Pangeo Project&lt;/a&gt;. This blogpost was previously published &lt;a href=&quot;https://medium.com/pangeo/dask-jobqueue-d7754e42ca53&quot;&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR;&lt;/strong&gt; &lt;em&gt;Dask-jobqueue&lt;/em&gt; allows you to seamlessly deploy &lt;a href=&quot;https://dask.org/&quot;&gt;dask&lt;/a&gt; on HPC clusters that use a variety of job queuing systems such as PBS, Slurm, SGE, or LSF. Dask-jobqueue provides a &lt;em&gt;Pythonic&lt;/em&gt; user interface that manages dask workers/clusters through the submission, execution, and deletion of individual jobs on a HPC system. It gives users the ability to interactively scale workloads across large HPC systems; turning an interactive &lt;a href=&quot;http://jupyter.org/&quot;&gt;Jupyter&lt;/a&gt; Notebook into a powerful tool for scalable computation on very large datasets.&lt;/p&gt;

&lt;p&gt;Install with:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; conda-forge dask-jobqueue
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;dask-jobqueue
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And checkout the dask-jobqueue documentation: &lt;a href=&quot;http://jobqueue.dask.org&quot;&gt;http://jobqueue.dask.org&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Large high-performance computer (HPC) clusters are ubiquitous throughout the computational sciences. These HPC systems include powerful hardware, including many large compute nodes, high-speed interconnects, and parallel file systems. An example of such systems that we use at &lt;a href=&quot;https://ncar.ucar.edu/&quot;&gt;NCAR&lt;/a&gt; is named &lt;a href=&quot;https://www2.cisl.ucar.edu/resources/computational-systems/cheyenne&quot;&gt;Cheyenne&lt;/a&gt;. Cheyenne is a fairly large machine, with about 150k cores and over 300 TB of total memory.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/2000/1*Jqm612rTcdWFkmcZWhcrTw.jpeg&quot; alt=&quot;Cheyenne is a 5.34-petaflops, high-performance computer operated by NCAR.&quot; /&gt;&lt;em&gt;Cheyenne is a 5.34-petaflops, high-performance computer operated by NCAR.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These systems frequently use a job queueing system, such as PBS, Slurm, or SGE, to manage the queueing and execution of many concurrent jobs from numerous users. A “job” is a single execution of a program that is to be run on some set of resources on the user’s HPC system. These jobs are often submitted via the command line:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;qsub do_thing_a.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Where do_thing_a.sh is a shell script that might look something like this:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#PBS -N thing_a&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#PBS -q premium&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#PBS -A 123456789&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#PBS -l select=1:ncpus=36:mem=109G&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; “doing thing A”
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this example “-N” specifies the name of this job, “-q” specifies the queue where the job should be run, “-A” specifies a project code to bill for the CPU time used while the job is run, and “-l” specifies the hardware specifications for this job. Each job queueing system has slightly different syntax for configuring and submitting these jobs.&lt;/p&gt;

&lt;p&gt;This interface has led to the development of a few common workflow patterns:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;MPI if you want to scale&lt;/em&gt;. MPI stands for the Message Passing Interface. It is a widely adopted interface allowing parallel computation across traditional HPC clusters. Many large computational models are written in languages like C and Fortran and use MPI to manage their parallel execution. For the old-timers out there, this is the go-to solution when it comes time to scale complex computations.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Batch it&lt;/em&gt;. It is quite common for scientific processing pipelines to include a few steps that can be easily parallelized by submitting multiple jobs in parallel. Maybe you want to “do_thing_a.sh” 500 times with slightly different inputs — easy, just submit all the jobs separately (or in what some queueing systems refer to as “array-job”).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Serial is still okay&lt;/em&gt;. Computers are pretty fast these days, right? Maybe you don’t need to parallelize your programing at all. Okay, so keep it serial and get some coffee while your job is running.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;/h2&gt;

&lt;p&gt;None of the workflow patterns listed above allow for interactive analysis on very large data analysis. When I’m prototyping new processing method, I often want to work interactively, say in a Jupyter Notebook. Writing MPI code on the fly is hard and expensive, batch jobs are inherently not interactive, and serial just won’t do when I start working on many TBs of data. Our experience is that these workflows tend to be fairly inelegant and difficult to transfer between applications, yielding lots of duplicated effort along the way.&lt;/p&gt;

&lt;p&gt;One of the aims of the Pangeo project is to facilitate interactive data on very large datasets. Pangeo leverages Jupyter and dask, along with a number of more domain specific packages like &lt;a href=&quot;http://xarray.pydata.org&quot;&gt;xarray&lt;/a&gt; to make this possible. The problem is we didn’t have a particularly palatable method for deploying dask on our HPC clusters.&lt;/p&gt;

&lt;h2 id=&quot;the-system&quot;&gt;The System&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Jupyter Notebooks&lt;/em&gt; are web applications that support interactive code execution, display of figures and animations, and in-line explanatory text and equations. They are quickly becoming the standard open-source format for interactive computing in Python.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Dask&lt;/em&gt; is a library for parallel computing that coordinates well with Python’s existing scientific software ecosystem, including libraries like &lt;a href=&quot;http://www.numpy.org/&quot;&gt;NumPy&lt;/a&gt;, &lt;a href=&quot;https://pandas.pydata.org/&quot;&gt;Pandas&lt;/a&gt;, &lt;a href=&quot;http://scikit-learn.org/stable/&quot;&gt;Scikit-Learn&lt;/a&gt;, and xarray. In many cases, it offers users the ability to take existing workflows and quickly scale them to much larger applications. &lt;a href=&quot;http://distributed.dask.org&quot;&gt;*Dask-distributed&lt;/a&gt;* is an extension of dask that facilitates parallel execution across many computers.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;Dask-jobqueue&lt;/em&gt; is a new Python package that we’ve built to facilitate the deployment of &lt;em&gt;dask&lt;/em&gt; on HPC clusters and interfacing with a number of job queuing systems. Its usage is concise and Pythonic.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_jobqueue&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PBSCluster&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PBSCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;36&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                     &lt;span class=&quot;n&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;108GB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                     &lt;span class=&quot;n&quot;&gt;queue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;premium&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;whats-happening-under-the-hood&quot;&gt;What’s happening under the hood?&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;In the call to PBSCluster() we are telling dask-jobqueue how we want to configure each job. In this case, we set each job to have 1 &lt;em&gt;Worker&lt;/em&gt;, each using 36 cores (threads) and 108 GB of memory. We also tell the PBS queueing system we’d like to submit this job to the “premium” queue. This step also starts a Scheduler to manage workers that we’ll add later.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;It is not until we call the cluster.scale() method that we interact with the PBS system. Here we start 10 workers, or equivalently 10 PBS jobs. For each job, dask-jobqueue creates a shell command similar to the one above (except dask-worker is called instead of echo) and submits the job via a subprocess call.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Finally, we connect to the cluster by instantiating the Client class. From here, the rest of our code looks just as it would if we were using one of &lt;a href=&quot;http://docs.dask.org/en/stable/scheduler-overview.html&quot;&gt;dask’s local schedulers&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dask-jobqueue is easily customizable to help users capitalize on advanced HPC features. A more complicated example that would work on NCAR’s Cheyenne super computer is:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PBSCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;36&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;processes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;memory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;108GB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;P48500028&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;queue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;premium&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;resource_spec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;select=1:ncpus=36:mem=109G&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;walltime&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;02:00:00&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;ib0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;local_directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;$TMPDIR&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this example, we instruct the PBSCluster to 1) use up to 36 cores per job, 2) use 18 worker processes per job, 3) use the large memory nodes with 109 GB each, 4) use a longer walltime than is standard, 5) use the &lt;a href=&quot;https://en.wikipedia.org/wiki/InfiniBand&quot;&gt;InfiniBand&lt;/a&gt; network interface (ib0), and 6) use the fast SSD disks as its local directory space.&lt;/p&gt;

&lt;p&gt;Finally, Dask offers the ability to “autoscale” clusters based on a set of heuristics. When the cluster needs more CPU or memory, it will scale up. When the cluster has unused resources, it will scale down. Dask-jobqueue supports this with a simple interface:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;adapt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minimum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;18&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;maximum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;360&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this example, we tell our cluster to autoscale between 18 and 360 workers (or 1 and 20 jobs).&lt;/p&gt;

&lt;h2 id=&quot;demonstration&quot;&gt;Demonstration&lt;/h2&gt;

&lt;p&gt;We have put together a fairly comprehensive screen cast that walks users through all the steps of setting up Jupyter and Dask (and dask-jobqueue) on an HPC cluster:&lt;/p&gt;

&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/FXsgmwpRExM&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;

&lt;h2 id=&quot;conclusions&quot;&gt;Conclusions&lt;/h2&gt;

&lt;p&gt;Dask jobqueue makes it much easier to deploy Dask on HPC clusters. The package provides a Pythonic interface to common job-queueing systems. It is also easily customizable.&lt;/p&gt;

&lt;p&gt;The autoscaling functionality allows for a fundamentally different way to do science on HPC clusters. Start your Jupyter Notebook, instantiate your dask cluster, and then do science — let dask determine when to scale up and down depending on the computational demand. We think this bursting approach to interactive parallel computing offers many benefits.&lt;/p&gt;

&lt;p&gt;Finally, in developing dask-jobqueue, we’ve run into a few challenges that are worth mentioning.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Queueing systems are highly customizable. System administrators seem to have a lot of control over their particularly implementation of each queueing system. In practice, this means that it is often difficult to simultaneously cover all permutations of a particular queueing system. We’ve generally found that things seem to be flexible enough and welcome feedback in the cases where they are not.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;CI testing has required a fair bit of work to setup. The target environment for using dask-jobqueue is on existing HPC clusters. In order to facilitate continuous integration testing of dask-jobqueue, we’ve had to configure multiple queueing systems (PBS, Slurm, SGE) to run in docker using Travis CI. This has been a laborious task and one we’re still working on.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We’ve built dask-jobqueue to operate in the dask-deploy framework. If you are familiar with &lt;a href=&quot;http://kubernetes.dask.org&quot;&gt;dask-kubernetes&lt;/a&gt; or &lt;a href=&quot;http://yarn.dask.org&quot;&gt;dask-yarn&lt;/a&gt;, you’ll recognize the basic syntax in dask-jobqueue as well. The coincident development of these dask deployment packages has recently brought up some important coordination discussions (e.g. &lt;a href=&quot;https://github.com/dask/distributed/issues/2235&quot;&gt;https://github.com/dask/distributed/issues/2235&lt;/a&gt;).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Refactor Documentation</title>
   <link href="https://blog.dask.org/2018/09/27/docs-refactor"/>
   <updated>2018-09-27T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/09/27/docs-refactor</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;We recently changed how we organize and connect Dask’s documentation.
Our approach may prove useful for other umbrella projects that spread
documentation across many different builds and sites.&lt;/p&gt;

&lt;h2 id=&quot;dask-splits-documentation-into-many-pages&quot;&gt;Dask splits documentation into many pages&lt;/h2&gt;

&lt;p&gt;Dask’s documentation is split into several different websites, each managed by
a different team for a different sub-project:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask.pydata.org&quot;&gt;dask.pydata.org&lt;/a&gt; : Main site&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://distributed.readthedocs.org&quot;&gt;distributed.readthedocs.org&lt;/a&gt; : Distributed scheduler&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-ml.readthedocs.io&quot;&gt;dask-ml.readthedocs.io&lt;/a&gt; : Dask for machine learning&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-kubernetes.readthedocs.io&quot;&gt;dask-kubernetes.readthedocs.io&lt;/a&gt; : Dask on Kubernetes&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-jobqueue.readthedocs.io&quot;&gt;dask-jobqueue.readthedocs.io&lt;/a&gt; : Dask on HPC systems&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-yarn.readthedocs.io&quot;&gt;dask-yarn.readthedocs.io&lt;/a&gt; : Dask on Hadoop systems&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-examples.readthedocs.io&quot;&gt;dask-examples.readthedocs.io&lt;/a&gt; : Examples that use Dask&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://matthewrocklin.com/blog&quot;&gt;matthewrocklin.com/blog&lt;/a&gt;,
&lt;a href=&quot;https://jcrist.github.io&quot;&gt;jcrist.github.io&lt;/a&gt;,
&lt;a href=&quot;https://tomaugspurger.github.io&quot;&gt;tomaugspurger.github.io&lt;/a&gt;,
&lt;a href=&quot;https://martindurant.github.io/blog&quot;&gt;martindurant.github.io/blog&lt;/a&gt; :
Developers’ personal blogs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This split in documentation matches the split in development teams. Each of
sub-project’s team manages its own docs in its own way. They release at their
own pace and make their own decisions about technology. This makes it much
more likely that developers maintain the documentation as they develop and
change software libraries.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We make it easy to write documentation. This choice causes many different documentation systems to emerge.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This approach is common. A web search for Jupyter Documentation yields the
following list:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jupyter.readthedocs.io/en/latest/&quot;&gt;jupyter.readthedocs.io/en/latest/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jupyter-notebook.readthedocs.io/en/stable/&quot;&gt;jupyter-notebook.readthedocs.io/en/stable/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jupyter.org/&quot;&gt;jupyter.org/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jupyterhub.readthedocs.io/en/stable/&quot;&gt;jupyterhub.readthedocs.io/en/stable/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://nteract.io/&quot;&gt;nteract.io/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ipython.org/&quot;&gt;ipython.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different teams developing semi-independently create different web pages. This
is inevitable. Asking a large distributed team to coordinate on a single
cohesive website adds substantial friction, which results in worse
documentation coverage.&lt;/p&gt;

&lt;h2 id=&quot;problem&quot;&gt;Problem&lt;/h2&gt;

&lt;p&gt;However, while using separate websites results in excellent coverage, it
also fragments the documentation. This makes it harder for users to smoothly
navigate between sites and discover appropriate content.&lt;/p&gt;

&lt;p&gt;Monolithic documentation is good for readers,
modular documentation is good for writers.&lt;/p&gt;

&lt;h2 id=&quot;our-solutions&quot;&gt;Our Solutions&lt;/h2&gt;

&lt;p&gt;Over the last month we took steps to connect our documentation and make it more
cohesive, while still enabling independent development. This post outlines the
following steps:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Organize under a single domain, dask.org&lt;/li&gt;
  &lt;li&gt;Develop a sphinx template project for uniform style&lt;/li&gt;
  &lt;li&gt;Include a cross-project navbar in addition to the within-project
table-of-contents&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We did some other things along the way that we find useful, but are probably
more specific to just Dask.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We moved this blog to blog.dask.org&lt;/li&gt;
  &lt;li&gt;We improved our example notebooks to host both a static site and also a live Binder&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;1-organize-under-a-single-domains-daskorg&quot;&gt;1: Organize under a single domains, Dask.org&lt;/h2&gt;

&lt;p&gt;Previously we had some documentation under &lt;a href=&quot;https://rtfd.org&quot;&gt;readthedocs&lt;/a&gt;,
some under the &lt;a href=&quot;https://dask.pydata.org&quot;&gt;dask.pydata.org&lt;/a&gt; subdomain (thanks
NumFOCUS!) and some pages on personal websites, like
&lt;a href=&quot;https://matthewrocklin.com/blog&quot;&gt;matthewrocklin.com/blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While looking for a new dask domain to host all of our content we noticed that
&lt;a href=&quot;https://dask.org&quot;&gt;dask.org&lt;/a&gt; redirected to
&lt;a href=&quot;https://anaconda.org&quot;&gt;anaconda.org&lt;/a&gt;, and were pleased to learn that someone at
&lt;a href=&quot;https://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt; had the foresight to register the domain
early on.&lt;/p&gt;

&lt;p&gt;Anaconda was happy to transfer ownership of the domain to NumFOCUS, who helps
us to maintain it now. Now all of our documentation is available under that
single domain as subdomains:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask.org&quot;&gt;dask.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.dask.org&quot;&gt;docs.dask.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://distributed.dask.org&quot;&gt;distributed.dask.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://ml.dask.org&quot;&gt;ml.dask.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://kubernetes.dask.org&quot;&gt;kubernetes.dask.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://yarn.dask.org&quot;&gt;yarn.dask.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jobqueue.dask.org&quot;&gt;jobqueue.dask.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://examples.dask.org&quot;&gt;examples.dask.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://examples.dask.org&quot;&gt;stories.dask.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.dask.org&quot;&gt;blog.dask.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This uniformity means that the thing you want is probably at that-thing.dask.org, which is a bit easier to guess than otherwise.&lt;/p&gt;

&lt;p&gt;Many thanks to &lt;a href=&quot;https://andy.terrel.us/&quot;&gt;Andy Terrel&lt;/a&gt; and &lt;a href=&quot;https://tomaugspurger.github.io&quot;&gt;Tom
Augspurger&lt;/a&gt; for managing this move, and to
Anaconda for generously donating the domain.&lt;/p&gt;

&lt;h2 id=&quot;2-cross-project-navigation-bar&quot;&gt;2: Cross-project Navigation Bar&lt;/h2&gt;

&lt;p&gt;We wanted a way for readers to quickly discover the other sites that were
available to them. All of our sites have side-navigation-bars to help readers
navigate within a particular site, but now they also have a top-navigation-bar
to help them navigate between projects.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/docs-navbar-sidebar.png&quot; width=&quot;100%&quot; alt=&quot;adding a navbar to dask docs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This navigation bar is managed independently from all of the documentation projects at
our new Sphinx theme.&lt;/p&gt;

&lt;h2 id=&quot;3-dask-sphinx-theme&quot;&gt;3: Dask Sphinx Theme&lt;/h2&gt;

&lt;p&gt;To give a uniform sense of style we developed our own Sphinx HTML theme. This
inherits from ReadTheDocs’ theme, but with changed styling to match Dask color
and visual style. We publish this theme as a &lt;a href=&quot;https://pypi.org/project/dask-sphinx-theme/&quot;&gt;package on
PyPI&lt;/a&gt; that all of our projects’
Sphinx builds can import and use if they want. We can change style in this one
package and publish to PyPI and all of the projects will pick up those changes
on their next build without having to copy stylesheets around to different
repositories.&lt;/p&gt;

&lt;p&gt;This allows several different projects to evolve content (which they care
about) and build process separately from style (which they typically don’t care
as much about). We have a single style sheet that gets used everywhere easily.&lt;/p&gt;

&lt;h2 id=&quot;4-move-dask-blogging-to-blogdaskorg&quot;&gt;4: Move Dask Blogging to blog.dask.org&lt;/h2&gt;

&lt;p&gt;Previously most announcements about Dask were written and published from one of
the maintainers’ personal blogs. This split information about the project and
made it hard for people to discover good content. There also wasn’t a good way
for a community member to suggest a blog for distribution to the general
community, other than by starting their own.&lt;/p&gt;

&lt;p&gt;Now we have an official blog at &lt;a href=&quot;https://blog.dask.org&quot;&gt;blog.dask.org&lt;/a&gt; which
serves files submitted to
&lt;a href=&quot;https://github.com/dask/dask-blog&quot;&gt;github.com/dask/dask-blog&lt;/a&gt;. These posts
are simple markdown files that should be easy for people to generate. For
example the source for this post is available at
&lt;a href=&quot;https://github.com/dask/dask-blog/blob/gh-pages/_posts/2018-09-27-docs-refactor.md&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;github.com/dask/dask-blog/blob/gh-pages/_posts/2018-09-27-docs-refactor.md&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We encourage community members to share posts about work they’ve done with Dask
by submitting pull requests to that repository.&lt;/p&gt;

&lt;h2 id=&quot;5-host-examples-as-both-static-html-and-live-binder-sessions&quot;&gt;5: Host Examples as both static HTML and live Binder sessions&lt;/h2&gt;

&lt;p&gt;The Dask community maintains a set of example notebooks that show people how to
use Dask in a variety of ways. These notebooks live at
&lt;a href=&quot;https://github.com/dask/dask-examples&quot;&gt;github.com/dask/dask-examples&lt;/a&gt; and are
easy for users to download and run.&lt;/p&gt;

&lt;p&gt;To get more value from these notebooks we now expose them in two additional
ways:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;As static HTML at &lt;a href=&quot;https://examples.dask.org&quot;&gt;examples.dask.org&lt;/a&gt;, rendered
with the &lt;a href=&quot;https://nbsphinx.readthedocs.io/en/latest/&quot;&gt;nbsphinx&lt;/a&gt; plugin.&lt;/p&gt;

    &lt;p&gt;Seeing them statically rendered and being able to quickly navigate between
them really increases the pleasure of exploring them. We hope that this
encourages users to explore more broadly.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;As live-runnable notebooks on the cloud using &lt;a href=&quot;https://mybinder.org&quot;&gt;mybinder.org&lt;/a&gt;.
You can play with any of these notebooks by clicking on this button:
&lt;a href=&quot;https://mybinder.org/v2/gh/dask/dask-examples/main?urlpath=lab&quot;&gt;&lt;img src=&quot;https://mybinder.org/badge.svg&quot; alt=&quot;Binder&quot; /&gt;&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;This allows people to explore more deeply. Also, because we’ve connected
up the Dask JupyterLab extension to this environment, users get an
immediate instinctual experience of what parallel computing feels like (if
you haven’t used the dask dashboard during computation you really should
give that link a try).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now that these examples get much more exposure we hope that this encourages
community members to submit new examples. We hope that by providing
infrastructure more content creators will come as well.&lt;/p&gt;

&lt;p&gt;We also encourage other projects to take a look at what we’ve done in
&lt;a href=&quot;https://github.com/dask/dask-examples&quot;&gt;github.com/dask/dask-examples&lt;/a&gt;. We
think that this model might be broadly useful across other projects.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Thank you for reading. We hope that this post pushes readers to re-explore
Dask’s documentation, and that it pushes developers to consider some of the
approaches above for their own projects.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Development Log</title>
   <link href="https://blog.dask.org/2018/09/17/dask-dev"/>
   <updated>2018-09-17T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/09/17/dask-dev</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To increase transparency I’m trying to blog more often about the current work
going on around Dask and related projects. Nothing here is ready for
production. This blogpost is written in haste, so refined polish should not be
expected.&lt;/p&gt;

&lt;p&gt;Since the last update in the &lt;a href=&quot;/2018/09/05/dask-0.19.0&quot;&gt;0.19.0 release blogpost&lt;/a&gt; two weeks ago we’ve seen activity in the following areas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Update Dask examples to use JupyterLab on Binder&lt;/li&gt;
  &lt;li&gt;Render Dask examples into static HTML pages for easier viewing&lt;/li&gt;
  &lt;li&gt;Consolidate and unify disparate documentation&lt;/li&gt;
  &lt;li&gt;Retire the &lt;a href=&quot;https://hdfs3.readthedocs.io/en/latest/&quot;&gt;hdfs3 library&lt;/a&gt; in favor of the solution in &lt;a href=&quot;https://arrow.apache.org/docs/python/filesystems.html&quot;&gt;Apache Arrow&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Continue work on hyper-parameter selection for incrementally trained models&lt;/li&gt;
  &lt;li&gt;Publish two small bugfix releases&lt;/li&gt;
  &lt;li&gt;Blogpost from the Pangeo community about combining Binder with Dask&lt;/li&gt;
  &lt;li&gt;Skein/Yarn Update&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;1-update-dask-examples-to-use-jupyterlab-extension&quot;&gt;1: Update Dask Examples to use JupyterLab extension&lt;/h2&gt;

&lt;p&gt;The new &lt;a href=&quot;https://github.com/dask/dask-labextension&quot;&gt;dask-labextension&lt;/a&gt; embeds
Dask’s dashboard plots into a JupyterLab session so that you can get easy
access to information about your computations from Jupyter directly. This was
released a few weeks ago as part of the previous release post.&lt;/p&gt;

&lt;p&gt;However since then we’ve hooked this up to our live examples system that lets
users try out Dask on a small cloud instance using
&lt;a href=&quot;https://mybinder.org&quot;&gt;mybinder.org&lt;/a&gt;. If you want to try out Dask and
JupyterLab together then head here:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://mybinder.org/v2/gh/dask/dask-examples/main?urlpath=lab&quot;&gt;&lt;img src=&quot;https://mybinder.org/badge.svg&quot; alt=&quot;Binder&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/ian-r-rose&quot;&gt;Ian Rose&lt;/a&gt; for managing this.&lt;/p&gt;

&lt;h2 id=&quot;2-render-dask-examples-as-static-documentation&quot;&gt;2: Render Dask Examples as static documentation&lt;/h2&gt;

&lt;p&gt;Using the &lt;a href=&quot;https://nbsphinx.readthedocs.io/en/0.3.5/&quot;&gt;nbsphinx&lt;/a&gt; Sphinx
extension to automatically run and render Jupyter Notebooks we’ve turned our
live examples repository into static documentation for easy viewing.&lt;/p&gt;

&lt;p&gt;These examples are currently available at
&lt;a href=&quot;https://dask.org/dask-examples/&quot;&gt;https://dask.org/dask-examples/&lt;/a&gt; but will
soon be available at &lt;a href=&quot;https://dask.org/dask-examples/&quot;&gt;examples.dask.org&lt;/a&gt; and
from the navbar at all dask pages.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://tomaugspurger.github.io/&quot;&gt;Tom Augspurger&lt;/a&gt; for putting this
together.&lt;/p&gt;

&lt;h2 id=&quot;3-consolidate-documentation-under-a-single-org-and-style&quot;&gt;3: Consolidate documentation under a single org and style&lt;/h2&gt;

&lt;p&gt;Dask documentation is currently spread out in many small hosted sites, each
associated to a particular subpackage like dask-ml, dask-kubernetes,
dask-distributed, etc.. This eases development (developers are encouraged to
modify documentation as they modify code) but results in a fragmented
experience because users don’t know how to discover and efficiently explore our
full documentation.&lt;/p&gt;

&lt;p&gt;To resolve this we’re doing two things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Moving all sites under the dask.org domain&lt;/p&gt;

    &lt;p&gt;Anaconda Inc, the company that employs several of the Dask developers
(myself included) recently donated the domain &lt;a href=&quot;http://dask.org&quot;&gt;dask.org&lt;/a&gt;
to NumFOCUS. We’ve been slowly moving over all of our independent sites to
use that location for our documentation.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Develop a uniform Sphinx theme &lt;a href=&quot;http://github.com/dask/dask-sphinx-theme&quot;&gt;dask-sphinx-theme&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;This has both uniform styling and also includes a navbar that gets
automatically shared between the projects. The navbar makes it easy to
discover and explore content and is something that we can keep up-to-date
in a single repository.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can see how this works by going to any of the Dask sites, like
&lt;a href=&quot;http://docs.dask.org/en/latest/docs.html&quot;&gt;docs.dask.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://tomaugspurger.github.io/&quot;&gt;Tom Augspurger&lt;/a&gt; for managing this
work and &lt;a href=&quot;http://andy.terrel.us/&quot;&gt;Andy Terrel&lt;/a&gt; for patiently handling things on
the NumFOCUS side and domain name side.&lt;/p&gt;

&lt;h2 id=&quot;4-retire-the-hdfs3-library&quot;&gt;4: Retire the hdfs3 library&lt;/h2&gt;

&lt;p&gt;For years the Dask community has maintained the
&lt;a href=&quot;https://hdfs3.readthedocs.io/en/latest/&quot;&gt;hdfs3&lt;/a&gt; library that allows for native
access to the Hadoop file system from Python. This used Pivotal’s libhdfs3
library written in C++ and was, for a long while the only performant way to
maturely manipulate HDFS from Python.&lt;/p&gt;

&lt;p&gt;Since then though PyArrow has developed efficient bindings to the standard
libhdfs library and exposed it through their Pythonic &lt;a href=&quot;https://arrow.apache.org/docs/python/filesystems.html#hadoop-file-system-hdfs&quot;&gt;file system
interface&lt;/a&gt;,
which is fortunately Dask-compatible.&lt;/p&gt;

&lt;p&gt;We’ve been telling people to use the Arrow solution for a while now and thought
we’d now do so officially
(see &lt;a href=&quot;https://github.com/dask/hdfs3/pull/170&quot;&gt;dask/hdfs3 #170&lt;/a&gt;). As of the
last bugfix release Dask will use Arrow by default and, while the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hdfs3&lt;/code&gt;
library is still available, Dask maintainers probably won’t spend much time on
it in the future.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://hdfs3.readthedocs.io/en/latest/&quot;&gt;Martin Durant&lt;/a&gt; for building
and maintaining HDFS3 over all this time.&lt;/p&gt;

&lt;h2 id=&quot;5-hyper-parameter-selection-for-incrementally-trained-models&quot;&gt;5: Hyper-parameter selection for incrementally trained models&lt;/h2&gt;

&lt;p&gt;In Dask-ML we continue to work on hyper-parameter selection for models that
implement the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt; API. We’ve built algorithms and infrastructure to
handle this well, and are currently fine tuning API, parameter names, etc..&lt;/p&gt;

&lt;p&gt;If you have any interest in this process, come on over to &lt;a href=&quot;https://github.com/dask/dask-ml/pull/356&quot;&gt;dask/dask-ml #356&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://tomaugspurger.github.io/&quot;&gt;Tom Augspurger&lt;/a&gt; and &lt;a href=&quot;https://stsievert.com/&quot;&gt;Scott
Sievert&lt;/a&gt; for this work.&lt;/p&gt;

&lt;h2 id=&quot;6-two-small-bugfix-releases&quot;&gt;6: Two small bugfix releases&lt;/h2&gt;

&lt;p&gt;We’ve been trying to increase the frequency of bugfix releases while things are
stable. Since our last writing there have been two minor bugfix releases. You
can read more about them here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;7-binder--dask&quot;&gt;7: Binder + Dask&lt;/h2&gt;

&lt;p&gt;The Pangeo community has done work to integrate Binder with Dask and has
written about the process here: &lt;a href=&quot;https://medium.com/pangeo/pangeo-meets-binder-2ea923feb34f&quot;&gt;Pangeo meets Binder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;http://joehamman.com/&quot;&gt;Joe Hamman&lt;/a&gt; for this work and the blogpost.&lt;/p&gt;

&lt;h2 id=&quot;8-skeinyarn-update&quot;&gt;8: Skein/Yarn Update&lt;/h2&gt;

&lt;p&gt;The Dask-Yarn connection to deploy Dask on Hadoop clusters uses a library
&lt;a href=&quot;https://jcrist.github.io/skein/&quot;&gt;Skein&lt;/a&gt; to easily manage Yarn jobs from
Python.&lt;/p&gt;

&lt;p&gt;Skein has seen a lot of activity over the last few weeks, including the
following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A Web UI for the project. See &lt;a href=&quot;https://github.com/jcrist/skein/pull/68&quot;&gt;jcrist/skein #68&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;A Tensorflow on Yarn project from Criteo that uses Skein. See
&lt;a href=&quot;https://github.com/criteo/tf-yarn&quot;&gt;github.com/criteo/tf-yarn&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This work is mostly managed by &lt;a href=&quot;http://jcrist.github.io/&quot;&gt;Jim Crist&lt;/a&gt; and other
Skein contributors.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Release 0.19.0</title>
   <link href="https://blog.dask.org/2018/09/05/dask-0.19.0"/>
   <updated>2018-09-05T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/09/05/dask-0.19.0</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m pleased to announce the release of Dask version 0.19.0. This is a major
release with bug fixes and new features. The last release was 0.18.2 on July
23rd. This blogpost outlines notable changes since the last release blogpost
for 0.18.0 on June 14th.&lt;/p&gt;

&lt;p&gt;You can conda install Dask:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install dask
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or pip install from PyPI:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask[complete] --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Full changelogs are available here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;notable-changes&quot;&gt;Notable Changes&lt;/h2&gt;

&lt;p&gt;A ton of work has happened over the past two months, but most of the changes
are small and diffuse. Stability, feature parity with upstream libraries (like
Numpy and Pandas), and performance have all significantly improved, but in ways
that are difficult to condense into blogpost form.&lt;/p&gt;

&lt;p&gt;That being said, here are a few of the more exciting changes in the new
release.&lt;/p&gt;

&lt;h3 id=&quot;python-versions&quot;&gt;Python Versions&lt;/h3&gt;

&lt;p&gt;We’ve dropped official support for Python 3.4 and added official support for
Python 3.7.&lt;/p&gt;

&lt;h3 id=&quot;deploy-on-hadoop-clusters&quot;&gt;Deploy on Hadoop Clusters&lt;/h3&gt;

&lt;p&gt;Over the past few months &lt;a href=&quot;https://jcrist.github.io/&quot;&gt;Jim Crist&lt;/a&gt; has bulit a
suite of tools to deploy applications on YARN, the primary cluster manager used
in Hadoop clusters.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://conda.github.io/conda-pack/&quot;&gt;Conda-pack&lt;/a&gt;: packs up Conda
environments for redistribution to distributed clusters, especially when
Python or Conda may not be present.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jcrist.github.io/skein/&quot;&gt;Skein&lt;/a&gt;: easily launches and manages YARN
applications from non-JVM systems&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-yarn.readthedocs.io/en/latest/&quot;&gt;Dask-Yarn&lt;/a&gt;: a thin library
around Skein to launch and manage Dask clusters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jim has written about Skein and Dask-Yarn in two recent blogposts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jcrist.github.io/dask-on-yarn&quot;&gt;jcrist.github.io/dask-on-yarn&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jcrist.github.io/introducing-skein.html&quot;&gt;jcrist.github.io/introducing-skein.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;implement-actors&quot;&gt;Implement Actors&lt;/h3&gt;

&lt;p&gt;Some advanced workloads want to directly manage and mutate state on workers. A
task-based framework like Dask can be forced into this kind of workload using
long-running-tasks, but it’s an uncomfortable experience.&lt;/p&gt;

&lt;p&gt;To address this we’ve added an experimental Actors framework to Dask alongside
the standard task-scheduling system. This provides reduced latencies, removes
scheduling overhead, and provides the ability to directly mutate state on a
worker, but loses niceties like resilience and diagnostics.
The idea to adopt Actors was shamelessly stolen from the &lt;a href=&quot;http://ray.readthedocs.io/en/latest/&quot;&gt;Ray Project&lt;/a&gt; :)&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;actor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;future&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can read more about actors in the &lt;a href=&quot;https://distributed.readthedocs.io/en/latest/actors.html&quot;&gt;Actors documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;dashboard-improvements&quot;&gt;Dashboard improvements&lt;/h3&gt;

&lt;p&gt;The Dask dashboard is a critical tool to understand distributed performance.
There are a few accessibility issues that trip up beginning users that we’ve
addressed in this release.&lt;/p&gt;

&lt;h4 id=&quot;save-task-stream-plots&quot;&gt;Save task stream plots&lt;/h4&gt;

&lt;p&gt;You can now save a task stream record by wrapping a computation in the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get_task_stream&lt;/code&gt; context manager.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_task_stream&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;processes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datasets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timeseries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_task_stream&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plot&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;save&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;my-task-stream.html&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;key&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;(&apos;make-timeseries-edc372a35b317f328bf2bb5e636ae038&apos;, 0)&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&apos;nbytes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8175440&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&apos;startstops&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;compute&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1535661384.2876947&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1535661384.3366017&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)],&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&apos;status&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;OK&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&apos;thread&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;139754603898624&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&apos;worker&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;inproc://192.168.50.100/15417/2&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This gives you the start and stop time of every task on every worker done
during that time. It also saves that data as an HTML file that you can share
with others. This is very valuable for communicating performance issues within
a team. I typically upload the HTML file as a gist and then share it with
rawgit.com&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ gist my-task-stream.html
https://gist.github.com/f48a121bf03c869ec586a036296ece1a
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;iframe src=&quot;https://rawgit.com/mrocklin/f48a121bf03c869ec586a036296ece1a/raw/d2c1a83d5dc62996eeabca495d5284e324d71d0c/my-task-stream.html&quot; width=&quot;800&quot; height=&quot;400&quot;&gt;&lt;/iframe&gt;

&lt;h4 id=&quot;robust-to-different-screen-sizes&quot;&gt;Robust to different screen sizes&lt;/h4&gt;

&lt;p&gt;The Dashboard’s layout was designed to be used on a single screen, side-by-side
with a Jupyter notebook. This is how many Dask developers operate when working
on a laptop, however it is not how many users operate for one of two reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;They are working in an office setting where they have several screens&lt;/li&gt;
  &lt;li&gt;They are new to Dask and uncomfortable splitting their screen into two
halves&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In these cases the styling of the dashboard becomes odd. Fortunately, &lt;a href=&quot;https://github.com/canavandl&quot;&gt;Luke
Canavan&lt;/a&gt; and &lt;a href=&quot;https://github.com/dsludwig&quot;&gt;Derek
Ludwig&lt;/a&gt; recently improved the CSS for the
dashboard considerably, allowing it to switch between narrow and wide screens.
Here is a snapshot.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/dashboard-widescreen.png&quot;&gt;&lt;img src=&quot;/images/dashboard-widescreen.png&quot; width=&quot;70%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4 id=&quot;jupyter-lab-extension&quot;&gt;Jupyter Lab Extension&lt;/h4&gt;

&lt;p&gt;You can now embed Dashboard panes directly within Jupyter Lab using the newly
updated &lt;a href=&quot;https://github.com/dask/dask-labextension/&quot;&gt;dask-labextension&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jupyter labextension install dask-labextension
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This allows you to layout your own dashboard directly within JupyterLab. You
can combine plots from different pages, control their sizing, and so on. You
will need to provide the address of the dashboard server
(&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:8787&lt;/code&gt; by default on local machines) but after that
everything should persist between sessions. Now when I open up JupyterLab and
start up a Dask Client, I get this:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/dashboard-jupyterlab.png&quot;&gt;&lt;img src=&quot;/images/dashboard-jupyterlab.png&quot; width=&quot;70%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/ian-r-rose&quot;&gt;Ian Rose&lt;/a&gt; for doing most of the work
here.&lt;/p&gt;

&lt;h2 id=&quot;outreach&quot;&gt;Outreach&lt;/h2&gt;

&lt;h3 id=&quot;dask-stories&quot;&gt;Dask Stories&lt;/h3&gt;

&lt;p&gt;People who use Dask have been writing about their experiences at &lt;a href=&quot;https://dask-stories.readthedocs.io/en/latest/&quot;&gt;Dask
Stories&lt;/a&gt;. In the last couple
months the following people have written about and contributed their experience:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-stories.readthedocs.io/en/latest/sidewalk-labs.html&quot;&gt;Civic Modelling at Sidewalk Labs&lt;/a&gt; by &lt;a href=&quot;https://github.com/bnaul&quot;&gt;Brett Naul&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-stories.readthedocs.io/en/latest/mosquito-sequencing.html&quot;&gt;Genome Sequencing for Mosquitoes&lt;/a&gt; by &lt;a href=&quot;http://alimanfoo.github.io/about/&quot;&gt;Alistair Miles&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-stories.readthedocs.io/en/latest/fullspectrum.html&quot;&gt;Lending and Banking at Full Spectrum&lt;/a&gt; by &lt;a href=&quot;https://www.linkedin.com/in/hussainsultan/&quot;&gt;Hussain Sultan&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-stories.readthedocs.io/en/latest/icecube-cosmic-rays.html&quot;&gt;Detecting Cosmic Rays at IceCube&lt;/a&gt; by &lt;a href=&quot;https://github.com/jrbourbeau&quot;&gt;James Bourbeau&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-stories.readthedocs.io/en/latest/pangeo.html&quot;&gt;Large Data Earth Science at Pangeo&lt;/a&gt; by &lt;a href=&quot;http://rabernat.github.io/&quot;&gt;Ryan Abernathey&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-stories.readthedocs.io/en/latest/hydrologic-modeling.html&quot;&gt;Hydrological Modelling at the National Center for Atmospheric Research&lt;/a&gt; by &lt;a href=&quot;http://joehamman.com/about/&quot;&gt;Joe Hamman&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-stories.readthedocs.io/en/latest/network-modeling.html&quot;&gt;Mobile Networks Modeling&lt;/a&gt; by &lt;a href=&quot;https://www.linkedin.com/in/lalwanisameer/&quot;&gt;Sameer Lalwani&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-stories.readthedocs.io/en/latest/satellite-imagery.html&quot;&gt;Satellite Imagery Processing at the Space Science and Engineering Center&lt;/a&gt; by &lt;a href=&quot;http://github.com/djhoese&quot;&gt;David Hoese&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These stories help people understand where Dask is and is not applicable, and
provide useful context around how it gets used in practice. We welcome further
contributions to this project. It’s very valuable to the broader community.&lt;/p&gt;

&lt;h3 id=&quot;dask-examples&quot;&gt;Dask Examples&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/dask/dask-examples&quot;&gt;Dask-Examples repository&lt;/a&gt; maintains
easy-to-run examples using Dask on a small machine, suitable for an entry-level
laptop or for a small cloud instance. These are hosted on
&lt;a href=&quot;https://mybinder.org&quot;&gt;mybinder.org&lt;/a&gt; and are integrated into our documentation.
A number of new examples have arisen recently, particularly in machine
learning. We encourage people to try them out by clicking the link below.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://mybinder.org/v2/gh/dask/dask-examples/main&quot;&gt;&lt;img src=&quot;https://mybinder.org/badge.svg&quot; alt=&quot;Binder&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;other-projects&quot;&gt;Other Projects&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;a href=&quot;https://dask-image.readthedocs.io/en/latest/&quot;&gt;dask-image&lt;/a&gt; project was
recently released. It includes a number of image processing routines around
dask arrays.&lt;/p&gt;

    &lt;p&gt;This project is mostly maintained by &lt;a href=&quot;https://github.com/jakirkham&quot;&gt;John Kirkham&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://dask-ml.readthedocs.io/en/latest/&quot;&gt;Dask-ML&lt;/a&gt; saw a recent bugfix release&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;a href=&quot;http://epistasislab.github.io/tpot/&quot;&gt;TPOT&lt;/a&gt; library for automated
machine learning recently published a new release that adds Dask support to
parallelize their model training. More information is available on the
&lt;a href=&quot;http://epistasislab.github.io/tpot/using/#parallel-training-with-dask&quot;&gt;TPOT documentation&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;Since June 14th, the following people have contributed to the following repositories:&lt;/p&gt;

&lt;p&gt;The core Dask repository for parallel algorithms:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Anderson Banihirwe&lt;/li&gt;
  &lt;li&gt;Andre Thrill&lt;/li&gt;
  &lt;li&gt;Aurélien Ponte&lt;/li&gt;
  &lt;li&gt;Christoph Moehl&lt;/li&gt;
  &lt;li&gt;Cloves Almeida&lt;/li&gt;
  &lt;li&gt;Daniel Rothenberg&lt;/li&gt;
  &lt;li&gt;Danilo Horta&lt;/li&gt;
  &lt;li&gt;Davis Bennett&lt;/li&gt;
  &lt;li&gt;Elliott Sales de Andrade&lt;/li&gt;
  &lt;li&gt;Eric Bonfadini&lt;/li&gt;
  &lt;li&gt;GPistre&lt;/li&gt;
  &lt;li&gt;George Sakkis&lt;/li&gt;
  &lt;li&gt;Guido Imperiale&lt;/li&gt;
  &lt;li&gt;Hans Moritz Günther&lt;/li&gt;
  &lt;li&gt;Henrique Ribeiro&lt;/li&gt;
  &lt;li&gt;Hugo&lt;/li&gt;
  &lt;li&gt;Irina Truong&lt;/li&gt;
  &lt;li&gt;Itamar Turner-Trauring&lt;/li&gt;
  &lt;li&gt;Jacob Tomlinson&lt;/li&gt;
  &lt;li&gt;James Bourbeau&lt;/li&gt;
  &lt;li&gt;Jan Margeta&lt;/li&gt;
  &lt;li&gt;Javad&lt;/li&gt;
  &lt;li&gt;Jeremy Chen&lt;/li&gt;
  &lt;li&gt;Jim Crist&lt;/li&gt;
  &lt;li&gt;Joe Hamman&lt;/li&gt;
  &lt;li&gt;John Kirkham&lt;/li&gt;
  &lt;li&gt;John Mrziglod&lt;/li&gt;
  &lt;li&gt;Julia Signell&lt;/li&gt;
  &lt;li&gt;Marco Rossi&lt;/li&gt;
  &lt;li&gt;Mark Harfouche&lt;/li&gt;
  &lt;li&gt;Martin Durant&lt;/li&gt;
  &lt;li&gt;Matt Lee&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Mike Neish&lt;/li&gt;
  &lt;li&gt;Robert Sare&lt;/li&gt;
  &lt;li&gt;Scott Sievert&lt;/li&gt;
  &lt;li&gt;Stephan Hoyer&lt;/li&gt;
  &lt;li&gt;Tobias de Jong&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;WZY&lt;/li&gt;
  &lt;li&gt;Yu Feng&lt;/li&gt;
  &lt;li&gt;Yuval Langer&lt;/li&gt;
  &lt;li&gt;minebogy&lt;/li&gt;
  &lt;li&gt;nmiles2718&lt;/li&gt;
  &lt;li&gt;rtobar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dask/distributed repository for distributed computing:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Anderson Banihirwe&lt;/li&gt;
  &lt;li&gt;Aurélien Ponte&lt;/li&gt;
  &lt;li&gt;Bartosz Marcinkowski&lt;/li&gt;
  &lt;li&gt;Dave Hirschfeld&lt;/li&gt;
  &lt;li&gt;Derek Ludwig&lt;/li&gt;
  &lt;li&gt;Dror Birkman&lt;/li&gt;
  &lt;li&gt;Guillaume EB&lt;/li&gt;
  &lt;li&gt;Jacob Tomlinson&lt;/li&gt;
  &lt;li&gt;Joe Hamman&lt;/li&gt;
  &lt;li&gt;John Kirkham&lt;/li&gt;
  &lt;li&gt;Loïc Estève&lt;/li&gt;
  &lt;li&gt;Luke Canavan&lt;/li&gt;
  &lt;li&gt;Marius van Niekerk&lt;/li&gt;
  &lt;li&gt;Martin Durant&lt;/li&gt;
  &lt;li&gt;Matt Nicolls&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Mike DePalatis&lt;/li&gt;
  &lt;li&gt;Olivier Grisel&lt;/li&gt;
  &lt;li&gt;Phil Tooley&lt;/li&gt;
  &lt;li&gt;Ray Bell&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Yu Feng&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dask/dask-examples repository for easy-to-run examples:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Albert DeFusco&lt;/li&gt;
  &lt;li&gt;Dan Vatterott&lt;/li&gt;
  &lt;li&gt;Guillaume EB&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Scott Sievert&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;mholtzscher&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>High level performance of Pandas, Dask, Spark, and Arrow</title>
   <link href="https://blog.dask.org/2018/08/28/dataframe-performance-high-level"/>
   <updated>2018-08-28T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/08/28/dataframe-performance-high-level</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;question&quot;&gt;Question&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;How does Dask dataframe performance compare to Pandas? Also, what about
Spark dataframes and what about Arrow? How do they compare?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I get this question every few weeks. This post is to avoid repetition.&lt;/p&gt;

&lt;h2 id=&quot;caveats&quot;&gt;Caveats&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;This answer is likely to change over time. I’m writing this in August 2018&lt;/li&gt;
  &lt;li&gt;This question and answer are very high level.
More technical answers are possible, but not contained here.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;answers&quot;&gt;Answers&lt;/h2&gt;

&lt;h3 id=&quot;pandas&quot;&gt;Pandas&lt;/h3&gt;

&lt;p&gt;If you’re coming from Python and have smallish datasets then Pandas is the
right choice. It’s usable, widely understood, efficient, and well maintained.&lt;/p&gt;

&lt;h3 id=&quot;benefits-of-parallelism&quot;&gt;Benefits of Parallelism&lt;/h3&gt;

&lt;p&gt;The performance benefit (or drawback) of using a parallel dataframe like Dask
dataframes or Spark dataframes over Pandas will differ based on the kinds of
computations you do:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;If you’re doing small computations then Pandas is always the right choice.
The administrative costs of parallelizing will outweigh any benefit.
You should not parallelize if your computations are taking less than, say,
100ms.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;For simple operations like filtering, cleaning, and aggregating large data
you should expect linear speedup by using a parallel dataframes.&lt;/p&gt;

    &lt;p&gt;If you’re on a 20-core computer you might expect a 20x speedup. If you’re
on a 1000-core cluster you might expect a 1000x speedup, assuming that you
have a problem big enough to spread across 1000 cores. As you scale up
administrative overhead will increase, so you should expect the speedup to
decrease a bit.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;For complex operations like distributed joins it’s more complicated. You
might get linear speedups like above, or you might even get slowdowns.
Someone experienced in database-like computations and parallel computing
can probably predict pretty well which computations will do well.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, configuration may be required. Often people find that parallel
solutions don’t meet expectations when they first try them out. Unfortunately
most distributed systems require some configuration to perform optimally.&lt;/p&gt;

&lt;h3 id=&quot;there-are-other-options-to-speed-up-pandas&quot;&gt;There are other options to speed up Pandas&lt;/h3&gt;

&lt;p&gt;Many people looking to speed up Pandas don’t need parallelism. There are often
several other tricks like encoding text data, using efficient file formats,
avoiding groupby.apply, and so on that are more effective at speeding up Pandas
than switching to parallelism.&lt;/p&gt;

&lt;h3 id=&quot;comparing-apache-spark-and-dask&quot;&gt;Comparing Apache Spark and Dask&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Assuming that yes, I do want parallelism, should I choose Apache Spark, or Dask dataframes?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is often decided more by cultural preferences (JVM vs Python,
all-in-one-tool vs integration with other tools) than performance differences,
but I’ll try to outline a few things here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Spark dataframes will be much better when you have large SQL-style queries
(think 100+ line queries) where their query optimizer can kick in.&lt;/li&gt;
  &lt;li&gt;Dask dataframes will be much better when queries go beyond typical database
queries. This happens most often in time series, random access, and other
complex computations.&lt;/li&gt;
  &lt;li&gt;Spark will integrate better with JVM and data engineering technology.
Spark will also come with everything pre-packaged. Spark is its own
ecosystem.&lt;/li&gt;
  &lt;li&gt;Dask will integrate better with Python code. Dask is designed to integrate
with other libraries and pre-existing systems. If you’re coming from an
existing Pandas-based workflow then it’s usually much easier to evolve to
Dask.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generally speaking for most operations you’ll be fine using either one. People
often choose between Pandas/Dask and Spark based on cultural preference.
Either they have people that really like the Python ecosystem, or they have
people that really like the Spark ecosystem.&lt;/p&gt;

&lt;p&gt;Dataframes are also only a small part of each project. Spark and Dask both do
many other things that aren’t dataframes. For example Spark has a graph
analysis library, Dask doesn’t. Dask supports multi-dimensional arrays, Spark
doesn’t. Spark is generally higher level and all-in-one while Dask is
lower-level and focuses on integrating into other tools.&lt;/p&gt;

&lt;p&gt;For more information, see &lt;a href=&quot;http://dask.pydata.org/en/latest/spark.html&quot;&gt;Dask’s “Comparison to Spark documentation”&lt;/a&gt;
or &lt;a href=&quot;https://www.youtube.com/watch?v=jR0Y7NqKJs8&amp;amp;list=PLJ0vO2F_f6OAE1xiEUE7DwMFWbdLCbN3P&amp;amp;index=11&amp;amp;t=413s&quot;&gt;this interview with Steppingblocks&lt;/a&gt;, a data analytics company, on why they switched from Spark to Dask.&lt;/p&gt;

&lt;h3 id=&quot;apache-arrow&quot;&gt;Apache Arrow&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;What about Arrow? Is Arrow faster than Pandas?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This question doesn’t quite make sense… &lt;em&gt;yet&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Arrow is not a replacement for Pandas. Today Arrow is useful to people
building &lt;em&gt;systems&lt;/em&gt; and not to analysts directly like Pandas. Arrow is used to
move data between different computational systems and file formats. Arrow does
not do computation today, but is commonly used as a component in other
libraries that do do computation. For example, if you use Pandas or Spark or
Dask today you may be using Arrow without knowing it. Today Arrow is more
useful for other libraries than it is to end-users.&lt;/p&gt;

&lt;p&gt;However, this is likely to change in the future. Arrow developers plan
to write computational code around Arrow that we would expect to be faster than
the code in either Pandas or Spark. This is probably a year or two away
though. There will probably be some effort to make this semi-compatible with
Pandas, but it’s much too early to tell.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Building SAGA optimization for Dask arrays</title>
   <link href="https://blog.dask.org/2018/08/07/incremental-saga"/>
   <updated>2018-08-07T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/08/07/incremental-saga</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;https://www.ethz.ch/en.html&quot;&gt;ETH Zurich&lt;/a&gt;, &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda
Inc&lt;/a&gt;, and the &lt;a href=&quot;https://bids.berkeley.edu/&quot;&gt;Berkeley Institute for Data
Science&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At a recent Scikit-learn/Scikit-image/Dask sprint at BIDS, &lt;a href=&quot;http://fa.bianp.net&quot;&gt;Fabian Pedregosa&lt;/a&gt; (a
machine learning researcher and Scikit-learn developer) and Matthew
Rocklin (Dask core developer) sat down together to develop an implementation of the incremental optimization algorithm
&lt;a href=&quot;https://arxiv.org/pdf/1407.0202.pdf&quot;&gt;SAGA&lt;/a&gt; on parallel Dask datasets. The result is a sequential algorithm that can be run on any dask array, and so allows the data to be stored on disk or even distributed among different machines.&lt;/p&gt;

&lt;p&gt;It was interesting both to see how the algorithm performed and also to see
the ease and challenges to run a research algorithm on a Dask distributed dataset.&lt;/p&gt;

&lt;h3 id=&quot;start&quot;&gt;Start&lt;/h3&gt;

&lt;p&gt;We started with an initial implementation that Fabian had written for Numpy
arrays using Numba. The following code solves an optimization problem of the form&lt;/p&gt;

\[min_x \sum_{i=1}^n f(a_i^t x, b_i)\]

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numba&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;njit&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.linear_model.sag&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_auto_step_size&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.utils.extmath&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;row_norms&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;njit&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;deriv_logistic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# derivative of logistic loss
&lt;/span&gt;    &lt;span class=&quot;c1&quot;&gt;# same as in lightning (with minus sign)
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;phi&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;exp_t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;phi&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exp_t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exp_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;phi&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;njit&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;SAGA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
  SAGA algorithm

  A : n_samples x n_features numpy array
  b : n_samples numpy array with values -1 or 1
  &quot;&quot;&quot;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# vector of coefficients
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_auto_step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;row_norms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;squared&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;log&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# sample randomly
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# .. inner iteration ..
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;grad_i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deriv_logistic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# .. update coefficients ..
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;delta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grad_i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;# .. update memory terms ..
&lt;/span&gt;            &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grad_i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grad_i&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# monitor convergence
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;gradient norm:&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;norm&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This implementation is a simplified version of the &lt;a href=&quot;https://github.com/openopt/copt/blob/master/copt/randomized.py&quot;&gt;SAGA
implementation&lt;/a&gt;
that Fabian uses regularly as part of his research, and that assumes that $f$ is the &lt;a href=&quot;https://en.wikipedia.org/wiki/Loss_functions_for_classification#Logistic_loss&quot;&gt;logistic loss&lt;/a&gt;, i.e., $f(z) = \log(1 + \exp(-z))$. It can be used to solve problems with other values of $f$ by overwriting the function &lt;code&gt;deriv_logistic&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We wanted to apply it across a parallel Dask array by applying it to each chunk of the Dask array, a smaller Numpy array, one at a time, carrying along a set of parameters along the way.&lt;/p&gt;

&lt;h3 id=&quot;development-process&quot;&gt;Development Process&lt;/h3&gt;

&lt;p&gt;In order to better understand the challenges of writing Dask algorithms, Fabian
did most of the actual coding to start. Fabian is good example of a researcher who
knows how to program well and how to design ML algorithms, but has no direct
exposure to the Dask library. This was an educational opportunity both for
Fabian and for Matt. Fabian learned how to use Dask, and Matt learned how to
introduce Dask to researchers like Fabian.&lt;/p&gt;

&lt;h3 id=&quot;step-1-build-a-sequential-algorithm-with-pure-functions&quot;&gt;Step 1: Build a sequential algorithm with pure functions&lt;/h3&gt;

&lt;p&gt;To start we actually didn’t use Dask at all, instead, Fabian modified his implementation in a few ways:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It should operate over a list of Numpy arrays. A list of Numpy arrays is similar to a Dask array, but simpler.&lt;/li&gt;
  &lt;li&gt;It should separate blocks of logic into separate functions, these will
eventually become tasks, so they should be sizable chunks of work. In this
case, this led to the creating of the function &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_chunk_saga&lt;/code&gt; that
performs an iteration of the SAGA algorithm on a subset of the data.&lt;/li&gt;
  &lt;li&gt;These functions should not modify their inputs, nor should they depend on
global state. All information that those functions require (like
the parameters that we’re learning in our algorithm) should be
explicitly provided as inputs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These requested modifications affect performance a bit, we end up making more
copies of the parameters and more copies of intermediate state. In terms of
programming difficulty this took a bit of time (around a couple hours) but is a
straightforward task that Fabian didn’t seem to find challenging or foreign.&lt;/p&gt;

&lt;p&gt;These changes resulted in the following code:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numba&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;njit&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.utils.extmath&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;row_norms&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.linear_model.sag&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_auto_step_size&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;njit&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_chunk_saga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f_deriv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;# Make explicit copies of inputs
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;copy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Sample randomly
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shuffle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# .. inner iteration ..
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;grad_i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f_deriv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# .. update coefficients ..
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;delta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grad_i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# .. update memory terms ..
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;grad_i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;grad_i&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;full_saga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
  &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
  data: list of (A, b), where A is a n_samples x n_features
  numpy array and b is a n_samples numpy array
  &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_auto_step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;row_norms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;squared&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;log&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_chunk_saga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deriv_logistic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;step-2-apply-daskdelayed&quot;&gt;Step 2: Apply dask.delayed&lt;/h3&gt;

&lt;p&gt;Once functions neither modified their inputs nor relied on global state we went
over a &lt;a href=&quot;https://mybinder.org/v2/gh/dask/dask-examples/main?urlpath=%2Ftree%2Fdelayed.ipynb&quot;&gt;dask.delayed example&lt;/a&gt;,
and then applied the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@dask.delayed&lt;/code&gt; decorator to the functions that
Fabian had written. Fabian did this at first in about five minutes and to our
mutual surprise, things actually worked&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                               &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- New
&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;njit&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_chunk_saga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f_deriv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;full_saga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                      &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- New
&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_chunk_saga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deriv_logistic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- Changed
&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                 &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- New
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, they didn’t work &lt;em&gt;that well&lt;/em&gt;. When we took a look at the dask
dashboard we find that there is a lot of dead space, a sign that we’re still
doing a lot of computation on the client side.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/saga-1.png&quot;&gt;
  &lt;img src=&quot;/images/saga-1.png&quot; width=&quot;90%&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;step-3-diagnose-and-add-more-daskdelayed-calls&quot;&gt;Step 3: Diagnose and add more dask.delayed calls&lt;/h3&gt;

&lt;p&gt;While things worked, they were also fairly slow. If you notice the
dashboard plot above you’ll see that there is plenty of white in between
colored rectangles. This shows that there are long periods where none of the
workers is doing any work.&lt;/p&gt;

&lt;p&gt;This is a common sign that we’re mixing work between the workers (which shows
up on the dashbaord) and the client. The solution to this is usually more
targetted use of dask.delayed. Dask delayed is trivial to start using, but
does require some experience to use well. It’s important to keep track of
which operations and variables are delayed and which aren’t. There is some
cost to mixing between them.&lt;/p&gt;

&lt;p&gt;At this point Matt stepped in and added delayed in a few more places and the
dashboard plot started looking cleaner.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                               &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- New
&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;njit&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;_chunk_saga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f_deriv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradient&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;full_saga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;][&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                      &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- New
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;         &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- Changed
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;#  Changed
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zeros&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_features&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- Changed
&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_auto_step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;row_norms&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;squared&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
                &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;log&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
             &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;                    &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- Changed
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;0.3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- Changed
&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;max_iter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_chunk_saga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_samples&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;deriv_logistic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- Changed
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; \
            &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;memory_gradients&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gradient_average&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;step_size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# New
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;                         &lt;span class=&quot;c1&quot;&gt;# &amp;lt;&amp;lt;&amp;lt;---- changed
&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/images/saga-2.png&quot;&gt;
  &lt;img src=&quot;/images/saga-2.png&quot; width=&quot;90%&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From a dask perspective this now looks good. We see that one &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt;
call is active at any given time with no large horizontal gaps between
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt; calls. We’re not getting any parallelism (this is just a
sequential algorithm) but we don’t have much dead space. The model seems to
jump between the various workers, processing on a chunk of data before moving
on to new data.&lt;/p&gt;

&lt;h3 id=&quot;step-4-profile&quot;&gt;Step 4: Profile&lt;/h3&gt;

&lt;p&gt;The dashboard image above gives confidence that our algorithm is operating as
it should. The block-sequential nature of the algorithm comes out cleanly, and
the gaps between tasks are very short.&lt;/p&gt;

&lt;p&gt;However, when we look at the profile plot of the computation across all of our
cores (Dask constantly runs a profiler on all threads on all workers to get
this information) we see that most of our time is spent compiling Numba code.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/saga-profile.png&quot;&gt;
  &lt;img src=&quot;/images/saga-profile.png&quot; width=&quot;100%&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We started a conversation for this on the &lt;a href=&quot;https://github.com/numba/numba/issues/3026&quot;&gt;numba issue
tracker&lt;/a&gt; which has since been
resolved. That same computation over the same time now looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/saga-3.png&quot;&gt;
  &lt;img src=&quot;/images/saga-3.png&quot; width=&quot;90%&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The tasks, which used to take seconds, now take tens of milliseconds, so we can
process through many more chunks in the same amount of time.&lt;/p&gt;

&lt;h3 id=&quot;future-work&quot;&gt;Future Work&lt;/h3&gt;

&lt;p&gt;This was a useful experience to build an interesting algorithm. Most of the
work above took place in an afternoon. We came away from this activity
with a few tasks of our own:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Build a normal Scikit-Learn style estimator class for this algorithm
so that people can use it without thinking too much about delayed objects,
and can instead just use dask arrays or dataframes&lt;/li&gt;
  &lt;li&gt;Integrate some of Fabian’s research on this algorithm that improves performance with
&lt;a href=&quot;https://arxiv.org/pdf/1707.06468.pdf&quot;&gt;sparse data and in multi-threaded environments&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Think about how to improve the learning experience so that dask.delayed can
teach new users how to use it correctly&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;links&quot;&gt;Links&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/5282dcf47505e2a1d214fd15c7da0ec3&quot;&gt;Notebooks for different stages of SAGA+Dask implementation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/scisprints/2018_05_sklearn_skimage_dask&quot;&gt;Scikit-Learn/Image + Dask Sprint issue tracker&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/scisprints/2018_05_sklearn_skimage_dask&quot;&gt;Paper on SAGA algorithm&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/openopt/copt/blob/master/copt/randomized.py&quot;&gt;Fabian’s more fully featured non-Dask SAGA implementation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/numba/numba/issues/3026&quot;&gt;Numba issue on repeated deserialization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Development Log</title>
   <link href="https://blog.dask.org/2018/08/02/dask-dev"/>
   <updated>2018-08-02T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/08/02/dask-dev</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To increase transparency I’m trying to blog more often about the current work
going on around Dask and related projects. Nothing here is ready for
production. This blogpost is written in haste, so refined polish should not be
expected.&lt;/p&gt;

&lt;p&gt;Over the last two weeks we’ve seen activity in the following areas:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;An experimental Actor solution for stateful processing&lt;/li&gt;
  &lt;li&gt;Machine learning experiments with hyper-parameter selection and parameter
servers.&lt;/li&gt;
  &lt;li&gt;Development of more preprocessing transformers&lt;/li&gt;
  &lt;li&gt;Statistical profiling of the distributed scheduler’s internal event loop
thread and internal optimizations&lt;/li&gt;
  &lt;li&gt;A new release of dask-yarn&lt;/li&gt;
  &lt;li&gt;A new narrative on dask-stories about modelling mobile networks&lt;/li&gt;
  &lt;li&gt;Support for LSF clusters in dask-jobqueue&lt;/li&gt;
  &lt;li&gt;Test suite cleanup for intermittent failures&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;stateful-processing-with-actors&quot;&gt;Stateful processing with Actors&lt;/h3&gt;

&lt;p&gt;Some advanced workloads want to directly manage and mutate state on workers. A
task-based framework like Dask can be forced into this kind of workload using
long-running-tasks, but it’s an uncomfortable experience. To address this
we’ve been adding an experimental Actors framework to Dask alongside the
standard task-scheduling system. This provides reduced latencies, removes
scheduling overhead, and provides the ability to directly mutate state on a
worker, but loses niceties like resilience and diagnostics.&lt;/p&gt;

&lt;p&gt;The idea to adopt Actors was shamelessly stolen from the &lt;a href=&quot;http://ray.readthedocs.io/en/latest/&quot;&gt;Ray Project&lt;/a&gt; :)&lt;/p&gt;

&lt;p&gt;Work for Actors is happening in &lt;a href=&quot;https://github.com/dask/distributed/pull/2133&quot;&gt;dask/distributed #2133&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;actor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;future&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;future&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;machine-learning-experiments&quot;&gt;Machine learning experiments&lt;/h2&gt;

&lt;h3 id=&quot;hyper-parameter-optimization-on-incrementally-trained-models&quot;&gt;Hyper parameter optimization on incrementally trained models&lt;/h3&gt;

&lt;p&gt;Many Scikit-Learn-style estimators feature a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt; method that enables
incremental training on batches of data. This is particularly well suited for
systems like Dask array or Dask dataframe, that are built from many batches of
Numpy arrays or Pandas dataframes. It’s a nice fit because all of the
computational algorithm work is already done in Scikit-Learn, Dask just has to
administratively move models around to data and call scikit-learn (or other
machine learning models that follow the fit/transform/predict/score API). This
approach provides a nice community interface between parallelism and machine
learning developers.&lt;/p&gt;

&lt;p&gt;However, this training is inherently sequential because the model only trains
on one batch of data at a time. We’re leaving a lot of processing power on the
table.&lt;/p&gt;

&lt;p&gt;To address this we can combine incremental training with hyper-parameter
selection and train several models on the same data at the same time. This is
often required anyway, and lets us be more efficient with our computation.&lt;/p&gt;

&lt;p&gt;However there are many ways to do incremental training with hyper-parameter
selection, and the right algorithm likely depends on the problem at hand.
This is an active field of research and so it’s hard for a general project like
Dask to pick and implement a single method that works well for everyone. There
is probably a handful of methods that will be necessary with various options on
them.&lt;/p&gt;

&lt;p&gt;To help experimentation here we’ve been experimenting with some lower-level
tooling that we think will be helpful in a variety of cases. This accepts a
policy from the user as a Python function that gets scores from recent
evaluations, and asks for how much further to progress on each set of
hyper-parameters before checking in again. This allows us to model a few
common situations like random search with early stopping conditions, successive
halving, and variations of those easily without having to write any Dask code:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/pull/288&quot;&gt;dask/dask-ml #288&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/mrocklin/4c95bd26d15281d82e0bf2d27632e294&quot;&gt;Notebook showing a few approaches&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/stsievert/c675b3a237a60efbd01dcb112e29115b&quot;&gt;Another notebook showing convergence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This work is done by &lt;a href=&quot;http://github.com/stsievert&quot;&gt;Scott Sievert&lt;/a&gt; and myself&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/1320475/43540881-7184496a-95b8-11e8-975a-96c2f17ee269.png&quot; width=&quot;70%&quot; alt=&quot;Successive halving and random search&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;parameter-servers&quot;&gt;Parameter Servers&lt;/h3&gt;

&lt;p&gt;To improve the speed of training large models &lt;a href=&quot;https://github.com/stsievert&quot;&gt;Scott
Sievert&lt;/a&gt; has been using Actors (mentioned above)
to develop simple examples for parameter servers. These are helping to
identify and motivate performance and diagnostic improvements improvements
within Dask itself:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/ff8a1df9300a82f15a2704e913469522.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;These parameter servers manage the communication of models produced by
different workers, and leave the computation to the underlying deep learning
library. This is ongoing work.&lt;/p&gt;

&lt;h3 id=&quot;dataframe-preprocessing-transformers&quot;&gt;Dataframe Preprocessing Transformers&lt;/h3&gt;

&lt;p&gt;We’ve started to orient some of the Dask-ML work around case studies. Our
first, written by &lt;a href=&quot;https://github.com/stsievert&quot;&gt;Scott Sievert&lt;/a&gt;, uses the
Criteo dataset for ads. It’s a good example of a combined dense/sparse dataset
that can be somewhat large (around 1TB). The first challenge we’re running
into is preprocessing. These have lead to a few preprocessing improvements:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/pull/310&quot;&gt;Label Encoder supports Pandas Categorical dask/dask-ml #310&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/pull/11&quot;&gt;Add Imputer with mean and median strategies dask/dask-ml #11&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/pull/313&quot;&gt;Ad OneHotEncoder dask/dask-ml #313&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/pull/122&quot;&gt;Add Hashing Vectorizer dask/dask-ml #122&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/pull/315&quot;&gt;Add ColumnTransformer dask/dask-ml #315&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of these are also based off of improved dataframe handling features in the
upcoming 0.20 release for Scikit-Learn.&lt;/p&gt;

&lt;p&gt;This work is done by
&lt;a href=&quot;https://github.com/dask/dask-ml/pull/122&quot;&gt;Roman Yurchak&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jrbourbeau&quot;&gt;James Bourbeau&lt;/a&gt;,
&lt;a href=&quot;https://github.com/daniel-severo&quot;&gt;Daniel Severo&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/TomAugspurger&quot;&gt;Tom Augspurger&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;profiling-the-main-thread&quot;&gt;Profiling the main thread&lt;/h3&gt;

&lt;p&gt;Profiling concurrent code is hard. Traditional profilers like CProfile become
confused by passing control between all of the different coroutines. This
means that we haven’t done a very comprehensive job of profiling and tuning the
distributed scheduler and workers. Statistical profilers on the other hand
tend to do a bit better. We’ve taken the statistical profiler that we usually
use on Dask worker threads (available in the dashboard on the “Profile” tab)
and have applied it to the central administrative threads running the Tornado
event loop as well. This has highlighted a few issues that we weren’t able to
spot before, and should hopefully result in reduced overhead in future
releases.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/pull/2144&quot;&gt;dask/distributed #2144&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/51582394/which-functions-are-free-when-profiling-tornado-asyncio&quot;&gt;stackoverflow.com/questions/51582394/which-functions-are-free-when-profiling-tornado-asyncio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/306380/43368136-4574f46c-930d-11e8-9d5b-6f4b4f6aeffe.png&quot; width=&quot;70%&quot; alt=&quot;Profile of event loop thread&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;new-release-of-dask-yarn&quot;&gt;New release of Dask-Yarn&lt;/h3&gt;

&lt;p&gt;There is a new release of &lt;a href=&quot;http://dask-yarn.readthedocs.io/en/latest&quot;&gt;Dask-Yarn&lt;/a&gt;
and the underlying library for managing Yarn jobs,
&lt;a href=&quot;https://jcrist.github.io/skein/&quot;&gt;Skein&lt;/a&gt;. These include a number of bug-fixes
and improved concurrency primitives for YARN applications. The new features are
documented &lt;a href=&quot;https://jcrist.github.io/skein/key-value-store.html&quot;&gt;here&lt;/a&gt;, and were
implemented in &lt;a href=&quot;https://github.com/jcrist/skein/pull/40&quot;&gt;jcrist/skein #40&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This work was done by &lt;a href=&quot;https://jcrist.github.io/&quot;&gt;Jim Crist&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;support-for-lsf-clusters-in-dask-jobqueue&quot;&gt;Support for LSF clusters in Dask-Jobqueue&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://dask-jobqueue.readthedocs.io/en/latest/&quot;&gt;Dask-jobqueue&lt;/a&gt; supports Dask
use on traditional HPC cluster managers like SGE, SLURM, PBS, and others.
We’ve recently &lt;a href=&quot;http://dask-jobqueue.readthedocs.io/en/latest/generated/dask_jobqueue.LSFCluster.html#dask_jobqueue.LSFCluster&quot;&gt;added support for LSF clusters&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Work was done in &lt;a href=&quot;https://github.com/dask/dask-jobqueue/pull/78&quot;&gt;dask/dask-jobqueue #78&lt;/a&gt; by &lt;a href=&quot;https://github.com/raybellwaves&quot;&gt;Ray Bell&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;new-dask-story-on-mobile-networks&quot;&gt;New Dask Story on mobile networks&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/&quot;&gt;Dask Stories&lt;/a&gt;
repository holds narrative about how people use Dask.
&lt;a href=&quot;https://www.linkedin.com/in/lalwanisameer/&quot;&gt;Sameer Lalwani&lt;/a&gt;
recently added a story about using Dask to
&lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/network-modeling.html&quot;&gt;model mobile communication networks&lt;/a&gt;.
It’s worth a read.&lt;/p&gt;

&lt;h3 id=&quot;test-suite-cleanup&quot;&gt;Test suite cleanup&lt;/h3&gt;

&lt;p&gt;The dask.distributed test suite has been suffering from intermittent failures
recently. These are tests that fail very infrequently, and so are hard to
catch when writing them, but show up when future unrelated PRs run the test
suite on continuous integration and get failures. They add friction to the
development process, but are expensive to track down (testing distributed
systems is hard).&lt;/p&gt;

&lt;p&gt;We’re taking a bit of time this week to track these down. Progress here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/pull/2146&quot;&gt;dask/distributed #2146&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/pull/2152&quot;&gt;dask/distributed #2152&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Pickle isn't slow, it's a protocol</title>
   <link href="https://blog.dask.org/2018/07/23/protocols-pickle"/>
   <updated>2018-07-23T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/07/23/protocols-pickle</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tl;dr:&lt;/strong&gt; &lt;em&gt;Pickle isn’t slow, it’s a protocol. Protocols are important for
ecosystems.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A recent Dask issue showed that using Dask with PyTorch was
slow because sending PyTorch models between Dask workers took a long time
(&lt;a href=&quot;https://github.com/dask/dask-ml/issues/281&quot;&gt;Dask GitHub issue&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;This turned out to be because serializing PyTorch models with pickle was very
slow (1 MB/s for GPU based models, 50 MB/s for CPU based models). There is no
architectural reason why this needs to be this slow. Every part of the
hardware pipeline is much faster than this.&lt;/p&gt;

&lt;p&gt;We could have fixed this in Dask by special-casing PyTorch models (Dask has
it’s own optional serialization system for performance), but being good
ecosystem citizens, we decided to raise the performance problem in an issue
upstream (&lt;a href=&quot;https://github.com/pytorch/pytorch/issues/9168&quot;&gt;PyTorch Github
issue&lt;/a&gt;). This resulted in a
five-line-fix to PyTorch that turned a 1-50 MB/s serialization bandwidth into a
1 GB/s bandwidth, which is more than fast enough for many use cases (&lt;a href=&quot;https://github.com/pytorch/pytorch/pull/9184&quot;&gt;PR to
PyTorch&lt;/a&gt;).&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;     def __reduce__(self):
&lt;span class=&quot;gd&quot;&gt;-        return type(self), (self.tolist(),)
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+        b = io.BytesIO()
+        torch.save(self, b)
+        return (_load_from_bytes, (b.getvalue(),))
&lt;/span&gt;

&lt;span class=&quot;gi&quot;&gt;+def _load_from_bytes(b):
+    return torch.load(io.BytesIO(b))
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Thanks to the PyTorch maintainers this problem was solved pretty easily.
PyTorch tensors and models now serialize efficiently in Dask or in &lt;em&gt;any other
Python library&lt;/em&gt; that might want to use them in distributed systems like
PySpark, IPython parallel, Ray, or anything else without having to add
special-case code or do anything special. We didn’t solve a Dask problem, we
solved an ecosystem problem.&lt;/p&gt;

&lt;p&gt;However before we solved this problem we discussed things a bit. This comment
stuck with me:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/pytorch/pytorch/issues/9168#issuecomment-402514019&quot;&gt;
  &lt;img src=&quot;/images/pytorch-pickle-is-slow-comment.png&quot; alt=&quot;Github Image of maintainer saying that PyTorch&apos;s pickle implementation is slow&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This comment contains two beliefs that are both very common, and that I find
somewhat counter-productive:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Pickle is slow&lt;/li&gt;
  &lt;li&gt;You should use our specialized methods instead&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’m sort of picking on the PyTorch maintainers here a bit (sorry!) but I’ve
found that they’re quite widespread, so I’d like to address them here.&lt;/p&gt;

&lt;h2 id=&quot;pickle-is-slow&quot;&gt;Pickle is slow&lt;/h2&gt;

&lt;p&gt;Pickle is &lt;em&gt;not&lt;/em&gt; slow. Pickle is a protocol. &lt;em&gt;We&lt;/em&gt; implement pickle. If it’s slow
then it is &lt;em&gt;our&lt;/em&gt; fault, not Pickle’s.&lt;/p&gt;

&lt;p&gt;To be clear, there are many reasons not to use Pickle.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It’s not cross-language&lt;/li&gt;
  &lt;li&gt;It’s not very easy to parse&lt;/li&gt;
  &lt;li&gt;It doesn’t provide random access&lt;/li&gt;
  &lt;li&gt;It’s insecure&lt;/li&gt;
  &lt;li&gt;etc..&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you shouldn’t store your data or create public services using Pickle, but
for things like moving data on a wire it’s a great default choice if you’re
moving strictly from Python processes to Python processes in a trusted and
uniform environment.&lt;/p&gt;

&lt;p&gt;It’s great because it’s as fast as you can make it (up a a memory copy) and
other libraries in the ecosystem can use it without needing to special case
your code into theirs.&lt;/p&gt;

&lt;p&gt;This is the change we did for PyTorch.&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;     def __reduce__(self):
&lt;span class=&quot;gd&quot;&gt;-        return type(self), (self.tolist(),)
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+        b = io.BytesIO()
+        torch.save(self, b)
+        return (_load_from_bytes, (b.getvalue(),))
&lt;/span&gt;

&lt;span class=&quot;gi&quot;&gt;+def _load_from_bytes(b):
+    return torch.load(io.BytesIO(b))
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The slow part wasn’t Pickle, it was the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.tolist()&lt;/code&gt; call within &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__reduce__&lt;/code&gt;
that converted a PyTorch tensor into a list of Python ints and floats. I
suspect that the common belief of “Pickle is just slow” stopped anyone else
from investigating the poor performance here. I was surprised to learn that a
project as active and well maintained as PyTorch hadn’t fixed this already.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;As a reminder, you can implement the pickle protocol by providing the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__reduce__&lt;/code&gt; method on your class. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__reduce__&lt;/code&gt; function returns a
loading function and sufficient arguments to reconstitute your object. Here we
used torch’s existing save/load functions to create a bytestring that we could
pass around.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;just-use-our-specialized-option&quot;&gt;Just use our specialized option&lt;/h2&gt;

&lt;p&gt;Specialized options can be great. They can have nice APIs with many options,
they can tune themselves to specialized communication hardware if it exists
(like RDMA or NVLink), and so on. But people need to learn about them first, and
learning about them can be hard in two ways.&lt;/p&gt;

&lt;h3 id=&quot;hard-for-users&quot;&gt;Hard for users&lt;/h3&gt;

&lt;p&gt;Today we use a large and rapidly changing set of libraries. It’s hard
for users to become experts in all of them. Increasingly we rely on new
libraries making it easy for us by adhering to standard APIs, providing
informative error messages that lead to good behavior, and so on..&lt;/p&gt;

&lt;h3 id=&quot;hard-for-other-libraries&quot;&gt;Hard for other libraries&lt;/h3&gt;

&lt;p&gt;Other libraries that need to interact &lt;em&gt;definitely&lt;/em&gt; won’t read the
documentation, and even if they did it’s not sensible for every library to
special case every other library’s favorite method to turn their objects into
bytes. Ecosystems of libraries depend strongly on the presence of protocols
and a strong consensus around implementing them consistently and efficiently.&lt;/p&gt;

&lt;h2 id=&quot;sometimes-specialized-options-are-appropriate&quot;&gt;Sometimes Specialized Options are Appropriate&lt;/h2&gt;

&lt;p&gt;There &lt;em&gt;are&lt;/em&gt; good reasons to support specialized options. Sometimes you need
more than 1GB/s bandwidth. While this is rare in general (very few pipelines
process faster than 1GB/s/node), it is true in the particular case of PyTorch
when they are doing parallel training on a single machine with multiple
processes. Soumith (PyTorch maintainer) writes the following:&lt;/p&gt;

&lt;p&gt;When sending Tensors over multiprocessing, our custom serializer actually
shortcuts them through shared memory, i.e. it moves the underlying Storages
to shared memory and restores the Tensor in the other process to point to the
shared memory. We did this for the following reasons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Speed:&lt;/strong&gt; we save on memory copies, especially if we amortize the cost of
moving a Tensor to shared memory before sending it into the multiprocessing
Queue. The total cost of actually moving a Tensor from one process to another
ends up being O(1), and independent of the Tensor’s size&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Sharing:&lt;/strong&gt; If Tensor A and Tensor B are views of each other, once we
serialize and send them, we want to preserve this property of them being
views. This is critical for neural-nets where it’s common to re-view the
weights / biases and use them for another. With the default pickle solution,
this property is actually lost.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Development Log, Scipy 2018</title>
   <link href="https://blog.dask.org/2018/07/17/dask-dev"/>
   <updated>2018-07-17T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/07/17/dask-dev</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To increase transparency I’m trying to blog more often about the current work
going on around Dask and related projects. Nothing here is ready for
production. This blogpost is written in haste, so refined polish should not be
expected.&lt;/p&gt;

&lt;p&gt;Last week many Dask developers gathered for the annual SciPy 2018 conference.
As a result, very little work was completed, but many projects were started or
discussed. To reflect this change in activity this blogpost will highlight
possible changes and opportunities for readers to further engage in
development.&lt;/p&gt;

&lt;h2 id=&quot;dask-on-hpc-machines&quot;&gt;Dask on HPC Machines&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://dask-jobqueue.readthedocs.io/&quot;&gt;dask-jobqueue&lt;/a&gt; project was a hit at
the conference. Dask-jobqueue helps people launch Dask on traditional job
schedulers like PBS, SGE, SLURM, Torque, LSF, and others that are commonly
found on high performance computers. These are &lt;em&gt;very common&lt;/em&gt; among scientific,
research, and high performance machine learning groups but commonly a bit hard
to use with anything other than MPI.&lt;/p&gt;

&lt;p&gt;This project came up in the &lt;a href=&quot;https://youtu.be/2rgD5AJsAbE&quot;&gt;Pangeo talk&lt;/a&gt;,
lightning talks, and the Dask Birds of a Feather session.&lt;/p&gt;

&lt;p&gt;During sprints a number of people came up and we went through the process of
configuring Dask on common supercomputers like Cheyenne, Titan, and Cori. This
process usually takes around fifteen minutes and will likely be the subject of
a future blogpost. We published known-good configurations for these clusters
on our &lt;a href=&quot;http://dask-jobqueue.readthedocs.io/en/latest/configurations.html&quot;&gt;configuration documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additionally, there is a &lt;a href=&quot;https://github.com/jupyterhub/batchspawner/issues/101&quot;&gt;JupyterHub
issue&lt;/a&gt; to improve
documentation on best practices to deploy JupyterHub on these machines. The
community has done this well a few times now, and it might be time to write up
something for everyone else.&lt;/p&gt;

&lt;h3 id=&quot;get-involved&quot;&gt;Get involved&lt;/h3&gt;

&lt;p&gt;If you have access to a supercomputer then please try things out. There is a
30-minute Youtube video screencast on the
&lt;a href=&quot;https://dask-jobqueue.readthedocs.io/&quot;&gt;dask-jobqueue&lt;/a&gt; documentation that should
help you get started.&lt;/p&gt;

&lt;p&gt;If you are an administrator on a supercomputer you might consider helping to
build a configuration file and place it in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/dask&lt;/code&gt; for your users. You
might also want to get involved in the &lt;a href=&quot;http://dask-jobqueue.readthedocs.io/en/latest/configurations.html&quot;&gt;JupyterHub on
HPC&lt;/a&gt;
conversation.&lt;/p&gt;

&lt;h2 id=&quot;dask--scikit-learn-talk&quot;&gt;Dask / Scikit-learn talk&lt;/h2&gt;

&lt;p&gt;Olivier Grisel and Tom Augspurger prepared and delivered a great talk on the
current state of the new Dask-ML project.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/ccfsbuqsjgI&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;mybinder-and-bokeh-servers&quot;&gt;MyBinder and Bokeh Servers&lt;/h2&gt;

&lt;p&gt;Not a Dask change, but Min Ragan-Kelley showed how to run services through
&lt;a href=&quot;https://mybinder.org/&quot;&gt;mybinder.org&lt;/a&gt; that are not only Jupyter. As an example,
here is a repository that deploys a Bokeh server application with a single
click.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/minrk/binder-bokeh-server&quot;&gt;Github repository&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mybinder.org/v2/gh/minrk/binder-bokeh-server/master?urlpath=%2Fproxy%2F5006%2Fbokeh-app&quot;&gt;Binder link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think that by composing with Binder Min effectively just created the
free-to-use hosted Bokeh server service. Presumably this same model could be
easily adapted to other applications just as easily.&lt;/p&gt;

&lt;h2 id=&quot;dask-and-automated-machine-learning-with-tpot&quot;&gt;Dask and Automated Machine Learning with TPOT&lt;/h2&gt;

&lt;p&gt;Dask and TPOT developers are discussing paralellizing the
automatic-machine-learning tool &lt;a href=&quot;http://epistasislab.github.io/tpot/&quot;&gt;TPOT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;TPOT uses genetic algorithms to search over a space of scikit-learn style
pipelines to automatically find a decently performing pipeline and model. This
involves a fair amount of computation which Dask can help to parallelize out to
multiple machines.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/EpistasisLab/tpot/issues/304&quot;&gt;Issue: EpistasisLab/tpot #304&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/EpistasisLab/tpot/pull/730&quot;&gt;PR: EpistasisLab/tpot #730&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/QrJlj0VCHys&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h3 id=&quot;get-involved-1&quot;&gt;Get involved&lt;/h3&gt;

&lt;p&gt;Trivial things work now, but to make this efficient we’ll need to dive in a bit
more deeply. Extending that pull request to dive within pipelines would be a
good task if anyone wants to get involved. This would help to share
intermediate results between pipelines.&lt;/p&gt;

&lt;h2 id=&quot;dask-and-scikit-optimize&quot;&gt;Dask and Scikit-Optimize&lt;/h2&gt;

&lt;p&gt;Among various features, &lt;a href=&quot;https://scikit-optimize.github.io/&quot;&gt;Scikit-optimize&lt;/a&gt;
offers a &lt;a href=&quot;https://scikit-optimize.github.io/#skopt.BayesSearchCV&quot;&gt;BayesSearchCV&lt;/a&gt;
object that is like Scikit-Learn’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GridSearchCV&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomSearchCV&lt;/code&gt;, but is a
bit smarter about how to choose new parameters to test given previous results.
Hyper-parameter optimization is a low-hanging fruit for Dask-ML workloads today,
so we investigated how the project might help here.&lt;/p&gt;

&lt;p&gt;So far we’re just experimenting using Scikit-Learn/Dask integration through
joblib to see what opportunities there are. Dicussion among Dask and
Scikit-Optimize developers is happening here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/issues/300&quot;&gt;Issue: dask/dask-ml #300&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;centralize-pydatascipy-tutorials-on-binder&quot;&gt;Centralize PyData/Scipy tutorials on Binder&lt;/h2&gt;

&lt;p&gt;We’re putting a bunch of the PyData/Scipy tutorials on Binder, and hope to
embed snippets of Youtube videos into the notebooks themselves.&lt;/p&gt;

&lt;p&gt;This effort lives here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://pydata-tutorials.readthedocs.io&quot;&gt;pydata-tutorials.readthedocs.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;motivation&quot;&gt;Motivation&lt;/h3&gt;

&lt;p&gt;The PyData and SciPy community delivers tutorials as part of most conferences.
This activity generates both educational Jupyter notebooks and explanatory
videos that teach people how to use the ecosystem.&lt;/p&gt;

&lt;p&gt;However, this content isn’t very discoverable &lt;em&gt;after&lt;/em&gt; the conference. People
can search on Youtube for their topic of choice and hopefully find a link to
the notebooks to download locally, but this is a somewhat noisy process. It’s
not clear which tutorial to choose and it’s difficult to match up the video
with the notebooks during exercises.
We’re probably not getting as much value out of these resources as we could be.&lt;/p&gt;

&lt;p&gt;To help increase access we’re going to try a few things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Produce a centralized website with links to recent tutorials delivered for
each topic&lt;/li&gt;
  &lt;li&gt;Ensure that those notebooks run easily on Binder&lt;/li&gt;
  &lt;li&gt;Embed sections of the talk on Youtube within each notebook so that the
explanation of the section is tied to the exercises&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;get-involved-2&quot;&gt;Get involved&lt;/h3&gt;

&lt;p&gt;This only really works long-term under a community maintenance model. So far
we’ve only done a few hours of work and there is still plenty to do in the
following tasks:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Find good tutorials for inclusion&lt;/li&gt;
  &lt;li&gt;Ensure that they work well on &lt;a href=&quot;https://mybinder.org/&quot;&gt;mybinder.org&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;are self-contained and don’t rely on external scripts to run&lt;/li&gt;
      &lt;li&gt;have an environment.yml or requirements.txt&lt;/li&gt;
      &lt;li&gt;don’t require a lot of resources&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Find video for the tutorial&lt;/li&gt;
  &lt;li&gt;Submit a pull request to the tutorial repository that embeds a link to the
youtube talk at the top cell of the notebook at the proper time for each
notebook&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;dask-actors-and-ray&quot;&gt;Dask, Actors, and Ray&lt;/h2&gt;

&lt;p&gt;I really enjoyed the &lt;a href=&quot;https://youtu.be/D_oz7E4v-U0&quot;&gt;talk on Ray&lt;/a&gt; another
distributed task scheduler for Python. I suspect that Dask will steal ideas
for &lt;a href=&quot;https://github.com/dask/distributed/issues/2109&quot;&gt;actors for stateful operation&lt;/a&gt;.
I hope that Ray takes on ideas for using standard Python interfaces so that
more of the community can adopt it more quickly. I encourage people to check
out the talk and give Ray a try. It’s pretty slick.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/D_oz7E4v-U0&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;planning-conversations-for-dask-ml&quot;&gt;Planning conversations for Dask-ML&lt;/h2&gt;

&lt;p&gt;Dask and Scikit-learn developers had the opportunity to sit down again and
raise a number of issues to help plan near-term development. This focused
mostly around building important case studies to motivate future development,
and identifying algorithms and other projects to target for near-term
integration.&lt;/p&gt;

&lt;h3 id=&quot;case-studies&quot;&gt;Case Studies&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/issues/302&quot;&gt;What is the purpose of a case study: dask/dask-ml #302&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/issues/295&quot;&gt;Case study: Sparse Criteo Dataset: dask/dask-ml #295&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/issues/296&quot;&gt;Case study: Large scale text classification: dask/dask-ml #296&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/issues/297&quot;&gt;Case study: Transfer learning from pre-trained model: dask/dask-ml #297&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;algorithms&quot;&gt;Algorithms&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/issues/299&quot;&gt;Gradient boosted trees with Numba: dask/dask-ml #299&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask-ml/issues/300&quot;&gt;Parallelize Scikit-Optimize for hyperparameter optimization: dask/dask-ml #300&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;get-involved-3&quot;&gt;Get involved&lt;/h3&gt;

&lt;p&gt;We could use help in building out case studies to drive future development in
the project. There are also several algorithmic places to get involved.
Dask-ML is a young and fast-moving project with many opportunities for new
developers to get involved.&lt;/p&gt;

&lt;h2 id=&quot;dask-and-umap-for-low-dimensional-embeddings&quot;&gt;Dask and UMAP for low-dimensional embeddings&lt;/h2&gt;

&lt;p&gt;Leland McKinnes gave a great talk &lt;a href=&quot;https://youtu.be/nq6iPZVUxZU&quot;&gt;Uniform Manifold Approximation and
Projection for Dimensionality Reduction&lt;/a&gt; in which
he lays out a well founded algorithm for dimensionality reduction, similar to
PCA or T-SNE, but with some nice properties. He worked together with some Dask
developers where we identified some challenges due to dask array slicing with
random-ish slices.&lt;/p&gt;

&lt;p&gt;A proposal to fix this problem lives here, if anyone wants a fun problem to work on:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/issues/3409#issuecomment-405254656&quot;&gt;dask/dask #3409 (comment)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/nq6iPZVUxZU&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;dask-stories&quot;&gt;Dask stories&lt;/h2&gt;

&lt;p&gt;We soft-launched &lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/&quot;&gt;Dask Stories&lt;/a&gt;
a webpage and project to collect user and share stories about how people use
Dask in practice. We’re also delivering a separate blogpost about this today.&lt;/p&gt;

&lt;p&gt;See blogpost: &lt;a href=&quot;/2018/07/16/dask-stories&quot;&gt;Who uses Dask?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you use Dask and want to share your story we would absolutely welcome your
experience. Having people like yourself share how they use Dask is incredibly
important for the project.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Who uses Dask?</title>
   <link href="https://blog.dask.org/2018/07/16/dask-stories"/>
   <updated>2018-07-16T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/07/16/dask-stories</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;People often ask general questions like “Who uses Dask?” or more specific
questions like the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;For what applications do people use Dask dataframe?&lt;/li&gt;
  &lt;li&gt;How many machines do people often use with Dask?&lt;/li&gt;
  &lt;li&gt;How far does Dask scale?&lt;/li&gt;
  &lt;li&gt;Does dask get used on imaging data?&lt;/li&gt;
  &lt;li&gt;Does anyone use Dask with Kubernetes/Yarn/SGE/Mesos/… ?&lt;/li&gt;
  &lt;li&gt;Does anyone in the insurance industry use Dask?&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This yields interesting and productive conversations where new users can dive
into historical use cases which informs their choices if and how they use the
project in the future.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;New users can learn a lot from existing users.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To further enable this conversation we’ve made a new tiny project,
&lt;a href=&quot;https://dask-stories.readthedocs.io&quot;&gt;dask-stories&lt;/a&gt;. This is a small
documentation page where people can submit how they use Dask and have that
published for others to see.&lt;/p&gt;

&lt;p&gt;To seed this site six generous users have written down how their group uses
Dask. You can read about them here:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/sidewalk-labs.html&quot;&gt;Sidewalk Labs: Civic Modeling&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/mosquito-sequencing.html&quot;&gt;Genome Sequencing for Mosquitoes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/fullspectrum.html&quot;&gt;Full Spectrum: Credit and Banking&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/icecube-cosmic-rays.html&quot;&gt;Ice Cube: Detecting Cosmic Rays&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/pangeo.html&quot;&gt;Pangeo: Earth Science&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/hydrologic-modeling.html&quot;&gt;NCAR: Hydrologic Modeling&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’ve focused on a few questions, available in &lt;a href=&quot;http://dask-stories.readthedocs.io/en/latest/template.html&quot;&gt;our
template&lt;/a&gt; that
focus on problems over technology, and include negative as well as positive
feedback to get a complete picture.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Who am I?&lt;/li&gt;
  &lt;li&gt;What problem am I trying to solve?&lt;/li&gt;
  &lt;li&gt;How Dask helps?&lt;/li&gt;
  &lt;li&gt;What pain points did I run into with Dask?&lt;/li&gt;
  &lt;li&gt;What technology do I use around Dask?&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;easy-to-contribute&quot;&gt;Easy to Contribute&lt;/h3&gt;

&lt;p&gt;Contributions to this site are simple Markdown documents submitted as pull
requests to
&lt;a href=&quot;https://github.com/dask/dask-stories&quot;&gt;github.com/dask/dask-stories&lt;/a&gt;. The site
is then built with ReadTheDocs and updated immediately. We tried to make this
as smooth and familiar to our existing userbase as possible.&lt;/p&gt;

&lt;p&gt;This is important. Sharing real-world experiences like this are probably more
valuable than code contributions to the Dask project at this stage. Dask is
more technically mature than it is well-known. Users look to other users to
help them understand a project (think of every time you’ve Googled for “&lt;em&gt;some
tool&lt;/em&gt; in &lt;em&gt;some topic&lt;/em&gt;”)&lt;/p&gt;

&lt;p&gt;If you use Dask today in an interesting way then please share your story.
The world would love to hear your voice.&lt;/p&gt;

&lt;p&gt;If you maintain another project you might consider implementing the same model.
I hope that this proves successful enough for other projects in the ecosystem
to reuse.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Development Log</title>
   <link href="https://blog.dask.org/2018/07/08/dask-dev"/>
   <updated>2018-07-08T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/07/08/dask-dev</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To increase transparency I’m trying to blog more often about the current work
going on around Dask and related projects. Nothing here is ready for
production. This blogpost is written in haste, so refined polish should not be
expected.&lt;/p&gt;

&lt;p&gt;Current efforts for June 2018 in Dask and Dask-related projects include
the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Yarn Deployment&lt;/li&gt;
  &lt;li&gt;More examples for machine learning&lt;/li&gt;
  &lt;li&gt;Incremental machine learning&lt;/li&gt;
  &lt;li&gt;HPC Deployment configuration&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;yarn-deployment&quot;&gt;Yarn deployment&lt;/h3&gt;

&lt;p&gt;Dask developers often get asked &lt;em&gt;How do I deploy Dask on my Hadoop/Spark/Hive
cluster?&lt;/em&gt;. We haven’t had a very good answer until recently.&lt;/p&gt;

&lt;p&gt;Most Hadoop/Spark/Hive clusters are actually &lt;em&gt;Yarn&lt;/em&gt; clusters. Yarn is the most
common cluster manager used by many clusters that are typically used to run
Hadoop/Spark/Hive jobs including any cluster purchased from a vendor like
Cloudera or Hortonworks. If your application can run on Yarn then it can be a
first class citizen here.&lt;/p&gt;

&lt;p&gt;Unfortunately Yarn has really only been accessible through a Java API, and so
has been difficult for Dask to interact with. That’s changing now with a few
projects, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask-yarn.readthedocs.io&quot;&gt;dask-yarn&lt;/a&gt;: an easy way to launch Dask on
Yarn clusters&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jcrist.github.io/skein/&quot;&gt;skein&lt;/a&gt;: an easy way to launch generic
services on Yarn clusters (this is primarily what backs dask-yarn)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://conda.github.io/conda-pack/&quot;&gt;conda-pack&lt;/a&gt;: an easy way to bundle
together a conda package into a redeployable environment, such as is useful
when launching Python applications on Yarn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This work is all being done by &lt;a href=&quot;http://jcrist.github.io/&quot;&gt;Jim Crist&lt;/a&gt; who is, I
believe, currently writing up a blogpost about the topic at large. Dask-yarn
was soft-released last week though, so people should give it a try and report
feedback on the &lt;a href=&quot;https://github.com/dask/dask-yarn&quot;&gt;dask-yarn issue tracker&lt;/a&gt;.
If you ever wanted direct help on your cluster, now is the right time because
Jim is working on this actively and is not yet drowned in user requests so
generally has a fair bit of time to investigate particular cases.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_yarn&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;YarnCluster&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Create a cluster where each worker has two cores and eight GB of memory
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;YarnCluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;environment.tar.gz&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;worker_vcores&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                      &lt;span class=&quot;n&quot;&gt;worker_memory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;8GB&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Scale out to ten such workers
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Connect to the cluster
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cluster&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;more-examples-for-machine-learning&quot;&gt;More examples for machine learning&lt;/h3&gt;

&lt;p&gt;Dask maintains a Binder of simple examples that show off various ways to use
the project. This allows people to click a link on the web and quickly be
taken to a Jupyter notebook running on the cloud. It’s a fun way to quickly
experience and learn about a new project.&lt;/p&gt;

&lt;p&gt;Previously we had a single example for arrays, dataframes, delayed, machine
learning, etc.&lt;/p&gt;

&lt;p&gt;Now &lt;a href=&quot;https://stsievert.com/&quot;&gt;Scott Sievert&lt;/a&gt; is expanding the examples within
the machine learning section. He has submitted the following two so far:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://mybinder.org/v2/gh/dask/dask-examples/main?urlpath=%2Ftree%2Fmachine-learning%2Fincremental.ipynb&quot;&gt;Incremental training with Scikit-Learn and large datasets&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mybinder.org/v2/gh/dask/dask-examples/main?urlpath=%2Ftree%2Fmachine-learning%2Fxgboost.ipynb&quot;&gt;Dask and XGBoost&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I believe he’s planning on more. If you use
&lt;a href=&quot;http://dask-ml.readthedocs.io/en/latest/&quot;&gt;dask-ml&lt;/a&gt; and have recommendations or
want to help, you might want to engage in the &lt;a href=&quot;https://github.com/dask/dask-ml/issues/new&quot;&gt;dask-ml issue
tracker&lt;/a&gt; or &lt;a href=&quot;https://github.com/dask/dask-examples/issues/new&quot;&gt;dask-examples issue
tracker&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;incremental-training&quot;&gt;Incremental training&lt;/h3&gt;

&lt;p&gt;The incremental training mentioned as an example above is also new-ish. This
is a Scikit-Learn style meta-estimator that wraps around other estimators that
support the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;partial_fit&lt;/code&gt; method. It enables training on large datasets in an
incremental or batchwise fashion.&lt;/p&gt;

&lt;h4 id=&quot;before&quot;&gt;Before&lt;/h4&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.linear_model&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SGDClassifier&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;sgd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SGDClassifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;sgd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;partial_fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;after&quot;&gt;After&lt;/h4&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.linear_model&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SGDClassifier&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_ml.wrappers&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Incremental&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;sgd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SGDClassifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;inc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Incremental&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sgd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;analysis&quot;&gt;Analysis&lt;/h4&gt;

&lt;p&gt;From a parallel computing perspective this is a very simple and un-sexy way of
doing things. However my understanding is that it’s also quite pragmatic. In
a distributed context we leave a lot of possible computation on the table (the
solution is inherently sequential) but it’s fun to see the model jump around
the cluster as it absorbs various chunks of data and then moves on.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/1320475/42237033-2bddf11e-7eec-11e8-88c5-5f0ebd2fb4df.png&quot; width=&quot;70%&quot; alt=&quot;Incremental training with Dask-ML&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There’s ongoing work on how best to combine this with other work like pipelines
and hyper-parameter searches to fill in the extra computation.&lt;/p&gt;

&lt;p&gt;This work was primarily done by &lt;a href=&quot;https://tomaugspurger.github.io/&quot;&gt;Tom Augspurger&lt;/a&gt;
with help from &lt;a href=&quot;https://stsievert.com/&quot;&gt;Scott Sievert&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dask-user-stories&quot;&gt;Dask User Stories&lt;/h3&gt;

&lt;p&gt;Dask developers are often asked “Who uses Dask?”. This is a hard question to
answer because, even though we’re inundated with thousands of requests for
help from various companies and research groups, it’s never fully clear who
minds having their information shared with others.&lt;/p&gt;

&lt;p&gt;We’re now trying to crowdsource this information in a more explicit way by
having users tell their own stories. Hopefully this helps other users in their
field understand how Dask can help and when it might (or might not) be useful
to them.&lt;/p&gt;

&lt;p&gt;We originally collected this information in a &lt;a href=&quot;https://goo.gl/forms/JEebEFTOPrWa3P4h1&quot;&gt;Google
Form&lt;/a&gt; but have since then moved it to a
&lt;a href=&quot;https://github.com/mrocklin/dask-stories&quot;&gt;Github repository&lt;/a&gt;. Eventually
we’ll publish this as a &lt;a href=&quot;https://github.com/mrocklin/dask-stories/issues/7&quot;&gt;proper web
site&lt;/a&gt; and include it in our
documentation.&lt;/p&gt;

&lt;p&gt;If you use Dask and want to share your story this is a great way to contribute
to the project. Arguably Dask needs more help with spreading the word than it
does with technical solutions.&lt;/p&gt;

&lt;h3 id=&quot;hpc-deployments&quot;&gt;HPC Deployments&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;http://dask-jobqueue.readthedocs.io/en/latest/&quot;&gt;Dask Jobqueue&lt;/a&gt; package for
deploying Dask on traditional HPC machines is nearing another release. We’ve
changed around a lot of the parameters and configuration options in order to
improve the onboarding experience for new users. It has been going very
smoothly in recent engagements with new groups, but will mean a breaking
change for existing users of the sub-project.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Scaling Limits</title>
   <link href="https://blog.dask.org/2018/06/26/dask-scaling-limits"/>
   <updated>2018-06-26T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/06/26/dask-scaling-limits</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;history&quot;&gt;History&lt;/h2&gt;

&lt;p&gt;For the first year of Dask’s life it focused exclusively on single node
parallelism. We felt then that efficiently supporting 100+GB datasets on
personal laptops or 1TB datasets on large workstations was a sweet spot for
productivity, especially when avoiding the pain of deploying and configuring
distributed systems. We still believe in the efficiency of single-node
parallelism, but in the years since, Dask has extended itself to support larger
distributed systems.&lt;/p&gt;

&lt;p&gt;After that first year, Dask focused equally on both single-node and distributed
parallelism. We maintain &lt;a href=&quot;http://dask.pydata.org/en/latest/scheduling.html&quot;&gt;two entirely separate
schedulers&lt;/a&gt;, one optimized for
each case. This allows Dask to be very simple to use on single machines, but
also scale up to thousand-node clusters and 100+TB datasets when needed with
the same API.&lt;/p&gt;

&lt;p&gt;Dask’s distributed system has a single central scheduler and many distributed
workers. This is a common architecture today that scales out to a few thousand
nodes. Roughly speaking Dask scales about the same as a system like Apache
Spark, but less well than a high-performance system like MPI.&lt;/p&gt;

&lt;h2 id=&quot;an-example&quot;&gt;An Example&lt;/h2&gt;

&lt;p&gt;Most Dask examples in blogposts or talks are on modestly sized datasets,
usually in the 10-50GB range. This, combined with Dask’s history with
medium-data on single-nodes may have given people a more humble impression of
Dask than is appropriate.&lt;/p&gt;

&lt;p&gt;As a small nudge, here is an example using Dask to interact with 50 36-core
nodes on an artificial terabyte dataset.&lt;/p&gt;

&lt;iframe width=&quot;700&quot; height=&quot;394&quot; src=&quot;https://www.youtube.com/embed/nH_AQo8WdKw&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;This is a common size for a typical modestly sized Dask cluster. We usually
see Dask deployment sizes either in the tens of machines (usually with Hadoop
style or ad-hoc enterprise clusters), or in the few-thousand range (usually
with high performance computers or cloud deployments). We’re showing the
modest case here just due to lack of resources. Everything in that example
should work fine scaling out a couple extra orders of magnitude.&lt;/p&gt;

&lt;h2 id=&quot;challenges-to-scaling-out&quot;&gt;Challenges to Scaling Out&lt;/h2&gt;

&lt;p&gt;For the rest of the article we’ll talk about common causes that we see today
that get in the way of scaling out. These are collected from experience
working both with people in the open source community, as well as private
contracts.&lt;/p&gt;

&lt;h3 id=&quot;simple-map-reduce-style&quot;&gt;Simple Map-Reduce style&lt;/h3&gt;

&lt;p&gt;If you’re doing simple map-reduce style parallelism then things will be pretty
smooth out to a large number of nodes. However, there are still some
limitations to keep in mind:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The scheduler will have at least one, and possibly a few connections open
to each worker. You’ll want to ensure that your machines can have many
open file handles at once. Some Linux distributions cap this at 1024 by
default, but it is easy to change.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The scheduler has an overhead of around 200 microseconds per task.
So if each task takes one second then your scheduler can saturate 5000
cores, but if each task takes only 100ms then your scheduler can only
saturate around 500 cores, and so on. Task duration imposes an inversely
proportional constraint on scaling.&lt;/p&gt;

    &lt;p&gt;If you want to scale larger than this then your tasks will need to
start doing more work in each task to avoid overhead. Often this involves
moving inner for loops within tasks rather than spreading them out to many
tasks.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;more-complex-algorithms&quot;&gt;More complex algorithms&lt;/h3&gt;

&lt;p&gt;If you’re doing more complex algorithms (which is common among Dask users) then
many more things can break along the way. High performance computing isn’t
about doing any one thing well, it’s about doing &lt;em&gt;nothing badly&lt;/em&gt;. This section
lists a few issues that arise for larger deployments:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Dask collection algorithms may be suboptimal.&lt;/p&gt;

    &lt;p&gt;The parallel algorithms in Dask-array/bag/dataframe/ml are &lt;em&gt;pretty&lt;/em&gt; good,
but as Dask scales out to larger clusters and its algorithms are used by
more domains we invariably find that small corners of the API fail beyond a
certain point. Luckily these are usually pretty easy to fix after they are
reported.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The graph size may grow too large for the scheduler&lt;/p&gt;

    &lt;p&gt;The metadata describing your computation has to all fit on a single
machine, the Dask scheduler. This metadata, the task graph, can grow big
if you’re not careful. It’s nice to have a scheduler process with at least
a few gigabytes of memory if you’re going to be processing million-node
task graphs. A task takes up around 1kB of memory &lt;em&gt;if&lt;/em&gt; you’re careful to
avoid closing over any unnecessary local data.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The graph serialization time may become annoying for interactive use&lt;/p&gt;

    &lt;p&gt;Again, if you have million node task graphs you’re going to be serializaing
them up and passing them from the client to the scheduler. This is &lt;em&gt;fine&lt;/em&gt;,
assuming they fit at both ends, but can take up some time and limit
interactivity. If you press &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compute&lt;/code&gt; and nothing shows up on the
dashboard for a minute or two, this is what’s happening.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The interactive dashboard plots stop being as useful&lt;/p&gt;

    &lt;p&gt;Those beautiful plots on the dashboard were mostly designed for deployments
with 1-100 nodes, but not 1000s. Seeing the start and stop time of every
task of a million-task computation just isn’t something that our brains can
fully understand.&lt;/p&gt;

    &lt;p&gt;This is something that we would like to improve. If anyone out there is
interested in scalable performance diagnostics, please get involved.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Other components that you rely on, like distributed storage, may also start
to break&lt;/p&gt;

    &lt;p&gt;Dask provides users more power than they’re accustomed to.
It’s easy for them to accidentally clobber some other component of their
systems, like distributed storage, a local database, the network, and so
on, with too many requests.&lt;/p&gt;

    &lt;p&gt;Many of these systems provide abstractions that are very well tested and
stable for normal single-machine use, but that quickly become brittle when
you have a thousand machines acting on them with the full creativity of a
novice user. Dask provies some primitives like distributed locks and
queues to help control access to these resources, but it’s on the user to
use them well and not break things.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Dask scales happily out to tens of nodes, like in the example above, or to
thousands of nodes, which I’m not showing here simply due to lack of resources.&lt;/p&gt;

&lt;p&gt;Dask provides this scalability while still maintaining the flexibility and
freedom to build custom systems that has defined the project since it began.
However, the combination of scalability and freedom makes it hard for Dask to
fully protect users from breaking things. It’s much easier to protect users
when you can constrain what they can do. When users stick to standard
workflows like Dask dataframe or Dask array they’ll probably be ok, but when
operating with full creativity at the thousand-node scale some expertise will
invariably be necessary. We try hard to provide the diagnostics and tools
necessary to investigate issues and control operation. The project is getting
better at this every day, in large part due to some expert users out there.&lt;/p&gt;

&lt;h2 id=&quot;a-call-for-examples&quot;&gt;A Call for Examples&lt;/h2&gt;

&lt;p&gt;Do you use Dask on more than one machine to do interesting work?
We’d love to hear about it either in the comments below, or in this &lt;a href=&quot;https://goo.gl/forms/ueIMoGl6ZPl529203&quot;&gt;online
form&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Release 0.18.0</title>
   <link href="https://blog.dask.org/2018/06/14/dask-0.18.0"/>
   <updated>2018-06-14T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/06/14/dask-0.18.0</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m pleased to announce the release of Dask version 0.18.0. This is a major
release with breaking changes and new features.
The last release was 0.17.5 on May 4th.
This blogpost outlines notable changes since the last release blogpost for
0.17.2 on March 21st.&lt;/p&gt;

&lt;p&gt;You can conda install Dask:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install dask
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or pip install from PyPI:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask[complete] --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Full changelogs are available here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We list some breaking changes below, followed up by changes that are less
important, but still fun.&lt;/p&gt;

&lt;h2 id=&quot;context&quot;&gt;Context&lt;/h2&gt;

&lt;p&gt;The Dask core library is nearing a 1.0 release.
Before that happens, we need to do some housecleaning.
This release starts that process,
replaces some existing interfaces,
and builds up some needed infrastructure.
Almost all of the changes in this release include clean deprecation warnings,
but future releases will remove the old functionality, so now would be a good
time to check in.&lt;/p&gt;

&lt;p&gt;As happens with any release that starts breaking things,
many other smaller breaks get added on as well.
I’m personally very happy with this release because many aspects of using Dask
now feel a lot cleaner, however heavy users of Dask will likely experience
mild friction. Hopefully this post helps explain some of the larger changes.&lt;/p&gt;

&lt;h2 id=&quot;notable-breaking-changes&quot;&gt;Notable Breaking changes&lt;/h2&gt;

&lt;h3 id=&quot;centralized-configuration&quot;&gt;Centralized configuration&lt;/h3&gt;

&lt;p&gt;Taking full advantage of Dask sometimes requires user configuration, especially
in a distributed setting. This might be to control logging verbosity, specify
cluster configuration, provide credentials for security, or any of several
other options that arise in production.&lt;/p&gt;

&lt;p&gt;We’ve found that different computing cultures like to specify configuration in
several different ways:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Configuration files&lt;/li&gt;
  &lt;li&gt;Environment variables&lt;/li&gt;
  &lt;li&gt;Directly within Python code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Previously this was handled with a variety of different solutions among the
different dask subprojects. The dask-distributed project had one system,
dask-kubernetes had another, and so on.&lt;/p&gt;

&lt;p&gt;Now we centralize configuration in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.config&lt;/code&gt; module, which collects
configuration from config files, environment variables, and runtime code, and
makes it centrally available to all Dask subprojects. A number of Dask
subprojects (dask.distributed,
&lt;a href=&quot;http://dask-kubernetes.readthedocs.io/en/latest/&quot;&gt;dask-kubernetes&lt;/a&gt;, and
&lt;a href=&quot;http://dask-jobqueue.readthedocs.io/en/latest/&quot;&gt;dask-jobqueue&lt;/a&gt;), are being
co-released at the same time to take advantage of this.&lt;/p&gt;

&lt;p&gt;If you were actively using Dask.distributed’s configuration files some things
have changed:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The configuration is now namespaced and more heavily nested. Here is an
example from the &lt;a href=&quot;https://github.com/dask/distributed/blob/master/distributed/distributed.yaml&quot;&gt;dask.distributed default config
file&lt;/a&gt;
today:&lt;/p&gt;

    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;distributed&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;allowed-failures&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# number of retries before a task is considered bad&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;work-stealing&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;True&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# workers should steal tasks from each other&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;worker-ttl&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# like &apos;60s&apos;. Workers must heartbeat faster than this&lt;/span&gt;

  &lt;span class=&quot;na&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;multiprocessing-method&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;forkserver&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;use-file-locking&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The default configuration location has moved from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.dask/config.yaml&lt;/code&gt; to
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.config/dask/distributed.yaml&lt;/code&gt;, where it will live along side several
other files like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubernetes.yaml&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jobqueue.yaml&lt;/code&gt;, and so on.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, your old configuration files will still be found and their values
will be used appropriately. We don’t make any attempt to migrate your old
config values to the new location though. You may want to delete the
auto-generated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.dask/config.yaml&lt;/code&gt; file at some point, if you felt like being
particularly clean.&lt;/p&gt;

&lt;p&gt;You can learn more about Dask’s configuration in &lt;a href=&quot;http://dask.pydata.org/en/latest/configuration.html&quot;&gt;Dask’s configuration
documentation&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;replaced-the-common-get-keyword-with-scheduler&quot;&gt;Replaced the common get= keyword with scheduler=&lt;/h3&gt;

&lt;p&gt;Dask can execute code with a variety of scheduler backends based on threads,
processes, single-threaded execution, or distributed clusters.&lt;/p&gt;

&lt;p&gt;Previously, users selected between these backends using the somewhat
generically named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get=&lt;/code&gt; keyword:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;threaded&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;multiprocessing&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;local&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_sync&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We’ve replaced this with a newer, and hopefully more clear, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scheduler=&lt;/code&gt; keyword:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;threads&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;processes&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;single-threaded&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;get=&lt;/code&gt; keyword has been deprecated and will raise a warning. It will be
removed entirely on the next major release.&lt;/p&gt;

&lt;p&gt;For more information, see &lt;a href=&quot;http://dask.pydata.org/en/latest/scheduling.html&quot;&gt;documentation on selecting different schedulers&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;replaced-daskset_options-with-daskconfigset&quot;&gt;Replaced dask.set_options with dask.config.set&lt;/h3&gt;

&lt;p&gt;Related to the configuration changes, we now include runtime state in the
configuration. Previously people used to set runtime state with the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.set_options&lt;/code&gt; context manager. Now we recommend using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.config.set&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;threads&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Before
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;scheduler&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;threads&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# After
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.set_options&lt;/code&gt; function is now an alias to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.config.set&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;removed-the-daskarraylearn-subpackage&quot;&gt;Removed the dask.array.learn subpackage&lt;/h3&gt;

&lt;p&gt;This was unadvertised and saw very little use. All functionality (and much
more) is now available in &lt;a href=&quot;http://dask-ml.readthedocs.io/en/latest/&quot;&gt;Dask-ML&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;other&quot;&gt;Other&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;We’ve removed the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;token=&lt;/code&gt; keyword from map_blocks and moved the
functionality to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;name=&lt;/code&gt; keyword.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.distributed.worker_client&lt;/code&gt; automatically rejoins the threadpool when
you close the context manager.&lt;/li&gt;
  &lt;li&gt;The Dask.distributed protocol now interprets msgpack arrays as tuples
rather than lists.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;fun-new-features&quot;&gt;Fun new features&lt;/h2&gt;

&lt;h3 id=&quot;arrays&quot;&gt;Arrays&lt;/h3&gt;

&lt;h4 id=&quot;generalized-universal-functions&quot;&gt;Generalized Universal Functions&lt;/h4&gt;

&lt;p&gt;Dask.array now supports Numpy-style
&lt;a href=&quot;https://docs.scipy.org/doc/numpy-1.13.0/reference/c-api.generalized-ufuncs.html&quot;&gt;Generalized Universal Functions (gufuncs)&lt;/a&gt;
transparently.
This means that you can apply normal Numpy GUFuncs, like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;eig&lt;/code&gt; in the example
below, directly onto a Dask arrays:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Apply a Numpy GUFunc, eig, directly onto a Dask array
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;normal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_umath_linalg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;eig&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output_dtypes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# w and v are dask arrays with eig applied along the latter two axes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Numpy has gufuncs of many of its internal functions, but they haven’t
yet decided to switch these out to the public API.
Additionally we can define GUFuncs with other projects, like Numba:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numba&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numba&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vectorize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# if x and y are dask arrays, then z will be too
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What I like about this is that Dask and Numba developers didn’t coordinate
at all on this feature, it’s just that they both support the Numpy GUFunc
protocol, so you get interactions like this for free.&lt;/p&gt;

&lt;p&gt;For more information see &lt;a href=&quot;http://dask.pydata.org/en/latest/array-gufunc.html&quot;&gt;Dask’s GUFunc documentation&lt;/a&gt;. This work was done by &lt;a href=&quot;https://github.com/magonser&quot;&gt;Markus Gonser (@magonser)&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;new-auto-value-for-rechunking&quot;&gt;New “auto” value for rechunking&lt;/h4&gt;

&lt;p&gt;Dask arrays now accept a value, “auto”, wherever a chunk value would previously
be accepted. This asks Dask to rechunk those dimensions to achieve a good
default chunk size.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rechunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# single chunk in this dimension
&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 1: 100e6 / x.dtype.itemsize / x.shape[0],  # before we had to calculate manually
&lt;/span&gt;    &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;      &lt;span class=&quot;c1&quot;&gt;# Now we allow this dimension to respond to get ideal chunk size
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# or
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;auto&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This also checks the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;array.chunk-size&lt;/code&gt; config value for optimal chunk sizes&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;array.chunk-size&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;&apos;128MiB&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To be clear, this doesn’t support “automatic chunking”, which is a very hard
problem in general. Users still need to be aware of their computations and how
they want to chunk, this just makes it marginally easier to make good
decisions.&lt;/p&gt;

&lt;h4 id=&quot;algorithmic-improvements&quot;&gt;Algorithmic improvements&lt;/h4&gt;

&lt;p&gt;Dask.array gained a full &lt;a href=&quot;http://dask.pydata.org/en/latest/array-api.html#dask.array.einsum&quot;&gt;einsum&lt;/a&gt; implementation thanks to &lt;a href=&quot;https://github.com/sjperkins&quot;&gt;Simon Perkins&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also, Dask.array’s QR decompositions has become nicer in two ways:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;They support &lt;a href=&quot;http://dask.pydata.org/en/latest/array-api.html#dask.array.linalg.sfqr&quot;&gt;short-and-fat arrays&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;http://dask.pydata.org/en/latest/array-api.html#dask.array.linalg.tsqr&quot;&gt;tall-and-skinny&lt;/a&gt;
variant now operates more robustly in less memory. Here is a friendly GIF
of execution:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/306380/41350133-175cac7e-6ee0-11e8-9a0e-785c6e846409.gif&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This work is greatly appreciated and was done by &lt;a href=&quot;https://github.com/convexset&quot;&gt;Jeremy Chan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Native support for the &lt;a href=&quot;http://zarr.readthedocs.io/en/stable/&quot;&gt;Zarr format&lt;/a&gt; for
chunked n-dimensional arrays landed thanks to &lt;a href=&quot;https://github.com/martindurant&quot;&gt;Martin
Durant&lt;/a&gt; and &lt;a href=&quot;https://github.com/jakirkham&quot;&gt;John A
Kirkham&lt;/a&gt;. Zarr has been especially useful due to
its speed, simple spec, support of the full NetCDF style conventions, and
amenability to cloud storage.&lt;/p&gt;

&lt;h3 id=&quot;dataframes-and-pandas-023&quot;&gt;Dataframes and Pandas 0.23&lt;/h3&gt;

&lt;p&gt;As usual, Dask Dataframes had many small improvements. Of note is continued
compatibility with the just-released Pandas 0.23, and some new data ingestion
formats.&lt;/p&gt;

&lt;p&gt;Dask.dataframe is consistent with changes in the recent Pandas 0.23 release
thanks to &lt;a href=&quot;https://github.com/TomAugspurger&quot;&gt;Tom Augspurger&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;orc-support&quot;&gt;Orc support&lt;/h4&gt;

&lt;p&gt;Dask.dataframe has grown a reader for the &lt;a href=&quot;https://orc.apache.org/&quot;&gt;Apache ORC&lt;/a&gt; format.&lt;/p&gt;

&lt;p&gt;Orc is a format for tabular data storage that is common in the Hadoop ecosystem.
The new
&lt;a href=&quot;http://dask.pydata.org/en/latest/dataframe-api.html#dask.dataframe.read_hdf&quot;&gt;dd.read_orc&lt;/a&gt;
function parallelizes around similarly new ORC functionality within PyArrow .
Thanks to &lt;a href=&quot;https://github.com/jcrist&quot;&gt;Jim Crist&lt;/a&gt; for the work on the Arrow side
and &lt;a href=&quot;https://github.com/martindurant&quot;&gt;Martin Durant&lt;/a&gt; for parallelizing it with
Dask.&lt;/p&gt;

&lt;h4 id=&quot;read_json-support&quot;&gt;Read_json support&lt;/h4&gt;

&lt;p&gt;Dask.dataframe now has also grown a reader for JSON files.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://dask.pydata.org/en/latest/dataframe-api.html#dask.dataframe.read_json&quot;&gt;dd.read_json&lt;/a&gt;
function matches most of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pandas.read_json&lt;/code&gt; API.&lt;/p&gt;

&lt;p&gt;This came about shortly after a recent &lt;a href=&quot;https://www.youtube.com/watch?v=X4YHGKj3V5M&quot;&gt;PyCon 2018 talk comparing Spark and
Dask dataframe&lt;/a&gt; where &lt;a href=&quot;https://github.com/j-bennet&quot;&gt;Irina
Truong&lt;/a&gt; mentioned that it was missing. Thanks to
&lt;a href=&quot;https://github.com/martindurant&quot;&gt;Martin Durant&lt;/a&gt; and &lt;a href=&quot;https://github.com/j-bennet&quot;&gt;Irina
Truong&lt;/a&gt; for this contribution.&lt;/p&gt;

&lt;p&gt;See the &lt;a href=&quot;http://dask.pydata.org/en/latest/dataframe-create.html&quot;&gt;dataframe data ingestion documentation&lt;/a&gt;
for more information about JSON, ORC, or any of the other formats
supported by Dask.dataframe.&lt;/p&gt;

&lt;h3 id=&quot;joblib&quot;&gt;Joblib&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;https://pythonhosted.org/joblib/&quot;&gt;Joblib&lt;/a&gt; library for parallel computing within
Scikit-Learn has had a &lt;a href=&quot;http://dask-ml.readthedocs.io/en/latest/joblib.html&quot;&gt;Dask backend&lt;/a&gt;
for a while now. While it has always been pretty easy to use, it’s now
becoming much easier to use well without much expertise. After using this in
practice for a while together with the Scikit-Learn developers, we’ve
identified and smoothed over a number of usability issues. These changes will
only be fully available after the next Scikit-Learn release (hopefully soon) at
which point we’ll probably release a new blogpost dedicated to the topic.&lt;/p&gt;

&lt;h2 id=&quot;related-projects&quot;&gt;Related projects&lt;/h2&gt;

&lt;p&gt;This release is timed with the following packages:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;dask&lt;/li&gt;
  &lt;li&gt;distributed&lt;/li&gt;
  &lt;li&gt;dask-kubernetes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is also a new repository for deploying applications on YARN (a job
scheduler common in Hadoop environments) called
&lt;a href=&quot;https://jcrist.github.io/skein/&quot;&gt;skein&lt;/a&gt;. Early adopters welcome.&lt;/p&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;Since March 21st, the following people have contributed to the following repositories:&lt;/p&gt;

&lt;p&gt;The core Dask repository for parallel algorithms:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Andrethrill&lt;/li&gt;
  &lt;li&gt;Beomi&lt;/li&gt;
  &lt;li&gt;Brendan Martin&lt;/li&gt;
  &lt;li&gt;Christopher Ren&lt;/li&gt;
  &lt;li&gt;Guido Imperiale&lt;/li&gt;
  &lt;li&gt;Diane Trout&lt;/li&gt;
  &lt;li&gt;fjetter&lt;/li&gt;
  &lt;li&gt;Frederick&lt;/li&gt;
  &lt;li&gt;Henry Doupe&lt;/li&gt;
  &lt;li&gt;James Bourbeau&lt;/li&gt;
  &lt;li&gt;Jeremy Chen&lt;/li&gt;
  &lt;li&gt;Jim Crist&lt;/li&gt;
  &lt;li&gt;John A Kirkham&lt;/li&gt;
  &lt;li&gt;Jon Mease&lt;/li&gt;
  &lt;li&gt;Jörg Dietrich&lt;/li&gt;
  &lt;li&gt;Kevin Mader&lt;/li&gt;
  &lt;li&gt;Ksenia Bobrova&lt;/li&gt;
  &lt;li&gt;Larsr&lt;/li&gt;
  &lt;li&gt;Marc Pfister&lt;/li&gt;
  &lt;li&gt;Markus Gonser&lt;/li&gt;
  &lt;li&gt;Martin Durant&lt;/li&gt;
  &lt;li&gt;Matt Lee&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Pierre-Bartet&lt;/li&gt;
  &lt;li&gt;Scott Sievert&lt;/li&gt;
  &lt;li&gt;Simon Perkins&lt;/li&gt;
  &lt;li&gt;Stefan van der Walt&lt;/li&gt;
  &lt;li&gt;Stephan Hoyer&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Uwe L. Korn&lt;/li&gt;
  &lt;li&gt;Yu Feng&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dask/distributed repository for distributed computing:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Bmaisonn&lt;/li&gt;
  &lt;li&gt;Grant Jenks&lt;/li&gt;
  &lt;li&gt;Henry Doupe&lt;/li&gt;
  &lt;li&gt;Irene Rodriguez&lt;/li&gt;
  &lt;li&gt;Irina Truong&lt;/li&gt;
  &lt;li&gt;John A Kirkham&lt;/li&gt;
  &lt;li&gt;Joseph Atkins-Turkish&lt;/li&gt;
  &lt;li&gt;Kenneth Koski&lt;/li&gt;
  &lt;li&gt;Loïc Estève&lt;/li&gt;
  &lt;li&gt;Marius van Niekerk&lt;/li&gt;
  &lt;li&gt;Martin Durant&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Olivier Grisel&lt;/li&gt;
  &lt;li&gt;Russ Bubley&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Tony Lorenzo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dask-kubernetes repository for deploying Dask on Kubernetes&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Brendan Martin&lt;/li&gt;
  &lt;li&gt;J Gerard&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Olivier Grisel&lt;/li&gt;
  &lt;li&gt;Yuvi Panda&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dask-jobqueue repository for deploying Dask on HPC job schedulers&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Guillaume Eynard-Bontemps&lt;/li&gt;
  &lt;li&gt;jgerardsimcock&lt;/li&gt;
  &lt;li&gt;Joseph Hamman&lt;/li&gt;
  &lt;li&gt;Loïc Estève&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Ray Bell&lt;/li&gt;
  &lt;li&gt;Rich Signell&lt;/li&gt;
  &lt;li&gt;Shawn Taylor&lt;/li&gt;
  &lt;li&gt;Spencer Clark&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dask-ml repository for scalable machine learning:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Christopher Ren&lt;/li&gt;
  &lt;li&gt;Jeremy Chen&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Scott Sievert&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;acknowledgements-1&quot;&gt;Acknowledgements&lt;/h3&gt;

&lt;p&gt;Thanks to Scott Sievert and James Bourbeau for their help editing this article.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Beyond Numpy Arrays in Python</title>
   <link href="https://blog.dask.org/2018/05/27/beyond-numpy"/>
   <updated>2018-05-27T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/05/27/beyond-numpy</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;h2 id=&quot;executive-summary&quot;&gt;Executive Summary&lt;/h2&gt;

&lt;p&gt;In recent years Python’s array computing ecosystem has grown organically to support
GPUs, sparse, and distributed arrays.
This is wonderful and a great example of the growth that can occur in decentralized open source development.&lt;/p&gt;

&lt;p&gt;However to solidify this growth and apply it across the ecosystem we now need to do some central planning
to move from a pair-wise model where packages need to know about each other
to an ecosystem model where packages can negotiate by developing and adhering to community-standard protocols.&lt;/p&gt;

&lt;p&gt;With moderate effort we can define a subset of the Numpy API that works well across all of them,
allowing the ecosystem to more smoothly transition between hardware.
This post describes the opportunities and challenges to accomplish this.&lt;/p&gt;

&lt;p&gt;We start by discussing two kinds of libraries:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Libraries that &lt;em&gt;implement&lt;/em&gt; the Numpy API&lt;/li&gt;
  &lt;li&gt;Libraries that &lt;em&gt;consume&lt;/em&gt; the Numpy API and build new functionality on top
of it&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;libraries-that-implement-the-numpy-api&quot;&gt;Libraries that Implement the Numpy API&lt;/h2&gt;

&lt;p&gt;The Numpy array is one of the foundations of the numeric Python ecosystem,
and serves as the standard model for similar libraries in other languages.
Today it is used to analyze satellite and biomedical imagery, financial models,
genomes, oceans and the atmosphere, super-computer simulations,
and data from thousands of other domains.&lt;/p&gt;

&lt;p&gt;However, Numpy was designed several years ago,
and its implementation is no longer optimal for some modern hardware,
particularly multi-core workstations, many-core GPUs, and distributed clusters.&lt;/p&gt;

&lt;p&gt;Fortunately other libraries implement the Numpy array API on these other architectures:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://cupy.chainer.org/&quot;&gt;CuPy&lt;/a&gt;: implements the Numpy API on GPUs with CUDA&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sparse.pydata.org/&quot;&gt;Sparse&lt;/a&gt;: implements the Numpy API for sparse arrays that are mostly zeros&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask.pydata.org/&quot;&gt;Dask array&lt;/a&gt;: implements the Numpy API in parallel for multi-core workstations or distributed clusters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So even when the Numpy implementation is no longer ideal,
the &lt;em&gt;Numpy API&lt;/em&gt; lives on in successor projects.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: the Numpy implementation remains ideal most of the time.
Dense in-memory arrays are still the common case.
This blogpost is about the minority of cases where Numpy is not ideal&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So today we can write code similar code between all of
Numpy, GPU, sparse, and parallel arrays:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Runs on a single CPU
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Runs on a GPU
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Runs on many CPUs
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;axis&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Additionally, each of the deep learning frameworks
(TensorFlow, PyTorch, MXNet)
has a Numpy-like thing that is &lt;em&gt;similar-ish&lt;/em&gt; to Numpy’s API,
but definitely not trying to be an exact match.&lt;/p&gt;

&lt;h2 id=&quot;libraries-that-consume-and-extend-the-numpy-api&quot;&gt;Libraries that consume and extend the Numpy API&lt;/h2&gt;

&lt;p&gt;At the same time as the development of Numpy APIs for different hardware,
many libraries today build algorithmic functionality on top of the Numpy API:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://xarray.pydata.org/en/stable/&quot;&gt;XArray&lt;/a&gt;
for labeled and indexed collections of arrays&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/hips/autograd&quot;&gt;Autograd&lt;/a&gt; and
&lt;a href=&quot;https://github.com/google/tangent/&quot;&gt;Tangent&lt;/a&gt;:
for automatic differentiation&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://tensorly.org/stable/index.html&quot;&gt;TensorLy&lt;/a&gt;
for higher order array factorizations&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://dask.pydata.org&quot;&gt;Dask array&lt;/a&gt;
which coordinates many Numpy-like arrays into a logical parallel array&lt;/p&gt;

    &lt;p&gt;(dask array both &lt;em&gt;consumes&lt;/em&gt; and &lt;em&gt;implements&lt;/em&gt; the Numpy API)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://optimized-einsum.readthedocs.io/en/latest/&quot;&gt;Opt Einsum&lt;/a&gt;
for more efficient einstein summation operations&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These projects and more enhance array computing in Python,
building on new features beyond what Numpy itself provides.&lt;/p&gt;

&lt;p&gt;There are also projects like Pandas, Scikit-Learn, and SciPy,
that use Numpy’s in-memory internal representation.
We’re going to ignore these libraries for this blogpost
and focus on those libraries that only use the high-level Numpy API
and not the low-level representation.&lt;/p&gt;

&lt;h2 id=&quot;opportunities-and-challenges&quot;&gt;Opportunities and Challenges&lt;/h2&gt;

&lt;p&gt;Given the two groups of projects:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;New libraries that &lt;em&gt;implement&lt;/em&gt; the Numpy API
(CuPy, Sparse, Dask array)&lt;/li&gt;
  &lt;li&gt;New libraries that &lt;em&gt;consume&lt;/em&gt; and &lt;em&gt;extend&lt;/em&gt; the Numpy API
(XArray, Autograd/tangent, TensorLy, Einsum)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We want to use them together, applying Autograd to CuPy, TensorLy to Sparse,
and so on, including all future implementations that might follow.
This is challenging.&lt;/p&gt;

&lt;p&gt;Unfortunately,
while all of the array implementations APIs are &lt;em&gt;very similar&lt;/em&gt; to Numpy’s API,
they use different functions.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sin&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sin&lt;/span&gt;
&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This creates problems for the consumer libraries,
because now they need to switch out which functions they use
depending on which array-like objects they’ve been given.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Today each array project implements a custom plugin system
that they use to switch between some of the array options.
Links to these plugin mechanisms are below if you’re interested:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/pydata/xarray/blob/c346d3b7bcdbd6073cf96fdeb0710467a284a611/xarray/core/duck_array_ops.py&quot;&gt;xarray/core/duck_array_ops.py&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/tensorly/tensorly/tree/af0700af61ca2cd104e90755d5e5033e23fd4ec4/tensorly/backend&quot;&gt;tensorly/backend&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/HIPS/autograd/blob/bd3f92fcd4d66424be5fb6b6d3a7f9195c98eebf/autograd/numpy/numpy_vspaces.py&quot;&gt;autograd/numpy/numpy_vspaces.py&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/google/tangent/blob/bc64848bba964c632a6da4965fb91f2f61a3cdd4/tangent/template.py&quot;&gt;tangent/template.py&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/8f164773cb3717b3c5ad856341205f605b8404cf/dask/array/core.py#L59-L62&quot;&gt;dask/array/core.py#L59-L62&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dgasmith/opt_einsum/blob/32c1b0adb50511da1b86dc98bcf169d79b44efce/opt_einsum/backends.py&quot;&gt;opt_einsum/backends.py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example XArray can use either Numpy arrays or Dask arrays.
This has been hugely beneficial to users of that project,
which today seamlessly transition from small in-memory datasets on their laptops
to 100TB datasets on clusters,
all using the same programming model.
However when considering adding sparse or GPU arrays to XArray’s plugin system,
it quickly became clear that this would be expensive today.&lt;/p&gt;

&lt;p&gt;Building, maintaining, and extending these plugin mechanisms is &lt;em&gt;costly&lt;/em&gt;.
The plugin systems in each project are not alike,
so any new array implementation has to go to each library and build the same code several times.
Similarly, any new algorithmic library must build plugins to every ndarray implementation.
Each library has to explicitly import and understand each other library,
and has to adapt as those libraries change over time.
This coverage is not complete,
and so users lack confidence that their applications are portable between hardware.&lt;/p&gt;

&lt;p&gt;Pair-wise plugin mechanisms make sense for a single project,
but are not an efficient choice for the full ecosystem.&lt;/p&gt;

&lt;h2 id=&quot;solutions&quot;&gt;Solutions&lt;/h2&gt;

&lt;p&gt;I see two solutions today:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Build a new library that holds dispatch-able versions of all of the relevant Numpy functions
and convince everyone to use it instead of Numpy internally&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Build this dispatch mechanism into Numpy itself&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each has challenges.&lt;/p&gt;

&lt;h3 id=&quot;build-a-new-centralized-plugin-library&quot;&gt;Build a new centralized plugin library&lt;/h3&gt;

&lt;p&gt;We can build a new library,
here called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arrayish&lt;/code&gt;,
that holds dispatch-able versions of all of the relevant Numpy functions.
We then convince everyone to use it instead of Numpy internally.&lt;/p&gt;

&lt;p&gt;So in each array-like library’s codebase we write code like the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# inside numpy&apos;s codebase
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;arrayish&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arrayish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arrayish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arrayish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# inside cupy&apos;s codebase
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;arrayish&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;cupy&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arrayish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arrayish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arrayish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ndarray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cupy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and so on for Dask, Sparse, and any other Numpy-like libraries.&lt;/p&gt;

&lt;p&gt;In all of the algorithm libraries (like XArray, autograd, TensorLy, …)
we use arrayish instead of Numpy&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# inside XArray&apos;s codebase
# import numpy
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;arrayish&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is the same plugin solution as before,
but now we build a community standard plugin system
that hopefully all of the projects can agree to use.&lt;/p&gt;

&lt;p&gt;This reduces the big &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n by m&lt;/code&gt; cost of maintaining several plugin systems,
to a more manageable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n plus m&lt;/code&gt; cost of using a single plugin system in each library.
This centralized project would also benefit, perhaps,
from being better maintained than any individual project is likely to do on its own.&lt;/p&gt;

&lt;p&gt;However this has costs:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Getting many different projects to agree on a new standard is hard&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Algorithmic projects will need to start using arrayish internally,
adding new imports like the following:&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;arrayish&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;numpy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;And this wll certainly cause some complications interally&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Someone needs to build an maintain the central infrastructure&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/hameerabbasi&quot;&gt;Hameer Abbasi&lt;/a&gt;
put together a rudimentary prototype for arrayish here:
&lt;a href=&quot;https://github.com/hameerabbasi/arrayish&quot;&gt;github.com/hameerabbasi/arrayish&lt;/a&gt;.
There has been some discussion about this topic, using XArray+Sparse as an example, in
&lt;a href=&quot;https://github.com/pydata/sparse/issues/1&quot;&gt;pydata/sparse #1&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dispatch-from-within-numpy&quot;&gt;Dispatch from within Numpy&lt;/h3&gt;

&lt;p&gt;Alternatively, the central dispatching mechanism could live within Numpy itself.&lt;/p&gt;

&lt;p&gt;Numpy functions could learn to hand control over to their arguments,
allowing the array implementations to take over when possible.
This would allow existing Numpy code to work on externally developed array implementations.&lt;/p&gt;

&lt;p&gt;There is precedent for this.
The &lt;a href=&quot;https://docs.scipy.org/doc/numpy/reference/arrays.classes.html#numpy.class.__array_ufunc__&quot;&gt;&lt;strong&gt;array_ufunc&lt;/strong&gt;&lt;/a&gt; protocol
allows any class that defines the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_ufunc__&lt;/code&gt; method
to take control of any Numpy ufunc like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;np.sin&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;np.exp&lt;/code&gt;.
Numpy reductions like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;np.sum&lt;/code&gt; already look for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.sum&lt;/code&gt; methods on their arguments and defer to them if possible.&lt;/p&gt;

&lt;p&gt;Some array projects, like Dask and Sparse, already implement the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_ufunc__&lt;/code&gt; protocol.
There is also &lt;a href=&quot;https://github.com/cupy/cupy/pull/1247&quot;&gt;an open PR for CuPy&lt;/a&gt;.
Here is an example showing Numpy functions on Dask arrays cleanly.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;numpy&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,))&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# A Dask array
&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;             &lt;span class=&quot;c1&quot;&gt;# Apply Numpy function to a Dask array
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;aggregate&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;float64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunksize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# get a Dask array
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;I recommend that all Numpy-API compatible array projects implement the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_ufunc__&lt;/code&gt; protocol.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This works for many functions, but not all.
Other operations like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tensordot&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;concatenate&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stack&lt;/code&gt;
occur frequently in algorithmic code but are not covered here.&lt;/p&gt;

&lt;p&gt;This solution avoids the community challenges of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arrayish&lt;/code&gt; solution above.
Everyone is accustomed to aligning themselves to Numpy’s decisions,
and relatively little code would need to be rewritten.&lt;/p&gt;

&lt;p&gt;The challenge with this approach is that historically
Numpy has moved more slowly than the rest of the ecosystem.
For example the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__array_ufunc__&lt;/code&gt; protocol mentioned above
was discussed for several years before it was merged.
Fortunately Numpy has recently
&lt;a href=&quot;https://www.numfocus.org/blog/numpy-receives-first-ever-funding-thanks-to-moore-foundation&quot;&gt;received&lt;/a&gt;
&lt;a href=&quot;https://bids.berkeley.edu/news/bids-receives-sloan-foundation-grant-contribute-numpy-development&quot;&gt;funding&lt;/a&gt;
to help it make changes like this more rapidly.
The full time developers hired under this funding have just started though,
and it’s not clear how much of a priority this work is for them at first.&lt;/p&gt;

&lt;p&gt;For what it’s worth I’d prefer to see this Numpy protocol solution take hold.&lt;/p&gt;

&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;

&lt;p&gt;In recent years Python’s array computing ecosystem has grown organically to support
GPUs, sparse, and distributed arrays.
This is wonderful and a great example of the growth that can occur in decentralized open source development.&lt;/p&gt;

&lt;p&gt;However to solidify this growth and apply it across the ecosystem we now need to do some central planning
to move from a pair-wise model where packages need to know about each other
to an ecosystem model where packages can negotiate by developing and adhering to community-standard protocols.&lt;/p&gt;

&lt;p&gt;The community has done this transition before
(Numeric + Numarray -&amp;gt; Numpy, the Scikit-Learn fit/predict API, etc..)
usually with surprisingly positive results.&lt;/p&gt;

&lt;p&gt;The open questions I have today are the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;How quickly can Numpy adapt to this demand for protocols
while still remaining stable for its existing role as foundation of the ecosystem&lt;/li&gt;
  &lt;li&gt;What algorithmic domains can be written in a cross-hardware way
that depends only on the high-level Numpy API,
and doesn’t require specialization at the data structure level.
Clearly some domains exist (XArray, automatic differentiation),
but how common are these?&lt;/li&gt;
  &lt;li&gt;Once a standard protocol is in place,
what other array-like implementations might arise?
In-memory compression? Probabilistic? Symbolic?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;update&quot;&gt;Update&lt;/h2&gt;

&lt;p&gt;After discussing this topic at the
&lt;a href=&quot;https://scisprints.github.io/#may-numpy-developer-sprint&quot;&gt;May NumPy Developer Sprint&lt;/a&gt;
at &lt;a href=&quot;https://bids.berkeley.edu/&quot;&gt;BIDS&lt;/a&gt;
a few of us have drafted a Numpy Enhancement Proposal (NEP)
&lt;a href=&quot;https://github.com/numpy/numpy/pull/11189&quot;&gt;available here&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
 
 
 <entry>
   <title>Dask Release 0.17.2</title>
   <link href="https://blog.dask.org/2018/03/21/dask-0.17.2"/>
   <updated>2018-03-21T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/03/21/dask-0.17.2</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc.&lt;/a&gt;
and the Data Driven Discovery Initiative from the &lt;a href=&quot;https://www.moore.org/&quot;&gt;Moore
Foundation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m pleased to announce the release of Dask version 0.17.2. This is a minor
release with new features and stability improvements.
This blogpost outlines notable changes since the 0.17.0 release on February
12th.&lt;/p&gt;

&lt;p&gt;You can conda install Dask:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install dask
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or pip install from PyPI:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask[complete] --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Full changelogs are available here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some notable changes follow:&lt;/p&gt;

&lt;h3 id=&quot;tornado-50&quot;&gt;Tornado 5.0&lt;/h3&gt;

&lt;p&gt;Tornado is a popular framework for concurrent network programming that Dask
relies on heavily. Tornado recently released a major version update that
included both some major features for Dask as well as a couple of bugs.&lt;/p&gt;

&lt;p&gt;The new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IOStream.read_into&lt;/code&gt; method allows Dask communications (or anyone using
this API) to move large datasets more efficiently over the network with
fewer copies. This enables Dask to take advantage of high performance
networking available on modern super-computers. On the Cheyenne system, where
we tested this, we were able to get the full 3GB/s bandwidth available through
the Infiniband network with this change (when using a few worker processes).&lt;/p&gt;

&lt;p&gt;Many thanks to &lt;a href=&quot;https://github.com/pitrou&quot;&gt;Antoine Pitrou&lt;/a&gt; and &lt;a href=&quot;https://github.com/bdarnell&quot;&gt;Ben
Darnell&lt;/a&gt; for their efforts on this.&lt;/p&gt;

&lt;p&gt;At the same time there were some unforeseen issues in the update to Tornado 5.0.
More pervasive use of bytearrays over bytes caused issues with compression
libraries like Snappy and Python 2 that were not expecting these types. There
is a brief window in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;distributed.__version__ == 1.21.3&lt;/code&gt; that enables this
functionality if Tornado 5.0 is present but will misbehave if Snappy is also
present.&lt;/p&gt;

&lt;h3 id=&quot;http-file-system&quot;&gt;HTTP File System&lt;/h3&gt;

&lt;p&gt;Dask leverages a &lt;a href=&quot;https://github.com/dask/dask/issues/2880&quot;&gt;file-system-like protocol&lt;/a&gt;
for access to remote data.
This is what makes commands like the following work:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;s3://...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;hdfs://...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;gcs://...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We have now added http and https file systems for reading data directly from
web servers. These also support random access if the web server supports range
queries.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;https://...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As with S3, HDFS, GCS, … you can also use these tools outside of Dask
development. Here we read the first twenty bytes of the Pandas license:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.bytes.http&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HTTPFileSystem&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;http&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HTTPFileSystem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;https://raw.githubusercontent.com/pandas-dev/pandas/master/LICENSE&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;b&apos;BSD 3-Clause License&apos;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/martindurant&quot;&gt;Martin Durant&lt;/a&gt; who did this work
and manages Dask’s byte handling generally. See &lt;a href=&quot;http://dask.pydata.org/en/latest/remote-data-services.html&quot;&gt;remote data documentation&lt;/a&gt; for more information.&lt;/p&gt;

&lt;h3 id=&quot;fixed-a-correctness-bug-in-dask-dataframes-shuffle&quot;&gt;Fixed a correctness bug in Dask dataframe’s shuffle&lt;/h3&gt;

&lt;p&gt;We identified and resolved a correctness bug in dask.dataframe’s shuffle that
resulted in some rows being dropped during complex operations like joins and
groupby-applies with many partitions.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;https://github.com/dask/dask/pull/3201&quot;&gt;dask/dask #3201&lt;/a&gt; for more information.&lt;/p&gt;

&lt;h3 id=&quot;cluster-super-class-and-intelligent-adaptive-deployments&quot;&gt;Cluster super-class and intelligent adaptive deployments&lt;/h3&gt;

&lt;p&gt;There are many Python subprojects that help you deploy Dask on different
cluster resource managers like Yarn, SGE, Kubernetes, PBS, and more. These
have all converged to have more-or-less the same API that we have now combined
into a consistent interface that downstream projects can inherit from in
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;distributed.deploy.Cluster&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now that we have a consistent interface we have started to invest more in
improving the interface and intelligence of these systems as a group. This
includes both pleasant IPython widgets like the following:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-kubernetes-widget.png&quot; width=&quot;70%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;as well as improved logic around adaptive deployments. Adaptive deployments
allow clusters to scale themselves automatically based on current workload. If
you have recently submitted a lot of work the scheduler will estimate its
duration and ask for an appropriate number of workers to finish the computation
quickly. When the computation has finished the scheduler will release the
workers back to the system to free up resources.&lt;/p&gt;

&lt;p&gt;The logic here has improved substantially including the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You can specify minimum and maximum limits on your adaptivity&lt;/li&gt;
  &lt;li&gt;The scheduler estimates computation duration and asks for workers
appropriately&lt;/li&gt;
  &lt;li&gt;There is some additional delay in giving back workers to avoid hysteresis,
or cases where we repeatedly ask for and return workers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;related-projects&quot;&gt;Related projects&lt;/h2&gt;

&lt;p&gt;Some news from related projects:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The young daskernetes project was renamed to &lt;a href=&quot;http://dask-kubernetes.readthedocs.io/en/latest/&quot;&gt;dask-kubernetes&lt;/a&gt;. This displaces a previous project (that had not been released) for launching Dask on Google Cloud Platform. That project has been renamed to &lt;a href=&quot;https://github.com/dask/dask-gke&quot;&gt;dask-gke&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;A new project, &lt;a href=&quot;https://github.com/dask/dask-jobqueue/&quot;&gt;dask-jobqueue&lt;/a&gt; was
started to handle launching Dask clusters on traditional batch queuing
systems like PBS, SLURM, SGE, TORQUE, etc.. This projet grew out of the &lt;a href=&quot;https://pangeo-data.github.io/&quot;&gt;Pangeo&lt;/a&gt; collaboration&lt;/li&gt;
  &lt;li&gt;A Dask Helm chart has been added to Helm’s stable channel&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;The following people contributed to the dask/dask repository since the 0.17.0
release on February 12h:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Anderson Banihirwe&lt;/li&gt;
  &lt;li&gt;Dan Collins&lt;/li&gt;
  &lt;li&gt;Dieter Weber&lt;/li&gt;
  &lt;li&gt;Gabriele Lanaro&lt;/li&gt;
  &lt;li&gt;John Kirkham&lt;/li&gt;
  &lt;li&gt;James Bourbeau&lt;/li&gt;
  &lt;li&gt;Julien Lhermitte&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Martin Durant&lt;/li&gt;
  &lt;li&gt;Max Epstein&lt;/li&gt;
  &lt;li&gt;nkhadka&lt;/li&gt;
  &lt;li&gt;okkez&lt;/li&gt;
  &lt;li&gt;Pangeran Bottor&lt;/li&gt;
  &lt;li&gt;Rich Postelnik&lt;/li&gt;
  &lt;li&gt;Scott M. Edenbaum&lt;/li&gt;
  &lt;li&gt;Simon Perkins&lt;/li&gt;
  &lt;li&gt;Thrasibule&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Tor E Hagemann&lt;/li&gt;
  &lt;li&gt;Uwe L. Korn&lt;/li&gt;
  &lt;li&gt;Wes Roach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following people contributed to the dask/distributed repository since the
1.21.0 release on February 12th:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Alexander Ford&lt;/li&gt;
  &lt;li&gt;Andy Jones&lt;/li&gt;
  &lt;li&gt;Antoine Pitrou&lt;/li&gt;
  &lt;li&gt;Brett Naul&lt;/li&gt;
  &lt;li&gt;Joe Hamman&lt;/li&gt;
  &lt;li&gt;John Kirkham&lt;/li&gt;
  &lt;li&gt;Loïc Estève&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Matti Lyra&lt;/li&gt;
  &lt;li&gt;Sven Kreiss&lt;/li&gt;
  &lt;li&gt;Thrasibule&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Craft Minimal Bug Reports</title>
   <link href="https://blog.dask.org/2018/02/28/minimal-bug-reports"/>
   <updated>2018-02-28T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/02/28/minimal-bug-reports</id>
   
   <category>Programming</category>
   
   <category>scipy</category>
   
   <category>Python</category>
   
   <content type="html">
&lt;p&gt;Following up on a post on &lt;a href=&quot;../../../2016/08/25/supporting-users&quot;&gt;supporting users in open source&lt;/a&gt;
this post lists some suggestions on how to ask a maintainer to help you with a problem.&lt;/p&gt;

&lt;p&gt;You don’t have to follow these suggestions. They are optional.
They make it more likely that a project maintainer will spend time helping you.
It’s important to remember that their willingness to support you for free is optional too.&lt;/p&gt;

&lt;p&gt;Crafting minimal bug reports is essential for the life and maintenance of community-driven open source projects.
Doing this well is an incredible service to the community.&lt;/p&gt;

&lt;h2 id=&quot;minimal-complete-verifiable-examples&quot;&gt;Minimal Complete Verifiable Examples&lt;/h2&gt;

&lt;p&gt;I strongly recommend following Stack Overflow’s guidelines on &lt;a href=&quot;https://stackoverflow.com/help/mcve&quot;&gt;Minimal Complete Verifiable Exmamples&lt;/a&gt;. I’ll include brief highlights here:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;… code should be …&lt;/p&gt;

  &lt;ul&gt;
    &lt;li&gt;
      &lt;p&gt;Minimal – Use as little code as possible that still produces the same problem&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Complete – Provide all parts needed to reproduce the problem&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;p&gt;Verifiable – Test the code you’re about to provide to make sure it reproduces the problem&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lets be clear, this is &lt;em&gt;hard&lt;/em&gt; and takes time.&lt;/p&gt;

&lt;p&gt;As a question-asker I find that creating an MCVE often takes 10-30 minutes for a simple problem.
Fortunately this work is usually straightforward,
even if I don’t know very much about the package I’m having trouble with.
Most of the work to create a minimal example is about removing all of the code that was specific to my application,
and as the question-asker I am probably the most qualified person to do that.&lt;/p&gt;

&lt;p&gt;When answering questions I often point people to StackOverflow’s MCVE document.
They sometimes come back with a better-but-not-yet-minimal example.
This post clarifies a few common issues.&lt;/p&gt;

&lt;p&gt;As an running example I’m going to use Pandas dataframe problems.&lt;/p&gt;

&lt;h2 id=&quot;dont-post-data&quot;&gt;Don’t post data&lt;/h2&gt;

&lt;p&gt;You shouldn’t post the file that you’re working with.
Instead, try to see if you can reproduce the problem with just a few lines of data rather than the whole thing.&lt;/p&gt;

&lt;p&gt;Having to download a file, unzip it, etc. make it much less likely that someone will actually run your example in their free time.&lt;/p&gt;

&lt;h3 id=&quot;dont&quot;&gt;Don’t&lt;/h3&gt;

&lt;p&gt;I’ve uploaded my data to Dropbox and you can get it here: &lt;a href=&quot;https://example.com&quot;&gt;my-data.csv.gz&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;my-data.csv.gz&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;do&quot;&gt;Do&lt;/h3&gt;

&lt;p&gt;You should be able to copy-paste the following to get enough of my data to cause the problem:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;account-start&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;2017-02-03&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;2017-03-03&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;2017-01-01&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;client&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Alice Anders&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Bob Baker&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Charlie Chaplin&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;balance&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1432.32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;10.43&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;30000.00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;db-id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1234&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2424&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;251&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;proxy-id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;525&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1525&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2542&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;rank&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;52&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;525&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;actually-dont-include-your-data-at-all&quot;&gt;Actually don’t include your data at all&lt;/h2&gt;

&lt;p&gt;Actually, your data probably has lots of information that is very specific to
your application. Your eyes gloss over it but a maintainer doesn’t know what
is relevant and what isn’t, so it will take them time to digest it if you
include it. Instead see if you can reproduce your same failure with artificial
or random data.&lt;/p&gt;

&lt;h3 id=&quot;dont-1&quot;&gt;Don’t&lt;/h3&gt;

&lt;p&gt;Here is enough of my data to reproduce the problem&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;account-start&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;2017-02-03&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;2017-03-03&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;2017-01-01&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;client&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Alice Anders&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Bob Baker&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Charlie Chaplin&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;balance&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;1432.32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;10.43&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;30000.00&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;db-id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1234&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2424&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;251&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;proxy-id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;525&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1525&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2542&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;rank&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;52&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;525&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
                   &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;do-1&quot;&gt;Do&lt;/h3&gt;

&lt;p&gt;My actual problem is about finding the best ranked employee over a certain time period,
but we can reproduce the problem with this simpler dataset.
Notice that the dates are &lt;em&gt;out of order&lt;/em&gt; in this data (2000-01-02 comes after 2000-01-03).
I found that this was critical to reproducing the error.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;account-start&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;2000-01-01&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;2000-01-03&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;2000-01-02&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;db-id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;Alice&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Bob&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Charlie&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As we shrink down our example problem we often discover a lot about what causes the problem.
This discovery is valuable
and something that only the question-asker is capable of doing efficiently.&lt;/p&gt;

&lt;h2 id=&quot;see-how-small-you-can-make-things&quot;&gt;See how small you can make things&lt;/h2&gt;

&lt;p&gt;To make it even easier, see how small you can make your data.
For example if working with tabular data (like Pandas),
then how many columns do you actually need to reproduce the failure?
How many rows do you actually need to reproduce the failure?
Do the columns need to be named as you have them now or could they be just “A” and “B”
or descriptive of the types within?&lt;/p&gt;

&lt;h3 id=&quot;do-2&quot;&gt;Do&lt;/h3&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;datetime&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;2000-01-03&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;2000-01-02&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                   &lt;span class=&quot;s&quot;&gt;&apos;id&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;remove-unnecessary-steps&quot;&gt;Remove unnecessary steps&lt;/h2&gt;

&lt;p&gt;Is every line in your example absolutely necessary to reproduce the error?
If you’re able to delete a line of code then please do.
Because you already understand your problem you are &lt;em&gt;much more efficient&lt;/em&gt; at doing this than the maintainer is.
They probably know more about the tool, but you know more about your code.&lt;/p&gt;

&lt;h3 id=&quot;dont-2&quot;&gt;Don’t&lt;/h3&gt;

&lt;p&gt;The groupby step below is raising a warning that I don’t understand&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fillna&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# &amp;lt;-- this produces the error
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;do-3&quot;&gt;Do&lt;/h3&gt;

&lt;p&gt;The groupby step below is raising a warning that I don’t understand&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# &amp;lt;-- this produces the error
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;use-syntax-highlighting&quot;&gt;Use Syntax Highlighting&lt;/h2&gt;

&lt;p&gt;When using Github you can enclose code blocks in triple-backticks (the
character on the top-left of your keyboard on US-standard QWERTY keyboards).
It looks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;```python
x = 1
```
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;provide-complete-tracebacks&quot;&gt;Provide complete tracebacks&lt;/h2&gt;

&lt;p&gt;You know all of that stuff between your code and the exception that is hard to
make sense of? You should include it.&lt;/p&gt;

&lt;h3 id=&quot;dont-3&quot;&gt;Don’t&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;I get a ZeroDivisionError from the following code:

```python
def div(x, y):
    return x / y

div(1, 0)
```
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;do-4&quot;&gt;Do&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;I get a ZeroDivisionError from the following code:

```python
def div(x, y):
    return x / y

div(1, 0)
```

```python-traceback
ZeroDivisionError                         Traceback (most recent call last)
&amp;lt;ipython-input-4-7b96263abbfa&amp;gt; in &amp;lt;module&amp;gt;()
----&amp;gt; 1 div(1, 0)

&amp;lt;ipython-input-3-7685f97b4ce5&amp;gt; in div(x, y)
      1 def div(x, y):
----&amp;gt; 2     return x / y
      3

ZeroDivisionError: division by zero
```
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If the traceback is long that’s ok. If you really want to be clean you can put
it in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt; brackets.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;I get a ZeroDivisionError from the following code:

```python
def div(x, y):
    return x / y

div(1, 0)
```

### Traceback

&amp;lt;details&amp;gt;

```python
ZeroDivisionError                         Traceback (most recent call last)
&amp;lt;ipython-input-4-7b96263abbfa&amp;gt; in &amp;lt;module&amp;gt;()
----&amp;gt; 1 div(1, 0)

&amp;lt;ipython-input-3-7685f97b4ce5&amp;gt; in div(x, y)
      1 def div(x, y):
----&amp;gt; 2     return x / y
      3

ZeroDivisionError: division by zero
```

&amp;lt;/details&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;ask-questions-in-public-places&quot;&gt;Ask Questions in Public Places&lt;/h3&gt;

&lt;p&gt;When raising issues you often have a few possible locations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;GitHub issue tracker&lt;/li&gt;
  &lt;li&gt;Stack Overflow&lt;/li&gt;
  &lt;li&gt;Project mailing list&lt;/li&gt;
  &lt;li&gt;Project Chat room&lt;/li&gt;
  &lt;li&gt;E-mail maintainers directly (never do this)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Different projects handle this differently, but they usually have a page on
their documentation about where to go for help. This is often labeled
“Community”, “Support” or “Where to ask for help”. Here are the
recommendations from the
&lt;a href=&quot;https://pandas.pydata.org/community.html&quot;&gt;Pandas community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Generally it’s good to ask questions where many maintainers can see your
question and help, and where other users can find your question and answer if
they encounter a similar bug in the future.&lt;/p&gt;

&lt;p&gt;While your goal may be to solve your problem, the maintainer’s goal is likely
to create a record of how to solve problems like yours. This helps many more
users who will have a similar problem in the future, see your well-crafted bug
report, and learn from the resulting conversation.&lt;/p&gt;

&lt;h3 id=&quot;my-personal-preferences&quot;&gt;My personal preferences&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;For user questions like “What is the right way to do X?” I prefer Stack Overflow.&lt;/li&gt;
  &lt;li&gt;For bug reports like “I did X, I’m pretty confident that it should work, but I
get this error” I prefer Github issues&lt;/li&gt;
  &lt;li&gt;For general chit-chat I prefer Gitter, though actually, I personally spend
almost no time in gitter because it isn’t easily searchable by future
users. If you’ve asked me a question in Gitter I will almost certainly
not respond to it, except to direct you to github, stack overflow, or this
blogpost.&lt;/li&gt;
  &lt;li&gt;I only like personal e-mail if someone is proposing to fund or seriously
support the project in some way&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But again, different projects do this differently and have different policies.
You should check the documentation of the project you’re dealing with to learn
how they like to support users.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Release 0.17.0</title>
   <link href="https://blog.dask.org/2018/02/12/dask-0.17.0"/>
   <updated>2018-02-12T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/02/12/dask-0.17.0</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc.&lt;/a&gt;
and the Data Driven Discovery Initiative from the &lt;a href=&quot;https://www.moore.org/&quot;&gt;Moore
Foundation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m pleased to announce the release of Dask version 0.17.0. This a significant
major release with new features, breaking changes, and stability improvements.
This blogpost outlines notable changes since the 0.16.0 release on November
21st.&lt;/p&gt;

&lt;p&gt;You can conda install Dask:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install dask -c conda-forge
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or pip install from PyPI:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask[complete] --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Full changelogs are available here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some notable changes follow.&lt;/p&gt;

&lt;h3 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Removed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.dataframe.rolling_*&lt;/code&gt; methods, which were previously deprecated both in dask.dataframe and in pandas. These are replaced with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rolling.*&lt;/code&gt; namespace&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;We’ve generally stopped maintenance of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-ec2&lt;/code&gt; project to launch dask clusters on Amazon’s EC2 using Salt. We generally recommend kubernetes instead both for Amazon’s EC2, and for Google and Azure as well&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;http://dask.pydata.org/en/latest/setup/kubernetes.html&quot;&gt;dask.pydata.org/en/latest/setup/kubernetes.html&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Internal state of the distributed scheduler has changed significantly. This may affect advanced users who were inspecting this state for debugging or diagnostics.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;task-ordering&quot;&gt;Task Ordering&lt;/h3&gt;

&lt;p&gt;As Dask encounters more complex problems from more domains
we continually run into problems where its current heuristics do not perform optimally.
This release includes a rewrite of our static task prioritization heuristics.
This will improve Dask’s ability to traverse complex computations
in a way that keeps memory use low.&lt;/p&gt;

&lt;p&gt;To aid debugging we also integrated these heuristics into the GraphViz-style plots
that come from the visualize method.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;order&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;RdBu&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://user-images.githubusercontent.com/306380/35012109-86df75fa-fad6-11e7-9fa8-a43a697a4a17.png&quot;&gt;
  &lt;img src=&quot;https://user-images.githubusercontent.com/306380/35012109-86df75fa-fad6-11e7-9fa8-a43a697a4a17.png&quot; width=&quot;80%&quot; align=&quot;center&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/3066&quot;&gt;dask/dask #3066&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/pull/3057&quot;&gt;dask/dask #3057&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;nested-joblib&quot;&gt;Nested Joblib&lt;/h3&gt;

&lt;p&gt;Dask supports parallelizing Scikit-Learn
by extending Scikit-Learn’s underlying library for parallelism,
&lt;a href=&quot;http://tomaugspurger.github.io/distributed-joblib.html&quot;&gt;Joblib&lt;/a&gt;.
This allows Dask to distribute &lt;em&gt;some&lt;/em&gt; SKLearn algorithms across a cluster
just by wrapping them with a context manager.&lt;/p&gt;

&lt;p&gt;This relationship has been strengthened,
and particular attention has been focused
when nesting one parallel computation within another,
such as occurs when you train a parallel estimator, like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RandomForest&lt;/code&gt;,
within another parallel computation, like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GridSearchCV&lt;/code&gt;.
Previously this would result in spawning too many threads/processes
and generally oversubscribing hardware.&lt;/p&gt;

&lt;p&gt;Due to recent combined development within both Joblib and Dask,
these sorts of situations can now be resolved efficiently by handing them off to Dask,
providing speedups even in single-machine cases:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sklearn.externals&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;joblib&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;distributed.joblib&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# register the dask joblib backend
&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;est&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ParallelEstimator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GridSearchCV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;est&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;joblib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parallel_backend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;dask&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;gs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;See Tom Augspurger’s recent post with more details about this work:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://tomaugspurger.github.io/distributed-joblib.html&quot;&gt;http://tomaugspurger.github.io/distributed-joblib.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/joblib/joblib/pull/595&quot;&gt;joblib/joblib #595&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/pull/1705&quot;&gt;dask/distributed #1705&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/joblib/joblib/pull/613&quot;&gt;joblib/joblib #613&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/TomAugspurger&quot;&gt;Tom Augspurger&lt;/a&gt;,
&lt;a href=&quot;https://github.com/jcrist&quot;&gt;Jim Crist&lt;/a&gt;, and
&lt;a href=&quot;https://github.com/ogrisel&quot;&gt;Olivier Grisel&lt;/a&gt; who did most of this work.&lt;/p&gt;

&lt;h3 id=&quot;scheduler-internal-refactor&quot;&gt;Scheduler Internal Refactor&lt;/h3&gt;

&lt;p&gt;The distributed scheduler has been significantly refactored to change it from a forest of dictionaries:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;priority&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dependencies&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;nbytes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To a bunch of objects:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;a&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;priority&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nbytes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...),&lt;/span&gt;
         &lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;b&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;priority&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nbytes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...),&lt;/span&gt;
         &lt;span class=&quot;s&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;c&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;priority&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nbytes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[])}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(there is &lt;em&gt;much&lt;/em&gt; more state than what is listed above,
but hopefully the examples above are clear.)&lt;/p&gt;

&lt;p&gt;There were a few motivations for this:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;We wanted to try out Cython and PyPy, for which objects like this might be more effective than dictionaries.&lt;/li&gt;
  &lt;li&gt;We believe that this is probably a bit easier for developers new to the schedulers to understand. The proliferation of state dictionaries was not highly discoverable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Goal one ended up not working out.
We have not yet been able to make the scheduler significantly faster under Cython or PyPy with this new layout. There is even a slight memory increase with these changes.
However we have been happy with the results in code readability, and we hope that others find this useful as well.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/pitrou&quot;&gt;Antoine Pitrou&lt;/a&gt;,
who did most of the work here.&lt;/p&gt;

&lt;h3 id=&quot;user-priorities&quot;&gt;User Priorities&lt;/h3&gt;

&lt;p&gt;You can now submit tasks with different priorities.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;priority&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# Higher priority preferred
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;priority&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Lower priority happens later
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To be clear, Dask has always had priorities, they just weren’t easily user-settable.
Higher priorities are given precedence. The default priority for all tasks is zero.
You can also submit priorities for collections (like arrays and dataframes)&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;priority&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# give this computation higher priority.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/pull/1651&quot;&gt;dask/distributed #1651&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;related-projects&quot;&gt;Related projects&lt;/h2&gt;

&lt;p&gt;Several related projects are also undergoing releases:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tornado is updating to version 5.0 (there is a beta out now).
This is a major change that will put Tornado on the Asyncio event loop in Python 3.
It also includes many performance enhancements for high-bandwidth networks.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Bokeh 0.12.14 was just released.&lt;/p&gt;

    &lt;p&gt;Note that you will need to update Dask to work with this version of Bokeh&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://daskernetes.readthedocs.io/en/latest/&quot;&gt;Daskernetes&lt;/a&gt;, a new project for launching Dask on Kubernetes clusters&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;The following people contributed to the dask/dask repository since the 0.16.0
release on November 14th:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Albert DeFusco&lt;/li&gt;
  &lt;li&gt;Apostolos Vlachopoulos&lt;/li&gt;
  &lt;li&gt;castalheiro&lt;/li&gt;
  &lt;li&gt;James Bourbeau&lt;/li&gt;
  &lt;li&gt;Jon Mease&lt;/li&gt;
  &lt;li&gt;Ian Hopkinson&lt;/li&gt;
  &lt;li&gt;Jakub Nowacki&lt;/li&gt;
  &lt;li&gt;Jim Crist&lt;/li&gt;
  &lt;li&gt;John A Kirkham&lt;/li&gt;
  &lt;li&gt;Joseph Lin&lt;/li&gt;
  &lt;li&gt;Keisuke Fujii&lt;/li&gt;
  &lt;li&gt;Martijn Arts&lt;/li&gt;
  &lt;li&gt;Martin Durant&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Markus Gonser&lt;/li&gt;
  &lt;li&gt;Nir&lt;/li&gt;
  &lt;li&gt;Rich Signell&lt;/li&gt;
  &lt;li&gt;Roman Yurchak&lt;/li&gt;
  &lt;li&gt;S. Andrew Sheppard&lt;/li&gt;
  &lt;li&gt;sephib&lt;/li&gt;
  &lt;li&gt;Stephan Hoyer&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Uwe L. Korn&lt;/li&gt;
  &lt;li&gt;Wei Ji&lt;/li&gt;
  &lt;li&gt;Xander Johnson&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following people contributed to the dask/distributed repository since the
1.20.0 release on November 14th:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Alexander Ford&lt;/li&gt;
  &lt;li&gt;Antoine Pitrou&lt;/li&gt;
  &lt;li&gt;Brett Naul&lt;/li&gt;
  &lt;li&gt;Brian Broll&lt;/li&gt;
  &lt;li&gt;Bruce Merry&lt;/li&gt;
  &lt;li&gt;Cornelius Riemenschneider&lt;/li&gt;
  &lt;li&gt;Daniel Li&lt;/li&gt;
  &lt;li&gt;Jim Crist&lt;/li&gt;
  &lt;li&gt;Kelvin Yang&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Min RK&lt;/li&gt;
  &lt;li&gt;rqx&lt;/li&gt;
  &lt;li&gt;Russ Bubley&lt;/li&gt;
  &lt;li&gt;Scott Sievert&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Xander Johnson&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Credit Modeling with Dask</title>
   <link href="https://blog.dask.org/2018/02/09/credit-models-with-dask"/>
   <updated>2018-02-09T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/02/09/credit-models-with-dask</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <content type="html">
&lt;p&gt;This post explores a real-world use case calculating complex credit models in Python using Dask.
It is an example of a complex parallel system that is well outside of the traditional “big data” workloads.&lt;/p&gt;

&lt;h2 id=&quot;this-is-a-guest-post&quot;&gt;This is a guest post&lt;/h2&gt;

&lt;p&gt;Hi All,&lt;/p&gt;

&lt;p&gt;This is a guest post from &lt;a href=&quot;https://github.com/postelrich&quot;&gt;Rich Postelnik&lt;/a&gt;,
an Anaconda employee who works with a large retail bank on their credit modeling system.
They’re doing interesting work with Dask to manage complex computations
(see task graph below).
This is a nice example of using Dask for complex problems that are neither a big dataframe nor a big array, but are still highly parallel.
Rich was kind enough to write up this description of their problem and share it here.&lt;/p&gt;

&lt;p&gt;Thanks Rich!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/credit_models/simple-model.svg&quot;&gt;
  &lt;img src=&quot;/images/credit_models/simple-model.svg&quot; alt=&quot;zoomed model section&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is cross-posted at &lt;a href=&quot;https://www.anaconda.com/blog/developer-blog/credit-modeling-with-dask/&quot;&gt;Anaconda’s Developer Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;P.S. If others have similar solutions and would like to share them I’d love to host those on this blog as well.&lt;/p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;/h2&gt;

&lt;p&gt;When applying for a loan, like a credit card, mortgage, auto loan, etc., we want to estimate the likelihood of default and the profit (or loss) to be gained. Those models are composed of a complex set of equations that depend on each other. There can be hundreds of equations each of which could have up to 20 inputs and yield 20 outputs. That is a lot of information to keep track of! We want to avoid manually keeping track of the dependencies, as well as messy code like the following Python function:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;final_equation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;equation1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out2_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out2_2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out2_3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;equation2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out3_1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out3_2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;equation3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;out2_3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;out_final&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;equation_n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inputs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,...)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;out_final&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This boils down to a dependency and ordering problem known as task scheduling.&lt;/p&gt;

&lt;h2 id=&quot;dags-to-the-rescue&quot;&gt;DAGs to the rescue&lt;/h2&gt;

&lt;p&gt;&lt;img style=&quot;margin: 0 auto; display: block;&quot; src=&quot;/images/credit_models/snatch.jpg&quot; alt=&quot;snatch joke&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A &lt;a href=&quot;https://en.wikipedia.org/wiki/Directed_acyclic_graph&quot;&gt;directed acyclic graph&lt;/a&gt; (DAG) is commonly used to solve task scheduling problems. Dask is a library for delayed task computation that makes use of directed graphs at its core. &lt;a href=&quot;http://dask.pydata.org/en/latest/delayed.html&quot;&gt;dask.delayed&lt;/a&gt; is a simple decorator that turns a Python function into a graph vertex. If I pass the output from one delayed function as a parameter to another delayed function, Dask creates a directed edge between them. Let’s look at an example:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So here we have a function to add two numbers together. Let’s see what happens when we wrap it with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.delayed&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Delayed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;add-f6204fac-b067-40aa-9d6a-639fc719c3ce&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;add&lt;/code&gt; now returns a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Delayed&lt;/code&gt; object. We can pass this as an argument back into our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.delayed&lt;/code&gt; function to start building out a chain of computation.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;four&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;four&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;four&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Below we can see how the DAG starts to come together.&lt;/p&gt;

&lt;p&gt;&lt;img style=&quot;margin: 0 auto; display: block;&quot; src=&quot;/images/credit_models/four.png&quot; alt=&quot;four graph&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;mock-credit-example&quot;&gt;Mock credit example&lt;/h2&gt;

&lt;p&gt;Let’s assume I’m a mortgage bank and have 10 people applying for a mortgage. I want to estimate the group’s average likelihood to default based on years of credit history and income.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;hist_yrs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;incomes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Let’s also assume that default is a function of the incremented years history and half the years experience. While this could be written like:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;income&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I know in the future that I will need the incremented history for another calculation and want to be able to reuse the code as well as avoid doing the computation twice. Instead, I can break those functions out:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;halve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note how I wrapped the functions with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delayed&lt;/code&gt;. Now instead of returning a number these functions will return a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Delayed&lt;/code&gt; object. Even better is that these functions can also take &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Delayed&lt;/code&gt; objects as inputs. It is this passing of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Delayed&lt;/code&gt; objects as inputs to other &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;delayed&lt;/code&gt; functions that allows Dask to construct the task graph. I can now call these functions on my data in the style of normal Python code:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;inc_hist&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hist_yrs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;halved_income&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;halve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;estimated_default&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inc_hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;halved_income&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you look at these variables, you will see that nothing has actually been calculated yet. They are all lists of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Delayed&lt;/code&gt; objects.&lt;/p&gt;

&lt;p&gt;Now, to get the average, I could just take the sum of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;estimated_default&lt;/code&gt; but I want this to scale (and make a more interesting graph) so let’s do a merge-style reduction.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;agg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;middle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;agg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;default_sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;estimated_defaults&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;At this point &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default_sum&lt;/code&gt; is a list of length 1 and that first element is the sum of estimated default for all applicants. To get the average, we divide by the number of applicants and call compute:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;avg_default&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;default_sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;avg_default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# 40.75
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To see the computation graph that Dask will use, we call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;visualize&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;avg_default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/credit_models/dummy_graph.png&quot; style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;default graph&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And that is how Dask can be used to construct a complex system of equations with reusable intermediary calculations.&lt;/p&gt;

&lt;h2 id=&quot;how-we-used-dask-in-practice&quot;&gt;How we used Dask in practice&lt;/h2&gt;

&lt;p&gt;For our credit modeling problem, we used Dask to make a custom data structure to represent the individual equations. Using the default example above, this looked something like the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Equation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;inputs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;inc_hist&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;halved_income&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;outputs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;defaults&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;equation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inc_hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;halved_income&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kwargs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inc_hist&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;halved_income&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This allows us to write each equation as its own isolated function and mark its inputs and outputs. With this set of equation objects, we can determine the order of computation (with a &lt;a href=&quot;https://en.wikipedia.org/wiki/Topological_sorting&quot;&gt;topological sort&lt;/a&gt;) and let Dask handle the graph generation and computation. This eliminates the onerous task of manually passing around the arguments in the code base. Below is an example task graph for one particular model that the bank actually does.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/credit_models/simple.svg&quot;&gt;
  &lt;img src=&quot;/images/credit_models/simple.svg&quot; alt=&quot;calc task graph&quot; width=&quot;100%&quot; /&gt;
  &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This graph was a bit too large to render with the normal &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my_task.visualize()&lt;/code&gt; method, so instead we rendered it with &lt;a href=&quot;https://gephi.org&quot;&gt;Gephi&lt;/a&gt; to make the pretty colored graph above. The chaotic upper region of this graph is the individual equation calculations. Zooming in we can see the entry point, our input pandas DataFrame, as the large orange circle at the top and how it gets fed into many of the equations.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/credit_models/simple-model.svg&quot;&gt;
  &lt;img src=&quot;/images/credit_models/simple-model.svg&quot; alt=&quot;zoomed model section&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output of the model is about 100 times the size of the input so we do some aggregation at the end via tree reduction. This accounts for the more structured bottom half of the graph. The large green node at the bottom is our final output.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/credit_models/simple-agg.svg&quot;&gt;
  &lt;img src=&quot;/images/credit_models/simple-agg.svg&quot; alt=&quot;zoomed agg section&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h2&gt;

&lt;p&gt;With our Dask-based data structure, we spend more of our time writing model code rather than maintenance of the engine itself. This allows a clean separation between our analysts that design and write our models, and our computational system that runs them. Dask also offers a number of advantages not covered above. For example, with Dask you also get access to &lt;a href=&quot;https://distributed.readthedocs.io/en/latest/web.html&quot;&gt;diagnostics&lt;/a&gt; such as time spent running each task and resources used. Also, you can easily distribute your computation with &lt;a href=&quot;https://distributed.readthedocs.io/en/latest/&quot;&gt;dask distributed&lt;/a&gt; with relative ease. Now if I want to run our model across larger-than-memory data or on a distributed cluster, we don’t have to worry about rewriting our code to incorporate something like Spark. Finally, Dask allows you to give pandas-capable business analysts or less technical folks access to large datasets with the &lt;a href=&quot;http://dask.pydata.org/en/latest/dataframe.html&quot;&gt;dask dataframe&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;full-example&quot;&gt;Full Example&lt;/h2&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;halve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;agg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;middle&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:])&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;agg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])]&lt;/span&gt;


&lt;span class=&quot;n&quot;&gt;hist_yrs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;incomes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;inc_hist&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hist_yrs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;halved_income&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;halve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;incomes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;estimated_defaults&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;income&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inc_hist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;halved_income&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;default_sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;estimated_defaults&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;avg_default&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;default_sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;avg_default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;avg_default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visualize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# requires graphviz and python-graphviz to be installed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;Special thanks to Matt Rocklin, Michael Grant, Gus Cavanagh, and Rory Merritt for their feedback when writing this article.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Pangeo: JupyterHub, Dask, and XArray on the Cloud</title>
   <link href="https://blog.dask.org/2018/01/22/pangeo-2"/>
   <updated>2018-01-22T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2018/01/22/pangeo-2</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt;, the NSF
EarthCube program, and UC Berkeley BIDS&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A few weeks ago a few of us stood up &lt;a href=&quot;http://pangeo.pydata.org&quot;&gt;pangeo.pydata.org&lt;/a&gt;,
an experimental deployment of JupyterHub, Dask, and XArray on Google Container Engine (GKE)
to support atmospheric and oceanographic data analysis on large datasets.
This follows on &lt;a href=&quot;../../../2017/09/18/pangeo-1&quot;&gt;recent work&lt;/a&gt; to deploy Dask and XArray for the same workloads on super computers.
This system is a proof of concept that has taught us a great deal about how to move forward.
This blogpost briefly describes the problem,
the system,
then describes the collaboration,
and finally discusses a number of challenges that we’ll be working on in coming months.&lt;/p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;/h2&gt;

&lt;p&gt;Atmospheric and oceanographic sciences collect (with satellites) and generate (with simulations) large datasets
that they would like to analyze with distributed systems.
Libraries like Dask and XArray already solve this problem computationally if scientists have their own clusters,
but we seek to expand access by deploying on cloud-based systems.
We build a system to which people can log in, get Jupyter Notebooks, and launch Dask clusters without much hassle.
We hope that this increases access, and connects more scientists with more cloud-based datasets.&lt;/p&gt;

&lt;h2 id=&quot;the-system&quot;&gt;The System&lt;/h2&gt;

&lt;p&gt;We integrate several pre-existing technologies to build a system where people can log in,
get access to a Jupyter notebook,
launch distributed compute clusters using Dask,
and analyze large datasets stored in the cloud.
They have a full user environment available to them through a website,
can leverage thousands of cores for computation,
and use existing APIs and workflows that look familiar to how they work on their laptop.&lt;/p&gt;

&lt;p&gt;A video walk-through follows below:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/rSOJKbfNBNk&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;We assembled this system from a number of pieces and technologies:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jupyterhub.readthedocs.io/en/latest/&quot;&gt;JupyterHub&lt;/a&gt;: Provides both the ability to launch single-user notebook servers
and handles user management for us.
In particular we use the KubeSpawner and the excellent documentation at &lt;a href=&quot;https://zero-to-jupyterhub.readthedocs.io/en/latest&quot;&gt;Zero to JupyterHub&lt;/a&gt;,
which we recommend to anyone interested in this area.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jupyterhub/kubespawner&quot;&gt;KubeSpawner&lt;/a&gt;: A JupyterHub spawner that makes it easy to launch single-user notebook servers on Kubernetes systems&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://jupyterlab-tutorial.readthedocs.io/en/latest/&quot;&gt;JupyterLab&lt;/a&gt;: The newer version of the classic notebook,
which we use to provide a richer remote user interface,
complete with terminals, file management, and more.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://xarray.pydata.org&quot;&gt;XArray&lt;/a&gt;: Provides computation on NetCDF-style data.
XArray extends NumPy and Pandas to enable scientists to express complex computations on complex datasets
in ways that they find intuitive.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://dask.pydata.org&quot;&gt;Dask&lt;/a&gt;: Provides the parallel computation behind XArray&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/daskernetes&quot;&gt;Daskernetes&lt;/a&gt;: Makes it easy to launch Dask clusters on Kubernetes&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt;: In case it’s not already clear, all of this is based on Kubernetes,
which manages launching programs (like Jupyter notebook servers or Dask workers) on different machines,
while handling load balancing, permissions, and so on&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://cloud.google.com/kubernetes-engine/&quot;&gt;Google Container Engine&lt;/a&gt;: Google’s managed Kubernetes service.
Every major cloud provider now has such a system,
which makes us happy about not relying too heavily on one system&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://gcsfs.readthedocs.io/en/latest/&quot;&gt;GCSFS&lt;/a&gt;: A Python library providing intuitive access to Google Cloud Storage,
either through Python file interfaces or through a &lt;a href=&quot;https://en.wikipedia.org/wiki/Filesystem_in_Userspace&quot;&gt;FUSE&lt;/a&gt; file system&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://zarr.readthedocs.io/en/stable/&quot;&gt;Zarr&lt;/a&gt;: A chunked array storage format that is suitable for the cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;collaboration&quot;&gt;Collaboration&lt;/h2&gt;

&lt;p&gt;We were able to build, deploy, and use this system to answer real science questions in a couple weeks.
We feel that this result is significant in its own right,
and is largely because we collaborated widely.
This project required the expertise of several individuals across several projects, institutions, and funding sources.
Here are a few examples of who did what from which organization.
We list institutions and positions mostly to show the roles involved.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Alistair Miles, Professor, Oxford:
Helped to optimize Zarr for XArray on GCS&lt;/li&gt;
  &lt;li&gt;Jacob Tomlinson, Staff, UK Met Informatics Lab:
Developed original JADE deployment and early Dask-Kubernetes work.&lt;/li&gt;
  &lt;li&gt;Joe Hamman, Postdoc, National Center for Atmospheric Research:
Provided scientific use case, data, and work flow.
Tuned XArray and Zarr for efficient data storing and saving.&lt;/li&gt;
  &lt;li&gt;Martin Durant, Software developer, Anaconda Inc.:
Tuned GCSFS for many-access workloads. Also provided FUSE system for NetCDF support&lt;/li&gt;
  &lt;li&gt;Matt Pryor, Staff, Centre for Envronmental Data Analysis:
Extended original JADE deployment and early Dask-Kubernetes work.&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin, Software Developer, Anaconda Inc.
Integration. Also performance testing.&lt;/li&gt;
  &lt;li&gt;Ryan Abernathey, Assistant Professor, Columbia University:
XArray + Zarr support, scientific use cases, coordination&lt;/li&gt;
  &lt;li&gt;Stephan Hoyer, Software engineer, Google:
XArray support&lt;/li&gt;
  &lt;li&gt;Yuvi Panda, Staff, UC Berkeley BIDS and Data Science Education Program:
Provided assistance configuring JupyterHub with KubeSpawner.
Also prototyped the Daskernetes Dask + Kubernetes tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice the mix of academic and for-profit institutions.
Also notice the mix of scientists, staff, and professional software developers.
We believe that this mixture helps ensure the efficient construction of useful solutions.&lt;/p&gt;

&lt;h2 id=&quot;lessons&quot;&gt;Lessons&lt;/h2&gt;

&lt;p&gt;This experiment has taught us a few things that we hope to explore further:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Users can launch Kubernetes deployments from Kubernetes pods,
such as launching Dask clusters from their JupyterHub single-user notebooks.&lt;/p&gt;

    &lt;p&gt;To do this well we need to start defining user roles more explicitly within JupyterHub.
We need to give users a safe an isolated space on the cluster to use without affecting their neighbors.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;HDF5 and NetCDF on cloud storage is an open question&lt;/p&gt;

    &lt;p&gt;The file formats used for this sort of data are pervasive,
but not particulary convenient or efficent on cloud storage.
In particular the libraries used to read them make many small reads,
each of which is costly when operating on cloud object storage&lt;/p&gt;

    &lt;p&gt;I see a few options:&lt;/p&gt;

    &lt;ol&gt;
      &lt;li&gt;Use FUSE file systems,
but tune them with tricks like read-ahead and caching
in order to compensate for HDF’s access patterns&lt;/li&gt;
      &lt;li&gt;Use the HDF group’s proposed HSDS service,
which promises to resolve these issues&lt;/li&gt;
      &lt;li&gt;Adopt new file formats that are more cloud friendly.
Zarr is one such example that has so far performed admirably,
but certainly doesn’t have the long history of trust that HDF and NetCDF have earned.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Environment customization is important and tricky, especially when adding distributed computing.&lt;/p&gt;

    &lt;p&gt;Immediately after showing this to science groups they want to try it out with their own software environments.
They can do this easily in their notebook session with tools like pip or conda,
but to apply those same changes to their dask workers is a bit more challenging,
especially when those workers come and go dynamically.&lt;/p&gt;

    &lt;p&gt;We have solutions for this.
They can bulid and publish docker images.
They can add environment variables to specify extra pip or conda packages.
They can deploy their own pangeo deployment for their own group.&lt;/p&gt;

    &lt;p&gt;However these have all taken some work to do well so far.
We hope that some combination of Binder-like publishing and small modification tricks like environment variables resolve this problem.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Our docker images are very large.
This means that users sometimes need to wait a minute or more for their session or their dask workers to start up
(less after things have warmed up a bit).&lt;/p&gt;

    &lt;p&gt;It is surprising how much of this comes from conda and node packages.
We hope to resolve this both by improving our Docker hygeine
and by engaging packaging communities to audit package size.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Explore other clouds&lt;/p&gt;

    &lt;p&gt;We started with Google just because their Kubernetes support has been around the longest,
but all major cloud providers (Google, AWS, Azure) now provide some level of managed Kubernetes support.
Everything we’ve done has been cloud-vendor agnostic, and various groups with data already on other clouds have reached out and are starting deployment on those systems.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Combine efforts with other groups&lt;/p&gt;

    &lt;p&gt;We’re actually not the first group to do this.
The UK Met Informatics Lab quietly built a similar prototype, JADE (Jupyter and Dask Environment) many months ago.
We’re now collaborating to merge efforts.&lt;/p&gt;

    &lt;p&gt;It’s also worth mentioning that they prototyped the first iteration of Daskernetes.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Reach out to other communities&lt;/p&gt;

    &lt;p&gt;While we started our collaboration with atmospheric and oceanographic scientists,
these same solutions apply to many other disciplines.
We should investigate other fields and start collaborations with those communities.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Improve Dask + XArray algorithms&lt;/p&gt;

    &lt;p&gt;When we try new problems in new environments we often uncover new opportunities to improve Dask’s internal scheduling algorithms.
This case is no different :)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Much of this upcoming work is happening in the upstream projects
so this experimentation is both of concrete use to ongoing scientific research
as well as more broad use to the open source communities that these projects serve.&lt;/p&gt;

&lt;h2 id=&quot;community-uptake&quot;&gt;Community uptake&lt;/h2&gt;

&lt;p&gt;We presented this at a couple conferences over the past week.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;American Meteorological Society, Python Symposium, Keynote. Slides: &lt;a href=&quot;http://matthewrocklin.com/slides/ams-2018.html#/&quot;&gt;http://matthewrocklin.com/slides/ams-2018.html#/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Earth Science Information Partners Winter Meeting. Video: &lt;a href=&quot;https://www.youtube.com/watch?v=mDrjGxaXQT4&quot;&gt;https://www.youtube.com/watch?v=mDrjGxaXQT4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We found that this project aligns well with current efforts from many government agencies to publish large datasets on cloud stores (mostly S3).
Many of these data publication endeavors seek a computational system to enable access for the scientific public.
Our project seems to complement these needs without significant coordination.&lt;/p&gt;

&lt;h2 id=&quot;disclaimers&quot;&gt;Disclaimers&lt;/h2&gt;

&lt;p&gt;While we encourage people to try out &lt;a href=&quot;http://pangeo.pydata.org&quot;&gt;pangeo.pydata.org&lt;/a&gt; we also warn you that this system is immature.
In particular it has the following issues:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;it is insecure, please do not host sensitive data&lt;/li&gt;
  &lt;li&gt;it is unstable, and may be taken down at any time&lt;/li&gt;
  &lt;li&gt;it is small, we only have a handful of cores deployed at any time, mostly for experimentation purposes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However it is also &lt;em&gt;open&lt;/em&gt;, and instructions to deploy your own &lt;a href=&quot;https://github.com/pangeo-data/pangeo/tree/master/gce&quot;&gt;live here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;come-help&quot;&gt;Come help&lt;/h2&gt;

&lt;p&gt;We are a growing group comprised of many institutions including technologists, scientists, and open source projects.
There is plenty to do and plenty to discuss.
Please engage with us at &lt;a href=&quot;https://github.com/pangeo-data/pangeo/issues/new&quot;&gt;github.com/pangeo-data/pangeo/issues/new&lt;/a&gt;&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Development Log</title>
   <link href="https://blog.dask.org/2017/12/06/dask-dev-9"/>
   <updated>2017-12-06T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2017/12/06/dask-dev-9</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt; and the
Data Driven Discovery Initiative from the &lt;a href=&quot;https://www.moore.org/&quot;&gt;Moore
Foundation&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To increase transparency I’m trying to blog more often about the current work
going on around Dask and related projects. Nothing here is ready for
production. This blogpost is written in haste, so refined polish should not be
expected.&lt;/p&gt;

&lt;p&gt;Current development in Dask and Dask-related projects includes the following
efforts:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A possible change to our community communication model&lt;/li&gt;
  &lt;li&gt;A rewrite of the distributed scheduler&lt;/li&gt;
  &lt;li&gt;Kubernetes and Helm Charts for Dask&lt;/li&gt;
  &lt;li&gt;Adaptive deployment fixes&lt;/li&gt;
  &lt;li&gt;Continued support for NumPy and Pandas’ growth&lt;/li&gt;
  &lt;li&gt;Spectral Clustering in Dask-ML&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;community-communication&quot;&gt;Community Communication&lt;/h3&gt;

&lt;p&gt;Dask community communication generally happens in Github issues for bug and
feature tracking, the Stack Overflow #dask tag for user questions, and an
infrequently used Gitter chat.&lt;/p&gt;

&lt;p&gt;Separately, Dask developers who work for Anaconda Inc (there are about five of
us part-time) use an internal company chat and a closed weekly video meeting.
We’re now trying to migrate away from closed systems when possible.&lt;/p&gt;

&lt;p&gt;Details about future directions are in &lt;a href=&quot;https://github.com/dask/dask/issues/2945&quot;&gt;dask/dask
#2945&lt;/a&gt;. Thoughts and comments on
that issue would be welcome.&lt;/p&gt;

&lt;h3 id=&quot;scheduler-rewrite&quot;&gt;Scheduler Rewrite&lt;/h3&gt;

&lt;p&gt;When you start building clusters with 1000 workers the distributed scheduler
can become a bottleneck on some workloads. After working with PyPy and Cython
development teams we’ve decided to rewrite parts of the scheduler to make it
more amenable to acceleration by those technologies. Note that no actual
acceleration has occurred yet, just a refactor of internal state.&lt;/p&gt;

&lt;p&gt;Previously the distributed scheduler was focused around a large set of Python
dictionaries, sets, and lists that indexed into each other heavily. This was
done both for low-tech code technology reasons and for performance reasons
(Python core data structures are fast). However, compiler technologies like
PyPy and Cython can optimize Python object access down to C speeds, so we’re
experimenting with switching away from Python data structures to Python objects
to see how much this is able to help.&lt;/p&gt;

&lt;p&gt;This change will be invisible operationally (the full test suite remains
virtually unchanged), but will be a significant change to the scheduler’s
internal state. We’re keeping around a compatibility layer, but people who
were building their own diagnostics around the internal state should check out
with the new changes.&lt;/p&gt;

&lt;p&gt;Ongoing work by Antoine Pitrou in &lt;a href=&quot;https://github.com/dask/distributed/pull/1594&quot;&gt;dask/distributed #1594&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;kubernetes-and-helm-charts-for-dask&quot;&gt;Kubernetes and Helm Charts for Dask&lt;/h3&gt;

&lt;p&gt;In service of the &lt;a href=&quot;https://pangeo-data.github.io&quot;&gt;Pangeo&lt;/a&gt; project to enable
scalable data analysis of atmospheric and oceanographic data we’ve been
improving the tooling around launching Dask on Cloud infrastructure,
particularly leveraging Kubernetes.&lt;/p&gt;

&lt;p&gt;To that end we’re making some flexible Docker containers and Helm Charts for
Dask, and hope to combine them with JupyterHub in the coming weeks.&lt;/p&gt;

&lt;p&gt;Work done by myself in the following repositories. Feedback would be very
welcome. I am learning on the job with Helm here.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/helm-chart&quot;&gt;https://github.com/dask/dask-docker&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/helm-chart&quot;&gt;https://github.com/dask/helm-chart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you use Helm on Kubernetes then you might want to try the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;helm repo add dask https://dask.github.io/helm-chart
helm update
helm install dask/dask
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This installs a full Dask cluster and a Jupyter server. The Docker containers
contain entry points that allow their environments to be updated with custom
packages easily.&lt;/p&gt;

&lt;p&gt;This work extends prior work on the previous package,
&lt;a href=&quot;https://github.com/dask/dask-kubernetes&quot;&gt;dask-kubernetes&lt;/a&gt;, but is slightly
more modular for use alongside other systems.&lt;/p&gt;

&lt;h3 id=&quot;adaptive-deployment-fixes&quot;&gt;Adaptive deployment fixes&lt;/h3&gt;

&lt;p&gt;Adaptive deployments, where a cluster manager scales a Dask cluster up or down
based on current workloads recently got a makeover, including a number of bug
fixes around odd or infrequent behavior.&lt;/p&gt;

&lt;p&gt;Work done by &lt;a href=&quot;https://github.com/rbubley&quot;&gt;Russ Bubley&lt;/a&gt; here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/pull/1607&quot;&gt;dask/distributed #1607&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/pull/1608&quot;&gt;dask/distributed #1608&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/pull/1609&quot;&gt;dask/distributed #1609&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;keeping-up-with-numpy-and-pandas&quot;&gt;Keeping up with NumPy and Pandas&lt;/h3&gt;

&lt;p&gt;NumPy 1.14 is due to release soon. Dask.array had to update how it handled
structured dtypes in &lt;a href=&quot;https://github.com/dask/dask/pull/2964&quot;&gt;dask/dask #2694&lt;/a&gt;
(Work by Tom Augspurger).&lt;/p&gt;

&lt;p&gt;Dask.dataframe is gaining the ability to merge/join simultaneously on columns
and indices, following a similar feature released in Pandas 0.22. Work done by
Jon Mease in &lt;a href=&quot;https://github.com/dask/dask/pull/2960&quot;&gt;dask/dask #2960&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;spectral-clustering-in-dask-ml&quot;&gt;Spectral Clustering in Dask-ML&lt;/h3&gt;

&lt;p&gt;Dask-ML recently added an approximate and scalable Spectral Clustering
algorithm in &lt;a href=&quot;https://github.com/dask/dask-ml/pull/91&quot;&gt;dask/dask-ml #91&lt;/a&gt;
(&lt;a href=&quot;http://dask-ml.readthedocs.io/en/latest/auto_examples/plot_spectral_clustering.html&quot;&gt;gallery example&lt;/a&gt;).&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Release 0.16.0</title>
   <link href="https://blog.dask.org/2017/11/21/dask-0.16.0"/>
   <updated>2017-11-21T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2017/11/21/dask-0.16.0</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc.&lt;/a&gt;
and the Data Driven Discovery Initiative from the &lt;a href=&quot;https://www.moore.org/&quot;&gt;Moore
Foundation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m pleased to announce the release of Dask version 0.16.0. This is a major
release with new features, breaking changes, and stability improvements. This
blogpost outlines notable changes since the 0.15.3 release on September 24th.&lt;/p&gt;

&lt;p&gt;You can conda install Dask:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install dask
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or pip install from PyPI:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask[complete] --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Conda packages are available on both conda-forge and default channels.&lt;/p&gt;

&lt;p&gt;Full changelogs are available here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some notable changes follow.&lt;/p&gt;

&lt;h2 id=&quot;breaking-changes&quot;&gt;Breaking Changes&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.async&lt;/code&gt; module was moved to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask.local&lt;/code&gt; for Python 3.7
compatibility. This was previously deprecated and is now fully removed.&lt;/li&gt;
  &lt;li&gt;The distributed scheduler’s diagnostic JSON pages have been removed and
replaced by more informative templated HTML.&lt;/li&gt;
  &lt;li&gt;The use of commonly-used private methods &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_keys&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_optimize&lt;/code&gt; have been
replaced with the Dask collection interface (see below).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;dask-collection-interface&quot;&gt;Dask collection interface&lt;/h2&gt;

&lt;p&gt;It is now easier to implement custom collections using the Dask collection
interface.&lt;/p&gt;

&lt;p&gt;Dask collections (arrays, dataframes, bags, delayed) interact with Dask
schedulers (single-machine, distributed) with a few internal methods. We
formalized this interface into protocols like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.__dask_graph__()&lt;/code&gt; and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.__dask_keys__()&lt;/code&gt; and have
&lt;a href=&quot;http://dask.pydata.org/en/latest/custom-collections.html&quot;&gt;published that interface&lt;/a&gt;.
Any object that implements the methods described in that document will interact
with all Dask scheduler features as a first-class Dask object.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyDaskCollection&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__dask_graph__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__dask_keys__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__dask_optimize__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...):&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This interface has already been implemented within the XArray project for
labeled and indexed arrays. Now all XArray classes (DataSet, DataArray,
Variable) are fully understood by all Dask schedulers. They are as first-class
as dask.arrays or dask.dataframes.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;xarray&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xa&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;xa&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_mfdataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;*.nc&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;ds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# XArray object integrate seamlessly with Dask schedulers
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Documentation:
&lt;a href=&quot;http://dask.pydata.org/en/latest/custom-collections.html&quot;&gt;http://dask.pydata.org/en/latest/custom-collections.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Work on Dask’s collection interfaces was primarily done by Jim Crist.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;bandwidth-and-tornado-5-compatibility&quot;&gt;Bandwidth and Tornado 5 compatibility&lt;/h2&gt;

&lt;p&gt;Dask is built on the Tornado library for concurrent network programming. In an
effort to improve inter-worker bandwidth on exotic hardware (Infiniband), Dask
developers are proposing changes to Tornado’s network infrastructure.&lt;/p&gt;

&lt;p&gt;However, in order to use these changes Dask itself needs to run on the next
version of Tornado in development, Tornado 5.0.0, which breaks a number of
interfaces on which Dask has relied. Dask developers have been resolving these
and we encourage other PyData developers to do the same. For example, neither
Bokeh nor Jupyter work on Tornado 5.0.0-dev.&lt;/p&gt;

&lt;p&gt;Dask inter-worker bandwidth is peaking at around 1.5-2GB/s on a network
theoretically capable of 3GB/s. &lt;a href=&quot;https://github.com/pangeo-data/pangeo/issues/6&quot;&gt;GitHub issue: pangeo #6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/bandwidth-plot.png&quot;&gt;
  &lt;img src=&quot;/images/bandwidth-plot.png&quot; alt=&quot;Dask worker bandwidth&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Network performance and Tornado compatibility are primarily being handled by
Antoine Pitrou.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;parquet-compatibility&quot;&gt;Parquet Compatibility&lt;/h2&gt;

&lt;p&gt;Dask.dataframe can use either of the two common Parquet libraries in Python,
Apache Arrow and Fastparquet. Each has its own strengths and its own base of
users who prefer it. We’ve significantly extended Dask’s parquet test suite to
cover each library, extending roundtrip compatibility. Notably, you can now
both read and write with PyArrow.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;fastparquet&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;...&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;engine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;pyarrow&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There is still work to be done here. The variety of parquet reader/writers and
conventions out there makes completely solving this problem difficult. It’s
nice seeing the various projects slowly converge on common functionality.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This work was jointly done by Uwe Korn, Jim Crist, and Martin Durant.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;retrying-tasks&quot;&gt;Retrying Tasks&lt;/h2&gt;

&lt;p&gt;One of the most requested features for the Dask.distributed scheduler is the
ability to retry failed tasks. This is particularly useful to people using
Dask as a task queue, rather than as a big dataframe or array.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;future&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;submit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;retries&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Task retries were primarily built by Antoine Pitrou.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;transactional-work-stealing&quot;&gt;Transactional Work Stealing&lt;/h2&gt;

&lt;p&gt;The Dask.distributed task scheduler performs load balancing through work
stealing. Previously this would sometimes result in the same task running
simultaneously in two locations. Now stealing is transactional, meaning that
it will avoid accidentally running the same task twice. This behavior is
especially important for people using Dask tasks for side effects.&lt;/p&gt;

&lt;p&gt;It is still possible for the same task to run twice, but now this only happens
in more extreme situations, such as when a worker dies or a TCP connection is
severed, neither of which are common on standard hardware.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Transactional work stealing was primarily implemented by Matthew Rocklin.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;new-diagnostic-pages&quot;&gt;New Diagnostic Pages&lt;/h2&gt;

&lt;p&gt;There is a new set of diagnostic web pages available in the &lt;em&gt;Info&lt;/em&gt; tab of the
dashboard. These pages provide more in-depth information about each worker and
task, but are not dynamic in any way. They use Tornado templates rather than
Bokeh plots, which means that they are less responsive but are much easier to
build. This is an easy and cheap way to expose more scheduler state.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/scheduler-info-task.png&quot;&gt;
  &lt;img src=&quot;/images/scheduler-info-task.png&quot; alt=&quot;Task page of Dask&apos;s scheduler info dashboard&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/tree/master/distributed/bokeh/templates&quot;&gt;Existing templates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;nested-compute-calls&quot;&gt;Nested compute calls&lt;/h2&gt;

&lt;p&gt;Calling &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.compute()&lt;/code&gt; &lt;em&gt;within&lt;/em&gt; a task now invokes the same distributed
scheduler. This enables writing more complex workloads with less thought to
starting worker clients.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.distributed&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# only works for the newer scheduler
&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;delayed&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# can call dask.compute within delayed task
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Nested compute calls were primarily developed by Matthew Rocklin and Olivier
Grisel.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;more-aggressive-garbage-collection&quot;&gt;More aggressive Garbage Collection&lt;/h2&gt;

&lt;p&gt;The workers now explicitly call &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gc.collect()&lt;/code&gt; at various times when under
memory pressure and when releasing data. This helps to avoid some memory
leaks, especially when using Pandas dataframes. Doing this carefully proved
to require a surprising degree of detail.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Improved garbage collection was primarily implemented and tested by Fabian
Keller and Olivier Grisel, with recommendations by Antoine Pitrou.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;related-projects&quot;&gt;Related projects&lt;/h2&gt;

&lt;h3 id=&quot;dask-ml&quot;&gt;Dask-ML&lt;/h3&gt;

&lt;p&gt;A variety of Dask Machine Learning projects are now being assembled under one
unified repository, &lt;a href=&quot;http://dask-ml.readthedocs.io/en/latest/&quot;&gt;dask-ml&lt;/a&gt;. We
encourage users and researchers alike to read through that project. We believe
there are many useful and interesting approaches contained within.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Docs: &lt;a href=&quot;http://dask-ml.readthedocs.io/en/latest/&quot;&gt;dask-ml.readthedocs.io&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Github: &lt;a href=&quot;https://github.com/dask/dask-ml&quot;&gt;github.com/dask/dask-ml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;The work to assemble and curate these algorithms is primarily being handled by
Tom Augspurger.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;xarray&quot;&gt;XArray&lt;/h3&gt;

&lt;p&gt;The &lt;a href=&quot;http://xarray.pydata.org/en/stable/&quot;&gt;XArray&lt;/a&gt; project for indexed and
labeled arrays is also releasing their major 0.10.0 release this week, which
includes many performance improvements, particularly for using Dask on larger
datasets.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Docs: &lt;a href=&quot;http://xarray.pydata.org/en/stable/&quot;&gt;xarray.pydata.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Release notes: &lt;a href=&quot;http://xarray.pydata.org/en/latest/whats-new.html&quot;&gt;xarray.pydata.org/en/latest/whats-new.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;The following people contributed to the dask/dask repository since the 0.15.3
release on September 24th:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ced4&lt;/li&gt;
  &lt;li&gt;Christopher Prohm&lt;/li&gt;
  &lt;li&gt;fjetter&lt;/li&gt;
  &lt;li&gt;Hai Nguyen Mau&lt;/li&gt;
  &lt;li&gt;Ian Hopkinson&lt;/li&gt;
  &lt;li&gt;James Bourbeau&lt;/li&gt;
  &lt;li&gt;James Munroe&lt;/li&gt;
  &lt;li&gt;Jesse Vogt&lt;/li&gt;
  &lt;li&gt;Jim Crist&lt;/li&gt;
  &lt;li&gt;John Kirkham&lt;/li&gt;
  &lt;li&gt;Keisuke Fujii&lt;/li&gt;
  &lt;li&gt;Matthias Bussonnier&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;mayl&lt;/li&gt;
  &lt;li&gt;Martin Durant&lt;/li&gt;
  &lt;li&gt;Olivier Grisel&lt;/li&gt;
  &lt;li&gt;severo&lt;/li&gt;
  &lt;li&gt;Simon Perkins&lt;/li&gt;
  &lt;li&gt;Stephan Hoyer&lt;/li&gt;
  &lt;li&gt;Thomas A Caswell&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Uwe L. Korn&lt;/li&gt;
  &lt;li&gt;Wei Ji&lt;/li&gt;
  &lt;li&gt;xwang777&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following people contributed to the dask/distributed repository since the
1.19.1 release on September 24nd:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Alvaro Ulloa&lt;/li&gt;
  &lt;li&gt;Antoine Pitrou&lt;/li&gt;
  &lt;li&gt;chkoar&lt;/li&gt;
  &lt;li&gt;Fabian Keller&lt;/li&gt;
  &lt;li&gt;Ian Hopkinson&lt;/li&gt;
  &lt;li&gt;Jim Crist&lt;/li&gt;
  &lt;li&gt;Kelvin Yang&lt;/li&gt;
  &lt;li&gt;Krisztián Szűcs&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Mike DePalatis&lt;/li&gt;
  &lt;li&gt;Olivier Grisel&lt;/li&gt;
  &lt;li&gt;rbubley&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following people contributed to the dask/dask-ml repository&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Evan Welch&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;severo&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Trey Causey&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition, we are proud to announce that Olivier Grisel has accepted commit
rights to the Dask projects. Olivier has been particularly active on the
distributed scheduler, and on related projects like Joblib, SKLearn, and
Cloudpickle.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Optimizing Data Structure Access in Python</title>
   <link href="https://blog.dask.org/2017/11/03/data-structure-benchmark"/>
   <updated>2017-11-03T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2017/11/03/data-structure-benchmark</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt; and the Data
Driven Discovery Initiative from the &lt;a href=&quot;https://www.moore.org/&quot;&gt;Moore Foundation&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Last week at &lt;a href=&quot;https://de.pycon.org/&quot;&gt;PyCon DE&lt;/a&gt; I had the good fortune to meet
&lt;a href=&quot;http://www.behnel.de/&quot;&gt;Stefan Behnel&lt;/a&gt;, one of the core developers of Cython.
Together we worked to optimize a small benchmark that is representative of
Dask’s central task scheduler, a pure-Python application that is primarily data
structure bound.&lt;/p&gt;

&lt;p&gt;Our benchmark is a toy problem that creates three data structures that index
each other with dictionaries, lists, and sets, and then does some simple
arithmetic. (You don’t need to understand this benchmark deeply to read this
article.)&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;random&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;time&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;nA&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;nB&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;nC&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;A-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;B-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nB&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))]&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;B-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;C-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nC&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))}&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;C-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;A-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a_key&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;b_keys&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a_key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b_key&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b_keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c_key&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b_key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c_key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;


&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Duration: %0.3f seconds&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python benchmark.py
Duration: 1.12 seconds
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is an atypical problem Python optimization because it is primarily bound
by data structure access (dicts, lists, sets), rather than numerical operations
commonly optimized by Cython (nested for loops over floating point arithmetic).
Python is already decently fast here, typically within a factor of 2-5x of
compiled languages like Java or C++, but still we’d like to improve this when
possible.&lt;/p&gt;

&lt;p&gt;In this post we combine two different methods to optimize data-structure bound
workloads:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Compiling Python code with Cython with no other annotations&lt;/li&gt;
  &lt;li&gt;Interning strings for more rapid dict lookups&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finally at the end of the post we also run the benchmark under PyPy to compare
performance.&lt;/p&gt;

&lt;h2 id=&quot;cython&quot;&gt;Cython&lt;/h2&gt;

&lt;p&gt;First we compile our Python code with Cython. Normally when using Cython we
annotate our variables with types, giving the compiler enough information
to avoid using Python altogether. However in our case we don’t have many
numeric operations and we’re going to be using Python data structures
regardless, so this won’t help much. We compile our original Python code
without alteration.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cythonize -i benchmark.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And run&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ python -c &quot;import benchmark&quot;
Duration: 0.73 seconds
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This gives us a decent speedup from 1.1 seconds to 0.73 seconds. This isn’t
huge relative to typical Cython speedups (which are often 10-100x) but would be
a &lt;em&gt;very welcome&lt;/em&gt; change for our scheduler, where we’ve been chasing 5%
optimizations for a while now.&lt;/p&gt;

&lt;h2 id=&quot;interning-strings&quot;&gt;Interning Strings&lt;/h2&gt;

&lt;p&gt;Our second trick is to intern strings. This means that we try to always have
only one copy of every string. This improves performance when doing dictionary
lookups because of the following:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Python computes the hash of the string only once (strings cache their hash
value once computed)&lt;/li&gt;
  &lt;li&gt;Python checks for object identity (fast) before moving on to value equality
(slow)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or, anecdotally, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text is text&lt;/code&gt; is faster in Python than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text == text&lt;/code&gt;. If
you ensure that there is only one copy of every string then you only need to do
identity comparisons like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;text is text&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So, if any time we see a string &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;abc&quot;&lt;/code&gt; it is exactly the same object as all
other &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&quot;abc&quot;&lt;/code&gt; strings in our program, then string-dict lookups will only
require a pointer/integer equality check, rather than having to do a full
string comparison.&lt;/p&gt;

&lt;p&gt;Adding string interning to our benchmark looks like the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;inter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;intern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;KeyError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;inter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;A&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;intern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;A-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;intern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;B-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nB&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                  &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))]&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;intern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;B-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;intern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;C-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nC&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
                  &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;randint&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))}&lt;/span&gt;
     &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;C&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;intern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;C-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nC&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)}&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;intern&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;A-%d&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nA&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# The rest of the benchmark is as before
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This brings our duration from 1.1s down to 0.75s. Note that this is without
the separate Cython improvements described just above.&lt;/p&gt;

&lt;h2 id=&quot;cython--interning&quot;&gt;Cython + Interning&lt;/h2&gt;

&lt;p&gt;We can combine both optimizations. This brings us to around 0.45s, a 2-3x
improvement over our original time.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;cythonize -i benchmark2.py

$ python -c &quot;import benchmark2&quot;
Duration: 0.46 seconds
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;pypy&quot;&gt;PyPy&lt;/h2&gt;

&lt;p&gt;Alternatively, we can just run everything in PyPy.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ pypy3 benchmark1.py  # original
Duration: 0.25 seconds

$ pypy3 benchmark2.py  # includes interning
Duraiton: 0.20 seconds
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So PyPy can be quite a bit faster than Cython on this sort of code (which is
not a big surprise). Interning helps a bit, but not quite as much.&lt;/p&gt;

&lt;p&gt;This is fairly encouraging. The Dask scheduler can run under PyPy even while
Dask clients and workers run under normal CPython (for use with the full PyData
stack).&lt;/p&gt;

&lt;h2 id=&quot;preliminary-results-on-dask-benchmark&quot;&gt;Preliminary Results on Dask Benchmark&lt;/h2&gt;

&lt;p&gt;We started this experiment with the assumption that our toy benchmark somehow
represented the Dask’s scheduler in terms of performance characteristics. This
assumption, of course, is false. The Dask scheduler is significantly more
complex and it is difficult to build a single toy example to represent its
performance.&lt;/p&gt;

&lt;p&gt;When we try these tricks on a &lt;a href=&quot;https://gist.github.com/88b3c29e645ba2eae2d079a1de25d266&quot;&gt;slightly more complex
benchmark&lt;/a&gt; that
actually uses the Dask scheduler we find the following results:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Cython&lt;/strong&gt;: almost no effect&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;String Interning&lt;/strong&gt;: almost no effect&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;PyPy&lt;/strong&gt;: almost no effect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However I have only spent a brief amount of time on this (twenty minutes?) and
so I hope that the lack of a performance gain here is due to lack of effort.&lt;/p&gt;

&lt;p&gt;If anyone is interested in this I hope that this blogpost contains enough
information to get anyone started if they want to investigate further.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Streaming Dataframes</title>
   <link href="https://blog.dask.org/2017/10/16/streaming-dataframes-1"/>
   <updated>2017-10-16T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2017/10/16/streaming-dataframes-1</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc&lt;/a&gt; and the Data
Driven Discovery Initiative from the &lt;a href=&quot;https://www.moore.org/&quot;&gt;Moore Foundation&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is about experimental software. This is not ready for public use.
All code examples and API in this post are subject to change without warning.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/streaming-dataframes-plot.gif&quot;&gt;
  &lt;img src=&quot;/images/streaming-dataframes-plot.gif&quot; align=&quot;right&quot; width=&quot;70%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;This post describes a prototype project to handle continuous data sources of
tabular data using Pandas and Streamz.&lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Some data never stops. It arrives continuously in a constant, never-ending
stream. This happens in financial time series, web server logs, scientific
instruments, IoT telemetry, and more. Algorithms to handle this data are
slightly different from what you find in libraries like NumPy and Pandas, which
assume that they know all of the data up-front. It’s still possible to use
NumPy and Pandas, but you need to combine them with some cleverness and keep
enough intermediate data around to compute marginal updates when new data comes
in.&lt;/p&gt;

&lt;h2 id=&quot;example-streaming-mean&quot;&gt;Example: Streaming Mean&lt;/h2&gt;

&lt;p&gt;For example, imagine that we have a continuous stream of CSV files arriving
and we want to print out the mean of our data over time. Whenever a new CSV
file arrives we need to recompute the mean of the entire dataset. If we’re
clever we keep around enough state so that we can compute this mean without
looking back over the rest of our historical data. We can accomplish this by keeping
running totals and running counts as follows:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# filenames is an infinite iterator
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now as we add new files to our &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;filenames&lt;/code&gt; iterator our code prints out new
means that are updated over time. We don’t have a single mean result, we have
continuous stream of mean results that are each valid for the data up to that
point. Our output data is an infinite stream, just like our input data.&lt;/p&gt;

&lt;p&gt;When our computations are linear and straightforward like this a for loop
suffices. However when our computations have several streams branching out or
converging, possibly with rate limiting or buffering between them, this
for-loop approach can grow complex and difficult to manage.&lt;/p&gt;

&lt;h2 id=&quot;streamz&quot;&gt;Streamz&lt;/h2&gt;

&lt;p&gt;A few months ago I pushed a small library called
&lt;a href=&quot;http://streamz.readthedocs.io/en/latest/&quot;&gt;streamz&lt;/a&gt;, which handled control flow
for pipelines, including linear map operations, operations that accumulated
state, branching, joining, as well as back pressure, flow control, feedback,
and so on. Streamz was designed to handle all of the movement of data and
signaling of computation at the right time. This library was quietly used by a
couple of groups and now feels fairly clean and useful.&lt;/p&gt;

&lt;p&gt;Streamz was designed to handle the &lt;em&gt;control flow&lt;/em&gt; of such a system, but did
nothing to help you with streaming algorithms. Over the past week I’ve been
building a dataframe module on top of streamz to help with common streaming
tabular data situations. This module uses Pandas and implements a subset of
the Pandas API, so hopefully it will be easy to use for programmers with
existing Python knowledge.&lt;/p&gt;

&lt;h2 id=&quot;example-streaming-mean-1&quot;&gt;Example: Streaming Mean&lt;/h2&gt;

&lt;p&gt;Our example above could be written as follows with streamz&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Stream&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filenames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;path/to/dir/*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# stream of filenames
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                  &lt;span class=&quot;c1&quot;&gt;# stream of Pandas dataframes
&lt;/span&gt;             &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_dataframe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;example&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;...))&lt;/span&gt;        &lt;span class=&quot;c1&quot;&gt;# logical streaming dataframe
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sink&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;                   &lt;span class=&quot;c1&quot;&gt;# printed stream of mean values
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This example is no more clear than the for-loop version. On its own this is
probably a &lt;em&gt;worse&lt;/em&gt; solution than what we had before, just because it involves
new technology. However it starts to become useful in two situations:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;You want to do more complex streaming algorithms&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;Alice&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sink&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# or
&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rolling&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;300ms&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;It would require more cleverness to build these algorithms with a for loop
as above.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;You want to do multiple operations, deal with flow control, etc..&lt;/p&gt;

    &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sink&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rate_limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.500&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sink&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write_to_database&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Consistently branching off computations, routing data correctly, and
handling time can all be challenging to accomplish consistently.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;jupyter-integration-and-streaming-outputs&quot;&gt;Jupyter Integration and Streaming Outputs&lt;/h2&gt;

&lt;p&gt;During development we’ve found it very useful to have live updating outputs in
Jupyter.&lt;/p&gt;

&lt;p&gt;Usually when we evaluate code in Jupyter we have static inputs and static
outputs:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/jupyter-output-static.png&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;However now both our inputs and our outputs are live:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/jupyter-output-streaming.gif&quot; width=&quot;70%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We accomplish this using a combination of
&lt;a href=&quot;https://ipywidgets.readthedocs.io/en/stable/&quot;&gt;ipywidgets&lt;/a&gt; and &lt;a href=&quot;https://bokeh.pydata.org/en/latest/&quot;&gt;Bokeh
plots&lt;/a&gt; both of which provide nice hooks to
change previous Jupyter outputs and work well with the Tornado IOLoop (streamz,
Bokeh, Jupyter, and Dask all use Tornado for concurrency). We’re able to build
nicely responsive feedback whenever things change.&lt;/p&gt;

&lt;p&gt;In the following example we build our CSV to dataframe pipeline that updates
whenever new files appear in a directory. Whenever we drag files to the data
directory on the left we see that all of our outputs update on the right.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/streaming-dataframes-files.gif&quot;&gt;
  &lt;img src=&quot;/images/streaming-dataframes-files.gif&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-is-supported&quot;&gt;What is supported?&lt;/h2&gt;

&lt;p&gt;This project is very young and could use some help. There are plenty of holes
in the API. That being said, the following works well:&lt;/p&gt;

&lt;p&gt;Elementwise operations:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;z&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Simple reductions:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Groupby reductions:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Rolling reductions by number of rows or time window&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rolling&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rolling&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;100ms&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;quantile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mf&quot;&gt;0.9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Real time plotting with &lt;a href=&quot;https://bokeh.pydata.org&quot;&gt;Bokeh&lt;/a&gt; (one of my favorite features)&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;sdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;/images/streaming-dataframes-plot.gif&quot;&gt;
  &lt;img src=&quot;/images/streaming-dataframes-plot.gif&quot; width=&quot;100%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;whats-missing&quot;&gt;What’s missing?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Parallel computing:&lt;/strong&gt; The core streamz library has an optional
&lt;a href=&quot;https;//dask.pydata.org/&quot;&gt;Dask&lt;/a&gt; backend for parallel computing. I haven’t
yet made any attempt to attach this to the dataframe implementation.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Data ingestion&lt;/strong&gt; from common streaming sources like Kafka. We’re in the
process now of building asynchronous-aware wrappers around Kafka Python
client libraries, so this is likely to come soon.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Out-of-order data access:&lt;/strong&gt; soon after parallel data ingestion (like
reading from multiple Kafka partitions at once) we’ll need to figure out
how to handle out-of-order data access. This is doable, but will take some
effort. This is where more mature libraries like
&lt;a href=&quot;https://flink.apache.org/&quot;&gt;Flink&lt;/a&gt; are quite strong.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Performance:&lt;/strong&gt; Some of the operations above (particularly rolling
operations) do involve non-trivial copying, especially with larger windows.
We’re relying heavily on the Pandas library which wasn’t designed with
rapidly changing data in mind. Hopefully future iterations of Pandas
(Arrow/libpandas/Pandas 2.0?) will make this more efficient.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Filled out API:&lt;/strong&gt; Many common operations (like variance) haven’t yet
been implemented. Some of this is due to laziness and some is due to
wanting to find the right algorithm.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Robust plotting:&lt;/strong&gt; Currently this works well for numeric data with a
timeseries index but not so well for other data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But most importantly this needs &lt;strong&gt;use&lt;/strong&gt; by people with real problems to help us
understand what here is valuable and what is unpleasant.&lt;/p&gt;

&lt;p&gt;Help would be welcome with any of this.&lt;/p&gt;

&lt;p&gt;You can install this from github&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install git+https://github.com/mrocklin/streamz.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Documentation and code are here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://streamz.readthedocs.io/en/latest/&quot;&gt;streamz.readthedocs.io&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/mrocklin/streamz&quot;&gt;github.com/mrocklin/streamz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;current-work&quot;&gt;Current work&lt;/h2&gt;

&lt;p&gt;Current and upcoming work is focused on data ingestion from Kafka and
parallelizing with Dask.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Notes on Kafka in Python</title>
   <link href="https://blog.dask.org/2017/10/10/kafka-python"/>
   <updated>2017-10-10T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2017/10/10/kafka-python</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://kafka.apache.org/images/logo.png&quot; align=&quot;right&quot; width=&quot;40%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I recently investigated the state of Python libraries for Kafka. This blogpost
contains my findings.&lt;/p&gt;

&lt;p&gt;Both &lt;a href=&quot;http://pykafka.readthedocs.io/en/latest/&quot;&gt;PyKafka&lt;/a&gt; and
&lt;a href=&quot;https://github.com/confluentinc/confluent-kafka-python&quot;&gt;confluent-kafka&lt;/a&gt; have
mature implementations and are maintained by invested companies.
Confluent-kafka is generally faster while PyKafka is arguably better designed
and documented for Python usability.&lt;/p&gt;

&lt;p&gt;Conda packages are now available for both. I hope to extend one or both to
support asynchronous workloads with Tornado.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: I am not an expert in this space. I have no strong affiliation
with any of these projects. This is a report based on my experience of the
past few weeks. I don’t encourage anyone to draw conclusions from this work.
I encourage people to investigate on their own.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://kafka.apache.org/&quot;&gt;Apache Kafka&lt;/a&gt; is a common data system for streaming
architectures. It manages rolling buffers of byte messages and provides a
scalable mechanism to publish or subscribe to those buffers in real time.
While Kafka was originally designed within the JVM space the fact that it only
manages bytes makes it easy to access from native code systems like C/C++ and
Python.&lt;/p&gt;

&lt;h2 id=&quot;python-options&quot;&gt;Python Options&lt;/h2&gt;

&lt;p&gt;Today there are three independent Kafka implementations in Python, two of which
are optionally backed by a C implementation,
&lt;a href=&quot;https://github.com/edenhill/librdkafka&quot;&gt;librdkafka&lt;/a&gt;, for speed:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://kafka-python.readthedocs.io/en/master/&quot;&gt;kafka-python&lt;/a&gt;: The first on
the scene, a Pure Python Kafka client with robust documentation and an API
that is fairly faithful to the original Java API. This implementation has
the most stars on GitHub, the most active development team (by number of
committers) but also lacks a connection to the fast C library. I’ll admit
that I didn’t spend enough time on this project to judge it well because of
this.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://pykafka.readthedocs.io/en/latest/&quot;&gt;PyKafka&lt;/a&gt;: The second
implementation chronologically. This library is maintained by
&lt;a href=&quot;https://www.parse.ly/&quot;&gt;Parse.ly&lt;/a&gt; a web analytics company that heavily uses
both streaming systems and Python. PyKafka’s API is more creative and
designed to follow common Python idioms rather than the Java API. PyKafka
has both a pure Python implementation and connections to the low-level
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;librdkafka&lt;/code&gt; C library for increased performance.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/confluentinc/confluent-kafka-python&quot;&gt;Confluent-kafka&lt;/a&gt;:
Is the final implementation chronologically. It is maintained by
&lt;a href=&quot;https://www.confluent.io/home&quot;&gt;Confluent&lt;/a&gt;, the primary for-profit company
that supports and maintains Kafka. This library is the fastest, but also
the least accessible from a Python perspective. This implementation is
written in CPython extensions, and the documentation is minimal. However,
if you are coming from the Java API then this is entirely consistent with
that experience, so that documentation probably suffices.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;

&lt;p&gt;Confluent-kafka message-consumption bandwidths are around 50% higher and
message-production bandwidths are around 3x higher than PyKafka, both of which
are significantly higher than kafka-python. I’m taking these numbers from
&lt;a href=&quot;http://activisiongamescience.github.io/2016/06/15/Kafka-Client-Benchmarking/&quot;&gt;this
blogpost&lt;/a&gt;
which gives benchmarks comparing the three libraries. The primary numeric
results follow below:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: It’s worth noting that this blogpost was moving smallish 100 byte messages
around. I would hope that Kafka would perform better (closer to network
bandwidths) when messages are of a decent size.&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;producer-throughput&quot;&gt;Producer Throughput&lt;/h3&gt;

&lt;table border=&quot;1&quot; class=&quot;dataframe&quot;&gt;
  &lt;thead&gt;
    &lt;tr style=&quot;text-align: right;&quot;&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;time_in_seconds&lt;/th&gt;
      &lt;th&gt;MBs/s&lt;/th&gt;
      &lt;th&gt;Msgs/s&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;confluent_kafka_producer&lt;/th&gt;
      &lt;td&gt;5.4&lt;/td&gt;
      &lt;td&gt;17&lt;/td&gt;
      &lt;td&gt;183000&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;pykafka_producer_rdkafka&lt;/th&gt;
      &lt;td&gt;16&lt;/td&gt;
      &lt;td&gt;6.1&lt;/td&gt;
      &lt;td&gt;64000&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;pykafka_producer&lt;/th&gt;
      &lt;td&gt;57&lt;/td&gt;
      &lt;td&gt;1.7&lt;/td&gt;
      &lt;td&gt;17000&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;python_kafka_producer&lt;/th&gt;
      &lt;td&gt;68&lt;/td&gt;
      &lt;td&gt;1.4&lt;/td&gt;
      &lt;td&gt;15000&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;consumer-throughput&quot;&gt;Consumer Throughput&lt;/h3&gt;

&lt;table border=&quot;1&quot; class=&quot;dataframe&quot;&gt;
  &lt;thead&gt;
    &lt;tr style=&quot;text-align: right;&quot;&gt;
      &lt;th&gt;&lt;/th&gt;
      &lt;th&gt;time_in_seconds&lt;/th&gt;
      &lt;th&gt;MBs/s&lt;/th&gt;
      &lt;th&gt;Msgs/s&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;th&gt;confluent_kafka_consumer&lt;/th&gt;
      &lt;td&gt;3.8&lt;/td&gt;
      &lt;td&gt;25&lt;/td&gt;
      &lt;td&gt;261000&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;pykafka_consumer_rdkafka&lt;/th&gt;
      &lt;td&gt;6.1&lt;/td&gt;
      &lt;td&gt;17&lt;/td&gt;
      &lt;td&gt;164000&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;pykafka_consumer&lt;/th&gt;
      &lt;td&gt;29&lt;/td&gt;
      &lt;td&gt;3.2&lt;/td&gt;
      &lt;td&gt;34000&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;th&gt;python_kafka_consumer&lt;/th&gt;
      &lt;td&gt;26&lt;/td&gt;
      &lt;td&gt;3.6&lt;/td&gt;
      &lt;td&gt;38000&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;Note: I discovered this article on &lt;a href=&quot;https://github.com/Parsely/pykafka/issues/559&quot;&gt;parsely/pykafka #559&lt;/a&gt;, which has good conversation about the three libraries.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I profiled PyKafka in these cases and it doesn’t appear that these code paths
have yet been optimized. I expect that modest effort could close that gap
considerably. This difference seems to be more from lack of interest than any
hard design constraint.&lt;/p&gt;

&lt;p&gt;It’s not clear how critical these speeds are. According to the PyKafka
maintainers at Parse.ly they haven’t actually turned on the librdkafka
optimizations in their internal pipelines, and are instead using the slow
Pure Python implementation, which is apparently more than fast enough for
common use. Getting messages out of Kafka just isn’t their bottleneck. It may
be that these 250,000 messages/sec limits are not significant in most
applications. I suspect that this matters more in bulk analysis workloads than
in online applications.&lt;/p&gt;

&lt;h2 id=&quot;pythonic-vs-java-apis&quot;&gt;Pythonic vs Java APIs&lt;/h2&gt;

&lt;p&gt;It took me a few times to get confluent-kafka to work. It wasn’t clear what
information I needed to pass to the constructor to connect to Kafka and when I
gave the wrong information I received no message that I had done anything
incorrectly. Docstrings and documentation were both minimal. In contrast,
PyKafka’s API and error messages quickly led me to correct behavior and I was
up and running within a minute.&lt;/p&gt;

&lt;p&gt;However, I persisted with confluent-kafka, found the right &lt;a href=&quot;https://kafka.apache.org/documentation/#api&quot;&gt;Java
documentation&lt;/a&gt;, and eventually did
get things up and running. Once this happened everything fell into place and I
was able to easily build applications with Confluent-kafka that were both
simple and fast.&lt;/p&gt;

&lt;h2 id=&quot;development-experience&quot;&gt;Development experience&lt;/h2&gt;

&lt;p&gt;I would like to add asynchronous support to one or both of these libraries so
that they can read or write data in a non-blocking fashion and play nicely with
other asynchronous systems like Tornado or Asyncio. I started investigating
this with both libraries on GitHub.&lt;/p&gt;

&lt;h3 id=&quot;developers&quot;&gt;Developers&lt;/h3&gt;

&lt;p&gt;Both libraries have a maintainer who is somewhat responsive and whose time is
funded by the parent company. Both maintainers seem active on a day-to-day
basis and handle contributions from external developers.&lt;/p&gt;

&lt;p&gt;Both libraries are fully active with a common pattern of a single main dev
merging work from a number of less active developers. Distributions of commits
over the last six months look similar:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;confluent-kafka-python$ git shortlog -ns --since &quot;six months ago&quot;
38  Magnus Edenhill
5  Christos Trochalakis
4  Ewen Cheslack-Postava
1  Simon Wahlgren

pykafka$ git shortlog -ns --since &quot;six months ago&quot;
52  Emmett Butler
23  Emmett J. Butler
20  Marc-Antoine Parent
18  Tanay Soni
5  messense
1  Erik Stephens
1  Jeff Widman
1  Prateek Shrivastava
1  aleatha
1  zpcui
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;codebase&quot;&gt;Codebase&lt;/h3&gt;

&lt;p&gt;In regards to the codebases I found that PyKafka was easier to hack on for a
few reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Most of PyKafka is written in Python rather than C extensions, and so it is
more accessible to a broader development base. I find that Python C
extensions are not pleasant to work with, even if you are comfortable with
C.&lt;/li&gt;
  &lt;li&gt;PyKafka appears to be much more extensively tested. PyKafka actually spins
up a local Kafka instance to do comprehensive integration tests while
Confluent-kafka seems to only test API without actually running against a
real Kakfa instance.&lt;/li&gt;
  &lt;li&gt;For what it’s worth, PyKafka maintainers &lt;a href=&quot;https://github.com/Parsely/pykafka/issues/731&quot;&gt;responded
quickly&lt;/a&gt; to an issue on
Tornado. Confluent-kafka maintainers still have not responded to a
&lt;a href=&quot;https://github.com/confluentinc/confluent-kafka-python/issues/100#issuecomment-334152182&quot;&gt;comment on an existing Tornado
issue&lt;/a&gt;,
even though that comment had signfiicnatly more content (a working
prototype).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;To be clear, no maintainer has any responsibility to answer my questions on
github. They are likely busy with other things that are of more relevance to
their particular mandate.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;conda-packages&quot;&gt;Conda packages&lt;/h2&gt;

&lt;p&gt;I’ve pushed/updated recipes for both packages on conda-forge. You can install
them as follows:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install -c conda-forge pykafka                 # Linux, Mac, Windows
conda install -c conda-forge python-confluent-kafka  # Linux, Mac
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In both cases this these are built against the fast &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;librdkafka&lt;/code&gt; C library
(except on Windows) and install that library as well.&lt;/p&gt;

&lt;h2 id=&quot;future-plans&quot;&gt;Future plans&lt;/h2&gt;

&lt;p&gt;I’ve recently started work on streaming systems and pipelines for
&lt;a href=&quot;http://dask.pydata.org/en/latest/&quot;&gt;Dask&lt;/a&gt;, so I’ll probably continue to
investigate this space. I’m still torn between the two implementations. There
are strong reasons to use either of them.&lt;/p&gt;

&lt;p&gt;Culturally I am drawn to Parse.ly’s PyKafka library. They’re clearly Python
developers writing for Python users. However the costs of using a non-Pythonic
system here just aren’t that large (Kafka’s API is small), and Confluent’s
interests are more aligned with investing in Kafka long term than are
Parse.ly’s.&lt;/p&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Dask Release 0.15.3</title>
   <link href="https://blog.dask.org/2017/09/24/dask-0.15.3"/>
   <updated>2017-09-24T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2017/09/24/dask-0.15.3</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc.&lt;/a&gt;
and the Data Driven Discovery Initiative from the &lt;a href=&quot;https://www.moore.org/&quot;&gt;Moore
Foundation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m pleased to announce the release of Dask version 0.15.3. This release
contains stability enhancements and bug fixes. This blogpost outlines
notable changes since the 0.15.2 release on August 30th.&lt;/p&gt;

&lt;p&gt;You can conda install Dask:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;conda install -c conda-forge dask
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or pip install from PyPI&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pip install dask[complete] --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Conda packages are available both on conda-forge channels. They will be on
defaults in a few days.&lt;/p&gt;

&lt;p&gt;Full changelogs are available here:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/dask/blob/master/docs/source/changelog.rst&quot;&gt;dask/dask&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/dask/distributed/blob/master/docs/source/changelog.rst&quot;&gt;dask/distributed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some notable changes follow.&lt;/p&gt;

&lt;h2 id=&quot;masked-arrays&quot;&gt;Masked Arrays&lt;/h2&gt;

&lt;p&gt;Dask.array now supports &lt;a href=&quot;https://docs.scipy.org/doc/numpy-1.13.0/reference/maskedarray.html&quot;&gt;masked arrays similar to NumPy&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.array&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;arange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunks&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,))&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;da&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ma&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;masked_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dask&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;masked_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shape&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dtype&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunksize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;In&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Out&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;masked_array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
             &lt;span class=&quot;n&quot;&gt;mask&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;  &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;  &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;  &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;  &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;fill_value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;999999&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This work was primarily done by &lt;a href=&quot;https://jcristharif.com/&quot;&gt;Jim Crist&lt;/a&gt; and partially funded by the UK
Met office in support of the &lt;a href=&quot;http://scitools.org.uk/iris/&quot;&gt;Iris project&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;constants-in-atop&quot;&gt;Constants in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;atop&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Dask.array experts will be familiar with the &lt;a href=&quot;http://dask.pydata.org/en/latest/array-api.html#dask.array.core.atop&quot;&gt;atop
function&lt;/a&gt;, which powers a non-trivial amount of dask.array and is commonly used by people building custom algorithms. This function now supports constants when the index given is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;None&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;atop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;ijk&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;ik&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;kj&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CONSTANT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;memory-management-for-workers&quot;&gt;Memory management for workers&lt;/h2&gt;

&lt;p&gt;Dask workers spill excess data to disk when they reach 60% of their alloted
memory limit. Previously we only measured memory use by adding up the memory
use of every piece of data produce by the worker. This could fail under a few
situations&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Our per-data estiamtes were faulty&lt;/li&gt;
  &lt;li&gt;User code consumed a large amount of memory without our tracking it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To compensate we now also periodically check the memory use of the worker using
system utilities with the psutil module. We dump data to disk if the process
rises about 70% use, stop running new tasks if it rises above 80%, and restart
the worker if it rises above 95% (assuming that the worker has a nanny
process).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Breaking Change:&lt;/strong&gt; Previously the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--memory-limit&lt;/code&gt; keyword to the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dask-worker&lt;/code&gt; process specified the 60% “start pushing to disk” limit. So if
you had 100GB of RAM then you previously might have started a dask-worker as
follows:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dask-worker ... --memory-limit 60e9  # before specify 60% target
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the worker would start pushing to disk once it had 60GB of data in memory.
However, now we are changing this meaning to be the full amount of memory given
to the process.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dask-worker ... --memory-limit 100e9A  # now specify 100% target
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Of course, you don’t have to sepcify this limit (many don’t). It will be
chosen for you automatically. If you’ve never cared about this then you
shouldn’t start caring now.&lt;/p&gt;

&lt;p&gt;More about memory management here: &lt;a href=&quot;http://distributed.readthedocs.io/en/latest/worker.html?highlight=memory-limit#memory-management&quot;&gt;http://distributed.readthedocs.io/en/latest/worker.html?highlight=memory-limit#memory-management&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;statistical-profiling&quot;&gt;Statistical Profiling&lt;/h2&gt;

&lt;p&gt;Workers now poll their worker threads every 10ms and keep a running count of
which functions are being used. This information is available on the
diagnostic dashboard as a new “Profile” page. It provides information that is
orthogonal, and generally more detailed than the typical task-stream plot.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/daskboard-profile.gif&quot; width=&quot;70%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;These plots are available on each worker, and an aggregated view is available
on the scheduler. The timeseries on the bottom allows you to select time
windows of your computation to restrict the parallel profile.&lt;/p&gt;

&lt;p&gt;More information about diagnosing performance available here:
&lt;a href=&quot;http://distributed.readthedocs.io/en/latest/diagnosing-performance.html&quot;&gt;http://distributed.readthedocs.io/en/latest/diagnosing-performance.html&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;acknowledgements&quot;&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;The following people contributed to the dask/dask repository since the 0.15.2
release on August 30th&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Adonis&lt;/li&gt;
  &lt;li&gt;Christopher Prohm&lt;/li&gt;
  &lt;li&gt;Danilo Horta&lt;/li&gt;
  &lt;li&gt;jakirkham&lt;/li&gt;
  &lt;li&gt;Jim Crist&lt;/li&gt;
  &lt;li&gt;Jon Mease&lt;/li&gt;
  &lt;li&gt;jschendel&lt;/li&gt;
  &lt;li&gt;Keisuke Fujii&lt;/li&gt;
  &lt;li&gt;Martin Durant&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;Will Warner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following people contributed to the dask/distributed repository since the
1.18.3 release on September 2nd:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Casey Law&lt;/li&gt;
  &lt;li&gt;Edrian Irizarry&lt;/li&gt;
  &lt;li&gt;Matthew Rocklin&lt;/li&gt;
  &lt;li&gt;rbubley&lt;/li&gt;
  &lt;li&gt;Tom Augspurger&lt;/li&gt;
  &lt;li&gt;ywangd&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
 
 <entry>
   <title>Fast GeoSpatial Analysis in Python</title>
   <link href="https://blog.dask.org/2017/09/21/accelerating-geopandas-1"/>
   <updated>2017-09-21T00:00:00+00:00</updated>
   <id>https://blog.dask.org/2017/09/21/accelerating-geopandas-1</id>
   
   <category>Programming</category>
   
   <category>Python</category>
   
   <category>scipy</category>
   
   <category>dask</category>
   
   <content type="html">
&lt;link href=&quot;https://cdn.pydata.org/bokeh/release/bokeh-0.12.9.min.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;

&lt;link href=&quot;https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.9.min.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;

&lt;script src=&quot;https://cdn.pydata.org/bokeh/release/bokeh-0.12.9.min.js&quot;&gt;&lt;/script&gt;

&lt;script src=&quot;https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.9.min.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;em&gt;This work is supported by &lt;a href=&quot;http://anaconda.com&quot;&gt;Anaconda Inc.&lt;/a&gt;, the Data
Driven Discovery Initiative from the &lt;a href=&quot;https://www.moore.org/&quot;&gt;Moore
Foundation&lt;/a&gt;, and &lt;a href=&quot;https://sbir.nasa.gov/SBIR/abstracts/16/sbir/phase2/SBIR-16-2-S5.03-7927.html&quot;&gt;NASA SBIR
NNX16CG43P&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This work is a collaboration with &lt;a href=&quot;https://github.com/jorisvandenbossche/&quot;&gt;Joris Van den Bossche&lt;/a&gt;. This blogpost builds on &lt;a href=&quot;https://www.youtube.com/watch?v=bWsA2R707BM&quot;&gt;Joris’s EuroSciPy talk&lt;/a&gt; (&lt;a href=&quot;https://jorisvandenbossche.github.io/talks/2017_EuroScipy_geopandas/#1&quot;&gt;slides&lt;/a&gt;) on the same topic. You can also see Joris’ &lt;a href=&quot;https://jorisvandenbossche.github.io/blog/2017/09/19/geopandas-cython/&quot;&gt;blogpost on this same topic&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;tldr&quot;&gt;TL;DR:&lt;/h2&gt;

&lt;p&gt;Python’s Geospatial stack is slow. We accelerate the GeoPandas library with
Cython and Dask. Cython provides 10-100x speedups. Dask gives an additional
3-4x on a multi-core laptop. Everything is still rough, please come help.&lt;/p&gt;

&lt;p&gt;We start by reproducing a
&lt;a href=&quot;https://medium.com/towards-data-science/geospatial-operations-at-scale-with-dask-and-geopandas-4d92d00eb7e8&quot;&gt;blogpost&lt;/a&gt;
published last June, but with 30x speedups. Then we talk about how we achieved
the speedup with Cython and Dask.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;All code in this post is experimental. It should not be relied upon.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;experiment&quot;&gt;Experiment&lt;/h2&gt;

&lt;p&gt;In June &lt;a href=&quot;http://people.earth.yale.edu/profile/ravi-shekhar/about&quot;&gt;Ravi Shekhar&lt;/a&gt;
published a blogpost &lt;a href=&quot;https://medium.com/towards-data-science/geospatial-operations-at-scale-with-dask-and-geopandas-4d92d00eb7e8&quot;&gt;Geospatial Operations at Scale with Dask and GeoPandas&lt;/a&gt;
in which he counted the number of rides originating from each of the official
taxi zones of New York City. He read, processed, and plotted 120 million
rides, performing an expensive point-in-polygon test for each ride, and produced a
figure much like the following:&lt;/p&gt;

&lt;div class=&quot;bk-root&quot;&gt;
  &lt;div class=&quot;bk-plotdiv&quot; id=&quot;deeab81b-7229-4831-8db6-ac0dd99e8ed5&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This took about three hours on his laptop. He used Dask and a bit of custom
code to parallelize Geopandas across all of his cores. Using this combination he
got close to the speed of PostGIS, but from Python.&lt;/p&gt;

&lt;p&gt;Today, using an accelerated GeoPandas and a new dask-geopandas library, we can do
the above computation in around eight minutes (half of which is reading CSV
files) and so can produce a number of other interesting images with faster
interaction times.&lt;/p&gt;

&lt;p&gt;A full notebook producing these plots is available below:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://nbviewer.jupyter.org/urls/gist.githubusercontent.com/mrocklin/ba6d3e2376e478c344af7e874e6fcbb1/raw/e0db89644f78f4371ee30fbdd517ce9bd6032a5e/nyc-taxi-geospatial.ipynb&quot;&gt;NYC Taxi GeoSpatial Analysis Notebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;bk-root&quot;&gt;
  &lt;div class=&quot;bk-plotdiv&quot; id=&quot;95089bfe-ef2e-4c17-89f1-9681a14d8107&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;bk-root&quot;&gt;
  &lt;div class=&quot;bk-plotdiv&quot; id=&quot;ee11cb3f-5262-44a5-8438-9ecbad37cf86&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The rest of this article talks about GeoPandas, Cython, and speeding up
geospatial data analysis.&lt;/p&gt;

&lt;h2 id=&quot;background-in-geospatial-data&quot;&gt;Background in Geospatial Data&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://shapely.readthedocs.io/en/stable/manual.html&quot;&gt;Shapely User Manual&lt;/a&gt; begins
with the following passage on the utility of geospatial analysis to our society.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Deterministic spatial analysis is an important component of computational
approaches to problems in agriculture, ecology, epidemiology, sociology, and
many other fields. What is the surveyed perimeter/area ratio of these patches
of animal habitat? Which properties in this town intersect with the 50-year
flood contour from this new flooding model? What are the extents of findspots
for ancient ceramic wares with maker’s marks “A” and “B”, and where do the
extents overlap? What’s the path from home to office that best skirts
identified zones of location based spam? These are just a few of the possible
questions addressable using non-statistical spatial analysis, and more
specifically, computational geometry.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Shapely is part of Python’s GeoSpatial stack which is currently composed of the
following libraries:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://toblerity.org/shapely/manual.html&quot;&gt;Shapely&lt;/a&gt;:
Manages shapes like points, linestrings, and polygons.
Wraps the GEOS C++ library&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://toblerity.org/fiona/manual.html&quot;&gt;Fiona&lt;/a&gt;:
Handles data ingestion. Wraps the GDAL library&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://mapbox.github.io/rasterio/&quot;&gt;Rasterio&lt;/a&gt;:
Handles raster data like satelite imagery&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://geopandas.org/&quot;&gt;GeoPandas&lt;/a&gt;:
Extends Pandas with a column of shapely geometries to
intuitively query tables of geospatially annotated data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These libraries provide intuitive Python wrappers around the OSGeo C/C++
libraries (GEOS, GDAL, …) which power virtually every open source geospatial
library, like PostGIS, QGIS, etc.. They provide the same functionality, but
are typically much slower due to how they use Python. This is acceptable for
small datasets, but becomes an issue as we transition to larger and larger
datasets.&lt;/p&gt;

&lt;p&gt;In this post we focus on GeoPandas, a geospatial extension of Pandas which
manages tabular data that is annotated with geometry information like points,
paths, and polygons.&lt;/p&gt;

&lt;h3 id=&quot;geopandas-example&quot;&gt;GeoPandas Example&lt;/h3&gt;

&lt;p&gt;GeoPandas makes it easy to load, manipulate, and plot geospatial data. For
example, we can download the &lt;a href=&quot;https://s3.amazonaws.com/nyc-tlc/misc/taxi_zones.zip&quot;&gt;NYC taxi
zones&lt;/a&gt;, load and plot
them in a single line of code.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;geopandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;taxi_zones.shp&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_crs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;init&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;epsg:4326&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;plot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;column&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;borough&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;categorical&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/images/nyc-taxi-zones.svg&quot; width=&quot;50%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Cities are now doing a wonderful job publishing data into the open. This
provides transparency and an opportunity for civic involvement to help analyze,
understand, and improve our communities. Here are a few fun geospatially-aware
datasets to make you interested:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://data.cityofchicago.org/Public-Safety/Crimes-2001-to-present/ijzp-q8t2&quot;&gt;Chicago Crimes from 2001 to present (one week ago)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://opendata.paris.fr/explore/dataset/stations-velib-disponibilites-en-temps-reel/export/&quot;&gt;Paris Velib (bikeshare) in real time&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://portal-nolagis.opendata.arcgis.com/datasets/bike-lanes&quot;&gt;Bike lanes in New Orleans&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://data.nola.gov/Public-Safety-and-Preparedness/NOPD-Use-of-Force-Incidents/9mnw-mbde&quot;&gt;New Orleans Police Department incidents involving the use of force&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;

&lt;p&gt;Unfortunately GeoPandas is slow. This limits interactive exploration on larger
datasets. For example the Chicago crimes data (the first dataset above) has
seven million entries and is several gigabytes in memory. Analyzing a dataset
of this size interactively with GeoPandas is not feasible today.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/geopandas-shapely-1.svg&quot; width=&quot;50%&quot; align=&quot;right&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This slowdown is because GeoPandas wraps each geometry (like a point, line, or
polygon) with a Shapely object and stores all of those objects in an
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;object&lt;/code&gt;-dtype column. When we compute a GeoPandas operation on all of our
shapes we just iterate over these shapes in Python. As an example, here is how
one might implement a distance method in GeoPandas today.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;distance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;geom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
              &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;geom&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;geometry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Series&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Unfortunately this just iterates over elements in the series, each of which is
an individual Shapely object. This is inefficient for two reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Iterating through Python objects is slow relative to iterating through those same objects in C.&lt;/li&gt;
  &lt;li&gt;Shapely Python objects consume more memory than the GEOS Geometry objects that they wrap.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This results in slow performance.&lt;/p&gt;

&lt;h2 id=&quot;cythonizing-geopandas&quot;&gt;Cythonizing GeoPandas&lt;/h2&gt;

&lt;p&gt;Fortunately, we’ve rewritten GeoPandas with Cython to directly loop over the
underlying GEOS pointers. This provides a 10-100x speedup depending on the
operation.
So instead of using a Pandas &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;object&lt;/code&gt;-dtype column that &lt;em&gt;holds shapely objects&lt;/em&gt;
we instead store a NumPy array of &lt;em&gt;direct pointers to the GEOS objects&lt;/em&gt;.&lt;/p&gt;

&lt;h3 id=&quot;before&quot;&gt;Before&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/images/geopandas-shapely-1.svg&quot; width=&quot;49%&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;after&quot;&gt;After&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/images/geopandas-shapely-2.svg&quot; width=&quot;49%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As an example, our function for distance now looks like the following Cython
implementation (some liberties taken for brevity):&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;cpdef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cdef&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cdef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GEOSGeometry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left_geom&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;cdef&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GEOSGeometry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;right_geom&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__geom__&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# a geometry pointer
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;geometries&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_geometry_array&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nogil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;xrange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;left_geom&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GEOSGeometry&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;geometries&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;idx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;left_geom&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GEOSDistance_r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;left_geom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;some_point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__geom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;distance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;NaN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For fast operations we see speedups of 100x. For slower operations we’re
closer to 10x. Now these operations run at full C speed.&lt;/p&gt;

&lt;p&gt;In his &lt;a href=&quot;https://www.youtube.com/watch?v=bWsA2R707BM&quot;&gt;EuroSciPy
talk&lt;/a&gt; Joris compares the
performance of GeoPandas (both before and after Cython) with &lt;a href=&quot;http://postgis.net/&quot;&gt;PostGIS&lt;/a&gt;, the standard geospatial plugin for the popular
PostgreSQL database (&lt;a href=&quot;https://github.com/jorisvandenbossche/talks/blob/master/2017_EuroScipy_geopandas/geopandas_postgis_comparison.ipynb&quot;&gt;original
notebook&lt;/a&gt;
with the comparison). I’m stealing some plots from his talk below:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/timings_sjoin_all.png&quot;&gt;&lt;img src=&quot;/images/timings_sjoin_all.png&quot; width=&quot;33%&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/geopandas-timings_distance2_all.png&quot;&gt;&lt;img src=&quot;/images/geopandas-timings_distance2_all.png&quot; width=&quot;33%&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/geopandas-timings_within_all.png&quot;&gt;&lt;img src=&quot;/images/geopandas-timings_within_all.png&quot; width=&quot;31%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cythonized GeoPandas and PostGIS run at almost exactly the same speed. This is
because they use the same underlying C library, GEOS. These algorithms are not
particularly complex, so it is not surprising that everyone implements them
in exactly the same way.&lt;/p&gt;

&lt;p&gt;This is great. The Python GIS stack now has a full-speed library that operates
as fast as any other open GIS system is likely to manage.&lt;/p&gt;

&lt;h2 id=&quot;problems&quot;&gt;Problems&lt;/h2&gt;

&lt;p&gt;However, this is still a work in progress, and there is still plenty of work
to do.&lt;/p&gt;

&lt;p&gt;First, we need for Pandas to track our arrays of GEOS pointers differently from
how it tracks a normal integer array. This is both for usability reasons, like
we want to render them differently and don’t want users to be able to perform
numeric operations like sum and mean on these arrays, and also for stability
reasons, because we need to track these pointers and release their allocated
GEOSGeometry objects from memory at the appropriate times. Currently, this
goal is pursued by creating a new block type, the GeometryBlock (‘blocks’ are
the internal building blocks of pandas that hold the data of the different columns).
This will require some changes to Pandas itself to enable custom block types
(see &lt;a href=&quot;https://github.com/pandas-dev/pandas/issues/17144&quot;&gt;this issue&lt;/a&gt; on the pandas
issue tracker).&lt;/p&gt;

&lt;p&gt;Second, data ingestion is still quite slow. This relies not on GEOS, but on
GDAL/OGR, which is handled in Python today by Fiona. Fiona is more optimized
for consistency and usability rather than raw speed. Previously when GeoPandas
was slow this made sense because no one was operating on particularly large
datasets. However now we observe that data loading is often several times more
expensive than all of our manipulations so this will probably need some effort
in the future.&lt;/p&gt;

&lt;p&gt;Third, there are some algorithms within GeoPandas that we haven’t yet
Cythonized. This includes both particular features like overlay and dissolve
operations as well as small components like GeoJSON output.&lt;/p&gt;

&lt;p&gt;Finally as with any rewrite on a codebase that is not exhaustively tested
(we’re trying to improve testing as we do this) there are probably several bugs
that we won’t detect until some patient and forgiving user runs into them
first.&lt;/p&gt;

&lt;p&gt;Still though, all linear geospatial operations work well and are thoroughly
tested. Also spatial joins (a backbone of many geospatial operations) are up
and running at full speed. If you work in a non-production environment then
Cythonized GeoPandas may be worth your time to investigate.&lt;/p&gt;

&lt;p&gt;You can track future progress on this effort at
&lt;a href=&quot;https://github.com/geopandas/geopandas/issues/473&quot;&gt;geopandas/geopandas #473&lt;/a&gt;
which includes installation instructions.&lt;/p&gt;

&lt;h2 id=&quot;parallelize-with-dask&quot;&gt;Parallelize with Dask&lt;/h2&gt;

&lt;p&gt;Cythonizing gives us speedups in the 10x-100x range. We use a single core as
effectively as is possible with the GEOS library. Now we move on to using
multiple cores in parallel. This gives us an extra 3-4x on a standard 4 core
laptop. We can also scale to clusters, though I’ll leave that for a future
blogpost.&lt;/p&gt;

&lt;p&gt;To parallelize we need to split apart our dataset into multiple chunks. We can
do this naively by placing the first million rows in one chunk, the second
million rows in another chunk, etc. or we can partition our data spatially,
for example by placing all of the data for one region of our dataset in one
chunk and all of the data for another region in another chunk, and so on.
Both approaches are implemented in a rudimentary
&lt;a href=&quot;https://github.com/mrocklin/dask-geopandas&quot;&gt;dask-geopandas&lt;/a&gt; library
available on GitHub.&lt;/p&gt;

&lt;p&gt;So just as dask-array organizes many NumPy arrays along a grid
and dask-dataframe organizes many Pandas dataframes along a linear index&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/dask-array-black-text.svg&quot; width=&quot;60%&quot; /&gt;
&lt;img src=&quot;/images/dask-dataframe.svg&quot; width=&quot;30%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;the dask-geopandas library organizes many GeoPandas dataframes into spatial
regions. In the example below we might partition data in the city of New York
into its different boroughs. Data for each borough would be handled
separately by a different thread or, in a distributed situation, might live on
a different machine.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/nyc-boroughs.svg&quot; width=&quot;50%&quot; align=&quot;right&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This gives us two advantages:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Even without geospatial partitioning, we can use many cores (or many
machines) to accelerate simple operations.&lt;/li&gt;
  &lt;li&gt;For spatially aware operations, like spatial joins or subselections we can
engage only those parts of the parallel dataframe that we know are relevant
for various parts of the computation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However this is also expensive and not always necessary. In our initial
exercise with the NYC Taxi data we didn’t do this, and will still got
significant speedups just from normal multicore operation.&lt;/p&gt;

&lt;h3 id=&quot;exercise&quot;&gt;Exercise&lt;/h3&gt;

&lt;p&gt;And so to produce the images we did at the top of this post we used a
combination of dask.dataframe to load in CSV files, dask-geopandas to perform
the spatial join, and then dask.dataframe and normal pandas to perform the
actual computations. Our code looked something like the following:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask.dataframe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dask_geopandas&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dg&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_csv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;yellow_tripdata_2015-*.csv&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;set_geometry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;geometry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;pickup_longitude&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;pickup_latitude&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]],&lt;/span&gt;
                     &lt;span class=&quot;n&quot;&gt;crs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;init&apos;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;epsg:4326&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sjoin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;gf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;zone&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;borough&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;geometry&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]])&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;full&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;zone&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;payment_type&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;tip_amount&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;fare_amount&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;full&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;nyc-zones.parquet&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# compute and cache result on disk
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;full&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;read_parquet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;nyc-zones.parquet&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And then we can do typical groupbys and joins on the more typical pandas-like
data now properly annotated with zones.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;full&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;passenger_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groupby&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;full&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;zone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;count&apos;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;joined&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_frame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                  &lt;span class=&quot;n&quot;&gt;left_index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;right_on&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;zone&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;joined&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;geopandas&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GeoDataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;joined&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# convert back for plotting
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We’ve replaced most of Ravi’s custom analysis with a few lines of new standard
code. This maxes our or CPU when doing spatial joins. Everything here
releases the GIL well and the entire computation operates in under a couple
gigabytes of RAM.&lt;/p&gt;

&lt;h2 id=&quot;problems-1&quot;&gt;Problems&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/mrocklin/dask-geopandas&quot;&gt;dask-geopandas&lt;/a&gt; project is
currently a prototype. It will easily break for non-trivial applications (and
indeed many trivial ones). It was designed to see how hard it would be to
implement some of the trickier operations like spatial joins, repartitioning,
and overlays. This is why, for example, it supports a fully distributed
spatial join, but lacks simple operations like indexing. There are
other longer-term issues as well.&lt;/p&gt;

&lt;p&gt;Serialization costs are manageable, but decently high. We currently use the
standard “well known binary” WKB format common in other geospatial applications
but have found it to be fairly slow, which bogs down inter-process parallelism.&lt;/p&gt;

&lt;p&gt;Similarly distributed and spatially partitioned data stores don’t seem to be
common (or at least I haven’t run across them yet).&lt;/p&gt;

&lt;p&gt;It’s not clear how dask-geopandas dataframes and normal dask dataframes should
interact. It would be very convenient to reuse all of the algorithms in
dask.dataframe, but the index structures of the two libraries is very
different. This may require some clever software engineering on the part of
the Dask developers.&lt;/p&gt;

&lt;p&gt;Still though, these seem surmountable and generally this process has been easy
so far. I suspect that we can build an intuitive and performant parallel GIS
analytics system with modest effort.&lt;/p&gt;

&lt;p&gt;The notebook for the example at the start of the blogpost shows using
dask-geopandas with good results.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;With established technologies in the PyData space like Cython and Dask we’ve
been able to accelerate and scale GeoPandas operations above and beyond
industry standards. However this work is still experimental and not ready for
production use. This work is a bit of a side project for both Joris and
Matthew and they would welcome effort from other experienced open source
developers. We believe that this project can have a large social impact and
are enthusiastic about pursuing it in the future. We hope that you share our
enthusiasm.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://nbviewer.jupyter.org/urls/gist.githubusercontent.com/mrocklin/ba6d3e2376e478c344af7e874e6fcbb1/raw/e0db89644f78f4371ee30fbdd517ce9bd6032a5e/nyc-taxi-geospatial.ipynb&quot;&gt;NYC Taxi GeoSpatial Analysis Notebook&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=bWsA2R707BM&quot;&gt;Joris’s EuroSciPy talk&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jorisvandenbossche.github.io/blog/2017/09/19/geopandas-cython/&quot;&gt;Joris’s blogpost&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Ravi’s original post &lt;a href=&quot;https://medium.com/towards-data-science/geospatial-operations-at-scale-with-dask-and-geopandas-4d92d00eb7e8&quot;&gt;Geospatial Operations at Scale with Dask and GeoPandas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
    (function() {
  var fn = function() {
    Bokeh.safely(function() {
      (function(root) {
        function embed_document(root) {
          var docs_json = {&quot;3eecbd1c-0b14-4777-8f07-6537dfa40e4c&quot;:{&quot;roots&quot;:{&quot;references&quot;:[{&quot;attributes&quot;:{&quot;plot&quot;:null,&quot;text&quot;:&quot;Average Tip Fraction&quot;},&quot;id&quot;:&quot;27996c4c-da44-4dda-b78a-1aeaac693387&quot;,&quot;type&quot;:&quot;Title&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;a0586146-b37e-490f-a532-dc621364d57f&quot;,&quot;type&quot;:&quot;SaveTool&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;dddfd9bf-e505-4455-a357-7daffd14f49d&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;085f3735-0ce5-463d-99a2-c12f409f4b0e&quot;,&quot;type&quot;:&quot;HelpTool&quot;},{&quot;attributes&quot;:{&quot;source&quot;:{&quot;id&quot;:&quot;79833421-4b37-4874-b257-e91f6932982f&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;}},&quot;id&quot;:&quot;eb918a72-48fd-4453-8b79-b2032735ae5a&quot;,&quot;type&quot;:&quot;CDSView&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;6f5fe3f1-e966-4fa5-aaac-66841af5b809&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;6960645d-737b-442b-a2f0-cdb7e93d4e91&quot;,&quot;type&quot;:&quot;PanTool&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;c421e4d7-01a7-43de-a95e-fdff91e61d6f&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{&quot;plot&quot;:{&quot;id&quot;:&quot;9a6525f3-7059-45ab-90ee-2d7e83c0a07a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;c421e4d7-01a7-43de-a95e-fdff91e61d6f&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;e8cb9eb4-de5c-457e-ab86-dc3772cc3f40&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;d301bef6-61e1-4d2e-85d6-2a8e369373b7&quot;,&quot;type&quot;:&quot;SaveTool&quot;},{&quot;attributes&quot;:{&quot;overlay&quot;:{&quot;id&quot;:&quot;b63fb838-d1f0-4417-b06a-2253fff02424&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;}},&quot;id&quot;:&quot;ee3c44cb-3c2f-4de1-82d6-8a8ccf913021&quot;,&quot;type&quot;:&quot;BoxZoomTool&quot;},{&quot;attributes&quot;:{&quot;color_mapper&quot;:{&quot;id&quot;:&quot;b661dcd9-576f-4c79-90d3-65f41d14b544&quot;,&quot;type&quot;:&quot;LogColorMapper&quot;},&quot;formatter&quot;:{&quot;id&quot;:&quot;25d38d1a-e1d0-4ee9-9a51-324a7ddfa9d8&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;label_standoff&quot;:12,&quot;location&quot;:[0,0],&quot;plot&quot;:{&quot;id&quot;:&quot;3058396c-651f-4f74-b4de-a7e737c8665a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;fde2ffef-37b2-487c-8cd3-049402dc2fab&quot;,&quot;type&quot;:&quot;BasicTicker&quot;}},&quot;id&quot;:&quot;3f99e069-bc47-41e6-9ed0-a9e0856d105c&quot;,&quot;type&quot;:&quot;ColorBar&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;5150062a-68b9-4228-a3ca-5a2795f8ae24&quot;,&quot;type&quot;:&quot;WheelZoomTool&quot;},{&quot;attributes&quot;:{&quot;fill_alpha&quot;:{&quot;value&quot;:0.1},&quot;fill_color&quot;:{&quot;value&quot;:&quot;#1f77b4&quot;},&quot;line_alpha&quot;:{&quot;value&quot;:0.1},&quot;line_color&quot;:{&quot;value&quot;:&quot;#1f77b4&quot;},&quot;xs&quot;:{&quot;field&quot;:&quot;xs&quot;},&quot;ys&quot;:{&quot;field&quot;:&quot;ys&quot;}},&quot;id&quot;:&quot;4529a4e7-b57a-4b05-8697-4ffefc419c71&quot;,&quot;type&quot;:&quot;Patches&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;25d38d1a-e1d0-4ee9-9a51-324a7ddfa9d8&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;7f3fe531-7586-4d07-b55d-917e998d17dc&quot;,&quot;type&quot;:&quot;ResetTool&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;4863a02c-a14f-44ad-b059-4fa0a7811065&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null,&quot;point_policy&quot;:&quot;follow_mouse&quot;,&quot;tooltips&quot;:&quot;&lt;div&gt;&lt;b&gt;Borough&lt;/b&gt;: @borough&lt;/div&gt;&lt;div&gt;&lt;b&gt;Zone&lt;/b&gt;: @zone&lt;/div&gt;&lt;div&gt;&lt;b&gt;Rides&lt;/b&gt;: @count&lt;/div&gt;&quot;},&quot;id&quot;:&quot;bf29975f-fcdb-444f-ad6b-270f10ab2b06&quot;,&quot;type&quot;:&quot;HoverTool&quot;},{&quot;attributes&quot;:{&quot;dimension&quot;:1,&quot;plot&quot;:{&quot;id&quot;:&quot;3058396c-651f-4f74-b4de-a7e737c8665a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;2a7eb668-a58d-46ed-9e0b-0f25d7fff4c5&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;f396af5d-43b1-43d6-ad17-82a9e1272208&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;attributes&quot;:{&quot;data_source&quot;:{&quot;id&quot;:&quot;79833421-4b37-4874-b257-e91f6932982f&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;},&quot;glyph&quot;:{&quot;id&quot;:&quot;f0c3dc48-49ec-4cee-9b0a-73efd89e128a&quot;,&quot;type&quot;:&quot;Patches&quot;},&quot;hover_glyph&quot;:null,&quot;muted_glyph&quot;:null,&quot;nonselection_glyph&quot;:{&quot;id&quot;:&quot;2fc94ead-d7e7-4b3b-99d4-3a1cd74e873f&quot;,&quot;type&quot;:&quot;Patches&quot;},&quot;selection_glyph&quot;:null,&quot;view&quot;:{&quot;id&quot;:&quot;eb918a72-48fd-4453-8b79-b2032735ae5a&quot;,&quot;type&quot;:&quot;CDSView&quot;}},&quot;id&quot;:&quot;3b1fa4e4-5bf6-4bf4-85d2-091d7ff789d5&quot;,&quot;type&quot;:&quot;GlyphRenderer&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null},&quot;id&quot;:&quot;f0c21fdb-3905-4866-bbf5-d191494f134c&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},{&quot;attributes&quot;:{&quot;bottom_units&quot;:&quot;screen&quot;,&quot;fill_alpha&quot;:{&quot;value&quot;:0.5},&quot;fill_color&quot;:{&quot;value&quot;:&quot;lightgrey&quot;},&quot;left_units&quot;:&quot;screen&quot;,&quot;level&quot;:&quot;overlay&quot;,&quot;line_alpha&quot;:{&quot;value&quot;:1.0},&quot;line_color&quot;:{&quot;value&quot;:&quot;black&quot;},&quot;line_dash&quot;:[4,4],&quot;line_width&quot;:{&quot;value&quot;:2},&quot;plot&quot;:null,&quot;render_mode&quot;:&quot;css&quot;,&quot;right_units&quot;:&quot;screen&quot;,&quot;top_units&quot;:&quot;screen&quot;},&quot;id&quot;:&quot;b63fb838-d1f0-4417-b06a-2253fff02424&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;},{&quot;attributes&quot;:{&quot;data_source&quot;:{&quot;id&quot;:&quot;18193dc2-af18-430d-8541-849ff6cf74a5&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;},&quot;glyph&quot;:{&quot;id&quot;:&quot;ae4388bc-abe2-4174-ba6b-6c017c8007fb&quot;,&quot;type&quot;:&quot;Patches&quot;},&quot;hover_glyph&quot;:null,&quot;muted_glyph&quot;:null,&quot;nonselection_glyph&quot;:{&quot;id&quot;:&quot;faeedd3b-119f-4af2-9847-ca2652d1dbb7&quot;,&quot;type&quot;:&quot;Patches&quot;},&quot;selection_glyph&quot;:null,&quot;view&quot;:{&quot;id&quot;:&quot;4bcfec7d-c05c-448a-94b4-1d2866409a23&quot;,&quot;type&quot;:&quot;CDSView&quot;}},&quot;id&quot;:&quot;698fbc56-a4d3-478b-bd22-f23784c8fbf5&quot;,&quot;type&quot;:&quot;GlyphRenderer&quot;},{&quot;attributes&quot;:{&quot;overlay&quot;:{&quot;id&quot;:&quot;be3cc134-22fc-4afb-bd0a-a527d820071d&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;}},&quot;id&quot;:&quot;4c82bbf0-af1f-4b96-b5c7-19931b678383&quot;,&quot;type&quot;:&quot;BoxZoomTool&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;e384a837-7ce6-4ba0-8f0e-e4a8ffc64518&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;d9c616aa-dc6d-4459-af43-73444362b3b2&quot;,&quot;type&quot;:&quot;HelpTool&quot;},{&quot;attributes&quot;:{&quot;fill_alpha&quot;:{&quot;value&quot;:0.9},&quot;fill_color&quot;:{&quot;field&quot;:&quot;payment_type&quot;,&quot;transform&quot;:{&quot;id&quot;:&quot;fd673fd5-348f-4441-b09b-846332ca8ea1&quot;,&quot;type&quot;:&quot;LinearColorMapper&quot;}},&quot;line_alpha&quot;:{&quot;value&quot;:0.5},&quot;xs&quot;:{&quot;field&quot;:&quot;xs&quot;},&quot;ys&quot;:{&quot;field&quot;:&quot;ys&quot;}},&quot;id&quot;:&quot;950c7878-9415-4d3a-976f-fff4dd96ee66&quot;,&quot;type&quot;:&quot;Patches&quot;},{&quot;attributes&quot;:{&quot;palette&quot;:[&quot;#440154&quot;,&quot;#440255&quot;,&quot;#440357&quot;,&quot;#450558&quot;,&quot;#45065A&quot;,&quot;#45085B&quot;,&quot;#46095C&quot;,&quot;#460B5E&quot;,&quot;#460C5F&quot;,&quot;#460E61&quot;,&quot;#470F62&quot;,&quot;#471163&quot;,&quot;#471265&quot;,&quot;#471466&quot;,&quot;#471567&quot;,&quot;#471669&quot;,&quot;#47186A&quot;,&quot;#48196B&quot;,&quot;#481A6C&quot;,&quot;#481C6E&quot;,&quot;#481D6F&quot;,&quot;#481E70&quot;,&quot;#482071&quot;,&quot;#482172&quot;,&quot;#482273&quot;,&quot;#482374&quot;,&quot;#472575&quot;,&quot;#472676&quot;,&quot;#472777&quot;,&quot;#472878&quot;,&quot;#472A79&quot;,&quot;#472B7A&quot;,&quot;#472C7B&quot;,&quot;#462D7C&quot;,&quot;#462F7C&quot;,&quot;#46307D&quot;,&quot;#46317E&quot;,&quot;#45327F&quot;,&quot;#45347F&quot;,&quot;#453580&quot;,&quot;#453681&quot;,&quot;#443781&quot;,&quot;#443982&quot;,&quot;#433A83&quot;,&quot;#433B83&quot;,&quot;#433C84&quot;,&quot;#423D84&quot;,&quot;#423E85&quot;,&quot;#424085&quot;,&quot;#414186&quot;,&quot;#414286&quot;,&quot;#404387&quot;,&quot;#404487&quot;,&quot;#3F4587&quot;,&quot;#3F4788&quot;,&quot;#3E4888&quot;,&quot;#3E4989&quot;,&quot;#3D4A89&quot;,&quot;#3D4B89&quot;,&quot;#3D4C89&quot;,&quot;#3C4D8A&quot;,&quot;#3C4E8A&quot;,&quot;#3B508A&quot;,&quot;#3B518A&quot;,&quot;#3A528B&quot;,&quot;#3A538B&quot;,&quot;#39548B&quot;,&quot;#39558B&quot;,&quot;#38568B&quot;,&quot;#38578C&quot;,&quot;#37588C&quot;,&quot;#37598C&quot;,&quot;#365A8C&quot;,&quot;#365B8C&quot;,&quot;#355C8C&quot;,&quot;#355D8C&quot;,&quot;#345E8D&quot;,&quot;#345F8D&quot;,&quot;#33608D&quot;,&quot;#33618D&quot;,&quot;#32628D&quot;,&quot;#32638D&quot;,&quot;#31648D&quot;,&quot;#31658D&quot;,&quot;#31668D&quot;,&quot;#30678D&quot;,&quot;#30688D&quot;,&quot;#2F698D&quot;,&quot;#2F6A8D&quot;,&quot;#2E6B8E&quot;,&quot;#2E6C8E&quot;,&quot;#2E6D8E&quot;,&quot;#2D6E8E&quot;,&quot;#2D6F8E&quot;,&quot;#2C708E&quot;,&quot;#2C718E&quot;,&quot;#2C728E&quot;,&quot;#2B738E&quot;,&quot;#2B748E&quot;,&quot;#2A758E&quot;,&quot;#2A768E&quot;,&quot;#2A778E&quot;,&quot;#29788E&quot;,&quot;#29798E&quot;,&quot;#287A8E&quot;,&quot;#287A8E&quot;,&quot;#287B8E&quot;,&quot;#277C8E&quot;,&quot;#277D8E&quot;,&quot;#277E8E&quot;,&quot;#267F8E&quot;,&quot;#26808E&quot;,&quot;#26818E&quot;,&quot;#25828E&quot;,&quot;#25838D&quot;,&quot;#24848D&quot;,&quot;#24858D&quot;,&quot;#24868D&quot;,&quot;#23878D&quot;,&quot;#23888D&quot;,&quot;#23898D&quot;,&quot;#22898D&quot;,&quot;#228A8D&quot;,&quot;#228B8D&quot;,&quot;#218C8D&quot;,&quot;#218D8C&quot;,&quot;#218E8C&quot;,&quot;#208F8C&quot;,&quot;#20908C&quot;,&quot;#20918C&quot;,&quot;#1F928C&quot;,&quot;#1F938B&quot;,&quot;#1F948B&quot;,&quot;#1F958B&quot;,&quot;#1F968B&quot;,&quot;#1E978A&quot;,&quot;#1E988A&quot;,&quot;#1E998A&quot;,&quot;#1E998A&quot;,&quot;#1E9A89&quot;,&quot;#1E9B89&quot;,&quot;#1E9C89&quot;,&quot;#1E9D88&quot;,&quot;#1E9E88&quot;,&quot;#1E9F88&quot;,&quot;#1EA087&quot;,&quot;#1FA187&quot;,&quot;#1FA286&quot;,&quot;#1FA386&quot;,&quot;#20A485&quot;,&quot;#20A585&quot;,&quot;#21A685&quot;,&quot;#21A784&quot;,&quot;#22A784&quot;,&quot;#23A883&quot;,&quot;#23A982&quot;,&quot;#24AA82&quot;,&quot;#25AB81&quot;,&quot;#26AC81&quot;,&quot;#27AD80&quot;,&quot;#28AE7F&quot;,&quot;#29AF7F&quot;,&quot;#2AB07E&quot;,&quot;#2BB17D&quot;,&quot;#2CB17D&quot;,&quot;#2EB27C&quot;,&quot;#2FB37B&quot;,&quot;#30B47A&quot;,&quot;#32B57A&quot;,&quot;#33B679&quot;,&quot;#35B778&quot;,&quot;#36B877&quot;,&quot;#38B976&quot;,&quot;#39B976&quot;,&quot;#3BBA75&quot;,&quot;#3DBB74&quot;,&quot;#3EBC73&quot;,&quot;#40BD72&quot;,&quot;#42BE71&quot;,&quot;#44BE70&quot;,&quot;#45BF6F&quot;,&quot;#47C06E&quot;,&quot;#49C16D&quot;,&quot;#4BC26C&quot;,&quot;#4DC26B&quot;,&quot;#4FC369&quot;,&quot;#51C468&quot;,&quot;#53C567&quot;,&quot;#55C666&quot;,&quot;#57C665&quot;,&quot;#59C764&quot;,&quot;#5BC862&quot;,&quot;#5EC961&quot;,&quot;#60C960&quot;,&quot;#62CA5F&quot;,&quot;#64CB5D&quot;,&quot;#67CC5C&quot;,&quot;#69CC5B&quot;,&quot;#6BCD59&quot;,&quot;#6DCE58&quot;,&quot;#70CE56&quot;,&quot;#72CF55&quot;,&quot;#74D054&quot;,&quot;#77D052&quot;,&quot;#79D151&quot;,&quot;#7CD24F&quot;,&quot;#7ED24E&quot;,&quot;#81D34C&quot;,&quot;#83D34B&quot;,&quot;#86D449&quot;,&quot;#88D547&quot;,&quot;#8BD546&quot;,&quot;#8DD644&quot;,&quot;#90D643&quot;,&quot;#92D741&quot;,&quot;#95D73F&quot;,&quot;#97D83E&quot;,&quot;#9AD83C&quot;,&quot;#9DD93A&quot;,&quot;#9FD938&quot;,&quot;#A2DA37&quot;,&quot;#A5DA35&quot;,&quot;#A7DB33&quot;,&quot;#AADB32&quot;,&quot;#ADDC30&quot;,&quot;#AFDC2E&quot;,&quot;#B2DD2C&quot;,&quot;#B5DD2B&quot;,&quot;#B7DD29&quot;,&quot;#BADE27&quot;,&quot;#BDDE26&quot;,&quot;#BFDF24&quot;,&quot;#C2DF22&quot;,&quot;#C5DF21&quot;,&quot;#C7E01F&quot;,&quot;#CAE01E&quot;,&quot;#CDE01D&quot;,&quot;#CFE11C&quot;,&quot;#D2E11B&quot;,&quot;#D4E11A&quot;,&quot;#D7E219&quot;,&quot;#DAE218&quot;,&quot;#DCE218&quot;,&quot;#DFE318&quot;,&quot;#E1E318&quot;,&quot;#E4E318&quot;,&quot;#E7E419&quot;,&quot;#E9E419&quot;,&quot;#ECE41A&quot;,&quot;#EEE51B&quot;,&quot;#F1E51C&quot;,&quot;#F3E51E&quot;,&quot;#F6E61F&quot;,&quot;#F8E621&quot;,&quot;#FAE622&quot;,&quot;#FDE724&quot;]},&quot;id&quot;:&quot;fe7eac4c-a6ac-449b-a2da-89f027e5010b&quot;,&quot;type&quot;:&quot;LogColorMapper&quot;},{&quot;attributes&quot;:{&quot;color_mapper&quot;:{&quot;id&quot;:&quot;fd673fd5-348f-4441-b09b-846332ca8ea1&quot;,&quot;type&quot;:&quot;LinearColorMapper&quot;},&quot;formatter&quot;:{&quot;id&quot;:&quot;a5f4691a-c99e-4675-9f31-5445af64b13e&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;label_standoff&quot;:12,&quot;location&quot;:[0,0],&quot;plot&quot;:{&quot;id&quot;:&quot;9a6525f3-7059-45ab-90ee-2d7e83c0a07a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;4592c80c-76be-46be-829c-55d8de2919cc&quot;,&quot;type&quot;:&quot;BasicTicker&quot;}},&quot;id&quot;:&quot;10980cdc-edaa-4fec-9488-26914877b608&quot;,&quot;type&quot;:&quot;ColorBar&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;f7b30ba4-fd79-4d13-a3c7-49803d251345&quot;,&quot;type&quot;:&quot;ResetTool&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;f6f9dda6-1d51-4e39-80d2-22bb8a3e4a7d&quot;,&quot;type&quot;:&quot;WheelZoomTool&quot;},{&quot;attributes&quot;:{&quot;formatter&quot;:{&quot;id&quot;:&quot;dddfd9bf-e505-4455-a357-7daffd14f49d&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;plot&quot;:{&quot;id&quot;:&quot;9a6525f3-7059-45ab-90ee-2d7e83c0a07a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;6f5fe3f1-e966-4fa5-aaac-66841af5b809&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;a5d2472e-792f-4f8c-ae2a-7820e4e4cabb&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;4a794f89-97c4-4344-b538-0ef0498b3219&quot;,&quot;type&quot;:&quot;SaveTool&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;0d27ecfc-706b-4857-9f4b-080d014b15e4&quot;,&quot;type&quot;:&quot;ResetTool&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null,&quot;point_policy&quot;:&quot;follow_mouse&quot;,&quot;tooltips&quot;:&quot;&lt;p&gt;&lt;b&gt;Borough&lt;/b&gt;: @borough&lt;/p&gt;&lt;p&gt;&lt;b&gt;Zone&lt;/b&gt;: @zone&lt;/p&gt;&quot;},&quot;id&quot;:&quot;a84bfab3-9687-4112-8322-4e604f5954f2&quot;,&quot;type&quot;:&quot;HoverTool&quot;},{&quot;attributes&quot;:{&quot;bottom_units&quot;:&quot;screen&quot;,&quot;fill_alpha&quot;:{&quot;value&quot;:0.5},&quot;fill_color&quot;:{&quot;value&quot;:&quot;lightgrey&quot;},&quot;left_units&quot;:&quot;screen&quot;,&quot;level&quot;:&quot;overlay&quot;,&quot;line_alpha&quot;:{&quot;value&quot;:1.0},&quot;line_color&quot;:{&quot;value&quot;:&quot;black&quot;},&quot;line_dash&quot;:[4,4],&quot;line_width&quot;:{&quot;value&quot;:2},&quot;plot&quot;:null,&quot;render_mode&quot;:&quot;css&quot;,&quot;right_units&quot;:&quot;screen&quot;,&quot;top_units&quot;:&quot;screen&quot;},&quot;id&quot;:&quot;08b5d6f0-3cea-4e7d-a11b-4a4cd2eab30a&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;2a7eb668-a58d-46ed-9e0b-0f25d7fff4c5&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;4592c80c-76be-46be-829c-55d8de2919cc&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;6351fc86-4cb0-48f1-906d-40c4646bf983&quot;,&quot;type&quot;:&quot;PanTool&quot;},{&quot;attributes&quot;:{&quot;data_source&quot;:{&quot;id&quot;:&quot;10ea5377-ee43-4b43-9633-3c452e6ae727&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;},&quot;glyph&quot;:{&quot;id&quot;:&quot;950c7878-9415-4d3a-976f-fff4dd96ee66&quot;,&quot;type&quot;:&quot;Patches&quot;},&quot;hover_glyph&quot;:null,&quot;muted_glyph&quot;:null,&quot;nonselection_glyph&quot;:{&quot;id&quot;:&quot;4529a4e7-b57a-4b05-8697-4ffefc419c71&quot;,&quot;type&quot;:&quot;Patches&quot;},&quot;selection_glyph&quot;:null,&quot;view&quot;:{&quot;id&quot;:&quot;8c9a62d6-f494-487d-8914-6e73f40e3b72&quot;,&quot;type&quot;:&quot;CDSView&quot;}},&quot;id&quot;:&quot;6492638d-6d80-49f2-b7a9-94a19d3ef2d9&quot;,&quot;type&quot;:&quot;GlyphRenderer&quot;},{&quot;attributes&quot;:{&quot;bottom_units&quot;:&quot;screen&quot;,&quot;fill_alpha&quot;:{&quot;value&quot;:0.5},&quot;fill_color&quot;:{&quot;value&quot;:&quot;lightgrey&quot;},&quot;left_units&quot;:&quot;screen&quot;,&quot;level&quot;:&quot;overlay&quot;,&quot;line_alpha&quot;:{&quot;value&quot;:1.0},&quot;line_color&quot;:{&quot;value&quot;:&quot;black&quot;},&quot;line_dash&quot;:[4,4],&quot;line_width&quot;:{&quot;value&quot;:2},&quot;plot&quot;:null,&quot;render_mode&quot;:&quot;css&quot;,&quot;right_units&quot;:&quot;screen&quot;,&quot;top_units&quot;:&quot;screen&quot;},&quot;id&quot;:&quot;be3cc134-22fc-4afb-bd0a-a527d820071d&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;},{&quot;attributes&quot;:{&quot;fill_alpha&quot;:{&quot;value&quot;:0.9},&quot;fill_color&quot;:{&quot;field&quot;:&quot;borough&quot;,&quot;transform&quot;:{&quot;id&quot;:&quot;6f4f819e-7190-454c-a7a3-ba5d768d5c31&quot;,&quot;type&quot;:&quot;CategoricalColorMapper&quot;}},&quot;line_alpha&quot;:{&quot;value&quot;:0.9},&quot;line_color&quot;:{&quot;field&quot;:&quot;borough&quot;,&quot;transform&quot;:{&quot;id&quot;:&quot;6f4f819e-7190-454c-a7a3-ba5d768d5c31&quot;,&quot;type&quot;:&quot;CategoricalColorMapper&quot;}},&quot;xs&quot;:{&quot;field&quot;:&quot;xs&quot;},&quot;ys&quot;:{&quot;field&quot;:&quot;ys&quot;}},&quot;id&quot;:&quot;ae4388bc-abe2-4174-ba6b-6c017c8007fb&quot;,&quot;type&quot;:&quot;Patches&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;ed93bc07-ab38-4459-adf7-0bce0b3fe3b5&quot;,&quot;type&quot;:&quot;PanTool&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;a5f4691a-c99e-4675-9f31-5445af64b13e&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{&quot;fill_alpha&quot;:{&quot;value&quot;:0.1},&quot;fill_color&quot;:{&quot;value&quot;:&quot;#1f77b4&quot;},&quot;line_alpha&quot;:{&quot;value&quot;:0.1},&quot;line_color&quot;:{&quot;value&quot;:&quot;#1f77b4&quot;},&quot;xs&quot;:{&quot;field&quot;:&quot;xs&quot;},&quot;ys&quot;:{&quot;field&quot;:&quot;ys&quot;}},&quot;id&quot;:&quot;2fc94ead-d7e7-4b3b-99d4-3a1cd74e873f&quot;,&quot;type&quot;:&quot;Patches&quot;},{&quot;attributes&quot;:{&quot;source&quot;:{&quot;id&quot;:&quot;10ea5377-ee43-4b43-9633-3c452e6ae727&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;}},&quot;id&quot;:&quot;8c9a62d6-f494-487d-8914-6e73f40e3b72&quot;,&quot;type&quot;:&quot;CDSView&quot;},{&quot;attributes&quot;:{&quot;fill_alpha&quot;:{&quot;value&quot;:0.1},&quot;fill_color&quot;:{&quot;value&quot;:&quot;#1f77b4&quot;},&quot;line_alpha&quot;:{&quot;value&quot;:0.1},&quot;line_color&quot;:{&quot;value&quot;:&quot;#1f77b4&quot;},&quot;xs&quot;:{&quot;field&quot;:&quot;xs&quot;},&quot;ys&quot;:{&quot;field&quot;:&quot;ys&quot;}},&quot;id&quot;:&quot;faeedd3b-119f-4af2-9847-ca2652d1dbb7&quot;,&quot;type&quot;:&quot;Patches&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;fde2ffef-37b2-487c-8cd3-049402dc2fab&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{&quot;dimension&quot;:1,&quot;plot&quot;:{&quot;id&quot;:&quot;9a6525f3-7059-45ab-90ee-2d7e83c0a07a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;6f5fe3f1-e966-4fa5-aaac-66841af5b809&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;da23e3ce-8181-4da5-8600-c4ddd6806ef2&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;attributes&quot;:{&quot;fill_alpha&quot;:{&quot;value&quot;:0.9},&quot;fill_color&quot;:{&quot;field&quot;:&quot;tip_fraction&quot;,&quot;transform&quot;:{&quot;id&quot;:&quot;b661dcd9-576f-4c79-90d3-65f41d14b544&quot;,&quot;type&quot;:&quot;LogColorMapper&quot;}},&quot;line_alpha&quot;:{&quot;value&quot;:0.5},&quot;xs&quot;:{&quot;field&quot;:&quot;xs&quot;},&quot;ys&quot;:{&quot;field&quot;:&quot;ys&quot;}},&quot;id&quot;:&quot;f0c3dc48-49ec-4cee-9b0a-73efd89e128a&quot;,&quot;type&quot;:&quot;Patches&quot;},{&quot;attributes&quot;:{&quot;below&quot;:[{&quot;id&quot;:&quot;9139b6c7-121e-4d5b-9b54-caeceab315d1&quot;,&quot;type&quot;:&quot;LinearAxis&quot;}],&quot;left&quot;:[{&quot;id&quot;:&quot;a5d2472e-792f-4f8c-ae2a-7820e4e4cabb&quot;,&quot;type&quot;:&quot;LinearAxis&quot;}],&quot;renderers&quot;:[{&quot;id&quot;:&quot;9139b6c7-121e-4d5b-9b54-caeceab315d1&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;id&quot;:&quot;e8cb9eb4-de5c-457e-ab86-dc3772cc3f40&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;id&quot;:&quot;a5d2472e-792f-4f8c-ae2a-7820e4e4cabb&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;id&quot;:&quot;da23e3ce-8181-4da5-8600-c4ddd6806ef2&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;id&quot;:&quot;08b5d6f0-3cea-4e7d-a11b-4a4cd2eab30a&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;},{&quot;id&quot;:&quot;6492638d-6d80-49f2-b7a9-94a19d3ef2d9&quot;,&quot;type&quot;:&quot;GlyphRenderer&quot;},{&quot;id&quot;:&quot;10980cdc-edaa-4fec-9488-26914877b608&quot;,&quot;type&quot;:&quot;ColorBar&quot;}],&quot;right&quot;:[{&quot;id&quot;:&quot;10980cdc-edaa-4fec-9488-26914877b608&quot;,&quot;type&quot;:&quot;ColorBar&quot;}],&quot;title&quot;:{&quot;id&quot;:&quot;94dcf2d1-8432-4868-9512-d05dfca60e65&quot;,&quot;type&quot;:&quot;Title&quot;},&quot;toolbar&quot;:{&quot;id&quot;:&quot;61f82afe-2e85-4d6b-8872-1435a20bc13a&quot;,&quot;type&quot;:&quot;Toolbar&quot;},&quot;x_range&quot;:{&quot;id&quot;:&quot;169e471d-7586-4e4b-82ae-deea3e05ec36&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},&quot;x_scale&quot;:{&quot;id&quot;:&quot;62e9be12-1576-4008-82b6-0a61f5cf77ea&quot;,&quot;type&quot;:&quot;LinearScale&quot;},&quot;y_range&quot;:{&quot;id&quot;:&quot;dc69c649-db35-4baa-b925-35cf40cf46ef&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},&quot;y_scale&quot;:{&quot;id&quot;:&quot;7077852c-6855-4480-8785-509b9fbeb00e&quot;,&quot;type&quot;:&quot;LinearScale&quot;}},&quot;id&quot;:&quot;9a6525f3-7059-45ab-90ee-2d7e83c0a07a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;2693a195-e9cc-48e0-b8c7-94ab6f8d0cf7&quot;,&quot;type&quot;:&quot;HelpTool&quot;},{&quot;attributes&quot;:{&quot;palette&quot;:[&quot;#440154&quot;,&quot;#440255&quot;,&quot;#440357&quot;,&quot;#450558&quot;,&quot;#45065A&quot;,&quot;#45085B&quot;,&quot;#46095C&quot;,&quot;#460B5E&quot;,&quot;#460C5F&quot;,&quot;#460E61&quot;,&quot;#470F62&quot;,&quot;#471163&quot;,&quot;#471265&quot;,&quot;#471466&quot;,&quot;#471567&quot;,&quot;#471669&quot;,&quot;#47186A&quot;,&quot;#48196B&quot;,&quot;#481A6C&quot;,&quot;#481C6E&quot;,&quot;#481D6F&quot;,&quot;#481E70&quot;,&quot;#482071&quot;,&quot;#482172&quot;,&quot;#482273&quot;,&quot;#482374&quot;,&quot;#472575&quot;,&quot;#472676&quot;,&quot;#472777&quot;,&quot;#472878&quot;,&quot;#472A79&quot;,&quot;#472B7A&quot;,&quot;#472C7B&quot;,&quot;#462D7C&quot;,&quot;#462F7C&quot;,&quot;#46307D&quot;,&quot;#46317E&quot;,&quot;#45327F&quot;,&quot;#45347F&quot;,&quot;#453580&quot;,&quot;#453681&quot;,&quot;#443781&quot;,&quot;#443982&quot;,&quot;#433A83&quot;,&quot;#433B83&quot;,&quot;#433C84&quot;,&quot;#423D84&quot;,&quot;#423E85&quot;,&quot;#424085&quot;,&quot;#414186&quot;,&quot;#414286&quot;,&quot;#404387&quot;,&quot;#404487&quot;,&quot;#3F4587&quot;,&quot;#3F4788&quot;,&quot;#3E4888&quot;,&quot;#3E4989&quot;,&quot;#3D4A89&quot;,&quot;#3D4B89&quot;,&quot;#3D4C89&quot;,&quot;#3C4D8A&quot;,&quot;#3C4E8A&quot;,&quot;#3B508A&quot;,&quot;#3B518A&quot;,&quot;#3A528B&quot;,&quot;#3A538B&quot;,&quot;#39548B&quot;,&quot;#39558B&quot;,&quot;#38568B&quot;,&quot;#38578C&quot;,&quot;#37588C&quot;,&quot;#37598C&quot;,&quot;#365A8C&quot;,&quot;#365B8C&quot;,&quot;#355C8C&quot;,&quot;#355D8C&quot;,&quot;#345E8D&quot;,&quot;#345F8D&quot;,&quot;#33608D&quot;,&quot;#33618D&quot;,&quot;#32628D&quot;,&quot;#32638D&quot;,&quot;#31648D&quot;,&quot;#31658D&quot;,&quot;#31668D&quot;,&quot;#30678D&quot;,&quot;#30688D&quot;,&quot;#2F698D&quot;,&quot;#2F6A8D&quot;,&quot;#2E6B8E&quot;,&quot;#2E6C8E&quot;,&quot;#2E6D8E&quot;,&quot;#2D6E8E&quot;,&quot;#2D6F8E&quot;,&quot;#2C708E&quot;,&quot;#2C718E&quot;,&quot;#2C728E&quot;,&quot;#2B738E&quot;,&quot;#2B748E&quot;,&quot;#2A758E&quot;,&quot;#2A768E&quot;,&quot;#2A778E&quot;,&quot;#29788E&quot;,&quot;#29798E&quot;,&quot;#287A8E&quot;,&quot;#287A8E&quot;,&quot;#287B8E&quot;,&quot;#277C8E&quot;,&quot;#277D8E&quot;,&quot;#277E8E&quot;,&quot;#267F8E&quot;,&quot;#26808E&quot;,&quot;#26818E&quot;,&quot;#25828E&quot;,&quot;#25838D&quot;,&quot;#24848D&quot;,&quot;#24858D&quot;,&quot;#24868D&quot;,&quot;#23878D&quot;,&quot;#23888D&quot;,&quot;#23898D&quot;,&quot;#22898D&quot;,&quot;#228A8D&quot;,&quot;#228B8D&quot;,&quot;#218C8D&quot;,&quot;#218D8C&quot;,&quot;#218E8C&quot;,&quot;#208F8C&quot;,&quot;#20908C&quot;,&quot;#20918C&quot;,&quot;#1F928C&quot;,&quot;#1F938B&quot;,&quot;#1F948B&quot;,&quot;#1F958B&quot;,&quot;#1F968B&quot;,&quot;#1E978A&quot;,&quot;#1E988A&quot;,&quot;#1E998A&quot;,&quot;#1E998A&quot;,&quot;#1E9A89&quot;,&quot;#1E9B89&quot;,&quot;#1E9C89&quot;,&quot;#1E9D88&quot;,&quot;#1E9E88&quot;,&quot;#1E9F88&quot;,&quot;#1EA087&quot;,&quot;#1FA187&quot;,&quot;#1FA286&quot;,&quot;#1FA386&quot;,&quot;#20A485&quot;,&quot;#20A585&quot;,&quot;#21A685&quot;,&quot;#21A784&quot;,&quot;#22A784&quot;,&quot;#23A883&quot;,&quot;#23A982&quot;,&quot;#24AA82&quot;,&quot;#25AB81&quot;,&quot;#26AC81&quot;,&quot;#27AD80&quot;,&quot;#28AE7F&quot;,&quot;#29AF7F&quot;,&quot;#2AB07E&quot;,&quot;#2BB17D&quot;,&quot;#2CB17D&quot;,&quot;#2EB27C&quot;,&quot;#2FB37B&quot;,&quot;#30B47A&quot;,&quot;#32B57A&quot;,&quot;#33B679&quot;,&quot;#35B778&quot;,&quot;#36B877&quot;,&quot;#38B976&quot;,&quot;#39B976&quot;,&quot;#3BBA75&quot;,&quot;#3DBB74&quot;,&quot;#3EBC73&quot;,&quot;#40BD72&quot;,&quot;#42BE71&quot;,&quot;#44BE70&quot;,&quot;#45BF6F&quot;,&quot;#47C06E&quot;,&quot;#49C16D&quot;,&quot;#4BC26C&quot;,&quot;#4DC26B&quot;,&quot;#4FC369&quot;,&quot;#51C468&quot;,&quot;#53C567&quot;,&quot;#55C666&quot;,&quot;#57C665&quot;,&quot;#59C764&quot;,&quot;#5BC862&quot;,&quot;#5EC961&quot;,&quot;#60C960&quot;,&quot;#62CA5F&quot;,&quot;#64CB5D&quot;,&quot;#67CC5C&quot;,&quot;#69CC5B&quot;,&quot;#6BCD59&quot;,&quot;#6DCE58&quot;,&quot;#70CE56&quot;,&quot;#72CF55&quot;,&quot;#74D054&quot;,&quot;#77D052&quot;,&quot;#79D151&quot;,&quot;#7CD24F&quot;,&quot;#7ED24E&quot;,&quot;#81D34C&quot;,&quot;#83D34B&quot;,&quot;#86D449&quot;,&quot;#88D547&quot;,&quot;#8BD546&quot;,&quot;#8DD644&quot;,&quot;#90D643&quot;,&quot;#92D741&quot;,&quot;#95D73F&quot;,&quot;#97D83E&quot;,&quot;#9AD83C&quot;,&quot;#9DD93A&quot;,&quot;#9FD938&quot;,&quot;#A2DA37&quot;,&quot;#A5DA35&quot;,&quot;#A7DB33&quot;,&quot;#AADB32&quot;,&quot;#ADDC30&quot;,&quot;#AFDC2E&quot;,&quot;#B2DD2C&quot;,&quot;#B5DD2B&quot;,&quot;#B7DD29&quot;,&quot;#BADE27&quot;,&quot;#BDDE26&quot;,&quot;#BFDF24&quot;,&quot;#C2DF22&quot;,&quot;#C5DF21&quot;,&quot;#C7E01F&quot;,&quot;#CAE01E&quot;,&quot;#CDE01D&quot;,&quot;#CFE11C&quot;,&quot;#D2E11B&quot;,&quot;#D4E11A&quot;,&quot;#D7E219&quot;,&quot;#DAE218&quot;,&quot;#DCE218&quot;,&quot;#DFE318&quot;,&quot;#E1E318&quot;,&quot;#E4E318&quot;,&quot;#E7E419&quot;,&quot;#E9E419&quot;,&quot;#ECE41A&quot;,&quot;#EEE51B&quot;,&quot;#F1E51C&quot;,&quot;#F3E51E&quot;,&quot;#F6E61F&quot;,&quot;#F8E621&quot;,&quot;#FAE622&quot;,&quot;#FDE724&quot;]},&quot;id&quot;:&quot;b661dcd9-576f-4c79-90d3-65f41d14b544&quot;,&quot;type&quot;:&quot;LogColorMapper&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;b7d58927-6ebb-4002-8dd1-f651f3cd7cc3&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{&quot;overlay&quot;:{&quot;id&quot;:&quot;08b5d6f0-3cea-4e7d-a11b-4a4cd2eab30a&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;}},&quot;id&quot;:&quot;9bdf7e1b-f00b-4377-87b0-82d52037d7df&quot;,&quot;type&quot;:&quot;BoxZoomTool&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null,&quot;geojson&quot;:&quot;{\&quot;type\&quot;: \&quot;FeatureCollection\&quot;, \&quot;features\&quot;: [{\&quot;id\&quot;: \&quot;2\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 654, \&quot;OBJECTID\&quot;: 3, \&quot;Shape_Leng\&quot;: 0.0843411059012, \&quot;Shape_Area\&quot;: 0.000314414156821, \&quot;zone\&quot;: \&quot;Allerton/Pelham Gardens\&quot;, \&quot;LocationID\&quot;: 3, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84792614099985, 40.87134223399991], [-73.82950892699994, 40.86184121299988], [-73.82834347399992, 40.86089202599988], [-73.8368191849999, 40.85727680899989], [-73.8566377469999, 40.8581191719999], [-73.85780378799993, 40.86303621699989], [-73.85961281199982, 40.865512717999856], [-73.86156274099987, 40.86554946399989], [-73.86137924099984, 40.8713365119999], [-73.85661382499993, 40.87125016699991], [-73.85651292399994, 40.874217792999936], [-73.84792614099985, 40.87134223399991]]]}}, {\&quot;id\&quot;: \&quot;3\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 471596, \&quot;OBJECTID\&quot;: 4, \&quot;Shape_Leng\&quot;: 0.0435665270921, \&quot;Shape_Area\&quot;: 0.000111871946192, \&quot;zone\&quot;: \&quot;Alphabet City\&quot;, \&quot;LocationID\&quot;: 4, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97177410965318, 40.72582128133705], [-73.97347975574512, 40.71886142911285], [-73.98382387299982, 40.72147287199987], [-73.97802697999985, 40.729433059999984], [-73.97177410965318, 40.72582128133705]]]}}, {\&quot;id\&quot;: \&quot;4\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 39, \&quot;OBJECTID\&quot;: 5, \&quot;Shape_Leng\&quot;: 0.0921464898574, \&quot;Shape_Area\&quot;: 0.000497957489363, \&quot;zone\&quot;: \&quot;Arden Heights\&quot;, \&quot;LocationID\&quot;: 5, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.17421738099989, 40.56256808599987], [-74.17185166499996, 40.56152092299991], [-74.18018524699995, 40.54837960899992], [-74.18903145199995, 40.53815934199989], [-74.19377169299999, 40.53583384699993], [-74.20314825999996, 40.55606178499986], [-74.20046730799992, 40.55623049099987], [-74.19317388399995, 40.56260434399992], [-74.18340311699991, 40.56540496199994], [-74.17421738099989, 40.56256808599987]]]}}, {\&quot;id\&quot;: \&quot;5\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 262, \&quot;OBJECTID\&quot;: 6, \&quot;Shape_Leng\&quot;: 0.150490542523, \&quot;Shape_Area\&quot;: 0.000606460984581, \&quot;zone\&quot;: \&quot;Arrochar/Fort Wadsworth\&quot;, \&quot;LocationID\&quot;: 6, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.06367318899999, 40.60219816599994], [-74.0651709129999, 40.604213507999894], [-74.05685812390232, 40.608056357772554], [-74.05381069805436, 40.605912718852984], [-74.05222826954189, 40.599776102303636], [-74.06503332378131, 40.58899099843518], [-74.07043976099992, 40.59673474699988], [-74.08173342999991, 40.59215628599987], [-74.08376862299998, 40.595520956999934], [-74.08587511899998, 40.59589012099985], [-74.0814942209999, 40.599081990999935], [-74.08184498199992, 40.601535196999926], [-74.08947630599992, 40.60090432199991], [-74.09172051499995, 40.59922085699985], [-74.09271908099993, 40.60636222199992], [-74.09045495899996, 40.60909452599991], [-74.06367318899999, 40.60219816599994]]]}}, {\&quot;id\&quot;: \&quot;6\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 301322, \&quot;OBJECTID\&quot;: 7, \&quot;Shape_Leng\&quot;: 0.107417171123, \&quot;Shape_Area\&quot;: 0.000389787989274, \&quot;zone\&quot;: \&quot;Astoria\&quot;, \&quot;LocationID\&quot;: 7, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90413637799996, 40.76752031699986], [-73.90202516599992, 40.767416783999884], [-73.90779405499987, 40.760517799999896], [-73.90631505099988, 40.75984387599992], [-73.91023124699991, 40.75297652299985], [-73.91763192900005, 40.75385784899993], [-73.92562743799996, 40.75213724499991], [-73.92415699999985, 40.753961141999845], [-73.93679091699993, 40.75988288099991], [-73.93398092100001, 40.76282598199987], [-73.93858976899998, 40.766817358999916], [-73.93493511099992, 40.76701302399987], [-73.93344468499993, 40.768817789999915], [-73.92425288799978, 40.76472456399995], [-73.92218946199995, 40.767267356999895], [-73.91977764799998, 40.7661521839999], [-73.91849336999996, 40.76773465699995], [-73.91995596899991, 40.768440064999865], [-73.91811686499992, 40.77002848599989], [-73.90413637799996, 40.76752031699986]]]}}, {\&quot;id\&quot;: \&quot;7\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2190, \&quot;OBJECTID\&quot;: 8, \&quot;Shape_Leng\&quot;: 0.0275906911574, \&quot;Shape_Area\&quot;: 2.6587716279e-05, \&quot;zone\&quot;: \&quot;Astoria Park\&quot;, \&quot;LocationID\&quot;: 8, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92334041500001, 40.77512891199993], [-73.92827730816353, 40.77689897516217], [-73.91996458796496, 40.78263506876824], [-73.91796581399998, 40.78125629099988], [-73.92375761299998, 40.77654701199991], [-73.92334041500001, 40.77512891199993]]]}}, {\&quot;id\&quot;: \&quot;8\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 422, \&quot;OBJECTID\&quot;: 9, \&quot;Shape_Leng\&quot;: 0.0997840924705, \&quot;Shape_Area\&quot;: 0.000338443803197, \&quot;zone\&quot;: \&quot;Auburndale\&quot;, \&quot;LocationID\&quot;: 9, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.78502434699996, 40.761036515999855], [-73.77573836999991, 40.74332564699993], [-73.79672497900003, 40.738416642999894], [-73.79723084999992, 40.74169550699993], [-73.7944636839999, 40.74497002199991], [-73.79472264899997, 40.74759932999989], [-73.79729524699995, 40.74943505299987], [-73.79471901099991, 40.75064761699991], [-73.79493246199993, 40.75779802999994], [-73.79031517, 40.75782345099988], [-73.79076004599987, 40.76098576899991], [-73.79343991199988, 40.760764127999934], [-73.79317944599984, 40.77040317799988], [-73.78502434699996, 40.761036515999855]]]}}, {\&quot;id\&quot;: \&quot;9\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 22388, \&quot;OBJECTID\&quot;: 10, \&quot;Shape_Leng\&quot;: 0.0998394794152, \&quot;Shape_Area\&quot;: 0.000435823818081, \&quot;zone\&quot;: \&quot;Baisley Park\&quot;, \&quot;LocationID\&quot;: 10, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7832662499999, 40.68999429299992], [-73.77966850599998, 40.685377122999945], [-73.77699767599997, 40.68628268899992], [-73.77220275299989, 40.681610338999896], [-73.78025859499995, 40.6778409239999], [-73.78573730899993, 40.67238503499988], [-73.78808647399985, 40.6730096269999], [-73.78940999399993, 40.66684115799993], [-73.80155565300004, 40.6667533639999], [-73.80142836799988, 40.673666833999874], [-73.80576840199991, 40.682932390999916], [-73.79898209099989, 40.68485873699989], [-73.79995042799996, 40.68682771899991], [-73.79561486799987, 40.688656890999916], [-73.793908417, 40.68630469099985], [-73.7832662499999, 40.68999429299992]]]}}, {\&quot;id\&quot;: \&quot;10\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 928, \&quot;OBJECTID\&quot;: 11, \&quot;Shape_Leng\&quot;: 0.0792110389596, \&quot;Shape_Area\&quot;: 0.00026452053504, \&quot;zone\&quot;: \&quot;Bath Beach\&quot;, \&quot;LocationID\&quot;: 11, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00109809499993, 40.60303462599992], [-73.99559320799995, 40.600232221999875], [-74.00200394754667, 40.594132371137796], [-74.01041238886523, 40.60047518174621], [-74.01942760861903, 40.602871578425265], [-74.01549854999998, 40.606841523999925], [-74.01701910199995, 40.60765441699994], [-74.01050403599997, 40.613896610999866], [-74.00094408399997, 40.60863970999988], [-74.00493448899994, 40.60507440599987], [-74.00109809499993, 40.60303462599992]]]}}, {\&quot;id\&quot;: \&quot;11\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 56712, \&quot;OBJECTID\&quot;: 12, \&quot;Shape_Leng\&quot;: 0.0366613013579, \&quot;Shape_Area\&quot;: 4.15116236727e-05, \&quot;zone\&quot;: \&quot;Battery Park\&quot;, \&quot;LocationID\&quot;: 12, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01565756599994, 40.70483308799993], [-74.01425861399996, 40.70448944299991], [-74.01376867799992, 40.7011432629999], [-74.014220631955, 40.70011149186829], [-74.0176479750685, 40.70349459987955], [-74.01565756599994, 40.70483308799993]]]}}, {\&quot;id\&quot;: \&quot;12\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1319172, \&quot;OBJECTID\&quot;: 13, \&quot;Shape_Leng\&quot;: 0.0502813228631, \&quot;Shape_Area\&quot;: 0.000149358592917, \&quot;zone\&quot;: \&quot;Battery Park City\&quot;, \&quot;LocationID\&quot;: 13, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01244109299991, 40.7190576729999], [-74.01668714699993, 40.704743941999865], [-74.01844770243774, 40.70416216823156], [-74.0174808615258, 40.704667487696156], [-74.01934254624483, 40.706093673029706], [-74.01777014254499, 40.71283457478916], [-74.01662424425285, 40.71215731899529], [-74.01632006627581, 40.71340798247826], [-74.01772496219284, 40.71307018162274], [-74.01671018605829, 40.718624176057965], [-74.01244109299991, 40.7190576729999]]]}}, {\&quot;id\&quot;: \&quot;13\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 8052, \&quot;OBJECTID\&quot;: 14, \&quot;Shape_Leng\&quot;: 0.175213698053, \&quot;Shape_Area\&quot;: 0.00138177826442, \&quot;zone\&quot;: \&quot;Bay Ridge\&quot;, \&quot;LocationID\&quot;: 14, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.03407329297129, 40.64431393298185], [-74.02475437599998, 40.6381214179999], [-74.02108051399998, 40.64149093699994], [-74.02141038399992, 40.638584902999845], [-74.01514630699995, 40.63322193799993], [-74.01970491599991, 40.6221849649999], [-74.02754297299998, 40.61293718299988], [-74.02637609099996, 40.61245060299993], [-74.02710660599995, 40.61024395599991], [-74.02150602899994, 40.60782209899992], [-74.02247769499994, 40.60667421599987], [-74.02078541, 40.605673685999875], [-74.02139467299999, 40.60449399799991], [-74.01869135799996, 40.60360792399991], [-74.01942760861903, 40.602871578425265], [-74.0321315955131, 40.605901836264245], [-74.04038132338673, 40.61534178232843], [-74.04189123741789, 40.62406041492981], [-74.04108656611493, 40.63009852389527], [-74.03680662048858, 40.63898422154557], [-74.03876297920752, 40.639588258980524], [-74.03672484374877, 40.63914119020668], [-74.03571276150724, 40.64064015404647], [-74.03675840317513, 40.641611762713936], [-74.03407329297129, 40.64431393298185]]]}}, {\&quot;id\&quot;: \&quot;14\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 286, \&quot;OBJECTID\&quot;: 15, \&quot;Shape_Leng\&quot;: 0.14433622262, \&quot;Shape_Area\&quot;: 0.000925219395547, \&quot;zone\&quot;: \&quot;Bay Terrace/Fort Totten\&quot;, \&quot;LocationID\&quot;: 15, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7774039129087, 40.79659824126783], [-73.77063124537418, 40.78846290603716], [-73.77426836058959, 40.78675665865473], [-73.77633728818715, 40.78848722575376], [-73.76820055460033, 40.77944417919097], [-73.76702392346498, 40.78008623415827], [-73.76677570373936, 40.77981245869834], [-73.76782207615058, 40.77881037615661], [-73.77553732199992, 40.777025597999916], [-73.77583958299994, 40.778612371999884], [-73.79565702099983, 40.773036085999905], [-73.79853009399987, 40.775190728999924], [-73.8037902289999, 40.77561011199992], [-73.80242791699989, 40.78606827399991], [-73.79491977600001, 40.78633880799987], [-73.79058298999988, 40.78819290999989], [-73.79179280401884, 40.789351616549254], [-73.79028202353197, 40.79031696339975], [-73.78174708763098, 40.79113340664446], [-73.78079182072646, 40.79403591986439], [-73.78325271025878, 40.79492032976596], [-73.7774039129087, 40.79659824126783]]]}}, {\&quot;id\&quot;: \&quot;15\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 752, \&quot;OBJECTID\&quot;: 16, \&quot;Shape_Leng\&quot;: 0.141291873771, \&quot;Shape_Area\&quot;: 0.000871889446182, \&quot;zone\&quot;: \&quot;Bayside\&quot;, \&quot;LocationID\&quot;: 16, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7685730499999, 40.77910542899991], [-73.75864264358073, 40.767357170035446], [-73.75377036482266, 40.76530463124142], [-73.75921689799992, 40.76432485599988], [-73.75800131799996, 40.76037986699988], [-73.76239510499991, 40.75949699799992], [-73.76184343999986, 40.75553726899989], [-73.75684127399991, 40.74932207699987], [-73.77573836999991, 40.74332564699993], [-73.78546383099984, 40.76259192499988], [-73.79565702099983, 40.773036085999905], [-73.77678363299991, 40.77840958299987], [-73.77553732199992, 40.777025597999916], [-73.7685730499999, 40.77910542899991]]]}}, {\&quot;id\&quot;: \&quot;16\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 66103, \&quot;OBJECTID\&quot;: 17, \&quot;Shape_Leng\&quot;: 0.093522632948, \&quot;Shape_Area\&quot;: 0.000322957654799, \&quot;zone\&quot;: \&quot;Bedford\&quot;, \&quot;LocationID\&quot;: 17, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94306406899986, 40.701424434999886], [-73.94193078899983, 40.70072523399989], [-73.94438788599984, 40.70042452299993], [-73.94032794, 40.679889974999874], [-73.9533701749999, 40.680640507999904], [-73.95468418899998, 40.68724485399985], [-73.95956770199984, 40.686682554999955], [-73.96029281699998, 40.69034624999995], [-73.95541057999996, 40.69090829199994], [-73.95614239299985, 40.694579018999896], [-73.96015854699988, 40.69411730899989], [-73.96105100699992, 40.69832607899989], [-73.95701993199991, 40.69897391399995], [-73.95745736399992, 40.70082260299993], [-73.95381196900003, 40.703180979999914], [-73.95128819399989, 40.700922364999855], [-73.94705205299991, 40.70366394899985], [-73.94306406899986, 40.701424434999886]]]}}, {\&quot;id\&quot;: \&quot;17\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1787, \&quot;OBJECTID\&quot;: 18, \&quot;Shape_Leng\&quot;: 0.0697995498569, \&quot;Shape_Area\&quot;: 0.000148850163948, \&quot;zone\&quot;: \&quot;Bedford Park\&quot;, \&quot;LocationID\&quot;: 18, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88513907699999, 40.86638287399992], [-73.88889566099989, 40.86475415299988], [-73.89573924699978, 40.85813820699986], [-73.89883814599983, 40.859307307999906], [-73.897143798, 40.86244506499991], [-73.90107966999994, 40.86275638299992], [-73.8974032329998, 40.86747418999989], [-73.89438130299995, 40.866068850999966], [-73.88785196299986, 40.87211417599992], [-73.88937163799984, 40.87338229799993], [-73.88527683199987, 40.87921766899991], [-73.88146889699985, 40.868573645999916], [-73.88513907699999, 40.86638287399992]]]}}, {\&quot;id\&quot;: \&quot;18\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1246, \&quot;OBJECTID\&quot;: 19, \&quot;Shape_Leng\&quot;: 0.101824875452, \&quot;Shape_Area\&quot;: 0.000546661094782, \&quot;zone\&quot;: \&quot;Bellerose\&quot;, \&quot;LocationID\&quot;: 19, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.72339596299987, 40.750389075999855], [-73.72258571899978, 40.74885045099991], [-73.72010148299994, 40.74977568599991], [-73.71147804899985, 40.73250140099988], [-73.71049995381028, 40.72722708720663], [-73.72990512499977, 40.723272494999954], [-73.7314721509999, 40.727411794999924], [-73.74640108899996, 40.7312928389999], [-73.74672140400006, 40.73247715099991], [-73.73933151399987, 40.739474474999916], [-73.72829094199989, 40.74745895699992], [-73.727664654, 40.749654641999946], [-73.72339596299987, 40.750389075999855]]]}}, {\&quot;id\&quot;: \&quot;19\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1115, \&quot;OBJECTID\&quot;: 20, \&quot;Shape_Leng\&quot;: 0.0514401924362, \&quot;Shape_Area\&quot;: 0.000134512633032, \&quot;zone\&quot;: \&quot;Belmont\&quot;, \&quot;LocationID\&quot;: 20, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88386792099986, 40.8642908889999], [-73.88060896899991, 40.860357092999884], [-73.88311982600001, 40.848221091999925], [-73.88987871399985, 40.85207022099993], [-73.89109710400002, 40.856779813999886], [-73.89027555599993, 40.86110907299996], [-73.89177188799992, 40.86187171599992], [-73.88362518100003, 40.86725758799991], [-73.88267624699999, 40.86608914099984], [-73.88386792099986, 40.8642908889999]]]}}, {\&quot;id\&quot;: \&quot;20\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1226, \&quot;OBJECTID\&quot;: 21, \&quot;Shape_Leng\&quot;: 0.115973569062, \&quot;Shape_Area\&quot;: 0.000380251345507, \&quot;zone\&quot;: \&quot;Bensonhurst East\&quot;, \&quot;LocationID\&quot;: 21, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97418385499991, 40.609463501999905], [-73.97299433999983, 40.6088141419999], [-73.97291116900001, 40.599315803999964], [-73.97148350899987, 40.59717158499996], [-73.98035785499995, 40.59619154099992], [-73.97995443499985, 40.594073811999884], [-73.98601936799993, 40.594446048999906], [-73.98962150099992, 40.59098199299996], [-73.99923690396953, 40.588935328269024], [-73.99710730365224, 40.591390755943046], [-74.00004314944917, 40.59120428665461], [-73.9994830488618, 40.59296919994875], [-73.99530829599992, 40.59442758699989], [-73.99674706899995, 40.59564312599992], [-73.9868476259999, 40.60509723599994], [-73.98913191499994, 40.6064561369999], [-73.97963821799982, 40.61556454699991], [-73.97477658, 40.6126384749999], [-73.97418385499991, 40.609463501999905]]]}}, {\&quot;id\&quot;: \&quot;21\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2497, \&quot;OBJECTID\&quot;: 22, \&quot;Shape_Leng\&quot;: 0.126170229196, \&quot;Shape_Area\&quot;: 0.000472062684608, \&quot;zone\&quot;: \&quot;Bensonhurst West\&quot;, \&quot;LocationID\&quot;: 22, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99254973599997, 40.62427426799996], [-73.97963821799982, 40.61556454699991], [-73.98913191499994, 40.6064561369999], [-73.9868476259999, 40.60509723599994], [-73.99674706899995, 40.59564312599992], [-73.99530829599992, 40.59442758699989], [-74.00105748445709, 40.5925370050623], [-74.00200394804675, 40.594132371137796], [-73.99559320799995, 40.600232221999875], [-74.00493448899994, 40.60507440599987], [-74.00094408399997, 40.60863970999988], [-74.01050403599997, 40.613896610999866], [-73.99932090299998, 40.62465524699996], [-73.99771358999998, 40.62368026999996], [-73.99678847599995, 40.626826050999895], [-73.99254973599997, 40.62427426799996]]]}}, {\&quot;id\&quot;: \&quot;22\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 246, \&quot;OBJECTID\&quot;: 23, \&quot;Shape_Leng\&quot;: 0.290556028962, \&quot;Shape_Area\&quot;: 0.00219556576201, \&quot;zone\&quot;: \&quot;Bloomfield/Emerson Hill\&quot;, \&quot;LocationID\&quot;: 23, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.19568609223377, 40.63501686464005], [-74.17459706299995, 40.622364010999874], [-74.16163010299996, 40.61793493599989], [-74.15018666499996, 40.60949781099991], [-74.14391816399994, 40.60798983699987], [-74.11742466500002, 40.609289008999916], [-74.11487058499988, 40.602136659999864], [-74.12059546299996, 40.601809757999874], [-74.12506115499997, 40.59818005599987], [-74.13091909399999, 40.598855047999905], [-74.13864458599996, 40.58906080499989], [-74.14790576499993, 40.58855634599993], [-74.16025756099997, 40.59534393799988], [-74.16189940599996, 40.59529877099993], [-74.16369888199995, 40.59225833899993], [-74.16360268199993, 40.593374198999854], [-74.16886362399997, 40.59472808699995], [-74.16719634899995, 40.602075311999926], [-74.17260229799992, 40.602971490999934], [-74.17822457299994, 40.5998280609999], [-74.17932277499995, 40.59676057899984], [-74.18730248699987, 40.588488221999896], [-74.185371048, 40.58745101499987], [-74.19423261399992, 40.58514680599991], [-74.19964981299998, 40.58226262599991], [-74.20048848899994, 40.5799497779999], [-74.20583829199992, 40.57984126099989], [-74.204646089432, 40.589285745465865], [-74.19751357718701, 40.59679898603677], [-74.20281628374593, 40.608270827967345], [-74.20244374449518, 40.61328469393197], [-74.2003834842897, 40.616428098243766], [-74.20163201104123, 40.623121565457346], [-74.2007872998309, 40.63034627446781], [-74.19568609223377, 40.63501686464005]]]}}, {\&quot;id\&quot;: \&quot;23\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 428620, \&quot;OBJECTID\&quot;: 24, \&quot;Shape_Leng\&quot;: 0.0469999619287, \&quot;Shape_Area\&quot;: 6.07235737749e-05, \&quot;zone\&quot;: \&quot;Bloomingdale\&quot;, \&quot;LocationID\&quot;: 24, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95953658899998, 40.798718525999895], [-73.96004456499999, 40.79804123499991], [-73.97287179090726, 40.8033561875739], [-73.97110765876137, 40.80579013958964], [-73.95817297099987, 40.800582540999876], [-73.95953658899998, 40.798718525999895]]]}}, {\&quot;id\&quot;: \&quot;24\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 168900, \&quot;OBJECTID\&quot;: 25, \&quot;Shape_Leng\&quot;: 0.0471458199319, \&quot;Shape_Area\&quot;: 0.000124168267356, \&quot;zone\&quot;: \&quot;Boerum Hill\&quot;, \&quot;LocationID\&quot;: 25, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98155298299992, 40.689146163999936], [-73.97804289599988, 40.68485661499987], [-73.98175642299985, 40.67931462399987], [-73.99490113599977, 40.6844302379999], [-73.99236366999985, 40.689690123999924], [-73.99054474599986, 40.689168104999936], [-73.98902944799994, 40.69212386099992], [-73.98155298299992, 40.689146163999936]]]}}, {\&quot;id\&quot;: \&quot;25\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3005, \&quot;OBJECTID\&quot;: 26, \&quot;Shape_Leng\&quot;: 0.12354780707, \&quot;Shape_Area\&quot;: 0.000534039927626, \&quot;zone\&quot;: \&quot;Borough Park\&quot;, \&quot;LocationID\&quot;: 26, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98331628499983, 40.6414786819999], [-73.98042057899988, 40.64238522699991], [-73.97911188699993, 40.63544038599991], [-73.9768886119999, 40.6356748619999], [-73.97705352899999, 40.62153252199987], [-73.97539380499998, 40.62076998699995], [-73.97785009299986, 40.617287605999906], [-73.97537335500002, 40.6157547219999], [-73.97335879399992, 40.616541714999904], [-73.97290326899996, 40.61415296799988], [-73.97517176999993, 40.61472418599991], [-73.97477658, 40.6126384749999], [-74.00702302499997, 40.63210999499996], [-74.00556490399993, 40.63308317599992], [-74.00735636699996, 40.6341636269999], [-73.99917564799993, 40.642025441999856], [-73.9955103369999, 40.63980966699993], [-73.98834986699991, 40.64456224399992], [-73.98331628499983, 40.6414786819999]]]}}, {\&quot;id\&quot;: \&quot;26\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 48, \&quot;OBJECTID\&quot;: 27, \&quot;Shape_Leng\&quot;: 0.202508808518, \&quot;Shape_Area\&quot;: 0.00134088762746, \&quot;zone\&quot;: \&quot;Breezy Point/Fort Tilden/Riis Beach\&quot;, \&quot;LocationID\&quot;: 27, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86522555399998, 40.57045847199989], [-73.86268391251235, 40.56650565604353], [-73.8949181726631, 40.5570787962983], [-73.90658574923901, 40.555710625377294], [-73.94073681682697, 40.54182008707755], [-73.93985107460422, 40.55456005374592], [-73.9261572327542, 40.56155260972308], [-73.91766081900093, 40.56282614968639], [-73.91197024752503, 40.56586941753247], [-73.90683894638656, 40.562856359344565], [-73.90121507272005, 40.563008460632346], [-73.89261013445609, 40.56858724728667], [-73.87780808995733, 40.56880063006316], [-73.86288301945429, 40.576059761127304], [-73.86361132999998, 40.573823056999835], [-73.86662812000002, 40.573057648999914], [-73.86522555399998, 40.57045847199989]]]}}, {\&quot;id\&quot;: \&quot;27\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 11566, \&quot;OBJECTID\&quot;: 28, \&quot;Shape_Leng\&quot;: 0.097960782214, \&quot;Shape_Area\&quot;: 0.000291203927662, \&quot;zone\&quot;: \&quot;Briarwood/Jamaica Hills\&quot;, \&quot;LocationID\&quot;: 28, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79240413399991, 40.716193040999926], [-73.79303800099989, 40.71071107499988], [-73.79776810199988, 40.7091431879999], [-73.79870150699992, 40.71066337699988], [-73.80130625, 40.709742148999965], [-73.80302414799988, 40.70813965699997], [-73.80165725599993, 40.705761474999846], [-73.8056477309999, 40.70467172799994], [-73.80694856299993, 40.70736709999989], [-73.81201248599983, 40.70594494499993], [-73.81152856899989, 40.70227287499991], [-73.81637824499992, 40.70245196399987], [-73.82591945199992, 40.71598987599992], [-73.80494148499987, 40.715996230999956], [-73.79073248899982, 40.71920875699987], [-73.79240413399991, 40.716193040999926]]]}}, {\&quot;id\&quot;: \&quot;28\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1132, \&quot;OBJECTID\&quot;: 29, \&quot;Shape_Leng\&quot;: 0.0714083127733, \&quot;Shape_Area\&quot;: 0.000201673837402, \&quot;zone\&quot;: \&quot;Brighton Beach\&quot;, \&quot;LocationID\&quot;: 29, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96004798699995, 40.58326987199995], [-73.95414287899986, 40.58310613999989], [-73.95235846771321, 40.574274685845246], [-73.9589871897255, 40.57343065573189], [-73.95941778299985, 40.57517798299994], [-73.9688899589999, 40.57526123899986], [-73.96514385199995, 40.5911019159999], [-73.9606798409999, 40.591597582999945], [-73.96004798699995, 40.58326987199995]]]}}, {\&quot;id\&quot;: \&quot;29\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 46, \&quot;OBJECTID\&quot;: 30, \&quot;Shape_Leng\&quot;: 0.0945097669793, \&quot;Shape_Area\&quot;: 0.000145862107626, \&quot;zone\&quot;: \&quot;Broad Channel\&quot;, \&quot;LocationID\&quot;: 30, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82075892499992, 40.61523267899991], [-73.81652681189118, 40.61494701007998], [-73.81475287105245, 40.6086327967523], [-73.81739192103247, 40.60515812414338], [-73.82071206789055, 40.59517051496212], [-73.83465599507487, 40.59516845882606], [-73.83239364476839, 40.59780335319121], [-73.82806159687702, 40.59768040282441], [-73.8259798598142, 40.599472067181495], [-73.82465420648664, 40.5981492468515], [-73.82376612290614, 40.60004007091038], [-73.82146929866913, 40.59999372263383], [-73.82445218054455, 40.60079696284418], [-73.81961795381072, 40.610479041032136], [-73.82087841795061, 40.61225734590997], [-73.82161460094558, 40.60848031911391], [-73.8238246859766, 40.61149866495507], [-73.82075892499992, 40.61523267899991]]]}}, {\&quot;id\&quot;: \&quot;30\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 543, \&quot;OBJECTID\&quot;: 31, \&quot;Shape_Leng\&quot;: 0.0964245666516, \&quot;Shape_Area\&quot;: 0.000333975927329, \&quot;zone\&quot;: \&quot;Bronx Park\&quot;, \&quot;LocationID\&quot;: 31, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87094462199981, 40.85726608099992], [-73.86841539699994, 40.85778035799994], [-73.86990379599995, 40.85587302199991], [-73.86823466099995, 40.85091373699986], [-73.86889243299996, 40.848112321999906], [-73.87459175399982, 40.841520647999914], [-73.878171756, 40.84262443699987], [-73.8773292409999, 40.84398312499995], [-73.88311982600001, 40.848221091999925], [-73.88060896899991, 40.860357092999884], [-73.88394303099996, 40.86494818699985], [-73.87619224900003, 40.87047671099988], [-73.87094367500002, 40.87851076699998], [-73.86943471300005, 40.87812919899994], [-73.87094462199981, 40.85726608099992]]]}}, {\&quot;id\&quot;: \&quot;31\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 605, \&quot;OBJECTID\&quot;: 32, \&quot;Shape_Leng\&quot;: 0.05426721601, \&quot;Shape_Area\&quot;: 0.000150879171971, \&quot;zone\&quot;: \&quot;Bronxdale\&quot;, \&quot;LocationID\&quot;: 32, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85882515999995, 40.85806135699987], [-73.87104944999982, 40.857304836999965], [-73.87056192499989, 40.87151077799995], [-73.86137924099984, 40.8713365119999], [-73.86156274099987, 40.86554946399989], [-73.85961281199982, 40.865512717999856], [-73.85780378799993, 40.86303621699989], [-73.8566377469999, 40.8581191719999], [-73.85882515999995, 40.85806135699987]]]}}, {\&quot;id\&quot;: \&quot;32\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 174931, \&quot;OBJECTID\&quot;: 33, \&quot;Shape_Leng\&quot;: 0.0532702931967, \&quot;Shape_Area\&quot;: 0.000147416802448, \&quot;zone\&quot;: \&quot;Brooklyn Heights\&quot;, \&quot;LocationID\&quot;: 33, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99619227264343, 40.70337714093203], [-73.99087453800003, 40.70067311699993], [-73.99097187, 40.692548799999926], [-73.98902944799994, 40.69212386099992], [-73.99054474599986, 40.689168104999936], [-74.00110519399988, 40.692056594999954], [-74.0009586845849, 40.694069083791064], [-74.00301393814541, 40.69477784423956], [-74.00026872377784, 40.69496580257801], [-74.00043147340423, 40.69705246617853], [-73.99876458027717, 40.697120733093975], [-74.0010490305752, 40.697908236697415], [-73.9983776068576, 40.698063296146074], [-74.00001840433616, 40.699466048073575], [-73.99716054243916, 40.69979281264407], [-73.99813879899439, 40.701518788248414], [-73.99619227264343, 40.70337714093203]]]}}, {\&quot;id\&quot;: \&quot;33\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 5137, \&quot;OBJECTID\&quot;: 34, \&quot;Shape_Leng\&quot;: 0.0657059323545, \&quot;Shape_Area\&quot;: 0.000173946146651, \&quot;zone\&quot;: \&quot;Brooklyn Navy Yard\&quot;, \&quot;LocationID\&quot;: 34, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.97232032119902, 40.70908288315216], [-73.9702621853228, 40.706887504284005], [-73.97018075572805, 40.70492927056683], [-73.96751516691087, 40.703437356878126], [-73.96929693837701, 40.705088331229625], [-73.96838933699995, 40.70682918699989], [-73.96217978199998, 40.70022070999989], [-73.963971858, 40.69637865499991], [-73.98054419199988, 40.69824651199988], [-73.97885303360711, 40.7060655352846], [-73.97713562625376, 40.703005581402515], [-73.97596096344841, 40.704715506440465], [-73.9769274918834, 40.70279782040038], [-73.97455023388345, 40.70159034430477], [-73.97573541084542, 40.69957044770558], [-73.97411513926478, 40.70130527141927], [-73.97239201397464, 40.700166322752274], [-73.97318676670886, 40.70166980367368], [-73.97078200587988, 40.69997866301123], [-73.97283512788735, 40.70272874074404], [-73.96948655218084, 40.70051906125818], [-73.97283889974949, 40.70334642860182], [-73.96898517428966, 40.70174708878653], [-73.97465569608048, 40.70607426299424], [-73.97254880057814, 40.70620449000379], [-73.9742361696854, 40.70802438612241], [-73.97109655489108, 40.705850056558255], [-73.97232032119902, 40.70908288315216]]], [[[-73.97892920137538, 40.705931589879214], [-73.97893110285521, 40.70592490623034], [-73.97906084872884, 40.705946028470365], [-73.97905767006142, 40.705952889050316], [-73.97892920137538, 40.705931589879214]]], [[[-73.98237340600002, 40.70554334999991], [-73.98242287179853, 40.70582205595453], [-73.98102390618274, 40.705898913893535], [-73.98230205183869, 40.705736979399674], [-73.98237340600002, 40.70554334999991]]]]}}, {\&quot;id\&quot;: \&quot;34\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2243, \&quot;OBJECTID\&quot;: 35, \&quot;Shape_Leng\&quot;: 0.085787918592, \&quot;Shape_Area\&quot;: 0.000323825195932, \&quot;zone\&quot;: \&quot;Brownsville\&quot;, \&quot;LocationID\&quot;: 35, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90105329800004, 40.66212482099994], [-73.89880698499995, 40.65740666199988], [-73.90784346399994, 40.65459152999988], [-73.90855790499995, 40.65209593799989], [-73.91012255699995, 40.655851770999945], [-73.91236458899995, 40.65551356499985], [-73.9195947979998, 40.66199567899985], [-73.92008167099986, 40.659857632999866], [-73.92637970499992, 40.6655148919999], [-73.90347422300006, 40.67550668299985], [-73.90105329800004, 40.66212482099994]]]}}, {\&quot;id\&quot;: \&quot;35\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 43748, \&quot;OBJECTID\&quot;: 36, \&quot;Shape_Leng\&quot;: 0.0870507867063, \&quot;Shape_Area\&quot;: 0.000247666139269, \&quot;zone\&quot;: \&quot;Bushwick North\&quot;, \&quot;LocationID\&quot;: 36, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91254913799993, 40.70387341999989], [-73.912904041, 40.7023618909999], [-73.91067882699998, 40.701045968999914], [-73.91180820099989, 40.69993800299986], [-73.9042601839999, 40.69570037099989], [-73.90579597099993, 40.69412715499987], [-73.90123290699994, 40.69144227899997], [-73.904055772, 40.68854627799986], [-73.93115533899987, 40.70377233499987], [-73.93269784899994, 40.70317039099989], [-73.93391870799988, 40.70748702599992], [-73.92189184700005, 40.709396096999896], [-73.91254913799993, 40.70387341999989]]]}}, {\&quot;id\&quot;: \&quot;36\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 87183, \&quot;OBJECTID\&quot;: 37, \&quot;Shape_Leng\&quot;: 0.142810040466, \&quot;Shape_Area\&quot;: 0.000452062644782, \&quot;zone\&quot;: \&quot;Bushwick South\&quot;, \&quot;LocationID\&quot;: 37, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93312548700004, 40.70470086199992], [-73.93269784899994, 40.70317039099989], [-73.93115533899987, 40.70377233499987], [-73.90482499699988, 40.688808569999956], [-73.90180467199995, 40.6907662979999], [-73.90116154999988, 40.68787793499991], [-73.89646625099995, 40.68233642199988], [-73.89704472199993, 40.68056181599996], [-73.90047001100004, 40.679535243999936], [-73.90262262299991, 40.6806645029999], [-73.9040463979999, 40.67922059799985], [-73.93856854799981, 40.698848135999874], [-73.94394947299996, 40.698221278999924], [-73.94438788599984, 40.70042452299993], [-73.94042057899993, 40.701076597999865], [-73.94103009699987, 40.7046361769999], [-73.94273448399997, 40.70447330599988], [-73.94378799599994, 40.710900378999945], [-73.93480281900003, 40.713372495999884], [-73.93229708600003, 40.70774944699988], [-73.93391870799988, 40.70748702599992], [-73.93312548700004, 40.70470086199992]]]}}, {\&quot;id\&quot;: \&quot;37\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 747, \&quot;OBJECTID\&quot;: 38, \&quot;Shape_Leng\&quot;: 0.0832175685234, \&quot;Shape_Area\&quot;: 0.000327392684821, \&quot;zone\&quot;: \&quot;Cambria Heights\&quot;, \&quot;LocationID\&quot;: 38, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.73624941199995, 40.702536977999884], [-73.72677759516957, 40.7030592911994], [-73.72586264191175, 40.683241080973865], [-73.7475517539999, 40.68934733599984], [-73.7435928609999, 40.69621532499986], [-73.74618157999997, 40.696121925999904], [-73.74773012199991, 40.69955313699991], [-73.74500119100004, 40.70026221299988], [-73.74590871000004, 40.70228727399988], [-73.74109293999989, 40.7034810629999], [-73.73624941199995, 40.702536977999884]]]}}, {\&quot;id\&quot;: \&quot;38\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2174, \&quot;OBJECTID\&quot;: 39, \&quot;Shape_Leng\&quot;: 0.132369620757, \&quot;Shape_Area\&quot;: 0.00090028293862, \&quot;zone\&quot;: \&quot;Canarsie\&quot;, \&quot;LocationID\&quot;: 39, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.89121853499988, 40.64998769899987], [-73.88805587182881, 40.64511978725729], [-73.87714434884276, 40.63597649800373], [-73.88364451728226, 40.630943312138584], [-73.88263248433404, 40.62827427312689], [-73.88369231571497, 40.62755937391403], [-73.88752673706196, 40.628331824482444], [-73.89577374598754, 40.62251907138477], [-73.91860649599992, 40.632090414999894], [-73.91995062999999, 40.64470762999989], [-73.91830152299998, 40.645812262999925], [-73.90944846399994, 40.65152159899992], [-73.90398200599991, 40.64662856799988], [-73.89586154900002, 40.65188052699987], [-73.89761013299987, 40.65345381599992], [-73.89354677099988, 40.65520271399988], [-73.89000589199988, 40.651148696999925], [-73.89121853499988, 40.64998769899987]]], [[[-73.88833929256269, 40.64671022891759], [-73.88849720193863, 40.64675678600008], [-73.88853291212868, 40.646861882230674], [-73.88846787961647, 40.646899734025276], [-73.88833929256269, 40.64671022891759]]]]}}, {\&quot;id\&quot;: \&quot;39\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 101535, \&quot;OBJECTID\&quot;: 40, \&quot;Shape_Leng\&quot;: 0.0518506648762, \&quot;Shape_Area\&quot;: 0.000108949211644, \&quot;zone\&quot;: \&quot;Carroll Gardens\&quot;, \&quot;LocationID\&quot;: 40, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.998192111, 40.68228732999989], [-73.99620846299992, 40.681723424999916], [-73.99490113599977, 40.6844302379999], [-73.98722413899985, 40.68144730199988], [-73.99069861899994, 40.67580741899994], [-73.99506451099984, 40.67584047499984], [-73.9986188799999, 40.67183017199989], [-74.00329231299999, 40.67964328799992], [-74.00064737999996, 40.685253946999914], [-73.99908066099994, 40.68481599199985], [-74.00004865199998, 40.682803355999965], [-73.998192111, 40.68228732999989]]]}}, {\&quot;id\&quot;: \&quot;40\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 443934, \&quot;OBJECTID\&quot;: 41, \&quot;Shape_Leng\&quot;: 0.052793109453, \&quot;Shape_Area\&quot;: 0.000143093037737, \&quot;zone\&quot;: \&quot;Central Harlem\&quot;, \&quot;LocationID\&quot;: 41, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94773985499985, 40.809599720999884], [-73.94177140199992, 40.807088999999955], [-73.94523965199991, 40.80513601399989], [-73.94613131, 40.80387735799992], [-73.94459751299998, 40.803228144999906], [-73.94922045699984, 40.796909858999896], [-73.95964685399987, 40.80115642299993], [-73.954966572, 40.81006455499988], [-73.9535757779999, 40.8094766979999], [-73.95210125199992, 40.811442853999935], [-73.94773985499985, 40.809599720999884]]]}}, {\&quot;id\&quot;: \&quot;41\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 202779, \&quot;OBJECTID\&quot;: 42, \&quot;Shape_Leng\&quot;: 0.0927092274616, \&quot;Shape_Area\&quot;: 0.000263896952605, \&quot;zone\&quot;: \&quot;Central Harlem North\&quot;, \&quot;LocationID\&quot;: 42, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93436121591056, 40.83620061961779], [-73.93383089287109, 40.819521063761556], [-73.93901753299998, 40.81085655699991], [-73.93580780199986, 40.80949763799987], [-73.93854407899988, 40.80572965299991], [-73.95210125199992, 40.811442853999935], [-73.94607828700005, 40.821263215999906], [-73.93924885599988, 40.82829635099989], [-73.93864026699997, 40.82973887399988], [-73.9401708989999, 40.83038439099996], [-73.93868316299985, 40.832800788999904], [-73.93436121591056, 40.83620061961779]]]}}, {\&quot;id\&quot;: \&quot;42\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1882534, \&quot;OBJECTID\&quot;: 43, \&quot;Shape_Leng\&quot;: 0.0997386183576, \&quot;Shape_Area\&quot;: 0.000379662912054, \&quot;zone\&quot;: \&quot;Central Park\&quot;, \&quot;LocationID\&quot;: 43, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97255352299985, 40.76489773199991], [-73.98164804599995, 40.76843632199994], [-73.95817297099987, 40.800582540999876], [-73.94922045699984, 40.796909858999896], [-73.97255352299985, 40.76489773199991]]]}}, {\&quot;id\&quot;: \&quot;43\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 37, \&quot;OBJECTID\&quot;: 44, \&quot;Shape_Leng\&quot;: 0.235688967594, \&quot;Shape_Area\&quot;: 0.00194465649192, \&quot;zone\&quot;: \&quot;Charleston/Tottenville\&quot;, \&quot;LocationID\&quot;: 44, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.21220034099994, 40.556443429999874], [-74.21784397899994, 40.554432717999894], [-74.22131562699998, 40.55025307399992], [-74.21776941599994, 40.54112662999992], [-74.21800676499996, 40.53229858999995], [-74.21354593399995, 40.521235715999886], [-74.22379595899992, 40.518196345999876], [-74.22690993299994, 40.5191713979999], [-74.22159300278173, 40.50250043822093], [-74.23114494958575, 40.50185121588201], [-74.23988017293566, 40.49757362656005], [-74.24917156868965, 40.49656729705339], [-74.25335538022304, 40.50041319788582], [-74.25554269163935, 40.50783774249614], [-74.25056007272197, 40.516106741535], [-74.24921528676096, 40.51508486129925], [-74.24994158808036, 40.516137488190985], [-74.24854589291671, 40.51616991714839], [-74.24940770789283, 40.516980831423645], [-74.24851449056031, 40.517475626265046], [-74.24644039651318, 40.515965028508525], [-74.2456347316994, 40.518075580745766], [-74.23991937852388, 40.52004699652993], [-74.24293235036517, 40.52122716113276], [-74.24396500758859, 40.52490536633781], [-74.24150733322897, 40.531041342795135], [-74.24204570286014, 40.53434637705037], [-74.24533651176053, 40.53690599443462], [-74.24560205698324, 40.54094959457726], [-74.24803463735688, 40.54309324044144], [-74.24336346552776, 40.54786513523582], [-74.24039182810051, 40.547663310173775], [-74.23641623448965, 40.55050862684339], [-74.23641559733107, 40.55232806634515], [-74.23334188482498, 40.55249971061369], [-74.2287242997478, 40.5562970171392], [-74.22062175949124, 40.55589882100512], [-74.21974356930723, 40.55461267207239], [-74.21921716370927, 40.55579696987855], [-74.21859325782798, 40.55467421024778], [-74.21870767560165, 40.55604101620115], [-74.21775342391726, 40.55500528477618], [-74.2056960519999, 40.55851600599987], [-74.21220034099994, 40.556443429999874]]]}}, {\&quot;id\&quot;: \&quot;44\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 340354, \&quot;OBJECTID\&quot;: 45, \&quot;Shape_Leng\&quot;: 0.0459068626235, \&quot;Shape_Area\&quot;: 9.13594688556e-05, \&quot;zone\&quot;: \&quot;Chinatown\&quot;, \&quot;LocationID\&quot;: 45, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99750445299988, 40.71406913199995], [-73.99256242199989, 40.71438807699996], [-73.99190824271031, 40.70953292664334], [-73.99919451154429, 40.70794737667571], [-74.0058917509999, 40.71200715999989], [-73.99995620900002, 40.71801709499987], [-73.99605872699998, 40.7162316399999], [-73.99750445299988, 40.71406913199995]]]}}, {\&quot;id\&quot;: \&quot;45\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 120, \&quot;OBJECTID\&quot;: 46, \&quot;Shape_Leng\&quot;: 0.134475429879, \&quot;Shape_Area\&quot;: 0.000926391677672, \&quot;zone\&quot;: \&quot;City Island\&quot;, \&quot;LocationID\&quot;: 46, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.78452431937963, 40.86047706314786], [-73.78519664387113, 40.85882702363741], [-73.78743186194176, 40.858935245614425], [-73.78685886773299, 40.86004505783956], [-73.78452431937963, 40.86047706314786]]], [[[-73.76783205637173, 40.854442205742075], [-73.76938529139694, 40.85253613399675], [-73.76959674311465, 40.84759451909819], [-73.76789492672636, 40.84528943351961], [-73.76901389181107, 40.84509734272193], [-73.77157218833237, 40.8475000585803], [-73.7708892022117, 40.84975177133807], [-73.77296356611284, 40.8521592539586], [-73.77173060411904, 40.852476831319095], [-73.77296285334867, 40.853800062246464], [-73.77219223055407, 40.85998663859697], [-73.76947305423998, 40.85933013666858], [-73.76533243995276, 40.85504359512487], [-73.76783205637173, 40.854442205742075]]], [[[-73.79018745194999, 40.8586099173861], [-73.788043429758, 40.85755991768708], [-73.7884773265335, 40.8544005205322], [-73.78690734702697, 40.854063972299144], [-73.78796264288079, 40.8534747209355], [-73.78338158610377, 40.85158673391434], [-73.78420047134377, 40.8500606442406], [-73.78154449088599, 40.84940043464333], [-73.78267467078706, 40.84813967294664], [-73.78097820938946, 40.8484583479135], [-73.78263740397888, 40.848072649245836], [-73.78148431950568, 40.8478821938486], [-73.78216393435586, 40.84663633778076], [-73.780403269586, 40.846931134166056], [-73.7833653613534, 40.84444472298169], [-73.78348428748797, 40.84367854599843], [-73.78290650949755, 40.84393612584013], [-73.78052736048552, 40.84452514033816], [-73.7799270374445, 40.843883081355834], [-73.78347481249244, 40.843654738109784], [-73.78288778301486, 40.84249482884962], [-73.78022773872677, 40.84377818129771], [-73.78286499304913, 40.84247810188268], [-73.78059735822595, 40.84278659994098], [-73.78216624418964, 40.84168914411004], [-73.7804257718152, 40.842494394206874], [-73.78019599955293, 40.84204621097616], [-73.78185048197766, 40.841653946394324], [-73.7807975292347, 40.84125614604844], [-73.78282260139727, 40.836338155887844], [-73.78485009222643, 40.83747048917844], [-73.78563997845448, 40.83706443458537], [-73.78583067964128, 40.83720998000451], [-73.7857350929868, 40.83923423177581], [-73.78815921166512, 40.84049077856704], [-73.79179343625451, 40.846731672329284], [-73.78951371516173, 40.85130077171307], [-73.79311837183832, 40.851578295240834], [-73.79042053780161, 40.85302297821258], [-73.79281511966936, 40.852494819308916], [-73.79080758729923, 40.85319906006435], [-73.79287610048584, 40.8529441813284], [-73.79105721254825, 40.85391841242664], [-73.79245816844812, 40.85360070875487], [-73.79107002765942, 40.85394495666465], [-73.79253714604873, 40.85384932781285], [-73.79129282160633, 40.854584025976855], [-73.79201712228527, 40.85617694860626], [-73.79270523985137, 40.85619232890572], [-73.79268768222656, 40.856335218720375], [-73.79315700296156, 40.85635091107476], [-73.7931468608596, 40.856467828471146], [-73.79018745194999, 40.8586099173861]]], [[[-73.78283291447852, 40.85587030844573], [-73.78302371522504, 40.85509276666495], [-73.78394699722007, 40.85563043752662], [-73.78343487501385, 40.856362865958886], [-73.78283291447852, 40.85587030844573]]], [[[-73.78061730829718, 40.855735175810025], [-73.78090476851291, 40.8549681331623], [-73.7815638969994, 40.855001286433904], [-73.78122782332017, 40.856087789162764], [-73.78061730829718, 40.855735175810025]]], [[[-73.78833349834521, 40.834667129759346], [-73.78931223606624, 40.83446488655343], [-73.78951019872322, 40.835364042525754], [-73.78845700015209, 40.835309914315395], [-73.78833349834521, 40.834667129759346]]]]}}, {\&quot;id\&quot;: \&quot;46\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1623, \&quot;OBJECTID\&quot;: 47, \&quot;Shape_Leng\&quot;: 0.0898275563294, \&quot;Shape_Area\&quot;: 0.000163198117339, \&quot;zone\&quot;: \&quot;Claremont/Bathgate\&quot;, \&quot;LocationID\&quot;: 47, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89090203399996, 40.854116885999865], [-73.89431774099977, 40.851891310999854], [-73.89617712999998, 40.8466583209999], [-73.89290102299996, 40.84626832999992], [-73.89537836199995, 40.842938778999965], [-73.89666161699988, 40.84352460699992], [-73.90553116799988, 40.82910413299989], [-73.91049010699992, 40.830737372999884], [-73.90538357999992, 40.839768982999885], [-73.90483121999989, 40.84480034199987], [-73.901344046, 40.84442875099994], [-73.89106280699994, 40.8615294119999], [-73.89090203399996, 40.854116885999865]]]}}, {\&quot;id\&quot;: \&quot;47\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4595762, \&quot;OBJECTID\&quot;: 48, \&quot;Shape_Leng\&quot;: 0.0437467441431, \&quot;Shape_Area\&quot;: 9.42538425377e-05, \&quot;zone\&quot;: \&quot;Clinton East\&quot;, \&quot;LocationID\&quot;: 48, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99117738199989, 40.75532984899992], [-73.99730671499998, 40.757110506999894], [-73.98806289599996, 40.769790799999925], [-73.98236545099999, 40.7673921529999], [-73.99117738199989, 40.75532984899992]]]}}, {\&quot;id\&quot;: \&quot;48\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 81694, \&quot;OBJECTID\&quot;: 49, \&quot;Shape_Leng\&quot;: 0.0752900183427, \&quot;Shape_Area\&quot;: 0.000203185525471, \&quot;zone\&quot;: \&quot;Clinton Hill\&quot;, \&quot;LocationID\&quot;: 49, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96062056499981, 40.69632013999993], [-73.96015854699988, 40.69411730899989], [-73.95614239299985, 40.694579018999896], [-73.95541057999996, 40.69090829199994], [-73.96029281699998, 40.69034624999995], [-73.95956770199984, 40.686682554999955], [-73.95468418899998, 40.68724485399985], [-73.95328187399996, 40.68020003099985], [-73.95529361599996, 40.679203150999825], [-73.96868961400001, 40.68200525799988], [-73.97013154199992, 40.68950630799986], [-73.96910362499993, 40.68946752199986], [-73.9693945009999, 40.696080388999846], [-73.9645507049999, 40.696107591999855], [-73.96105100699992, 40.69832607899989], [-73.96062056499981, 40.69632013999993]]]}}, {\&quot;id\&quot;: \&quot;49\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1574829, \&quot;OBJECTID\&quot;: 50, \&quot;Shape_Leng\&quot;: 0.0557479867536, \&quot;Shape_Area\&quot;: 0.000173249283326, \&quot;zone\&quot;: \&quot;Clinton West\&quot;, \&quot;LocationID\&quot;: 50, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99667705784736, 40.77351005394221], [-73.98806289599996, 40.769790799999925], [-73.99547450199992, 40.759626856999894], [-74.00375735018837, 40.763582241820224], [-74.0009730802201, 40.763420271725614], [-74.00311291631381, 40.76474559615368], [-73.99915098087908, 40.76420525958265], [-74.0020245433034, 40.76589326657037], [-73.99857638530527, 40.76499860727083], [-74.00157335385273, 40.766977192210646], [-73.9980667590535, 40.76587188113572], [-73.99737808447954, 40.76682338637958], [-74.00064950530414, 40.76824523610559], [-73.99715588949206, 40.76712869617278], [-73.9964571540504, 40.76809881579563], [-73.99973590247859, 40.76950617733152], [-73.99707176039315, 40.768732643576804], [-73.9987620691431, 40.7708250567092], [-73.99631327022087, 40.76979883633644], [-73.99493501658995, 40.77146814657798], [-73.99667705784736, 40.77351005394221]]]}}, {\&quot;id\&quot;: \&quot;50\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 749, \&quot;OBJECTID\&quot;: 51, \&quot;Shape_Leng\&quot;: 0.0953613442277, \&quot;Shape_Area\&quot;: 0.000395756553505, \&quot;zone\&quot;: \&quot;Co-Op City\&quot;, \&quot;LocationID\&quot;: 51, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82091617199997, 40.86891693399989], [-73.81578764099999, 40.8657580609999], [-73.82037552999996, 40.86103300499993], [-73.82699653199998, 40.85908778599986], [-73.83315960399985, 40.86831975599994], [-73.83565766499987, 40.86751275599992], [-73.83829221499984, 40.87295133899995], [-73.83924788999988, 40.876618737999905], [-73.8381484219999, 40.876953298999915], [-73.84324113799987, 40.879108912999904], [-73.82387140599998, 40.88778362799996], [-73.82077408699998, 40.886710602999884], [-73.81992586499996, 40.88211933299987], [-73.82329599399986, 40.87309741799988], [-73.82091617199997, 40.86891693399989]]]}}, {\&quot;id\&quot;: \&quot;51\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 95260, \&quot;OBJECTID\&quot;: 52, \&quot;Shape_Leng\&quot;: 0.0289076710093, \&quot;Shape_Area\&quot;: 4.52027509603e-05, \&quot;zone\&quot;: \&quot;Cobble Hill\&quot;, \&quot;LocationID\&quot;: 52, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99588110299992, 40.68239495399995], [-74.00004865199998, 40.682803355999965], [-73.99908066099994, 40.68481599199985], [-74.00064737999996, 40.685253946999914], [-73.99776924399993, 40.691194697999954], [-73.99236366999985, 40.689690123999924], [-73.99588110299992, 40.68239495399995]]]}}, {\&quot;id\&quot;: \&quot;52\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 997, \&quot;OBJECTID\&quot;: 53, \&quot;Shape_Leng\&quot;: 0.161500913385, \&quot;Shape_Area\&quot;: 0.000947530980821, \&quot;zone\&quot;: \&quot;College Point\&quot;, \&quot;LocationID\&quot;: 53, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.83839013354552, 40.798304872075995], [-73.83919004727183, 40.7977772664477], [-73.84025860809128, 40.79758885843212], [-73.83840083088981, 40.79675525865344], [-73.83663288911686, 40.79251637576927], [-73.84067828300006, 40.79390789199993], [-73.84081532599994, 40.7915048849999], [-73.83895676099984, 40.79143843099996], [-73.84008157499997, 40.78785153099992], [-73.83824429099994, 40.78778591599995], [-73.83869921299997, 40.781676956999874], [-73.82513740299993, 40.78169970599994], [-73.83000011099983, 40.77373240699996], [-73.83913189281712, 40.765991105784146], [-73.83975387982034, 40.767120445440874], [-73.84491332846012, 40.76552838817853], [-73.84780575104425, 40.76677294817163], [-73.84977407793218, 40.769936012942956], [-73.8486715286884, 40.770761572902536], [-73.85130108374476, 40.77180636079771], [-73.84897619867189, 40.77356166795698], [-73.84895559325399, 40.77796167373135], [-73.84963631633588, 40.77948192035157], [-73.85094705724252, 40.77906915543026], [-73.85148755480326, 40.77899297861757], [-73.84981720066014, 40.77963034805418], [-73.85232086242219, 40.77916928470371], [-73.85238832778414, 40.7795289023869], [-73.84982102259761, 40.779651339303875], [-73.84955315550077, 40.779990415384006], [-73.85169028085423, 40.779867508478176], [-73.85167099162219, 40.780035228878106], [-73.84949381208321, 40.780065828114246], [-73.85093646396534, 40.781119575156005], [-73.8492525818285, 40.782264775014035], [-73.85528242786589, 40.78197538434999], [-73.8595236950597, 40.785561954252664], [-73.85284230133867, 40.78821137173992], [-73.85480194733185, 40.788619154725914], [-73.85265830693045, 40.79110642061034], [-73.85377854910695, 40.79242127400702], [-73.8526309825624, 40.79494485424474], [-73.84906160835088, 40.79336261029852], [-73.84855988738983, 40.79549506021838], [-73.84354668938991, 40.79491394401049], [-73.84225959368331, 40.79558496893736], [-73.8428667525936, 40.79692222907191], [-73.84158721174394, 40.795401069221235], [-73.84041517975831, 40.7976784372587], [-73.83839013354552, 40.798304872075995]]], [[[-73.8678840747076, 40.78736103669457], [-73.86813032000018, 40.78723277784419], [-73.8692349173292, 40.78596991495815], [-73.8680991225789, 40.78745866181839], [-73.8678840747076, 40.78736103669457]]]]}}, {\&quot;id\&quot;: \&quot;53\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 10701, \&quot;OBJECTID\&quot;: 54, \&quot;Shape_Leng\&quot;: 0.0762192448554, \&quot;Shape_Area\&quot;: 0.000132452130536, \&quot;zone\&quot;: \&quot;Columbia Street\&quot;, \&quot;LocationID\&quot;: 54, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.00174362072502, 40.69240674985266], [-74.00400795971088, 40.693208199632345], [-74.00127014951309, 40.69329606183691], [-74.00174362072502, 40.69240674985266]]], [[[-74.00174362072502, 40.69240674985266], [-73.99776924399993, 40.691194697999954], [-74.00329231299999, 40.67964328799992], [-74.00596041099988, 40.683362870999936], [-74.00485241699997, 40.68566813099993], [-74.00783293766679, 40.68738505516274], [-74.00459270521766, 40.688215222986614], [-74.00636461225261, 40.68966966863697], [-74.00382038919723, 40.688929644699236], [-74.0053420962491, 40.6910916029778], [-74.0009615685494, 40.69012876835003], [-74.00479415294552, 40.69176162037443], [-74.00174362072502, 40.69240674985266]]], [[[-74.01092841300002, 40.684491472999824], [-74.01217596614636, 40.68409518562848], [-74.00816320571415, 40.68617364485845], [-74.0086007239999, 40.68590956499989], [-74.01092841300002, 40.684491472999824]]]]}}, {\&quot;id\&quot;: \&quot;54\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 994, \&quot;OBJECTID\&quot;: 55, \&quot;Shape_Leng\&quot;: 0.149956807524, \&quot;Shape_Area\&quot;: 0.000736274713586, \&quot;zone\&quot;: \&quot;Coney Island\&quot;, \&quot;LocationID\&quot;: 55, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98671582299981, 40.58456849999991], [-73.97742525299988, 40.58290659299994], [-73.96661531499983, 40.58457103699992], [-73.9688899589999, 40.57526123899986], [-73.95941778299985, 40.57517798299994], [-73.95939182223685, 40.57391210937612], [-73.98367270153267, 40.57140705768737], [-73.98336058039273, 40.56952999448666], [-73.98375790448641, 40.571396227250865], [-74.00208547639728, 40.569585983985014], [-74.00303186164808, 40.57218559475904], [-74.01115668729254, 40.57416676185885], [-74.01302222952468, 40.577804459633505], [-74.0111737229432, 40.58028397882522], [-74.00604734235807, 40.58198365303581], [-73.98814208290418, 40.57886596371379], [-73.98604509916208, 40.58172068515157], [-73.98800973376738, 40.579670687155776], [-73.98995504960881, 40.58066166976562], [-73.98671582299981, 40.58456849999991]]]}}, {\&quot;id\&quot;: \&quot;55\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 5740, \&quot;OBJECTID\&quot;: 56, \&quot;Shape_Leng\&quot;: 0.0568478126677, \&quot;Shape_Area\&quot;: 0.000180907844436, \&quot;zone\&quot;: \&quot;Corona\&quot;, \&quot;LocationID\&quot;: 56, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85360568399982, 40.74749682799991], [-73.85011556599989, 40.74072356299995], [-73.84750820299992, 40.73900780699995], [-73.86462193299997, 40.73428275699993], [-73.86790963899986, 40.74493371599989], [-73.85442575299999, 40.748851725999884], [-73.85360568399982, 40.74749682799991]]]}}, {\&quot;id\&quot;: \&quot;56\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 5740, \&quot;OBJECTID\&quot;: 57, \&quot;Shape_Leng\&quot;: 0.0192705048557, \&quot;Shape_Area\&quot;: 1.80259807917e-05, \&quot;zone\&quot;: \&quot;Corona\&quot;, \&quot;LocationID\&quot;: 56, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8513110499998, 40.74984337599988], [-73.85442575299999, 40.748851725999884], [-73.85579909099987, 40.75440952799994], [-73.85312635499996, 40.75510934299989], [-73.8513110499998, 40.74984337599988]]]}}, {\&quot;id\&quot;: \&quot;57\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 85, \&quot;OBJECTID\&quot;: 58, \&quot;Shape_Leng\&quot;: 0.0598554094851, \&quot;Shape_Area\&quot;: 0.000204980931361, \&quot;zone\&quot;: \&quot;Country Club\&quot;, \&quot;LocationID\&quot;: 58, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.81561382067721, 40.84818955758243], [-73.81602685114903, 40.846400458770034], [-73.81464594697542, 40.84721961352901], [-73.81570353189448, 40.84629134042384], [-73.81368634738199, 40.84727432550905], [-73.81356372861671, 40.847151411278524], [-73.8150262760428, 40.845499995058404], [-73.81284939958525, 40.84631879949822], [-73.81324326350918, 40.84523590835256], [-73.81310050626846, 40.84517241453328], [-73.8128770359758, 40.8451346679459], [-73.81315597044244, 40.84521210037631], [-73.81285536957633, 40.845186285461466], [-73.81241445328128, 40.846559380748744], [-73.81227790900483, 40.846543458279285], [-73.8128577433794, 40.845129544589135], [-73.81254457815619, 40.84497959800826], [-73.81169971823665, 40.84668170081364], [-73.81266141349049, 40.84420764950083], [-73.81254909120709, 40.84495227514607], [-73.8136558066588, 40.8450591224657], [-73.81414462049185, 40.84481817326274], [-73.81437458252545, 40.8430889259994], [-73.81569792948075, 40.8443864281129], [-73.81823722746202, 40.844355041712625], [-73.81473345817534, 40.8413757283108], [-73.81606068217324, 40.83603019622843], [-73.82601252600003, 40.83402077799985], [-73.82624132999996, 40.84299359399991], [-73.82517999, 40.842700058999874], [-73.82495697699986, 40.846105444999864], [-73.82048405599983, 40.84850102599995], [-73.81507165904237, 40.84913361979451], [-73.81561382067721, 40.84818955758243]]]}}, {\&quot;id\&quot;: \&quot;58\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 76, \&quot;OBJECTID\&quot;: 59, \&quot;Shape_Leng\&quot;: 0.0377948070893, \&quot;Shape_Area\&quot;: 6.28765230648e-05, \&quot;zone\&quot;: \&quot;Crotona Park\&quot;, \&quot;LocationID\&quot;: 59, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88941724899998, 40.839422732999836], [-73.88659802299989, 40.839279049999895], [-73.89697220299995, 40.8343452539999], [-73.9012157839999, 40.8354101409999], [-73.89666161699988, 40.84352460699992], [-73.88941724899998, 40.839422732999836]]]}}, {\&quot;id\&quot;: \&quot;59\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1062, \&quot;OBJECTID\&quot;: 60, \&quot;Shape_Leng\&quot;: 0.0786482878226, \&quot;Shape_Area\&quot;: 0.000161833284912, \&quot;zone\&quot;: \&quot;Crotona Park East\&quot;, \&quot;LocationID\&quot;: 60, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87823856799989, 40.839985917999854], [-73.87277204699981, 40.83975128199995], [-73.87379590199993, 40.837445132999896], [-73.88005188499987, 40.83470205899989], [-73.88390094800003, 40.82980281599986], [-73.8843985489999, 40.822965575999866], [-73.88753429599987, 40.82250933899995], [-73.88601262699991, 40.828238530999926], [-73.88761307899992, 40.8293374189999], [-73.89717220999982, 40.830368832999966], [-73.89697220299995, 40.8343452539999], [-73.89408527499982, 40.8362973469999], [-73.88730373200002, 40.83812719099994], [-73.88618432099992, 40.840105043999884], [-73.88200384100001, 40.837443781999895], [-73.880061996, 40.840162234999845], [-73.87823856799989, 40.839985917999854]]]}}, {\&quot;id\&quot;: \&quot;60\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 57441, \&quot;OBJECTID\&quot;: 61, \&quot;Shape_Leng\&quot;: 0.117310808097, \&quot;Shape_Area\&quot;: 0.000510772092295, \&quot;zone\&quot;: \&quot;Crown Heights North\&quot;, \&quot;LocationID\&quot;: 61, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92916130699993, 40.68343632399992], [-73.92281374299995, 40.68341442999991], [-73.92164666399992, 40.67886992299994], [-73.92275257199998, 40.667097332999894], [-73.92872204599985, 40.66449556899988], [-73.93698362399992, 40.665535507999955], [-73.93674946999998, 40.66812737099991], [-73.96131877999991, 40.67140667599988], [-73.96007428300001, 40.67487807099994], [-73.96318238899983, 40.675529503999876], [-73.96134655899995, 40.6804635239999], [-73.95529361599996, 40.679203150999825], [-73.9533701749999, 40.680640507999904], [-73.93435066499993, 40.67956340799991], [-73.93500821699992, 40.68276376799985], [-73.92916130699993, 40.68343632399992]]]}}, {\&quot;id\&quot;: \&quot;61\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 10543, \&quot;OBJECTID\&quot;: 62, \&quot;Shape_Leng\&quot;: 0.0822593359838, \&quot;Shape_Area\&quot;: 0.000158238169004, \&quot;zone\&quot;: \&quot;Crown Heights South\&quot;, \&quot;LocationID\&quot;: 62, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92916752199997, 40.664299531999895], [-73.94282892199992, 40.6628474859999], [-73.94269628999989, 40.664055128999934], [-73.94546293699983, 40.66422610399989], [-73.96095595499996, 40.66328505499992], [-73.96258784899996, 40.671711596999884], [-73.93674946999998, 40.66812737099991], [-73.93698362399992, 40.665535507999955], [-73.92916752199997, 40.664299531999895]]]}}, {\&quot;id\&quot;: \&quot;62\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1432, \&quot;OBJECTID\&quot;: 63, \&quot;Shape_Leng\&quot;: 0.119100721883, \&quot;Shape_Area\&quot;: 0.000353190910142, \&quot;zone\&quot;: \&quot;Cypress Hills\&quot;, \&quot;LocationID\&quot;: 63, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86650407899994, 40.684474051999885], [-73.86602666799992, 40.681918051999936], [-73.86410096700003, 40.68237284999988], [-73.86234580499983, 40.67916478599994], [-73.86106294999989, 40.67434293499984], [-73.87231018000001, 40.67775574699987], [-73.87531627599998, 40.68011098399988], [-73.88061377799994, 40.679110031999876], [-73.88116730300005, 40.68135366299988], [-73.9000462609999, 40.676893089999936], [-73.9040463979999, 40.67922059799985], [-73.90262262299991, 40.6806645029999], [-73.89786299899986, 40.67987501099987], [-73.89417463299992, 40.6852832479999], [-73.89252316799995, 40.683424532999865], [-73.88962787599998, 40.684236453999894], [-73.87402053199992, 40.69419129499995], [-73.86891704399994, 40.69515042299987], [-73.86650407899994, 40.684474051999885]]]}}, {\&quot;id\&quot;: \&quot;65\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 66839, \&quot;OBJECTID\&quot;: 66, \&quot;Shape_Leng\&quot;: 0.0546334593634, \&quot;Shape_Area\&quot;: 0.000108378855948, \&quot;zone\&quot;: \&quot;DUMBO/Vinegar Hill\&quot;, \&quot;LocationID\&quot;: 66, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97906084869959, 40.7059460290057], [-73.98050926199988, 40.69744627499991], [-73.98696892299995, 40.698503613999954], [-73.98679382799996, 40.700633222999954], [-73.99093201799984, 40.7007662159999], [-73.99544564312069, 40.70327530547179], [-73.99350881403605, 40.70462350527397], [-73.97906084869959, 40.7059460290057]]]}}, {\&quot;id\&quot;: \&quot;63\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 385, \&quot;OBJECTID\&quot;: 64, \&quot;Shape_Leng\&quot;: 0.18445188474, \&quot;Shape_Area\&quot;: 0.00105790284614, \&quot;zone\&quot;: \&quot;Douglaston\&quot;, \&quot;LocationID\&quot;: 64, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.74412314584049, 40.77863865777706], [-73.71351828186042, 40.75983773091619], [-73.72031595299998, 40.75789725799992], [-73.72771356199995, 40.750626894999904], [-73.7310646189999, 40.744888375999885], [-73.74016951799993, 40.73848189799986], [-73.74306820799991, 40.7384408179999], [-73.74396193599988, 40.740789125999925], [-73.75098230100001, 40.740021462999884], [-73.75347299999999, 40.74240484399992], [-73.74477587099986, 40.74328109699994], [-73.74625984399985, 40.74671147499993], [-73.74384322099985, 40.74769009599988], [-73.75004764499985, 40.75840465799996], [-73.75230259399993, 40.759455198999916], [-73.75583713299987, 40.757742061999934], [-73.75921689799992, 40.76432485599988], [-73.75377036482259, 40.76530463174143], [-73.7510743225255, 40.76176367133622], [-73.74455864030779, 40.756557885832535], [-73.75507210849031, 40.76753310678742], [-73.7555733264932, 40.77152912592269], [-73.75336691999294, 40.77320784776336], [-73.75551737581792, 40.77770404836418], [-73.75080593606877, 40.782893378833954], [-73.74412314584049, 40.77863865777706]]]}}, {\&quot;id\&quot;: \&quot;64\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 202755, \&quot;OBJECTID\&quot;: 65, \&quot;Shape_Leng\&quot;: 0.0446070683658, \&quot;Shape_Area\&quot;: 8.1803882541e-05, \&quot;zone\&quot;: \&quot;Downtown Brooklyn/MetroTech\&quot;, \&quot;LocationID\&quot;: 65, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98712491499988, 40.70063447999997], [-73.98696892299995, 40.698503613999954], [-73.98050926199988, 40.69744627499991], [-73.97916718399999, 40.69348832299992], [-73.98251122999989, 40.69361433399992], [-73.98147568199991, 40.689930943999876], [-73.99097186899995, 40.69254879999995], [-73.99093201799984, 40.7007662159999], [-73.98712491499988, 40.70063447999997]]]}}, {\&quot;id\&quot;: \&quot;66\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1356, \&quot;OBJECTID\&quot;: 67, \&quot;Shape_Leng\&quot;: 0.0997470781551, \&quot;Shape_Area\&quot;: 0.000394282272487, \&quot;zone\&quot;: \&quot;Dyker Heights\&quot;, \&quot;LocationID\&quot;: 67, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0109702639999, 40.63068186899988], [-74.00702302499997, 40.63210999499996], [-73.99724067099987, 40.62528868699994], [-73.99771358999998, 40.62368026999996], [-73.99932090299998, 40.62465524699996], [-74.01701910199995, 40.60765441699994], [-74.01549854999998, 40.606841523999925], [-74.0186913569999, 40.60360792399995], [-74.02129949199998, 40.60442832299987], [-74.02078540899996, 40.60567368599989], [-74.02247769499994, 40.60667421599987], [-74.02150602899994, 40.60782209899992], [-74.02710660599995, 40.61024395599991], [-74.02637609099996, 40.61245060299993], [-74.02754297299998, 40.61293718299988], [-74.01970491599991, 40.6221849649999], [-74.01514630699995, 40.63322193799993], [-74.0109702639999, 40.63068186899988]]]}}, {\&quot;id\&quot;: \&quot;67\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3718064, \&quot;OBJECTID\&quot;: 68, \&quot;Shape_Leng\&quot;: 0.0493373795569, \&quot;Shape_Area\&quot;: 0.000111073378655, \&quot;zone\&quot;: \&quot;East Chelsea\&quot;, \&quot;LocationID\&quot;: 68, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00201937799989, 40.74044408899989], [-74.00820401899988, 40.74214751799986], [-73.99730671499998, 40.757110506999894], [-73.99163271299996, 40.75470680499996], [-74.00201937799989, 40.74044408899989]]]}}, {\&quot;id\&quot;: \&quot;68\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 6247, \&quot;OBJECTID\&quot;: 69, \&quot;Shape_Leng\&quot;: 0.0789896450483, \&quot;Shape_Area\&quot;: 0.00019905160381, \&quot;zone\&quot;: \&quot;East Concourse/Concourse Village\&quot;, \&quot;LocationID\&quot;: 69, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91179361999997, 40.8264281559999], [-73.91130974499993, 40.824848557999886], [-73.91541108199998, 40.82577390899993], [-73.92518486499998, 40.818012668999884], [-73.92731653099999, 40.81855963399991], [-73.91193751499992, 40.843202387999916], [-73.90514893999989, 40.84254719499995], [-73.91049010699992, 40.830737372999884], [-73.908959903, 40.83022623299989], [-73.91179361999997, 40.8264281559999]]]}}, {\&quot;id\&quot;: \&quot;69\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 23915, \&quot;OBJECTID\&quot;: 70, \&quot;Shape_Leng\&quot;: 0.0638403183367, \&quot;Shape_Area\&quot;: 0.000195458476728, \&quot;zone\&quot;: \&quot;East Elmhurst\&quot;, \&quot;LocationID\&quot;: 70, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85912375899987, 40.76127549899994], [-73.85449593299987, 40.75827863899985], [-73.87513874300004, 40.756633815999905], [-73.87608949699984, 40.77153690299987], [-73.868098735, 40.77017200899994], [-73.85912375899987, 40.76127549899994]]]}}, {\&quot;id\&quot;: \&quot;70\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2060, \&quot;OBJECTID\&quot;: 71, \&quot;Shape_Leng\&quot;: 0.0931694551828, \&quot;Shape_Area\&quot;: 0.000382572587364, \&quot;zone\&quot;: \&quot;East Flatbush/Farragut\&quot;, \&quot;LocationID\&quot;: 71, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93177153199984, 40.65527364199989], [-73.92910623099985, 40.63979510599992], [-73.92574389399985, 40.64001446599985], [-73.92652490899994, 40.63649272299989], [-73.92744822299987, 40.635258409999864], [-73.9372670019998, 40.634650624999885], [-73.93701746200003, 40.63231097899989], [-73.94462885499995, 40.63183773499993], [-73.94537272499998, 40.638786954999865], [-73.94826499699982, 40.63860718999994], [-73.94841343400003, 40.639987463999944], [-73.94778994699976, 40.643305735999924], [-73.94586879199989, 40.64342374399988], [-73.94715896299984, 40.65559378699993], [-73.931907438, 40.656537652999916], [-73.93177153199984, 40.65527364199989]]]}}, {\&quot;id\&quot;: \&quot;71\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2326, \&quot;OBJECTID\&quot;: 72, \&quot;Shape_Leng\&quot;: 0.0952020695166, \&quot;Shape_Area\&quot;: 0.000323532461947, \&quot;zone\&quot;: \&quot;East Flatbush/Remsen Village\&quot;, \&quot;LocationID\&quot;: 72, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92021313099984, 40.65997544099987], [-73.9195947979998, 40.66199567899985], [-73.91236458899995, 40.65551356499985], [-73.91012255699995, 40.655851770999945], [-73.90855790499995, 40.65209593799989], [-73.91995062999999, 40.64470762999989], [-73.91973736999988, 40.64277814799987], [-73.92332654599986, 40.63990021599991], [-73.92356525899983, 40.642499297999905], [-73.92538233099987, 40.64238453199987], [-73.92574389499987, 40.64001446599983], [-73.92910623199991, 40.6397951059999], [-73.93190743899989, 40.656537652999944], [-73.92799465199988, 40.65680210099988], [-73.92834017599988, 40.660060035999884], [-73.92646424299983, 40.659814361999956], [-73.93068465499985, 40.66362047699992], [-73.92637970499992, 40.6655148919999], [-73.92021313099984, 40.65997544099987]]]}}, {\&quot;id\&quot;: \&quot;72\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 446, \&quot;OBJECTID\&quot;: 73, \&quot;Shape_Leng\&quot;: 0.0853020209129, \&quot;Shape_Area\&quot;: 0.000291799754395, \&quot;zone\&quot;: \&quot;East Flushing\&quot;, \&quot;LocationID\&quot;: 73, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79566545000003, 40.75023619999991], [-73.79729524799988, 40.74943505299992], [-73.7946756879998, 40.74721192799994], [-73.8033521419999, 40.74643196499987], [-73.80287666499987, 40.749765148999856], [-73.80750599299991, 40.750136586999936], [-73.81416172099998, 40.74613857999986], [-73.820849288, 40.75224154499988], [-73.8184078289999, 40.75383042199998], [-73.82030067699999, 40.75551497999992], [-73.81789245699991, 40.75708633799991], [-73.82063593299985, 40.75887226799989], [-73.81104963199985, 40.761417020999964], [-73.79940088899988, 40.759397218999936], [-73.79493246199993, 40.75779802999994], [-73.79566545000003, 40.75023619999991]]]}}, {\&quot;id\&quot;: \&quot;73\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 465525, \&quot;OBJECTID\&quot;: 74, \&quot;Shape_Leng\&quot;: 0.11029093625, \&quot;Shape_Area\&quot;: 0.000295038418204, \&quot;zone\&quot;: \&quot;East Harlem North\&quot;, \&quot;LocationID\&quot;: 74, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.93380589881859, 40.81651249324708], [-73.93412073484292, 40.80865645197743], [-73.92903490240305, 40.80108090385195], [-73.9290364017962, 40.79676259410132], [-73.93505300002766, 40.79168720295447], [-73.93773612099982, 40.792815803999936], [-73.93864883299987, 40.79155775499987], [-73.94327251199996, 40.79348810299993], [-73.94187604699994, 40.79540586899984], [-73.94831125500004, 40.79812921799992], [-73.94459751299998, 40.803228144999906], [-73.94613131, 40.80387735799992], [-73.94430194599991, 40.806390824999916], [-73.93854407899988, 40.80572965299991], [-73.93580780199986, 40.80949763799987], [-73.93901753299998, 40.81085655699991], [-73.93407463999996, 40.81782651399992], [-73.93440039999986, 40.81966778299989], [-73.93380589881859, 40.81651249324708]]], [[[-73.92688606022001, 40.800840648368855], [-73.92650954883642, 40.80065703126224], [-73.92704640297914, 40.800651743031324], [-73.92688606022001, 40.800840648368855]]], [[[-73.92666565490181, 40.80018271401784], [-73.92669572614771, 40.80014697707624], [-73.9272477078927, 40.800392957368906], [-73.92711464230626, 40.80056375622957], [-73.92666565490181, 40.80018271401784]]], [[[-73.92672091168967, 40.800414210943586], [-73.92653846445016, 40.80033389815394], [-73.92674263892977, 40.800403498972756], [-73.92672091168967, 40.800414210943586]]], [[[-73.92718514789182, 40.797349896890104], [-73.92767122620857, 40.79721701426623], [-73.92770694127064, 40.7972986638821], [-73.92738263624496, 40.797377063580456], [-73.92718514789182, 40.797349896890104]]]]}}, {\&quot;id\&quot;: \&quot;74\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 864875, \&quot;OBJECTID\&quot;: 75, \&quot;Shape_Leng\&quot;: 0.0876638997685, \&quot;Shape_Area\&quot;: 0.00024056392715, \&quot;zone\&quot;: \&quot;East Harlem South\&quot;, \&quot;LocationID\&quot;: 75, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94103496899987, 40.79254666899993], [-73.93505300002766, 40.79168720295447], [-73.93708104382307, 40.78936639571], [-73.93621859869943, 40.78880049757431], [-73.94354420706223, 40.78288052416259], [-73.9557773589999, 40.78791392399995], [-73.94831125500004, 40.79812921799992], [-73.94187604699994, 40.79540586899984], [-73.94327251199996, 40.79348810299993], [-73.94103496899987, 40.79254666899993]]]}}, {\&quot;id\&quot;: \&quot;75\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4552, \&quot;OBJECTID\&quot;: 76, \&quot;Shape_Leng\&quot;: 0.241203016269, \&quot;Shape_Area\&quot;: 0.00126660143241, \&quot;zone\&quot;: \&quot;East New York\&quot;, \&quot;LocationID\&quot;: 76, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88063900599983, 40.679176984999856], [-73.87507136399991, 40.68003514599991], [-73.87231018000001, 40.67775574699987], [-73.86106294999989, 40.67434293499984], [-73.86038937900003, 40.67126877499985], [-73.85763323199998, 40.67165619399985], [-73.85568461199988, 40.66386749199993], [-73.85842950899992, 40.66345335999987], [-73.85761052799985, 40.660108355999924], [-73.86317083299996, 40.65827651199994], [-73.86327623068586, 40.656941215328104], [-73.85695870295893, 40.65058737348713], [-73.85840315341014, 40.64700390123735], [-73.85716978298207, 40.64367855888597], [-73.86289463224384, 40.64255067968245], [-73.86670411973783, 40.6400217634955], [-73.86563247391335, 40.63878676362291], [-73.86867282895084, 40.640925079203356], [-73.87061492461066, 40.64485674188673], [-73.87971979034293, 40.65437592977636], [-73.86989583386247, 40.63893452891954], [-73.86799709668125, 40.63811526520958], [-73.86960972136559, 40.63708553460871], [-73.87347939154502, 40.63628554579879], [-73.87841589406925, 40.638912189353306], [-73.8745808109999, 40.64561010599992], [-73.88221364899994, 40.65451863799996], [-73.89000589199988, 40.651148696999925], [-73.89354677099988, 40.65520271399988], [-73.89761013299987, 40.65345381599992], [-73.89586154900002, 40.65188052699987], [-73.90398200599991, 40.64662856799988], [-73.90944846399994, 40.65152159899992], [-73.90740035699999, 40.6528439899999], [-73.90784346399994, 40.65459152999988], [-73.89612587299993, 40.657814663999936], [-73.88185557299985, 40.66414998799994], [-73.88330883399975, 40.66611200499991], [-73.889906696, 40.66377828999986], [-73.89087805100002, 40.671318086999875], [-73.89271090700004, 40.67104582799992], [-73.89367036399987, 40.67482177099988], [-73.89930675399987, 40.67398204199991], [-73.90004626199993, 40.67689308999995], [-73.88116730300005, 40.68135366299988], [-73.88063900599983, 40.679176984999856]]]}}, {\&quot;id\&quot;: \&quot;76\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1309, \&quot;OBJECTID\&quot;: 77, \&quot;Shape_Leng\&quot;: 0.075461081444, \&quot;Shape_Area\&quot;: 0.000191917981315, \&quot;zone\&quot;: \&quot;East New York/Pennsylvania Avenue\&quot;, \&quot;LocationID\&quot;: 77, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8997089949999, 40.67549425099991], [-73.89930675399987, 40.67398204199991], [-73.89367036399987, 40.67482177099988], [-73.89271090699994, 40.671045828999915], [-73.89087805100002, 40.671318086999875], [-73.889906696, 40.66377828999986], [-73.88330883399975, 40.66611200499991], [-73.88185557299985, 40.66414998799994], [-73.89880698499995, 40.65740666199988], [-73.90066118699986, 40.66058615799992], [-73.90347422300006, 40.67550668299985], [-73.90004626199993, 40.67689308999995], [-73.8997089949999, 40.67549425099991]]]}}, {\&quot;id\&quot;: \&quot;77\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1378, \&quot;OBJECTID\&quot;: 78, \&quot;Shape_Leng\&quot;: 0.0935944495806, \&quot;Shape_Area\&quot;: 0.000191114419551, \&quot;zone\&quot;: \&quot;East Tremont\&quot;, \&quot;LocationID\&quot;: 78, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88963328299991, 40.85317381799993], [-73.88987871399985, 40.85207022099993], [-73.8773292409999, 40.84398312499995], [-73.878171756, 40.84262443699987], [-73.87459175399982, 40.841520647999914], [-73.87109207899995, 40.84432478099992], [-73.86920944599997, 40.84923837199993], [-73.86785992999985, 40.84886493099987], [-73.86804200399997, 40.8448138389999], [-73.87359713599987, 40.83979855499992], [-73.880061996, 40.840162234999845], [-73.88200384100001, 40.837443781999895], [-73.88618432099993, 40.8401050449999], [-73.88941724899988, 40.83942273399985], [-73.89537836099996, 40.842938778999944], [-73.89290102299996, 40.84626832999992], [-73.89617712999998, 40.8466583209999], [-73.89307140900002, 40.85324998699989], [-73.89038953999983, 40.85468905799996], [-73.88963328299991, 40.85317381799993]]]}}, {\&quot;id\&quot;: \&quot;78\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4822927, \&quot;OBJECTID\&quot;: 79, \&quot;Shape_Leng\&quot;: 0.0426249113144, \&quot;Shape_Area\&quot;: 0.000107893068218, \&quot;zone\&quot;: \&quot;East Village\&quot;, \&quot;LocationID\&quot;: 79, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98377990999991, 40.72153595399992], [-73.99260322199994, 40.72413644999987], [-73.98990295999991, 40.7344347899999], [-73.97802697999985, 40.729433059999984], [-73.98377990999991, 40.72153595399992]]]}}, {\&quot;id\&quot;: \&quot;79\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 151054, \&quot;OBJECTID\&quot;: 80, \&quot;Shape_Leng\&quot;: 0.117212621448, \&quot;Shape_Area\&quot;: 0.00040732245622, \&quot;zone\&quot;: \&quot;East Williamsburg\&quot;, \&quot;LocationID\&quot;: 80, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93174841322003, 40.728053727696675], [-73.92849418540158, 40.72661460330786], [-73.92453854985803, 40.719342580204575], [-73.93220607307306, 40.71496398092936], [-73.93124067059496, 40.71372481088467], [-73.93328349320237, 40.71097870745788], [-73.9319010192085, 40.71133847142828], [-73.9303609456579, 40.7087177385352], [-73.93184868877432, 40.71256477418327], [-73.93042294313065, 40.71317255867104], [-73.93105231901723, 40.71461022392334], [-73.92460339476072, 40.717953306073376], [-73.92305500014334, 40.71634266479336], [-73.92488553507611, 40.71526718765259], [-73.92433589757124, 40.71412259346647], [-73.92074519699985, 40.71052968599989], [-73.93229708600003, 40.70774944699988], [-73.93480281900003, 40.713372495999884], [-73.94378799599994, 40.710900378999945], [-73.94273448399997, 40.70447330599988], [-73.9408928719998, 40.70391415699989], [-73.94042057899993, 40.701076597999865], [-73.94193078899983, 40.70072523399989], [-73.95023693799996, 40.705473245999876], [-73.95087492699996, 40.70951311499991], [-73.94865533499987, 40.70972498299988], [-73.94937231899985, 40.71406687799986], [-73.95348472199983, 40.71407020799988], [-73.93174841322003, 40.728053727696675]]]}}, {\&quot;id\&quot;: \&quot;80\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 427, \&quot;OBJECTID\&quot;: 81, \&quot;Shape_Leng\&quot;: 0.197592771731, \&quot;Shape_Area\&quot;: 0.00039956655019, \&quot;zone\&quot;: \&quot;Eastchester\&quot;, \&quot;LocationID\&quot;: 81, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8236684811033, 40.889903740147645], [-73.82285335053221, 40.8912068290476], [-73.79300652624502, 40.88335873744268], [-73.81209659199986, 40.88671500999993], [-73.82027432999985, 40.885550699999925], [-73.82387140599998, 40.88778362799996], [-73.84324113799987, 40.879108912999904], [-73.8381484219999, 40.876953298999915], [-73.83924788999988, 40.876618737999905], [-73.83829221499984, 40.87295133899995], [-73.83565766499987, 40.86751275599992], [-73.83315960399985, 40.86831975599994], [-73.82834347399992, 40.86089202599988], [-73.85363638799987, 40.87330059899996], [-73.8506895569999, 40.87548667799993], [-73.85254854099988, 40.877091586999924], [-73.85091896099982, 40.877893440999856], [-73.85248305800003, 40.87946370499989], [-73.84704957999995, 40.8876718159999], [-73.83554853999995, 40.88913350399993], [-73.83737956161106, 40.893924741304346], [-73.8236684811033, 40.889903740147645]]]}}, {\&quot;id\&quot;: \&quot;81\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 51345, \&quot;OBJECTID\&quot;: 82, \&quot;Shape_Leng\&quot;: 0.119875649697, \&quot;Shape_Area\&quot;: 0.000323601079994, \&quot;zone\&quot;: \&quot;Elmhurst\&quot;, \&quot;LocationID\&quot;: 82, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86768504899995, 40.744071717999915], [-73.86447086199989, 40.73400727399998], [-73.88720524999994, 40.727792996999874], [-73.8885228599999, 40.734531159999904], [-73.87752195799992, 40.731593168999915], [-73.87708276299998, 40.73290931699991], [-73.88066188999987, 40.73570787399994], [-73.88033059399996, 40.73733367699989], [-73.88230252700001, 40.737707700999934], [-73.87743058400002, 40.73860051599991], [-73.88100387999987, 40.74184066199995], [-73.88551225099985, 40.74016501899988], [-73.887511321, 40.74108252699992], [-73.88798650799986, 40.743548191999935], [-73.89071647499993, 40.74312778399992], [-73.89175048799991, 40.7468117269999], [-73.86942458599987, 40.74915685199991], [-73.86768504899995, 40.744071717999915]]]}}, {\&quot;id\&quot;: \&quot;82\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 24587, \&quot;OBJECTID\&quot;: 83, \&quot;Shape_Leng\&quot;: 0.105984933269, \&quot;Shape_Area\&quot;: 0.000217463718718, \&quot;zone\&quot;: \&quot;Elmhurst/Maspeth\&quot;, \&quot;LocationID\&quot;: 83, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89111026199994, 40.745202717999874], [-73.89071647499993, 40.74312778399992], [-73.88798650799986, 40.743548191999935], [-73.887511321, 40.74108252699992], [-73.88551225099985, 40.74016501899988], [-73.88100387999987, 40.74184066199995], [-73.87791831799989, 40.739394956999874], [-73.88230252700001, 40.737707700999934], [-73.88033059399996, 40.73733367699989], [-73.88066188999987, 40.73570787399994], [-73.87725122499988, 40.7317941529999], [-73.88910318999984, 40.73459239599987], [-73.89854772799987, 40.735191909999855], [-73.90107970900003, 40.73391463399987], [-73.90516948899983, 40.73585964299986], [-73.90628903499987, 40.732400751999876], [-73.91068876399997, 40.733471081999916], [-73.90926002999988, 40.736403179999854], [-73.90057825399985, 40.73949289599988], [-73.89524819599988, 40.74381972999992], [-73.89624245599988, 40.74871954499987], [-73.89139145499985, 40.74664100399984], [-73.89111026199994, 40.745202717999874]]]}}, {\&quot;id\&quot;: \&quot;83\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 29, \&quot;OBJECTID\&quot;: 84, \&quot;Shape_Leng\&quot;: 0.233623987032, \&quot;Shape_Area\&quot;: 0.00207375572052, \&quot;zone\&quot;: \&quot;Eltingville/Annadale/Prince&apos;s Bay\&quot;, \&quot;LocationID\&quot;: 84, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.16005732699996, 40.527635041999886], [-74.1720632017547, 40.52332056936472], [-74.17756306042942, 40.519217618159864], [-74.18104081208887, 40.520705036287154], [-74.1848311647976, 40.519341358600826], [-74.19521339999068, 40.5099776529556], [-74.19967205357709, 40.511426850497486], [-74.19936127407836, 40.51301019443217], [-74.20821982874101, 40.51161821258057], [-74.21754755095681, 40.50336004949062], [-74.22153919955196, 40.50250347421612], [-74.22690993399992, 40.51917139799985], [-74.22379595899992, 40.518196345999876], [-74.21354593499994, 40.521235714999925], [-74.21409806799993, 40.52409719499991], [-74.20152661599995, 40.526265205999934], [-74.19174368799999, 40.53191669699986], [-74.19377169299999, 40.53583384699993], [-74.18903145199995, 40.53815934199989], [-74.18128532999992, 40.54695757299989], [-74.17185166499996, 40.56152092299991], [-74.16982582400001, 40.56109042099991], [-74.16540080799992, 40.54443272299989], [-74.15397419799994, 40.53426814799993], [-74.16134961699994, 40.5293734239999], [-74.16005732699996, 40.527635041999886]]]}}, {\&quot;id\&quot;: \&quot;84\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4670, \&quot;OBJECTID\&quot;: 85, \&quot;Shape_Leng\&quot;: 0.0574751473562, \&quot;Shape_Area\&quot;: 0.000143637804933, \&quot;zone\&quot;: \&quot;Erasmus\&quot;, \&quot;LocationID\&quot;: 85, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94715896299984, 40.65559378699993], [-73.94586879199989, 40.64342374399988], [-73.94778994699976, 40.643305735999924], [-73.94826499600005, 40.63860718999994], [-73.9536000469999, 40.63842234699991], [-73.95763644599988, 40.64268949899989], [-73.9587078989999, 40.65038727299989], [-73.94957113100006, 40.65080789999991], [-73.9500666489999, 40.65542299699989], [-73.94715896299984, 40.65559378699993]]]}}, {\&quot;id\&quot;: \&quot;85\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 286, \&quot;OBJECTID\&quot;: 86, \&quot;Shape_Leng\&quot;: 0.134245282582, \&quot;Shape_Area\&quot;: 0.000623278815249, \&quot;zone\&quot;: \&quot;Far Rockaway\&quot;, \&quot;LocationID\&quot;: 86, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76669071688973, 40.61422662157113], [-73.76505961679173, 40.612035230610466], [-73.76023635756965, 40.610820864950284], [-73.76178242960594, 40.60915167005445], [-73.76155051905889, 40.60903136580077], [-73.75998446974822, 40.61087937784668], [-73.7556083701559, 40.61007791963748], [-73.7457615018933, 40.611991654374336], [-73.73815143112287, 40.60271044008338], [-73.73808925304178, 40.59768829704553], [-73.74183083531219, 40.59669555145679], [-73.73812220887619, 40.597386102069386], [-73.73763679389783, 40.594415399837956], [-73.74664920374843, 40.594280895008744], [-73.75352988157324, 40.59094648500059], [-73.76376223423699, 40.591439709016804], [-73.76440183099987, 40.59457168299989], [-73.76277845599988, 40.59475654399989], [-73.7633344969999, 40.59782287399992], [-73.76128753399995, 40.59954927099993], [-73.76654204999997, 40.599434441999904], [-73.76771811799993, 40.596261309999925], [-73.76795043655434, 40.5981585114185], [-73.77098168371995, 40.59889409104954], [-73.76895714023856, 40.60927991805636], [-73.77417180232338, 40.61182871527586], [-73.77339803484179, 40.61368296748421], [-73.76669071688973, 40.61422662157113]]]}}, {\&quot;id\&quot;: \&quot;86\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1153199, \&quot;OBJECTID\&quot;: 87, \&quot;Shape_Leng\&quot;: 0.0369015496117, \&quot;Shape_Area\&quot;: 6.72050210692e-05, \&quot;zone\&quot;: \&quot;Financial District North\&quot;, \&quot;LocationID\&quot;: 87, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00372234899996, 40.70693234399989], [-74.00197014837809, 40.704731159202304], [-74.00332307270776, 40.70562859522001], [-74.00459003883662, 40.70478775294495], [-74.00349632042315, 40.70379676926777], [-74.0053502722475, 40.70431007996148], [-74.004272587521, 40.70301566641148], [-74.00659591913875, 40.70368590245183], [-74.00530412596079, 40.70255986563306], [-74.00550166067457, 40.70243086779703], [-74.01250773999998, 40.706767065999934], [-74.00906264799988, 40.71088670399992], [-74.00372234899996, 40.70693234399989]]]}}, {\&quot;id\&quot;: \&quot;87\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 542234, \&quot;OBJECTID\&quot;: 88, \&quot;Shape_Leng\&quot;: 0.0352046035327, \&quot;Shape_Area\&quot;: 5.72999455414e-05, \&quot;zone\&quot;: \&quot;Financial District South\&quot;, \&quot;LocationID\&quot;: 88, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00974639299997, 40.704775247999905], [-74.00760498189766, 40.70299314132918], [-74.00930907655483, 40.70195460302249], [-74.00759136204225, 40.70132808104815], [-74.01367479307396, 40.70012582122537], [-74.01428922899998, 40.70454907499989], [-74.01250773999998, 40.706767065999934], [-74.00974639299997, 40.704775247999905]]]}}, {\&quot;id\&quot;: \&quot;88\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 18697, \&quot;OBJECTID\&quot;: 89, \&quot;Shape_Leng\&quot;: 0.122794569553, \&quot;Shape_Area\&quot;: 0.000447548142373, \&quot;zone\&quot;: \&quot;Flatbush/Ditmas Park\&quot;, \&quot;LocationID\&quot;: 89, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95374853799996, 40.63858633799993], [-73.94537272499998, 40.638786954999865], [-73.94462885499995, 40.63183773499993], [-73.94647961799998, 40.631708161999896], [-73.94415535299993, 40.629508284999886], [-73.95995565099992, 40.627778671999884], [-73.96040734299989, 40.6301625309999], [-73.96232599399991, 40.6299687169999], [-73.97136622199992, 40.62892916199996], [-73.97092126300004, 40.62656998499993], [-73.97623453700001, 40.625976349999895], [-73.97716511999984, 40.63074665399988], [-73.96986869299992, 40.63419467499989], [-73.97029036199991, 40.63640634099988], [-73.96803868499985, 40.636650984999925], [-73.97139631700004, 40.64825778599986], [-73.96465438699984, 40.650887727999894], [-73.96621321999996, 40.653189404999885], [-73.95986103199981, 40.65563478899989], [-73.95763644599988, 40.64268949899989], [-73.95374853799996, 40.63858633799993]]]}}, {\&quot;id\&quot;: \&quot;89\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2871189, \&quot;OBJECTID\&quot;: 90, \&quot;Shape_Leng\&quot;: 0.0307591620819, \&quot;Shape_Area\&quot;: 5.53132476305e-05, \&quot;zone\&quot;: \&quot;Flatiron\&quot;, \&quot;LocationID\&quot;: 90, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9963368949999, 40.7380437469999], [-74.00252381499989, 40.73975264399995], [-73.99709902899994, 40.74720510199991], [-73.99141858599994, 40.74480268199988], [-73.9963368949999, 40.7380437469999]]]}}, {\&quot;id\&quot;: \&quot;90\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2596, \&quot;OBJECTID\&quot;: 91, \&quot;Shape_Leng\&quot;: 0.124996624585, \&quot;Shape_Area\&quot;: 0.000537330013243, \&quot;zone\&quot;: \&quot;Flatlands\&quot;, \&quot;LocationID\&quot;: 91, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91945472999996, 40.6401731369999], [-73.91690302699992, 40.61627422899993], [-73.9205269409999, 40.61394269499987], [-73.92640044599996, 40.61447853499988], [-73.92629604599998, 40.61311679899991], [-73.93686699599992, 40.620253280999904], [-73.94573691999982, 40.61536340699989], [-73.94651373199997, 40.61949401899995], [-73.94451833400001, 40.61971364699989], [-73.94732672199994, 40.629166566999835], [-73.94415535299993, 40.629508284999886], [-73.94647961799998, 40.631708161999896], [-73.93701746200003, 40.63231097899989], [-73.9372670019998, 40.634650624999885], [-73.92744822299987, 40.635258409999864], [-73.92538233099987, 40.64238453199987], [-73.92356525899983, 40.642499297999905], [-73.92332654599986, 40.63990021599991], [-73.91973736999988, 40.64277814799987], [-73.91945472999996, 40.6401731369999]]]}}, {\&quot;id\&quot;: \&quot;91\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 9309, \&quot;OBJECTID\&quot;: 92, \&quot;Shape_Leng\&quot;: 0.117830066799, \&quot;Shape_Area\&quot;: 0.000374946617289, \&quot;zone\&quot;: \&quot;Flushing\&quot;, \&quot;LocationID\&quot;: 92, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82656578899986, 40.77064147599989], [-73.82466908999987, 40.77040760799985], [-73.82080684899987, 40.7589417829999], [-73.81789245699991, 40.75708633799991], [-73.82030067699999, 40.75551497999992], [-73.8184078289999, 40.75383042199998], [-73.820849288, 40.75224154499988], [-73.81575069499985, 40.7469794799999], [-73.82108427599998, 40.748558445999954], [-73.82426493900002, 40.75183288899994], [-73.82584440999999, 40.74934839099993], [-73.83300302099987, 40.74783363099988], [-73.8322953569999, 40.751941790999844], [-73.83560230899995, 40.75139485299991], [-73.83805974199996, 40.75466660699988], [-73.83689970199995, 40.7626981179999], [-73.8394581342306, 40.76544576822929], [-73.83000011099983, 40.77373240699996], [-73.82513740299993, 40.78169970599994], [-73.82224127699999, 40.781693878999924], [-73.82583089999997, 40.77591527099986], [-73.82656578899986, 40.77064147599989]]]}}, {\&quot;id\&quot;: \&quot;92\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 14054, \&quot;OBJECTID\&quot;: 93, \&quot;Shape_Leng\&quot;: 0.170998027597, \&quot;Shape_Area\&quot;: 0.000594278183978, \&quot;zone\&quot;: \&quot;Flushing Meadows-Corona Park\&quot;, \&quot;LocationID\&quot;: 93, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8569635593979, 40.76407442786308], [-73.8566748236235, 40.763930188326135], [-73.85758285470693, 40.76307290062661], [-73.8565867538878, 40.762722840114236], [-73.85817631070509, 40.7623962942238], [-73.85661195813331, 40.761649542759294], [-73.8585852628444, 40.76191700859695], [-73.85747662435531, 40.76130891668733], [-73.85158552901191, 40.75935542065696], [-73.84930110814332, 40.76024287534997], [-73.85207200177854, 40.7603928846721], [-73.84670933714987, 40.76134526931977], [-73.84324381399976, 40.75533680399995], [-73.83867321899987, 40.75701997899995], [-73.83560230899995, 40.75139485299991], [-73.8322953569999, 40.751941790999844], [-73.83300302099987, 40.74783363099988], [-73.83699037399995, 40.74209330099992], [-73.8361277859999, 40.734241311999924], [-73.83073214599987, 40.72654932799991], [-73.8273090039999, 40.72464607699988], [-73.82531644999993, 40.71727569999994], [-73.81729568999994, 40.71757964499995], [-73.83145866999996, 40.714554448999934], [-73.8297961659998, 40.71556571899986], [-73.83488359399998, 40.719303271999934], [-73.85436928099995, 40.748738929999874], [-73.85086439699992, 40.74999564199986], [-73.85379813799992, 40.757177611999914], [-73.86109724399991, 40.76366447799989], [-73.85861915281858, 40.7619355969989], [-73.8569635593979, 40.76407442786308]]]}}, {\&quot;id\&quot;: \&quot;93\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 957, \&quot;OBJECTID\&quot;: 94, \&quot;Shape_Leng\&quot;: 0.0498326083147, \&quot;Shape_Area\&quot;: 6.25819407393e-05, \&quot;zone\&quot;: \&quot;Fordham South\&quot;, \&quot;LocationID\&quot;: 94, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89964261700001, 40.862210436999874], [-73.897143798, 40.86244506499991], [-73.89883814599983, 40.859307307999906], [-73.89573924699978, 40.85813820699986], [-73.89106059999996, 40.861471814999945], [-73.89560883299981, 40.85457036999986], [-73.89863543699985, 40.85390697499993], [-73.89816577499982, 40.85514637599989], [-73.90077922699986, 40.85604710999993], [-73.90185996099993, 40.85458614899994], [-73.90557007299988, 40.855787321999884], [-73.90351390599986, 40.86091750999989], [-73.89964261700001, 40.862210436999874]]]}}, {\&quot;id\&quot;: \&quot;94\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 27893, \&quot;OBJECTID\&quot;: 95, \&quot;Shape_Leng\&quot;: 0.113629605476, \&quot;Shape_Area\&quot;: 0.00057277033803, \&quot;zone\&quot;: \&quot;Forest Hills\&quot;, \&quot;LocationID\&quot;: 95, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84732494199989, 40.738771457999896], [-73.83488359399998, 40.719303271999934], [-73.8297961659998, 40.71556571899986], [-73.8377089419999, 40.71103648399989], [-73.85593991699984, 40.7063980339999], [-73.8586809759999, 40.72261243999988], [-73.86203833799982, 40.72595678499994], [-73.85805416899993, 40.72444540599986], [-73.85727108100001, 40.72568129799988], [-73.8594198799999, 40.726464837999885], [-73.85741240699991, 40.72832247999986], [-73.85851097899999, 40.73028680199993], [-73.85625665099991, 40.73095912299993], [-73.85872465799989, 40.73570864399988], [-73.84732494199989, 40.738771457999896]]]}}, {\&quot;id\&quot;: \&quot;95\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 565, \&quot;OBJECTID\&quot;: 96, \&quot;Shape_Leng\&quot;: 0.185180248095, \&quot;Shape_Area\&quot;: 0.000547566253402, \&quot;zone\&quot;: \&quot;Forest Park/Highland Park\&quot;, \&quot;LocationID\&quot;: 96, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83804164799996, 40.70832329499994], [-73.83696237799982, 40.70421245199992], [-73.84502472899999, 40.6993593769999], [-73.84913837299978, 40.69828274099995], [-73.85070842300001, 40.70020312499988], [-73.85443455699989, 40.70060295199994], [-73.85277238699999, 40.69755711199987], [-73.874020533, 40.69419129499994], [-73.88962787599998, 40.684236453999894], [-73.89252316899987, 40.683424532999865], [-73.89417463299992, 40.6852832479999], [-73.89646625099995, 40.68233642199988], [-73.90116155099986, 40.687877934999946], [-73.90180467199995, 40.6907662979999], [-73.9003866789998, 40.69313995999992], [-73.89736265799978, 40.6941108469999], [-73.89695653499987, 40.6919492069999], [-73.89326209899984, 40.69220094699994], [-73.8950769439999, 40.694591389999886], [-73.88642048199995, 40.696458148999945], [-73.88771297999986, 40.699678075999906], [-73.88280948499987, 40.7006834549999], [-73.88182690599986, 40.69952929899987], [-73.87639785199997, 40.70229404199989], [-73.86285374199994, 40.7034144919999], [-73.85819890699996, 40.70291107399986], [-73.85893224399979, 40.70132034499989], [-73.85725351500002, 40.70121217699989], [-73.85252019099998, 40.70229172399997], [-73.85473240499985, 40.70676414299989], [-73.84314625299982, 40.70922345599992], [-73.83804164799996, 40.70832329499994]]]}}, {\&quot;id\&quot;: \&quot;96\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 155921, \&quot;OBJECTID\&quot;: 97, \&quot;Shape_Leng\&quot;: 0.0624760147423, \&quot;Shape_Area\&quot;: 0.000163303970435, \&quot;zone\&quot;: \&quot;Fort Greene\&quot;, \&quot;LocationID\&quot;: 97, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9693409769999, 40.69576842999993], [-73.96910362499993, 40.68946752199986], [-73.97013154199992, 40.68950630799986], [-73.96868961400001, 40.68200525799988], [-73.97745722099988, 40.68405228699988], [-73.98092822899991, 40.68890247699988], [-73.98372011099993, 40.69000671899992], [-73.98147568199991, 40.689930943999876], [-73.98251122999989, 40.69361433399992], [-73.97916718399999, 40.69348832299992], [-73.98054419199988, 40.69824651199988], [-73.9697278989999, 40.69780401399986], [-73.9693409769999, 40.69576842999993]]]}}, {\&quot;id\&quot;: \&quot;97\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 684, \&quot;OBJECTID\&quot;: 98, \&quot;Shape_Leng\&quot;: 0.121661018278, \&quot;Shape_Area\&quot;: 0.000485773020954, \&quot;zone\&quot;: \&quot;Fresh Meadows\&quot;, \&quot;LocationID\&quot;: 98, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76360860199983, 40.73917476499987], [-73.76273303499985, 40.73526216299995], [-73.76510920699994, 40.73455658499992], [-73.7636997919999, 40.73286411699993], [-73.76564374500005, 40.732533126999954], [-73.75669771299987, 40.7262287109999], [-73.76924074899993, 40.72590270099988], [-73.77727808000003, 40.72234633599988], [-73.77803765999981, 40.723284268999855], [-73.7752338719998, 40.725237532999884], [-73.77757506899988, 40.73019327299987], [-73.79174472699992, 40.725788849999944], [-73.79651029099988, 40.7379086369999], [-73.76772991399994, 40.74577622599993], [-73.76360860199983, 40.73917476499987]]]}}, {\&quot;id\&quot;: \&quot;98\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 16, \&quot;OBJECTID\&quot;: 99, \&quot;Shape_Leng\&quot;: 0.1833714893, \&quot;Shape_Area\&quot;: 0.00121016463877, \&quot;zone\&quot;: \&quot;Freshkills Park\&quot;, \&quot;LocationID\&quot;: 99, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.16842916199994, 40.58649792299988], [-74.16982582400001, 40.56109042099991], [-74.18295815999996, 40.56548019999992], [-74.193410946, 40.56248503899994], [-74.20091501299991, 40.55600525999987], [-74.20699885299997, 40.55756748899989], [-74.2056960519999, 40.55851600599987], [-74.21324031454323, 40.55667262386906], [-74.20596154297344, 40.580046993882775], [-74.20048848799996, 40.57994977799989], [-74.19964981299998, 40.58226262599991], [-74.19423261299991, 40.58514680599988], [-74.185371048, 40.58745101499987], [-74.18730248699987, 40.588488221999896], [-74.17488959399996, 40.602216572999914], [-74.16719634899995, 40.602075311999926], [-74.16886362299992, 40.59472808699995], [-74.16350785499993, 40.59327217999993], [-74.16842916199994, 40.58649792299988]]]}}, {\&quot;id\&quot;: \&quot;99\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2647238, \&quot;OBJECTID\&quot;: 100, \&quot;Shape_Leng\&quot;: 0.0248131090342, \&quot;Shape_Area\&quot;: 3.74700210291e-05, \&quot;zone\&quot;: \&quot;Garment District\&quot;, \&quot;LocationID\&quot;: 100, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98729377099981, 40.75045160899988], [-73.99346417699986, 40.75219005499987], [-73.98979085399996, 40.7572331319999], [-73.98411754799999, 40.75484205299995], [-73.98729377099981, 40.75045160899988]]]}}, {\&quot;id\&quot;: \&quot;100\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 636, \&quot;OBJECTID\&quot;: 101, \&quot;Shape_Leng\&quot;: 0.101709836277, \&quot;Shape_Area\&quot;: 0.000452342528877, \&quot;zone\&quot;: \&quot;Glen Oaks\&quot;, \&quot;LocationID\&quot;: 101, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.70134715908382, 40.750780580935846], [-73.70002020501624, 40.73923654186594], [-73.70766217302989, 40.727830934754685], [-73.71049995381028, 40.72722708720663], [-73.71147804899985, 40.73250140099988], [-73.72010148299994, 40.74977568599991], [-73.727664654, 40.749654641999946], [-73.728962516, 40.74763288799986], [-73.72737889099987, 40.751029566999854], [-73.7206331939999, 40.75761683499996], [-73.71612528199985, 40.75966071399991], [-73.71244940715339, 40.75924170410932], [-73.70163345846068, 40.75249332984642], [-73.70134715908382, 40.750780580935846]]]}}, {\&quot;id\&quot;: \&quot;101\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1532, \&quot;OBJECTID\&quot;: 102, \&quot;Shape_Leng\&quot;: 0.136900484646, \&quot;Shape_Area\&quot;: 0.000296595466345, \&quot;zone\&quot;: \&quot;Glendale\&quot;, \&quot;LocationID\&quot;: 102, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85595536199988, 40.70642977899992], [-73.85473240499985, 40.70676414299989], [-73.85252019099998, 40.70229172399997], [-73.85827405799986, 40.70122365899992], [-73.85819890699996, 40.70291107399986], [-73.86285374199994, 40.7034144919999], [-73.87639785199997, 40.70229404199989], [-73.88182690599986, 40.69952929899987], [-73.88280948499988, 40.70068345599986], [-73.88771297999986, 40.699678075999906], [-73.88642048199995, 40.696458148999945], [-73.8950769439999, 40.694591389999886], [-73.89326209899984, 40.69220094699994], [-73.89695653499987, 40.6919492069999], [-73.89736265799978, 40.6941108469999], [-73.900030392, 40.693437450999895], [-73.88911917799989, 40.705598876999915], [-73.86911007199988, 40.707089336999914], [-73.87016462499984, 40.70920774299987], [-73.85965416799995, 40.713379960999866], [-73.85975932900001, 40.711845058999856], [-73.85729287299985, 40.711467676999874], [-73.85595536199988, 40.70642977899992]]]}}, {\&quot;id\&quot;: \&quot;102\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 57, \&quot;OBJECTID\&quot;: 103, \&quot;Shape_Leng\&quot;: 0.0143055167343, \&quot;Shape_Area\&quot;: 6.33056361314e-06, \&quot;zone\&quot;: \&quot;Governor&apos;s Island/Ellis Island/Liberty Island\&quot;, \&quot;LocationID\&quot;: 103, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.04388559600675, 40.690184824096946], [-74.04350596056258, 40.689687359818144], [-74.04270428413375, 40.69015520482211], [-74.04255372018648, 40.68996275914475], [-74.04438521705613, 40.68851617820147], [-74.04772962698515, 40.689915318233105], [-74.04614707204328, 40.69112264601653], [-74.04388559600675, 40.690184824096946]]]}}, {\&quot;id\&quot;: \&quot;103\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 57, \&quot;OBJECTID\&quot;: 104, \&quot;Shape_Leng\&quot;: 0.0212208330928, \&quot;Shape_Area\&quot;: 1.19205339715e-05, \&quot;zone\&quot;: \&quot;Governor&apos;s Island/Ellis Island/Liberty Island\&quot;, \&quot;LocationID\&quot;: 103, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.03995040794246, 40.70089063032128], [-74.03771124798313, 40.69934404017382], [-74.03934037685066, 40.698115514418], [-74.04124261816106, 40.69953674121738], [-74.0399124888631, 40.69770204019913], [-74.0416605190741, 40.696452971319864], [-74.04367371215382, 40.69802040416498], [-74.03995040794246, 40.70089063032128]]]}}, {\&quot;id\&quot;: \&quot;104\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 57, \&quot;OBJECTID\&quot;: 105, \&quot;Shape_Leng\&quot;: 0.0774253398314, \&quot;Shape_Area\&quot;: 0.000368636392805, \&quot;zone\&quot;: \&quot;Governor&apos;s Island/Ellis Island/Liberty Island\&quot;, \&quot;LocationID\&quot;: 103, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01674756096064, 40.693343368217555], [-74.0118118564723, 40.69247933506435], [-74.01333264149613, 40.69201997010238], [-74.01182575354963, 40.69106481621614], [-74.01316926402752, 40.6881547712032], [-74.02259359581036, 40.68435969594992], [-74.02213250186877, 40.683767672385194], [-74.02305574749599, 40.6829169454452], [-74.0227589902996, 40.68428444833225], [-74.026334042424, 40.6848016977242], [-74.01971454942077, 40.69313300682718], [-74.01674756096064, 40.693343368217555]]]}}, {\&quot;id\&quot;: \&quot;105\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 34542, \&quot;OBJECTID\&quot;: 106, \&quot;Shape_Leng\&quot;: 0.0492110119798, \&quot;Shape_Area\&quot;: 0.000113616826567, \&quot;zone\&quot;: \&quot;Gowanus\&quot;, \&quot;LocationID\&quot;: 106, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98610388199985, 40.68100852199994], [-73.98175642299985, 40.67931462399987], [-73.99277080699981, 40.665507280999876], [-73.9986188799999, 40.67183017199989], [-73.99506451099984, 40.67584047499984], [-73.99069861899994, 40.67580741899994], [-73.9876680399999, 40.68081780999993], [-73.98610388199985, 40.68100852199994]]]}}, {\&quot;id\&quot;: \&quot;106\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3810928, \&quot;OBJECTID\&quot;: 107, \&quot;Shape_Leng\&quot;: 0.0380413645908, \&quot;Shape_Area\&quot;: 7.46112192675e-05, \&quot;zone\&quot;: \&quot;Gramercy\&quot;, \&quot;LocationID\&quot;: 107, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98238628799993, 40.73141124499993], [-73.98990295999991, 40.7344347899999], [-73.98407485299995, 40.74332471799989], [-73.98085965399994, 40.74196976799989], [-73.98266497499989, 40.73949733299987], [-73.97805226499996, 40.7375539539999], [-73.98238628799993, 40.73141124499993]]]}}, {\&quot;id\&quot;: \&quot;107\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 597, \&quot;OBJECTID\&quot;: 108, \&quot;Shape_Leng\&quot;: 0.11117141227, \&quot;Shape_Area\&quot;: 0.000352866009465, \&quot;zone\&quot;: \&quot;Gravesend\&quot;, \&quot;LocationID\&quot;: 108, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97148350899987, 40.59717158499996], [-73.97115101799994, 40.59044244399989], [-73.96514385199995, 40.5911019159999], [-73.96661531499983, 40.58457103699992], [-73.97742525299988, 40.58290659299994], [-73.98710120299997, 40.58464459199988], [-73.98654457099988, 40.583658590999946], [-73.98829948299982, 40.58346674699986], [-73.98995504960881, 40.58066166976562], [-73.99185535656628, 40.5816239785461], [-73.99026244714351, 40.5846191482053], [-73.99547188560318, 40.58221005511802], [-74.0003088081067, 40.58317703751469], [-73.99808523776004, 40.585364721581485], [-73.99956511570304, 40.5862439200957], [-73.9940790462178, 40.58869344199059], [-74.00038207107852, 40.58713305717468], [-73.98962150099992, 40.59098199299996], [-73.98601936799993, 40.594446048999906], [-73.97995443499985, 40.594073811999884], [-73.98035785499995, 40.59619154099992], [-73.97148350899987, 40.59717158499996]]]}}, {\&quot;id\&quot;: \&quot;108\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 40, \&quot;OBJECTID\&quot;: 109, \&quot;Shape_Leng\&quot;: 0.178267819599, \&quot;Shape_Area\&quot;: 0.00116960076185, \&quot;zone\&quot;: \&quot;Great Kills\&quot;, \&quot;LocationID\&quot;: 109, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.14706472699994, 40.5705086149999], [-74.13170009, 40.56453574899991], [-74.13885092699991, 40.5569511789999], [-74.13316825999992, 40.552356178999936], [-74.13861798499994, 40.548492384999875], [-74.13585712583111, 40.546451696357344], [-74.1371798712987, 40.5457928646606], [-74.13611540724054, 40.54501984567978], [-74.13794966050746, 40.54600033758068], [-74.13886951340419, 40.545130197607286], [-74.13762430745145, 40.54425356641828], [-74.13875534703455, 40.544933958426874], [-74.13786798524545, 40.54405254413092], [-74.13903307178627, 40.54470491029999], [-74.13953937915736, 40.54429514087214], [-74.13834151288823, 40.543551828814046], [-74.14038573073617, 40.54403318500786], [-74.13921993485874, 40.54316608513788], [-74.14141073560397, 40.543022415080344], [-74.14026290400692, 40.54196151152258], [-74.14134901379589, 40.54257752313157], [-74.14179719957052, 40.54220041538235], [-74.14063984172124, 40.54169454203723], [-74.14095816832888, 40.54143207796496], [-74.14229632246158, 40.54225784915546], [-74.14104157916547, 40.53734688546733], [-74.14374951249268, 40.53719106134627], [-74.15970134520207, 40.52729599283152], [-74.16134961699994, 40.5293734239999], [-74.15397419799994, 40.53426814799993], [-74.16540080799992, 40.54443272299989], [-74.16982582400001, 40.56109042099991], [-74.1649414939999, 40.56011179699991], [-74.15725974199995, 40.562553318999896], [-74.14706472699994, 40.5705086149999]]]}}, {\&quot;id\&quot;: \&quot;109\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2, \&quot;OBJECTID\&quot;: 110, \&quot;Shape_Leng\&quot;: 0.103946292913, \&quot;Shape_Area\&quot;: 0.000525745098785, \&quot;zone\&quot;: \&quot;Great Kills Park\&quot;, \&quot;LocationID\&quot;: 110, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.11813477599993, 40.550592692999906], [-74.11338340608127, 40.54807337507532], [-74.12245306050386, 40.544770545629824], [-74.1335644349803, 40.5315111748056], [-74.1369079907634, 40.529281918882695], [-74.13883030715276, 40.529889356352996], [-74.14032475393472, 40.5352845797219], [-74.13381005153853, 40.53564293988989], [-74.12738789634466, 40.54229542996431], [-74.13011404715266, 40.54597572663567], [-74.13585712583111, 40.546451696357344], [-74.13861798499991, 40.548492383999886], [-74.12730057799996, 40.55729517199993], [-74.11813477599993, 40.550592692999906]]]}}, {\&quot;id\&quot;: \&quot;110\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 404, \&quot;OBJECTID\&quot;: 111, \&quot;Shape_Leng\&quot;: 0.0599308800658, \&quot;Shape_Area\&quot;: 0.000208683276503, \&quot;zone\&quot;: \&quot;Green-Wood Cemetery\&quot;, \&quot;LocationID\&quot;: 111, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99516890099986, 40.6596695219999], [-73.990188415, 40.657600817999906], [-73.98843135299977, 40.65925121199996], [-73.98179568699996, 40.65524609699991], [-73.98029115499993, 40.647297160999855], [-73.98905872499985, 40.64411924099995], [-74.00214474599989, 40.65295610699996], [-73.99516890099986, 40.6596695219999]]]}}, {\&quot;id\&quot;: \&quot;111\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 131998, \&quot;OBJECTID\&quot;: 112, \&quot;Shape_Leng\&quot;: 0.107267875765, \&quot;Shape_Area\&quot;: 0.000462068671429, \&quot;zone\&quot;: \&quot;Greenpoint\&quot;, \&quot;LocationID\&quot;: 112, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.95439555417066, 40.73911477252253], [-73.94652352854791, 40.73692685395814], [-73.94719983367108, 40.73535517811412], [-73.94706532915383, 40.734401992819265], [-73.94557048457217, 40.736612303910405], [-73.94239443542429, 40.73542574994758], [-73.9381033496066, 40.729728519521366], [-73.93226852175046, 40.72817465801565], [-73.94841638599995, 40.71845553299995], [-73.94907816799986, 40.72254028699993], [-73.95477662900004, 40.72245950499994], [-73.95842611843923, 40.725400535832165], [-73.9616151883593, 40.725865563073995], [-73.96143187677845, 40.730965171647846], [-73.96226340423281, 40.732915551623485], [-73.96406507049178, 40.732779040653625], [-73.95837507902779, 40.73809694936863], [-73.95439555417066, 40.73911477252253]]], [[[-73.96236596889429, 40.72420906161418], [-73.96200744849497, 40.7239919013038], [-73.96207271921921, 40.72388030020147], [-73.96246790011047, 40.72413157960129], [-73.96236596889429, 40.72420906161418]]]]}}, {\&quot;id\&quot;: \&quot;112\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2576597, \&quot;OBJECTID\&quot;: 113, \&quot;Shape_Leng\&quot;: 0.032745350566, \&quot;Shape_Area\&quot;: 5.79634566998e-05, \&quot;zone\&quot;: \&quot;Greenwich Village North\&quot;, \&quot;LocationID\&quot;: 113, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99136388099988, 40.72755978299991], [-73.99657214499979, 40.729552233999904], [-73.99556245499996, 40.73071521599994], [-74.000066577, 40.7329292359999], [-73.99683993899998, 40.73736088899995], [-73.98990295999991, 40.7344347899999], [-73.99136388099988, 40.72755978299991]]]}}, {\&quot;id\&quot;: \&quot;113\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2156520, \&quot;OBJECTID\&quot;: 114, \&quot;Shape_Leng\&quot;: 0.0317270347711, \&quot;Shape_Area\&quot;: 4.70207704945e-05, \&quot;zone\&quot;: \&quot;Greenwich Village South\&quot;, \&quot;LocationID\&quot;: 114, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99257987399992, 40.724201554999915], [-74.00281726599992, 40.72836312899993], [-74.000066577, 40.7329292359999], [-73.99154832699986, 40.72708947099994], [-73.99257987399992, 40.724201554999915]]]}}, {\&quot;id\&quot;: \&quot;114\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 136, \&quot;OBJECTID\&quot;: 115, \&quot;Shape_Leng\&quot;: 0.116169413964, \&quot;Shape_Area\&quot;: 0.000373168991958, \&quot;zone\&quot;: \&quot;Grymes Hill/Clifton\&quot;, \&quot;LocationID\&quot;: 115, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08069514799999, 40.62753689699988], [-74.08326107499997, 40.627194742999954], [-74.08496211899991, 40.624625232999925], [-74.08785147699994, 40.615243072999924], [-74.08720982799997, 40.61330697399994], [-74.07253551699989, 40.622464021999896], [-74.071134623, 40.62035994799992], [-74.0815547009999, 40.60629029699987], [-74.0977696879999, 40.61062359299988], [-74.10350925299994, 40.61641607499991], [-74.0922397139999, 40.62574291499989], [-74.08574928999992, 40.633955556999865], [-74.07972492199995, 40.62895068799986], [-74.08069514799999, 40.62753689699988]]]}}, {\&quot;id\&quot;: \&quot;115\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 154287, \&quot;OBJECTID\&quot;: 116, \&quot;Shape_Leng\&quot;: 0.0681164844265, \&quot;Shape_Area\&quot;: 0.000260415337217, \&quot;zone\&quot;: \&quot;Hamilton Heights\&quot;, \&quot;LocationID\&quot;: 116, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93924885699987, 40.82829635099989], [-73.94515456999994, 40.82087626499993], [-73.94808289799983, 40.82210802199994], [-73.95082880000002, 40.820827936999876], [-73.95954472552476, 40.82364494182928], [-73.95015521048293, 40.83439675940791], [-73.93864026699997, 40.82973887399988], [-73.93924885699987, 40.82829635099989]]]}}, {\&quot;id\&quot;: \&quot;116\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 503, \&quot;OBJECTID\&quot;: 117, \&quot;Shape_Leng\&quot;: 0.169885857987, \&quot;Shape_Area\&quot;: 0.00090429427072, \&quot;zone\&quot;: \&quot;Hammels/Arverne\&quot;, \&quot;LocationID\&quot;: 117, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7763584369479, 40.609655838242304], [-73.77412897394224, 40.60874659586809], [-73.77460294599074, 40.607417648882524], [-73.77484886546486, 40.60802483315967], [-73.77523851986173, 40.60855094300021], [-73.77600772152827, 40.60919075424813], [-73.77469363854065, 40.60430696481727], [-73.7818572569845, 40.59837293018506], [-73.78005493695551, 40.596861344908895], [-73.7749751364952, 40.60174817941184], [-73.77363244061033, 40.598153123466695], [-73.76809925802587, 40.59784597005487], [-73.76771811799993, 40.596261309999925], [-73.76654204999997, 40.599434441999904], [-73.76165797299986, 40.599973069999876], [-73.7633344969999, 40.59782287399992], [-73.76277845599988, 40.59475654399989], [-73.76440183099987, 40.59457168299989], [-73.76376223423699, 40.591439709016804], [-73.81730795916116, 40.58233475897], [-73.81544517899997, 40.58337349199993], [-73.81909407399996, 40.58783196099988], [-73.8176380045051, 40.58928579948519], [-73.81170344836342, 40.59159374663789], [-73.81149423585859, 40.592901326696776], [-73.81132554567534, 40.59174649614576], [-73.81081791874632, 40.59209026869603], [-73.81138593152033, 40.592442318454566], [-73.81140751227157, 40.592871257238706], [-73.81107287021051, 40.593022330572076], [-73.80991130015991, 40.59225371768247], [-73.80959170493088, 40.593580688618054], [-73.80577902839048, 40.59075949966858], [-73.8058134261234, 40.59186886150206], [-73.80430333508215, 40.59131887880457], [-73.8079775709933, 40.59415786866439], [-73.80604149807385, 40.595554555213546], [-73.8024384629031, 40.59264006383509], [-73.80234513845657, 40.59449597525689], [-73.80344017041448, 40.59443420917679], [-73.80321494251235, 40.59514564845063], [-73.80389507006726, 40.594990875367245], [-73.80331453729063, 40.59517956193947], [-73.80368468695728, 40.59519779018381], [-73.80486462646938, 40.5967336283515], [-73.80513406252756, 40.59660758897049], [-73.80524832538248, 40.596895032613546], [-73.80297943325748, 40.598844304553005], [-73.79233256449508, 40.59995439142583], [-73.78635332811808, 40.60319465903842], [-73.79034006550985, 40.59919167636005], [-73.79102536652763, 40.595527157215926], [-73.78973901889819, 40.59474366855456], [-73.7890682912148, 40.598019927382616], [-73.78350560905308, 40.60256343874268], [-73.78366696292244, 40.60532443693426], [-73.77927015444938, 40.60930736180752], [-73.7763584369479, 40.609655838242304]]]}}, {\&quot;id\&quot;: \&quot;117\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 127, \&quot;OBJECTID\&quot;: 118, \&quot;Shape_Leng\&quot;: 0.243966217692, \&quot;Shape_Area\&quot;: 0.00182693922711, \&quot;zone\&quot;: \&quot;Heartland Village/Todt Hill\&quot;, \&quot;LocationID\&quot;: 118, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.10834417899996, 40.610234766999945], [-74.09555829799993, 40.61062477799989], [-74.09045495899996, 40.60909452599991], [-74.09271908099993, 40.60636222199992], [-74.09192827899989, 40.598504050999914], [-74.10041498999992, 40.59334309299988], [-74.10149482299994, 40.58934426099992], [-74.10790851599995, 40.58368563799992], [-74.1212571389999, 40.575254893999904], [-74.12708814699995, 40.57636910599994], [-74.13261022999991, 40.573530162999894], [-74.14418588199999, 40.57203740999988], [-74.14438744999991, 40.56970610099991], [-74.14789716899996, 40.57088728599995], [-74.15725974199995, 40.562553318999896], [-74.1649414939999, 40.56011179699991], [-74.16982582400001, 40.56109042099991], [-74.16842916199994, 40.58649792299988], [-74.16189940599996, 40.59529877099993], [-74.1481980769999, 40.588599680999934], [-74.13864458599996, 40.58906080499989], [-74.13091909399999, 40.598855047999905], [-74.12506115499997, 40.59818005599987], [-74.12059546299996, 40.601809757999874], [-74.11487058399989, 40.602136659999935], [-74.11742466500002, 40.609289008999916], [-74.12135179599994, 40.609765267999926], [-74.11508745399988, 40.61120943099993], [-74.10834417899996, 40.610234766999945]]]}}, {\&quot;id\&quot;: \&quot;118\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4599, \&quot;OBJECTID\&quot;: 119, \&quot;Shape_Leng\&quot;: 0.0835070355744, \&quot;Shape_Area\&quot;: 0.000185779447534, \&quot;zone\&quot;: \&quot;Highbridge\&quot;, \&quot;LocationID\&quot;: 119, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9247831879999, 40.84475266499989], [-73.91729224999992, 40.84510993999991], [-73.91794965199988, 40.842229570999976], [-73.91618344399991, 40.84233489999991], [-73.92802724899998, 40.82971953899987], [-73.93307251084072, 40.828156152518105], [-73.93314306709256, 40.83519412761651], [-73.92861574822331, 40.844676865029925], [-73.9247831879999, 40.84475266499989]]]}}, {\&quot;id\&quot;: \&quot;119\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 973, \&quot;OBJECTID\&quot;: 120, \&quot;Shape_Leng\&quot;: 0.0832612702158, \&quot;Shape_Area\&quot;: 9.31462821313e-05, \&quot;zone\&quot;: \&quot;Highbridge Park\&quot;, \&quot;LocationID\&quot;: 120, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92295449499989, 40.85885076199988], [-73.92227873064479, 40.85565498884376], [-73.93436121591056, 40.83620061961779], [-73.94034643299983, 40.8304578419999], [-73.93505508799984, 40.8393332359999], [-73.93556697199989, 40.841712527999924], [-73.92707982300001, 40.851432342999885], [-73.92466977999999, 40.856982610999886], [-73.92709951599986, 40.85827552099992], [-73.92499818399988, 40.86146373799991], [-73.92295449499989, 40.85885076199988]]]}}, {\&quot;id\&quot;: \&quot;120\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1606, \&quot;OBJECTID\&quot;: 121, \&quot;Shape_Leng\&quot;: 0.0969153373445, \&quot;Shape_Area\&quot;: 0.000384563286473, \&quot;zone\&quot;: \&quot;Hillcrest/Pomonok\&quot;, \&quot;LocationID\&quot;: 121, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79911195699995, 40.738206139999875], [-73.79584803299987, 40.7380746799999], [-73.79037661699995, 40.720103723999934], [-73.80780927699995, 40.715853895999906], [-73.80904032699983, 40.71991160499987], [-73.80452680199981, 40.721462545999884], [-73.80487958299983, 40.725049592999895], [-73.80652142399995, 40.7248730639999], [-73.80717042299993, 40.72826913299987], [-73.8111179729999, 40.72781641599994], [-73.81074426599986, 40.72626511299991], [-73.81510024099985, 40.72854342299991], [-73.81504998799986, 40.73894313399992], [-73.79911195699995, 40.738206139999875]]]}}, {\&quot;id\&quot;: \&quot;121\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 957, \&quot;OBJECTID\&quot;: 122, \&quot;Shape_Leng\&quot;: 0.0665318439446, \&quot;Shape_Area\&quot;: 0.000226597104976, \&quot;zone\&quot;: \&quot;Hollis\&quot;, \&quot;LocationID\&quot;: 122, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.75725671499985, 40.71813860199992], [-73.75047058199985, 40.70563993099994], [-73.76612489399999, 40.702334485999884], [-73.76825969099993, 40.709526367999956], [-73.771724447, 40.71031681899991], [-73.76943987099992, 40.711976892999864], [-73.77192122100001, 40.71568504499992], [-73.76664095199988, 40.717646613999875], [-73.765714472, 40.71639337899988], [-73.75832728699997, 40.71958208899985], [-73.75725671499985, 40.71813860199992]]]}}, {\&quot;id\&quot;: \&quot;122\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1881, \&quot;OBJECTID\&quot;: 123, \&quot;Shape_Leng\&quot;: 0.0834211389387, \&quot;Shape_Area\&quot;: 0.000296445173366, \&quot;zone\&quot;: \&quot;Homecrest\&quot;, \&quot;LocationID\&quot;: 123, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96285973999984, 40.61254948599989], [-73.96237947799978, 40.609986373999966], [-73.95859278499987, 40.61040303099988], [-73.95619313699986, 40.58776226899994], [-73.9603495359999, 40.58730628599994], [-73.9606798409999, 40.59159758199995], [-73.97115101799994, 40.59044244399989], [-73.97299433999983, 40.6088141419999], [-73.96429649899991, 40.60977642599992], [-73.96478112799986, 40.61233092199988], [-73.96285973999984, 40.61254948599989]]]}}, {\&quot;id\&quot;: \&quot;123\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1197, \&quot;OBJECTID\&quot;: 124, \&quot;Shape_Leng\&quot;: 0.127724410062, \&quot;Shape_Area\&quot;: 0.000754837821479, \&quot;zone\&quot;: \&quot;Howard Beach\&quot;, \&quot;LocationID\&quot;: 124, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.85096453700001, 40.671719510999885], [-73.83334819299995, 40.66677318699994], [-73.82859942399985, 40.657196972999884], [-73.82639242872236, 40.64832434880783], [-73.83133151403268, 40.65274755744263], [-73.82901417557953, 40.65610788445241], [-73.8317081441153, 40.65393117429689], [-73.83221698518575, 40.654460386292925], [-73.83149330103005, 40.65497982053967], [-73.83116100809627, 40.65591923373715], [-73.82937603410723, 40.65650633521598], [-73.82896778740296, 40.65720524792007], [-73.8291791973457, 40.65779977854427], [-73.83013028740389, 40.65840264372116], [-73.82970706838907, 40.658502513864484], [-73.82959986903019, 40.65865680691539], [-73.83014950104759, 40.6598086849573], [-73.83024427039376, 40.658349969348166], [-73.82909434825203, 40.65733421866331], [-73.83127112568108, 40.656003271494676], [-73.8318523847929, 40.65488503826691], [-73.83290309524602, 40.657483771623006], [-73.83194394578256, 40.65617142725338], [-73.832600363706, 40.65782659162732], [-73.83096907996668, 40.65823029417234], [-73.83338439472544, 40.65805185920798], [-73.83109184464118, 40.64848480675928], [-73.83561034795801, 40.64850568470053], [-73.8387360855594, 40.662454060021076], [-73.83978752612934, 40.660485998048], [-73.83592320073285, 40.645499790674954], [-73.84950699084165, 40.64413376567876], [-73.85183280737658, 40.64586005671262], [-73.85230349886227, 40.647771028550196], [-73.84939766406322, 40.65143487895031], [-73.85591932944749, 40.65130926166608], [-73.86136381950391, 40.65641475416531], [-73.85983363521494, 40.65697706322045], [-73.8596355866937, 40.65845777205655], [-73.86124943398261, 40.65872091007865], [-73.85976839588899, 40.65828193634574], [-73.86087597607579, 40.65690816207006], [-73.86317083299996, 40.65827651199994], [-73.85761052799985, 40.660108355999924], [-73.85842950899992, 40.66345335999987], [-73.85568461199988, 40.66386749199993], [-73.85763323099987, 40.67165619399989], [-73.86038937900003, 40.67126877499985], [-73.86131863599985, 40.6750212689999], [-73.85096453700001, 40.671719510999885]]], [[[-73.83032725337058, 40.65513280580328], [-73.83026601851493, 40.65542864678473], [-73.82988919856028, 40.655522822584075], [-73.82994556435834, 40.655424494353], [-73.83032725337058, 40.65513280580328]]], [[[-73.85975533686633, 40.65410417609493], [-73.86048308199986, 40.65465892799988], [-73.86098917376947, 40.65520976705256], [-73.85979242750741, 40.65447615737696], [-73.85975533686633, 40.65410417609493]]], [[[-73.85898002989568, 40.65267545791771], [-73.85975533686633, 40.65410417609493], [-73.85941022942576, 40.65386473792502], [-73.85898002989568, 40.65267545791771]]], [[[-73.85898002989568, 40.65267545791771], [-73.85731941515513, 40.65123709900783], [-73.85695870295893, 40.65058737348713], [-73.85898002989568, 40.65267545791771]]]]}}, {\&quot;id\&quot;: \&quot;124\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 893114, \&quot;OBJECTID\&quot;: 125, \&quot;Shape_Leng\&quot;: 0.0497322121757, \&quot;Shape_Area\&quot;: 7.64293209892e-05, \&quot;zone\&quot;: \&quot;Hudson Sq\&quot;, \&quot;LocationID\&quot;: 125, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00269315099992, 40.72831405499989], [-74.0053098609999, 40.721824191999865], [-74.0108123829999, 40.72578980299994], [-74.0119643202455, 40.72432986461987], [-74.01165326569942, 40.725871761851344], [-74.01520426531133, 40.726361949379644], [-74.011542018976, 40.72644734692706], [-74.01067264999996, 40.72911266599987], [-74.00269315099992, 40.72831405499989]]]}}, {\&quot;id\&quot;: \&quot;125\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1579, \&quot;OBJECTID\&quot;: 126, \&quot;Shape_Leng\&quot;: 0.12994872606, \&quot;Shape_Area\&quot;: 0.0007032738273, \&quot;zone\&quot;: \&quot;Hunts Point\&quot;, \&quot;LocationID\&quot;: 126, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88615037899993, 40.82730567799994], [-73.88753429599987, 40.82250933899995], [-73.8843985489999, 40.822965575999866], [-73.88244779599998, 40.81926832299992], [-73.87056806927927, 40.81208731762241], [-73.86811219140058, 40.806751832831786], [-73.87234684998835, 40.800174763010446], [-73.87814218819929, 40.801319290306495], [-73.87843295513449, 40.80270273469493], [-73.8850517233671, 40.80213090679797], [-73.89197929534278, 40.80638470897619], [-73.89128402413917, 40.80497628189916], [-73.89509836487399, 40.80686363917353], [-73.8952796287401, 40.805766184067906], [-73.90222284749719, 40.80494811309474], [-73.90307457199998, 40.80988061199988], [-73.89542858799986, 40.81584467199988], [-73.8970446669999, 40.8168018599999], [-73.89283653100001, 40.820974054999965], [-73.8958813589999, 40.82099257499987], [-73.89586019599982, 40.82263104599987], [-73.89320004999998, 40.82400818299992], [-73.89487088500002, 40.82393727199992], [-73.89483522899992, 40.82624684099993], [-73.88615037899993, 40.82730567799994]]]}}, {\&quot;id\&quot;: \&quot;126\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 15780, \&quot;OBJECTID\&quot;: 127, \&quot;Shape_Leng\&quot;: 0.0600188855815, \&quot;Shape_Area\&quot;: 0.000163195647796, \&quot;zone\&quot;: \&quot;Inwood\&quot;, \&quot;LocationID\&quot;: 127, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.911224294065, 40.87302771883775], [-73.91043824727869, 40.871377478551786], [-73.91254775130287, 40.866514943004354], [-73.91589911645785, 40.86430803808506], [-73.91538673051149, 40.863084384200725], [-73.91950213660932, 40.85879113379047], [-73.92159014848224, 40.86007280002688], [-73.92035142875443, 40.858195220619145], [-73.92282845999992, 40.8568514089999], [-73.92872203199994, 40.86674266299988], [-73.92135975499993, 40.869551853999894], [-73.91845930899993, 40.873022052999936], [-73.9140098549999, 40.871160593999946], [-73.911224294065, 40.87302771883775]]], [[[-73.92151894059094, 40.85660117062315], [-73.92229611007241, 40.855663835114505], [-73.92234459387058, 40.85568233590737], [-73.92169841904696, 40.85667230185494], [-73.92151894059094, 40.85660117062315]]]]}}, {\&quot;id\&quot;: \&quot;127\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 731, \&quot;OBJECTID\&quot;: 128, \&quot;Shape_Leng\&quot;: 0.0702090290681, \&quot;Shape_Area\&quot;: 0.000207405982869, \&quot;zone\&quot;: \&quot;Inwood Hill Park\&quot;, \&quot;LocationID\&quot;: 128, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.92359742020389, 40.878898712992644], [-73.92363695289211, 40.87881535593209], [-73.92367919311681, 40.878826074498626], [-73.92362973975199, 40.87896394312155], [-73.92359742020389, 40.878898712992644]]], [[[-73.9264055692112, 40.87762147653741], [-73.92258387170895, 40.87692253928837], [-73.921169296781, 40.87306939228805], [-73.91978312944534, 40.87360369743557], [-73.92090325515422, 40.87546616638258], [-73.91855365026461, 40.873180588115396], [-73.9175772988473, 40.87454867854727], [-73.91154281116535, 40.873253706161705], [-73.9140098549999, 40.871160593999946], [-73.91845930899993, 40.873022052999936], [-73.92135975499993, 40.869551853999894], [-73.92872203199994, 40.86674266299988], [-73.93220600531866, 40.870096445104515], [-73.9264055692112, 40.87762147653741]]]]}}, {\&quot;id\&quot;: \&quot;131\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3104157, \&quot;OBJECTID\&quot;: 132, \&quot;Shape_Leng\&quot;: 0.24547851707, \&quot;Shape_Area\&quot;: 0.00203830095472, \&quot;zone\&quot;: \&quot;JFK Airport\&quot;, \&quot;LocationID\&quot;: 132, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.8250346749999, 40.663580133999844], [-73.81496922499986, 40.66247266799991], [-73.80072889200001, 40.66526937699988], [-73.780755286, 40.66240660199992], [-73.7541108669999, 40.648697664999915], [-73.75522386899995, 40.64744446899989], [-73.7474246205621, 40.6413764680137], [-73.74849297657127, 40.63567172844184], [-73.7650077554797, 40.62941398784963], [-73.77077016777163, 40.62003118215498], [-73.77082069703974, 40.62328299797239], [-73.77704080084247, 40.62766646976843], [-73.77999420781757, 40.62668929803533], [-73.78419483298926, 40.6208926699551], [-73.78949653224412, 40.62274664610792], [-73.78264543417806, 40.630247968544396], [-73.79076956011139, 40.63386374895698], [-73.79222318018806, 40.63589008813999], [-73.81830607819735, 40.64638698303703], [-73.82182513624882, 40.649899795874894], [-73.82348381110747, 40.65536991271862], [-73.82227996040434, 40.659425007931176], [-73.8186953155868, 40.661105051055245], [-73.81143921922407, 40.66074562606795], [-73.81867189288894, 40.66213298725428], [-73.82338324351308, 40.6602057470252], [-73.82498070378553, 40.65543197118367], [-73.82290717700891, 40.64809344600474], [-73.82614483059669, 40.65008184094253], [-73.82639242822242, 40.64832434880782], [-73.82859942399985, 40.657196972999884], [-73.832705339, 40.665405772999854], [-73.8250346749999, 40.663580133999844]]], [[[-73.74661040472857, 40.638724973885545], [-73.74653979797041, 40.63871136266965], [-73.74654132522075, 40.63869678799164], [-73.74664302817305, 40.638662249807076], [-73.74661040472857, 40.638724973885545]]], [[[-73.74693721618013, 40.63755610186007], [-73.74694320619099, 40.637529202088494], [-73.74704913170525, 40.63754513439954], [-73.74704316342154, 40.637566426459216], [-73.74693721618013, 40.63755610186007]]], [[[-73.74712154262465, 40.63716227570799], [-73.74706485671244, 40.637160999268374], [-73.74699391228548, 40.63715064484292], [-73.74715781614569, 40.637060524028364], [-73.74712154262465, 40.63716227570799]]]]}}, {\&quot;id\&quot;: \&quot;128\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 95995, \&quot;OBJECTID\&quot;: 129, \&quot;Shape_Leng\&quot;: 0.0932727273403, \&quot;Shape_Area\&quot;: 0.00047398833179, \&quot;zone\&quot;: \&quot;Jackson Heights\&quot;, \&quot;LocationID\&quot;: 129, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87586503899996, 40.76605165399989], [-73.87513874300004, 40.756633815999905], [-73.87365721799983, 40.756803485999946], [-73.86942458599987, 40.74915685199991], [-73.89175048799984, 40.74681172799989], [-73.89624245599988, 40.74871954499987], [-73.89984592699983, 40.75756215299985], [-73.89437624799997, 40.7655265849999], [-73.87608949699984, 40.77153690299987], [-73.87586503899996, 40.76605165399989]]]}}, {\&quot;id\&quot;: \&quot;129\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 13144, \&quot;OBJECTID\&quot;: 130, \&quot;Shape_Leng\&quot;: 0.142028320665, \&quot;Shape_Area\&quot;: 0.000468322514327, \&quot;zone\&quot;: \&quot;Jamaica\&quot;, \&quot;LocationID\&quot;: 130, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76962552399995, 40.71178631999993], [-73.771724447, 40.71031681899991], [-73.76844546499984, 40.709637026999886], [-73.77555451099995, 40.70607083499987], [-73.77230768699997, 40.70057150699989], [-73.77395659499993, 40.69980578099988], [-73.78034491200003, 40.70541241699986], [-73.78256582599995, 40.70542486399989], [-73.79239170299988, 40.7021665299999], [-73.79260506799987, 40.70043209999988], [-73.80642479399984, 40.690873857999904], [-73.80890216900004, 40.69256434899993], [-73.81063298299996, 40.69194738299988], [-73.81637824499992, 40.70245196399987], [-73.81152856899989, 40.70227287499991], [-73.81201248599983, 40.70594494499993], [-73.80694856299993, 40.70736709999989], [-73.8056477309999, 40.70467172799994], [-73.80165725599993, 40.705761474999846], [-73.80302414799988, 40.70813965699997], [-73.79870150699992, 40.71066337699988], [-73.79776810199988, 40.7091431879999], [-73.77192121999992, 40.715685043999905], [-73.76962552399995, 40.71178631999993]]]}}, {\&quot;id\&quot;: \&quot;1\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 132, \&quot;OBJECTID\&quot;: 2, \&quot;Shape_Leng\&quot;: 0.43346966679, \&quot;Shape_Area\&quot;: 0.00486634037837, \&quot;zone\&quot;: \&quot;Jamaica Bay\&quot;, \&quot;LocationID\&quot;: 2, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.82337597260663, 40.63898704717671], [-73.82107505533321, 40.62973377456623], [-73.81611483429545, 40.624604655173044], [-73.81891708039825, 40.62309026716333], [-73.81571468044605, 40.62148955151693], [-73.81777429834523, 40.61750112169565], [-73.81652681189122, 40.61494700958006], [-73.82141601599992, 40.615054762999925], [-73.8238246859766, 40.61149866495507], [-73.82575322105271, 40.614192081540075], [-73.83776702143372, 40.61552223141874], [-73.83496222645587, 40.61778030881177], [-73.83514355859735, 40.62548708279667], [-73.83342230809954, 40.626781983462095], [-73.83464377224975, 40.62742707942435], [-73.83115393179625, 40.63256052752952], [-73.83340607979225, 40.63850135589897], [-73.82591657926903, 40.63574741296666], [-73.82443032497055, 40.6362165210408], [-73.82419327293158, 40.63995327448778], [-73.82337597260663, 40.63898704717671]]], [[[-73.84721834832125, 40.63196568670605], [-73.8485899664393, 40.63013198680654], [-73.8585583634798, 40.63045828819559], [-73.8561374187591, 40.63508154601468], [-73.84667914840234, 40.63873171175714], [-73.84352007697278, 40.636503685327924], [-73.84721834832125, 40.63196568670605]]], [[[-73.79577948747226, 40.63215847659964], [-73.79811872226199, 40.6310375092611], [-73.79827615415297, 40.63125217936581], [-73.7907928429953, 40.63428204310243], [-73.79577948747226, 40.63215847659964]]], [[[-73.83623731597828, 40.631110861231726], [-73.84110205447426, 40.62455643651514], [-73.84445711462239, 40.62984779443998], [-73.83765174362401, 40.63283973295598], [-73.83623731597828, 40.631110861231726]]], [[[-73.81307233892618, 40.62926109964263], [-73.81352502122876, 40.62730617268596], [-73.81258556038132, 40.628371916183724], [-73.81129432207656, 40.624703779000406], [-73.81089990481607, 40.61621847134095], [-73.81679073502552, 40.62634891812118], [-73.81382899493154, 40.62613507764411], [-73.81627026043981, 40.62714580591711], [-73.8173057692762, 40.63062197379782], [-73.81506788441455, 40.63116405857793], [-73.81307233892618, 40.62926109964263]]], [[[-73.84734350666976, 40.62909473971626], [-73.84984630167418, 40.62622449074592], [-73.8472783772798, 40.626621669791945], [-73.84358010755503, 40.623178164184395], [-73.86364988794934, 40.617878773642374], [-73.86404106276488, 40.61920759671402], [-73.86151825485233, 40.619049218399226], [-73.86102883383386, 40.624138986994076], [-73.86347880947007, 40.6233886093158], [-73.86334955670225, 40.62592490877777], [-73.86041082270874, 40.62516691297755], [-73.8565055097758, 40.629097353726586], [-73.8539654419115, 40.62761094389788], [-73.85436931062769, 40.62881767654389], [-73.84734350666976, 40.62909473971626]]], [[[-73.87084603194215, 40.61696742645758], [-73.8782477932424, 40.615444608331536], [-73.87481386865049, 40.62358718918363], [-73.86684384142526, 40.62782924286026], [-73.86498193495926, 40.625660706041025], [-73.86626127665735, 40.618456348023955], [-73.87084603194215, 40.61696742645758]]], [[[-73.79783533398513, 40.627408716571516], [-73.79566256726108, 40.626114004327796], [-73.79921493427759, 40.6240847129885], [-73.7936292748135, 40.62515647619494], [-73.79809093107174, 40.62306294824432], [-73.79992057632684, 40.61857524016598], [-73.80172498640165, 40.61996700873167], [-73.80128049504093, 40.615879839747535], [-73.80270343867807, 40.61358065232171], [-73.80508906012292, 40.61343256041943], [-73.80476592616557, 40.61580099137086], [-73.80764116896117, 40.62119965469225], [-73.80698502381061, 40.623871998829976], [-73.8001117714566, 40.626927441987085], [-73.80092841565032, 40.627524104895656], [-73.79783533398513, 40.627408716571516]]], [[[-73.77348616522504, 40.625085118163526], [-73.77381024409397, 40.624925596730954], [-73.77383258726536, 40.624944848253456], [-73.77348560409436, 40.62511314810922], [-73.77348616522504, 40.625085118163526]]], [[[-73.77172760292548, 40.62358502801516], [-73.7720313143135, 40.62299121290296], [-73.77218824028017, 40.622995793795134], [-73.77511891254433, 40.619233847487365], [-73.77518045935567, 40.61926471788484], [-73.77172760292548, 40.62358502801516]]], [[[-73.79162058913477, 40.62231334348308], [-73.78419483298926, 40.6208926699551], [-73.78446087067887, 40.617027835129704], [-73.78070887195283, 40.614026809005864], [-73.79139721011913, 40.60761085524994], [-73.79480633875043, 40.61037836048121], [-73.80080125919478, 40.611933904481596], [-73.7946062540462, 40.62257170055433], [-73.79162058913477, 40.62231334348308]]], [[[-73.76670827781236, 40.61491086618553], [-73.76825288003378, 40.614877725169315], [-73.77397692018825, 40.61600357567147], [-73.76873454755717, 40.62090086822023], [-73.76745926975256, 40.620511322031255], [-73.76670827781236, 40.61491086618553]]], [[[-73.84304421296773, 40.617737696390435], [-73.84454193473684, 40.614867921675135], [-73.8409994253963, 40.613029126216134], [-73.83825667290532, 40.613847216216406], [-73.8407944240835, 40.60564326638265], [-73.8471480968766, 40.60361424219198], [-73.85179402215192, 40.60689716858368], [-73.84779013405834, 40.60923538526278], [-73.84614804513843, 40.61772842036632], [-73.84304421296773, 40.617737696390435]]], [[[-73.85523067631884, 40.61613145335797], [-73.85530325465119, 40.6131454135728], [-73.84973986306498, 40.61515605814331], [-73.85010857555366, 40.61021219334599], [-73.8551559228834, 40.606120513001486], [-73.85708638173246, 40.60646824293355], [-73.85924855452187, 40.61125483087423], [-73.85648360749232, 40.61319069486381], [-73.85858056782772, 40.61691708722184], [-73.85523067631884, 40.61613145335797]]], [[[-73.814090115668, 40.614466920099765], [-73.81503638494628, 40.6129762137494], [-73.81615626666235, 40.61294211575494], [-73.8164315038978, 40.614282334964926], [-73.814090115668, 40.614466920099765]]], [[[-73.81496830662114, 40.61042065495561], [-73.81520720849484, 40.60981673379666], [-73.81559858789666, 40.61067251616471], [-73.81450261566708, 40.61105847350542], [-73.81496830662114, 40.61042065495561]]], [[[-73.86966442958492, 40.606540123412906], [-73.87109330768071, 40.604694173994694], [-73.87300122724774, 40.61055545845987], [-73.8710387011171, 40.60972358252655], [-73.86966442958492, 40.606540123412906]]], [[[-73.79420172624032, 40.607730675613354], [-73.79352152715475, 40.60632759139594], [-73.79509002319158, 40.607271060105596], [-73.79424799033224, 40.60590038003164], [-73.79696327795033, 40.60411784876779], [-73.80428530678597, 40.604519279530564], [-73.80520676583323, 40.60673953810017], [-73.80159206744115, 40.61023096250127], [-73.79420172624032, 40.607730675613354]]], [[[-73.83244207358176, 40.605929449536745], [-73.83587601623029, 40.605636907545566], [-73.83610156628845, 40.60736279382329], [-73.83252192275347, 40.610384993603816], [-73.83032947905777, 40.60848787991649], [-73.83045815392722, 40.606669201403214], [-73.83244207358176, 40.605929449536745]]], [[[-73.82607472604538, 40.60843779954612], [-73.82771104235977, 40.608398668130704], [-73.82805077260065, 40.61004629686527], [-73.82688326414805, 40.6095966780694], [-73.82607472604538, 40.60843779954612]]], [[[-73.86702399475149, 40.60806817876942], [-73.86874317559169, 40.60703517927931], [-73.86868468826752, 40.608241158183915], [-73.86702399475149, 40.60806817876942]]], [[[-73.82718282107048, 40.607919778091194], [-73.82590092720767, 40.60646593064943], [-73.82861671457653, 40.60583848413761], [-73.82815085191197, 40.60795028983291], [-73.82718282107048, 40.607919778091194]]], [[[-73.81569926225602, 40.6064570673649], [-73.81546066483351, 40.60642813700742], [-73.81552816722274, 40.606163069945154], [-73.81552536723665, 40.60640738028192], [-73.81569926225602, 40.6064570673649]]], [[[-73.81339665223344, 40.60436407224534], [-73.80986333857152, 40.60189579000784], [-73.81157550345523, 40.59814119925956], [-73.81501471568424, 40.60205629156354], [-73.81339665223344, 40.60436407224534]]], [[[-73.86702905185578, 40.603743388853935], [-73.8676819415421, 40.603070766677334], [-73.8683080846461, 40.603139161146146], [-73.86793505372694, 40.60396113545295], [-73.86702905185578, 40.603743388853935]]], [[[-73.85243335807012, 40.59733339779527], [-73.86044420534076, 40.596471905596275], [-73.86335999147606, 40.600322202771196], [-73.86112814224546, 40.60255033107426], [-73.85482595782968, 40.601867195353634], [-73.85076748001559, 40.598839443837406], [-73.85243335807012, 40.59733339779527]]], [[[-73.87019491489939, 40.598996405901886], [-73.87108141811476, 40.598901147470094], [-73.87049411914771, 40.602604446204595], [-73.87026280564918, 40.60168122225861], [-73.87019491489939, 40.598996405901886]]], [[[-73.8231174097477, 40.60007949252535], [-73.82315293179705, 40.599976662824794], [-73.82317356168161, 40.59997800515576], [-73.82318015964296, 40.60008384902813], [-73.8231174097477, 40.60007949252535]]], [[[-73.82292757811203, 40.60006142816309], [-73.822978576463, 40.600043707224835], [-73.82303195183424, 40.59993051694214], [-73.82304007849375, 40.60006807478574], [-73.82292757811203, 40.60006142816309]]], [[[-73.82445629476595, 40.59911583868227], [-73.82395871079126, 40.59887689683851], [-73.82477088992478, 40.5983918438742], [-73.82453084258555, 40.59911949829181], [-73.82445629476595, 40.59911583868227]]], [[[-73.86952707548932, 40.598713750354406], [-73.86967070711478, 40.59668856362211], [-73.87020899836229, 40.59695423278937], [-73.86952707548932, 40.598713750354406]]], [[[-73.83668274106707, 40.5949466970158], [-73.8325749810638, 40.592118209113956], [-73.83422777067327, 40.59137381382269], [-73.83253569485043, 40.59021893579835], [-73.83495422767699, 40.589728155618005], [-73.83347866645357, 40.589368748710896], [-73.83719541135855, 40.58969911736292], [-73.8398907019092, 40.59280021149386], [-73.84385894083933, 40.59342531196059], [-73.83902964248091, 40.59625348474866], [-73.83668274106707, 40.5949466970158]]], [[[-73.86706149472118, 40.5820879767934], [-73.87000313642912, 40.582636614815954], [-73.87115922675414, 40.5868738879673], [-73.86635052164085, 40.591892676564676], [-73.86327273492819, 40.59090807569255], [-73.86125299377363, 40.58798808592123], [-73.86327471071942, 40.58387684853184], [-73.86706149472118, 40.5820879767934]]]]}}, {\&quot;id\&quot;: \&quot;130\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1339, \&quot;OBJECTID\&quot;: 131, \&quot;Shape_Leng\&quot;: 0.116547120922, \&quot;Shape_Area\&quot;: 0.000423696152789, \&quot;zone\&quot;: \&quot;Jamaica Estates\&quot;, \&quot;LocationID\&quot;: 131, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.77732562899998, 40.722392700999926], [-73.76924074899993, 40.72590270099988], [-73.75669771299987, 40.7262287109999], [-73.7523343839998, 40.72026246099993], [-73.79303800099989, 40.71071107499988], [-73.79358570299998, 40.714128677999874], [-73.790302674, 40.7208914649999], [-73.79174472699992, 40.725788849999944], [-73.77757506899988, 40.73019327299987], [-73.7752338719998, 40.725237532999884], [-73.77803765999981, 40.723284268999855], [-73.77732562899998, 40.722392700999926]]]}}, {\&quot;id\&quot;: \&quot;132\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 9968, \&quot;OBJECTID\&quot;: 133, \&quot;Shape_Leng\&quot;: 0.065134863162, \&quot;Shape_Area\&quot;: 0.000157188987507, \&quot;zone\&quot;: \&quot;Kensington\&quot;, \&quot;LocationID\&quot;: 133, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97819074399992, 40.64752599199992], [-73.97777380600002, 40.645341876999964], [-73.974642245, 40.644813218999914], [-73.97084113799984, 40.64637857099989], [-73.96803868499985, 40.636650984999925], [-73.97029036199991, 40.63640634099988], [-73.96986869299992, 40.63419467499989], [-73.97604935699995, 40.63127590599986], [-73.9768886119999, 40.6356748619999], [-73.97911188699993, 40.63544038599991], [-73.98042057899988, 40.64238522699991], [-73.98299419199994, 40.64132499699987], [-73.98834986699991, 40.64456224399992], [-73.97819074399992, 40.64752599199992]]]}}, {\&quot;id\&quot;: \&quot;133\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 8060, \&quot;OBJECTID\&quot;: 134, \&quot;Shape_Leng\&quot;: 0.0695878223284, \&quot;Shape_Area\&quot;: 0.000202375182143, \&quot;zone\&quot;: \&quot;Kew Gardens\&quot;, \&quot;LocationID\&quot;: 134, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82288529599995, 40.71192805799993], [-73.81637824499992, 40.70245196399987], [-73.82245890399994, 40.70365553099989], [-73.83152109599999, 40.70138962899994], [-73.83460244999996, 40.70392746699988], [-73.83661882199989, 40.70342001799988], [-73.83809584699989, 40.70616458099993], [-73.83714702999997, 40.70795704599989], [-73.84314625299982, 40.70922345599992], [-73.82591945199992, 40.71598987599992], [-73.82288529599995, 40.71192805799993]]]}}, {\&quot;id\&quot;: \&quot;134\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3424, \&quot;OBJECTID\&quot;: 135, \&quot;Shape_Leng\&quot;: 0.121793045659, \&quot;Shape_Area\&quot;: 0.000467912240542, \&quot;zone\&quot;: \&quot;Kew Gardens Hills\&quot;, \&quot;LocationID\&quot;: 135, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83126834299986, 40.74026227599991], [-73.8294675199999, 40.73702448299991], [-73.8243501109999, 40.73975360599992], [-73.81497208299996, 40.738560715999874], [-73.81510024099985, 40.72854342299991], [-73.81074426599986, 40.72626511299991], [-73.8111179729999, 40.72781641599994], [-73.80717042299993, 40.72826913299987], [-73.80652142399995, 40.7248730639999], [-73.80487958299983, 40.725049592999895], [-73.80452680199981, 40.721462545999884], [-73.80904032699983, 40.71991160499987], [-73.80780927699995, 40.715853895999906], [-73.82018883899984, 40.71673522399984], [-73.81732944799997, 40.717660456999916], [-73.82531644999993, 40.71727569999994], [-73.8273090039999, 40.72464607699988], [-73.83073214599987, 40.72654932799991], [-73.83635625099998, 40.73500859199989], [-73.83564585599999, 40.738491010999894], [-73.83699037399995, 40.74209330099992], [-73.83586131899989, 40.743227984999926], [-73.83113122799989, 40.74233799999994], [-73.83126834299986, 40.74026227599991]]]}}, {\&quot;id\&quot;: \&quot;135\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2037, \&quot;OBJECTID\&quot;: 136, \&quot;Shape_Leng\&quot;: 0.0906287154122, \&quot;Shape_Area\&quot;: 0.000148524994129, \&quot;zone\&quot;: \&quot;Kingsbridge Heights\&quot;, \&quot;LocationID\&quot;: 136, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89996501599988, 40.86801852399986], [-73.89891854299988, 40.86965857399992], [-73.89656060599998, 40.868565199999935], [-73.90486847199993, 40.8586932249999], [-73.90777320599983, 40.85960753799984], [-73.90976165899988, 40.857182611999896], [-73.91328437100006, 40.859618600999916], [-73.90908822499988, 40.8623996959999], [-73.91422823999919, 40.862490790359615], [-73.91044282747865, 40.866527868551835], [-73.90746489699994, 40.87354735399985], [-73.90452070499992, 40.87249521099988], [-73.90318667499999, 40.86914899099988], [-73.89996501599988, 40.86801852399986]]]}}, {\&quot;id\&quot;: \&quot;136\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1860394, \&quot;OBJECTID\&quot;: 137, \&quot;Shape_Leng\&quot;: 0.0461076242707, \&quot;Shape_Area\&quot;: 0.000116455098947, \&quot;zone\&quot;: \&quot;Kips Bay\&quot;, \&quot;LocationID\&quot;: 137, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97219641647804, 40.74040257875022], [-73.97248994174741, 40.73580328010761], [-73.97446647047282, 40.736278456829886], [-73.9735447289197, 40.73494432655072], [-73.98266497499989, 40.73949733299987], [-73.97812378199983, 40.745727172999885], [-73.97167921200406, 40.74305446402989], [-73.97219641647804, 40.74040257875022]]]}}, {\&quot;id\&quot;: \&quot;137\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3515777, \&quot;OBJECTID\&quot;: 138, \&quot;Shape_Leng\&quot;: 0.107466933508, \&quot;Shape_Area\&quot;: 0.000536797294367, \&quot;zone\&quot;: \&quot;LaGuardia Airport\&quot;, \&quot;LocationID\&quot;: 138, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.8712485624251, 40.78603815125499], [-73.86918113468879, 40.78594348978492], [-73.86847981674143, 40.78369082919537], [-73.87255732673727, 40.78082112154256], [-73.85505106271819, 40.772195389989086], [-73.8582051105021, 40.77032345647716], [-73.85624565746174, 40.768885714198944], [-73.86268864176631, 40.76687591050486], [-73.86043337809801, 40.76386888243776], [-73.86728193799998, 40.76965000299989], [-73.87223577699984, 40.77169565899993], [-73.87743339799992, 40.77120025499991], [-73.88770661799987, 40.76683859799995], [-73.88945486901865, 40.77353295106357], [-73.88391627963797, 40.774132606591536], [-73.88493466381185, 40.77993691280691], [-73.87870562518874, 40.78058590995002], [-73.878858374856, 40.78239817868118], [-73.87974777853563, 40.782836564207], [-73.8797016367226, 40.78288281807235], [-73.8751575489337, 40.781509449653285], [-73.8712485624251, 40.78603815125499]]], [[[-73.8728719590193, 40.785975027902346], [-73.87282839783694, 40.78595446173833], [-73.8727740594054, 40.78594192145881], [-73.87280920016116, 40.78590310909999], [-73.8728719590193, 40.785975027902346]]], [[[-73.89008921683674, 40.77362643576237], [-73.89034195999996, 40.77323760499998], [-73.89183244902246, 40.77488019994431], [-73.89017369508576, 40.77785081277782], [-73.89008921683674, 40.77362643576237]]]]}}, {\&quot;id\&quot;: \&quot;138\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 323, \&quot;OBJECTID\&quot;: 139, \&quot;Shape_Leng\&quot;: 0.0932997884483, \&quot;Shape_Area\&quot;: 0.000446669880154, \&quot;zone\&quot;: \&quot;Laurelton\&quot;, \&quot;LocationID\&quot;: 139, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.74125253099989, 40.68745783899989], [-73.72718272499995, 40.68359732999987], [-73.74117817299991, 40.666402953999885], [-73.75763129599993, 40.66645115699992], [-73.75636239300002, 40.67242923699999], [-73.75857198899986, 40.67263733099987], [-73.76031463999993, 40.67510997099984], [-73.75576169199995, 40.67588590899988], [-73.747551754, 40.689347336999944], [-73.74125253099989, 40.68745783899989]]]}}, {\&quot;id\&quot;: \&quot;139\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2490848, \&quot;OBJECTID\&quot;: 140, \&quot;Shape_Leng\&quot;: 0.0475842911325, \&quot;Shape_Area\&quot;: 0.000114203907779, \&quot;zone\&quot;: \&quot;Lenox Hill East\&quot;, \&quot;LocationID\&quot;: 140, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95854329689507, 40.758495622967885], [-73.96196573699997, 40.759619460999865], [-73.95268514999995, 40.772339404999926], [-73.9474897547817, 40.77011515400953], [-73.95854329689507, 40.758495622967885]]]}}, {\&quot;id\&quot;: \&quot;140\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3383595, \&quot;OBJECTID\&quot;: 141, \&quot;Shape_Leng\&quot;: 0.0415144638712, \&quot;Shape_Area\&quot;: 7.66545579019e-05, \&quot;zone\&quot;: \&quot;Lenox Hill West\&quot;, \&quot;LocationID\&quot;: 141, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96177668399997, 40.75987971599993], [-73.9665833839999, 40.76155093499988], [-73.95729409999986, 40.7742835549999], [-73.95268514999995, 40.772339404999926], [-73.96177668399997, 40.75987971599993]]]}}, {\&quot;id\&quot;: \&quot;141\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4095043, \&quot;OBJECTID\&quot;: 142, \&quot;Shape_Leng\&quot;: 0.0381758942321, \&quot;Shape_Area\&quot;: 7.56537920738e-05, \&quot;zone\&quot;: \&quot;Lincoln Square East\&quot;, \&quot;LocationID\&quot;: 142, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98147898799989, 40.7677250589999], [-73.98806289599996, 40.769790799999925], [-73.980673654, 40.77992518199991], [-73.97499744000007, 40.77753254599988], [-73.98147898799989, 40.7677250589999]]]}}, {\&quot;id\&quot;: \&quot;142\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1480265, \&quot;OBJECTID\&quot;: 143, \&quot;Shape_Leng\&quot;: 0.0541798538849, \&quot;Shape_Area\&quot;: 0.00015109426901, \&quot;zone\&quot;: \&quot;Lincoln Square West\&quot;, \&quot;LocationID\&quot;: 143, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.981627874, 40.780328934999936], [-73.980673654, 40.77992518199991], [-73.98806289599996, 40.769790799999925], [-73.99624065194922, 40.77378979119886], [-73.99393587681126, 40.773179512586104], [-73.98886861739992, 40.779692922911416], [-73.9915510592274, 40.779574821437386], [-73.98812746184332, 40.78140179672363], [-73.981627874, 40.780328934999936]]]}}, {\&quot;id\&quot;: \&quot;143\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1793176, \&quot;OBJECTID\&quot;: 144, \&quot;Shape_Leng\&quot;: 0.0276201668505, \&quot;Shape_Area\&quot;: 4.74789670369e-05, \&quot;zone\&quot;: \&quot;Little Italy/NoLiTa\&quot;, \&quot;LocationID\&quot;: 144, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99580912300002, 40.71664465899988], [-74.00188406299992, 40.71939757099991], [-73.9967717579999, 40.7254319439999], [-73.99260322299989, 40.724136449999925], [-73.99580912300002, 40.71664465899988]]]}}, {\&quot;id\&quot;: \&quot;144\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 216874, \&quot;OBJECTID\&quot;: 145, \&quot;Shape_Leng\&quot;: 0.114313844981, \&quot;Shape_Area\&quot;: 0.000346641733797, \&quot;zone\&quot;: \&quot;Long Island City/Hunters Point\&quot;, \&quot;LocationID\&quot;: 145, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94345411699997, 40.75205360799992], [-73.93663681899982, 40.748204093999895], [-73.94419561599983, 40.742882145999914], [-73.93726110699994, 40.745176490999896], [-73.9386966449998, 40.73814081699989], [-73.94140886345744, 40.73929957085316], [-73.93866991753185, 40.74253408202486], [-73.9400192297566, 40.74320827221074], [-73.94159470030033, 40.73986412616895], [-73.94548236590111, 40.738207031293705], [-73.95380883920839, 40.73982029297784], [-73.96256114655104, 40.73868995735329], [-73.95978468552276, 40.74349771658391], [-73.96064863700711, 40.74413031761407], [-73.9587753700448, 40.74455559986341], [-73.95965229755977, 40.745216588173435], [-73.95849389303115, 40.74498786491623], [-73.9567945329049, 40.748839516955584], [-73.95318382492853, 40.74773481196097], [-73.9564856879466, 40.74911169015581], [-73.95080763809156, 40.75526368005708], [-73.94345411699997, 40.75205360799992]]]}}, {\&quot;id\&quot;: \&quot;145\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 155778, \&quot;OBJECTID\&quot;: 146, \&quot;Shape_Leng\&quot;: 0.0471405215717, \&quot;Shape_Area\&quot;: 0.000104638923425, \&quot;zone\&quot;: \&quot;Long Island City/Queens Plaza\&quot;, \&quot;LocationID\&quot;: 146, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93675697199996, 40.74914697199991], [-73.944052652, 40.75231325999992], [-73.93679091699993, 40.75988288099991], [-73.92415699999985, 40.753961141999845], [-73.92562743799989, 40.752137243999904], [-73.93383269399993, 40.7516047019999], [-73.93675697199996, 40.74914697199991]]]}}, {\&quot;id\&quot;: \&quot;146\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1131, \&quot;OBJECTID\&quot;: 147, \&quot;Shape_Leng\&quot;: 0.0587654949268, \&quot;Shape_Area\&quot;: 0.000106418172757, \&quot;zone\&quot;: \&quot;Longwood\&quot;, \&quot;LocationID\&quot;: 147, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89515277899991, 40.82783428999991], [-73.89487088500002, 40.82393727199992], [-73.89320004999998, 40.82400818299992], [-73.89586019599982, 40.82263104599987], [-73.8958813589999, 40.82099257499987], [-73.89290156199988, 40.82081122299989], [-73.8970446669999, 40.8168018599999], [-73.89542858799986, 40.81584467199988], [-73.90307457199998, 40.80988061199988], [-73.9044655149999, 40.81228195999994], [-73.9006114109999, 40.822108807999875], [-73.90198758599993, 40.82244042299992], [-73.90093510699997, 40.82792810199992], [-73.89515277899991, 40.82783428999991]]]}}, {\&quot;id\&quot;: \&quot;147\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2276043, \&quot;OBJECTID\&quot;: 148, \&quot;Shape_Leng\&quot;: 0.0391305015633, \&quot;Shape_Area\&quot;: 6.97489921327e-05, \&quot;zone\&quot;: \&quot;Lower East Side\&quot;, \&quot;LocationID\&quot;: 148, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98447731699999, 40.72023423899987], [-73.98675136699994, 40.71959284599997], [-73.99022012699989, 40.71440493999988], [-73.99750445299988, 40.71406913199995], [-73.99260322199994, 40.72413644999987], [-73.98382387299982, 40.72147287199987], [-73.98447731699999, 40.72023423899987]]]}}, {\&quot;id\&quot;: \&quot;148\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1035, \&quot;OBJECTID\&quot;: 149, \&quot;Shape_Leng\&quot;: 0.0836805821837, \&quot;Shape_Area\&quot;: 0.000270639618955, \&quot;zone\&quot;: \&quot;Madison\&quot;, \&quot;LocationID\&quot;: 149, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94405560899996, 40.61199284199993], [-73.94231175899985, 40.60826819699985], [-73.93934703399997, 40.610187140999884], [-73.93753749399987, 40.60855738999986], [-73.93972613899992, 40.60713291499995], [-73.93447158899997, 40.60123151199989], [-73.94288954099984, 40.600318649999934], [-73.94248473299992, 40.598200364999855], [-73.956927197, 40.596612075999865], [-73.95859278499987, 40.61040303099988], [-73.94978380499997, 40.611371749999854], [-73.95026514899993, 40.61392435199983], [-73.9448277099998, 40.61604620899986], [-73.94405560899996, 40.61199284199993]]]}}, {\&quot;id\&quot;: \&quot;149\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 663, \&quot;OBJECTID\&quot;: 150, \&quot;Shape_Leng\&quot;: 0.089331491183, \&quot;Shape_Area\&quot;: 0.000332568036088, \&quot;zone\&quot;: \&quot;Manhattan Beach\&quot;, \&quot;LocationID\&quot;: 150, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9301907789999, 40.58508559299986], [-73.9319281118675, 40.58286976893519], [-73.95349322048675, 40.58298819826098], [-73.94274062592493, 40.58099558955925], [-73.93258006568031, 40.58126474120341], [-73.93106028107997, 40.57626592009687], [-73.9523584672133, 40.574274685845204], [-73.95414287899986, 40.58310613999989], [-73.95900739999992, 40.58283812799991], [-73.96025825899996, 40.58502930799994], [-73.9344471859999, 40.586652074999925], [-73.9301907789999, 40.58508559299986]]]}}, {\&quot;id\&quot;: \&quot;150\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1182328, \&quot;OBJECTID\&quot;: 151, \&quot;Shape_Leng\&quot;: 0.0548899410999, \&quot;Shape_Area\&quot;: 0.000128848901918, \&quot;zone\&quot;: \&quot;Manhattan Valley\&quot;, \&quot;LocationID\&quot;: 151, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96371096499993, 40.7930129339999], [-73.97639951915279, 40.79827321034625], [-73.97287179090726, 40.8033561875739], [-73.96004456499999, 40.79804123499991], [-73.96371096499993, 40.7930129339999]]]}}, {\&quot;id\&quot;: \&quot;151\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 137419, \&quot;OBJECTID\&quot;: 152, \&quot;Shape_Leng\&quot;: 0.0579094768782, \&quot;Shape_Area\&quot;: 0.000146637644064, \&quot;zone\&quot;: \&quot;Manhattanville\&quot;, \&quot;LocationID\&quot;: 152, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95357262899982, 40.82197589199988], [-73.94607828700005, 40.821263215999906], [-73.95210125199992, 40.811442853999935], [-73.96203105797969, 40.81808633074085], [-73.95881892233997, 40.82151852484672], [-73.9596033246027, 40.82299468678336], [-73.95793904909117, 40.82277435354731], [-73.9595089796959, 40.82359578895142], [-73.95357262899982, 40.82197589199988]]]}}, {\&quot;id\&quot;: \&quot;152\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1485, \&quot;OBJECTID\&quot;: 153, \&quot;Shape_Leng\&quot;: 0.024737239022, \&quot;Shape_Area\&quot;: 3.24684964817e-05, \&quot;zone\&quot;: \&quot;Marble Hill\&quot;, \&quot;LocationID\&quot;: 153, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90666530999995, 40.8757156089999], [-73.90893235220783, 40.87215734798524], [-73.91578609320084, 40.87571718248032], [-73.91033193599998, 40.879038046999895], [-73.90666530999995, 40.8757156089999]]]}}, {\&quot;id\&quot;: \&quot;153\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 379, \&quot;OBJECTID\&quot;: 154, \&quot;Shape_Leng\&quot;: 0.22733157076, \&quot;Shape_Area\&quot;: 0.00178968692433, \&quot;zone\&quot;: \&quot;Marine Park/Floyd Bennett Field\&quot;, \&quot;LocationID\&quot;: 154, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.93531145199985, 40.60886003999987], [-73.92986880199989, 40.60507134099995], [-73.92624885099994, 40.60741352199989], [-73.92444144399987, 40.60579356899993], [-73.91970928699986, 40.607302162999886], [-73.91331444593793, 40.60225844819831], [-73.90903689530528, 40.60267734322018], [-73.91073123013267, 40.60202137602758], [-73.90894225138031, 40.60160704069869], [-73.8839804295303, 40.60556651972071], [-73.87671672482064, 40.584914430200875], [-73.88174676983894, 40.5791588072124], [-73.89552381007165, 40.576769818436354], [-73.89903425420563, 40.587676171745805], [-73.90426874447125, 40.58691226298856], [-73.90651874663754, 40.588025473892536], [-73.91148171990072, 40.586078718712315], [-73.91204234015626, 40.594506954288846], [-73.91513297459494, 40.59878111593029], [-73.92151689981944, 40.60192365414108], [-73.92457042932716, 40.599723602732396], [-73.92950671202776, 40.60270923350431], [-73.92927458471804, 40.60399357480484], [-73.93117476161734, 40.603850406434695], [-73.93108919528449, 40.601722258264104], [-73.91454059121104, 40.58994422917544], [-73.91819087799986, 40.58660685499996], [-73.92956858299992, 40.5968202649999], [-73.92813139699999, 40.59777792799987], [-73.93972613899992, 40.60713291499995], [-73.93531145199985, 40.60886003999987]]], [[[-73.91990064335972, 40.59960052259278], [-73.91626393108346, 40.59816113731273], [-73.91295122631982, 40.59205432996962], [-73.91524478304683, 40.59158750817847], [-73.92182277731894, 40.59733293287253], [-73.92213049353394, 40.598662596177306], [-73.91990064335972, 40.59960052259278]]], [[[-73.91513331918175, 40.58626938540072], [-73.91282142952436, 40.58589683033704], [-73.91242103069457, 40.58339278402727], [-73.91729861410717, 40.58319080174952], [-73.91191058860355, 40.58296337725262], [-73.9114996013066, 40.58181878146464], [-73.92443604094977, 40.58355820344426], [-73.93184655018902, 40.58294105529734], [-73.9320424499999, 40.5842339599999], [-73.9300961629999, 40.584502075999886], [-73.93139947599984, 40.58607989499989], [-73.92101255523748, 40.58457501880612], [-73.91513331918175, 40.58626938540072]]]]}}, {\&quot;id\&quot;: \&quot;154\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 971, \&quot;OBJECTID\&quot;: 155, \&quot;Shape_Leng\&quot;: 0.169808473032, \&quot;Shape_Area\&quot;: 0.000868261018498, \&quot;zone\&quot;: \&quot;Marine Park/Mill Basin\&quot;, \&quot;LocationID\&quot;: 155, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90464209220775, 40.62513319188153], [-73.90546206137252, 40.62577481968345], [-73.9022870793228, 40.624409853930224], [-73.90071952540437, 40.62163492049855], [-73.89644123346895, 40.621394756190135], [-73.89586112894177, 40.614518137494784], [-73.89095414564672, 40.61283404731705], [-73.89394013317667, 40.61118142665126], [-73.88971513183803, 40.611598996904085], [-73.89334621420008, 40.606743446234645], [-73.89986880363854, 40.605524640544004], [-73.90133303458649, 40.611717882905985], [-73.90249392985292, 40.611814999032276], [-73.90119253465456, 40.61056381754662], [-73.90132962659396, 40.61048104310328], [-73.90879088017641, 40.617436396721416], [-73.90797306390525, 40.615736844061175], [-73.90959740910328, 40.616392669799325], [-73.90225859966276, 40.61042277259991], [-73.90177669809985, 40.605674686555815], [-73.90524300992108, 40.60491009032442], [-73.90863959535422, 40.606658722047854], [-73.90803306097814, 40.60535860211721], [-73.9098515484547, 40.605999722177685], [-73.9083253683517, 40.60407337391859], [-73.91365119759595, 40.60398251383695], [-73.91708838503304, 40.608820854898525], [-73.91449542205973, 40.61165322366488], [-73.91428072663338, 40.61493881616294], [-73.91662804371141, 40.6134435892654], [-73.91573181927129, 40.61183084451381], [-73.91811036679019, 40.61020839405809], [-73.91813814889971, 40.607645386907706], [-73.91935398484114, 40.60804292228766], [-73.91825269092949, 40.6072293506405], [-73.91950358918922, 40.60797490397521], [-73.91794980550603, 40.60620925217101], [-73.92158429099997, 40.607639084999875], [-73.92444144399987, 40.60579356899993], [-73.92624885099994, 40.60741352199989], [-73.92986880199989, 40.60507134099995], [-73.936046277, 40.609514868999966], [-73.93753749399987, 40.60855738999986], [-73.93934703399997, 40.610187140999884], [-73.94231175899985, 40.60826819699985], [-73.94354698000001, 40.6093465549999], [-73.9448277099998, 40.61604620899986], [-73.93686699599992, 40.620253280999904], [-73.92629604599998, 40.61311679899991], [-73.92640044599996, 40.61447853499988], [-73.9205269409999, 40.61394269499987], [-73.91690302699992, 40.61627422899993], [-73.91860649599992, 40.632090414999894], [-73.90464209220775, 40.62513319188153]]]}}, {\&quot;id\&quot;: \&quot;155\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 181, \&quot;OBJECTID\&quot;: 156, \&quot;Shape_Leng\&quot;: 0.144476890476, \&quot;Shape_Area\&quot;: 0.0010521217443, \&quot;zone\&quot;: \&quot;Mariners Harbor\&quot;, \&quot;LocationID\&quot;: 156, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.17989568340026, 40.64526879647802], [-74.1795871372141, 40.64191768346404], [-74.17918728067563, 40.64298753999647], [-74.1763578661754, 40.64232722056289], [-74.17436572943608, 40.64513625864542], [-74.17133587281808, 40.642855765052], [-74.17298798800311, 40.640489105066244], [-74.17105017239898, 40.642593819129914], [-74.1660998989604, 40.642406587001155], [-74.1658011075589, 40.64122451144941], [-74.16494139041178, 40.64220899988932], [-74.16519041758224, 40.64064230577938], [-74.16167534694229, 40.640610784766764], [-74.1622846525209, 40.63876565277233], [-74.16034819993155, 40.63844372645346], [-74.15986410465037, 40.639927823692716], [-74.1592271162294, 40.637796119756985], [-74.15900957887435, 40.63882257790974], [-74.15718782782525, 40.63795080522895], [-74.15710126690709, 40.63927771860018], [-74.15707077305574, 40.63794713564092], [-74.15482932461856, 40.63772385541876], [-74.15469263864514, 40.63919396811424], [-74.15459670163321, 40.63734334406899], [-74.15279703511403, 40.637132754852544], [-74.15124827966567, 40.63940934288591], [-74.14855815092196, 40.63743783752723], [-74.14877792005885, 40.6388762511277], [-74.14312802471521, 40.63968037306379], [-74.14752618999992, 40.62938928799988], [-74.14554071999994, 40.62783252199995], [-74.14650354399993, 40.62420010099991], [-74.15231170399994, 40.61716275599988], [-74.15379116699992, 40.612255611999906], [-74.1623545779999, 40.618335637999955], [-74.17459706299995, 40.622364010999874], [-74.1955597527974, 40.635023986316575], [-74.19462310145185, 40.637391183563665], [-74.18652496897599, 40.64338866217145], [-74.18483594580836, 40.644128266338726], [-74.18365067064063, 40.642239641050644], [-74.1836674587201, 40.64461048505006], [-74.17989568340026, 40.64526879647802]]], [[[-74.15945602438187, 40.641448333324036], [-74.16111242522163, 40.64183545373729], [-74.16146036002637, 40.644294969882374], [-74.15743349200979, 40.643302857779], [-74.15945602438187, 40.641448333324036]]]]}}, {\&quot;id\&quot;: \&quot;156\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 7409, \&quot;OBJECTID\&quot;: 157, \&quot;Shape_Leng\&quot;: 0.131300217777, \&quot;Shape_Area\&quot;: 0.000354370128323, \&quot;zone\&quot;: \&quot;Maspeth\&quot;, \&quot;LocationID\&quot;: 157, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8978323689999, 40.73516035399992], [-73.8885228599999, 40.734531159999904], [-73.8870771209998, 40.72463770199994], [-73.90010558699989, 40.72329624099992], [-73.899816102, 40.721236899999894], [-73.89739704899986, 40.7215512099999], [-73.89736598399989, 40.72046438299989], [-73.90062644399997, 40.719764053999874], [-73.90033904299986, 40.718019947999885], [-73.89834760099983, 40.719197677999894], [-73.897267579, 40.71814715699985], [-73.89901821099994, 40.71738212699993], [-73.89750226399987, 40.716383867999916], [-73.90477244599997, 40.71286579999984], [-73.90639010099999, 40.71736369199989], [-73.90965980099996, 40.71779315499991], [-73.91283037699982, 40.71536090699993], [-73.91077807399988, 40.71318759999986], [-73.92404011299993, 40.714008312999916], [-73.92352547251075, 40.71561660836783], [-73.92064258940593, 40.715773192028834], [-73.92232773978448, 40.71659264406108], [-73.91132095099978, 40.71962422999992], [-73.91384828299984, 40.72289841199989], [-73.905180579, 40.72895657699995], [-73.90041661699985, 40.73465058799992], [-73.8978323689999, 40.73516035399992]]]}}, {\&quot;id\&quot;: \&quot;157\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2021710, \&quot;OBJECTID\&quot;: 158, \&quot;Shape_Leng\&quot;: 0.0548099905515, \&quot;Shape_Area\&quot;: 0.000185568253002, \&quot;zone\&quot;: \&quot;Meatpacking/West Village West\&quot;, \&quot;LocationID\&quot;: 158, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0077911609999, 40.74197084499982], [-74.00515808199998, 40.74085808099991], [-74.0070902079999, 40.72877225299993], [-74.014390699162, 40.728463047760016], [-74.01408693559922, 40.730663173040284], [-74.01116195696464, 40.730450676349065], [-74.01099350879154, 40.732320417940606], [-74.01399957240955, 40.733332277517704], [-74.01072514326883, 40.733459523511115], [-74.01201792010478, 40.734063744456314], [-74.01081359479103, 40.734283443647534], [-74.0103930313456, 40.739174296059204], [-74.01265928208485, 40.74074763849748], [-74.0077911609999, 40.74197084499982]]]}}, {\&quot;id\&quot;: \&quot;158\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 7860, \&quot;OBJECTID\&quot;: 159, \&quot;Shape_Leng\&quot;: 0.064363233206, \&quot;Shape_Area\&quot;: 0.00017124910387, \&quot;zone\&quot;: \&quot;Melrose South\&quot;, \&quot;LocationID\&quot;: 159, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91189154999992, 40.822141481999914], [-73.9012927759998, 40.820475442999914], [-73.9044655149999, 40.81228195999994], [-73.91768626999985, 40.8160812429999], [-73.92048117399989, 40.8145636869999], [-73.92309299899993, 40.81669772799995], [-73.92399951299991, 40.81543891199991], [-73.92662718199988, 40.816118958999915], [-73.91677400599986, 40.82438708699987], [-73.91189154999992, 40.822141481999914]]]}}, {\&quot;id\&quot;: \&quot;159\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2917, \&quot;OBJECTID\&quot;: 160, \&quot;Shape_Leng\&quot;: 0.14151914297, \&quot;Shape_Area\&quot;: 0.000571234977994, \&quot;zone\&quot;: \&quot;Middle Village\&quot;, \&quot;LocationID\&quot;: 160, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.869707654, 40.72514643399992], [-73.85962920999985, 40.713975294999926], [-73.87016462499984, 40.70920774299987], [-73.86911007199988, 40.707089336999914], [-73.88088332699985, 40.7064539769999], [-73.87761134199985, 40.70716770499993], [-73.88006267699978, 40.71265257399993], [-73.90477244599997, 40.71286579999984], [-73.89750226399987, 40.716383867999916], [-73.89901821099994, 40.71738212699993], [-73.897267579, 40.71814715699985], [-73.89834760099983, 40.719197677999894], [-73.90033904299986, 40.718019947999885], [-73.90062644399997, 40.719764053999874], [-73.89736598399989, 40.72046438299989], [-73.89739704899986, 40.7215512099999], [-73.899816102, 40.721236899999894], [-73.89903191799989, 40.723856959999864], [-73.89426494199992, 40.723143188999856], [-73.8870771209998, 40.72463770199994], [-73.88720524999994, 40.727792996999874], [-73.87509154199992, 40.73067136299992], [-73.87146074199987, 40.729326373999854], [-73.869707654, 40.72514643399992]]]}}, {\&quot;id\&quot;: \&quot;160\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 5054217, \&quot;OBJECTID\&quot;: 161, \&quot;Shape_Leng\&quot;: 0.0358039100611, \&quot;Shape_Area\&quot;: 7.19130682992e-05, \&quot;zone\&quot;: \&quot;Midtown Center\&quot;, \&quot;LocationID\&quot;: 161, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97534377999993, 40.7552996949999], [-73.9783696929999, 40.752416226999905], [-73.98411754799999, 40.75484205299995], [-73.977686006, 40.76364440299992], [-73.97124277300004, 40.76093641799984], [-73.97534377999993, 40.7552996949999]]]}}, {\&quot;id\&quot;: \&quot;161\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4758657, \&quot;OBJECTID\&quot;: 162, \&quot;Shape_Leng\&quot;: 0.0352698146219, \&quot;Shape_Area\&quot;: 4.78936962112e-05, \&quot;zone\&quot;: \&quot;Midtown East\&quot;, \&quot;LocationID\&quot;: 162, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9712170449999, 40.75519332399994], [-73.9744494109998, 40.75076644499991], [-73.9783696929999, 40.752416226999905], [-73.96980028899992, 40.76291351199995], [-73.9665833839999, 40.76155093499988], [-73.9712170449999, 40.75519332399994]]]}}, {\&quot;id\&quot;: \&quot;162\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3885186, \&quot;OBJECTID\&quot;: 163, \&quot;Shape_Leng\&quot;: 0.0341768669752, \&quot;Shape_Area\&quot;: 4.08567804196e-05, \&quot;zone\&quot;: \&quot;Midtown North\&quot;, \&quot;LocationID\&quot;: 163, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98136213699995, 40.767836738999904], [-73.9736358469999, 40.7645699129999], [-73.96980028899992, 40.76291351199995], [-73.97124277300004, 40.76093641799984], [-73.98428230099987, 40.76479181499994], [-73.98136213699995, 40.767836738999904]]]}}, {\&quot;id\&quot;: \&quot;163\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3586399, \&quot;OBJECTID\&quot;: 164, \&quot;Shape_Leng\&quot;: 0.0357716119908, \&quot;Shape_Area\&quot;: 5.56318237441e-05, \&quot;zone\&quot;: \&quot;Midtown South\&quot;, \&quot;LocationID\&quot;: 164, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98362519999995, 40.7439431149999], [-73.99051761299985, 40.746038637999895], [-73.98411754799999, 40.75484205299995], [-73.98088709899987, 40.753480988999875], [-73.98407636100002, 40.74910212499993], [-73.98085054499998, 40.74775036999995], [-73.98362519999995, 40.7439431149999]]]}}, {\&quot;id\&quot;: \&quot;164\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3181, \&quot;OBJECTID\&quot;: 165, \&quot;Shape_Leng\&quot;: 0.088608036213, \&quot;Shape_Area\&quot;: 0.000353959317019, \&quot;zone\&quot;: \&quot;Midwood\&quot;, \&quot;LocationID\&quot;: 165, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96014773499996, 40.628915184999876], [-73.95995565099992, 40.627778671999884], [-73.94732672199994, 40.629166566999835], [-73.94451833400001, 40.61971364699989], [-73.94651373199997, 40.61949401899995], [-73.94573691999982, 40.61536340699989], [-73.95026514899993, 40.61392435199983], [-73.94978380499997, 40.611371749999854], [-73.96237947799978, 40.609986373999966], [-73.96471983399981, 40.62237296099993], [-73.96864510599995, 40.6219416949999], [-73.97136622199992, 40.62892916199996], [-73.96040734299989, 40.6301625309999], [-73.96014773499996, 40.628915184999876]]]}}, {\&quot;id\&quot;: \&quot;165\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 702932, \&quot;OBJECTID\&quot;: 166, \&quot;Shape_Leng\&quot;: 0.0688237542871, \&quot;Shape_Area\&quot;: 0.000255276270405, \&quot;zone\&quot;: \&quot;Morningside Heights\&quot;, \&quot;LocationID\&quot;: 166, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95707738499995, 40.8142980939999], [-73.95210125199992, 40.811442853999935], [-73.9535757779999, 40.8094766979999], [-73.95496657099991, 40.81006455499994], [-73.95964685399987, 40.80115642299993], [-73.97110765876137, 40.80579013958964], [-73.96203105797969, 40.81808633074085], [-73.95707738499995, 40.8142980939999]]]}}, {\&quot;id\&quot;: \&quot;166\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3088, \&quot;OBJECTID\&quot;: 167, \&quot;Shape_Leng\&quot;: 0.0908159737292, \&quot;Shape_Area\&quot;: 0.000167529391193, \&quot;zone\&quot;: \&quot;Morrisania/Melrose\&quot;, \&quot;LocationID\&quot;: 167, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89690017899987, 40.8310333359999], [-73.8899110649999, 40.830124191999865], [-73.88609624199987, 40.82765577699989], [-73.89483522899992, 40.82624684099993], [-73.89548522799996, 40.82824854099993], [-73.90093510699997, 40.82792810199992], [-73.9012927759998, 40.820475442999914], [-73.91181615799985, 40.82203502199991], [-73.91677400599986, 40.82438708699987], [-73.91541108199998, 40.82577390899993], [-73.91130974499993, 40.824848557999886], [-73.91169430299985, 40.82775871599993], [-73.908959903, 40.83022623299989], [-73.90553116799988, 40.82910413299989], [-73.90122534999992, 40.83549991099991], [-73.89697220299995, 40.8343452539999], [-73.89690017899987, 40.8310333359999]]]}}, {\&quot;id\&quot;: \&quot;167\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 30875, \&quot;OBJECTID\&quot;: 168, \&quot;Shape_Leng\&quot;: 0.114517434155, \&quot;Shape_Area\&quot;: 0.000547058100444, \&quot;zone\&quot;: \&quot;Mott Haven/Port Morris\&quot;, \&quot;LocationID\&quot;: 168, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.92480953899991, 40.81565901999993], [-73.92309299899993, 40.81669772799995], [-73.92048117399989, 40.8145636869999], [-73.91768626999985, 40.8160812429999], [-73.9044655149999, 40.81228195999994], [-73.90229231992774, 40.80456477614167], [-73.91168831241185, 40.79662376988872], [-73.91904978748826, 40.798993935843235], [-73.9229271008289, 40.80237329482137], [-73.92762788658843, 40.80269566548149], [-73.93252708785968, 40.80882328177534], [-73.93242632000944, 40.81411751897961], [-73.93027812699984, 40.813248024999965], [-73.92731653099999, 40.81855963399991], [-73.92518486499998, 40.818012668999884], [-73.92662718199988, 40.816118958999915], [-73.92480953899991, 40.81565901999993]]], [[[-73.89833036270552, 40.80241282093997], [-73.89646668834577, 40.80079047089134], [-73.90021004993142, 40.79926415589601], [-73.90003735815736, 40.800908742050225], [-73.89833036270552, 40.80241282093997]]], [[[-73.89680883223778, 40.795808445159786], [-73.89796839783742, 40.79564483916198], [-73.89919434249981, 40.796502456018175], [-73.8978825324018, 40.79711653214704], [-73.89680883223778, 40.795808445159786]]]]}}, {\&quot;id\&quot;: \&quot;168\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3090, \&quot;OBJECTID\&quot;: 169, \&quot;Shape_Leng\&quot;: 0.0601046580332, \&quot;Shape_Area\&quot;: 0.000146027537733, \&quot;zone\&quot;: \&quot;Mount Hope\&quot;, \&quot;LocationID\&quot;: 169, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89816577499982, 40.85514637599989], [-73.89863543699985, 40.85390697499993], [-73.89560883299981, 40.85457036999986], [-73.901344046, 40.84442875099994], [-73.90483121999989, 40.84480034199987], [-73.9050151499998, 40.842404697999875], [-73.91689747599989, 40.84511773399991], [-73.91416184199993, 40.845179187999925], [-73.90557007299988, 40.855787321999884], [-73.89816577499982, 40.85514637599989]]]}}, {\&quot;id\&quot;: \&quot;169\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4731080, \&quot;OBJECTID\&quot;: 170, \&quot;Shape_Leng\&quot;: 0.0457690091051, \&quot;Shape_Area\&quot;: 7.43150675972e-05, \&quot;zone\&quot;: \&quot;Murray Hill\&quot;, \&quot;LocationID\&quot;: 170, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97203331099985, 40.745804967999945], [-73.97350835000003, 40.7437820339999], [-73.97812378199983, 40.745727172999885], [-73.98085965399994, 40.74196976799989], [-73.98407485299995, 40.74332471799989], [-73.98085054399985, 40.74775036999991], [-73.98407636100002, 40.74910212499993], [-73.98088709899987, 40.753480988999875], [-73.9744494109998, 40.75076644499991], [-73.9758346669999, 40.74886314599996], [-73.97121971999988, 40.74692154099996], [-73.97203331099985, 40.745804967999945]]]}}, {\&quot;id\&quot;: \&quot;170\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 980, \&quot;OBJECTID\&quot;: 171, \&quot;Shape_Leng\&quot;: 0.107353876244, \&quot;Shape_Area\&quot;: 0.000520099538161, \&quot;zone\&quot;: \&quot;Murray Hill-Queens\&quot;, \&quot;LocationID\&quot;: 171, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79317944599988, 40.77040317699989], [-73.79343991199988, 40.760764127999934], [-73.79076004599987, 40.76098576899991], [-73.79031517, 40.75782345099988], [-73.81104963199985, 40.761417020999964], [-73.82063593299985, 40.75887226799989], [-73.82657481899986, 40.772345397999885], [-73.82331286899986, 40.77957865999986], [-73.81452997799975, 40.77888817499992], [-73.81485850699985, 40.776485922999875], [-73.79853009399987, 40.775190728999924], [-73.79317944599988, 40.77040317699989]]]}}, {\&quot;id\&quot;: \&quot;171\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 95, \&quot;OBJECTID\&quot;: 172, \&quot;Shape_Leng\&quot;: 0.118476116148, \&quot;Shape_Area\&quot;: 0.000658402501406, \&quot;zone\&quot;: \&quot;New Dorp/Midland Beach\&quot;, \&quot;LocationID\&quot;: 172, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08654858694766, 40.56963231913558], [-74.08621632224266, 40.56853269814713], [-74.09054960106333, 40.567083597211294], [-74.09938031432728, 40.5589641933612], [-74.11376161199998, 40.56649718899993], [-74.11636336399992, 40.56391563799986], [-74.12489904399992, 40.568949141999916], [-74.12150213699994, 40.571721558999904], [-74.1215372899999, 40.57515325299986], [-74.10525775499997, 40.58592143599986], [-74.09844000899997, 40.581241705999915], [-74.10039083499996, 40.579688665999925], [-74.08597647499992, 40.57223697099986], [-74.08495715819193, 40.57125984002107], [-74.08654858694766, 40.56963231913558]]]}}, {\&quot;id\&quot;: \&quot;0\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 9046, \&quot;OBJECTID\&quot;: 1, \&quot;Shape_Leng\&quot;: 0.116357453189, \&quot;Shape_Area\&quot;: 0.0007823067885, \&quot;zone\&quot;: \&quot;Newark Airport\&quot;, \&quot;LocationID\&quot;: 1, \&quot;borough\&quot;: \&quot;EWR\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.18445299999996, 40.6949959999999], [-74.18284199999994, 40.70346499999988], [-74.17565999999994, 40.707379999999866], [-74.16081899999995, 40.70764099999991], [-74.15306999999996, 40.7052829999999], [-74.17283399999997, 40.67656399999988], [-74.17862999999994, 40.671037999999896], [-74.18503799999996, 40.67335999999989], [-74.18991599999998, 40.68154099999988], [-74.18922299999997, 40.688623999999905], [-74.18563199999994, 40.69164799999987], [-74.18445299999996, 40.6949959999999]]]}}, {\&quot;id\&quot;: \&quot;172\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 6118, \&quot;OBJECTID\&quot;: 173, \&quot;Shape_Leng\&quot;: 0.0600639661414, \&quot;Shape_Area\&quot;: 0.000178329851357, \&quot;zone\&quot;: \&quot;North Corona\&quot;, \&quot;LocationID\&quot;: 173, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85540366099997, 40.75834030899989], [-73.85312635499996, 40.75510934299989], [-73.85579909099987, 40.75440952799994], [-73.85442575299999, 40.748851725999884], [-73.86790963899986, 40.74493371599989], [-73.87365721799983, 40.756803485999946], [-73.85540366099997, 40.75834030899989]]]}}, {\&quot;id\&quot;: \&quot;173\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1312, \&quot;OBJECTID\&quot;: 174, \&quot;Shape_Leng\&quot;: 0.0678177559602, \&quot;Shape_Area\&quot;: 0.000155928664422, \&quot;zone\&quot;: \&quot;Norwood\&quot;, \&quot;LocationID\&quot;: 174, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87772817699984, 40.88345419499995], [-73.87812594399992, 40.88215382599989], [-73.87467601499999, 40.88156285199993], [-73.87494589799991, 40.87994766899988], [-73.87024100099985, 40.88022935299995], [-73.87619224999979, 40.87047671099987], [-73.8830900319999, 40.86659150899993], [-73.88146889699985, 40.868573645999916], [-73.88705142599984, 40.884349575999906], [-73.88124422499992, 40.88270963299992], [-73.87803562399996, 40.887118321999885], [-73.87772817699984, 40.88345419499995]]]}}, {\&quot;id\&quot;: \&quot;174\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 256, \&quot;OBJECTID\&quot;: 175, \&quot;Shape_Leng\&quot;: 0.134897665102, \&quot;Shape_Area\&quot;: 0.000504920726134, \&quot;zone\&quot;: \&quot;Oakland Gardens\&quot;, \&quot;LocationID\&quot;: 175, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7562560639999, 40.7584304689999], [-73.75230259399993, 40.759455198999916], [-73.75004764499985, 40.75840465799996], [-73.74384322099985, 40.74769009599988], [-73.74625984399985, 40.74671147499993], [-73.74477587099986, 40.74328109699994], [-73.75347299999999, 40.74240484399992], [-73.75098230099987, 40.74002146199996], [-73.7439619359999, 40.74078912699986], [-73.74306820799991, 40.7384408179999], [-73.74016951799993, 40.73848189799986], [-73.75048295699996, 40.72922129399996], [-73.75669771299987, 40.7262287109999], [-73.76564374500005, 40.732533126999954], [-73.7636997919999, 40.73286411699993], [-73.76510920699994, 40.73455658499992], [-73.76248609299982, 40.736730981999884], [-73.76772991399994, 40.74577622599993], [-73.75684127399992, 40.74932207799991], [-73.76184343999986, 40.75553726899989], [-73.76239510599996, 40.759496997999854], [-73.75800131799996, 40.76037986699988], [-73.7562560639999, 40.7584304689999]]]}}, {\&quot;id\&quot;: \&quot;175\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 38, \&quot;OBJECTID\&quot;: 176, \&quot;Shape_Leng\&quot;: 0.151995190703, \&quot;Shape_Area\&quot;: 0.000657782126267, \&quot;zone\&quot;: \&quot;Oakwood\&quot;, \&quot;LocationID\&quot;: 176, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.12187198599999, 40.57510757499989], [-74.12150213699994, 40.571721558999904], [-74.12489904399992, 40.568949141999916], [-74.11636336299996, 40.56391563799985], [-74.11376161199998, 40.56649718899993], [-74.09992914200652, 40.55907068582615], [-74.10140516910823, 40.555538526164405], [-74.10309839111532, 40.555904641451136], [-74.10484447636338, 40.55302581455626], [-74.10768623464054, 40.553976671477514], [-74.11301046102231, 40.547780065214994], [-74.12730057799996, 40.55729517199993], [-74.13321002499998, 40.552383875999936], [-74.13885092699991, 40.5569511789999], [-74.13170009, 40.56453574899991], [-74.1443874499999, 40.56970609999989], [-74.14418588199999, 40.57203740999988], [-74.13261022999991, 40.573530162999894], [-74.12708814799998, 40.57636910599995], [-74.12187198599999, 40.57510757499989]]]}}, {\&quot;id\&quot;: \&quot;176\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4622, \&quot;OBJECTID\&quot;: 177, \&quot;Shape_Leng\&quot;: 0.0715805407056, \&quot;Shape_Area\&quot;: 0.000198894762248, \&quot;zone\&quot;: \&quot;Ocean Hill\&quot;, \&quot;LocationID\&quot;: 177, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90287079599995, 40.6786314149999], [-73.90004626199993, 40.67689308999995], [-73.92275257199998, 40.667097332999894], [-73.92164666399992, 40.67886992299994], [-73.9163011989999, 40.67857711199991], [-73.91804607, 40.68721324799989], [-73.90287079599995, 40.6786314149999]]]}}, {\&quot;id\&quot;: \&quot;177\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2902, \&quot;OBJECTID\&quot;: 178, \&quot;Shape_Leng\&quot;: 0.0682528770739, \&quot;Shape_Area\&quot;: 0.000175805409143, \&quot;zone\&quot;: \&quot;Ocean Parkway South\&quot;, \&quot;LocationID\&quot;: 178, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97080408199997, 40.62593266699988], [-73.96864510599995, 40.6219416949999], [-73.96471983399981, 40.62237296099993], [-73.96285973999984, 40.61254948599989], [-73.96478112799986, 40.61233092199988], [-73.96429649899991, 40.60977642599992], [-73.97403097799986, 40.608702309999906], [-73.97517176999993, 40.61472418599991], [-73.97290326899996, 40.61415296799988], [-73.97335879399992, 40.616541714999904], [-73.97537335500002, 40.6157547219999], [-73.97785009299986, 40.617287605999906], [-73.97539380499998, 40.62076998699995], [-73.97705352899999, 40.62153252199987], [-73.9772614999999, 40.625852772999906], [-73.97080408199997, 40.62593266699988]]]}}, {\&quot;id\&quot;: \&quot;178\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 106845, \&quot;OBJECTID\&quot;: 179, \&quot;Shape_Leng\&quot;: 0.0713808644377, \&quot;Shape_Area\&quot;: 0.000183893478476, \&quot;zone\&quot;: \&quot;Old Astoria\&quot;, \&quot;LocationID\&quot;: 179, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93290347544752, 40.77794449857707], [-73.92782147400004, 40.776697526999946], [-73.91770217299991, 40.7703931119999], [-73.91995596899991, 40.768440064999865], [-73.91849336999996, 40.76773465699995], [-73.91977764799998, 40.7661521839999], [-73.92218946199995, 40.767267356999895], [-73.92425288799978, 40.76472456399995], [-73.93344468499993, 40.768817789999915], [-73.93493511099992, 40.76701302399987], [-73.93618379699991, 40.767691800999934], [-73.93424609600005, 40.771029275999894], [-73.93746638537067, 40.77253149512518], [-73.93765483090819, 40.775085685383594], [-73.93508232492144, 40.77794423372776], [-73.93290347544752, 40.77794449857707]]]}}, {\&quot;id\&quot;: \&quot;179\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1537, \&quot;OBJECTID\&quot;: 180, \&quot;Shape_Leng\&quot;: 0.0805277671523, \&quot;Shape_Area\&quot;: 0.000247682193353, \&quot;zone\&quot;: \&quot;Ozone Park\&quot;, \&quot;LocationID\&quot;: 180, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84119605699982, 40.68335136599989], [-73.83334819299995, 40.66677318699994], [-73.86131863599985, 40.6750212689999], [-73.86334943599995, 40.67935163999989], [-73.85878576899987, 40.68063046299989], [-73.85819836099995, 40.67943084899987], [-73.85392389199987, 40.679686155999875], [-73.85099089299987, 40.68056836699987], [-73.85197864599989, 40.682564210999864], [-73.84786817599985, 40.681486831999905], [-73.84119605699982, 40.68335136599989]]]}}, {\&quot;id\&quot;: \&quot;180\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 223234, \&quot;OBJECTID\&quot;: 181, \&quot;Shape_Leng\&quot;: 0.0895372399547, \&quot;Shape_Area\&quot;: 0.000306890292807, \&quot;zone\&quot;: \&quot;Park Slope\&quot;, \&quot;LocationID\&quot;: 181, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97583132299987, 40.66581507999991], [-73.97965353499985, 40.661243232999915], [-73.98223034199995, 40.66214149299991], [-73.985086794, 40.65901328799989], [-73.988716511, 40.66240493799995], [-73.9906354539999, 40.66057908799997], [-73.99692689899985, 40.664374914999925], [-73.99490350199993, 40.66678543499988], [-73.99277080699981, 40.665507280999876], [-73.97804289599988, 40.68485661499987], [-73.97375598499991, 40.68303401999988], [-73.97618051399984, 40.67806432099995], [-73.96949738899991, 40.67590637999996], [-73.96871822199984, 40.67392423399988], [-73.97583132299987, 40.66581507999991]]]}}, {\&quot;id\&quot;: \&quot;181\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1624, \&quot;OBJECTID\&quot;: 182, \&quot;Shape_Leng\&quot;: 0.0393606369479, \&quot;Shape_Area\&quot;: 9.10644156732e-05, \&quot;zone\&quot;: \&quot;Parkchester\&quot;, \&quot;LocationID\&quot;: 182, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85465135700002, 40.83388802699987], [-73.86271114399993, 40.83299150899997], [-73.86448011799995, 40.84108779699994], [-73.85333524999986, 40.84247015499987], [-73.85168459699997, 40.8342010519999], [-73.85465135700002, 40.83388802699987]]]}}, {\&quot;id\&quot;: \&quot;182\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 316, \&quot;OBJECTID\&quot;: 183, \&quot;Shape_Leng\&quot;: 0.0398262960348, \&quot;Shape_Area\&quot;: 9.51929451066e-05, \&quot;zone\&quot;: \&quot;Pelham Bay\&quot;, \&quot;LocationID\&quot;: 183, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83676643699985, 40.84338596999994], [-73.83463970299987, 40.853817993999904], [-73.82860197199996, 40.85571784799988], [-73.82721751200002, 40.853250512999935], [-73.82799676999998, 40.84862431399989], [-73.82611300699996, 40.84533869399991], [-73.83676643699985, 40.84338596999994]]]}}, {\&quot;id\&quot;: \&quot;183\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 186, \&quot;OBJECTID\&quot;: 184, \&quot;Shape_Leng\&quot;: 0.260815683043, \&quot;Shape_Area\&quot;: 0.00198883363103, \&quot;zone\&quot;: \&quot;Pelham Bay Park\&quot;, \&quot;LocationID\&quot;: 184, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.80728647099995, 40.885931813999875], [-73.79322870891143, 40.88282259495222], [-73.80087270458245, 40.87159011989393], [-73.80252284756597, 40.87050664469679], [-73.80339117523091, 40.87250503763108], [-73.80431849468228, 40.87115974106797], [-73.80302203685277, 40.86915511979648], [-73.80588410012888, 40.869068502184916], [-73.80841596818787, 40.87118969336752], [-73.80464604502912, 40.86664711643685], [-73.80300388108948, 40.86704183656889], [-73.80225816157765, 40.8656082064109], [-73.79780377219292, 40.87225613227397], [-73.794790446816, 40.873200484033966], [-73.79384702788171, 40.87859445979086], [-73.7895587294431, 40.881261284915404], [-73.789523093688, 40.87899812706048], [-73.7843816810755, 40.878420531670514], [-73.78719087560506, 40.872730553729134], [-73.78508139658601, 40.87358996322568], [-73.78526152075709, 40.87174532233236], [-73.78358738486025, 40.87378095468029], [-73.78320175426292, 40.87067036085376], [-73.78560245305444, 40.86834165222368], [-73.78795446145405, 40.86984541906357], [-73.79139032586131, 40.868141307466146], [-73.79190454927502, 40.86082956271207], [-73.79454562318031, 40.85888825916121], [-73.79435005934273, 40.85652702380392], [-73.7987225560008, 40.85491440117259], [-73.79780522990592, 40.85194959859714], [-73.80040387554423, 40.84810822100142], [-73.80417557932397, 40.853340120189074], [-73.80478410547944, 40.86154633053462], [-73.80592716427573, 40.86194119699028], [-73.80612390783546, 40.85981220661901], [-73.80783343870087, 40.860318133305384], [-73.80768048107562, 40.858538063289515], [-73.81411414337536, 40.86373145821164], [-73.81641392102723, 40.86118062770394], [-73.81273146495035, 40.85887754194771], [-73.81230602708418, 40.854162026473176], [-73.81684183599076, 40.85362521315728], [-73.81712409042197, 40.85126957344483], [-73.81507165904237, 40.84913361979451], [-73.82495697699986, 40.846105444999864], [-73.82517999, 40.842700058999874], [-73.82624132899997, 40.84299359399996], [-73.82799676999987, 40.8486243129999], [-73.82723026100001, 40.853350756999895], [-73.82860197199996, 40.85571784799988], [-73.83283502299986, 40.8560358449999], [-73.82834347399992, 40.86089202599988], [-73.82699653199998, 40.85908778599986], [-73.82037552999996, 40.86103300499993], [-73.81578764099999, 40.8657580609999], [-73.821266938, 40.869071605999885], [-73.82329599399986, 40.87309741799988], [-73.81992586499996, 40.88211933299987], [-73.82027432999985, 40.885550699999925], [-73.81442762200005, 40.88677196499989], [-73.80728647099995, 40.885931813999875]]], [[[-73.78650554049733, 40.880940134479225], [-73.78578002611279, 40.88036396266133], [-73.78742039384403, 40.87977089028999], [-73.787127834652, 40.88092346317125], [-73.78650554049733, 40.880940134479225]]], [[[-73.78103351104939, 40.87648400204775], [-73.78120649649391, 40.87628502546013], [-73.78132704118002, 40.87636132654635], [-73.78112767478156, 40.87665268050809], [-73.78103351104939, 40.87648400204775]]], [[[-73.78241811865315, 40.87492327042177], [-73.78265785360905, 40.87479265669398], [-73.78280207510406, 40.87494886620542], [-73.78247604125525, 40.87516813337884], [-73.78241811865315, 40.87492327042177]]], [[[-73.77435244645233, 40.874169955874805], [-73.77453640510954, 40.87471001543833], [-73.77409538292126, 40.87489618448013], [-73.7740318153443, 40.874394774956215], [-73.77435244645233, 40.874169955874805]]], [[[-73.78605394964902, 40.873782646192794], [-73.78618924358646, 40.87359972769974], [-73.78633325996694, 40.87367772488745], [-73.7861946371647, 40.87388531941464], [-73.78605394964902, 40.873782646192794]]], [[[-73.78648510546586, 40.87320925495041], [-73.7867268909535, 40.87307453926568], [-73.78626202153426, 40.87339368663393], [-73.78632869488987, 40.873271144554096], [-73.78648510546586, 40.87320925495041]]], [[[-73.77080975398195, 40.871549946847985], [-73.76990710668544, 40.87047694447026], [-73.77288042665229, 40.871245263430254], [-73.77217786492288, 40.87198111068936], [-73.77080975398195, 40.871549946847985]]], [[[-73.76668965841925, 40.86709778162448], [-73.76709907439783, 40.8667045727482], [-73.76779449382023, 40.86678117376544], [-73.76760072096499, 40.86749638654143], [-73.76668965841925, 40.86709778162448]]], [[[-73.76964988627088, 40.86548557242442], [-73.76979148260493, 40.86512823356445], [-73.77022931630273, 40.865138939396005], [-73.770068972998, 40.86552587618341], [-73.76964988627088, 40.86548557242442]]], [[[-73.78401249138903, 40.863131994074394], [-73.78376770348979, 40.86261060846434], [-73.78469165850701, 40.86254278990822], [-73.7842865050008, 40.86320508878048], [-73.78401249138903, 40.863131994074394]]], [[[-73.78312589594455, 40.862856167300684], [-73.7828819783119, 40.862406433091266], [-73.7831450428813, 40.86206867890555], [-73.78328053505923, 40.86278070671258], [-73.78312589594455, 40.862856167300684]]], [[[-73.77460156350928, 40.86206904745972], [-73.7749432115575, 40.861391499889486], [-73.77529297955127, 40.86123200821588], [-73.77485681624742, 40.86198363433426], [-73.77460156350928, 40.86206904745972]]], [[[-73.77290231992438, 40.86120858327854], [-73.77323150244695, 40.86074716979338], [-73.77351264165688, 40.861241184087085], [-73.77310632921937, 40.861614575032775], [-73.77290231992438, 40.86120858327854]]], [[[-73.8022229535527, 40.84163481314409], [-73.80263811156135, 40.841081153267076], [-73.80694608641589, 40.84146244718637], [-73.80680801372397, 40.84248913998752], [-73.8022229535527, 40.84163481314409]]]]}}, {\&quot;id\&quot;: \&quot;184\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1295, \&quot;OBJECTID\&quot;: 185, \&quot;Shape_Leng\&quot;: 0.0861619681636, \&quot;Shape_Area\&quot;: 0.000228537100218, \&quot;zone\&quot;: \&quot;Pelham Parkway\&quot;, \&quot;LocationID\&quot;: 185, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84004614299985, 40.857806268999866], [-73.83499552599994, 40.85657120099989], [-73.84049767399992, 40.8541841049999], [-73.84494053799982, 40.8482182209999], [-73.84430846999992, 40.85119046399989], [-73.85304526899994, 40.849547331999865], [-73.85457388299992, 40.85150834599995], [-73.86250923799993, 40.84836228099987], [-73.86303938099996, 40.850611306999944], [-73.86860515599989, 40.85206864599991], [-73.86990421600002, 40.85577329299987], [-73.8681883059999, 40.858063833999964], [-73.84004614299985, 40.857806268999866]]]}}, {\&quot;id\&quot;: \&quot;185\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4678544, \&quot;OBJECTID\&quot;: 186, \&quot;Shape_Leng\&quot;: 0.0246963902234, \&quot;Shape_Area\&quot;: 3.70729416953e-05, \&quot;zone\&quot;: \&quot;Penn Station/Madison Sq West\&quot;, \&quot;LocationID\&quot;: 186, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99096832799995, 40.74542088999985], [-73.99709902899994, 40.74720510199991], [-73.99346417699986, 40.75219005499987], [-73.98776905899994, 40.749787028999926], [-73.99096832799995, 40.74542088999985]]]}}, {\&quot;id\&quot;: \&quot;186\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 49, \&quot;OBJECTID\&quot;: 187, \&quot;Shape_Leng\&quot;: 0.126868431324, \&quot;Shape_Area\&quot;: 0.000421195755741, \&quot;zone\&quot;: \&quot;Port Richmond\&quot;, \&quot;LocationID\&quot;: 187, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.13435269573621, 40.64188679740515], [-74.12890729033458, 40.64119482758617], [-74.1268887269999, 40.637210087999925], [-74.12867047299994, 40.63734826499993], [-74.13047428999985, 40.6308855089999], [-74.13806393799992, 40.627568470999904], [-74.13581008299997, 40.62506433999991], [-74.13826358199992, 40.624243769999936], [-74.13982184799993, 40.61629982499988], [-74.14603562099998, 40.61701277699996], [-74.14696864199988, 40.610151355999896], [-74.15018666499996, 40.60949781099991], [-74.15379116699992, 40.612255611999906], [-74.15231170399994, 40.61716275599988], [-74.14622812499992, 40.6249253619999], [-74.14554071999994, 40.62783252199995], [-74.14752618999992, 40.62938928799988], [-74.14478228999994, 40.637953779999904], [-74.14229766980965, 40.64030580709358], [-74.13435269573621, 40.64188679740515]]], [[[-74.12117246275159, 40.64166914557247], [-74.12128074797168, 40.64143249599354], [-74.12131194814832, 40.64145253116248], [-74.12117246275159, 40.64166914557247]]], [[[-74.1215534360538, 40.64161162832474], [-74.12176052602824, 40.64157431506241], [-74.12175764698422, 40.64142342422718], [-74.12177911197513, 40.641592547117035], [-74.1215534360538, 40.64161162832474]]], [[[-74.12107727405213, 40.64160742058869], [-74.12118039503834, 40.64138344518971], [-74.12121470277087, 40.64139683999368], [-74.12110124737936, 40.64161328229901], [-74.12107727405213, 40.64160742058869]]], [[[-74.12130529083001, 40.64160070313003], [-74.12137332919554, 40.64147647512165], [-74.12132617111645, 40.64160656922885], [-74.12130529083001, 40.64160070313003]]], [[[-74.12185329597821, 40.64158069227959], [-74.12180661091023, 40.64141215903768], [-74.1218414704778, 40.641405894387034], [-74.12199083807539, 40.64155463949942], [-74.12185329597821, 40.64158069227959]]], [[[-74.12270319595869, 40.64137664893253], [-74.12272114424832, 40.64134762377306], [-74.12276203509289, 40.641426635297144], [-74.12271103075855, 40.641433755252706], [-74.12270319595869, 40.64137664893253]]], [[[-74.12613276551227, 40.6412643880282], [-74.1259954246122, 40.640231242814394], [-74.12636808688976, 40.64133238048696], [-74.12564026870598, 40.64141849208226], [-74.12613276551227, 40.6412643880282]]]]}}, {\&quot;id\&quot;: \&quot;188\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 60405, \&quot;OBJECTID\&quot;: 189, \&quot;Shape_Leng\&quot;: 0.0486743306502, \&quot;Shape_Area\&quot;: 0.000101427594033, \&quot;zone\&quot;: \&quot;Prospect Heights\&quot;, \&quot;LocationID\&quot;: 189, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96070974499996, 40.673121393999985], [-73.96131877999991, 40.67140667599988], [-73.96892332199981, 40.67293755299988], [-73.96949738899991, 40.67590637999996], [-73.97618051399984, 40.67806432099995], [-73.97375598499991, 40.68303401999988], [-73.96134655899995, 40.6804635239999], [-73.96318238899983, 40.675529503999876], [-73.96007428300001, 40.67487807099994], [-73.96070974499996, 40.673121393999985]]]}}, {\&quot;id\&quot;: \&quot;189\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 9627, \&quot;OBJECTID\&quot;: 190, \&quot;Shape_Leng\&quot;: 0.0743294660829, \&quot;Shape_Area\&quot;: 0.000270873666522, \&quot;zone\&quot;: \&quot;Prospect Park\&quot;, \&quot;LocationID\&quot;: 190, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96307724199983, 40.66213019499987], [-73.96190028499997, 40.65487096199992], [-73.96621321999996, 40.653189404999885], [-73.96465438699984, 40.650887727999894], [-73.97139631700004, 40.64825778599986], [-73.97436701299992, 40.65818790399992], [-73.98022902599985, 40.660985325999896], [-73.96865541400003, 40.673023838999924], [-73.96258784899996, 40.671711596999884], [-73.96095595499996, 40.66328505499992], [-73.96307724199983, 40.66213019499987]]]}}, {\&quot;id\&quot;: \&quot;187\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 24954, \&quot;OBJECTID\&quot;: 188, \&quot;Shape_Leng\&quot;: 0.0977983968367, \&quot;Shape_Area\&quot;: 0.000313003032771, \&quot;zone\&quot;: \&quot;Prospect-Lefferts Gardens\&quot;, \&quot;LocationID\&quot;: 188, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95729172699996, 40.6643026319999], [-73.94269628999989, 40.664055128999934], [-73.94282892199992, 40.6628474859999], [-73.93068465499985, 40.66362047699992], [-73.92646424299983, 40.659814361999956], [-73.92834017599988, 40.660060035999884], [-73.92799465199988, 40.65680210099988], [-73.9500666489999, 40.65542299699989], [-73.94957113100006, 40.65080789999991], [-73.9587078989999, 40.65038727299989], [-73.95986103199981, 40.65563478899989], [-73.96190028499997, 40.65487096199992], [-73.96307724199983, 40.66213019499987], [-73.95729172699996, 40.6643026319999]]]}}, {\&quot;id\&quot;: \&quot;190\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1208, \&quot;OBJECTID\&quot;: 191, \&quot;Shape_Leng\&quot;: 0.130932637664, \&quot;Shape_Area\&quot;: 0.000688460603185, \&quot;zone\&quot;: \&quot;Queens Village\&quot;, \&quot;LocationID\&quot;: 191, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.73016587199996, 40.72395859599988], [-73.72816233910697, 40.7230841398913], [-73.73032628984046, 40.722157296892334], [-73.7269714679152, 40.710714504016735], [-73.72677759516957, 40.7030592911994], [-73.74590871000004, 40.70228727399988], [-73.74500119100004, 40.70026221299988], [-73.74773012199991, 40.69955313699991], [-73.74618157999997, 40.696121925999904], [-73.74863325999986, 40.6954447609999], [-73.75205066499986, 40.70522802799995], [-73.75047058199985, 40.70563993099994], [-73.75725671499985, 40.71813860199992], [-73.7523343839998, 40.72026246099993], [-73.75669771299987, 40.7262287109999], [-73.74672140400006, 40.73247715099991], [-73.74555667199989, 40.73063689799994], [-73.7314721509999, 40.727411794999924], [-73.73016587199996, 40.72395859599988]]]}}, {\&quot;id\&quot;: \&quot;191\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1886, \&quot;OBJECTID\&quot;: 192, \&quot;Shape_Leng\&quot;: 0.11196461971, \&quot;Shape_Area\&quot;: 0.000373808019026, \&quot;zone\&quot;: \&quot;Queensboro Hill\&quot;, \&quot;LocationID\&quot;: 192, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82239598999983, 40.74986422299986], [-73.81416171999987, 40.74613857999992], [-73.80750599299991, 40.750136586999936], [-73.80287666499983, 40.749765149999895], [-73.8033521419999, 40.74643196499987], [-73.7946756879998, 40.74721192799994], [-73.79453507400001, 40.74450763799989], [-73.79723084999992, 40.74169550699993], [-73.79640218700004, 40.73828235799987], [-73.8243501109999, 40.73975360599992], [-73.82946751999994, 40.737024481999896], [-73.83143025500006, 40.73913573299994], [-73.83113122799989, 40.74233799999994], [-73.83586131899989, 40.743227984999926], [-73.83392218299996, 40.74753207499989], [-73.82584440999999, 40.74934839099993], [-73.82426493799994, 40.75183288799992], [-73.82239598999983, 40.74986422299986]]]}}, {\&quot;id\&quot;: \&quot;192\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 55067, \&quot;OBJECTID\&quot;: 193, \&quot;Shape_Leng\&quot;: 0.0655299584801, \&quot;Shape_Area\&quot;: 0.000145591657944, \&quot;zone\&quot;: \&quot;Queensbridge/Ravenswood\&quot;, \&quot;LocationID\&quot;: 193, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93522718099996, 40.76952572899989], [-73.93858976899998, 40.766817358999916], [-73.93398092199995, 40.76282598199987], [-73.944052652, 40.75231325999992], [-73.95080763809156, 40.75526368005708], [-73.9413117494144, 40.76691800476961], [-73.93424609599985, 40.771029274999925], [-73.93522718099996, 40.76952572899989]]]}}, {\&quot;id\&quot;: \&quot;193\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 9652, \&quot;OBJECTID\&quot;: 194, \&quot;Shape_Leng\&quot;: 0.0817938353532, \&quot;Shape_Area\&quot;: 0.000273481702719, \&quot;zone\&quot;: \&quot;Randalls Island\&quot;, \&quot;LocationID\&quot;: 194, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91639852914044, 40.79768484203896], [-73.91378385370595, 40.793836285482065], [-73.92412113996787, 40.78252307401082], [-73.92810118993664, 40.78092032002105], [-73.93598226003293, 40.7839423680532], [-73.93084178719639, 40.79099143000079], [-73.9261041024332, 40.79073160730996], [-73.92560814781015, 40.79189695828146], [-73.9278688922052, 40.79095483831721], [-73.9283194359912, 40.79309126608271], [-73.9254929354651, 40.80195616882528], [-73.92263378594883, 40.80186873814113], [-73.91639852914044, 40.79768484203896]]]}}, {\&quot;id\&quot;: \&quot;194\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 14397, \&quot;OBJECTID\&quot;: 195, \&quot;Shape_Leng\&quot;: 0.131308244067, \&quot;Shape_Area\&quot;: 0.000801651953985, \&quot;zone\&quot;: \&quot;Red Hook\&quot;, \&quot;LocationID\&quot;: 195, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0071710969999, 40.68635700999991], [-74.00485241599992, 40.685668130999886], [-74.00596041099988, 40.683362870999936], [-73.9986188799999, 40.67183017199989], [-74.00289483876944, 40.66734846594933], [-74.0058636618068, 40.66799376258568], [-74.00683236078251, 40.666049645526776], [-74.00696707834247, 40.666052182356665], [-74.00543926529353, 40.6709214682384], [-74.00754821618384, 40.66705174573358], [-74.00708724221813, 40.668591358535764], [-74.00985411855632, 40.668523628335336], [-74.01154017543327, 40.6650859197566], [-74.01574872882654, 40.6645683362916], [-74.01690267361069, 40.66484660233888], [-74.01933946871777, 40.671624948422625], [-74.01751037086694, 40.671034530984144], [-74.01648665554487, 40.664930508953816], [-74.01227967872792, 40.66573241415882], [-74.01033845947926, 40.669078195448], [-74.01162527521356, 40.670581028275876], [-74.01424926931875, 40.66972860473708], [-74.01175350509699, 40.670657757578326], [-74.0151998057007, 40.6707540276644], [-74.01423289452782, 40.67213000051297], [-74.01568625497515, 40.671038834928844], [-74.0129758779219, 40.67332791872093], [-74.01632099922307, 40.6729082695637], [-74.01496392184576, 40.67467763029424], [-74.0188009477692, 40.6722507648487], [-74.01727138470127, 40.67360864580548], [-74.0188577695892, 40.6751022924089], [-74.01791198226178, 40.676510462801936], [-74.01995197864673, 40.67710301044993], [-74.01825267004557, 40.67855288672587], [-74.01928128101008, 40.67964814029763], [-74.01282000316418, 40.68362241624865], [-74.01410549647976, 40.68171251937541], [-74.013018354221, 40.68041237401427], [-74.00967108558879, 40.683268727715], [-74.01193259955522, 40.683887749077535], [-74.0071710969999, 40.68635700999991]]]}}, {\&quot;id\&quot;: \&quot;195\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 16548, \&quot;OBJECTID\&quot;: 196, \&quot;Shape_Leng\&quot;: 0.0832421106332, \&quot;Shape_Area\&quot;: 0.0001974713336, \&quot;zone\&quot;: \&quot;Rego Park\&quot;, \&quot;LocationID\&quot;: 196, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85762923599995, 40.728606921999884], [-73.8594198799999, 40.726464837999885], [-73.85727108100001, 40.72568129799988], [-73.85805416899993, 40.72444540599986], [-73.86203833799982, 40.72595678499994], [-73.8586809759999, 40.72261243999988], [-73.85729287299985, 40.711467676999874], [-73.85975932900001, 40.711845058999856], [-73.86003789899996, 40.71493223599987], [-73.86929270499994, 40.72443592899991], [-73.87146074199987, 40.729326373999854], [-73.87509154199992, 40.73067136299992], [-73.85886555799988, 40.73593913899987], [-73.85625665099991, 40.73095912299993], [-73.85851097899999, 40.73028680199993], [-73.85762923599995, 40.728606921999884]]]}}, {\&quot;id\&quot;: \&quot;196\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 5603, \&quot;OBJECTID\&quot;: 197, \&quot;Shape_Leng\&quot;: 0.108568532229, \&quot;Shape_Area\&quot;: 0.000504689160432, \&quot;zone\&quot;: \&quot;Richmond Hill\&quot;, \&quot;LocationID\&quot;: 197, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83696237799982, 40.70421245199992], [-73.83152109599999, 40.70138962899994], [-73.82245890399994, 40.70365553099989], [-73.81637824499992, 40.70245196399987], [-73.81063298299996, 40.69194738299988], [-73.82501128899997, 40.68795231799991], [-73.82599347399987, 40.689953661999894], [-73.82851136799994, 40.689239055999934], [-73.82753021399995, 40.687239482999914], [-73.83807769099997, 40.68423890999988], [-73.83697486299991, 40.6819880179999], [-73.84012856099982, 40.6811466509999], [-73.84947763499991, 40.69819580699987], [-73.83696237799982, 40.70421245199992]]]}}, {\&quot;id\&quot;: \&quot;197\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 7437, \&quot;OBJECTID\&quot;: 198, \&quot;Shape_Leng\&quot;: 0.134094242763, \&quot;Shape_Area\&quot;: 0.000499809882564, \&quot;zone\&quot;: \&quot;Ridgewood\&quot;, \&quot;LocationID\&quot;: 198, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90768387299997, 40.71737969499987], [-73.90639010099999, 40.71736369199989], [-73.90537582199983, 40.71287658099986], [-73.88006267699978, 40.71265257399993], [-73.87761134199985, 40.70716770499993], [-73.88911917799989, 40.705598876999915], [-73.90123290699994, 40.69144227899997], [-73.90579597099993, 40.69412715499987], [-73.9042601839999, 40.69570037099989], [-73.91180820099989, 40.69993800299986], [-73.91067882699998, 40.701045968999914], [-73.91290404099983, 40.70236189199989], [-73.91180710099992, 40.703434952999864], [-73.92189184699987, 40.709396095999836], [-73.92074519699985, 40.71052968599989], [-73.92404011299993, 40.714008312999916], [-73.91077807399988, 40.71318759999986], [-73.91283037699992, 40.71536090799986], [-73.90965980099996, 40.71779315499991], [-73.90768387299997, 40.71737969499987]]]}}, {\&quot;id\&quot;: \&quot;198\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 88, \&quot;OBJECTID\&quot;: 199, \&quot;Shape_Leng\&quot;: 0.0778085005169, \&quot;Shape_Area\&quot;: 0.000288747549303, \&quot;zone\&quot;: \&quot;Rikers Island\&quot;, \&quot;LocationID\&quot;: 199, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88885148496314, 40.79870632895875], [-73.88665108524579, 40.79803819669988], [-73.88375741590156, 40.79570856541983], [-73.87288457445655, 40.79145210820714], [-73.87080888583708, 40.78789669184152], [-73.87308761694455, 40.78585495239161], [-73.8783068007881, 40.785356620754236], [-73.88905212421602, 40.78737256012899], [-73.89282283610926, 40.79281708195147], [-73.89179289686568, 40.79677524575864], [-73.88885148496314, 40.79870632895875]]]}}, {\&quot;id\&quot;: \&quot;199\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1357, \&quot;OBJECTID\&quot;: 200, \&quot;Shape_Leng\&quot;: 0.112661735435, \&quot;Shape_Area\&quot;: 0.000744643168558, \&quot;zone\&quot;: \&quot;Riverdale/North Riverdale/Fieldston\&quot;, \&quot;LocationID\&quot;: 200, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.896411335, 40.90450452099991], [-73.89643170799987, 40.89365527899989], [-73.89787887499983, 40.89027610099993], [-73.9028594909999, 40.88916474399989], [-73.90413642399992, 40.887080708999896], [-73.90975930299997, 40.889250027999886], [-73.91489276999991, 40.8846247709999], [-73.92058641888602, 40.88718267830985], [-73.9103325682445, 40.91553277700258], [-73.89663333881637, 40.911417374923055], [-73.896411335, 40.90450452099991]]]}}, {\&quot;id\&quot;: \&quot;200\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 152, \&quot;OBJECTID\&quot;: 201, \&quot;Shape_Leng\&quot;: 0.130404117686, \&quot;Shape_Area\&quot;: 0.000619350747819, \&quot;zone\&quot;: \&quot;Rockaway Park\&quot;, \&quot;LocationID\&quot;: 201, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.81849901800001, 40.5873623529999], [-73.81544517899997, 40.58337349199993], [-73.81730795916116, 40.58233475897], [-73.86255286029154, 40.56681001230082], [-73.86662812000002, 40.573057648999914], [-73.8504438514919, 40.582130243581396], [-73.83929597982016, 40.581863545478186], [-73.82480116623435, 40.587154615369926], [-73.81849901800001, 40.5873623529999]]]}}, {\&quot;id\&quot;: \&quot;201\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 10604, \&quot;OBJECTID\&quot;: 202, \&quot;Shape_Leng\&quot;: 0.0699215712618, \&quot;Shape_Area\&quot;: 0.000106175396322, \&quot;zone\&quot;: \&quot;Roosevelt Island\&quot;, \&quot;LocationID\&quot;: 202, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94180032729437, 40.76904692662474], [-73.95254079336881, 40.757095314537246], [-73.96158304969282, 40.74941430105318], [-73.94472478498723, 40.76978627176733], [-73.94007665725826, 40.77292618617896], [-73.94180032729437, 40.76904692662474]]]}}, {\&quot;id\&quot;: \&quot;202\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 784, \&quot;OBJECTID\&quot;: 203, \&quot;Shape_Leng\&quot;: 0.189937815868, \&quot;Shape_Area\&quot;: 0.000615129861659, \&quot;zone\&quot;: \&quot;Rosedale\&quot;, \&quot;LocationID\&quot;: 203, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7275350030123, 40.673930284146124], [-73.72833071887973, 40.66304394386548], [-73.72522608103498, 40.652001000073724], [-73.74143706021165, 40.646889178160706], [-73.74227387212949, 40.64012338122567], [-73.739471216134, 40.63570643191466], [-73.74246642615259, 40.635119228252094], [-73.74096487686366, 40.63730477503007], [-73.74397128496219, 40.63788001261484], [-73.7437342150463, 40.6390221176639], [-73.7464954765674, 40.63651030383521], [-73.74516219973704, 40.63811218797305], [-73.74704226024105, 40.636932365240085], [-73.74631467883957, 40.641394313090785], [-73.7487767478731, 40.64511819098248], [-73.75522386899995, 40.64744446899989], [-73.7541108669999, 40.648697664999915], [-73.76406290099993, 40.65435626599989], [-73.76165732899996, 40.658238085999855], [-73.74867194699979, 40.65267808799992], [-73.74332546799988, 40.652537803999905], [-73.74328714099991, 40.65613473199991], [-73.74853177199994, 40.65757569699993], [-73.74281884699987, 40.66530554899986], [-73.73891022900001, 40.66595449199986], [-73.74117817299991, 40.666402953999885], [-73.72718272499995, 40.68359732999987], [-73.72586264191175, 40.683241080973865], [-73.72563005109944, 40.67958795089065], [-73.7275350030123, 40.673930284146124]]]}}, {\&quot;id\&quot;: \&quot;203\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 23, \&quot;OBJECTID\&quot;: 204, \&quot;Shape_Leng\&quot;: 0.101912418311, \&quot;Shape_Area\&quot;: 0.000641384265972, \&quot;zone\&quot;: \&quot;Rossville/Woodrow\&quot;, \&quot;LocationID\&quot;: 204, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.2032648999999, 40.55562847699989], [-74.19174368799999, 40.53191669699986], [-74.20152661599995, 40.526265205999934], [-74.2156723039999, 40.52395762799989], [-74.21800676499996, 40.53229858999995], [-74.21776941599994, 40.54112662999992], [-74.22131562699998, 40.55025307399992], [-74.21784397799998, 40.55443271799988], [-74.21050789400002, 40.557064181999934], [-74.205854485, 40.55750245699993], [-74.2032648999999, 40.55562847699989]]]}}, {\&quot;id\&quot;: \&quot;204\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 610, \&quot;OBJECTID\&quot;: 205, \&quot;Shape_Leng\&quot;: 0.141953388327, \&quot;Shape_Area\&quot;: 0.000766216513505, \&quot;zone\&quot;: \&quot;Saint Albans\&quot;, \&quot;LocationID\&quot;: 205, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.766369252, 40.70256339699992], [-73.75205066499986, 40.70522802799995], [-73.74863325999986, 40.6954447609999], [-73.7435928609999, 40.69621532499986], [-73.75576169199995, 40.67588590899988], [-73.76380484799996, 40.67376993299995], [-73.77469730199986, 40.680486045999906], [-73.77220275299989, 40.681610338999896], [-73.7732870399999, 40.683454731999866], [-73.77699767599997, 40.68628268899992], [-73.77966850599998, 40.685377122999945], [-73.7832662499999, 40.68999429299992], [-73.78078155499992, 40.69102994299994], [-73.77977295099997, 40.689281169999916], [-73.77789337399993, 40.68991768999992], [-73.7802372379999, 40.692972334999894], [-73.77230768699997, 40.70057150699989], [-73.77559218799982, 40.70532930899986], [-73.7749009329999, 40.707066661999875], [-73.76844546499984, 40.709637026999886], [-73.766369252, 40.70256339699992]]]}}, {\&quot;id\&quot;: \&quot;205\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 184, \&quot;OBJECTID\&quot;: 206, \&quot;Shape_Leng\&quot;: 0.212756793386, \&quot;Shape_Area\&quot;: 0.000944392507762, \&quot;zone\&quot;: \&quot;Saint George/New Brighton\&quot;, \&quot;LocationID\&quot;: 206, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08221272914942, 40.64828016229008], [-74.07165829759784, 40.64503374643502], [-74.07093784471476, 40.64334596384062], [-74.07210952444638, 40.64246321679278], [-74.07032923715386, 40.64252612813239], [-74.07314400586021, 40.641852974480116], [-74.07019399559213, 40.6420075028053], [-74.07289005609624, 40.64092267287602], [-74.06998354653952, 40.64106894311676], [-74.07285041194942, 40.64080368844508], [-74.07258133886755, 40.63794187429597], [-74.07865269699992, 40.63830402499987], [-74.08373397299994, 40.63573714399991], [-74.08870582299987, 40.63684520599986], [-74.09242513499994, 40.63558181299992], [-74.09409312599998, 40.639266913999975], [-74.09767290799995, 40.63896067899989], [-74.09787969199995, 40.64035805499988], [-74.10974833299994, 40.63786583299993], [-74.11765722499996, 40.638062466999905], [-74.11614321199995, 40.62870226399988], [-74.1132624959999, 40.62305442499995], [-74.12125677899994, 40.62782274999989], [-74.1313098529999, 40.62632834299998], [-74.12867047299994, 40.63734826499993], [-74.1268887269999, 40.637210087999925], [-74.12705362202625, 40.64024173781949], [-74.11861635236262, 40.641530365028935], [-74.11883624616948, 40.64254186406039], [-74.1171709328468, 40.64162427104175], [-74.1172247008255, 40.64302735996259], [-74.11535082182925, 40.64247054015812], [-74.1097393256449, 40.64546372818479], [-74.09880066885808, 40.64504703431087], [-74.08570754378212, 40.648880553370454], [-74.08221272914942, 40.64828016229008]]]}}, {\&quot;id\&quot;: \&quot;206\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 12964, \&quot;OBJECTID\&quot;: 207, \&quot;Shape_Leng\&quot;: 0.0283756831492, \&quot;Shape_Area\&quot;: 4.47230848441e-05, \&quot;zone\&quot;: \&quot;Saint Michaels Cemetery/Woodside\&quot;, \&quot;LocationID\&quot;: 207, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90137640299986, 40.75964203799989], [-73.90356915599997, 40.765781788999924], [-73.90217951699996, 40.76731584199997], [-73.89349605899986, 40.765950929999924], [-73.89866137899992, 40.75992101699997], [-73.90137640299986, 40.75964203799989]]]}}, {\&quot;id\&quot;: \&quot;207\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1037, \&quot;OBJECTID\&quot;: 208, \&quot;Shape_Leng\&quot;: 0.214721009581, \&quot;Shape_Area\&quot;: 0.00202032598969, \&quot;zone\&quot;: \&quot;Schuylerville/Edgewater Park\&quot;, \&quot;LocationID\&quot;: 208, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.825986869, 40.84067575199988], [-73.82601252600003, 40.83402077799985], [-73.81552500922504, 40.83597630692601], [-73.81476387691956, 40.830816799993485], [-73.81275469994516, 40.82824823625135], [-73.80992515914596, 40.82817971199259], [-73.81384974851248, 40.8268035287504], [-73.81379523517661, 40.82529808600147], [-73.81211350556435, 40.82555263465937], [-73.81388934712506, 40.82408736742192], [-73.80766604765235, 40.825896992059], [-73.80451800414906, 40.81892768751854], [-73.79759032777322, 40.816507532070055], [-73.80140380968845, 40.8123633086586], [-73.80361390158114, 40.812521106621354], [-73.80453081609834, 40.81425461992442], [-73.80351667337368, 40.81395196364859], [-73.80704600153508, 40.816533693875236], [-73.80505213646254, 40.81289496243412], [-73.80224245334347, 40.81019739366033], [-73.79086475738406, 40.80734114044052], [-73.79028410874172, 40.80481710368888], [-73.7933898228672, 40.804204330036214], [-73.80185524738366, 40.808967826140574], [-73.80392673417204, 40.80852797081171], [-73.8099202908178, 40.81292915226176], [-73.81620056896291, 40.81384747647932], [-73.83017915330238, 40.81083454948945], [-73.8321661704888, 40.80850227767013], [-73.831615744777, 40.80493825599657], [-73.83743612112924, 40.80620264259155], [-73.84043199520461, 40.81254112811847], [-73.83974355921865, 40.816406071751366], [-73.83696070299992, 40.81634054099991], [-73.83614239499985, 40.81919890299987], [-73.83661819699992, 40.82711414899993], [-73.83709061399992, 40.82896714699996], [-73.84233077477266, 40.8290739624537], [-73.83885232384739, 40.83369066784824], [-73.83956700299987, 40.84054722799986], [-73.83771374899992, 40.840406309999885], [-73.83688925199996, 40.84337478799992], [-73.82611300699996, 40.84533869399991], [-73.825986869, 40.84067575199988]]], [[[-73.83960098545435, 40.83567071869858], [-73.83961672561374, 40.835667752627316], [-73.83962599488439, 40.83569971218477], [-73.83960850400152, 40.83570805084221], [-73.83960098545435, 40.83567071869858]]], [[[-73.83979488581072, 40.835619207246324], [-73.8396148723857, 40.83561056836579], [-73.83948374192397, 40.83457420079436], [-73.83959266810578, 40.83456047582325], [-73.83979488581072, 40.835619207246324]]]]}}, {\&quot;id\&quot;: \&quot;208\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 264208, \&quot;OBJECTID\&quot;: 209, \&quot;Shape_Leng\&quot;: 0.0306953113473, \&quot;Shape_Area\&quot;: 3.88703351209e-05, \&quot;zone\&quot;: \&quot;Seaport\&quot;, \&quot;LocationID\&quot;: 209, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00499805099996, 40.71201189699987], [-73.99919451154408, 40.707947376175724], [-74.00143661179398, 40.70487217770521], [-74.00906264699988, 40.71088670399993], [-74.00499805099996, 40.71201189699987]]]}}, {\&quot;id\&quot;: \&quot;209\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1132, \&quot;OBJECTID\&quot;: 210, \&quot;Shape_Leng\&quot;: 0.114851983372, \&quot;Shape_Area\&quot;: 0.000453155131253, \&quot;zone\&quot;: \&quot;Sheepshead Bay\&quot;, \&quot;LocationID\&quot;: 210, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92759936700004, 40.5950607789999], [-73.91805571865743, 40.58643685311621], [-73.92520361514241, 40.58580627115536], [-73.92802185276429, 40.588068756350886], [-73.9239529485009, 40.59113985052502], [-73.92863061415638, 40.58857263642073], [-73.92844090493661, 40.589030428141996], [-73.9291344038264, 40.588879241681944], [-73.92875703499415, 40.589152966925], [-73.92976615773313, 40.589292069447644], [-73.93003427450557, 40.58942599650075], [-73.93057705718242, 40.589890641203176], [-73.93010325988745, 40.58960610507142], [-73.93001650952081, 40.5940945360621], [-73.93260420556844, 40.59492954452495], [-73.93121294858955, 40.58953130811921], [-73.92972846380192, 40.58861391582969], [-73.93125191267133, 40.58684982521422], [-73.92857393936458, 40.58706150237135], [-73.92552860874584, 40.58497837657265], [-73.9344471859999, 40.586652074999925], [-73.96025825899996, 40.58502930799994], [-73.9603495359999, 40.58730628599994], [-73.95619313699986, 40.58776226899994], [-73.956927197, 40.596612075999865], [-73.94248473299992, 40.598200364999855], [-73.94288954099984, 40.600318649999934], [-73.93447158899997, 40.60123151199989], [-73.9335511719998, 40.60268728099991], [-73.92813139699999, 40.59777792799987], [-73.92956858299992, 40.5968202649999], [-73.92759936700004, 40.5950607789999]]]}}, {\&quot;id\&quot;: \&quot;210\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1332225, \&quot;OBJECTID\&quot;: 211, \&quot;Shape_Leng\&quot;: 0.0252345082132, \&quot;Shape_Area\&quot;: 3.97291966087e-05, \&quot;zone\&quot;: \&quot;SoHo\&quot;, \&quot;LocationID\&quot;: 211, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.001523638, 40.719820797999944], [-74.00539186699989, 40.722037365999896], [-74.00214891499996, 40.728035366999904], [-73.9967717579999, 40.7254319439999], [-74.001523638, 40.719820797999944]]]}}, {\&quot;id\&quot;: \&quot;211\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1677, \&quot;OBJECTID\&quot;: 212, \&quot;Shape_Leng\&quot;: 0.0671290653429, \&quot;Shape_Area\&quot;: 0.000161276191858, \&quot;zone\&quot;: \&quot;Soundview/Bruckner\&quot;, \&quot;LocationID\&quot;: 212, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88421976599987, 40.82299645799987], [-73.88378414099992, 40.828274291999946], [-73.87729930499995, 40.8287427739999], [-73.86085019699983, 40.833613537999874], [-73.857391213, 40.83229737199986], [-73.85615112900003, 40.82677004599987], [-73.88421976599987, 40.82299645799987]]]}}, {\&quot;id\&quot;: \&quot;212\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1725, \&quot;OBJECTID\&quot;: 213, \&quot;Shape_Leng\&quot;: 0.159958783822, \&quot;Shape_Area\&quot;: 0.000904077906339, \&quot;zone\&quot;: \&quot;Soundview/Castle Hill\&quot;, \&quot;LocationID\&quot;: 213, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.83667856399991, 40.81758876299995], [-73.83696070299992, 40.81634054099991], [-73.84003308726955, 40.81682214096213], [-73.83888231646733, 40.822140489856025], [-73.84228428387955, 40.82864660449135], [-73.83709061399992, 40.82896714699996], [-73.83667856399991, 40.81758876299995]]], [[[-73.84231712480313, 40.82718468468027], [-73.83999860407422, 40.81993494681306], [-73.84198684834051, 40.818774373908084], [-73.84617302872044, 40.81067666443039], [-73.8511447226069, 40.814396548876], [-73.85538030243693, 40.81428888208278], [-73.84903294180673, 40.81211891007852], [-73.84996696802818, 40.808578018843576], [-73.847488226419, 40.805448909149185], [-73.85019839036403, 40.80451002497395], [-73.856614854502, 40.80479692395033], [-73.85866549456955, 40.806833088596065], [-73.85895141221772, 40.810271417586556], [-73.8601269523559, 40.80960549989125], [-73.85935625734362, 40.80898803428646], [-73.85938875426787, 40.80816614120708], [-73.86065222514291, 40.80963668169183], [-73.86765646284456, 40.81058376193711], [-73.87077804885932, 40.814486895487775], [-73.8780628329999, 40.81618263199993], [-73.88244779599998, 40.81926832299992], [-73.8843985489999, 40.822965575999866], [-73.85635677499994, 40.82675208499993], [-73.85513639699997, 40.822436188999866], [-73.84289858800003, 40.82408305899986], [-73.84390624999999, 40.828407828999936], [-73.84231712480313, 40.82718468468027]]]]}}, {\&quot;id\&quot;: \&quot;213\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 144, \&quot;OBJECTID\&quot;: 214, \&quot;Shape_Leng\&quot;: 0.135300314246, \&quot;Shape_Area\&quot;: 0.000811976523012, \&quot;zone\&quot;: \&quot;South Beach/Dongan Hills\&quot;, \&quot;LocationID\&quot;: 214, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08491019899996, 40.59570472799985], [-74.08173342999991, 40.59215628599987], [-74.07043976099992, 40.59673474699988], [-74.06436003721248, 40.58826789117477], [-74.07499413073505, 40.57923655741631], [-74.07336118472098, 40.578275488289144], [-74.07508288192615, 40.579160158755506], [-74.08495715819193, 40.57125984002107], [-74.10039083499996, 40.579688665999925], [-74.09844000899997, 40.581241705999915], [-74.10525775499997, 40.58592143599986], [-74.10088251699995, 40.59017921599992], [-74.09979588999995, 40.59387136599988], [-74.09375453799998, 40.59674488999988], [-74.08983655899989, 40.60077409499996], [-74.08218729299988, 40.601941007999876], [-74.08130343799999, 40.59938765599991], [-74.08532650099991, 40.59700832199995], [-74.08491019899996, 40.59570472799985]]]}}, {\&quot;id\&quot;: \&quot;214\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 9516, \&quot;OBJECTID\&quot;: 215, \&quot;Shape_Leng\&quot;: 0.103556453625, \&quot;Shape_Area\&quot;: 0.000395647022725, \&quot;zone\&quot;: \&quot;South Jamaica\&quot;, \&quot;LocationID\&quot;: 215, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7769103769999, 40.70252488499994], [-73.77395659499986, 40.699805781999906], [-73.7802372379999, 40.692972334999894], [-73.77789337399993, 40.68991768999992], [-73.77977295099997, 40.689281169999916], [-73.78078155499992, 40.69102994299994], [-73.793908417, 40.68630469099985], [-73.79561486799987, 40.688656890999916], [-73.79995042799996, 40.68682771899991], [-73.79898209099994, 40.68485873799988], [-73.80576840199991, 40.682932390999916], [-73.81063298299996, 40.69194738299988], [-73.80890216900004, 40.69256434899993], [-73.80642479399984, 40.690873857999904], [-73.79260506799987, 40.70043209999988], [-73.79239170299988, 40.7021665299999], [-73.78256582599995, 40.70542486399989], [-73.78034491200003, 40.70541241699986], [-73.7769103769999, 40.70252488499994]]]}}, {\&quot;id\&quot;: \&quot;215\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 8084, \&quot;OBJECTID\&quot;: 216, \&quot;Shape_Leng\&quot;: 0.116797554681, \&quot;Shape_Area\&quot;: 0.000816076647781, \&quot;zone\&quot;: \&quot;South Ozone Park\&quot;, \&quot;LocationID\&quot;: 216, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.80857655199986, 40.688330889999925], [-73.80142836799988, 40.673666833999874], [-73.80203207699995, 40.66524802499994], [-73.81496922499986, 40.66247266799991], [-73.832705339, 40.665405772999854], [-73.84012856099982, 40.6811466509999], [-73.83697486299991, 40.6819880179999], [-73.83807769099997, 40.68423890999988], [-73.82753021399995, 40.687239482999914], [-73.82851136799994, 40.689239055999934], [-73.82599347399987, 40.689953661999894], [-73.82501128899997, 40.68795231799991], [-73.81063298299996, 40.69194738299988], [-73.80857655199986, 40.688330889999925]]]}}, {\&quot;id\&quot;: \&quot;216\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 18314, \&quot;OBJECTID\&quot;: 217, \&quot;Shape_Leng\&quot;: 0.0553905251285, \&quot;Shape_Area\&quot;: 0.000114733270758, \&quot;zone\&quot;: \&quot;South Williamsburg\&quot;, \&quot;LocationID\&quot;: 217, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95554165799997, 40.70759344799989], [-73.94705205299991, 40.70366394899985], [-73.95128819399989, 40.700922364999855], [-73.95381196900003, 40.703180979999914], [-73.95745736399992, 40.70082260299993], [-73.95701993199991, 40.69897391399995], [-73.96283963699993, 40.698038667999946], [-73.96217978199998, 40.70022070999989], [-73.96838933699995, 40.70682918699989], [-73.95554165799997, 40.70759344799989]]]}}, {\&quot;id\&quot;: \&quot;217\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 860, \&quot;OBJECTID\&quot;: 218, \&quot;Shape_Leng\&quot;: 0.0837008281049, \&quot;Shape_Area\&quot;: 0.000281293736407, \&quot;zone\&quot;: \&quot;Springfield Gardens North\&quot;, \&quot;LocationID\&quot;: 218, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76561573099998, 40.6747790199999], [-73.76380484799996, 40.67376993299995], [-73.76031463999993, 40.67510997099984], [-73.75857198899986, 40.67263733099987], [-73.75636239300002, 40.67242923699999], [-73.75763129599993, 40.66645115699992], [-73.77342462799993, 40.66802761899988], [-73.78940999399987, 40.66684115899995], [-73.78808647399985, 40.6730096269999], [-73.78573730899993, 40.67238503499988], [-73.77722923600001, 40.679652720999904], [-73.77469730199986, 40.680486045999906], [-73.76561573099998, 40.6747790199999]]]}}, {\&quot;id\&quot;: \&quot;218\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 7350, \&quot;OBJECTID\&quot;: 219, \&quot;Shape_Leng\&quot;: 0.155126669675, \&quot;Shape_Area\&quot;: 0.000428176336771, \&quot;zone\&quot;: \&quot;Springfield Gardens South\&quot;, \&quot;LocationID\&quot;: 219, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.761822313, 40.666877759999856], [-73.73856469500002, 40.66639689799991], [-73.74450922599979, 40.663821277999865], [-73.74853177199994, 40.65757569699993], [-73.74328714099991, 40.65613473199991], [-73.74332546899993, 40.65253780399992], [-73.74867194699979, 40.65267808799992], [-73.76165732899996, 40.658238085999855], [-73.76406290099993, 40.65435626599989], [-73.78321833499997, 40.663166283999864], [-73.80203207699995, 40.66524802499994], [-73.80155565300004, 40.6667533639999], [-73.77342462799993, 40.66802761899988], [-73.761822313, 40.666877759999856]]]}}, {\&quot;id\&quot;: \&quot;219\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3984, \&quot;OBJECTID\&quot;: 220, \&quot;Shape_Leng\&quot;: 0.106015943267, \&quot;Shape_Area\&quot;: 0.000313035744467, \&quot;zone\&quot;: \&quot;Spuyten Duyvil/Kingsbridge\&quot;, \&quot;LocationID\&quot;: 220, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89827216899992, 40.8894579429999], [-73.89972588599989, 40.88651488699985], [-73.89661546599986, 40.885955255999946], [-73.90369454799992, 40.878501617999895], [-73.90608130599988, 40.873239628999904], [-73.90746489699994, 40.87354735399985], [-73.9068187309999, 40.87661958799993], [-73.91033193599998, 40.879038046999895], [-73.91775669364831, 40.8756636279301], [-73.92490327486523, 40.87888836792653], [-73.92058641888602, 40.88718267830985], [-73.91489276999991, 40.8846247709999], [-73.90900536, 40.88950014099986], [-73.90413642399992, 40.887080708999896], [-73.9028594909999, 40.88916474399989], [-73.89827216899992, 40.8894579429999]]]}}, {\&quot;id\&quot;: \&quot;220\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 160, \&quot;OBJECTID\&quot;: 221, \&quot;Shape_Leng\&quot;: 0.166218220846, \&quot;Shape_Area\&quot;: 0.000890111567051, \&quot;zone\&quot;: \&quot;Stapleton\&quot;, \&quot;LocationID\&quot;: 221, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.07530550099992, 40.637729958999955], [-74.07053959705199, 40.63747140462426], [-74.07341562632824, 40.63689395096554], [-74.07209483807503, 40.63664727762461], [-74.07335822045584, 40.63653609416517], [-74.0729847461233, 40.630308978981404], [-74.06802173543946, 40.62878758518541], [-74.07291177936548, 40.62999637940653], [-74.07225500955778, 40.62460875019394], [-74.06975543088323, 40.6212081398724], [-74.06544586069478, 40.61920262828925], [-74.06668207982919, 40.61806749593851], [-74.06425721751587, 40.61817168758555], [-74.06509908407213, 40.61751095612543], [-74.05685812390232, 40.608056357772554], [-74.0651709129999, 40.604213507999894], [-74.06350565699996, 40.60215005499991], [-74.07399965299999, 40.60572556699987], [-74.0815547009999, 40.60629029699987], [-74.0714060829999, 40.61943137899991], [-74.07253551699989, 40.622464021999896], [-74.08720982799996, 40.61330697299989], [-74.0878234189999, 40.615087934999885], [-74.08415419899998, 40.626267114999905], [-74.07972492199995, 40.62895068799986], [-74.08574928999992, 40.633955556999865], [-74.07878831099995, 40.63826855899991], [-74.07530550099992, 40.637729958999955]]]}}, {\&quot;id\&quot;: \&quot;221\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 403, \&quot;OBJECTID\&quot;: 222, \&quot;Shape_Leng\&quot;: 0.0483893527976, \&quot;Shape_Area\&quot;: 0.000130268343918, \&quot;zone\&quot;: \&quot;Starrett City\&quot;, \&quot;LocationID\&quot;: 222, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.87908517399995, 40.65020211699988], [-73.8745808109999, 40.64561010599992], [-73.87841589406925, 40.638912189353306], [-73.88006714132425, 40.64200344662675], [-73.88341999203011, 40.64452381564944], [-73.88557762124442, 40.644040950146135], [-73.88764072166725, 40.64780239000726], [-73.89125147199995, 40.65002559699993], [-73.88221364899994, 40.65451863799996], [-73.87908517399995, 40.65020211699988]]], [[[-73.8882853135604, 40.64672241327608], [-73.88864137620679, 40.647079553158], [-73.88851637568528, 40.64736069152191], [-73.88820050726648, 40.647140869529046], [-73.8882853135604, 40.64672241327608]]]]}}, {\&quot;id\&quot;: \&quot;222\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 114788, \&quot;OBJECTID\&quot;: 223, \&quot;Shape_Leng\&quot;: 0.166021925275, \&quot;Shape_Area\&quot;: 0.00076436070058, \&quot;zone\&quot;: \&quot;Steinway\&quot;, \&quot;LocationID\&quot;: 223, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90649492923363, 40.7901809903447], [-73.90032629743816, 40.789007662825696], [-73.8959296297551, 40.785648944313756], [-73.89874897638398, 40.78278115576602], [-73.90114577552107, 40.78271110609054], [-73.90257929672345, 40.78028912083556], [-73.89437777934127, 40.78424320348422], [-73.89606377738421, 40.783157201805224], [-73.895284679113, 40.78154124925482], [-73.89274917876409, 40.78296570668481], [-73.89165459123714, 40.78219478153064], [-73.89300986180193, 40.78179802356213], [-73.89119589704391, 40.77856328788702], [-73.89251064542336, 40.77739286927271], [-73.89183244902246, 40.77488019994431], [-73.88945486901865, 40.77353295106357], [-73.88770661799987, 40.76683859799995], [-73.89349605899986, 40.765950929999924], [-73.91759120499997, 40.769900870999926], [-73.92398142900002, 40.77461511299991], [-73.92375761299998, 40.77654701199991], [-73.91796581399993, 40.78125629199991], [-73.91996458796496, 40.78263506876824], [-73.912599859115, 40.78937632963394], [-73.90985862925774, 40.790945493781884], [-73.90649492923363, 40.7901809903447]]]}}, {\&quot;id\&quot;: \&quot;223\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 495970, \&quot;OBJECTID\&quot;: 224, \&quot;Shape_Leng\&quot;: 0.0440204462769, \&quot;Shape_Area\&quot;: 9.84786989135e-05, \&quot;zone\&quot;: \&quot;Stuy Town/Peter Cooper Village\&quot;, \&quot;LocationID\&quot;: 224, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97511055399991, 40.735390254999864], [-73.97151882628022, 40.72935136174009], [-73.97162697285862, 40.72662845299842], [-73.98255629299986, 40.731350133999875], [-73.97849845599995, 40.73679095699989], [-73.97511055399991, 40.735390254999864]]]}}, {\&quot;id\&quot;: \&quot;224\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 28660, \&quot;OBJECTID\&quot;: 225, \&quot;Shape_Leng\&quot;: 0.0887992073281, \&quot;Shape_Area\&quot;: 0.000310835395162, \&quot;zone\&quot;: \&quot;Stuyvesant Heights\&quot;, \&quot;LocationID\&quot;: 225, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91741294299999, 40.68403405199993], [-73.9163011989999, 40.67857711199991], [-73.92183500099998, 40.67894555899991], [-73.92281374299995, 40.68341442999991], [-73.93500821699992, 40.68276376799985], [-73.93435066499993, 40.67956340799991], [-73.94032794, 40.679889974999874], [-73.94394947299996, 40.698221278999924], [-73.93817718599986, 40.69864022299987], [-73.91804607, 40.68721324799989], [-73.91741294299999, 40.68403405199993]]]}}, {\&quot;id\&quot;: \&quot;225\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 269571, \&quot;OBJECTID\&quot;: 226, \&quot;Shape_Leng\&quot;: 0.168957762041, \&quot;Shape_Area\&quot;: 0.00076194414504, \&quot;zone\&quot;: \&quot;Sunnyside\&quot;, \&quot;LocationID\&quot;: 226, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90989961499994, 40.749087274999944], [-73.91187504099992, 40.74822079599992], [-73.9119412979999, 40.742382948999925], [-73.91567469599988, 40.740784929999904], [-73.91903825199986, 40.73200596599987], [-73.917342506, 40.731382825999916], [-73.91796696699996, 40.7285007709999], [-73.91205021299994, 40.72850636299993], [-73.91174734199988, 40.72991203299991], [-73.90712253099991, 40.727424727999924], [-73.91384828299984, 40.72289841199989], [-73.91132095099978, 40.71962422999992], [-73.92232773978448, 40.71659264406108], [-73.92515207271921, 40.722335339820816], [-73.9244229875485, 40.723589975986165], [-73.92037064235664, 40.723681113821044], [-73.92490316165177, 40.72450657567146], [-73.92923485876162, 40.72826016576104], [-73.93804478507161, 40.730509967846054], [-73.94162472636452, 40.73584144233816], [-73.94594410333028, 40.73751251570048], [-73.94140886345744, 40.73929957085316], [-73.93869664599998, 40.738140816999866], [-73.93726110699994, 40.745176490999896], [-73.94401030399996, 40.7436394539999], [-73.93383269399993, 40.7516047019999], [-73.91547326299991, 40.75379181799991], [-73.91035492999984, 40.75274990899987], [-73.90989961499994, 40.749087274999944]]]}}, {\&quot;id\&quot;: \&quot;226\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2393, \&quot;OBJECTID\&quot;: 227, \&quot;Shape_Leng\&quot;: 0.0828301570789, \&quot;Shape_Area\&quot;: 0.000268316529534, \&quot;zone\&quot;: \&quot;Sunset Park East\&quot;, \&quot;LocationID\&quot;: 227, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.991928124, 40.6422049039999], [-73.9955103369999, 40.63980966699993], [-73.99917564699989, 40.642025441999934], [-74.00735636699996, 40.6341636269999], [-74.00556490399993, 40.63308317599992], [-74.01000340799995, 40.630113088999906], [-74.01602010100001, 40.63331711399997], [-74.016835401, 40.63535542899995], [-74.0139608859999, 40.63815326699995], [-74.01616711499993, 40.63948244099991], [-74.00214474699993, 40.65295610699995], [-73.98905872499985, 40.64411924099995], [-73.991928124, 40.6422049039999]]]}}, {\&quot;id\&quot;: \&quot;227\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 20354, \&quot;OBJECTID\&quot;: 228, \&quot;Shape_Leng\&quot;: 0.177685177706, \&quot;Shape_Area\&quot;: 0.000993414783816, \&quot;zone\&quot;: \&quot;Sunset Park West\&quot;, \&quot;LocationID\&quot;: 228, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9969179149999, 40.6691534839999], [-73.99490350099988, 40.6667854349999], [-73.99692689899985, 40.664374914999925], [-73.99063545399997, 40.660579088999896], [-73.988716511, 40.66240493799995], [-73.98725068899996, 40.66037895599992], [-73.990188415, 40.657600817999906], [-73.99516890199999, 40.659669521999945], [-74.01616711499993, 40.63948244099991], [-74.0139608859999, 40.63815326699995], [-74.016835401, 40.63535542899995], [-74.02141038399992, 40.638584902999845], [-74.02108051399998, 40.64149093699994], [-74.02475437599998, 40.6381214179999], [-74.03266558998958, 40.643720344890056], [-74.03051830863413, 40.645274425208974], [-74.02820569545007, 40.644015982890345], [-74.02604948400315, 40.64626135032611], [-74.0293899048662, 40.64880405511391], [-74.02571758804807, 40.64661549229093], [-74.02461487103106, 40.64715112511878], [-74.02622102475574, 40.64824842780924], [-74.02414566050564, 40.647615101259845], [-74.02605133196793, 40.6509943007431], [-74.02285141795983, 40.651169195161685], [-74.02522662972656, 40.652829856959634], [-74.02154138319214, 40.650671622911226], [-74.02380703903121, 40.65304472851146], [-74.02118670027885, 40.652839836895325], [-74.02320464727141, 40.654096116817925], [-74.0186223830857, 40.653491349022964], [-74.02005182454292, 40.655335948874416], [-74.01715319581021, 40.65477510436213], [-74.01970596410222, 40.656581163751035], [-74.01639437533773, 40.65562064285071], [-74.01910843803118, 40.657368884303494], [-74.01585370056823, 40.65621324055534], [-74.01786573109669, 40.65830844729852], [-74.01442130484548, 40.657608021951376], [-74.01745803087898, 40.6594501973867], [-74.01554165388997, 40.66075835547614], [-74.01183862056543, 40.65891283727472], [-74.0131555493881, 40.66198159772593], [-74.00859956968284, 40.65952092309827], [-74.00745858163884, 40.66055847620986], [-74.0103720129723, 40.66239888023248], [-74.00955074142026, 40.6632676941304], [-74.0034880110065, 40.66224055612849], [-74.00599748682693, 40.66325861082859], [-74.00772133506703, 40.66471863301977], [-74.0071253264673, 40.66491521847423], [-74.00362862508561, 40.66273484753458], [-74.00486193792649, 40.66506482193817], [-74.00083401108444, 40.66300644269171], [-73.99953152609916, 40.6643974859369], [-74.00292463516384, 40.66646231216332], [-73.99998149339123, 40.66745027490869], [-73.99902600998384, 40.66844297212693], [-73.9986188799999, 40.67183017199989], [-73.9969179149999, 40.6691534839999]]]}}, {\&quot;id\&quot;: \&quot;228\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2808372, \&quot;OBJECTID\&quot;: 229, \&quot;Shape_Leng\&quot;: 0.0425252900116, \&quot;Shape_Area\&quot;: 9.47058230931e-05, \&quot;zone\&quot;: \&quot;Sutton Place/Turtle Bay North\&quot;, \&quot;LocationID\&quot;: 229, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96162927534907, 40.75515238425915], [-73.96482214210387, 40.75159632579112], [-73.9712170449999, 40.75519332399994], [-73.9665833839999, 40.76155093499988], [-73.95877790811335, 40.75827092092435], [-73.96162927534907, 40.75515238425915]]]}}, {\&quot;id\&quot;: \&quot;229\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4704265, \&quot;OBJECTID\&quot;: 230, \&quot;Shape_Leng\&quot;: 0.0310283096779, \&quot;Shape_Area\&quot;: 5.60914463266e-05, \&quot;zone\&quot;: \&quot;Times Sq/Theatre District\&quot;, \&quot;LocationID\&quot;: 230, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98362433299988, 40.75551634599986], [-73.98979085399996, 40.7572331319999], [-73.98428230099987, 40.76479181499994], [-73.97860169399989, 40.762396071999945], [-73.98362433299988, 40.75551634599986]]]}}, {\&quot;id\&quot;: \&quot;230\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2850971, \&quot;OBJECTID\&quot;: 231, \&quot;Shape_Leng\&quot;: 0.0634201165587, \&quot;Shape_Area\&quot;: 0.000166929752992, \&quot;zone\&quot;: \&quot;TriBeCa/Civic Center\&quot;, \&quot;LocationID\&quot;: 231, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00931760399995, 40.72470155099989], [-73.99995620900002, 40.71801709499987], [-74.00485768099996, 40.7124525409999], [-74.00834760999993, 40.71135854599987], [-74.01375388499997, 40.71369055499987], [-74.01244109199989, 40.719057672999874], [-74.01457231438083, 40.72027413774219], [-74.01296558526825, 40.720328675587126], [-74.01102457999994, 40.72579386199991], [-74.00931760399995, 40.72470155099989]]]}}, {\&quot;id\&quot;: \&quot;231\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 318177, \&quot;OBJECTID\&quot;: 232, \&quot;Shape_Leng\&quot;: 0.0614709085331, \&quot;Shape_Area\&quot;: 0.000216049973456, \&quot;zone\&quot;: \&quot;Two Bridges/Seward Park\&quot;, \&quot;LocationID\&quot;: 232, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97635525199995, 40.71913288399983], [-73.97347975524508, 40.7188614291129], [-73.97782091638247, 40.71064544490706], [-73.9919434659999, 40.70958905299992], [-73.99256242199989, 40.71438807699996], [-73.99022012699989, 40.71440493999988], [-73.98382387299982, 40.72147287199987], [-73.97635525199995, 40.71913288399983]]]}}, {\&quot;id\&quot;: \&quot;232\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2024461, \&quot;OBJECTID\&quot;: 233, \&quot;Shape_Leng\&quot;: 0.048035918294, \&quot;Shape_Area\&quot;: 0.000116188094682, \&quot;zone\&quot;: \&quot;UN/Turtle Bay South\&quot;, \&quot;LocationID\&quot;: 233, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.96547092299994, 40.75193959699991], [-73.97123301520192, 40.743414663960074], [-73.97350835000003, 40.7437820339999], [-73.97121971999988, 40.74692154099996], [-73.9758346669999, 40.74886314599996], [-73.9712170449999, 40.75519332399994], [-73.96547092299994, 40.75193959699991]]], [[[-73.96421230395673, 40.74660431847665], [-73.96444522752618, 40.74641042576318], [-73.96458318426942, 40.746454400673315], [-73.96415980288437, 40.74686554735954], [-73.96421230395673, 40.74660431847665]]]]}}, {\&quot;id\&quot;: \&quot;233\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4755323, \&quot;OBJECTID\&quot;: 234, \&quot;Shape_Leng\&quot;: 0.0360721994984, \&quot;Shape_Area\&quot;: 7.31054382894e-05, \&quot;zone\&quot;: \&quot;Union Sq\&quot;, \&quot;LocationID\&quot;: 234, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98996936399989, 40.73490456699994], [-73.99683993899998, 40.73736088899995], [-73.99051761299985, 40.746038637999895], [-73.98407485299995, 40.74332471799989], [-73.98996936399989, 40.73490456699994]]]}}, {\&quot;id\&quot;: \&quot;234\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3476, \&quot;OBJECTID\&quot;: 235, \&quot;Shape_Leng\&quot;: 0.0761668426519, \&quot;Shape_Area\&quot;: 0.000212844547337, \&quot;zone\&quot;: \&quot;University Heights/Morris Heights\&quot;, \&quot;LocationID\&quot;: 235, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90947862999988, 40.86180812899987], [-73.91328437000003, 40.859618600999944], [-73.90976165899988, 40.857182611999896], [-73.90679734899983, 40.85937358899988], [-73.90468371399987, 40.85706030199991], [-73.91416184199993, 40.845179187999925], [-73.92808209386837, 40.84539159691672], [-73.91422824049913, 40.862490790359615], [-73.90947862999988, 40.86180812899987]]]}}, {\&quot;id\&quot;: \&quot;235\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 4835549, \&quot;OBJECTID\&quot;: 236, \&quot;Shape_Leng\&quot;: 0.0442519223099, \&quot;Shape_Area\&quot;: 0.000102864345211, \&quot;zone\&quot;: \&quot;Upper East Side North\&quot;, \&quot;LocationID\&quot;: 236, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95779380499984, 40.773599896999926], [-73.96468735799992, 40.77567708199994], [-73.9557773589999, 40.78791392399995], [-73.94933170599992, 40.78519312699994], [-73.95779380499984, 40.773599896999926]]]}}, {\&quot;id\&quot;: \&quot;236\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 5325938, \&quot;OBJECTID\&quot;: 237, \&quot;Shape_Leng\&quot;: 0.0422126003388, \&quot;Shape_Area\&quot;: 9.59873206621e-05, \&quot;zone\&quot;: \&quot;Upper East Side South\&quot;, \&quot;LocationID\&quot;: 237, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9661274729999, 40.762179299999914], [-73.97301487199995, 40.76427887899991], [-73.96468735799992, 40.77567708199994], [-73.95825534899998, 40.772965336999896], [-73.9661274729999, 40.762179299999914]]]}}, {\&quot;id\&quot;: \&quot;237\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2555828, \&quot;OBJECTID\&quot;: 238, \&quot;Shape_Leng\&quot;: 0.0601093114033, \&quot;Shape_Area\&quot;: 0.000184763693765, \&quot;zone\&quot;: \&quot;Upper West Side North\&quot;, \&quot;LocationID\&quot;: 238, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96884378999985, 40.78596738899994], [-73.98188645923244, 40.7905165804675], [-73.97639951965265, 40.79827321084623], [-73.96417598599989, 40.79236204499989], [-73.96884378999985, 40.78596738899994]]]}}, {\&quot;id\&quot;: \&quot;238\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3486261, \&quot;OBJECTID\&quot;: 239, \&quot;Shape_Leng\&quot;: 0.0636261152958, \&quot;Shape_Area\&quot;: 0.000204715440774, \&quot;zone\&quot;: \&quot;Upper West Side South\&quot;, \&quot;LocationID\&quot;: 239, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97501417199996, 40.78768560599987], [-73.96933573299991, 40.78529327999992], [-73.97499744000007, 40.77753254599988], [-73.98507184299989, 40.781779680999946], [-73.98567936099997, 40.780312632999944], [-73.9881274613434, 40.78140179672366], [-73.98546581197031, 40.78536070057545], [-73.98711901394246, 40.7852103190041], [-73.98542932126932, 40.78541394218458], [-73.98465507883023, 40.78653474180792], [-73.98594956155647, 40.78648711396651], [-73.98188645923244, 40.7905165804675], [-73.97501417199996, 40.78768560599987]]]}}, {\&quot;id\&quot;: \&quot;239\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 474, \&quot;OBJECTID\&quot;: 240, \&quot;Shape_Leng\&quot;: 0.146069764379, \&quot;Shape_Area\&quot;: 0.000722130920707, \&quot;zone\&quot;: \&quot;Van Cortlandt Park\&quot;, \&quot;LocationID\&quot;: 240, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87643743099994, 40.89687059299995], [-73.8771197409999, 40.895468663999964], [-73.87048672599987, 40.896640210999905], [-73.86135927899984, 40.89466231899991], [-73.86943471300005, 40.87812919899994], [-73.87094367500002, 40.87851076699998], [-73.87024100099985, 40.88022935299995], [-73.87494589799991, 40.87994766899988], [-73.87467601499999, 40.88156285199993], [-73.87812594399992, 40.88215382599989], [-73.87803562399996, 40.887118321999885], [-73.88124422499992, 40.88270963299992], [-73.89972588499982, 40.886514886999926], [-73.89643170799987, 40.89365527899989], [-73.89663333831646, 40.91141737492314], [-73.86789043706806, 40.90298695407611], [-73.87643743099994, 40.89687059299995]]]}}, {\&quot;id\&quot;: \&quot;240\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1630, \&quot;OBJECTID\&quot;: 241, \&quot;Shape_Leng\&quot;: 0.0687645777649, \&quot;Shape_Area\&quot;: 0.00025467697592, \&quot;zone\&quot;: \&quot;Van Cortlandt Village\&quot;, \&quot;LocationID\&quot;: 241, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88840157099996, 40.88441707499993], [-73.88705142599984, 40.884349575999906], [-73.88567517999988, 40.87887251099986], [-73.88937163799984, 40.87338229799993], [-73.8879350369998, 40.87203023199988], [-73.89438130299995, 40.866068850999966], [-73.89891854299988, 40.86965857399992], [-73.89942436199988, 40.86788083799993], [-73.90374975899987, 40.86959562699992], [-73.90608130599988, 40.873239628999904], [-73.89855059899999, 40.88437472699996], [-73.89661546599986, 40.885955255999946], [-73.88840157099996, 40.88441707499993]]]}}, {\&quot;id\&quot;: \&quot;241\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1682, \&quot;OBJECTID\&quot;: 242, \&quot;Shape_Leng\&quot;: 0.138136446433, \&quot;Shape_Area\&quot;: 0.000360072450014, \&quot;zone\&quot;: \&quot;Van Nest/Morris Park\&quot;, \&quot;LocationID\&quot;: 242, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83593362199987, 40.84840635599993], [-73.83771374799997, 40.84040630999987], [-73.84204144699997, 40.84064589699992], [-73.84458129199986, 40.838535507999914], [-73.85052278099987, 40.84278948899985], [-73.87359713599987, 40.83979855499992], [-73.86804200399997, 40.8448138389999], [-73.86860515599989, 40.85206864599991], [-73.86303938099996, 40.850611306999944], [-73.86250923799993, 40.84836228099987], [-73.85457388299992, 40.85150834599995], [-73.85304526899994, 40.849547331999865], [-73.84430846999992, 40.85119046399989], [-73.84494053799982, 40.8482182209999], [-73.84049767399992, 40.8541841049999], [-73.83499552599994, 40.85657120099989], [-73.8368191849999, 40.85727680899989], [-73.82847346699995, 40.860731352999906], [-73.83283502299986, 40.8560358449999], [-73.83129157699989, 40.85543410499991], [-73.83463970199993, 40.853817993999904], [-73.83593362199987, 40.84840635599993]]]}}, {\&quot;id\&quot;: \&quot;242\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 32518, \&quot;OBJECTID\&quot;: 243, \&quot;Shape_Leng\&quot;: 0.0943314999364, \&quot;Shape_Area\&quot;: 0.000438377341503, \&quot;zone\&quot;: \&quot;Washington Heights North\&quot;, \&quot;LocationID\&quot;: 243, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93156536999994, 40.86958215799991], [-73.92474153399992, 40.86159363799992], [-73.92709951599986, 40.85827552099992], [-73.92467094699998, 40.8568108889999], [-73.92747680599985, 40.85069436999992], [-73.93139355399987, 40.84742823099985], [-73.94203871799984, 40.851931028999914], [-73.94317806099995, 40.84979994299991], [-73.94692626452422, 40.850528055834154], [-73.94186996426673, 40.853867739442755], [-73.93156536999994, 40.86958215799991]]]}}, {\&quot;id\&quot;: \&quot;243\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 134680, \&quot;OBJECTID\&quot;: 244, \&quot;Shape_Leng\&quot;: 0.0805686044599, \&quot;Shape_Area\&quot;: 0.000359702747951, \&quot;zone\&quot;: \&quot;Washington Heights South\&quot;, \&quot;LocationID\&quot;: 244, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94068822000003, 40.85131543299985], [-73.93139355399987, 40.84742823099985], [-73.93556697199989, 40.841712527999924], [-73.93505508799984, 40.8393332359999], [-73.94034643299983, 40.8304578419999], [-73.95015521048293, 40.83439675940791], [-73.94612416421772, 40.84389249655712], [-73.9469644175959, 40.85046552581819], [-73.94317806099984, 40.84979994399989], [-73.94203871799984, 40.851931028999914], [-73.94068822000003, 40.85131543299985]]]}}, {\&quot;id\&quot;: \&quot;244\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 84, \&quot;OBJECTID\&quot;: 245, \&quot;Shape_Leng\&quot;: 0.0959830596604, \&quot;Shape_Area\&quot;: 0.000466175414294, \&quot;zone\&quot;: \&quot;West Brighton\&quot;, \&quot;LocationID\&quot;: 245, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.09787969199995, 40.64035805499988], [-74.09767290799995, 40.63896067899989], [-74.09409312599998, 40.639266913999975], [-74.09242513499994, 40.63558181299992], [-74.08870582299987, 40.63684520599986], [-74.08373397299994, 40.63573714399991], [-74.09223971399994, 40.62574291599987], [-74.10350925299994, 40.61641607499991], [-74.1132624959999, 40.62305442499995], [-74.11614321199995, 40.62870226399988], [-74.11765722499997, 40.63806246599996], [-74.10974833299994, 40.63786583299993], [-74.09787969199995, 40.64035805499988]]]}}, {\&quot;id\&quot;: \&quot;245\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2220769, \&quot;OBJECTID\&quot;: 246, \&quot;Shape_Leng\&quot;: 0.0694671937437, \&quot;Shape_Area\&quot;: 0.000281298327076, \&quot;zone\&quot;: \&quot;West Chelsea/Hudson Yards\&quot;, \&quot;LocationID\&quot;: 246, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00439976203513, 40.76267135909888], [-73.99547450199992, 40.759626856999894], [-74.00820401899988, 40.74214751799986], [-74.01213726936172, 40.74353192705926], [-74.0087278005888, 40.74485823290996], [-74.01183642872407, 40.74512596367872], [-74.00946389855962, 40.74575014365948], [-74.01150411235528, 40.74699080250515], [-74.0091373625992, 40.74735976280298], [-74.01133174441699, 40.748000575341926], [-74.0090584790135, 40.74778564533286], [-74.00894606502312, 40.74841189316866], [-74.01121562130406, 40.74869682117583], [-74.00842636447226, 40.75215785023921], [-74.0099905581974, 40.75281618714907], [-74.00997058797012, 40.75293356415314], [-74.00835352838844, 40.752350739342255], [-74.00480392560178, 40.75780984316466], [-74.00700358904015, 40.759231870341075], [-74.00390742032765, 40.75937569218354], [-74.00233528130057, 40.76154372700156], [-74.00439976203513, 40.76267135909888]]]}}, {\&quot;id\&quot;: \&quot;246\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 19472, \&quot;OBJECTID\&quot;: 247, \&quot;Shape_Leng\&quot;: 0.0929678582271, \&quot;Shape_Area\&quot;: 0.000205617157843, \&quot;zone\&quot;: \&quot;West Concourse\&quot;, \&quot;LocationID\&quot;: 247, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91222180499983, 40.84235659099988], [-73.91986089399987, 40.83194722699992], [-73.92885642099992, 40.81487986599991], [-73.93027812699984, 40.813248024999965], [-73.93242632000944, 40.81411751897961], [-73.9330725108407, 40.82815615201811], [-73.92850073899989, 40.829352349999965], [-73.92399049499993, 40.83505229799987], [-73.91901668400004, 40.83838109299989], [-73.91618344399991, 40.84233489999991], [-73.91794965199988, 40.842229570999976], [-73.91729224999992, 40.84510993999991], [-73.91222180499983, 40.84235659099988]]]}}, {\&quot;id\&quot;: \&quot;247\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1126, \&quot;OBJECTID\&quot;: 248, \&quot;Shape_Leng\&quot;: 0.0569191167671, \&quot;Shape_Area\&quot;: 0.000149592769799, \&quot;zone\&quot;: \&quot;West Farms/Bronx River\&quot;, \&quot;LocationID\&quot;: 248, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86393748099981, 40.84004456599994], [-73.86271114399993, 40.83299150899997], [-73.88378414099992, 40.828274291999946], [-73.88005188499987, 40.83470205899989], [-73.87379590199993, 40.837445132999896], [-73.87277204699981, 40.83975128199995], [-73.86448011799995, 40.84108779699994], [-73.86393748099981, 40.84004456599994]]]}}, {\&quot;id\&quot;: \&quot;248\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 3193371, \&quot;OBJECTID\&quot;: 249, \&quot;Shape_Leng\&quot;: 0.03638434365, \&quot;Shape_Area\&quot;: 7.22155957729e-05, \&quot;zone\&quot;: \&quot;West Village\&quot;, \&quot;LocationID\&quot;: 249, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00250642399995, 40.729016384999966], [-74.0070902079999, 40.72877225299993], [-74.00515808199998, 40.74085808099991], [-73.99683993899998, 40.73736088899995], [-74.00250642399995, 40.729016384999966]]]}}, {\&quot;id\&quot;: \&quot;249\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1728, \&quot;OBJECTID\&quot;: 250, \&quot;Shape_Leng\&quot;: 0.0796263465454, \&quot;Shape_Area\&quot;: 0.000240975845956, \&quot;zone\&quot;: \&quot;Westchester Village/Unionport\&quot;, \&quot;LocationID\&quot;: 250, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8455308949999, 40.83917330699989], [-73.83936452799996, 40.84087706699995], [-73.83959108476137, 40.834041688045254], [-73.84390624999997, 40.82840782999993], [-73.84289858800003, 40.82408305899986], [-73.85513639799981, 40.822436188999866], [-73.857391213, 40.83229737199986], [-73.86033845899995, 40.833253165999935], [-73.85168459699997, 40.8342010519999], [-73.85333524999986, 40.84247015499987], [-73.85052278099987, 40.84278948899985], [-73.8455308949999, 40.83917330699989]]]}}, {\&quot;id\&quot;: \&quot;250\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 134, \&quot;OBJECTID\&quot;: 251, \&quot;Shape_Leng\&quot;: 0.1377111611, \&quot;Shape_Area\&quot;: 0.000625754983157, \&quot;zone\&quot;: \&quot;Westerleigh\&quot;, \&quot;LocationID\&quot;: 251, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.13107460299996, 40.631147728999956], [-74.1313098529999, 40.62632834299998], [-74.12125677899994, 40.62782274999989], [-74.10552598799994, 40.618592329999906], [-74.0977696879999, 40.61062359299988], [-74.1156683379999, 40.611175384999896], [-74.13210459699991, 40.608152923999924], [-74.14471100599997, 40.60803429699994], [-74.14954343599996, 40.60962717299988], [-74.14696864199988, 40.610151355999896], [-74.14603562099998, 40.61701277699996], [-74.13982184799993, 40.61629982499988], [-74.13826358199992, 40.624243769999936], [-74.13581008299997, 40.62506433999991], [-74.13806393799992, 40.627568470999904], [-74.13107460299996, 40.631147728999956]]]}}, {\&quot;id\&quot;: \&quot;251\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 740, \&quot;OBJECTID\&quot;: 252, \&quot;Shape_Leng\&quot;: 0.158004373564, \&quot;Shape_Area\&quot;: 0.00102526406057, \&quot;zone\&quot;: \&quot;Whitestone\&quot;, \&quot;LocationID\&quot;: 252, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82049919995306, 40.80101146781907], [-73.81369963725258, 40.79707941566509], [-73.81225365567188, 40.79812694680175], [-73.79640953426332, 40.795728824199614], [-73.79442844782817, 40.794806810498535], [-73.79375126484103, 40.78906193333896], [-73.79058298999988, 40.78819290999989], [-73.79582463099997, 40.7861305879999], [-73.80242791599977, 40.786068273999945], [-73.8037902289999, 40.77561011199992], [-73.81485850699985, 40.776485922999875], [-73.81452997799975, 40.77888817499992], [-73.82331286899986, 40.77957865999986], [-73.82224127699999, 40.781693878999924], [-73.83869921299997, 40.781676956999874], [-73.83824429099994, 40.78778591599995], [-73.84008157499997, 40.78785153099992], [-73.83895676099984, 40.79143843099996], [-73.84081532599994, 40.7915048849999], [-73.84067828300006, 40.79390789199993], [-73.83663288911686, 40.79251637576927], [-73.83728024446076, 40.78900952077265], [-73.83251063648018, 40.788624476626765], [-73.83166080927866, 40.79110259115967], [-73.8278487557192, 40.79308767321416], [-73.82945991534359, 40.79682336759143], [-73.82506496699443, 40.79737577656827], [-73.82049919995306, 40.80101146781907]]]}}, {\&quot;id\&quot;: \&quot;252\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 433, \&quot;OBJECTID\&quot;: 253, \&quot;Shape_Leng\&quot;: 0.0360514998192, \&quot;Shape_Area\&quot;: 7.83395761191e-05, \&quot;zone\&quot;: \&quot;Willets Point\&quot;, \&quot;LocationID\&quot;: 253, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83908354399988, 40.76525691299991], [-73.83679107299986, 40.76116667099992], [-73.83867321899987, 40.75701997899995], [-73.84324381399976, 40.75533680399995], [-73.84670933714987, 40.76134526931977], [-73.84272819396486, 40.76462854893166], [-73.83908354399988, 40.76525691299991]]]}}, {\&quot;id\&quot;: \&quot;253\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 943, \&quot;OBJECTID\&quot;: 254, \&quot;Shape_Leng\&quot;: 0.0858863754861, \&quot;Shape_Area\&quot;: 0.000360040216032, \&quot;zone\&quot;: \&quot;Williamsbridge/Olinville\&quot;, \&quot;LocationID\&quot;: 254, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85186563799999, 40.87905886499989], [-73.85091896099982, 40.877893440999856], [-73.85254854099988, 40.877091586999924], [-73.8506895569999, 40.87548667799993], [-73.85363638799987, 40.87330059899996], [-73.85651292399994, 40.874217792999936], [-73.85661382499993, 40.87125016699991], [-73.87056192499989, 40.87151077799995], [-73.87019944899986, 40.87631135499987], [-73.860710982, 40.89537054399996], [-73.84590568599998, 40.889741368999864], [-73.85186563799999, 40.87905886499989]]]}}, {\&quot;id\&quot;: \&quot;254\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 331479, \&quot;OBJECTID\&quot;: 255, \&quot;Shape_Leng\&quot;: 0.0623841997664, \&quot;Shape_Area\&quot;: 0.000172309184842, \&quot;zone\&quot;: \&quot;Williamsburg (North Side)\&quot;, \&quot;LocationID\&quot;: 255, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96176070375392, 40.72522879205536], [-73.95477662900004, 40.72245950499994], [-73.94907816799986, 40.72254028699993], [-73.94841638599995, 40.71845553299995], [-73.94721341799986, 40.718560985999865], [-73.95547596099992, 40.7122654259999], [-73.96736391666703, 40.71648367952745], [-73.96176070375392, 40.72522879205536]]]}}, {\&quot;id\&quot;: \&quot;255\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 272435, \&quot;OBJECTID\&quot;: 256, \&quot;Shape_Leng\&quot;: 0.0679149669603, \&quot;Shape_Area\&quot;: 0.000168611097013, \&quot;zone\&quot;: \&quot;Williamsburg (South Side)\&quot;, \&quot;LocationID\&quot;: 256, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95834207500002, 40.71330630099992], [-73.95547596099992, 40.7122654259999], [-73.95433904200002, 40.714071701999906], [-73.94937231899985, 40.71406687799986], [-73.94865533499987, 40.70972498299988], [-73.95087492699996, 40.70951311499991], [-73.95023693799996, 40.70547324699994], [-73.9579043079999, 40.70842717299994], [-73.958455768, 40.707251846999895], [-73.96838933699995, 40.70682918699989], [-73.96984864823531, 40.708003041687675], [-73.96736391666705, 40.71648367902752], [-73.95834207500002, 40.71330630099992]]]}}, {\&quot;id\&quot;: \&quot;256\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 7913, \&quot;OBJECTID\&quot;: 257, \&quot;Shape_Leng\&quot;: 0.0586690259793, \&quot;Shape_Area\&quot;: 0.00013890947321, \&quot;zone\&quot;: \&quot;Windsor Terrace\&quot;, \&quot;LocationID\&quot;: 257, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97984261899994, 40.660727440999956], [-73.97436701299992, 40.65818790399992], [-73.97084113699994, 40.64637857099993], [-73.97777380600002, 40.645341876999964], [-73.97819074399992, 40.64752599199992], [-73.98029115499993, 40.647297160999855], [-73.98179568699996, 40.65524609699991], [-73.98843135299977, 40.65925121199996], [-73.9868846449999, 40.6603663889999], [-73.985086794, 40.65901328799989], [-73.982230342, 40.66214149199994], [-73.97984261899994, 40.660727440999956]]]}}, {\&quot;id\&quot;: \&quot;257\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2879, \&quot;OBJECTID\&quot;: 258, \&quot;Shape_Leng\&quot;: 0.0890133787693, \&quot;Shape_Area\&quot;: 0.000366209617143, \&quot;zone\&quot;: \&quot;Woodhaven\&quot;, \&quot;LocationID\&quot;: 258, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8450419489999, 40.68931894699996], [-73.84119605699982, 40.68335136599989], [-73.84786817599985, 40.681486831999905], [-73.85197864599989, 40.682564210999864], [-73.85099089299987, 40.68056836699987], [-73.85392389199987, 40.679686155999875], [-73.85819836099995, 40.67943084899987], [-73.85878576899987, 40.68063046299989], [-73.86334943599995, 40.67935163999989], [-73.86410096700003, 40.68237284999988], [-73.86602666899996, 40.681918051999915], [-73.86868454399996, 40.694034691999924], [-73.85277238699999, 40.69755711199987], [-73.85443455699989, 40.70060295199994], [-73.85070842300001, 40.70020312499988], [-73.8450419489999, 40.68931894699996]]]}}, {\&quot;id\&quot;: \&quot;258\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 873, \&quot;OBJECTID\&quot;: 259, \&quot;Shape_Leng\&quot;: 0.126750305191, \&quot;Shape_Area\&quot;: 0.000394552487366, \&quot;zone\&quot;: \&quot;Woodlawn/Wakefield\&quot;, \&quot;LocationID\&quot;: 259, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.851071161919, 40.91037152011096], [-73.85347522366716, 40.90753029351422], [-73.84138689269206, 40.90417274176649], [-73.83554853999995, 40.88913350399993], [-73.84704957999995, 40.8876718159999], [-73.84590568599998, 40.889741368999864], [-73.860710982, 40.89537054399996], [-73.87048672599987, 40.896640210999905], [-73.8771197409999, 40.895468663999964], [-73.86789043706806, 40.90298695407611], [-73.85946778750369, 40.90051720913338], [-73.85957882974115, 40.9024408428857], [-73.85601023344621, 40.9053059838135], [-73.85681013619275, 40.90615582816297], [-73.85374103615364, 40.90778791636777], [-73.85458940544117, 40.9089394991491], [-73.851071161919, 40.91037152011096]]]}}, {\&quot;id\&quot;: \&quot;259\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 94392, \&quot;OBJECTID\&quot;: 260, \&quot;Shape_Leng\&quot;: 0.133514154636, \&quot;Shape_Area\&quot;: 0.000422345326907, \&quot;zone\&quot;: \&quot;Woodside\&quot;, \&quot;LocationID\&quot;: 260, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9017537339999, 40.760775474999946], [-73.90147053099994, 40.759633049999884], [-73.89866137799999, 40.759921016999904], [-73.89976862099998, 40.75666423699991], [-73.8949120899999, 40.74428123099996], [-73.90057825399985, 40.73949289599988], [-73.90926002999988, 40.736403179999854], [-73.91068876399997, 40.73347108099995], [-73.90628903499987, 40.732400751999876], [-73.90516948899983, 40.73585964299986], [-73.90107970900003, 40.73391463399987], [-73.90712253099991, 40.727424727999924], [-73.91174734199988, 40.72991203299991], [-73.91205021299994, 40.72850636299993], [-73.91796696699996, 40.7285007709999], [-73.917342506, 40.731382825999916], [-73.91903825199986, 40.73200596599987], [-73.91651190599994, 40.738944757999874], [-73.9137938869998, 40.742514491999934], [-73.9119412979999, 40.742382948999925], [-73.91190979099993, 40.748105394999875], [-73.90945182799983, 40.75065550699994], [-73.91067474899997, 40.752995076999895], [-73.90631505099988, 40.75984387599992], [-73.90779405499987, 40.760517799999896], [-73.90356915599997, 40.765781788999924], [-73.9017537339999, 40.760775474999946]]]}}, {\&quot;id\&quot;: \&quot;260\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 731080, \&quot;OBJECTID\&quot;: 261, \&quot;Shape_Leng\&quot;: 0.0271204563616, \&quot;Shape_Area\&quot;: 3.43423231652e-05, \&quot;zone\&quot;: \&quot;World Trade Center\&quot;, \&quot;LocationID\&quot;: 261, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01332610899989, 40.7050307879999], [-74.01668613099999, 40.70479933799992], [-74.01375388499997, 40.71369055499987], [-74.00860085399992, 40.711392239999945], [-74.01332610899989, 40.7050307879999]]]}}, {\&quot;id\&quot;: \&quot;261\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 1702036, \&quot;OBJECTID\&quot;: 262, \&quot;Shape_Leng\&quot;: 0.0490636231541, \&quot;Shape_Area\&quot;: 0.000122330270966, \&quot;zone\&quot;: \&quot;Yorkville East\&quot;, \&quot;LocationID\&quot;: 262, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.94383256699986, 40.78285908899991], [-73.94207418803879, 40.77691784697707], [-73.94293043781381, 40.774676268035776], [-73.9474897547817, 40.77011515400953], [-73.95268514999995, 40.772339404999926], [-73.94383256699986, 40.78285908899991]]], [[[-73.93804640603422, 40.78082954427547], [-73.93759894622617, 40.78046784086141], [-73.93958378972465, 40.779576474007136], [-73.9387442308927, 40.78104387604228], [-73.93804640603422, 40.78082954427547]]]]}}, {\&quot;id\&quot;: \&quot;262\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;count\&quot;: 2514462, \&quot;OBJECTID\&quot;: 263, \&quot;Shape_Leng\&quot;: 0.0370166252994, \&quot;Shape_Area\&quot;: 6.57697664169e-05, \&quot;zone\&quot;: \&quot;Yorkville West\&quot;, \&quot;LocationID\&quot;: 263, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95218621999996, 40.7730198449999], [-73.95729409999986, 40.7742835549999], [-73.94933170599992, 40.78519312699994], [-73.94472264499986, 40.78324757199987], [-73.95218621999996, 40.7730198449999]]]}}]}&quot;},&quot;id&quot;:&quot;76c418d0-c7d9-48f9-8111-ae726987d2b2&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;022fd809-ec00-4851-b661-c49991bfae3a&quot;,&quot;type&quot;:&quot;WheelZoomTool&quot;},{&quot;attributes&quot;:{&quot;fill_alpha&quot;:{&quot;value&quot;:0.9},&quot;fill_color&quot;:{&quot;field&quot;:&quot;count&quot;,&quot;transform&quot;:{&quot;id&quot;:&quot;fe7eac4c-a6ac-449b-a2da-89f027e5010b&quot;,&quot;type&quot;:&quot;LogColorMapper&quot;}},&quot;line_alpha&quot;:{&quot;value&quot;:0.5},&quot;xs&quot;:{&quot;field&quot;:&quot;xs&quot;},&quot;ys&quot;:{&quot;field&quot;:&quot;ys&quot;}},&quot;id&quot;:&quot;f1f65e0f-b376-4763-ba65-310d09a85747&quot;,&quot;type&quot;:&quot;Patches&quot;},{&quot;attributes&quot;:{&quot;dimension&quot;:1,&quot;plot&quot;:{&quot;id&quot;:&quot;62ba6d47-3ae9-4aa5-be3a-40808ec4ef1a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;7d621023-4d97-44a1-8ccf-0992cf3ef267&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;e47b8c6a-ee73-4698-8e94-0349d21c6c88&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;d41fbb68-5ad0-439f-87ea-f1e11384576c&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;6a2d253b-ce19-4ab5-8e57-e3afe7f8a209&quot;,&quot;type&quot;:&quot;WheelZoomTool&quot;},{&quot;attributes&quot;:{&quot;bottom_units&quot;:&quot;screen&quot;,&quot;fill_alpha&quot;:{&quot;value&quot;:0.5},&quot;fill_color&quot;:{&quot;value&quot;:&quot;lightgrey&quot;},&quot;left_units&quot;:&quot;screen&quot;,&quot;level&quot;:&quot;overlay&quot;,&quot;line_alpha&quot;:{&quot;value&quot;:1.0},&quot;line_color&quot;:{&quot;value&quot;:&quot;black&quot;},&quot;line_dash&quot;:[4,4],&quot;line_width&quot;:{&quot;value&quot;:2},&quot;plot&quot;:null,&quot;render_mode&quot;:&quot;css&quot;,&quot;right_units&quot;:&quot;screen&quot;,&quot;top_units&quot;:&quot;screen&quot;},&quot;id&quot;:&quot;3872cd96-a3c4-4d3c-a8d3-d671c5190f24&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;26eacfd5-0f25-4429-acdb-7da3f6282337&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null,&quot;point_policy&quot;:&quot;follow_mouse&quot;,&quot;tooltips&quot;:&quot;&lt;div&gt;&lt;b&gt;Borough&lt;/b&gt;: @borough&lt;/div&gt;&lt;div&gt;&lt;b&gt;Zone&lt;/b&gt;: @zone&lt;/div&gt;&lt;div&gt;&lt;b&gt;Cash Fraction&lt;/b&gt;: @payment_type&lt;/div&gt;&quot;},&quot;id&quot;:&quot;05d6bea6-6455-4d7f-a047-890c32987b9a&quot;,&quot;type&quot;:&quot;HoverTool&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null},&quot;id&quot;:&quot;169e471d-7586-4e4b-82ae-deea3e05ec36&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},{&quot;attributes&quot;:{&quot;source&quot;:{&quot;id&quot;:&quot;76c418d0-c7d9-48f9-8111-ae726987d2b2&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;}},&quot;id&quot;:&quot;a00c5370-a7c6-4a7c-8839-0d6510dfa166&quot;,&quot;type&quot;:&quot;CDSView&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;2e37b525-1a12-4a01-9264-a099c6ca242b&quot;,&quot;type&quot;:&quot;LinearScale&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;f3b86a6f-66d5-48ed-adbf-ebdc3e9fd079&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;8b6fba3c-2dc4-43a3-9e6b-3b0aa55f67a7&quot;,&quot;type&quot;:&quot;SaveTool&quot;},{&quot;attributes&quot;:{&quot;formatter&quot;:{&quot;id&quot;:&quot;e384a837-7ce6-4ba0-8f0e-e4a8ffc64518&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;plot&quot;:{&quot;id&quot;:&quot;9a6525f3-7059-45ab-90ee-2d7e83c0a07a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;c421e4d7-01a7-43de-a95e-fdff91e61d6f&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;9139b6c7-121e-4d5b-9b54-caeceab315d1&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;3b6a7eac-00a3-410a-8bc1-41a46ac7b38a&quot;,&quot;type&quot;:&quot;ResetTool&quot;},{&quot;attributes&quot;:{&quot;overlay&quot;:{&quot;id&quot;:&quot;3872cd96-a3c4-4d3c-a8d3-d671c5190f24&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;}},&quot;id&quot;:&quot;5e99a9d3-a981-45fc-8281-f0e7c0c6021c&quot;,&quot;type&quot;:&quot;BoxZoomTool&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;c936782d-eea5-4fb4-bd79-1d11686a2dfa&quot;,&quot;type&quot;:&quot;LinearScale&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null},&quot;id&quot;:&quot;dc69c649-db35-4baa-b925-35cf40cf46ef&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null,&quot;geojson&quot;:&quot;{\&quot;type\&quot;: \&quot;FeatureCollection\&quot;, \&quot;features\&quot;: [{\&quot;id\&quot;: \&quot;2\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5611620795107034, \&quot;OBJECTID\&quot;: 3, \&quot;Shape_Leng\&quot;: 0.0843411059012, \&quot;Shape_Area\&quot;: 0.000314414156821, \&quot;zone\&quot;: \&quot;Allerton/Pelham Gardens\&quot;, \&quot;LocationID\&quot;: 3, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84792614099985, 40.87134223399991], [-73.82950892699994, 40.86184121299988], [-73.82834347399992, 40.86089202599988], [-73.8368191849999, 40.85727680899989], [-73.8566377469999, 40.8581191719999], [-73.85780378799993, 40.86303621699989], [-73.85961281199982, 40.865512717999856], [-73.86156274099987, 40.86554946399989], [-73.86137924099984, 40.8713365119999], [-73.85661382499993, 40.87125016699991], [-73.85651292399994, 40.874217792999936], [-73.84792614099985, 40.87134223399991]]]}}, {\&quot;id\&quot;: \&quot;3\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3347314226583771, \&quot;OBJECTID\&quot;: 4, \&quot;Shape_Leng\&quot;: 0.0435665270921, \&quot;Shape_Area\&quot;: 0.000111871946192, \&quot;zone\&quot;: \&quot;Alphabet City\&quot;, \&quot;LocationID\&quot;: 4, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97177410965318, 40.72582128133705], [-73.97347975574512, 40.71886142911285], [-73.98382387299982, 40.72147287199987], [-73.97802697999985, 40.729433059999984], [-73.97177410965318, 40.72582128133705]]]}}, {\&quot;id\&quot;: \&quot;4\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4358974358974359, \&quot;OBJECTID\&quot;: 5, \&quot;Shape_Leng\&quot;: 0.0921464898574, \&quot;Shape_Area\&quot;: 0.000497957489363, \&quot;zone\&quot;: \&quot;Arden Heights\&quot;, \&quot;LocationID\&quot;: 5, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.17421738099989, 40.56256808599987], [-74.17185166499996, 40.56152092299991], [-74.18018524699995, 40.54837960899992], [-74.18903145199995, 40.53815934199989], [-74.19377169299999, 40.53583384699993], [-74.20314825999996, 40.55606178499986], [-74.20046730799992, 40.55623049099987], [-74.19317388399995, 40.56260434399992], [-74.18340311699991, 40.56540496199994], [-74.17421738099989, 40.56256808599987]]]}}, {\&quot;id\&quot;: \&quot;5\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5, \&quot;OBJECTID\&quot;: 6, \&quot;Shape_Leng\&quot;: 0.150490542523, \&quot;Shape_Area\&quot;: 0.000606460984581, \&quot;zone\&quot;: \&quot;Arrochar/Fort Wadsworth\&quot;, \&quot;LocationID\&quot;: 6, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.06367318899999, 40.60219816599994], [-74.0651709129999, 40.604213507999894], [-74.05685812390232, 40.608056357772554], [-74.05381069805436, 40.605912718852984], [-74.05222826954189, 40.599776102303636], [-74.06503332378131, 40.58899099843518], [-74.07043976099992, 40.59673474699988], [-74.08173342999991, 40.59215628599987], [-74.08376862299998, 40.595520956999934], [-74.08587511899998, 40.59589012099985], [-74.0814942209999, 40.599081990999935], [-74.08184498199992, 40.601535196999926], [-74.08947630599992, 40.60090432199991], [-74.09172051499995, 40.59922085699985], [-74.09271908099993, 40.60636222199992], [-74.09045495899996, 40.60909452599991], [-74.06367318899999, 40.60219816599994]]]}}, {\&quot;id\&quot;: \&quot;6\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5391674023138039, \&quot;OBJECTID\&quot;: 7, \&quot;Shape_Leng\&quot;: 0.107417171123, \&quot;Shape_Area\&quot;: 0.000389787989274, \&quot;zone\&quot;: \&quot;Astoria\&quot;, \&quot;LocationID\&quot;: 7, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90413637799996, 40.76752031699986], [-73.90202516599992, 40.767416783999884], [-73.90779405499987, 40.760517799999896], [-73.90631505099988, 40.75984387599992], [-73.91023124699991, 40.75297652299985], [-73.91763192900005, 40.75385784899993], [-73.92562743799996, 40.75213724499991], [-73.92415699999985, 40.753961141999845], [-73.93679091699993, 40.75988288099991], [-73.93398092100001, 40.76282598199987], [-73.93858976899998, 40.766817358999916], [-73.93493511099992, 40.76701302399987], [-73.93344468499993, 40.768817789999915], [-73.92425288799978, 40.76472456399995], [-73.92218946199995, 40.767267356999895], [-73.91977764799998, 40.7661521839999], [-73.91849336999996, 40.76773465699995], [-73.91995596899991, 40.768440064999865], [-73.91811686499992, 40.77002848599989], [-73.90413637799996, 40.76752031699986]]]}}, {\&quot;id\&quot;: \&quot;7\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4, \&quot;OBJECTID\&quot;: 8, \&quot;Shape_Leng\&quot;: 0.0275906911574, \&quot;Shape_Area\&quot;: 2.6587716279e-05, \&quot;zone\&quot;: \&quot;Astoria Park\&quot;, \&quot;LocationID\&quot;: 8, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92334041500001, 40.77512891199993], [-73.92827730816353, 40.77689897516217], [-73.91996458796496, 40.78263506876824], [-73.91796581399998, 40.78125629099988], [-73.92375761299998, 40.77654701199991], [-73.92334041500001, 40.77512891199993]]]}}, {\&quot;id\&quot;: \&quot;8\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5355450236966824, \&quot;OBJECTID\&quot;: 9, \&quot;Shape_Leng\&quot;: 0.0997840924705, \&quot;Shape_Area\&quot;: 0.000338443803197, \&quot;zone\&quot;: \&quot;Auburndale\&quot;, \&quot;LocationID\&quot;: 9, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.78502434699996, 40.761036515999855], [-73.77573836999991, 40.74332564699993], [-73.79672497900003, 40.738416642999894], [-73.79723084999992, 40.74169550699993], [-73.7944636839999, 40.74497002199991], [-73.79472264899997, 40.74759932999989], [-73.79729524699995, 40.74943505299987], [-73.79471901099991, 40.75064761699991], [-73.79493246199993, 40.75779802999994], [-73.79031517, 40.75782345099988], [-73.79076004599987, 40.76098576899991], [-73.79343991199988, 40.760764127999934], [-73.79317944599984, 40.77040317799988], [-73.78502434699996, 40.761036515999855]]]}}, {\&quot;id\&quot;: \&quot;9\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40316240843308915, \&quot;OBJECTID\&quot;: 10, \&quot;Shape_Leng\&quot;: 0.0998394794152, \&quot;Shape_Area\&quot;: 0.000435823818081, \&quot;zone\&quot;: \&quot;Baisley Park\&quot;, \&quot;LocationID\&quot;: 10, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7832662499999, 40.68999429299992], [-73.77966850599998, 40.685377122999945], [-73.77699767599997, 40.68628268899992], [-73.77220275299989, 40.681610338999896], [-73.78025859499995, 40.6778409239999], [-73.78573730899993, 40.67238503499988], [-73.78808647399985, 40.6730096269999], [-73.78940999399993, 40.66684115799993], [-73.80155565300004, 40.6667533639999], [-73.80142836799988, 40.673666833999874], [-73.80576840199991, 40.682932390999916], [-73.79898209099989, 40.68485873699989], [-73.79995042799996, 40.68682771899991], [-73.79561486799987, 40.688656890999916], [-73.793908417, 40.68630469099985], [-73.7832662499999, 40.68999429299992]]]}}, {\&quot;id\&quot;: \&quot;10\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5905172413793104, \&quot;OBJECTID\&quot;: 11, \&quot;Shape_Leng\&quot;: 0.0792110389596, \&quot;Shape_Area\&quot;: 0.00026452053504, \&quot;zone\&quot;: \&quot;Bath Beach\&quot;, \&quot;LocationID\&quot;: 11, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00109809499993, 40.60303462599992], [-73.99559320799995, 40.600232221999875], [-74.00200394754667, 40.594132371137796], [-74.01041238886523, 40.60047518174621], [-74.01942760861903, 40.602871578425265], [-74.01549854999998, 40.606841523999925], [-74.01701910199995, 40.60765441699994], [-74.01050403599997, 40.613896610999866], [-74.00094408399997, 40.60863970999988], [-74.00493448899994, 40.60507440599987], [-74.00109809499993, 40.60303462599992]]]}}, {\&quot;id\&quot;: \&quot;11\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5267139229792637, \&quot;OBJECTID\&quot;: 12, \&quot;Shape_Leng\&quot;: 0.0366613013579, \&quot;Shape_Area\&quot;: 4.15116236727e-05, \&quot;zone\&quot;: \&quot;Battery Park\&quot;, \&quot;LocationID\&quot;: 12, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01565756599994, 40.70483308799993], [-74.01425861399996, 40.70448944299991], [-74.01376867799992, 40.7011432629999], [-74.014220631955, 40.70011149186829], [-74.0176479750685, 40.70349459987955], [-74.01565756599994, 40.70483308799993]]]}}, {\&quot;id\&quot;: \&quot;12\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.2875136828252874, \&quot;OBJECTID\&quot;: 13, \&quot;Shape_Leng\&quot;: 0.0502813228631, \&quot;Shape_Area\&quot;: 0.000149358592917, \&quot;zone\&quot;: \&quot;Battery Park City\&quot;, \&quot;LocationID\&quot;: 13, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01244109299991, 40.7190576729999], [-74.01668714699993, 40.704743941999865], [-74.01844770243774, 40.70416216823156], [-74.0174808615258, 40.704667487696156], [-74.01934254624483, 40.706093673029706], [-74.01777014254499, 40.71283457478916], [-74.01662424425285, 40.71215731899529], [-74.01632006627581, 40.71340798247826], [-74.01772496219284, 40.71307018162274], [-74.01671018605829, 40.718624176057965], [-74.01244109299991, 40.7190576729999]]]}}, {\&quot;id\&quot;: \&quot;13\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5293094883258818, \&quot;OBJECTID\&quot;: 14, \&quot;Shape_Leng\&quot;: 0.175213698053, \&quot;Shape_Area\&quot;: 0.00138177826442, \&quot;zone\&quot;: \&quot;Bay Ridge\&quot;, \&quot;LocationID\&quot;: 14, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.03407329297129, 40.64431393298185], [-74.02475437599998, 40.6381214179999], [-74.02108051399998, 40.64149093699994], [-74.02141038399992, 40.638584902999845], [-74.01514630699995, 40.63322193799993], [-74.01970491599991, 40.6221849649999], [-74.02754297299998, 40.61293718299988], [-74.02637609099996, 40.61245060299993], [-74.02710660599995, 40.61024395599991], [-74.02150602899994, 40.60782209899992], [-74.02247769499994, 40.60667421599987], [-74.02078541, 40.605673685999875], [-74.02139467299999, 40.60449399799991], [-74.01869135799996, 40.60360792399991], [-74.01942760861903, 40.602871578425265], [-74.0321315955131, 40.605901836264245], [-74.04038132338673, 40.61534178232843], [-74.04189123741789, 40.62406041492981], [-74.04108656611493, 40.63009852389527], [-74.03680662048858, 40.63898422154557], [-74.03876297920752, 40.639588258980524], [-74.03672484374877, 40.63914119020668], [-74.03571276150724, 40.64064015404647], [-74.03675840317513, 40.641611762713936], [-74.03407329297129, 40.64431393298185]]]}}, {\&quot;id\&quot;: \&quot;14\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.46503496503496505, \&quot;OBJECTID\&quot;: 15, \&quot;Shape_Leng\&quot;: 0.14433622262, \&quot;Shape_Area\&quot;: 0.000925219395547, \&quot;zone\&quot;: \&quot;Bay Terrace/Fort Totten\&quot;, \&quot;LocationID\&quot;: 15, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7774039129087, 40.79659824126783], [-73.77063124537418, 40.78846290603716], [-73.77426836058959, 40.78675665865473], [-73.77633728818715, 40.78848722575376], [-73.76820055460033, 40.77944417919097], [-73.76702392346498, 40.78008623415827], [-73.76677570373936, 40.77981245869834], [-73.76782207615058, 40.77881037615661], [-73.77553732199992, 40.777025597999916], [-73.77583958299994, 40.778612371999884], [-73.79565702099983, 40.773036085999905], [-73.79853009399987, 40.775190728999924], [-73.8037902289999, 40.77561011199992], [-73.80242791699989, 40.78606827399991], [-73.79491977600001, 40.78633880799987], [-73.79058298999988, 40.78819290999989], [-73.79179280401884, 40.789351616549254], [-73.79028202353197, 40.79031696339975], [-73.78174708763098, 40.79113340664446], [-73.78079182072646, 40.79403591986439], [-73.78325271025878, 40.79492032976596], [-73.7774039129087, 40.79659824126783]]]}}, {\&quot;id\&quot;: \&quot;15\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5345744680851063, \&quot;OBJECTID\&quot;: 16, \&quot;Shape_Leng\&quot;: 0.141291873771, \&quot;Shape_Area\&quot;: 0.000871889446182, \&quot;zone\&quot;: \&quot;Bayside\&quot;, \&quot;LocationID\&quot;: 16, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7685730499999, 40.77910542899991], [-73.75864264358073, 40.767357170035446], [-73.75377036482266, 40.76530463124142], [-73.75921689799992, 40.76432485599988], [-73.75800131799996, 40.76037986699988], [-73.76239510499991, 40.75949699799992], [-73.76184343999986, 40.75553726899989], [-73.75684127399991, 40.74932207699987], [-73.77573836999991, 40.74332564699993], [-73.78546383099984, 40.76259192499988], [-73.79565702099983, 40.773036085999905], [-73.77678363299991, 40.77840958299987], [-73.77553732199992, 40.777025597999916], [-73.7685730499999, 40.77910542899991]]]}}, {\&quot;id\&quot;: \&quot;16\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4699786696519069, \&quot;OBJECTID\&quot;: 17, \&quot;Shape_Leng\&quot;: 0.093522632948, \&quot;Shape_Area\&quot;: 0.000322957654799, \&quot;zone\&quot;: \&quot;Bedford\&quot;, \&quot;LocationID\&quot;: 17, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94306406899986, 40.701424434999886], [-73.94193078899983, 40.70072523399989], [-73.94438788599984, 40.70042452299993], [-73.94032794, 40.679889974999874], [-73.9533701749999, 40.680640507999904], [-73.95468418899998, 40.68724485399985], [-73.95956770199984, 40.686682554999955], [-73.96029281699998, 40.69034624999995], [-73.95541057999996, 40.69090829199994], [-73.95614239299985, 40.694579018999896], [-73.96015854699988, 40.69411730899989], [-73.96105100699992, 40.69832607899989], [-73.95701993199991, 40.69897391399995], [-73.95745736399992, 40.70082260299993], [-73.95381196900003, 40.703180979999914], [-73.95128819399989, 40.700922364999855], [-73.94705205299991, 40.70366394899985], [-73.94306406899986, 40.701424434999886]]]}}, {\&quot;id\&quot;: \&quot;17\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.646894236149972, \&quot;OBJECTID\&quot;: 18, \&quot;Shape_Leng\&quot;: 0.0697995498569, \&quot;Shape_Area\&quot;: 0.000148850163948, \&quot;zone\&quot;: \&quot;Bedford Park\&quot;, \&quot;LocationID\&quot;: 18, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88513907699999, 40.86638287399992], [-73.88889566099989, 40.86475415299988], [-73.89573924699978, 40.85813820699986], [-73.89883814599983, 40.859307307999906], [-73.897143798, 40.86244506499991], [-73.90107966999994, 40.86275638299992], [-73.8974032329998, 40.86747418999989], [-73.89438130299995, 40.866068850999966], [-73.88785196299986, 40.87211417599992], [-73.88937163799984, 40.87338229799993], [-73.88527683199987, 40.87921766899991], [-73.88146889699985, 40.868573645999916], [-73.88513907699999, 40.86638287399992]]]}}, {\&quot;id\&quot;: \&quot;18\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6982343499197432, \&quot;OBJECTID\&quot;: 19, \&quot;Shape_Leng\&quot;: 0.101824875452, \&quot;Shape_Area\&quot;: 0.000546661094782, \&quot;zone\&quot;: \&quot;Bellerose\&quot;, \&quot;LocationID\&quot;: 19, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.72339596299987, 40.750389075999855], [-73.72258571899978, 40.74885045099991], [-73.72010148299994, 40.74977568599991], [-73.71147804899985, 40.73250140099988], [-73.71049995381028, 40.72722708720663], [-73.72990512499977, 40.723272494999954], [-73.7314721509999, 40.727411794999924], [-73.74640108899996, 40.7312928389999], [-73.74672140400006, 40.73247715099991], [-73.73933151399987, 40.739474474999916], [-73.72829094199989, 40.74745895699992], [-73.727664654, 40.749654641999946], [-73.72339596299987, 40.750389075999855]]]}}, {\&quot;id\&quot;: \&quot;19\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5946188340807175, \&quot;OBJECTID\&quot;: 20, \&quot;Shape_Leng\&quot;: 0.0514401924362, \&quot;Shape_Area\&quot;: 0.000134512633032, \&quot;zone\&quot;: \&quot;Belmont\&quot;, \&quot;LocationID\&quot;: 20, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88386792099986, 40.8642908889999], [-73.88060896899991, 40.860357092999884], [-73.88311982600001, 40.848221091999925], [-73.88987871399985, 40.85207022099993], [-73.89109710400002, 40.856779813999886], [-73.89027555599993, 40.86110907299996], [-73.89177188799992, 40.86187171599992], [-73.88362518100003, 40.86725758799991], [-73.88267624699999, 40.86608914099984], [-73.88386792099986, 40.8642908889999]]]}}, {\&quot;id\&quot;: \&quot;20\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5815660685154975, \&quot;OBJECTID\&quot;: 21, \&quot;Shape_Leng\&quot;: 0.115973569062, \&quot;Shape_Area\&quot;: 0.000380251345507, \&quot;zone\&quot;: \&quot;Bensonhurst East\&quot;, \&quot;LocationID\&quot;: 21, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97418385499991, 40.609463501999905], [-73.97299433999983, 40.6088141419999], [-73.97291116900001, 40.599315803999964], [-73.97148350899987, 40.59717158499996], [-73.98035785499995, 40.59619154099992], [-73.97995443499985, 40.594073811999884], [-73.98601936799993, 40.594446048999906], [-73.98962150099992, 40.59098199299996], [-73.99923690396953, 40.588935328269024], [-73.99710730365224, 40.591390755943046], [-74.00004314944917, 40.59120428665461], [-73.9994830488618, 40.59296919994875], [-73.99530829599992, 40.59442758699989], [-73.99674706899995, 40.59564312599992], [-73.9868476259999, 40.60509723599994], [-73.98913191499994, 40.6064561369999], [-73.97963821799982, 40.61556454699991], [-73.97477658, 40.6126384749999], [-73.97418385499991, 40.609463501999905]]]}}, {\&quot;id\&quot;: \&quot;21\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5322386864237084, \&quot;OBJECTID\&quot;: 22, \&quot;Shape_Leng\&quot;: 0.126170229196, \&quot;Shape_Area\&quot;: 0.000472062684608, \&quot;zone\&quot;: \&quot;Bensonhurst West\&quot;, \&quot;LocationID\&quot;: 22, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99254973599997, 40.62427426799996], [-73.97963821799982, 40.61556454699991], [-73.98913191499994, 40.6064561369999], [-73.9868476259999, 40.60509723599994], [-73.99674706899995, 40.59564312599992], [-73.99530829599992, 40.59442758699989], [-74.00105748445709, 40.5925370050623], [-74.00200394804675, 40.594132371137796], [-73.99559320799995, 40.600232221999875], [-74.00493448899994, 40.60507440599987], [-74.00094408399997, 40.60863970999988], [-74.01050403599997, 40.613896610999866], [-73.99932090299998, 40.62465524699996], [-73.99771358999998, 40.62368026999996], [-73.99678847599995, 40.626826050999895], [-73.99254973599997, 40.62427426799996]]]}}, {\&quot;id\&quot;: \&quot;22\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.37398373983739835, \&quot;OBJECTID\&quot;: 23, \&quot;Shape_Leng\&quot;: 0.290556028962, \&quot;Shape_Area\&quot;: 0.00219556576201, \&quot;zone\&quot;: \&quot;Bloomfield/Emerson Hill\&quot;, \&quot;LocationID\&quot;: 23, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.19568609223377, 40.63501686464005], [-74.17459706299995, 40.622364010999874], [-74.16163010299996, 40.61793493599989], [-74.15018666499996, 40.60949781099991], [-74.14391816399994, 40.60798983699987], [-74.11742466500002, 40.609289008999916], [-74.11487058499988, 40.602136659999864], [-74.12059546299996, 40.601809757999874], [-74.12506115499997, 40.59818005599987], [-74.13091909399999, 40.598855047999905], [-74.13864458599996, 40.58906080499989], [-74.14790576499993, 40.58855634599993], [-74.16025756099997, 40.59534393799988], [-74.16189940599996, 40.59529877099993], [-74.16369888199995, 40.59225833899993], [-74.16360268199993, 40.593374198999854], [-74.16886362399997, 40.59472808699995], [-74.16719634899995, 40.602075311999926], [-74.17260229799992, 40.602971490999934], [-74.17822457299994, 40.5998280609999], [-74.17932277499995, 40.59676057899984], [-74.18730248699987, 40.588488221999896], [-74.185371048, 40.58745101499987], [-74.19423261399992, 40.58514680599991], [-74.19964981299998, 40.58226262599991], [-74.20048848899994, 40.5799497779999], [-74.20583829199992, 40.57984126099989], [-74.204646089432, 40.589285745465865], [-74.19751357718701, 40.59679898603677], [-74.20281628374593, 40.608270827967345], [-74.20244374449518, 40.61328469393197], [-74.2003834842897, 40.616428098243766], [-74.20163201104123, 40.623121565457346], [-74.2007872998309, 40.63034627446781], [-74.19568609223377, 40.63501686464005]]]}}, {\&quot;id\&quot;: \&quot;23\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40467547011338717, \&quot;OBJECTID\&quot;: 24, \&quot;Shape_Leng\&quot;: 0.0469999619287, \&quot;Shape_Area\&quot;: 6.07235737749e-05, \&quot;zone\&quot;: \&quot;Bloomingdale\&quot;, \&quot;LocationID\&quot;: 24, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95953658899998, 40.798718525999895], [-73.96004456499999, 40.79804123499991], [-73.97287179090726, 40.8033561875739], [-73.97110765876137, 40.80579013958964], [-73.95817297099987, 40.800582540999876], [-73.95953658899998, 40.798718525999895]]]}}, {\&quot;id\&quot;: \&quot;24\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.38183540556542334, \&quot;OBJECTID\&quot;: 25, \&quot;Shape_Leng\&quot;: 0.0471458199319, \&quot;Shape_Area\&quot;: 0.000124168267356, \&quot;zone\&quot;: \&quot;Boerum Hill\&quot;, \&quot;LocationID\&quot;: 25, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98155298299992, 40.689146163999936], [-73.97804289599988, 40.68485661499987], [-73.98175642299985, 40.67931462399987], [-73.99490113599977, 40.6844302379999], [-73.99236366999985, 40.689690123999924], [-73.99054474599986, 40.689168104999936], [-73.98902944799994, 40.69212386099992], [-73.98155298299992, 40.689146163999936]]]}}, {\&quot;id\&quot;: \&quot;25\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.621963394342762, \&quot;OBJECTID\&quot;: 26, \&quot;Shape_Leng\&quot;: 0.12354780707, \&quot;Shape_Area\&quot;: 0.000534039927626, \&quot;zone\&quot;: \&quot;Borough Park\&quot;, \&quot;LocationID\&quot;: 26, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98331628499983, 40.6414786819999], [-73.98042057899988, 40.64238522699991], [-73.97911188699993, 40.63544038599991], [-73.9768886119999, 40.6356748619999], [-73.97705352899999, 40.62153252199987], [-73.97539380499998, 40.62076998699995], [-73.97785009299986, 40.617287605999906], [-73.97537335500002, 40.6157547219999], [-73.97335879399992, 40.616541714999904], [-73.97290326899996, 40.61415296799988], [-73.97517176999993, 40.61472418599991], [-73.97477658, 40.6126384749999], [-74.00702302499997, 40.63210999499996], [-74.00556490399993, 40.63308317599992], [-74.00735636699996, 40.6341636269999], [-73.99917564799993, 40.642025441999856], [-73.9955103369999, 40.63980966699993], [-73.98834986699991, 40.64456224399992], [-73.98331628499983, 40.6414786819999]]]}}, {\&quot;id\&quot;: \&quot;26\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5208333333333334, \&quot;OBJECTID\&quot;: 27, \&quot;Shape_Leng\&quot;: 0.202508808518, \&quot;Shape_Area\&quot;: 0.00134088762746, \&quot;zone\&quot;: \&quot;Breezy Point/Fort Tilden/Riis Beach\&quot;, \&quot;LocationID\&quot;: 27, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86522555399998, 40.57045847199989], [-73.86268391251235, 40.56650565604353], [-73.8949181726631, 40.5570787962983], [-73.90658574923901, 40.555710625377294], [-73.94073681682697, 40.54182008707755], [-73.93985107460422, 40.55456005374592], [-73.9261572327542, 40.56155260972308], [-73.91766081900093, 40.56282614968639], [-73.91197024752503, 40.56586941753247], [-73.90683894638656, 40.562856359344565], [-73.90121507272005, 40.563008460632346], [-73.89261013445609, 40.56858724728667], [-73.87780808995733, 40.56880063006316], [-73.86288301945429, 40.576059761127304], [-73.86361132999998, 40.573823056999835], [-73.86662812000002, 40.573057648999914], [-73.86522555399998, 40.57045847199989]]]}}, {\&quot;id\&quot;: \&quot;27\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.534238284627356, \&quot;OBJECTID\&quot;: 28, \&quot;Shape_Leng\&quot;: 0.097960782214, \&quot;Shape_Area\&quot;: 0.000291203927662, \&quot;zone\&quot;: \&quot;Briarwood/Jamaica Hills\&quot;, \&quot;LocationID\&quot;: 28, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79240413399991, 40.716193040999926], [-73.79303800099989, 40.71071107499988], [-73.79776810199988, 40.7091431879999], [-73.79870150699992, 40.71066337699988], [-73.80130625, 40.709742148999965], [-73.80302414799988, 40.70813965699997], [-73.80165725599993, 40.705761474999846], [-73.8056477309999, 40.70467172799994], [-73.80694856299993, 40.70736709999989], [-73.81201248599983, 40.70594494499993], [-73.81152856899989, 40.70227287499991], [-73.81637824499992, 40.70245196399987], [-73.82591945199992, 40.71598987599992], [-73.80494148499987, 40.715996230999956], [-73.79073248899982, 40.71920875699987], [-73.79240413399991, 40.716193040999926]]]}}, {\&quot;id\&quot;: \&quot;28\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6466431095406361, \&quot;OBJECTID\&quot;: 29, \&quot;Shape_Leng\&quot;: 0.0714083127733, \&quot;Shape_Area\&quot;: 0.000201673837402, \&quot;zone\&quot;: \&quot;Brighton Beach\&quot;, \&quot;LocationID\&quot;: 29, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96004798699995, 40.58326987199995], [-73.95414287899986, 40.58310613999989], [-73.95235846771321, 40.574274685845246], [-73.9589871897255, 40.57343065573189], [-73.95941778299985, 40.57517798299994], [-73.9688899589999, 40.57526123899986], [-73.96514385199995, 40.5911019159999], [-73.9606798409999, 40.591597582999945], [-73.96004798699995, 40.58326987199995]]]}}, {\&quot;id\&quot;: \&quot;29\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6956521739130435, \&quot;OBJECTID\&quot;: 30, \&quot;Shape_Leng\&quot;: 0.0945097669793, \&quot;Shape_Area\&quot;: 0.000145862107626, \&quot;zone\&quot;: \&quot;Broad Channel\&quot;, \&quot;LocationID\&quot;: 30, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82075892499992, 40.61523267899991], [-73.81652681189118, 40.61494701007998], [-73.81475287105245, 40.6086327967523], [-73.81739192103247, 40.60515812414338], [-73.82071206789055, 40.59517051496212], [-73.83465599507487, 40.59516845882606], [-73.83239364476839, 40.59780335319121], [-73.82806159687702, 40.59768040282441], [-73.8259798598142, 40.599472067181495], [-73.82465420648664, 40.5981492468515], [-73.82376612290614, 40.60004007091038], [-73.82146929866913, 40.59999372263383], [-73.82445218054455, 40.60079696284418], [-73.81961795381072, 40.610479041032136], [-73.82087841795061, 40.61225734590997], [-73.82161460094558, 40.60848031911391], [-73.8238246859766, 40.61149866495507], [-73.82075892499992, 40.61523267899991]]]}}, {\&quot;id\&quot;: \&quot;30\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.56353591160221, \&quot;OBJECTID\&quot;: 31, \&quot;Shape_Leng\&quot;: 0.0964245666516, \&quot;Shape_Area\&quot;: 0.000333975927329, \&quot;zone\&quot;: \&quot;Bronx Park\&quot;, \&quot;LocationID\&quot;: 31, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87094462199981, 40.85726608099992], [-73.86841539699994, 40.85778035799994], [-73.86990379599995, 40.85587302199991], [-73.86823466099995, 40.85091373699986], [-73.86889243299996, 40.848112321999906], [-73.87459175399982, 40.841520647999914], [-73.878171756, 40.84262443699987], [-73.8773292409999, 40.84398312499995], [-73.88311982600001, 40.848221091999925], [-73.88060896899991, 40.860357092999884], [-73.88394303099996, 40.86494818699985], [-73.87619224900003, 40.87047671099988], [-73.87094367500002, 40.87851076699998], [-73.86943471300005, 40.87812919899994], [-73.87094462199981, 40.85726608099992]]]}}, {\&quot;id\&quot;: \&quot;31\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6628099173553719, \&quot;OBJECTID\&quot;: 32, \&quot;Shape_Leng\&quot;: 0.05426721601, \&quot;Shape_Area\&quot;: 0.000150879171971, \&quot;zone\&quot;: \&quot;Bronxdale\&quot;, \&quot;LocationID\&quot;: 32, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85882515999995, 40.85806135699987], [-73.87104944999982, 40.857304836999965], [-73.87056192499989, 40.87151077799995], [-73.86137924099984, 40.8713365119999], [-73.86156274099987, 40.86554946399989], [-73.85961281199982, 40.865512717999856], [-73.85780378799993, 40.86303621699989], [-73.8566377469999, 40.8581191719999], [-73.85882515999995, 40.85806135699987]]]}}, {\&quot;id\&quot;: \&quot;32\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.33940239294350344, \&quot;OBJECTID\&quot;: 33, \&quot;Shape_Leng\&quot;: 0.0532702931967, \&quot;Shape_Area\&quot;: 0.000147416802448, \&quot;zone\&quot;: \&quot;Brooklyn Heights\&quot;, \&quot;LocationID\&quot;: 33, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99619227264343, 40.70337714093203], [-73.99087453800003, 40.70067311699993], [-73.99097187, 40.692548799999926], [-73.98902944799994, 40.69212386099992], [-73.99054474599986, 40.689168104999936], [-74.00110519399988, 40.692056594999954], [-74.0009586845849, 40.694069083791064], [-74.00301393814541, 40.69477784423956], [-74.00026872377784, 40.69496580257801], [-74.00043147340423, 40.69705246617853], [-73.99876458027717, 40.697120733093975], [-74.0010490305752, 40.697908236697415], [-73.9983776068576, 40.698063296146074], [-74.00001840433616, 40.699466048073575], [-73.99716054243916, 40.69979281264407], [-73.99813879899439, 40.701518788248414], [-73.99619227264343, 40.70337714093203]]]}}, {\&quot;id\&quot;: \&quot;33\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.343001751995328, \&quot;OBJECTID\&quot;: 34, \&quot;Shape_Leng\&quot;: 0.0657059323545, \&quot;Shape_Area\&quot;: 0.000173946146651, \&quot;zone\&quot;: \&quot;Brooklyn Navy Yard\&quot;, \&quot;LocationID\&quot;: 34, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.97232032119902, 40.70908288315216], [-73.9702621853228, 40.706887504284005], [-73.97018075572805, 40.70492927056683], [-73.96751516691087, 40.703437356878126], [-73.96929693837701, 40.705088331229625], [-73.96838933699995, 40.70682918699989], [-73.96217978199998, 40.70022070999989], [-73.963971858, 40.69637865499991], [-73.98054419199988, 40.69824651199988], [-73.97885303360711, 40.7060655352846], [-73.97713562625376, 40.703005581402515], [-73.97596096344841, 40.704715506440465], [-73.9769274918834, 40.70279782040038], [-73.97455023388345, 40.70159034430477], [-73.97573541084542, 40.69957044770558], [-73.97411513926478, 40.70130527141927], [-73.97239201397464, 40.700166322752274], [-73.97318676670886, 40.70166980367368], [-73.97078200587988, 40.69997866301123], [-73.97283512788735, 40.70272874074404], [-73.96948655218084, 40.70051906125818], [-73.97283889974949, 40.70334642860182], [-73.96898517428966, 40.70174708878653], [-73.97465569608048, 40.70607426299424], [-73.97254880057814, 40.70620449000379], [-73.9742361696854, 40.70802438612241], [-73.97109655489108, 40.705850056558255], [-73.97232032119902, 40.70908288315216]]], [[[-73.97892920137538, 40.705931589879214], [-73.97893110285521, 40.70592490623034], [-73.97906084872884, 40.705946028470365], [-73.97905767006142, 40.705952889050316], [-73.97892920137538, 40.705931589879214]]], [[[-73.98237340600002, 40.70554334999991], [-73.98242287179853, 40.70582205595453], [-73.98102390618274, 40.705898913893535], [-73.98230205183869, 40.705736979399674], [-73.98237340600002, 40.70554334999991]]]]}}, {\&quot;id\&quot;: \&quot;34\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5185020062416407, \&quot;OBJECTID\&quot;: 35, \&quot;Shape_Leng\&quot;: 0.085787918592, \&quot;Shape_Area\&quot;: 0.000323825195932, \&quot;zone\&quot;: \&quot;Brownsville\&quot;, \&quot;LocationID\&quot;: 35, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90105329800004, 40.66212482099994], [-73.89880698499995, 40.65740666199988], [-73.90784346399994, 40.65459152999988], [-73.90855790499995, 40.65209593799989], [-73.91012255699995, 40.655851770999945], [-73.91236458899995, 40.65551356499985], [-73.9195947979998, 40.66199567899985], [-73.92008167099986, 40.659857632999866], [-73.92637970499992, 40.6655148919999], [-73.90347422300006, 40.67550668299985], [-73.90105329800004, 40.66212482099994]]]}}, {\&quot;id\&quot;: \&quot;35\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.38390326414921827, \&quot;OBJECTID\&quot;: 36, \&quot;Shape_Leng\&quot;: 0.0870507867063, \&quot;Shape_Area\&quot;: 0.000247666139269, \&quot;zone\&quot;: \&quot;Bushwick North\&quot;, \&quot;LocationID\&quot;: 36, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91254913799993, 40.70387341999989], [-73.912904041, 40.7023618909999], [-73.91067882699998, 40.701045968999914], [-73.91180820099989, 40.69993800299986], [-73.9042601839999, 40.69570037099989], [-73.90579597099993, 40.69412715499987], [-73.90123290699994, 40.69144227899997], [-73.904055772, 40.68854627799986], [-73.93115533899987, 40.70377233499987], [-73.93269784899994, 40.70317039099989], [-73.93391870799988, 40.70748702599992], [-73.92189184700005, 40.709396096999896], [-73.91254913799993, 40.70387341999989]]]}}, {\&quot;id\&quot;: \&quot;36\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40281935698473326, \&quot;OBJECTID\&quot;: 37, \&quot;Shape_Leng\&quot;: 0.142810040466, \&quot;Shape_Area\&quot;: 0.000452062644782, \&quot;zone\&quot;: \&quot;Bushwick South\&quot;, \&quot;LocationID\&quot;: 37, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93312548700004, 40.70470086199992], [-73.93269784899994, 40.70317039099989], [-73.93115533899987, 40.70377233499987], [-73.90482499699988, 40.688808569999956], [-73.90180467199995, 40.6907662979999], [-73.90116154999988, 40.68787793499991], [-73.89646625099995, 40.68233642199988], [-73.89704472199993, 40.68056181599996], [-73.90047001100004, 40.679535243999936], [-73.90262262299991, 40.6806645029999], [-73.9040463979999, 40.67922059799985], [-73.93856854799981, 40.698848135999874], [-73.94394947299996, 40.698221278999924], [-73.94438788599984, 40.70042452299993], [-73.94042057899993, 40.701076597999865], [-73.94103009699987, 40.7046361769999], [-73.94273448399997, 40.70447330599988], [-73.94378799599994, 40.710900378999945], [-73.93480281900003, 40.713372495999884], [-73.93229708600003, 40.70774944699988], [-73.93391870799988, 40.70748702599992], [-73.93312548700004, 40.70470086199992]]]}}, {\&quot;id\&quot;: \&quot;37\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.500669344042838, \&quot;OBJECTID\&quot;: 38, \&quot;Shape_Leng\&quot;: 0.0832175685234, \&quot;Shape_Area\&quot;: 0.000327392684821, \&quot;zone\&quot;: \&quot;Cambria Heights\&quot;, \&quot;LocationID\&quot;: 38, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.73624941199995, 40.702536977999884], [-73.72677759516957, 40.7030592911994], [-73.72586264191175, 40.683241080973865], [-73.7475517539999, 40.68934733599984], [-73.7435928609999, 40.69621532499986], [-73.74618157999997, 40.696121925999904], [-73.74773012199991, 40.69955313699991], [-73.74500119100004, 40.70026221299988], [-73.74590871000004, 40.70228727399988], [-73.74109293999989, 40.7034810629999], [-73.73624941199995, 40.702536977999884]]]}}, {\&quot;id\&quot;: \&quot;38\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.49310027598896045, \&quot;OBJECTID\&quot;: 39, \&quot;Shape_Leng\&quot;: 0.132369620757, \&quot;Shape_Area\&quot;: 0.00090028293862, \&quot;zone\&quot;: \&quot;Canarsie\&quot;, \&quot;LocationID\&quot;: 39, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.89121853499988, 40.64998769899987], [-73.88805587182881, 40.64511978725729], [-73.87714434884276, 40.63597649800373], [-73.88364451728226, 40.630943312138584], [-73.88263248433404, 40.62827427312689], [-73.88369231571497, 40.62755937391403], [-73.88752673706196, 40.628331824482444], [-73.89577374598754, 40.62251907138477], [-73.91860649599992, 40.632090414999894], [-73.91995062999999, 40.64470762999989], [-73.91830152299998, 40.645812262999925], [-73.90944846399994, 40.65152159899992], [-73.90398200599991, 40.64662856799988], [-73.89586154900002, 40.65188052699987], [-73.89761013299987, 40.65345381599992], [-73.89354677099988, 40.65520271399988], [-73.89000589199988, 40.651148696999925], [-73.89121853499988, 40.64998769899987]]], [[[-73.88833929256269, 40.64671022891759], [-73.88849720193863, 40.64675678600008], [-73.88853291212868, 40.646861882230674], [-73.88846787961647, 40.646899734025276], [-73.88833929256269, 40.64671022891759]]]]}}, {\&quot;id\&quot;: \&quot;39\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.351327128576353, \&quot;OBJECTID\&quot;: 40, \&quot;Shape_Leng\&quot;: 0.0518506648762, \&quot;Shape_Area\&quot;: 0.000108949211644, \&quot;zone\&quot;: \&quot;Carroll Gardens\&quot;, \&quot;LocationID\&quot;: 40, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.998192111, 40.68228732999989], [-73.99620846299992, 40.681723424999916], [-73.99490113599977, 40.6844302379999], [-73.98722413899985, 40.68144730199988], [-73.99069861899994, 40.67580741899994], [-73.99506451099984, 40.67584047499984], [-73.9986188799999, 40.67183017199989], [-74.00329231299999, 40.67964328799992], [-74.00064737999996, 40.685253946999914], [-73.99908066099994, 40.68481599199985], [-74.00004865199998, 40.682803355999965], [-73.998192111, 40.68228732999989]]]}}, {\&quot;id\&quot;: \&quot;40\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4468749859213306, \&quot;OBJECTID\&quot;: 41, \&quot;Shape_Leng\&quot;: 0.052793109453, \&quot;Shape_Area\&quot;: 0.000143093037737, \&quot;zone\&quot;: \&quot;Central Harlem\&quot;, \&quot;LocationID\&quot;: 41, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94773985499985, 40.809599720999884], [-73.94177140199992, 40.807088999999955], [-73.94523965199991, 40.80513601399989], [-73.94613131, 40.80387735799992], [-73.94459751299998, 40.803228144999906], [-73.94922045699984, 40.796909858999896], [-73.95964685399987, 40.80115642299993], [-73.954966572, 40.81006455499988], [-73.9535757779999, 40.8094766979999], [-73.95210125199992, 40.811442853999935], [-73.94773985499985, 40.809599720999884]]]}}, {\&quot;id\&quot;: \&quot;41\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.528057639104641, \&quot;OBJECTID\&quot;: 42, \&quot;Shape_Leng\&quot;: 0.0927092274616, \&quot;Shape_Area\&quot;: 0.000263896952605, \&quot;zone\&quot;: \&quot;Central Harlem North\&quot;, \&quot;LocationID\&quot;: 42, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93436121591056, 40.83620061961779], [-73.93383089287109, 40.819521063761556], [-73.93901753299998, 40.81085655699991], [-73.93580780199986, 40.80949763799987], [-73.93854407899988, 40.80572965299991], [-73.95210125199992, 40.811442853999935], [-73.94607828700005, 40.821263215999906], [-73.93924885599988, 40.82829635099989], [-73.93864026699997, 40.82973887399988], [-73.9401708989999, 40.83038439099996], [-73.93868316299985, 40.832800788999904], [-73.93436121591056, 40.83620061961779]]]}}, {\&quot;id\&quot;: \&quot;42\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.45217191296412174, \&quot;OBJECTID\&quot;: 43, \&quot;Shape_Leng\&quot;: 0.0997386183576, \&quot;Shape_Area\&quot;: 0.000379662912054, \&quot;zone\&quot;: \&quot;Central Park\&quot;, \&quot;LocationID\&quot;: 43, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97255352299985, 40.76489773199991], [-73.98164804599995, 40.76843632199994], [-73.95817297099987, 40.800582540999876], [-73.94922045699984, 40.796909858999896], [-73.97255352299985, 40.76489773199991]]]}}, {\&quot;id\&quot;: \&quot;43\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.43243243243243246, \&quot;OBJECTID\&quot;: 44, \&quot;Shape_Leng\&quot;: 0.235688967594, \&quot;Shape_Area\&quot;: 0.00194465649192, \&quot;zone\&quot;: \&quot;Charleston/Tottenville\&quot;, \&quot;LocationID\&quot;: 44, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.21220034099994, 40.556443429999874], [-74.21784397899994, 40.554432717999894], [-74.22131562699998, 40.55025307399992], [-74.21776941599994, 40.54112662999992], [-74.21800676499996, 40.53229858999995], [-74.21354593399995, 40.521235715999886], [-74.22379595899992, 40.518196345999876], [-74.22690993299994, 40.5191713979999], [-74.22159300278173, 40.50250043822093], [-74.23114494958575, 40.50185121588201], [-74.23988017293566, 40.49757362656005], [-74.24917156868965, 40.49656729705339], [-74.25335538022304, 40.50041319788582], [-74.25554269163935, 40.50783774249614], [-74.25056007272197, 40.516106741535], [-74.24921528676096, 40.51508486129925], [-74.24994158808036, 40.516137488190985], [-74.24854589291671, 40.51616991714839], [-74.24940770789283, 40.516980831423645], [-74.24851449056031, 40.517475626265046], [-74.24644039651318, 40.515965028508525], [-74.2456347316994, 40.518075580745766], [-74.23991937852388, 40.52004699652993], [-74.24293235036517, 40.52122716113276], [-74.24396500758859, 40.52490536633781], [-74.24150733322897, 40.531041342795135], [-74.24204570286014, 40.53434637705037], [-74.24533651176053, 40.53690599443462], [-74.24560205698324, 40.54094959457726], [-74.24803463735688, 40.54309324044144], [-74.24336346552776, 40.54786513523582], [-74.24039182810051, 40.547663310173775], [-74.23641623448965, 40.55050862684339], [-74.23641559733107, 40.55232806634515], [-74.23334188482498, 40.55249971061369], [-74.2287242997478, 40.5562970171392], [-74.22062175949124, 40.55589882100512], [-74.21974356930723, 40.55461267207239], [-74.21921716370927, 40.55579696987855], [-74.21859325782798, 40.55467421024778], [-74.21870767560165, 40.55604101620115], [-74.21775342391726, 40.55500528477618], [-74.2056960519999, 40.55851600599987], [-74.21220034099994, 40.556443429999874]]]}}, {\&quot;id\&quot;: \&quot;44\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4297731185765409, \&quot;OBJECTID\&quot;: 45, \&quot;Shape_Leng\&quot;: 0.0459068626235, \&quot;Shape_Area\&quot;: 9.13594688556e-05, \&quot;zone\&quot;: \&quot;Chinatown\&quot;, \&quot;LocationID\&quot;: 45, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99750445299988, 40.71406913199995], [-73.99256242199989, 40.71438807699996], [-73.99190824271031, 40.70953292664334], [-73.99919451154429, 40.70794737667571], [-74.0058917509999, 40.71200715999989], [-73.99995620900002, 40.71801709499987], [-73.99605872699998, 40.7162316399999], [-73.99750445299988, 40.71406913199995]]]}}, {\&quot;id\&quot;: \&quot;45\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6166666666666667, \&quot;OBJECTID\&quot;: 46, \&quot;Shape_Leng\&quot;: 0.134475429879, \&quot;Shape_Area\&quot;: 0.000926391677672, \&quot;zone\&quot;: \&quot;City Island\&quot;, \&quot;LocationID\&quot;: 46, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.78452431937963, 40.86047706314786], [-73.78519664387113, 40.85882702363741], [-73.78743186194176, 40.858935245614425], [-73.78685886773299, 40.86004505783956], [-73.78452431937963, 40.86047706314786]]], [[[-73.76783205637173, 40.854442205742075], [-73.76938529139694, 40.85253613399675], [-73.76959674311465, 40.84759451909819], [-73.76789492672636, 40.84528943351961], [-73.76901389181107, 40.84509734272193], [-73.77157218833237, 40.8475000585803], [-73.7708892022117, 40.84975177133807], [-73.77296356611284, 40.8521592539586], [-73.77173060411904, 40.852476831319095], [-73.77296285334867, 40.853800062246464], [-73.77219223055407, 40.85998663859697], [-73.76947305423998, 40.85933013666858], [-73.76533243995276, 40.85504359512487], [-73.76783205637173, 40.854442205742075]]], [[[-73.79018745194999, 40.8586099173861], [-73.788043429758, 40.85755991768708], [-73.7884773265335, 40.8544005205322], [-73.78690734702697, 40.854063972299144], [-73.78796264288079, 40.8534747209355], [-73.78338158610377, 40.85158673391434], [-73.78420047134377, 40.8500606442406], [-73.78154449088599, 40.84940043464333], [-73.78267467078706, 40.84813967294664], [-73.78097820938946, 40.8484583479135], [-73.78263740397888, 40.848072649245836], [-73.78148431950568, 40.8478821938486], [-73.78216393435586, 40.84663633778076], [-73.780403269586, 40.846931134166056], [-73.7833653613534, 40.84444472298169], [-73.78348428748797, 40.84367854599843], [-73.78290650949755, 40.84393612584013], [-73.78052736048552, 40.84452514033816], [-73.7799270374445, 40.843883081355834], [-73.78347481249244, 40.843654738109784], [-73.78288778301486, 40.84249482884962], [-73.78022773872677, 40.84377818129771], [-73.78286499304913, 40.84247810188268], [-73.78059735822595, 40.84278659994098], [-73.78216624418964, 40.84168914411004], [-73.7804257718152, 40.842494394206874], [-73.78019599955293, 40.84204621097616], [-73.78185048197766, 40.841653946394324], [-73.7807975292347, 40.84125614604844], [-73.78282260139727, 40.836338155887844], [-73.78485009222643, 40.83747048917844], [-73.78563997845448, 40.83706443458537], [-73.78583067964128, 40.83720998000451], [-73.7857350929868, 40.83923423177581], [-73.78815921166512, 40.84049077856704], [-73.79179343625451, 40.846731672329284], [-73.78951371516173, 40.85130077171307], [-73.79311837183832, 40.851578295240834], [-73.79042053780161, 40.85302297821258], [-73.79281511966936, 40.852494819308916], [-73.79080758729923, 40.85319906006435], [-73.79287610048584, 40.8529441813284], [-73.79105721254825, 40.85391841242664], [-73.79245816844812, 40.85360070875487], [-73.79107002765942, 40.85394495666465], [-73.79253714604873, 40.85384932781285], [-73.79129282160633, 40.854584025976855], [-73.79201712228527, 40.85617694860626], [-73.79270523985137, 40.85619232890572], [-73.79268768222656, 40.856335218720375], [-73.79315700296156, 40.85635091107476], [-73.7931468608596, 40.856467828471146], [-73.79018745194999, 40.8586099173861]]], [[[-73.78283291447852, 40.85587030844573], [-73.78302371522504, 40.85509276666495], [-73.78394699722007, 40.85563043752662], [-73.78343487501385, 40.856362865958886], [-73.78283291447852, 40.85587030844573]]], [[[-73.78061730829718, 40.855735175810025], [-73.78090476851291, 40.8549681331623], [-73.7815638969994, 40.855001286433904], [-73.78122782332017, 40.856087789162764], [-73.78061730829718, 40.855735175810025]]], [[[-73.78833349834521, 40.834667129759346], [-73.78931223606624, 40.83446488655343], [-73.78951019872322, 40.835364042525754], [-73.78845700015209, 40.835309914315395], [-73.78833349834521, 40.834667129759346]]]]}}, {\&quot;id\&quot;: \&quot;46\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6623536660505237, \&quot;OBJECTID\&quot;: 47, \&quot;Shape_Leng\&quot;: 0.0898275563294, \&quot;Shape_Area\&quot;: 0.000163198117339, \&quot;zone\&quot;: \&quot;Claremont/Bathgate\&quot;, \&quot;LocationID\&quot;: 47, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89090203399996, 40.854116885999865], [-73.89431774099977, 40.851891310999854], [-73.89617712999998, 40.8466583209999], [-73.89290102299996, 40.84626832999992], [-73.89537836199995, 40.842938778999965], [-73.89666161699988, 40.84352460699992], [-73.90553116799988, 40.82910413299989], [-73.91049010699992, 40.830737372999884], [-73.90538357999992, 40.839768982999885], [-73.90483121999989, 40.84480034199987], [-73.901344046, 40.84442875099994], [-73.89106280699994, 40.8615294119999], [-73.89090203399996, 40.854116885999865]]]}}, {\&quot;id\&quot;: \&quot;47\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40902683820441527, \&quot;OBJECTID\&quot;: 48, \&quot;Shape_Leng\&quot;: 0.0437467441431, \&quot;Shape_Area\&quot;: 9.42538425377e-05, \&quot;zone\&quot;: \&quot;Clinton East\&quot;, \&quot;LocationID\&quot;: 48, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99117738199989, 40.75532984899992], [-73.99730671499998, 40.757110506999894], [-73.98806289599996, 40.769790799999925], [-73.98236545099999, 40.7673921529999], [-73.99117738199989, 40.75532984899992]]]}}, {\&quot;id\&quot;: \&quot;48\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40843880823561096, \&quot;OBJECTID\&quot;: 49, \&quot;Shape_Leng\&quot;: 0.0752900183427, \&quot;Shape_Area\&quot;: 0.000203185525471, \&quot;zone\&quot;: \&quot;Clinton Hill\&quot;, \&quot;LocationID\&quot;: 49, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96062056499981, 40.69632013999993], [-73.96015854699988, 40.69411730899989], [-73.95614239299985, 40.694579018999896], [-73.95541057999996, 40.69090829199994], [-73.96029281699998, 40.69034624999995], [-73.95956770199984, 40.686682554999955], [-73.95468418899998, 40.68724485399985], [-73.95328187399996, 40.68020003099985], [-73.95529361599996, 40.679203150999825], [-73.96868961400001, 40.68200525799988], [-73.97013154199992, 40.68950630799986], [-73.96910362499993, 40.68946752199986], [-73.9693945009999, 40.696080388999846], [-73.9645507049999, 40.696107591999855], [-73.96105100699992, 40.69832607899989], [-73.96062056499981, 40.69632013999993]]]}}, {\&quot;id\&quot;: \&quot;49\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.37405203993576447, \&quot;OBJECTID\&quot;: 50, \&quot;Shape_Leng\&quot;: 0.0557479867536, \&quot;Shape_Area\&quot;: 0.000173249283326, \&quot;zone\&quot;: \&quot;Clinton West\&quot;, \&quot;LocationID\&quot;: 50, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99667705784736, 40.77351005394221], [-73.98806289599996, 40.769790799999925], [-73.99547450199992, 40.759626856999894], [-74.00375735018837, 40.763582241820224], [-74.0009730802201, 40.763420271725614], [-74.00311291631381, 40.76474559615368], [-73.99915098087908, 40.76420525958265], [-74.0020245433034, 40.76589326657037], [-73.99857638530527, 40.76499860727083], [-74.00157335385273, 40.766977192210646], [-73.9980667590535, 40.76587188113572], [-73.99737808447954, 40.76682338637958], [-74.00064950530414, 40.76824523610559], [-73.99715588949206, 40.76712869617278], [-73.9964571540504, 40.76809881579563], [-73.99973590247859, 40.76950617733152], [-73.99707176039315, 40.768732643576804], [-73.9987620691431, 40.7708250567092], [-73.99631327022087, 40.76979883633644], [-73.99493501658995, 40.77146814657798], [-73.99667705784736, 40.77351005394221]]]}}, {\&quot;id\&quot;: \&quot;50\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5246995994659546, \&quot;OBJECTID\&quot;: 51, \&quot;Shape_Leng\&quot;: 0.0953613442277, \&quot;Shape_Area\&quot;: 0.000395756553505, \&quot;zone\&quot;: \&quot;Co-Op City\&quot;, \&quot;LocationID\&quot;: 51, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82091617199997, 40.86891693399989], [-73.81578764099999, 40.8657580609999], [-73.82037552999996, 40.86103300499993], [-73.82699653199998, 40.85908778599986], [-73.83315960399985, 40.86831975599994], [-73.83565766499987, 40.86751275599992], [-73.83829221499984, 40.87295133899995], [-73.83924788999988, 40.876618737999905], [-73.8381484219999, 40.876953298999915], [-73.84324113799987, 40.879108912999904], [-73.82387140599998, 40.88778362799996], [-73.82077408699998, 40.886710602999884], [-73.81992586499996, 40.88211933299987], [-73.82329599399986, 40.87309741799988], [-73.82091617199997, 40.86891693399989]]]}}, {\&quot;id\&quot;: \&quot;51\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.33141927356707956, \&quot;OBJECTID\&quot;: 52, \&quot;Shape_Leng\&quot;: 0.0289076710093, \&quot;Shape_Area\&quot;: 4.52027509603e-05, \&quot;zone\&quot;: \&quot;Cobble Hill\&quot;, \&quot;LocationID\&quot;: 52, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99588110299992, 40.68239495399995], [-74.00004865199998, 40.682803355999965], [-73.99908066099994, 40.68481599199985], [-74.00064737999996, 40.685253946999914], [-73.99776924399993, 40.691194697999954], [-73.99236366999985, 40.689690123999924], [-73.99588110299992, 40.68239495399995]]]}}, {\&quot;id\&quot;: \&quot;52\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6158475426278837, \&quot;OBJECTID\&quot;: 53, \&quot;Shape_Leng\&quot;: 0.161500913385, \&quot;Shape_Area\&quot;: 0.000947530980821, \&quot;zone\&quot;: \&quot;College Point\&quot;, \&quot;LocationID\&quot;: 53, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.83839013354552, 40.798304872075995], [-73.83919004727183, 40.7977772664477], [-73.84025860809128, 40.79758885843212], [-73.83840083088981, 40.79675525865344], [-73.83663288911686, 40.79251637576927], [-73.84067828300006, 40.79390789199993], [-73.84081532599994, 40.7915048849999], [-73.83895676099984, 40.79143843099996], [-73.84008157499997, 40.78785153099992], [-73.83824429099994, 40.78778591599995], [-73.83869921299997, 40.781676956999874], [-73.82513740299993, 40.78169970599994], [-73.83000011099983, 40.77373240699996], [-73.83913189281712, 40.765991105784146], [-73.83975387982034, 40.767120445440874], [-73.84491332846012, 40.76552838817853], [-73.84780575104425, 40.76677294817163], [-73.84977407793218, 40.769936012942956], [-73.8486715286884, 40.770761572902536], [-73.85130108374476, 40.77180636079771], [-73.84897619867189, 40.77356166795698], [-73.84895559325399, 40.77796167373135], [-73.84963631633588, 40.77948192035157], [-73.85094705724252, 40.77906915543026], [-73.85148755480326, 40.77899297861757], [-73.84981720066014, 40.77963034805418], [-73.85232086242219, 40.77916928470371], [-73.85238832778414, 40.7795289023869], [-73.84982102259761, 40.779651339303875], [-73.84955315550077, 40.779990415384006], [-73.85169028085423, 40.779867508478176], [-73.85167099162219, 40.780035228878106], [-73.84949381208321, 40.780065828114246], [-73.85093646396534, 40.781119575156005], [-73.8492525818285, 40.782264775014035], [-73.85528242786589, 40.78197538434999], [-73.8595236950597, 40.785561954252664], [-73.85284230133867, 40.78821137173992], [-73.85480194733185, 40.788619154725914], [-73.85265830693045, 40.79110642061034], [-73.85377854910695, 40.79242127400702], [-73.8526309825624, 40.79494485424474], [-73.84906160835088, 40.79336261029852], [-73.84855988738983, 40.79549506021838], [-73.84354668938991, 40.79491394401049], [-73.84225959368331, 40.79558496893736], [-73.8428667525936, 40.79692222907191], [-73.84158721174394, 40.795401069221235], [-73.84041517975831, 40.7976784372587], [-73.83839013354552, 40.798304872075995]]], [[[-73.8678840747076, 40.78736103669457], [-73.86813032000018, 40.78723277784419], [-73.8692349173292, 40.78596991495815], [-73.8680991225789, 40.78745866181839], [-73.8678840747076, 40.78736103669457]]]]}}, {\&quot;id\&quot;: \&quot;53\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.33837959069245865, \&quot;OBJECTID\&quot;: 54, \&quot;Shape_Leng\&quot;: 0.0762192448554, \&quot;Shape_Area\&quot;: 0.000132452130536, \&quot;zone\&quot;: \&quot;Columbia Street\&quot;, \&quot;LocationID\&quot;: 54, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.00174362072502, 40.69240674985266], [-74.00400795971088, 40.693208199632345], [-74.00127014951309, 40.69329606183691], [-74.00174362072502, 40.69240674985266]]], [[[-74.00174362072502, 40.69240674985266], [-73.99776924399993, 40.691194697999954], [-74.00329231299999, 40.67964328799992], [-74.00596041099988, 40.683362870999936], [-74.00485241699997, 40.68566813099993], [-74.00783293766679, 40.68738505516274], [-74.00459270521766, 40.688215222986614], [-74.00636461225261, 40.68966966863697], [-74.00382038919723, 40.688929644699236], [-74.0053420962491, 40.6910916029778], [-74.0009615685494, 40.69012876835003], [-74.00479415294552, 40.69176162037443], [-74.00174362072502, 40.69240674985266]]], [[[-74.01092841300002, 40.684491472999824], [-74.01217596614636, 40.68409518562848], [-74.00816320571415, 40.68617364485845], [-74.0086007239999, 40.68590956499989], [-74.01092841300002, 40.684491472999824]]]]}}, {\&quot;id\&quot;: \&quot;54\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5935613682092555, \&quot;OBJECTID\&quot;: 55, \&quot;Shape_Leng\&quot;: 0.149956807524, \&quot;Shape_Area\&quot;: 0.000736274713586, \&quot;zone\&quot;: \&quot;Coney Island\&quot;, \&quot;LocationID\&quot;: 55, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98671582299981, 40.58456849999991], [-73.97742525299988, 40.58290659299994], [-73.96661531499983, 40.58457103699992], [-73.9688899589999, 40.57526123899986], [-73.95941778299985, 40.57517798299994], [-73.95939182223685, 40.57391210937612], [-73.98367270153267, 40.57140705768737], [-73.98336058039273, 40.56952999448666], [-73.98375790448641, 40.571396227250865], [-74.00208547639728, 40.569585983985014], [-74.00303186164808, 40.57218559475904], [-74.01115668729254, 40.57416676185885], [-74.01302222952468, 40.577804459633505], [-74.0111737229432, 40.58028397882522], [-74.00604734235807, 40.58198365303581], [-73.98814208290418, 40.57886596371379], [-73.98604509916208, 40.58172068515157], [-73.98800973376738, 40.579670687155776], [-73.98995504960881, 40.58066166976562], [-73.98671582299981, 40.58456849999991]]]}}, {\&quot;id\&quot;: \&quot;55\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5883275261324041, \&quot;OBJECTID\&quot;: 56, \&quot;Shape_Leng\&quot;: 0.0568478126677, \&quot;Shape_Area\&quot;: 0.000180907844436, \&quot;zone\&quot;: \&quot;Corona\&quot;, \&quot;LocationID\&quot;: 56, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85360568399982, 40.74749682799991], [-73.85011556599989, 40.74072356299995], [-73.84750820299992, 40.73900780699995], [-73.86462193299997, 40.73428275699993], [-73.86790963899986, 40.74493371599989], [-73.85442575299999, 40.748851725999884], [-73.85360568399982, 40.74749682799991]]]}}, {\&quot;id\&quot;: \&quot;56\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5883275261324041, \&quot;OBJECTID\&quot;: 57, \&quot;Shape_Leng\&quot;: 0.0192705048557, \&quot;Shape_Area\&quot;: 1.80259807917e-05, \&quot;zone\&quot;: \&quot;Corona\&quot;, \&quot;LocationID\&quot;: 56, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8513110499998, 40.74984337599988], [-73.85442575299999, 40.748851725999884], [-73.85579909099987, 40.75440952799994], [-73.85312635499996, 40.75510934299989], [-73.8513110499998, 40.74984337599988]]]}}, {\&quot;id\&quot;: \&quot;57\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.32941176470588235, \&quot;OBJECTID\&quot;: 58, \&quot;Shape_Leng\&quot;: 0.0598554094851, \&quot;Shape_Area\&quot;: 0.000204980931361, \&quot;zone\&quot;: \&quot;Country Club\&quot;, \&quot;LocationID\&quot;: 58, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.81561382067721, 40.84818955758243], [-73.81602685114903, 40.846400458770034], [-73.81464594697542, 40.84721961352901], [-73.81570353189448, 40.84629134042384], [-73.81368634738199, 40.84727432550905], [-73.81356372861671, 40.847151411278524], [-73.8150262760428, 40.845499995058404], [-73.81284939958525, 40.84631879949822], [-73.81324326350918, 40.84523590835256], [-73.81310050626846, 40.84517241453328], [-73.8128770359758, 40.8451346679459], [-73.81315597044244, 40.84521210037631], [-73.81285536957633, 40.845186285461466], [-73.81241445328128, 40.846559380748744], [-73.81227790900483, 40.846543458279285], [-73.8128577433794, 40.845129544589135], [-73.81254457815619, 40.84497959800826], [-73.81169971823665, 40.84668170081364], [-73.81266141349049, 40.84420764950083], [-73.81254909120709, 40.84495227514607], [-73.8136558066588, 40.8450591224657], [-73.81414462049185, 40.84481817326274], [-73.81437458252545, 40.8430889259994], [-73.81569792948075, 40.8443864281129], [-73.81823722746202, 40.844355041712625], [-73.81473345817534, 40.8413757283108], [-73.81606068217324, 40.83603019622843], [-73.82601252600003, 40.83402077799985], [-73.82624132999996, 40.84299359399991], [-73.82517999, 40.842700058999874], [-73.82495697699986, 40.846105444999864], [-73.82048405599983, 40.84850102599995], [-73.81507165904237, 40.84913361979451], [-73.81561382067721, 40.84818955758243]]]}}, {\&quot;id\&quot;: \&quot;58\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6052631578947368, \&quot;OBJECTID\&quot;: 59, \&quot;Shape_Leng\&quot;: 0.0377948070893, \&quot;Shape_Area\&quot;: 6.28765230648e-05, \&quot;zone\&quot;: \&quot;Crotona Park\&quot;, \&quot;LocationID\&quot;: 59, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88941724899998, 40.839422732999836], [-73.88659802299989, 40.839279049999895], [-73.89697220299995, 40.8343452539999], [-73.9012157839999, 40.8354101409999], [-73.89666161699988, 40.84352460699992], [-73.88941724899998, 40.839422732999836]]]}}, {\&quot;id\&quot;: \&quot;59\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6139359698681732, \&quot;OBJECTID\&quot;: 60, \&quot;Shape_Leng\&quot;: 0.0786482878226, \&quot;Shape_Area\&quot;: 0.000161833284912, \&quot;zone\&quot;: \&quot;Crotona Park East\&quot;, \&quot;LocationID\&quot;: 60, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87823856799989, 40.839985917999854], [-73.87277204699981, 40.83975128199995], [-73.87379590199993, 40.837445132999896], [-73.88005188499987, 40.83470205899989], [-73.88390094800003, 40.82980281599986], [-73.8843985489999, 40.822965575999866], [-73.88753429599987, 40.82250933899995], [-73.88601262699991, 40.828238530999926], [-73.88761307899992, 40.8293374189999], [-73.89717220999982, 40.830368832999966], [-73.89697220299995, 40.8343452539999], [-73.89408527499982, 40.8362973469999], [-73.88730373200002, 40.83812719099994], [-73.88618432099992, 40.840105043999884], [-73.88200384100001, 40.837443781999895], [-73.880061996, 40.840162234999845], [-73.87823856799989, 40.839985917999854]]]}}, {\&quot;id\&quot;: \&quot;60\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.43763165683048694, \&quot;OBJECTID\&quot;: 61, \&quot;Shape_Leng\&quot;: 0.117310808097, \&quot;Shape_Area\&quot;: 0.000510772092295, \&quot;zone\&quot;: \&quot;Crown Heights North\&quot;, \&quot;LocationID\&quot;: 61, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92916130699993, 40.68343632399992], [-73.92281374299995, 40.68341442999991], [-73.92164666399992, 40.67886992299994], [-73.92275257199998, 40.667097332999894], [-73.92872204599985, 40.66449556899988], [-73.93698362399992, 40.665535507999955], [-73.93674946999998, 40.66812737099991], [-73.96131877999991, 40.67140667599988], [-73.96007428300001, 40.67487807099994], [-73.96318238899983, 40.675529503999876], [-73.96134655899995, 40.6804635239999], [-73.95529361599996, 40.679203150999825], [-73.9533701749999, 40.680640507999904], [-73.93435066499993, 40.67956340799991], [-73.93500821699992, 40.68276376799985], [-73.92916130699993, 40.68343632399992]]]}}, {\&quot;id\&quot;: \&quot;61\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4873375699516267, \&quot;OBJECTID\&quot;: 62, \&quot;Shape_Leng\&quot;: 0.0822593359838, \&quot;Shape_Area\&quot;: 0.000158238169004, \&quot;zone\&quot;: \&quot;Crown Heights South\&quot;, \&quot;LocationID\&quot;: 62, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92916752199997, 40.664299531999895], [-73.94282892199992, 40.6628474859999], [-73.94269628999989, 40.664055128999934], [-73.94546293699983, 40.66422610399989], [-73.96095595499996, 40.66328505499992], [-73.96258784899996, 40.671711596999884], [-73.93674946999998, 40.66812737099991], [-73.93698362399992, 40.665535507999955], [-73.92916752199997, 40.664299531999895]]]}}, {\&quot;id\&quot;: \&quot;62\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4685754189944134, \&quot;OBJECTID\&quot;: 63, \&quot;Shape_Leng\&quot;: 0.119100721883, \&quot;Shape_Area\&quot;: 0.000353190910142, \&quot;zone\&quot;: \&quot;Cypress Hills\&quot;, \&quot;LocationID\&quot;: 63, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86650407899994, 40.684474051999885], [-73.86602666799992, 40.681918051999936], [-73.86410096700003, 40.68237284999988], [-73.86234580499983, 40.67916478599994], [-73.86106294999989, 40.67434293499984], [-73.87231018000001, 40.67775574699987], [-73.87531627599998, 40.68011098399988], [-73.88061377799994, 40.679110031999876], [-73.88116730300005, 40.68135366299988], [-73.9000462609999, 40.676893089999936], [-73.9040463979999, 40.67922059799985], [-73.90262262299991, 40.6806645029999], [-73.89786299899986, 40.67987501099987], [-73.89417463299992, 40.6852832479999], [-73.89252316799995, 40.683424532999865], [-73.88962787599998, 40.684236453999894], [-73.87402053199992, 40.69419129499995], [-73.86891704399994, 40.69515042299987], [-73.86650407899994, 40.684474051999885]]]}}, {\&quot;id\&quot;: \&quot;65\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3268301440775595, \&quot;OBJECTID\&quot;: 66, \&quot;Shape_Leng\&quot;: 0.0546334593634, \&quot;Shape_Area\&quot;: 0.000108378855948, \&quot;zone\&quot;: \&quot;DUMBO/Vinegar Hill\&quot;, \&quot;LocationID\&quot;: 66, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97906084869959, 40.7059460290057], [-73.98050926199988, 40.69744627499991], [-73.98696892299995, 40.698503613999954], [-73.98679382799996, 40.700633222999954], [-73.99093201799984, 40.7007662159999], [-73.99544564312069, 40.70327530547179], [-73.99350881403605, 40.70462350527397], [-73.97906084869959, 40.7059460290057]]]}}, {\&quot;id\&quot;: \&quot;63\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.43376623376623374, \&quot;OBJECTID\&quot;: 64, \&quot;Shape_Leng\&quot;: 0.18445188474, \&quot;Shape_Area\&quot;: 0.00105790284614, \&quot;zone\&quot;: \&quot;Douglaston\&quot;, \&quot;LocationID\&quot;: 64, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.74412314584049, 40.77863865777706], [-73.71351828186042, 40.75983773091619], [-73.72031595299998, 40.75789725799992], [-73.72771356199995, 40.750626894999904], [-73.7310646189999, 40.744888375999885], [-73.74016951799993, 40.73848189799986], [-73.74306820799991, 40.7384408179999], [-73.74396193599988, 40.740789125999925], [-73.75098230100001, 40.740021462999884], [-73.75347299999999, 40.74240484399992], [-73.74477587099986, 40.74328109699994], [-73.74625984399985, 40.74671147499993], [-73.74384322099985, 40.74769009599988], [-73.75004764499985, 40.75840465799996], [-73.75230259399993, 40.759455198999916], [-73.75583713299987, 40.757742061999934], [-73.75921689799992, 40.76432485599988], [-73.75377036482259, 40.76530463174143], [-73.7510743225255, 40.76176367133622], [-73.74455864030779, 40.756557885832535], [-73.75507210849031, 40.76753310678742], [-73.7555733264932, 40.77152912592269], [-73.75336691999294, 40.77320784776336], [-73.75551737581792, 40.77770404836418], [-73.75080593606877, 40.782893378833954], [-73.74412314584049, 40.77863865777706]]]}}, {\&quot;id\&quot;: \&quot;64\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3741264087198836, \&quot;OBJECTID\&quot;: 65, \&quot;Shape_Leng\&quot;: 0.0446070683658, \&quot;Shape_Area\&quot;: 8.1803882541e-05, \&quot;zone\&quot;: \&quot;Downtown Brooklyn/MetroTech\&quot;, \&quot;LocationID\&quot;: 65, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98712491499988, 40.70063447999997], [-73.98696892299995, 40.698503613999954], [-73.98050926199988, 40.69744627499991], [-73.97916718399999, 40.69348832299992], [-73.98251122999989, 40.69361433399992], [-73.98147568199991, 40.689930943999876], [-73.99097186899995, 40.69254879999995], [-73.99093201799984, 40.7007662159999], [-73.98712491499988, 40.70063447999997]]]}}, {\&quot;id\&quot;: \&quot;66\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5390855457227138, \&quot;OBJECTID\&quot;: 67, \&quot;Shape_Leng\&quot;: 0.0997470781551, \&quot;Shape_Area\&quot;: 0.000394282272487, \&quot;zone\&quot;: \&quot;Dyker Heights\&quot;, \&quot;LocationID\&quot;: 67, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0109702639999, 40.63068186899988], [-74.00702302499997, 40.63210999499996], [-73.99724067099987, 40.62528868699994], [-73.99771358999998, 40.62368026999996], [-73.99932090299998, 40.62465524699996], [-74.01701910199995, 40.60765441699994], [-74.01549854999998, 40.606841523999925], [-74.0186913569999, 40.60360792399995], [-74.02129949199998, 40.60442832299987], [-74.02078540899996, 40.60567368599989], [-74.02247769499994, 40.60667421599987], [-74.02150602899994, 40.60782209899992], [-74.02710660599995, 40.61024395599991], [-74.02637609099996, 40.61245060299993], [-74.02754297299998, 40.61293718299988], [-74.01970491599991, 40.6221849649999], [-74.01514630699995, 40.63322193799993], [-74.0109702639999, 40.63068186899988]]]}}, {\&quot;id\&quot;: \&quot;67\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.34986003468471766, \&quot;OBJECTID\&quot;: 68, \&quot;Shape_Leng\&quot;: 0.0493373795569, \&quot;Shape_Area\&quot;: 0.000111073378655, \&quot;zone\&quot;: \&quot;East Chelsea\&quot;, \&quot;LocationID\&quot;: 68, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00201937799989, 40.74044408899989], [-74.00820401899988, 40.74214751799986], [-73.99730671499998, 40.757110506999894], [-73.99163271299996, 40.75470680499996], [-74.00201937799989, 40.74044408899989]]]}}, {\&quot;id\&quot;: \&quot;68\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6387065791579959, \&quot;OBJECTID\&quot;: 69, \&quot;Shape_Leng\&quot;: 0.0789896450483, \&quot;Shape_Area\&quot;: 0.00019905160381, \&quot;zone\&quot;: \&quot;East Concourse/Concourse Village\&quot;, \&quot;LocationID\&quot;: 69, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91179361999997, 40.8264281559999], [-73.91130974499993, 40.824848557999886], [-73.91541108199998, 40.82577390899993], [-73.92518486499998, 40.818012668999884], [-73.92731653099999, 40.81855963399991], [-73.91193751499992, 40.843202387999916], [-73.90514893999989, 40.84254719499995], [-73.91049010699992, 40.830737372999884], [-73.908959903, 40.83022623299989], [-73.91179361999997, 40.8264281559999]]]}}, {\&quot;id\&quot;: \&quot;69\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5087183775872883, \&quot;OBJECTID\&quot;: 70, \&quot;Shape_Leng\&quot;: 0.0638403183367, \&quot;Shape_Area\&quot;: 0.000195458476728, \&quot;zone\&quot;: \&quot;East Elmhurst\&quot;, \&quot;LocationID\&quot;: 70, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85912375899987, 40.76127549899994], [-73.85449593299987, 40.75827863899985], [-73.87513874300004, 40.756633815999905], [-73.87608949699984, 40.77153690299987], [-73.868098735, 40.77017200899994], [-73.85912375899987, 40.76127549899994]]]}}, {\&quot;id\&quot;: \&quot;70\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4368932038834951, \&quot;OBJECTID\&quot;: 71, \&quot;Shape_Leng\&quot;: 0.0931694551828, \&quot;Shape_Area\&quot;: 0.000382572587364, \&quot;zone\&quot;: \&quot;East Flatbush/Farragut\&quot;, \&quot;LocationID\&quot;: 71, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93177153199984, 40.65527364199989], [-73.92910623099985, 40.63979510599992], [-73.92574389399985, 40.64001446599985], [-73.92652490899994, 40.63649272299989], [-73.92744822299987, 40.635258409999864], [-73.9372670019998, 40.634650624999885], [-73.93701746200003, 40.63231097899989], [-73.94462885499995, 40.63183773499993], [-73.94537272499998, 40.638786954999865], [-73.94826499699982, 40.63860718999994], [-73.94841343400003, 40.639987463999944], [-73.94778994699976, 40.643305735999924], [-73.94586879199989, 40.64342374399988], [-73.94715896299984, 40.65559378699993], [-73.931907438, 40.656537652999916], [-73.93177153199984, 40.65527364199989]]]}}, {\&quot;id\&quot;: \&quot;71\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4871023215821152, \&quot;OBJECTID\&quot;: 72, \&quot;Shape_Leng\&quot;: 0.0952020695166, \&quot;Shape_Area\&quot;: 0.000323532461947, \&quot;zone\&quot;: \&quot;East Flatbush/Remsen Village\&quot;, \&quot;LocationID\&quot;: 72, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92021313099984, 40.65997544099987], [-73.9195947979998, 40.66199567899985], [-73.91236458899995, 40.65551356499985], [-73.91012255699995, 40.655851770999945], [-73.90855790499995, 40.65209593799989], [-73.91995062999999, 40.64470762999989], [-73.91973736999988, 40.64277814799987], [-73.92332654599986, 40.63990021599991], [-73.92356525899983, 40.642499297999905], [-73.92538233099987, 40.64238453199987], [-73.92574389499987, 40.64001446599983], [-73.92910623199991, 40.6397951059999], [-73.93190743899989, 40.656537652999944], [-73.92799465199988, 40.65680210099988], [-73.92834017599988, 40.660060035999884], [-73.92646424299983, 40.659814361999956], [-73.93068465499985, 40.66362047699992], [-73.92637970499992, 40.6655148919999], [-73.92021313099984, 40.65997544099987]]]}}, {\&quot;id\&quot;: \&quot;72\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5246636771300448, \&quot;OBJECTID\&quot;: 73, \&quot;Shape_Leng\&quot;: 0.0853020209129, \&quot;Shape_Area\&quot;: 0.000291799754395, \&quot;zone\&quot;: \&quot;East Flushing\&quot;, \&quot;LocationID\&quot;: 73, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79566545000003, 40.75023619999991], [-73.79729524799988, 40.74943505299992], [-73.7946756879998, 40.74721192799994], [-73.8033521419999, 40.74643196499987], [-73.80287666499987, 40.749765148999856], [-73.80750599299991, 40.750136586999936], [-73.81416172099998, 40.74613857999986], [-73.820849288, 40.75224154499988], [-73.8184078289999, 40.75383042199998], [-73.82030067699999, 40.75551497999992], [-73.81789245699991, 40.75708633799991], [-73.82063593299985, 40.75887226799989], [-73.81104963199985, 40.761417020999964], [-73.79940088899988, 40.759397218999936], [-73.79493246199993, 40.75779802999994], [-73.79566545000003, 40.75023619999991]]]}}, {\&quot;id\&quot;: \&quot;73\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5461532678159068, \&quot;OBJECTID\&quot;: 74, \&quot;Shape_Leng\&quot;: 0.11029093625, \&quot;Shape_Area\&quot;: 0.000295038418204, \&quot;zone\&quot;: \&quot;East Harlem North\&quot;, \&quot;LocationID\&quot;: 74, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.93380589881859, 40.81651249324708], [-73.93412073484292, 40.80865645197743], [-73.92903490240305, 40.80108090385195], [-73.9290364017962, 40.79676259410132], [-73.93505300002766, 40.79168720295447], [-73.93773612099982, 40.792815803999936], [-73.93864883299987, 40.79155775499987], [-73.94327251199996, 40.79348810299993], [-73.94187604699994, 40.79540586899984], [-73.94831125500004, 40.79812921799992], [-73.94459751299998, 40.803228144999906], [-73.94613131, 40.80387735799992], [-73.94430194599991, 40.806390824999916], [-73.93854407899988, 40.80572965299991], [-73.93580780199986, 40.80949763799987], [-73.93901753299998, 40.81085655699991], [-73.93407463999996, 40.81782651399992], [-73.93440039999986, 40.81966778299989], [-73.93380589881859, 40.81651249324708]]], [[[-73.92688606022001, 40.800840648368855], [-73.92650954883642, 40.80065703126224], [-73.92704640297914, 40.800651743031324], [-73.92688606022001, 40.800840648368855]]], [[[-73.92666565490181, 40.80018271401784], [-73.92669572614771, 40.80014697707624], [-73.9272477078927, 40.800392957368906], [-73.92711464230626, 40.80056375622957], [-73.92666565490181, 40.80018271401784]]], [[[-73.92672091168967, 40.800414210943586], [-73.92653846445016, 40.80033389815394], [-73.92674263892977, 40.800403498972756], [-73.92672091168967, 40.800414210943586]]], [[[-73.92718514789182, 40.797349896890104], [-73.92767122620857, 40.79721701426623], [-73.92770694127064, 40.7972986638821], [-73.92738263624496, 40.797377063580456], [-73.92718514789182, 40.797349896890104]]]]}}, {\&quot;id\&quot;: \&quot;74\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4492545165486342, \&quot;OBJECTID\&quot;: 75, \&quot;Shape_Leng\&quot;: 0.0876638997685, \&quot;Shape_Area\&quot;: 0.00024056392715, \&quot;zone\&quot;: \&quot;East Harlem South\&quot;, \&quot;LocationID\&quot;: 75, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94103496899987, 40.79254666899993], [-73.93505300002766, 40.79168720295447], [-73.93708104382307, 40.78936639571], [-73.93621859869943, 40.78880049757431], [-73.94354420706223, 40.78288052416259], [-73.9557773589999, 40.78791392399995], [-73.94831125500004, 40.79812921799992], [-73.94187604699994, 40.79540586899984], [-73.94327251199996, 40.79348810299993], [-73.94103496899987, 40.79254666899993]]]}}, {\&quot;id\&quot;: \&quot;75\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5230667838312829, \&quot;OBJECTID\&quot;: 76, \&quot;Shape_Leng\&quot;: 0.241203016269, \&quot;Shape_Area\&quot;: 0.00126660143241, \&quot;zone\&quot;: \&quot;East New York\&quot;, \&quot;LocationID\&quot;: 76, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88063900599983, 40.679176984999856], [-73.87507136399991, 40.68003514599991], [-73.87231018000001, 40.67775574699987], [-73.86106294999989, 40.67434293499984], [-73.86038937900003, 40.67126877499985], [-73.85763323199998, 40.67165619399985], [-73.85568461199988, 40.66386749199993], [-73.85842950899992, 40.66345335999987], [-73.85761052799985, 40.660108355999924], [-73.86317083299996, 40.65827651199994], [-73.86327623068586, 40.656941215328104], [-73.85695870295893, 40.65058737348713], [-73.85840315341014, 40.64700390123735], [-73.85716978298207, 40.64367855888597], [-73.86289463224384, 40.64255067968245], [-73.86670411973783, 40.6400217634955], [-73.86563247391335, 40.63878676362291], [-73.86867282895084, 40.640925079203356], [-73.87061492461066, 40.64485674188673], [-73.87971979034293, 40.65437592977636], [-73.86989583386247, 40.63893452891954], [-73.86799709668125, 40.63811526520958], [-73.86960972136559, 40.63708553460871], [-73.87347939154502, 40.63628554579879], [-73.87841589406925, 40.638912189353306], [-73.8745808109999, 40.64561010599992], [-73.88221364899994, 40.65451863799996], [-73.89000589199988, 40.651148696999925], [-73.89354677099988, 40.65520271399988], [-73.89761013299987, 40.65345381599992], [-73.89586154900002, 40.65188052699987], [-73.90398200599991, 40.64662856799988], [-73.90944846399994, 40.65152159899992], [-73.90740035699999, 40.6528439899999], [-73.90784346399994, 40.65459152999988], [-73.89612587299993, 40.657814663999936], [-73.88185557299985, 40.66414998799994], [-73.88330883399975, 40.66611200499991], [-73.889906696, 40.66377828999986], [-73.89087805100002, 40.671318086999875], [-73.89271090700004, 40.67104582799992], [-73.89367036399987, 40.67482177099988], [-73.89930675399987, 40.67398204199991], [-73.90004626199993, 40.67689308999995], [-73.88116730300005, 40.68135366299988], [-73.88063900599983, 40.679176984999856]]]}}, {\&quot;id\&quot;: \&quot;76\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4744079449961803, \&quot;OBJECTID\&quot;: 77, \&quot;Shape_Leng\&quot;: 0.075461081444, \&quot;Shape_Area\&quot;: 0.000191917981315, \&quot;zone\&quot;: \&quot;East New York/Pennsylvania Avenue\&quot;, \&quot;LocationID\&quot;: 77, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8997089949999, 40.67549425099991], [-73.89930675399987, 40.67398204199991], [-73.89367036399987, 40.67482177099988], [-73.89271090699994, 40.671045828999915], [-73.89087805100002, 40.671318086999875], [-73.889906696, 40.66377828999986], [-73.88330883399975, 40.66611200499991], [-73.88185557299985, 40.66414998799994], [-73.89880698499995, 40.65740666199988], [-73.90066118699986, 40.66058615799992], [-73.90347422300006, 40.67550668299985], [-73.90004626199993, 40.67689308999995], [-73.8997089949999, 40.67549425099991]]]}}, {\&quot;id\&quot;: \&quot;77\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6226415094339622, \&quot;OBJECTID\&quot;: 78, \&quot;Shape_Leng\&quot;: 0.0935944495806, \&quot;Shape_Area\&quot;: 0.000191114419551, \&quot;zone\&quot;: \&quot;East Tremont\&quot;, \&quot;LocationID\&quot;: 78, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88963328299991, 40.85317381799993], [-73.88987871399985, 40.85207022099993], [-73.8773292409999, 40.84398312499995], [-73.878171756, 40.84262443699987], [-73.87459175399982, 40.841520647999914], [-73.87109207899995, 40.84432478099992], [-73.86920944599997, 40.84923837199993], [-73.86785992999985, 40.84886493099987], [-73.86804200399997, 40.8448138389999], [-73.87359713599987, 40.83979855499992], [-73.880061996, 40.840162234999845], [-73.88200384100001, 40.837443781999895], [-73.88618432099993, 40.8401050449999], [-73.88941724899988, 40.83942273399985], [-73.89537836099996, 40.842938778999944], [-73.89290102299996, 40.84626832999992], [-73.89617712999998, 40.8466583209999], [-73.89307140900002, 40.85324998699989], [-73.89038953999983, 40.85468905799996], [-73.88963328299991, 40.85317381799993]]]}}, {\&quot;id\&quot;: \&quot;78\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.30423765485150406, \&quot;OBJECTID\&quot;: 79, \&quot;Shape_Leng\&quot;: 0.0426249113144, \&quot;Shape_Area\&quot;: 0.000107893068218, \&quot;zone\&quot;: \&quot;East Village\&quot;, \&quot;LocationID\&quot;: 79, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98377990999991, 40.72153595399992], [-73.99260322199994, 40.72413644999987], [-73.98990295999991, 40.7344347899999], [-73.97802697999985, 40.729433059999984], [-73.98377990999991, 40.72153595399992]]]}}, {\&quot;id\&quot;: \&quot;79\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3536616044593324, \&quot;OBJECTID\&quot;: 80, \&quot;Shape_Leng\&quot;: 0.117212621448, \&quot;Shape_Area\&quot;: 0.00040732245622, \&quot;zone\&quot;: \&quot;East Williamsburg\&quot;, \&quot;LocationID\&quot;: 80, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93174841322003, 40.728053727696675], [-73.92849418540158, 40.72661460330786], [-73.92453854985803, 40.719342580204575], [-73.93220607307306, 40.71496398092936], [-73.93124067059496, 40.71372481088467], [-73.93328349320237, 40.71097870745788], [-73.9319010192085, 40.71133847142828], [-73.9303609456579, 40.7087177385352], [-73.93184868877432, 40.71256477418327], [-73.93042294313065, 40.71317255867104], [-73.93105231901723, 40.71461022392334], [-73.92460339476072, 40.717953306073376], [-73.92305500014334, 40.71634266479336], [-73.92488553507611, 40.71526718765259], [-73.92433589757124, 40.71412259346647], [-73.92074519699985, 40.71052968599989], [-73.93229708600003, 40.70774944699988], [-73.93480281900003, 40.713372495999884], [-73.94378799599994, 40.710900378999945], [-73.94273448399997, 40.70447330599988], [-73.9408928719998, 40.70391415699989], [-73.94042057899993, 40.701076597999865], [-73.94193078899983, 40.70072523399989], [-73.95023693799996, 40.705473245999876], [-73.95087492699996, 40.70951311499991], [-73.94865533499987, 40.70972498299988], [-73.94937231899985, 40.71406687799986], [-73.95348472199983, 40.71407020799988], [-73.93174841322003, 40.728053727696675]]]}}, {\&quot;id\&quot;: \&quot;80\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5878220140515222, \&quot;OBJECTID\&quot;: 81, \&quot;Shape_Leng\&quot;: 0.197592771731, \&quot;Shape_Area\&quot;: 0.00039956655019, \&quot;zone\&quot;: \&quot;Eastchester\&quot;, \&quot;LocationID\&quot;: 81, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8236684811033, 40.889903740147645], [-73.82285335053221, 40.8912068290476], [-73.79300652624502, 40.88335873744268], [-73.81209659199986, 40.88671500999993], [-73.82027432999985, 40.885550699999925], [-73.82387140599998, 40.88778362799996], [-73.84324113799987, 40.879108912999904], [-73.8381484219999, 40.876953298999915], [-73.83924788999988, 40.876618737999905], [-73.83829221499984, 40.87295133899995], [-73.83565766499987, 40.86751275599992], [-73.83315960399985, 40.86831975599994], [-73.82834347399992, 40.86089202599988], [-73.85363638799987, 40.87330059899996], [-73.8506895569999, 40.87548667799993], [-73.85254854099988, 40.877091586999924], [-73.85091896099982, 40.877893440999856], [-73.85248305800003, 40.87946370499989], [-73.84704957999995, 40.8876718159999], [-73.83554853999995, 40.88913350399993], [-73.83737956161106, 40.893924741304346], [-73.8236684811033, 40.889903740147645]]]}}, {\&quot;id\&quot;: \&quot;81\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.686123283669296, \&quot;OBJECTID\&quot;: 82, \&quot;Shape_Leng\&quot;: 0.119875649697, \&quot;Shape_Area\&quot;: 0.000323601079994, \&quot;zone\&quot;: \&quot;Elmhurst\&quot;, \&quot;LocationID\&quot;: 82, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86768504899995, 40.744071717999915], [-73.86447086199989, 40.73400727399998], [-73.88720524999994, 40.727792996999874], [-73.8885228599999, 40.734531159999904], [-73.87752195799992, 40.731593168999915], [-73.87708276299998, 40.73290931699991], [-73.88066188999987, 40.73570787399994], [-73.88033059399996, 40.73733367699989], [-73.88230252700001, 40.737707700999934], [-73.87743058400002, 40.73860051599991], [-73.88100387999987, 40.74184066199995], [-73.88551225099985, 40.74016501899988], [-73.887511321, 40.74108252699992], [-73.88798650799986, 40.743548191999935], [-73.89071647499993, 40.74312778399992], [-73.89175048799991, 40.7468117269999], [-73.86942458599987, 40.74915685199991], [-73.86768504899995, 40.744071717999915]]]}}, {\&quot;id\&quot;: \&quot;82\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6719811282385, \&quot;OBJECTID\&quot;: 83, \&quot;Shape_Leng\&quot;: 0.105984933269, \&quot;Shape_Area\&quot;: 0.000217463718718, \&quot;zone\&quot;: \&quot;Elmhurst/Maspeth\&quot;, \&quot;LocationID\&quot;: 83, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89111026199994, 40.745202717999874], [-73.89071647499993, 40.74312778399992], [-73.88798650799986, 40.743548191999935], [-73.887511321, 40.74108252699992], [-73.88551225099985, 40.74016501899988], [-73.88100387999987, 40.74184066199995], [-73.87791831799989, 40.739394956999874], [-73.88230252700001, 40.737707700999934], [-73.88033059399996, 40.73733367699989], [-73.88066188999987, 40.73570787399994], [-73.87725122499988, 40.7317941529999], [-73.88910318999984, 40.73459239599987], [-73.89854772799987, 40.735191909999855], [-73.90107970900003, 40.73391463399987], [-73.90516948899983, 40.73585964299986], [-73.90628903499987, 40.732400751999876], [-73.91068876399997, 40.733471081999916], [-73.90926002999988, 40.736403179999854], [-73.90057825399985, 40.73949289599988], [-73.89524819599988, 40.74381972999992], [-73.89624245599988, 40.74871954499987], [-73.89139145499985, 40.74664100399984], [-73.89111026199994, 40.745202717999874]]]}}, {\&quot;id\&quot;: \&quot;83\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3448275862068966, \&quot;OBJECTID\&quot;: 84, \&quot;Shape_Leng\&quot;: 0.233623987032, \&quot;Shape_Area\&quot;: 0.00207375572052, \&quot;zone\&quot;: \&quot;Eltingville/Annadale/Prince&apos;s Bay\&quot;, \&quot;LocationID\&quot;: 84, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.16005732699996, 40.527635041999886], [-74.1720632017547, 40.52332056936472], [-74.17756306042942, 40.519217618159864], [-74.18104081208887, 40.520705036287154], [-74.1848311647976, 40.519341358600826], [-74.19521339999068, 40.5099776529556], [-74.19967205357709, 40.511426850497486], [-74.19936127407836, 40.51301019443217], [-74.20821982874101, 40.51161821258057], [-74.21754755095681, 40.50336004949062], [-74.22153919955196, 40.50250347421612], [-74.22690993399992, 40.51917139799985], [-74.22379595899992, 40.518196345999876], [-74.21354593499994, 40.521235714999925], [-74.21409806799993, 40.52409719499991], [-74.20152661599995, 40.526265205999934], [-74.19174368799999, 40.53191669699986], [-74.19377169299999, 40.53583384699993], [-74.18903145199995, 40.53815934199989], [-74.18128532999992, 40.54695757299989], [-74.17185166499996, 40.56152092299991], [-74.16982582400001, 40.56109042099991], [-74.16540080799992, 40.54443272299989], [-74.15397419799994, 40.53426814799993], [-74.16134961699994, 40.5293734239999], [-74.16005732699996, 40.527635041999886]]]}}, {\&quot;id\&quot;: \&quot;84\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5650963597430407, \&quot;OBJECTID\&quot;: 85, \&quot;Shape_Leng\&quot;: 0.0574751473562, \&quot;Shape_Area\&quot;: 0.000143637804933, \&quot;zone\&quot;: \&quot;Erasmus\&quot;, \&quot;LocationID\&quot;: 85, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94715896299984, 40.65559378699993], [-73.94586879199989, 40.64342374399988], [-73.94778994699976, 40.643305735999924], [-73.94826499600005, 40.63860718999994], [-73.9536000469999, 40.63842234699991], [-73.95763644599988, 40.64268949899989], [-73.9587078989999, 40.65038727299989], [-73.94957113100006, 40.65080789999991], [-73.9500666489999, 40.65542299699989], [-73.94715896299984, 40.65559378699993]]]}}, {\&quot;id\&quot;: \&quot;85\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.36713286713286714, \&quot;OBJECTID\&quot;: 86, \&quot;Shape_Leng\&quot;: 0.134245282582, \&quot;Shape_Area\&quot;: 0.000623278815249, \&quot;zone\&quot;: \&quot;Far Rockaway\&quot;, \&quot;LocationID\&quot;: 86, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76669071688973, 40.61422662157113], [-73.76505961679173, 40.612035230610466], [-73.76023635756965, 40.610820864950284], [-73.76178242960594, 40.60915167005445], [-73.76155051905889, 40.60903136580077], [-73.75998446974822, 40.61087937784668], [-73.7556083701559, 40.61007791963748], [-73.7457615018933, 40.611991654374336], [-73.73815143112287, 40.60271044008338], [-73.73808925304178, 40.59768829704553], [-73.74183083531219, 40.59669555145679], [-73.73812220887619, 40.597386102069386], [-73.73763679389783, 40.594415399837956], [-73.74664920374843, 40.594280895008744], [-73.75352988157324, 40.59094648500059], [-73.76376223423699, 40.591439709016804], [-73.76440183099987, 40.59457168299989], [-73.76277845599988, 40.59475654399989], [-73.7633344969999, 40.59782287399992], [-73.76128753399995, 40.59954927099993], [-73.76654204999997, 40.599434441999904], [-73.76771811799993, 40.596261309999925], [-73.76795043655434, 40.5981585114185], [-73.77098168371995, 40.59889409104954], [-73.76895714023856, 40.60927991805636], [-73.77417180232338, 40.61182871527586], [-73.77339803484179, 40.61368296748421], [-73.76669071688973, 40.61422662157113]]]}}, {\&quot;id\&quot;: \&quot;86\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.26709180288918044, \&quot;OBJECTID\&quot;: 87, \&quot;Shape_Leng\&quot;: 0.0369015496117, \&quot;Shape_Area\&quot;: 6.72050210692e-05, \&quot;zone\&quot;: \&quot;Financial District North\&quot;, \&quot;LocationID\&quot;: 87, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00372234899996, 40.70693234399989], [-74.00197014837809, 40.704731159202304], [-74.00332307270776, 40.70562859522001], [-74.00459003883662, 40.70478775294495], [-74.00349632042315, 40.70379676926777], [-74.0053502722475, 40.70431007996148], [-74.004272587521, 40.70301566641148], [-74.00659591913875, 40.70368590245183], [-74.00530412596079, 40.70255986563306], [-74.00550166067457, 40.70243086779703], [-74.01250773999998, 40.706767065999934], [-74.00906264799988, 40.71088670399992], [-74.00372234899996, 40.70693234399989]]]}}, {\&quot;id\&quot;: \&quot;87\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.34389027615383766, \&quot;OBJECTID\&quot;: 88, \&quot;Shape_Leng\&quot;: 0.0352046035327, \&quot;Shape_Area\&quot;: 5.72999455414e-05, \&quot;zone\&quot;: \&quot;Financial District South\&quot;, \&quot;LocationID\&quot;: 88, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00974639299997, 40.704775247999905], [-74.00760498189766, 40.70299314132918], [-74.00930907655483, 40.70195460302249], [-74.00759136204225, 40.70132808104815], [-74.01367479307396, 40.70012582122537], [-74.01428922899998, 40.70454907499989], [-74.01250773999998, 40.706767065999934], [-74.00974639299997, 40.704775247999905]]]}}, {\&quot;id\&quot;: \&quot;88\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4829651815799326, \&quot;OBJECTID\&quot;: 89, \&quot;Shape_Leng\&quot;: 0.122794569553, \&quot;Shape_Area\&quot;: 0.000447548142373, \&quot;zone\&quot;: \&quot;Flatbush/Ditmas Park\&quot;, \&quot;LocationID\&quot;: 89, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95374853799996, 40.63858633799993], [-73.94537272499998, 40.638786954999865], [-73.94462885499995, 40.63183773499993], [-73.94647961799998, 40.631708161999896], [-73.94415535299993, 40.629508284999886], [-73.95995565099992, 40.627778671999884], [-73.96040734299989, 40.6301625309999], [-73.96232599399991, 40.6299687169999], [-73.97136622199992, 40.62892916199996], [-73.97092126300004, 40.62656998499993], [-73.97623453700001, 40.625976349999895], [-73.97716511999984, 40.63074665399988], [-73.96986869299992, 40.63419467499989], [-73.97029036199991, 40.63640634099988], [-73.96803868499985, 40.636650984999925], [-73.97139631700004, 40.64825778599986], [-73.96465438699984, 40.650887727999894], [-73.96621321999996, 40.653189404999885], [-73.95986103199981, 40.65563478899989], [-73.95763644599988, 40.64268949899989], [-73.95374853799996, 40.63858633799993]]]}}, {\&quot;id\&quot;: \&quot;89\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.31804628674740676, \&quot;OBJECTID\&quot;: 90, \&quot;Shape_Leng\&quot;: 0.0307591620819, \&quot;Shape_Area\&quot;: 5.53132476305e-05, \&quot;zone\&quot;: \&quot;Flatiron\&quot;, \&quot;LocationID\&quot;: 90, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9963368949999, 40.7380437469999], [-74.00252381499989, 40.73975264399995], [-73.99709902899994, 40.74720510199991], [-73.99141858599994, 40.74480268199988], [-73.9963368949999, 40.7380437469999]]]}}, {\&quot;id\&quot;: \&quot;90\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5238828967642527, \&quot;OBJECTID\&quot;: 91, \&quot;Shape_Leng\&quot;: 0.124996624585, \&quot;Shape_Area\&quot;: 0.000537330013243, \&quot;zone\&quot;: \&quot;Flatlands\&quot;, \&quot;LocationID\&quot;: 91, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91945472999996, 40.6401731369999], [-73.91690302699992, 40.61627422899993], [-73.9205269409999, 40.61394269499987], [-73.92640044599996, 40.61447853499988], [-73.92629604599998, 40.61311679899991], [-73.93686699599992, 40.620253280999904], [-73.94573691999982, 40.61536340699989], [-73.94651373199997, 40.61949401899995], [-73.94451833400001, 40.61971364699989], [-73.94732672199994, 40.629166566999835], [-73.94415535299993, 40.629508284999886], [-73.94647961799998, 40.631708161999896], [-73.93701746200003, 40.63231097899989], [-73.9372670019998, 40.634650624999885], [-73.92744822299987, 40.635258409999864], [-73.92538233099987, 40.64238453199987], [-73.92356525899983, 40.642499297999905], [-73.92332654599986, 40.63990021599991], [-73.91973736999988, 40.64277814799987], [-73.91945472999996, 40.6401731369999]]]}}, {\&quot;id\&quot;: \&quot;91\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6834246428187776, \&quot;OBJECTID\&quot;: 92, \&quot;Shape_Leng\&quot;: 0.117830066799, \&quot;Shape_Area\&quot;: 0.000374946617289, \&quot;zone\&quot;: \&quot;Flushing\&quot;, \&quot;LocationID\&quot;: 92, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82656578899986, 40.77064147599989], [-73.82466908999987, 40.77040760799985], [-73.82080684899987, 40.7589417829999], [-73.81789245699991, 40.75708633799991], [-73.82030067699999, 40.75551497999992], [-73.8184078289999, 40.75383042199998], [-73.820849288, 40.75224154499988], [-73.81575069499985, 40.7469794799999], [-73.82108427599998, 40.748558445999954], [-73.82426493900002, 40.75183288899994], [-73.82584440999999, 40.74934839099993], [-73.83300302099987, 40.74783363099988], [-73.8322953569999, 40.751941790999844], [-73.83560230899995, 40.75139485299991], [-73.83805974199996, 40.75466660699988], [-73.83689970199995, 40.7626981179999], [-73.8394581342306, 40.76544576822929], [-73.83000011099983, 40.77373240699996], [-73.82513740299993, 40.78169970599994], [-73.82224127699999, 40.781693878999924], [-73.82583089999997, 40.77591527099986], [-73.82656578899986, 40.77064147599989]]]}}, {\&quot;id\&quot;: \&quot;92\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3998149992884588, \&quot;OBJECTID\&quot;: 93, \&quot;Shape_Leng\&quot;: 0.170998027597, \&quot;Shape_Area\&quot;: 0.000594278183978, \&quot;zone\&quot;: \&quot;Flushing Meadows-Corona Park\&quot;, \&quot;LocationID\&quot;: 93, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8569635593979, 40.76407442786308], [-73.8566748236235, 40.763930188326135], [-73.85758285470693, 40.76307290062661], [-73.8565867538878, 40.762722840114236], [-73.85817631070509, 40.7623962942238], [-73.85661195813331, 40.761649542759294], [-73.8585852628444, 40.76191700859695], [-73.85747662435531, 40.76130891668733], [-73.85158552901191, 40.75935542065696], [-73.84930110814332, 40.76024287534997], [-73.85207200177854, 40.7603928846721], [-73.84670933714987, 40.76134526931977], [-73.84324381399976, 40.75533680399995], [-73.83867321899987, 40.75701997899995], [-73.83560230899995, 40.75139485299991], [-73.8322953569999, 40.751941790999844], [-73.83300302099987, 40.74783363099988], [-73.83699037399995, 40.74209330099992], [-73.8361277859999, 40.734241311999924], [-73.83073214599987, 40.72654932799991], [-73.8273090039999, 40.72464607699988], [-73.82531644999993, 40.71727569999994], [-73.81729568999994, 40.71757964499995], [-73.83145866999996, 40.714554448999934], [-73.8297961659998, 40.71556571899986], [-73.83488359399998, 40.719303271999934], [-73.85436928099995, 40.748738929999874], [-73.85086439699992, 40.74999564199986], [-73.85379813799992, 40.757177611999914], [-73.86109724399991, 40.76366447799989], [-73.85861915281858, 40.7619355969989], [-73.8569635593979, 40.76407442786308]]]}}, {\&quot;id\&quot;: \&quot;93\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6886102403343782, \&quot;OBJECTID\&quot;: 94, \&quot;Shape_Leng\&quot;: 0.0498326083147, \&quot;Shape_Area\&quot;: 6.25819407393e-05, \&quot;zone\&quot;: \&quot;Fordham South\&quot;, \&quot;LocationID\&quot;: 94, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89964261700001, 40.862210436999874], [-73.897143798, 40.86244506499991], [-73.89883814599983, 40.859307307999906], [-73.89573924699978, 40.85813820699986], [-73.89106059999996, 40.861471814999945], [-73.89560883299981, 40.85457036999986], [-73.89863543699985, 40.85390697499993], [-73.89816577499982, 40.85514637599989], [-73.90077922699986, 40.85604710999993], [-73.90185996099993, 40.85458614899994], [-73.90557007299988, 40.855787321999884], [-73.90351390599986, 40.86091750999989], [-73.89964261700001, 40.862210436999874]]]}}, {\&quot;id\&quot;: \&quot;94\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5287348080163482, \&quot;OBJECTID\&quot;: 95, \&quot;Shape_Leng\&quot;: 0.113629605476, \&quot;Shape_Area\&quot;: 0.00057277033803, \&quot;zone\&quot;: \&quot;Forest Hills\&quot;, \&quot;LocationID\&quot;: 95, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84732494199989, 40.738771457999896], [-73.83488359399998, 40.719303271999934], [-73.8297961659998, 40.71556571899986], [-73.8377089419999, 40.71103648399989], [-73.85593991699984, 40.7063980339999], [-73.8586809759999, 40.72261243999988], [-73.86203833799982, 40.72595678499994], [-73.85805416899993, 40.72444540599986], [-73.85727108100001, 40.72568129799988], [-73.8594198799999, 40.726464837999885], [-73.85741240699991, 40.72832247999986], [-73.85851097899999, 40.73028680199993], [-73.85625665099991, 40.73095912299993], [-73.85872465799989, 40.73570864399988], [-73.84732494199989, 40.738771457999896]]]}}, {\&quot;id\&quot;: \&quot;95\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5415929203539823, \&quot;OBJECTID\&quot;: 96, \&quot;Shape_Leng\&quot;: 0.185180248095, \&quot;Shape_Area\&quot;: 0.000547566253402, \&quot;zone\&quot;: \&quot;Forest Park/Highland Park\&quot;, \&quot;LocationID\&quot;: 96, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83804164799996, 40.70832329499994], [-73.83696237799982, 40.70421245199992], [-73.84502472899999, 40.6993593769999], [-73.84913837299978, 40.69828274099995], [-73.85070842300001, 40.70020312499988], [-73.85443455699989, 40.70060295199994], [-73.85277238699999, 40.69755711199987], [-73.874020533, 40.69419129499994], [-73.88962787599998, 40.684236453999894], [-73.89252316899987, 40.683424532999865], [-73.89417463299992, 40.6852832479999], [-73.89646625099995, 40.68233642199988], [-73.90116155099986, 40.687877934999946], [-73.90180467199995, 40.6907662979999], [-73.9003866789998, 40.69313995999992], [-73.89736265799978, 40.6941108469999], [-73.89695653499987, 40.6919492069999], [-73.89326209899984, 40.69220094699994], [-73.8950769439999, 40.694591389999886], [-73.88642048199995, 40.696458148999945], [-73.88771297999986, 40.699678075999906], [-73.88280948499987, 40.7006834549999], [-73.88182690599986, 40.69952929899987], [-73.87639785199997, 40.70229404199989], [-73.86285374199994, 40.7034144919999], [-73.85819890699996, 40.70291107399986], [-73.85893224399979, 40.70132034499989], [-73.85725351500002, 40.70121217699989], [-73.85252019099998, 40.70229172399997], [-73.85473240499985, 40.70676414299989], [-73.84314625299982, 40.70922345599992], [-73.83804164799996, 40.70832329499994]]]}}, {\&quot;id\&quot;: \&quot;96\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.42130950930278793, \&quot;OBJECTID\&quot;: 97, \&quot;Shape_Leng\&quot;: 0.0624760147423, \&quot;Shape_Area\&quot;: 0.000163303970435, \&quot;zone\&quot;: \&quot;Fort Greene\&quot;, \&quot;LocationID\&quot;: 97, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9693409769999, 40.69576842999993], [-73.96910362499993, 40.68946752199986], [-73.97013154199992, 40.68950630799986], [-73.96868961400001, 40.68200525799988], [-73.97745722099988, 40.68405228699988], [-73.98092822899991, 40.68890247699988], [-73.98372011099993, 40.69000671899992], [-73.98147568199991, 40.689930943999876], [-73.98251122999989, 40.69361433399992], [-73.97916718399999, 40.69348832299992], [-73.98054419199988, 40.69824651199988], [-73.9697278989999, 40.69780401399986], [-73.9693409769999, 40.69576842999993]]]}}, {\&quot;id\&quot;: \&quot;97\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5862573099415205, \&quot;OBJECTID\&quot;: 98, \&quot;Shape_Leng\&quot;: 0.121661018278, \&quot;Shape_Area\&quot;: 0.000485773020954, \&quot;zone\&quot;: \&quot;Fresh Meadows\&quot;, \&quot;LocationID\&quot;: 98, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76360860199983, 40.73917476499987], [-73.76273303499985, 40.73526216299995], [-73.76510920699994, 40.73455658499992], [-73.7636997919999, 40.73286411699993], [-73.76564374500005, 40.732533126999954], [-73.75669771299987, 40.7262287109999], [-73.76924074899993, 40.72590270099988], [-73.77727808000003, 40.72234633599988], [-73.77803765999981, 40.723284268999855], [-73.7752338719998, 40.725237532999884], [-73.77757506899988, 40.73019327299987], [-73.79174472699992, 40.725788849999944], [-73.79651029099988, 40.7379086369999], [-73.76772991399994, 40.74577622599993], [-73.76360860199983, 40.73917476499987]]]}}, {\&quot;id\&quot;: \&quot;98\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4375, \&quot;OBJECTID\&quot;: 99, \&quot;Shape_Leng\&quot;: 0.1833714893, \&quot;Shape_Area\&quot;: 0.00121016463877, \&quot;zone\&quot;: \&quot;Freshkills Park\&quot;, \&quot;LocationID\&quot;: 99, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.16842916199994, 40.58649792299988], [-74.16982582400001, 40.56109042099991], [-74.18295815999996, 40.56548019999992], [-74.193410946, 40.56248503899994], [-74.20091501299991, 40.55600525999987], [-74.20699885299997, 40.55756748899989], [-74.2056960519999, 40.55851600599987], [-74.21324031454323, 40.55667262386906], [-74.20596154297344, 40.580046993882775], [-74.20048848799996, 40.57994977799989], [-74.19964981299998, 40.58226262599991], [-74.19423261299991, 40.58514680599988], [-74.185371048, 40.58745101499987], [-74.18730248699987, 40.588488221999896], [-74.17488959399996, 40.602216572999914], [-74.16719634899995, 40.602075311999926], [-74.16886362299992, 40.59472808699995], [-74.16350785499993, 40.59327217999993], [-74.16842916199994, 40.58649792299988]]]}}, {\&quot;id\&quot;: \&quot;99\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4536520705731785, \&quot;OBJECTID\&quot;: 100, \&quot;Shape_Leng\&quot;: 0.0248131090342, \&quot;Shape_Area\&quot;: 3.74700210291e-05, \&quot;zone\&quot;: \&quot;Garment District\&quot;, \&quot;LocationID\&quot;: 100, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98729377099981, 40.75045160899988], [-73.99346417699986, 40.75219005499987], [-73.98979085399996, 40.7572331319999], [-73.98411754799999, 40.75484205299995], [-73.98729377099981, 40.75045160899988]]]}}, {\&quot;id\&quot;: \&quot;100\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5330188679245284, \&quot;OBJECTID\&quot;: 101, \&quot;Shape_Leng\&quot;: 0.101709836277, \&quot;Shape_Area\&quot;: 0.000452342528877, \&quot;zone\&quot;: \&quot;Glen Oaks\&quot;, \&quot;LocationID\&quot;: 101, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.70134715908382, 40.750780580935846], [-73.70002020501624, 40.73923654186594], [-73.70766217302989, 40.727830934754685], [-73.71049995381028, 40.72722708720663], [-73.71147804899985, 40.73250140099988], [-73.72010148299994, 40.74977568599991], [-73.727664654, 40.749654641999946], [-73.728962516, 40.74763288799986], [-73.72737889099987, 40.751029566999854], [-73.7206331939999, 40.75761683499996], [-73.71612528199985, 40.75966071399991], [-73.71244940715339, 40.75924170410932], [-73.70163345846068, 40.75249332984642], [-73.70134715908382, 40.750780580935846]]]}}, {\&quot;id\&quot;: \&quot;101\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.589425587467363, \&quot;OBJECTID\&quot;: 102, \&quot;Shape_Leng\&quot;: 0.136900484646, \&quot;Shape_Area\&quot;: 0.000296595466345, \&quot;zone\&quot;: \&quot;Glendale\&quot;, \&quot;LocationID\&quot;: 102, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85595536199988, 40.70642977899992], [-73.85473240499985, 40.70676414299989], [-73.85252019099998, 40.70229172399997], [-73.85827405799986, 40.70122365899992], [-73.85819890699996, 40.70291107399986], [-73.86285374199994, 40.7034144919999], [-73.87639785199997, 40.70229404199989], [-73.88182690599986, 40.69952929899987], [-73.88280948499988, 40.70068345599986], [-73.88771297999986, 40.699678075999906], [-73.88642048199995, 40.696458148999945], [-73.8950769439999, 40.694591389999886], [-73.89326209899984, 40.69220094699994], [-73.89695653499987, 40.6919492069999], [-73.89736265799978, 40.6941108469999], [-73.900030392, 40.693437450999895], [-73.88911917799989, 40.705598876999915], [-73.86911007199988, 40.707089336999914], [-73.87016462499984, 40.70920774299987], [-73.85965416799995, 40.713379960999866], [-73.85975932900001, 40.711845058999856], [-73.85729287299985, 40.711467676999874], [-73.85595536199988, 40.70642977899992]]]}}, {\&quot;id\&quot;: \&quot;102\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40350877192982454, \&quot;OBJECTID\&quot;: 103, \&quot;Shape_Leng\&quot;: 0.0143055167343, \&quot;Shape_Area\&quot;: 6.33056361314e-06, \&quot;zone\&quot;: \&quot;Governor&apos;s Island/Ellis Island/Liberty Island\&quot;, \&quot;LocationID\&quot;: 103, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.04388559600675, 40.690184824096946], [-74.04350596056258, 40.689687359818144], [-74.04270428413375, 40.69015520482211], [-74.04255372018648, 40.68996275914475], [-74.04438521705613, 40.68851617820147], [-74.04772962698515, 40.689915318233105], [-74.04614707204328, 40.69112264601653], [-74.04388559600675, 40.690184824096946]]]}}, {\&quot;id\&quot;: \&quot;103\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40350877192982454, \&quot;OBJECTID\&quot;: 104, \&quot;Shape_Leng\&quot;: 0.0212208330928, \&quot;Shape_Area\&quot;: 1.19205339715e-05, \&quot;zone\&quot;: \&quot;Governor&apos;s Island/Ellis Island/Liberty Island\&quot;, \&quot;LocationID\&quot;: 103, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.03995040794246, 40.70089063032128], [-74.03771124798313, 40.69934404017382], [-74.03934037685066, 40.698115514418], [-74.04124261816106, 40.69953674121738], [-74.0399124888631, 40.69770204019913], [-74.0416605190741, 40.696452971319864], [-74.04367371215382, 40.69802040416498], [-74.03995040794246, 40.70089063032128]]]}}, {\&quot;id\&quot;: \&quot;104\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40350877192982454, \&quot;OBJECTID\&quot;: 105, \&quot;Shape_Leng\&quot;: 0.0774253398314, \&quot;Shape_Area\&quot;: 0.000368636392805, \&quot;zone\&quot;: \&quot;Governor&apos;s Island/Ellis Island/Liberty Island\&quot;, \&quot;LocationID\&quot;: 103, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01674756096064, 40.693343368217555], [-74.0118118564723, 40.69247933506435], [-74.01333264149613, 40.69201997010238], [-74.01182575354963, 40.69106481621614], [-74.01316926402752, 40.6881547712032], [-74.02259359581036, 40.68435969594992], [-74.02213250186877, 40.683767672385194], [-74.02305574749599, 40.6829169454452], [-74.0227589902996, 40.68428444833225], [-74.026334042424, 40.6848016977242], [-74.01971454942077, 40.69313300682718], [-74.01674756096064, 40.693343368217555]]]}}, {\&quot;id\&quot;: \&quot;105\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.37945110300503737, \&quot;OBJECTID\&quot;: 106, \&quot;Shape_Leng\&quot;: 0.0492110119798, \&quot;Shape_Area\&quot;: 0.000113616826567, \&quot;zone\&quot;: \&quot;Gowanus\&quot;, \&quot;LocationID\&quot;: 106, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98610388199985, 40.68100852199994], [-73.98175642299985, 40.67931462399987], [-73.99277080699981, 40.665507280999876], [-73.9986188799999, 40.67183017199989], [-73.99506451099984, 40.67584047499984], [-73.99069861899994, 40.67580741899994], [-73.9876680399999, 40.68081780999993], [-73.98610388199985, 40.68100852199994]]]}}, {\&quot;id\&quot;: \&quot;106\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.30370004366390546, \&quot;OBJECTID\&quot;: 107, \&quot;Shape_Leng\&quot;: 0.0380413645908, \&quot;Shape_Area\&quot;: 7.46112192675e-05, \&quot;zone\&quot;: \&quot;Gramercy\&quot;, \&quot;LocationID\&quot;: 107, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98238628799993, 40.73141124499993], [-73.98990295999991, 40.7344347899999], [-73.98407485299995, 40.74332471799989], [-73.98085965399994, 40.74196976799989], [-73.98266497499989, 40.73949733299987], [-73.97805226499996, 40.7375539539999], [-73.98238628799993, 40.73141124499993]]]}}, {\&quot;id\&quot;: \&quot;107\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5326633165829145, \&quot;OBJECTID\&quot;: 108, \&quot;Shape_Leng\&quot;: 0.11117141227, \&quot;Shape_Area\&quot;: 0.000352866009465, \&quot;zone\&quot;: \&quot;Gravesend\&quot;, \&quot;LocationID\&quot;: 108, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97148350899987, 40.59717158499996], [-73.97115101799994, 40.59044244399989], [-73.96514385199995, 40.5911019159999], [-73.96661531499983, 40.58457103699992], [-73.97742525299988, 40.58290659299994], [-73.98710120299997, 40.58464459199988], [-73.98654457099988, 40.583658590999946], [-73.98829948299982, 40.58346674699986], [-73.98995504960881, 40.58066166976562], [-73.99185535656628, 40.5816239785461], [-73.99026244714351, 40.5846191482053], [-73.99547188560318, 40.58221005511802], [-74.0003088081067, 40.58317703751469], [-73.99808523776004, 40.585364721581485], [-73.99956511570304, 40.5862439200957], [-73.9940790462178, 40.58869344199059], [-74.00038207107852, 40.58713305717468], [-73.98962150099992, 40.59098199299996], [-73.98601936799993, 40.594446048999906], [-73.97995443499985, 40.594073811999884], [-73.98035785499995, 40.59619154099992], [-73.97148350899987, 40.59717158499996]]]}}, {\&quot;id\&quot;: \&quot;108\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.45, \&quot;OBJECTID\&quot;: 109, \&quot;Shape_Leng\&quot;: 0.178267819599, \&quot;Shape_Area\&quot;: 0.00116960076185, \&quot;zone\&quot;: \&quot;Great Kills\&quot;, \&quot;LocationID\&quot;: 109, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.14706472699994, 40.5705086149999], [-74.13170009, 40.56453574899991], [-74.13885092699991, 40.5569511789999], [-74.13316825999992, 40.552356178999936], [-74.13861798499994, 40.548492384999875], [-74.13585712583111, 40.546451696357344], [-74.1371798712987, 40.5457928646606], [-74.13611540724054, 40.54501984567978], [-74.13794966050746, 40.54600033758068], [-74.13886951340419, 40.545130197607286], [-74.13762430745145, 40.54425356641828], [-74.13875534703455, 40.544933958426874], [-74.13786798524545, 40.54405254413092], [-74.13903307178627, 40.54470491029999], [-74.13953937915736, 40.54429514087214], [-74.13834151288823, 40.543551828814046], [-74.14038573073617, 40.54403318500786], [-74.13921993485874, 40.54316608513788], [-74.14141073560397, 40.543022415080344], [-74.14026290400692, 40.54196151152258], [-74.14134901379589, 40.54257752313157], [-74.14179719957052, 40.54220041538235], [-74.14063984172124, 40.54169454203723], [-74.14095816832888, 40.54143207796496], [-74.14229632246158, 40.54225784915546], [-74.14104157916547, 40.53734688546733], [-74.14374951249268, 40.53719106134627], [-74.15970134520207, 40.52729599283152], [-74.16134961699994, 40.5293734239999], [-74.15397419799994, 40.53426814799993], [-74.16540080799992, 40.54443272299989], [-74.16982582400001, 40.56109042099991], [-74.1649414939999, 40.56011179699991], [-74.15725974199995, 40.562553318999896], [-74.14706472699994, 40.5705086149999]]]}}, {\&quot;id\&quot;: \&quot;109\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5, \&quot;OBJECTID\&quot;: 110, \&quot;Shape_Leng\&quot;: 0.103946292913, \&quot;Shape_Area\&quot;: 0.000525745098785, \&quot;zone\&quot;: \&quot;Great Kills Park\&quot;, \&quot;LocationID\&quot;: 110, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.11813477599993, 40.550592692999906], [-74.11338340608127, 40.54807337507532], [-74.12245306050386, 40.544770545629824], [-74.1335644349803, 40.5315111748056], [-74.1369079907634, 40.529281918882695], [-74.13883030715276, 40.529889356352996], [-74.14032475393472, 40.5352845797219], [-74.13381005153853, 40.53564293988989], [-74.12738789634466, 40.54229542996431], [-74.13011404715266, 40.54597572663567], [-74.13585712583111, 40.546451696357344], [-74.13861798499991, 40.548492383999886], [-74.12730057799996, 40.55729517199993], [-74.11813477599993, 40.550592692999906]]]}}, {\&quot;id\&quot;: \&quot;110\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5247524752475248, \&quot;OBJECTID\&quot;: 111, \&quot;Shape_Leng\&quot;: 0.0599308800658, \&quot;Shape_Area\&quot;: 0.000208683276503, \&quot;zone\&quot;: \&quot;Green-Wood Cemetery\&quot;, \&quot;LocationID\&quot;: 111, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99516890099986, 40.6596695219999], [-73.990188415, 40.657600817999906], [-73.98843135299977, 40.65925121199996], [-73.98179568699996, 40.65524609699991], [-73.98029115499993, 40.647297160999855], [-73.98905872499985, 40.64411924099995], [-74.00214474599989, 40.65295610699996], [-73.99516890099986, 40.6596695219999]]]}}, {\&quot;id\&quot;: \&quot;111\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3601569720753345, \&quot;OBJECTID\&quot;: 112, \&quot;Shape_Leng\&quot;: 0.107267875765, \&quot;Shape_Area\&quot;: 0.000462068671429, \&quot;zone\&quot;: \&quot;Greenpoint\&quot;, \&quot;LocationID\&quot;: 112, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.95439555417066, 40.73911477252253], [-73.94652352854791, 40.73692685395814], [-73.94719983367108, 40.73535517811412], [-73.94706532915383, 40.734401992819265], [-73.94557048457217, 40.736612303910405], [-73.94239443542429, 40.73542574994758], [-73.9381033496066, 40.729728519521366], [-73.93226852175046, 40.72817465801565], [-73.94841638599995, 40.71845553299995], [-73.94907816799986, 40.72254028699993], [-73.95477662900004, 40.72245950499994], [-73.95842611843923, 40.725400535832165], [-73.9616151883593, 40.725865563073995], [-73.96143187677845, 40.730965171647846], [-73.96226340423281, 40.732915551623485], [-73.96406507049178, 40.732779040653625], [-73.95837507902779, 40.73809694936863], [-73.95439555417066, 40.73911477252253]]], [[[-73.96236596889429, 40.72420906161418], [-73.96200744849497, 40.7239919013038], [-73.96207271921921, 40.72388030020147], [-73.96246790011047, 40.72413157960129], [-73.96236596889429, 40.72420906161418]]]]}}, {\&quot;id\&quot;: \&quot;112\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.32631335051620414, \&quot;OBJECTID\&quot;: 113, \&quot;Shape_Leng\&quot;: 0.032745350566, \&quot;Shape_Area\&quot;: 5.79634566998e-05, \&quot;zone\&quot;: \&quot;Greenwich Village North\&quot;, \&quot;LocationID\&quot;: 113, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99136388099988, 40.72755978299991], [-73.99657214499979, 40.729552233999904], [-73.99556245499996, 40.73071521599994], [-74.000066577, 40.7329292359999], [-73.99683993899998, 40.73736088899995], [-73.98990295999991, 40.7344347899999], [-73.99136388099988, 40.72755978299991]]]}}, {\&quot;id\&quot;: \&quot;113\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.32410967670135216, \&quot;OBJECTID\&quot;: 114, \&quot;Shape_Leng\&quot;: 0.0317270347711, \&quot;Shape_Area\&quot;: 4.70207704945e-05, \&quot;zone\&quot;: \&quot;Greenwich Village South\&quot;, \&quot;LocationID\&quot;: 114, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99257987399992, 40.724201554999915], [-74.00281726599992, 40.72836312899993], [-74.000066577, 40.7329292359999], [-73.99154832699986, 40.72708947099994], [-73.99257987399992, 40.724201554999915]]]}}, {\&quot;id\&quot;: \&quot;114\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.45588235294117646, \&quot;OBJECTID\&quot;: 115, \&quot;Shape_Leng\&quot;: 0.116169413964, \&quot;Shape_Area\&quot;: 0.000373168991958, \&quot;zone\&quot;: \&quot;Grymes Hill/Clifton\&quot;, \&quot;LocationID\&quot;: 115, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08069514799999, 40.62753689699988], [-74.08326107499997, 40.627194742999954], [-74.08496211899991, 40.624625232999925], [-74.08785147699994, 40.615243072999924], [-74.08720982799997, 40.61330697399994], [-74.07253551699989, 40.622464021999896], [-74.071134623, 40.62035994799992], [-74.0815547009999, 40.60629029699987], [-74.0977696879999, 40.61062359299988], [-74.10350925299994, 40.61641607499991], [-74.0922397139999, 40.62574291499989], [-74.08574928999992, 40.633955556999865], [-74.07972492199995, 40.62895068799986], [-74.08069514799999, 40.62753689699988]]]}}, {\&quot;id\&quot;: \&quot;115\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.45451658273218093, \&quot;OBJECTID\&quot;: 116, \&quot;Shape_Leng\&quot;: 0.0681164844265, \&quot;Shape_Area\&quot;: 0.000260415337217, \&quot;zone\&quot;: \&quot;Hamilton Heights\&quot;, \&quot;LocationID\&quot;: 116, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93924885699987, 40.82829635099989], [-73.94515456999994, 40.82087626499993], [-73.94808289799983, 40.82210802199994], [-73.95082880000002, 40.820827936999876], [-73.95954472552476, 40.82364494182928], [-73.95015521048293, 40.83439675940791], [-73.93864026699997, 40.82973887399988], [-73.93924885699987, 40.82829635099989]]]}}, {\&quot;id\&quot;: \&quot;116\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3061630218687873, \&quot;OBJECTID\&quot;: 117, \&quot;Shape_Leng\&quot;: 0.169885857987, \&quot;Shape_Area\&quot;: 0.00090429427072, \&quot;zone\&quot;: \&quot;Hammels/Arverne\&quot;, \&quot;LocationID\&quot;: 117, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7763584369479, 40.609655838242304], [-73.77412897394224, 40.60874659586809], [-73.77460294599074, 40.607417648882524], [-73.77484886546486, 40.60802483315967], [-73.77523851986173, 40.60855094300021], [-73.77600772152827, 40.60919075424813], [-73.77469363854065, 40.60430696481727], [-73.7818572569845, 40.59837293018506], [-73.78005493695551, 40.596861344908895], [-73.7749751364952, 40.60174817941184], [-73.77363244061033, 40.598153123466695], [-73.76809925802587, 40.59784597005487], [-73.76771811799993, 40.596261309999925], [-73.76654204999997, 40.599434441999904], [-73.76165797299986, 40.599973069999876], [-73.7633344969999, 40.59782287399992], [-73.76277845599988, 40.59475654399989], [-73.76440183099987, 40.59457168299989], [-73.76376223423699, 40.591439709016804], [-73.81730795916116, 40.58233475897], [-73.81544517899997, 40.58337349199993], [-73.81909407399996, 40.58783196099988], [-73.8176380045051, 40.58928579948519], [-73.81170344836342, 40.59159374663789], [-73.81149423585859, 40.592901326696776], [-73.81132554567534, 40.59174649614576], [-73.81081791874632, 40.59209026869603], [-73.81138593152033, 40.592442318454566], [-73.81140751227157, 40.592871257238706], [-73.81107287021051, 40.593022330572076], [-73.80991130015991, 40.59225371768247], [-73.80959170493088, 40.593580688618054], [-73.80577902839048, 40.59075949966858], [-73.8058134261234, 40.59186886150206], [-73.80430333508215, 40.59131887880457], [-73.8079775709933, 40.59415786866439], [-73.80604149807385, 40.595554555213546], [-73.8024384629031, 40.59264006383509], [-73.80234513845657, 40.59449597525689], [-73.80344017041448, 40.59443420917679], [-73.80321494251235, 40.59514564845063], [-73.80389507006726, 40.594990875367245], [-73.80331453729063, 40.59517956193947], [-73.80368468695728, 40.59519779018381], [-73.80486462646938, 40.5967336283515], [-73.80513406252756, 40.59660758897049], [-73.80524832538248, 40.596895032613546], [-73.80297943325748, 40.598844304553005], [-73.79233256449508, 40.59995439142583], [-73.78635332811808, 40.60319465903842], [-73.79034006550985, 40.59919167636005], [-73.79102536652763, 40.595527157215926], [-73.78973901889819, 40.59474366855456], [-73.7890682912148, 40.598019927382616], [-73.78350560905308, 40.60256343874268], [-73.78366696292244, 40.60532443693426], [-73.77927015444938, 40.60930736180752], [-73.7763584369479, 40.609655838242304]]]}}, {\&quot;id\&quot;: \&quot;117\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.47244094488188976, \&quot;OBJECTID\&quot;: 118, \&quot;Shape_Leng\&quot;: 0.243966217692, \&quot;Shape_Area\&quot;: 0.00182693922711, \&quot;zone\&quot;: \&quot;Heartland Village/Todt Hill\&quot;, \&quot;LocationID\&quot;: 118, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.10834417899996, 40.610234766999945], [-74.09555829799993, 40.61062477799989], [-74.09045495899996, 40.60909452599991], [-74.09271908099993, 40.60636222199992], [-74.09192827899989, 40.598504050999914], [-74.10041498999992, 40.59334309299988], [-74.10149482299994, 40.58934426099992], [-74.10790851599995, 40.58368563799992], [-74.1212571389999, 40.575254893999904], [-74.12708814699995, 40.57636910599994], [-74.13261022999991, 40.573530162999894], [-74.14418588199999, 40.57203740999988], [-74.14438744999991, 40.56970610099991], [-74.14789716899996, 40.57088728599995], [-74.15725974199995, 40.562553318999896], [-74.1649414939999, 40.56011179699991], [-74.16982582400001, 40.56109042099991], [-74.16842916199994, 40.58649792299988], [-74.16189940599996, 40.59529877099993], [-74.1481980769999, 40.588599680999934], [-74.13864458599996, 40.58906080499989], [-74.13091909399999, 40.598855047999905], [-74.12506115499997, 40.59818005599987], [-74.12059546299996, 40.601809757999874], [-74.11487058399989, 40.602136659999935], [-74.11742466500002, 40.609289008999916], [-74.12135179599994, 40.609765267999926], [-74.11508745399988, 40.61120943099993], [-74.10834417899996, 40.610234766999945]]]}}, {\&quot;id\&quot;: \&quot;118\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6160034790171777, \&quot;OBJECTID\&quot;: 119, \&quot;Shape_Leng\&quot;: 0.0835070355744, \&quot;Shape_Area\&quot;: 0.000185779447534, \&quot;zone\&quot;: \&quot;Highbridge\&quot;, \&quot;LocationID\&quot;: 119, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9247831879999, 40.84475266499989], [-73.91729224999992, 40.84510993999991], [-73.91794965199988, 40.842229570999976], [-73.91618344399991, 40.84233489999991], [-73.92802724899998, 40.82971953899987], [-73.93307251084072, 40.828156152518105], [-73.93314306709256, 40.83519412761651], [-73.92861574822331, 40.844676865029925], [-73.9247831879999, 40.84475266499989]]]}}, {\&quot;id\&quot;: \&quot;119\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5056526207605344, \&quot;OBJECTID\&quot;: 120, \&quot;Shape_Leng\&quot;: 0.0832612702158, \&quot;Shape_Area\&quot;: 9.31462821313e-05, \&quot;zone\&quot;: \&quot;Highbridge Park\&quot;, \&quot;LocationID\&quot;: 120, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92295449499989, 40.85885076199988], [-73.92227873064479, 40.85565498884376], [-73.93436121591056, 40.83620061961779], [-73.94034643299983, 40.8304578419999], [-73.93505508799984, 40.8393332359999], [-73.93556697199989, 40.841712527999924], [-73.92707982300001, 40.851432342999885], [-73.92466977999999, 40.856982610999886], [-73.92709951599986, 40.85827552099992], [-73.92499818399988, 40.86146373799991], [-73.92295449499989, 40.85885076199988]]]}}, {\&quot;id\&quot;: \&quot;120\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5180572851805728, \&quot;OBJECTID\&quot;: 121, \&quot;Shape_Leng\&quot;: 0.0969153373445, \&quot;Shape_Area\&quot;: 0.000384563286473, \&quot;zone\&quot;: \&quot;Hillcrest/Pomonok\&quot;, \&quot;LocationID\&quot;: 121, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79911195699995, 40.738206139999875], [-73.79584803299987, 40.7380746799999], [-73.79037661699995, 40.720103723999934], [-73.80780927699995, 40.715853895999906], [-73.80904032699983, 40.71991160499987], [-73.80452680199981, 40.721462545999884], [-73.80487958299983, 40.725049592999895], [-73.80652142399995, 40.7248730639999], [-73.80717042299993, 40.72826913299987], [-73.8111179729999, 40.72781641599994], [-73.81074426599986, 40.72626511299991], [-73.81510024099985, 40.72854342299991], [-73.81504998799986, 40.73894313399992], [-73.79911195699995, 40.738206139999875]]]}}, {\&quot;id\&quot;: \&quot;121\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4117032392894462, \&quot;OBJECTID\&quot;: 122, \&quot;Shape_Leng\&quot;: 0.0665318439446, \&quot;Shape_Area\&quot;: 0.000226597104976, \&quot;zone\&quot;: \&quot;Hollis\&quot;, \&quot;LocationID\&quot;: 122, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.75725671499985, 40.71813860199992], [-73.75047058199985, 40.70563993099994], [-73.76612489399999, 40.702334485999884], [-73.76825969099993, 40.709526367999956], [-73.771724447, 40.71031681899991], [-73.76943987099992, 40.711976892999864], [-73.77192122100001, 40.71568504499992], [-73.76664095199988, 40.717646613999875], [-73.765714472, 40.71639337899988], [-73.75832728699997, 40.71958208899985], [-73.75725671499985, 40.71813860199992]]]}}, {\&quot;id\&quot;: \&quot;122\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5869218500797448, \&quot;OBJECTID\&quot;: 123, \&quot;Shape_Leng\&quot;: 0.0834211389387, \&quot;Shape_Area\&quot;: 0.000296445173366, \&quot;zone\&quot;: \&quot;Homecrest\&quot;, \&quot;LocationID\&quot;: 123, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96285973999984, 40.61254948599989], [-73.96237947799978, 40.609986373999966], [-73.95859278499987, 40.61040303099988], [-73.95619313699986, 40.58776226899994], [-73.9603495359999, 40.58730628599994], [-73.9606798409999, 40.59159758199995], [-73.97115101799994, 40.59044244399989], [-73.97299433999983, 40.6088141419999], [-73.96429649899991, 40.60977642599992], [-73.96478112799986, 40.61233092199988], [-73.96285973999984, 40.61254948599989]]]}}, {\&quot;id\&quot;: \&quot;123\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4218880534670008, \&quot;OBJECTID\&quot;: 124, \&quot;Shape_Leng\&quot;: 0.127724410062, \&quot;Shape_Area\&quot;: 0.000754837821479, \&quot;zone\&quot;: \&quot;Howard Beach\&quot;, \&quot;LocationID\&quot;: 124, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.85096453700001, 40.671719510999885], [-73.83334819299995, 40.66677318699994], [-73.82859942399985, 40.657196972999884], [-73.82639242872236, 40.64832434880783], [-73.83133151403268, 40.65274755744263], [-73.82901417557953, 40.65610788445241], [-73.8317081441153, 40.65393117429689], [-73.83221698518575, 40.654460386292925], [-73.83149330103005, 40.65497982053967], [-73.83116100809627, 40.65591923373715], [-73.82937603410723, 40.65650633521598], [-73.82896778740296, 40.65720524792007], [-73.8291791973457, 40.65779977854427], [-73.83013028740389, 40.65840264372116], [-73.82970706838907, 40.658502513864484], [-73.82959986903019, 40.65865680691539], [-73.83014950104759, 40.6598086849573], [-73.83024427039376, 40.658349969348166], [-73.82909434825203, 40.65733421866331], [-73.83127112568108, 40.656003271494676], [-73.8318523847929, 40.65488503826691], [-73.83290309524602, 40.657483771623006], [-73.83194394578256, 40.65617142725338], [-73.832600363706, 40.65782659162732], [-73.83096907996668, 40.65823029417234], [-73.83338439472544, 40.65805185920798], [-73.83109184464118, 40.64848480675928], [-73.83561034795801, 40.64850568470053], [-73.8387360855594, 40.662454060021076], [-73.83978752612934, 40.660485998048], [-73.83592320073285, 40.645499790674954], [-73.84950699084165, 40.64413376567876], [-73.85183280737658, 40.64586005671262], [-73.85230349886227, 40.647771028550196], [-73.84939766406322, 40.65143487895031], [-73.85591932944749, 40.65130926166608], [-73.86136381950391, 40.65641475416531], [-73.85983363521494, 40.65697706322045], [-73.8596355866937, 40.65845777205655], [-73.86124943398261, 40.65872091007865], [-73.85976839588899, 40.65828193634574], [-73.86087597607579, 40.65690816207006], [-73.86317083299996, 40.65827651199994], [-73.85761052799985, 40.660108355999924], [-73.85842950899992, 40.66345335999987], [-73.85568461199988, 40.66386749199993], [-73.85763323099987, 40.67165619399989], [-73.86038937900003, 40.67126877499985], [-73.86131863599985, 40.6750212689999], [-73.85096453700001, 40.671719510999885]]], [[[-73.83032725337058, 40.65513280580328], [-73.83026601851493, 40.65542864678473], [-73.82988919856028, 40.655522822584075], [-73.82994556435834, 40.655424494353], [-73.83032725337058, 40.65513280580328]]], [[[-73.85975533686633, 40.65410417609493], [-73.86048308199986, 40.65465892799988], [-73.86098917376947, 40.65520976705256], [-73.85979242750741, 40.65447615737696], [-73.85975533686633, 40.65410417609493]]], [[[-73.85898002989568, 40.65267545791771], [-73.85975533686633, 40.65410417609493], [-73.85941022942576, 40.65386473792502], [-73.85898002989568, 40.65267545791771]]], [[[-73.85898002989568, 40.65267545791771], [-73.85731941515513, 40.65123709900783], [-73.85695870295893, 40.65058737348713], [-73.85898002989568, 40.65267545791771]]]]}}, {\&quot;id\&quot;: \&quot;124\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.29250241290585527, \&quot;OBJECTID\&quot;: 125, \&quot;Shape_Leng\&quot;: 0.0497322121757, \&quot;Shape_Area\&quot;: 7.64293209892e-05, \&quot;zone\&quot;: \&quot;Hudson Sq\&quot;, \&quot;LocationID\&quot;: 125, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00269315099992, 40.72831405499989], [-74.0053098609999, 40.721824191999865], [-74.0108123829999, 40.72578980299994], [-74.0119643202455, 40.72432986461987], [-74.01165326569942, 40.725871761851344], [-74.01520426531133, 40.726361949379644], [-74.011542018976, 40.72644734692706], [-74.01067264999996, 40.72911266599987], [-74.00269315099992, 40.72831405499989]]]}}, {\&quot;id\&quot;: \&quot;125\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5991133628879037, \&quot;OBJECTID\&quot;: 126, \&quot;Shape_Leng\&quot;: 0.12994872606, \&quot;Shape_Area\&quot;: 0.0007032738273, \&quot;zone\&quot;: \&quot;Hunts Point\&quot;, \&quot;LocationID\&quot;: 126, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88615037899993, 40.82730567799994], [-73.88753429599987, 40.82250933899995], [-73.8843985489999, 40.822965575999866], [-73.88244779599998, 40.81926832299992], [-73.87056806927927, 40.81208731762241], [-73.86811219140058, 40.806751832831786], [-73.87234684998835, 40.800174763010446], [-73.87814218819929, 40.801319290306495], [-73.87843295513449, 40.80270273469493], [-73.8850517233671, 40.80213090679797], [-73.89197929534278, 40.80638470897619], [-73.89128402413917, 40.80497628189916], [-73.89509836487399, 40.80686363917353], [-73.8952796287401, 40.805766184067906], [-73.90222284749719, 40.80494811309474], [-73.90307457199998, 40.80988061199988], [-73.89542858799986, 40.81584467199988], [-73.8970446669999, 40.8168018599999], [-73.89283653100001, 40.820974054999965], [-73.8958813589999, 40.82099257499987], [-73.89586019599982, 40.82263104599987], [-73.89320004999998, 40.82400818299992], [-73.89487088500002, 40.82393727199992], [-73.89483522899992, 40.82624684099993], [-73.88615037899993, 40.82730567799994]]]}}, {\&quot;id\&quot;: \&quot;126\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5110266159695818, \&quot;OBJECTID\&quot;: 127, \&quot;Shape_Leng\&quot;: 0.0600188855815, \&quot;Shape_Area\&quot;: 0.000163195647796, \&quot;zone\&quot;: \&quot;Inwood\&quot;, \&quot;LocationID\&quot;: 127, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.911224294065, 40.87302771883775], [-73.91043824727869, 40.871377478551786], [-73.91254775130287, 40.866514943004354], [-73.91589911645785, 40.86430803808506], [-73.91538673051149, 40.863084384200725], [-73.91950213660932, 40.85879113379047], [-73.92159014848224, 40.86007280002688], [-73.92035142875443, 40.858195220619145], [-73.92282845999992, 40.8568514089999], [-73.92872203199994, 40.86674266299988], [-73.92135975499993, 40.869551853999894], [-73.91845930899993, 40.873022052999936], [-73.9140098549999, 40.871160593999946], [-73.911224294065, 40.87302771883775]]], [[[-73.92151894059094, 40.85660117062315], [-73.92229611007241, 40.855663835114505], [-73.92234459387058, 40.85568233590737], [-73.92169841904696, 40.85667230185494], [-73.92151894059094, 40.85660117062315]]]]}}, {\&quot;id\&quot;: \&quot;127\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.47332421340629277, \&quot;OBJECTID\&quot;: 128, \&quot;Shape_Leng\&quot;: 0.0702090290681, \&quot;Shape_Area\&quot;: 0.000207405982869, \&quot;zone\&quot;: \&quot;Inwood Hill Park\&quot;, \&quot;LocationID\&quot;: 128, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.92359742020389, 40.878898712992644], [-73.92363695289211, 40.87881535593209], [-73.92367919311681, 40.878826074498626], [-73.92362973975199, 40.87896394312155], [-73.92359742020389, 40.878898712992644]]], [[[-73.9264055692112, 40.87762147653741], [-73.92258387170895, 40.87692253928837], [-73.921169296781, 40.87306939228805], [-73.91978312944534, 40.87360369743557], [-73.92090325515422, 40.87546616638258], [-73.91855365026461, 40.873180588115396], [-73.9175772988473, 40.87454867854727], [-73.91154281116535, 40.873253706161705], [-73.9140098549999, 40.871160593999946], [-73.91845930899993, 40.873022052999936], [-73.92135975499993, 40.869551853999894], [-73.92872203199994, 40.86674266299988], [-73.93220600531866, 40.870096445104515], [-73.9264055692112, 40.87762147653741]]]]}}, {\&quot;id\&quot;: \&quot;131\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.42499042413125365, \&quot;OBJECTID\&quot;: 132, \&quot;Shape_Leng\&quot;: 0.24547851707, \&quot;Shape_Area\&quot;: 0.00203830095472, \&quot;zone\&quot;: \&quot;JFK Airport\&quot;, \&quot;LocationID\&quot;: 132, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.8250346749999, 40.663580133999844], [-73.81496922499986, 40.66247266799991], [-73.80072889200001, 40.66526937699988], [-73.780755286, 40.66240660199992], [-73.7541108669999, 40.648697664999915], [-73.75522386899995, 40.64744446899989], [-73.7474246205621, 40.6413764680137], [-73.74849297657127, 40.63567172844184], [-73.7650077554797, 40.62941398784963], [-73.77077016777163, 40.62003118215498], [-73.77082069703974, 40.62328299797239], [-73.77704080084247, 40.62766646976843], [-73.77999420781757, 40.62668929803533], [-73.78419483298926, 40.6208926699551], [-73.78949653224412, 40.62274664610792], [-73.78264543417806, 40.630247968544396], [-73.79076956011139, 40.63386374895698], [-73.79222318018806, 40.63589008813999], [-73.81830607819735, 40.64638698303703], [-73.82182513624882, 40.649899795874894], [-73.82348381110747, 40.65536991271862], [-73.82227996040434, 40.659425007931176], [-73.8186953155868, 40.661105051055245], [-73.81143921922407, 40.66074562606795], [-73.81867189288894, 40.66213298725428], [-73.82338324351308, 40.6602057470252], [-73.82498070378553, 40.65543197118367], [-73.82290717700891, 40.64809344600474], [-73.82614483059669, 40.65008184094253], [-73.82639242822242, 40.64832434880782], [-73.82859942399985, 40.657196972999884], [-73.832705339, 40.665405772999854], [-73.8250346749999, 40.663580133999844]]], [[[-73.74661040472857, 40.638724973885545], [-73.74653979797041, 40.63871136266965], [-73.74654132522075, 40.63869678799164], [-73.74664302817305, 40.638662249807076], [-73.74661040472857, 40.638724973885545]]], [[[-73.74693721618013, 40.63755610186007], [-73.74694320619099, 40.637529202088494], [-73.74704913170525, 40.63754513439954], [-73.74704316342154, 40.637566426459216], [-73.74693721618013, 40.63755610186007]]], [[[-73.74712154262465, 40.63716227570799], [-73.74706485671244, 40.637160999268374], [-73.74699391228548, 40.63715064484292], [-73.74715781614569, 40.637060524028364], [-73.74712154262465, 40.63716227570799]]]]}}, {\&quot;id\&quot;: \&quot;128\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6921506328454607, \&quot;OBJECTID\&quot;: 129, \&quot;Shape_Leng\&quot;: 0.0932727273403, \&quot;Shape_Area\&quot;: 0.00047398833179, \&quot;zone\&quot;: \&quot;Jackson Heights\&quot;, \&quot;LocationID\&quot;: 129, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87586503899996, 40.76605165399989], [-73.87513874300004, 40.756633815999905], [-73.87365721799983, 40.756803485999946], [-73.86942458599987, 40.74915685199991], [-73.89175048799984, 40.74681172799989], [-73.89624245599988, 40.74871954499987], [-73.89984592699983, 40.75756215299985], [-73.89437624799997, 40.7655265849999], [-73.87608949699984, 40.77153690299987], [-73.87586503899996, 40.76605165399989]]]}}, {\&quot;id\&quot;: \&quot;129\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.48143639683505784, \&quot;OBJECTID\&quot;: 130, \&quot;Shape_Leng\&quot;: 0.142028320665, \&quot;Shape_Area\&quot;: 0.000468322514327, \&quot;zone\&quot;: \&quot;Jamaica\&quot;, \&quot;LocationID\&quot;: 130, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76962552399995, 40.71178631999993], [-73.771724447, 40.71031681899991], [-73.76844546499984, 40.709637026999886], [-73.77555451099995, 40.70607083499987], [-73.77230768699997, 40.70057150699989], [-73.77395659499993, 40.69980578099988], [-73.78034491200003, 40.70541241699986], [-73.78256582599995, 40.70542486399989], [-73.79239170299988, 40.7021665299999], [-73.79260506799987, 40.70043209999988], [-73.80642479399984, 40.690873857999904], [-73.80890216900004, 40.69256434899993], [-73.81063298299996, 40.69194738299988], [-73.81637824499992, 40.70245196399987], [-73.81152856899989, 40.70227287499991], [-73.81201248599983, 40.70594494499993], [-73.80694856299993, 40.70736709999989], [-73.8056477309999, 40.70467172799994], [-73.80165725599993, 40.705761474999846], [-73.80302414799988, 40.70813965699997], [-73.79870150699992, 40.71066337699988], [-73.79776810199988, 40.7091431879999], [-73.77192121999992, 40.715685043999905], [-73.76962552399995, 40.71178631999993]]]}}, {\&quot;id\&quot;: \&quot;1\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4090909090909091, \&quot;OBJECTID\&quot;: 2, \&quot;Shape_Leng\&quot;: 0.43346966679, \&quot;Shape_Area\&quot;: 0.00486634037837, \&quot;zone\&quot;: \&quot;Jamaica Bay\&quot;, \&quot;LocationID\&quot;: 2, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.82337597260663, 40.63898704717671], [-73.82107505533321, 40.62973377456623], [-73.81611483429545, 40.624604655173044], [-73.81891708039825, 40.62309026716333], [-73.81571468044605, 40.62148955151693], [-73.81777429834523, 40.61750112169565], [-73.81652681189122, 40.61494700958006], [-73.82141601599992, 40.615054762999925], [-73.8238246859766, 40.61149866495507], [-73.82575322105271, 40.614192081540075], [-73.83776702143372, 40.61552223141874], [-73.83496222645587, 40.61778030881177], [-73.83514355859735, 40.62548708279667], [-73.83342230809954, 40.626781983462095], [-73.83464377224975, 40.62742707942435], [-73.83115393179625, 40.63256052752952], [-73.83340607979225, 40.63850135589897], [-73.82591657926903, 40.63574741296666], [-73.82443032497055, 40.6362165210408], [-73.82419327293158, 40.63995327448778], [-73.82337597260663, 40.63898704717671]]], [[[-73.84721834832125, 40.63196568670605], [-73.8485899664393, 40.63013198680654], [-73.8585583634798, 40.63045828819559], [-73.8561374187591, 40.63508154601468], [-73.84667914840234, 40.63873171175714], [-73.84352007697278, 40.636503685327924], [-73.84721834832125, 40.63196568670605]]], [[[-73.79577948747226, 40.63215847659964], [-73.79811872226199, 40.6310375092611], [-73.79827615415297, 40.63125217936581], [-73.7907928429953, 40.63428204310243], [-73.79577948747226, 40.63215847659964]]], [[[-73.83623731597828, 40.631110861231726], [-73.84110205447426, 40.62455643651514], [-73.84445711462239, 40.62984779443998], [-73.83765174362401, 40.63283973295598], [-73.83623731597828, 40.631110861231726]]], [[[-73.81307233892618, 40.62926109964263], [-73.81352502122876, 40.62730617268596], [-73.81258556038132, 40.628371916183724], [-73.81129432207656, 40.624703779000406], [-73.81089990481607, 40.61621847134095], [-73.81679073502552, 40.62634891812118], [-73.81382899493154, 40.62613507764411], [-73.81627026043981, 40.62714580591711], [-73.8173057692762, 40.63062197379782], [-73.81506788441455, 40.63116405857793], [-73.81307233892618, 40.62926109964263]]], [[[-73.84734350666976, 40.62909473971626], [-73.84984630167418, 40.62622449074592], [-73.8472783772798, 40.626621669791945], [-73.84358010755503, 40.623178164184395], [-73.86364988794934, 40.617878773642374], [-73.86404106276488, 40.61920759671402], [-73.86151825485233, 40.619049218399226], [-73.86102883383386, 40.624138986994076], [-73.86347880947007, 40.6233886093158], [-73.86334955670225, 40.62592490877777], [-73.86041082270874, 40.62516691297755], [-73.8565055097758, 40.629097353726586], [-73.8539654419115, 40.62761094389788], [-73.85436931062769, 40.62881767654389], [-73.84734350666976, 40.62909473971626]]], [[[-73.87084603194215, 40.61696742645758], [-73.8782477932424, 40.615444608331536], [-73.87481386865049, 40.62358718918363], [-73.86684384142526, 40.62782924286026], [-73.86498193495926, 40.625660706041025], [-73.86626127665735, 40.618456348023955], [-73.87084603194215, 40.61696742645758]]], [[[-73.79783533398513, 40.627408716571516], [-73.79566256726108, 40.626114004327796], [-73.79921493427759, 40.6240847129885], [-73.7936292748135, 40.62515647619494], [-73.79809093107174, 40.62306294824432], [-73.79992057632684, 40.61857524016598], [-73.80172498640165, 40.61996700873167], [-73.80128049504093, 40.615879839747535], [-73.80270343867807, 40.61358065232171], [-73.80508906012292, 40.61343256041943], [-73.80476592616557, 40.61580099137086], [-73.80764116896117, 40.62119965469225], [-73.80698502381061, 40.623871998829976], [-73.8001117714566, 40.626927441987085], [-73.80092841565032, 40.627524104895656], [-73.79783533398513, 40.627408716571516]]], [[[-73.77348616522504, 40.625085118163526], [-73.77381024409397, 40.624925596730954], [-73.77383258726536, 40.624944848253456], [-73.77348560409436, 40.62511314810922], [-73.77348616522504, 40.625085118163526]]], [[[-73.77172760292548, 40.62358502801516], [-73.7720313143135, 40.62299121290296], [-73.77218824028017, 40.622995793795134], [-73.77511891254433, 40.619233847487365], [-73.77518045935567, 40.61926471788484], [-73.77172760292548, 40.62358502801516]]], [[[-73.79162058913477, 40.62231334348308], [-73.78419483298926, 40.6208926699551], [-73.78446087067887, 40.617027835129704], [-73.78070887195283, 40.614026809005864], [-73.79139721011913, 40.60761085524994], [-73.79480633875043, 40.61037836048121], [-73.80080125919478, 40.611933904481596], [-73.7946062540462, 40.62257170055433], [-73.79162058913477, 40.62231334348308]]], [[[-73.76670827781236, 40.61491086618553], [-73.76825288003378, 40.614877725169315], [-73.77397692018825, 40.61600357567147], [-73.76873454755717, 40.62090086822023], [-73.76745926975256, 40.620511322031255], [-73.76670827781236, 40.61491086618553]]], [[[-73.84304421296773, 40.617737696390435], [-73.84454193473684, 40.614867921675135], [-73.8409994253963, 40.613029126216134], [-73.83825667290532, 40.613847216216406], [-73.8407944240835, 40.60564326638265], [-73.8471480968766, 40.60361424219198], [-73.85179402215192, 40.60689716858368], [-73.84779013405834, 40.60923538526278], [-73.84614804513843, 40.61772842036632], [-73.84304421296773, 40.617737696390435]]], [[[-73.85523067631884, 40.61613145335797], [-73.85530325465119, 40.6131454135728], [-73.84973986306498, 40.61515605814331], [-73.85010857555366, 40.61021219334599], [-73.8551559228834, 40.606120513001486], [-73.85708638173246, 40.60646824293355], [-73.85924855452187, 40.61125483087423], [-73.85648360749232, 40.61319069486381], [-73.85858056782772, 40.61691708722184], [-73.85523067631884, 40.61613145335797]]], [[[-73.814090115668, 40.614466920099765], [-73.81503638494628, 40.6129762137494], [-73.81615626666235, 40.61294211575494], [-73.8164315038978, 40.614282334964926], [-73.814090115668, 40.614466920099765]]], [[[-73.81496830662114, 40.61042065495561], [-73.81520720849484, 40.60981673379666], [-73.81559858789666, 40.61067251616471], [-73.81450261566708, 40.61105847350542], [-73.81496830662114, 40.61042065495561]]], [[[-73.86966442958492, 40.606540123412906], [-73.87109330768071, 40.604694173994694], [-73.87300122724774, 40.61055545845987], [-73.8710387011171, 40.60972358252655], [-73.86966442958492, 40.606540123412906]]], [[[-73.79420172624032, 40.607730675613354], [-73.79352152715475, 40.60632759139594], [-73.79509002319158, 40.607271060105596], [-73.79424799033224, 40.60590038003164], [-73.79696327795033, 40.60411784876779], [-73.80428530678597, 40.604519279530564], [-73.80520676583323, 40.60673953810017], [-73.80159206744115, 40.61023096250127], [-73.79420172624032, 40.607730675613354]]], [[[-73.83244207358176, 40.605929449536745], [-73.83587601623029, 40.605636907545566], [-73.83610156628845, 40.60736279382329], [-73.83252192275347, 40.610384993603816], [-73.83032947905777, 40.60848787991649], [-73.83045815392722, 40.606669201403214], [-73.83244207358176, 40.605929449536745]]], [[[-73.82607472604538, 40.60843779954612], [-73.82771104235977, 40.608398668130704], [-73.82805077260065, 40.61004629686527], [-73.82688326414805, 40.6095966780694], [-73.82607472604538, 40.60843779954612]]], [[[-73.86702399475149, 40.60806817876942], [-73.86874317559169, 40.60703517927931], [-73.86868468826752, 40.608241158183915], [-73.86702399475149, 40.60806817876942]]], [[[-73.82718282107048, 40.607919778091194], [-73.82590092720767, 40.60646593064943], [-73.82861671457653, 40.60583848413761], [-73.82815085191197, 40.60795028983291], [-73.82718282107048, 40.607919778091194]]], [[[-73.81569926225602, 40.6064570673649], [-73.81546066483351, 40.60642813700742], [-73.81552816722274, 40.606163069945154], [-73.81552536723665, 40.60640738028192], [-73.81569926225602, 40.6064570673649]]], [[[-73.81339665223344, 40.60436407224534], [-73.80986333857152, 40.60189579000784], [-73.81157550345523, 40.59814119925956], [-73.81501471568424, 40.60205629156354], [-73.81339665223344, 40.60436407224534]]], [[[-73.86702905185578, 40.603743388853935], [-73.8676819415421, 40.603070766677334], [-73.8683080846461, 40.603139161146146], [-73.86793505372694, 40.60396113545295], [-73.86702905185578, 40.603743388853935]]], [[[-73.85243335807012, 40.59733339779527], [-73.86044420534076, 40.596471905596275], [-73.86335999147606, 40.600322202771196], [-73.86112814224546, 40.60255033107426], [-73.85482595782968, 40.601867195353634], [-73.85076748001559, 40.598839443837406], [-73.85243335807012, 40.59733339779527]]], [[[-73.87019491489939, 40.598996405901886], [-73.87108141811476, 40.598901147470094], [-73.87049411914771, 40.602604446204595], [-73.87026280564918, 40.60168122225861], [-73.87019491489939, 40.598996405901886]]], [[[-73.8231174097477, 40.60007949252535], [-73.82315293179705, 40.599976662824794], [-73.82317356168161, 40.59997800515576], [-73.82318015964296, 40.60008384902813], [-73.8231174097477, 40.60007949252535]]], [[[-73.82292757811203, 40.60006142816309], [-73.822978576463, 40.600043707224835], [-73.82303195183424, 40.59993051694214], [-73.82304007849375, 40.60006807478574], [-73.82292757811203, 40.60006142816309]]], [[[-73.82445629476595, 40.59911583868227], [-73.82395871079126, 40.59887689683851], [-73.82477088992478, 40.5983918438742], [-73.82453084258555, 40.59911949829181], [-73.82445629476595, 40.59911583868227]]], [[[-73.86952707548932, 40.598713750354406], [-73.86967070711478, 40.59668856362211], [-73.87020899836229, 40.59695423278937], [-73.86952707548932, 40.598713750354406]]], [[[-73.83668274106707, 40.5949466970158], [-73.8325749810638, 40.592118209113956], [-73.83422777067327, 40.59137381382269], [-73.83253569485043, 40.59021893579835], [-73.83495422767699, 40.589728155618005], [-73.83347866645357, 40.589368748710896], [-73.83719541135855, 40.58969911736292], [-73.8398907019092, 40.59280021149386], [-73.84385894083933, 40.59342531196059], [-73.83902964248091, 40.59625348474866], [-73.83668274106707, 40.5949466970158]]], [[[-73.86706149472118, 40.5820879767934], [-73.87000313642912, 40.582636614815954], [-73.87115922675414, 40.5868738879673], [-73.86635052164085, 40.591892676564676], [-73.86327273492819, 40.59090807569255], [-73.86125299377363, 40.58798808592123], [-73.86327471071942, 40.58387684853184], [-73.86706149472118, 40.5820879767934]]]]}}, {\&quot;id\&quot;: \&quot;130\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.572068707991038, \&quot;OBJECTID\&quot;: 131, \&quot;Shape_Leng\&quot;: 0.116547120922, \&quot;Shape_Area\&quot;: 0.000423696152789, \&quot;zone\&quot;: \&quot;Jamaica Estates\&quot;, \&quot;LocationID\&quot;: 131, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.77732562899998, 40.722392700999926], [-73.76924074899993, 40.72590270099988], [-73.75669771299987, 40.7262287109999], [-73.7523343839998, 40.72026246099993], [-73.79303800099989, 40.71071107499988], [-73.79358570299998, 40.714128677999874], [-73.790302674, 40.7208914649999], [-73.79174472699992, 40.725788849999944], [-73.77757506899988, 40.73019327299987], [-73.7752338719998, 40.725237532999884], [-73.77803765999981, 40.723284268999855], [-73.77732562899998, 40.722392700999926]]]}}, {\&quot;id\&quot;: \&quot;132\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.47491974317817015, \&quot;OBJECTID\&quot;: 133, \&quot;Shape_Leng\&quot;: 0.065134863162, \&quot;Shape_Area\&quot;: 0.000157188987507, \&quot;zone\&quot;: \&quot;Kensington\&quot;, \&quot;LocationID\&quot;: 133, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97819074399992, 40.64752599199992], [-73.97777380600002, 40.645341876999964], [-73.974642245, 40.644813218999914], [-73.97084113799984, 40.64637857099989], [-73.96803868499985, 40.636650984999925], [-73.97029036199991, 40.63640634099988], [-73.96986869299992, 40.63419467499989], [-73.97604935699995, 40.63127590599986], [-73.9768886119999, 40.6356748619999], [-73.97911188699993, 40.63544038599991], [-73.98042057899988, 40.64238522699991], [-73.98299419199994, 40.64132499699987], [-73.98834986699991, 40.64456224399992], [-73.97819074399992, 40.64752599199992]]]}}, {\&quot;id\&quot;: \&quot;133\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5255583126550869, \&quot;OBJECTID\&quot;: 134, \&quot;Shape_Leng\&quot;: 0.0695878223284, \&quot;Shape_Area\&quot;: 0.000202375182143, \&quot;zone\&quot;: \&quot;Kew Gardens\&quot;, \&quot;LocationID\&quot;: 134, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82288529599995, 40.71192805799993], [-73.81637824499992, 40.70245196399987], [-73.82245890399994, 40.70365553099989], [-73.83152109599999, 40.70138962899994], [-73.83460244999996, 40.70392746699988], [-73.83661882199989, 40.70342001799988], [-73.83809584699989, 40.70616458099993], [-73.83714702999997, 40.70795704599989], [-73.84314625299982, 40.70922345599992], [-73.82591945199992, 40.71598987599992], [-73.82288529599995, 40.71192805799993]]]}}, {\&quot;id\&quot;: \&quot;134\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5858644859813084, \&quot;OBJECTID\&quot;: 135, \&quot;Shape_Leng\&quot;: 0.121793045659, \&quot;Shape_Area\&quot;: 0.000467912240542, \&quot;zone\&quot;: \&quot;Kew Gardens Hills\&quot;, \&quot;LocationID\&quot;: 135, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83126834299986, 40.74026227599991], [-73.8294675199999, 40.73702448299991], [-73.8243501109999, 40.73975360599992], [-73.81497208299996, 40.738560715999874], [-73.81510024099985, 40.72854342299991], [-73.81074426599986, 40.72626511299991], [-73.8111179729999, 40.72781641599994], [-73.80717042299993, 40.72826913299987], [-73.80652142399995, 40.7248730639999], [-73.80487958299983, 40.725049592999895], [-73.80452680199981, 40.721462545999884], [-73.80904032699983, 40.71991160499987], [-73.80780927699995, 40.715853895999906], [-73.82018883899984, 40.71673522399984], [-73.81732944799997, 40.717660456999916], [-73.82531644999993, 40.71727569999994], [-73.8273090039999, 40.72464607699988], [-73.83073214599987, 40.72654932799991], [-73.83635625099998, 40.73500859199989], [-73.83564585599999, 40.738491010999894], [-73.83699037399995, 40.74209330099992], [-73.83586131899989, 40.743227984999926], [-73.83113122799989, 40.74233799999994], [-73.83126834299986, 40.74026227599991]]]}}, {\&quot;id\&quot;: \&quot;135\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6671575846833578, \&quot;OBJECTID\&quot;: 136, \&quot;Shape_Leng\&quot;: 0.0906287154122, \&quot;Shape_Area\&quot;: 0.000148524994129, \&quot;zone\&quot;: \&quot;Kingsbridge Heights\&quot;, \&quot;LocationID\&quot;: 136, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89996501599988, 40.86801852399986], [-73.89891854299988, 40.86965857399992], [-73.89656060599998, 40.868565199999935], [-73.90486847199993, 40.8586932249999], [-73.90777320599983, 40.85960753799984], [-73.90976165899988, 40.857182611999896], [-73.91328437100006, 40.859618600999916], [-73.90908822499988, 40.8623996959999], [-73.91422823999919, 40.862490790359615], [-73.91044282747865, 40.866527868551835], [-73.90746489699994, 40.87354735399985], [-73.90452070499992, 40.87249521099988], [-73.90318667499999, 40.86914899099988], [-73.89996501599988, 40.86801852399986]]]}}, {\&quot;id\&quot;: \&quot;136\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.321364184145939, \&quot;OBJECTID\&quot;: 137, \&quot;Shape_Leng\&quot;: 0.0461076242707, \&quot;Shape_Area\&quot;: 0.000116455098947, \&quot;zone\&quot;: \&quot;Kips Bay\&quot;, \&quot;LocationID\&quot;: 137, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97219641647804, 40.74040257875022], [-73.97248994174741, 40.73580328010761], [-73.97446647047282, 40.736278456829886], [-73.9735447289197, 40.73494432655072], [-73.98266497499989, 40.73949733299987], [-73.97812378199983, 40.745727172999885], [-73.97167921200406, 40.74305446402989], [-73.97219641647804, 40.74040257875022]]]}}, {\&quot;id\&quot;: \&quot;137\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.2660254049104935, \&quot;OBJECTID\&quot;: 138, \&quot;Shape_Leng\&quot;: 0.107466933508, \&quot;Shape_Area\&quot;: 0.000536797294367, \&quot;zone\&quot;: \&quot;LaGuardia Airport\&quot;, \&quot;LocationID\&quot;: 138, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.8712485624251, 40.78603815125499], [-73.86918113468879, 40.78594348978492], [-73.86847981674143, 40.78369082919537], [-73.87255732673727, 40.78082112154256], [-73.85505106271819, 40.772195389989086], [-73.8582051105021, 40.77032345647716], [-73.85624565746174, 40.768885714198944], [-73.86268864176631, 40.76687591050486], [-73.86043337809801, 40.76386888243776], [-73.86728193799998, 40.76965000299989], [-73.87223577699984, 40.77169565899993], [-73.87743339799992, 40.77120025499991], [-73.88770661799987, 40.76683859799995], [-73.88945486901865, 40.77353295106357], [-73.88391627963797, 40.774132606591536], [-73.88493466381185, 40.77993691280691], [-73.87870562518874, 40.78058590995002], [-73.878858374856, 40.78239817868118], [-73.87974777853563, 40.782836564207], [-73.8797016367226, 40.78288281807235], [-73.8751575489337, 40.781509449653285], [-73.8712485624251, 40.78603815125499]]], [[[-73.8728719590193, 40.785975027902346], [-73.87282839783694, 40.78595446173833], [-73.8727740594054, 40.78594192145881], [-73.87280920016116, 40.78590310909999], [-73.8728719590193, 40.785975027902346]]], [[[-73.89008921683674, 40.77362643576237], [-73.89034195999996, 40.77323760499998], [-73.89183244902246, 40.77488019994431], [-73.89017369508576, 40.77785081277782], [-73.89008921683674, 40.77362643576237]]]]}}, {\&quot;id\&quot;: \&quot;138\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.541795665634675, \&quot;OBJECTID\&quot;: 139, \&quot;Shape_Leng\&quot;: 0.0932997884483, \&quot;Shape_Area\&quot;: 0.000446669880154, \&quot;zone\&quot;: \&quot;Laurelton\&quot;, \&quot;LocationID\&quot;: 139, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.74125253099989, 40.68745783899989], [-73.72718272499995, 40.68359732999987], [-73.74117817299991, 40.666402953999885], [-73.75763129599993, 40.66645115699992], [-73.75636239300002, 40.67242923699999], [-73.75857198899986, 40.67263733099987], [-73.76031463999993, 40.67510997099984], [-73.75576169199995, 40.67588590899988], [-73.747551754, 40.689347336999944], [-73.74125253099989, 40.68745783899989]]]}}, {\&quot;id\&quot;: \&quot;139\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3668911149937692, \&quot;OBJECTID\&quot;: 140, \&quot;Shape_Leng\&quot;: 0.0475842911325, \&quot;Shape_Area\&quot;: 0.000114203907779, \&quot;zone\&quot;: \&quot;Lenox Hill East\&quot;, \&quot;LocationID\&quot;: 140, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95854329689507, 40.758495622967885], [-73.96196573699997, 40.759619460999865], [-73.95268514999995, 40.772339404999926], [-73.9474897547817, 40.77011515400953], [-73.95854329689507, 40.758495622967885]]]}}, {\&quot;id\&quot;: \&quot;140\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3792365812102217, \&quot;OBJECTID\&quot;: 141, \&quot;Shape_Leng\&quot;: 0.0415144638712, \&quot;Shape_Area\&quot;: 7.66545579019e-05, \&quot;zone\&quot;: \&quot;Lenox Hill West\&quot;, \&quot;LocationID\&quot;: 141, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96177668399997, 40.75987971599993], [-73.9665833839999, 40.76155093499988], [-73.95729409999986, 40.7742835549999], [-73.95268514999995, 40.772339404999926], [-73.96177668399997, 40.75987971599993]]]}}, {\&quot;id\&quot;: \&quot;141\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.38368754613809913, \&quot;OBJECTID\&quot;: 142, \&quot;Shape_Leng\&quot;: 0.0381758942321, \&quot;Shape_Area\&quot;: 7.56537920738e-05, \&quot;zone\&quot;: \&quot;Lincoln Square East\&quot;, \&quot;LocationID\&quot;: 142, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98147898799989, 40.7677250589999], [-73.98806289599996, 40.769790799999925], [-73.980673654, 40.77992518199991], [-73.97499744000007, 40.77753254599988], [-73.98147898799989, 40.7677250589999]]]}}, {\&quot;id\&quot;: \&quot;142\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.35632808990282144, \&quot;OBJECTID\&quot;: 143, \&quot;Shape_Leng\&quot;: 0.0541798538849, \&quot;Shape_Area\&quot;: 0.00015109426901, \&quot;zone\&quot;: \&quot;Lincoln Square West\&quot;, \&quot;LocationID\&quot;: 143, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.981627874, 40.780328934999936], [-73.980673654, 40.77992518199991], [-73.98806289599996, 40.769790799999925], [-73.99624065194922, 40.77378979119886], [-73.99393587681126, 40.773179512586104], [-73.98886861739992, 40.779692922911416], [-73.9915510592274, 40.779574821437386], [-73.98812746184332, 40.78140179672363], [-73.981627874, 40.780328934999936]]]}}, {\&quot;id\&quot;: \&quot;143\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.34628725791556436, \&quot;OBJECTID\&quot;: 144, \&quot;Shape_Leng\&quot;: 0.0276201668505, \&quot;Shape_Area\&quot;: 4.74789670369e-05, \&quot;zone\&quot;: \&quot;Little Italy/NoLiTa\&quot;, \&quot;LocationID\&quot;: 144, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99580912300002, 40.71664465899988], [-74.00188406299992, 40.71939757099991], [-73.9967717579999, 40.7254319439999], [-73.99260322299989, 40.724136449999925], [-73.99580912300002, 40.71664465899988]]]}}, {\&quot;id\&quot;: \&quot;144\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.46636295729317484, \&quot;OBJECTID\&quot;: 145, \&quot;Shape_Leng\&quot;: 0.114313844981, \&quot;Shape_Area\&quot;: 0.000346641733797, \&quot;zone\&quot;: \&quot;Long Island City/Hunters Point\&quot;, \&quot;LocationID\&quot;: 145, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94345411699997, 40.75205360799992], [-73.93663681899982, 40.748204093999895], [-73.94419561599983, 40.742882145999914], [-73.93726110699994, 40.745176490999896], [-73.9386966449998, 40.73814081699989], [-73.94140886345744, 40.73929957085316], [-73.93866991753185, 40.74253408202486], [-73.9400192297566, 40.74320827221074], [-73.94159470030033, 40.73986412616895], [-73.94548236590111, 40.738207031293705], [-73.95380883920839, 40.73982029297784], [-73.96256114655104, 40.73868995735329], [-73.95978468552276, 40.74349771658391], [-73.96064863700711, 40.74413031761407], [-73.9587753700448, 40.74455559986341], [-73.95965229755977, 40.745216588173435], [-73.95849389303115, 40.74498786491623], [-73.9567945329049, 40.748839516955584], [-73.95318382492853, 40.74773481196097], [-73.9564856879466, 40.74911169015581], [-73.95080763809156, 40.75526368005708], [-73.94345411699997, 40.75205360799992]]]}}, {\&quot;id\&quot;: \&quot;145\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.48634595385741247, \&quot;OBJECTID\&quot;: 146, \&quot;Shape_Leng\&quot;: 0.0471405215717, \&quot;Shape_Area\&quot;: 0.000104638923425, \&quot;zone\&quot;: \&quot;Long Island City/Queens Plaza\&quot;, \&quot;LocationID\&quot;: 146, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93675697199996, 40.74914697199991], [-73.944052652, 40.75231325999992], [-73.93679091699993, 40.75988288099991], [-73.92415699999985, 40.753961141999845], [-73.92562743799989, 40.752137243999904], [-73.93383269399993, 40.7516047019999], [-73.93675697199996, 40.74914697199991]]]}}, {\&quot;id\&quot;: \&quot;146\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.7029177718832891, \&quot;OBJECTID\&quot;: 147, \&quot;Shape_Leng\&quot;: 0.0587654949268, \&quot;Shape_Area\&quot;: 0.000106418172757, \&quot;zone\&quot;: \&quot;Longwood\&quot;, \&quot;LocationID\&quot;: 147, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89515277899991, 40.82783428999991], [-73.89487088500002, 40.82393727199992], [-73.89320004999998, 40.82400818299992], [-73.89586019599982, 40.82263104599987], [-73.8958813589999, 40.82099257499987], [-73.89290156199988, 40.82081122299989], [-73.8970446669999, 40.8168018599999], [-73.89542858799986, 40.81584467199988], [-73.90307457199998, 40.80988061199988], [-73.9044655149999, 40.81228195999994], [-73.9006114109999, 40.822108807999875], [-73.90198758599993, 40.82244042299992], [-73.90093510699997, 40.82792810199992], [-73.89515277899991, 40.82783428999991]]]}}, {\&quot;id\&quot;: \&quot;147\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.31510740350687577, \&quot;OBJECTID\&quot;: 148, \&quot;Shape_Leng\&quot;: 0.0391305015633, \&quot;Shape_Area\&quot;: 6.97489921327e-05, \&quot;zone\&quot;: \&quot;Lower East Side\&quot;, \&quot;LocationID\&quot;: 148, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98447731699999, 40.72023423899987], [-73.98675136699994, 40.71959284599997], [-73.99022012699989, 40.71440493999988], [-73.99750445299988, 40.71406913199995], [-73.99260322199994, 40.72413644999987], [-73.98382387299982, 40.72147287199987], [-73.98447731699999, 40.72023423899987]]]}}, {\&quot;id\&quot;: \&quot;148\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.48792270531400966, \&quot;OBJECTID\&quot;: 149, \&quot;Shape_Leng\&quot;: 0.0836805821837, \&quot;Shape_Area\&quot;: 0.000270639618955, \&quot;zone\&quot;: \&quot;Madison\&quot;, \&quot;LocationID\&quot;: 149, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94405560899996, 40.61199284199993], [-73.94231175899985, 40.60826819699985], [-73.93934703399997, 40.610187140999884], [-73.93753749399987, 40.60855738999986], [-73.93972613899992, 40.60713291499995], [-73.93447158899997, 40.60123151199989], [-73.94288954099984, 40.600318649999934], [-73.94248473299992, 40.598200364999855], [-73.956927197, 40.596612075999865], [-73.95859278499987, 40.61040303099988], [-73.94978380499997, 40.611371749999854], [-73.95026514899993, 40.61392435199983], [-73.9448277099998, 40.61604620899986], [-73.94405560899996, 40.61199284199993]]]}}, {\&quot;id\&quot;: \&quot;149\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6063348416289592, \&quot;OBJECTID\&quot;: 150, \&quot;Shape_Leng\&quot;: 0.089331491183, \&quot;Shape_Area\&quot;: 0.000332568036088, \&quot;zone\&quot;: \&quot;Manhattan Beach\&quot;, \&quot;LocationID\&quot;: 150, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9301907789999, 40.58508559299986], [-73.9319281118675, 40.58286976893519], [-73.95349322048675, 40.58298819826098], [-73.94274062592493, 40.58099558955925], [-73.93258006568031, 40.58126474120341], [-73.93106028107997, 40.57626592009687], [-73.9523584672133, 40.574274685845204], [-73.95414287899986, 40.58310613999989], [-73.95900739999992, 40.58283812799991], [-73.96025825899996, 40.58502930799994], [-73.9344471859999, 40.586652074999925], [-73.9301907789999, 40.58508559299986]]]}}, {\&quot;id\&quot;: \&quot;150\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.398524774850972, \&quot;OBJECTID\&quot;: 151, \&quot;Shape_Leng\&quot;: 0.0548899410999, \&quot;Shape_Area\&quot;: 0.000128848901918, \&quot;zone\&quot;: \&quot;Manhattan Valley\&quot;, \&quot;LocationID\&quot;: 151, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96371096499993, 40.7930129339999], [-73.97639951915279, 40.79827321034625], [-73.97287179090726, 40.8033561875739], [-73.96004456499999, 40.79804123499991], [-73.96371096499993, 40.7930129339999]]]}}, {\&quot;id\&quot;: \&quot;151\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.47001506341917787, \&quot;OBJECTID\&quot;: 152, \&quot;Shape_Leng\&quot;: 0.0579094768782, \&quot;Shape_Area\&quot;: 0.000146637644064, \&quot;zone\&quot;: \&quot;Manhattanville\&quot;, \&quot;LocationID\&quot;: 152, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95357262899982, 40.82197589199988], [-73.94607828700005, 40.821263215999906], [-73.95210125199992, 40.811442853999935], [-73.96203105797969, 40.81808633074085], [-73.95881892233997, 40.82151852484672], [-73.9596033246027, 40.82299468678336], [-73.95793904909117, 40.82277435354731], [-73.9595089796959, 40.82359578895142], [-73.95357262899982, 40.82197589199988]]]}}, {\&quot;id\&quot;: \&quot;152\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6289562289562289, \&quot;OBJECTID\&quot;: 153, \&quot;Shape_Leng\&quot;: 0.024737239022, \&quot;Shape_Area\&quot;: 3.24684964817e-05, \&quot;zone\&quot;: \&quot;Marble Hill\&quot;, \&quot;LocationID\&quot;: 153, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90666530999995, 40.8757156089999], [-73.90893235220783, 40.87215734798524], [-73.91578609320084, 40.87571718248032], [-73.91033193599998, 40.879038046999895], [-73.90666530999995, 40.8757156089999]]]}}, {\&quot;id\&quot;: \&quot;153\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40897097625329815, \&quot;OBJECTID\&quot;: 154, \&quot;Shape_Leng\&quot;: 0.22733157076, \&quot;Shape_Area\&quot;: 0.00178968692433, \&quot;zone\&quot;: \&quot;Marine Park/Floyd Bennett Field\&quot;, \&quot;LocationID\&quot;: 154, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.93531145199985, 40.60886003999987], [-73.92986880199989, 40.60507134099995], [-73.92624885099994, 40.60741352199989], [-73.92444144399987, 40.60579356899993], [-73.91970928699986, 40.607302162999886], [-73.91331444593793, 40.60225844819831], [-73.90903689530528, 40.60267734322018], [-73.91073123013267, 40.60202137602758], [-73.90894225138031, 40.60160704069869], [-73.8839804295303, 40.60556651972071], [-73.87671672482064, 40.584914430200875], [-73.88174676983894, 40.5791588072124], [-73.89552381007165, 40.576769818436354], [-73.89903425420563, 40.587676171745805], [-73.90426874447125, 40.58691226298856], [-73.90651874663754, 40.588025473892536], [-73.91148171990072, 40.586078718712315], [-73.91204234015626, 40.594506954288846], [-73.91513297459494, 40.59878111593029], [-73.92151689981944, 40.60192365414108], [-73.92457042932716, 40.599723602732396], [-73.92950671202776, 40.60270923350431], [-73.92927458471804, 40.60399357480484], [-73.93117476161734, 40.603850406434695], [-73.93108919528449, 40.601722258264104], [-73.91454059121104, 40.58994422917544], [-73.91819087799986, 40.58660685499996], [-73.92956858299992, 40.5968202649999], [-73.92813139699999, 40.59777792799987], [-73.93972613899992, 40.60713291499995], [-73.93531145199985, 40.60886003999987]]], [[[-73.91990064335972, 40.59960052259278], [-73.91626393108346, 40.59816113731273], [-73.91295122631982, 40.59205432996962], [-73.91524478304683, 40.59158750817847], [-73.92182277731894, 40.59733293287253], [-73.92213049353394, 40.598662596177306], [-73.91990064335972, 40.59960052259278]]], [[[-73.91513331918175, 40.58626938540072], [-73.91282142952436, 40.58589683033704], [-73.91242103069457, 40.58339278402727], [-73.91729861410717, 40.58319080174952], [-73.91191058860355, 40.58296337725262], [-73.9114996013066, 40.58181878146464], [-73.92443604094977, 40.58355820344426], [-73.93184655018902, 40.58294105529734], [-73.9320424499999, 40.5842339599999], [-73.9300961629999, 40.584502075999886], [-73.93139947599984, 40.58607989499989], [-73.92101255523748, 40.58457501880612], [-73.91513331918175, 40.58626938540072]]]]}}, {\&quot;id\&quot;: \&quot;154\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5386199794026777, \&quot;OBJECTID\&quot;: 155, \&quot;Shape_Leng\&quot;: 0.169808473032, \&quot;Shape_Area\&quot;: 0.000868261018498, \&quot;zone\&quot;: \&quot;Marine Park/Mill Basin\&quot;, \&quot;LocationID\&quot;: 155, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90464209220775, 40.62513319188153], [-73.90546206137252, 40.62577481968345], [-73.9022870793228, 40.624409853930224], [-73.90071952540437, 40.62163492049855], [-73.89644123346895, 40.621394756190135], [-73.89586112894177, 40.614518137494784], [-73.89095414564672, 40.61283404731705], [-73.89394013317667, 40.61118142665126], [-73.88971513183803, 40.611598996904085], [-73.89334621420008, 40.606743446234645], [-73.89986880363854, 40.605524640544004], [-73.90133303458649, 40.611717882905985], [-73.90249392985292, 40.611814999032276], [-73.90119253465456, 40.61056381754662], [-73.90132962659396, 40.61048104310328], [-73.90879088017641, 40.617436396721416], [-73.90797306390525, 40.615736844061175], [-73.90959740910328, 40.616392669799325], [-73.90225859966276, 40.61042277259991], [-73.90177669809985, 40.605674686555815], [-73.90524300992108, 40.60491009032442], [-73.90863959535422, 40.606658722047854], [-73.90803306097814, 40.60535860211721], [-73.9098515484547, 40.605999722177685], [-73.9083253683517, 40.60407337391859], [-73.91365119759595, 40.60398251383695], [-73.91708838503304, 40.608820854898525], [-73.91449542205973, 40.61165322366488], [-73.91428072663338, 40.61493881616294], [-73.91662804371141, 40.6134435892654], [-73.91573181927129, 40.61183084451381], [-73.91811036679019, 40.61020839405809], [-73.91813814889971, 40.607645386907706], [-73.91935398484114, 40.60804292228766], [-73.91825269092949, 40.6072293506405], [-73.91950358918922, 40.60797490397521], [-73.91794980550603, 40.60620925217101], [-73.92158429099997, 40.607639084999875], [-73.92444144399987, 40.60579356899993], [-73.92624885099994, 40.60741352199989], [-73.92986880199989, 40.60507134099995], [-73.936046277, 40.609514868999966], [-73.93753749399987, 40.60855738999986], [-73.93934703399997, 40.610187140999884], [-73.94231175899985, 40.60826819699985], [-73.94354698000001, 40.6093465549999], [-73.9448277099998, 40.61604620899986], [-73.93686699599992, 40.620253280999904], [-73.92629604599998, 40.61311679899991], [-73.92640044599996, 40.61447853499988], [-73.9205269409999, 40.61394269499987], [-73.91690302699992, 40.61627422899993], [-73.91860649599992, 40.632090414999894], [-73.90464209220775, 40.62513319188153]]]}}, {\&quot;id\&quot;: \&quot;155\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.425414364640884, \&quot;OBJECTID\&quot;: 156, \&quot;Shape_Leng\&quot;: 0.144476890476, \&quot;Shape_Area\&quot;: 0.0010521217443, \&quot;zone\&quot;: \&quot;Mariners Harbor\&quot;, \&quot;LocationID\&quot;: 156, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.17989568340026, 40.64526879647802], [-74.1795871372141, 40.64191768346404], [-74.17918728067563, 40.64298753999647], [-74.1763578661754, 40.64232722056289], [-74.17436572943608, 40.64513625864542], [-74.17133587281808, 40.642855765052], [-74.17298798800311, 40.640489105066244], [-74.17105017239898, 40.642593819129914], [-74.1660998989604, 40.642406587001155], [-74.1658011075589, 40.64122451144941], [-74.16494139041178, 40.64220899988932], [-74.16519041758224, 40.64064230577938], [-74.16167534694229, 40.640610784766764], [-74.1622846525209, 40.63876565277233], [-74.16034819993155, 40.63844372645346], [-74.15986410465037, 40.639927823692716], [-74.1592271162294, 40.637796119756985], [-74.15900957887435, 40.63882257790974], [-74.15718782782525, 40.63795080522895], [-74.15710126690709, 40.63927771860018], [-74.15707077305574, 40.63794713564092], [-74.15482932461856, 40.63772385541876], [-74.15469263864514, 40.63919396811424], [-74.15459670163321, 40.63734334406899], [-74.15279703511403, 40.637132754852544], [-74.15124827966567, 40.63940934288591], [-74.14855815092196, 40.63743783752723], [-74.14877792005885, 40.6388762511277], [-74.14312802471521, 40.63968037306379], [-74.14752618999992, 40.62938928799988], [-74.14554071999994, 40.62783252199995], [-74.14650354399993, 40.62420010099991], [-74.15231170399994, 40.61716275599988], [-74.15379116699992, 40.612255611999906], [-74.1623545779999, 40.618335637999955], [-74.17459706299995, 40.622364010999874], [-74.1955597527974, 40.635023986316575], [-74.19462310145185, 40.637391183563665], [-74.18652496897599, 40.64338866217145], [-74.18483594580836, 40.644128266338726], [-74.18365067064063, 40.642239641050644], [-74.1836674587201, 40.64461048505006], [-74.17989568340026, 40.64526879647802]]], [[[-74.15945602438187, 40.641448333324036], [-74.16111242522163, 40.64183545373729], [-74.16146036002637, 40.644294969882374], [-74.15743349200979, 40.643302857779], [-74.15945602438187, 40.641448333324036]]]]}}, {\&quot;id\&quot;: \&quot;156\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5531110811175597, \&quot;OBJECTID\&quot;: 157, \&quot;Shape_Leng\&quot;: 0.131300217777, \&quot;Shape_Area\&quot;: 0.000354370128323, \&quot;zone\&quot;: \&quot;Maspeth\&quot;, \&quot;LocationID\&quot;: 157, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8978323689999, 40.73516035399992], [-73.8885228599999, 40.734531159999904], [-73.8870771209998, 40.72463770199994], [-73.90010558699989, 40.72329624099992], [-73.899816102, 40.721236899999894], [-73.89739704899986, 40.7215512099999], [-73.89736598399989, 40.72046438299989], [-73.90062644399997, 40.719764053999874], [-73.90033904299986, 40.718019947999885], [-73.89834760099983, 40.719197677999894], [-73.897267579, 40.71814715699985], [-73.89901821099994, 40.71738212699993], [-73.89750226399987, 40.716383867999916], [-73.90477244599997, 40.71286579999984], [-73.90639010099999, 40.71736369199989], [-73.90965980099996, 40.71779315499991], [-73.91283037699982, 40.71536090699993], [-73.91077807399988, 40.71318759999986], [-73.92404011299993, 40.714008312999916], [-73.92352547251075, 40.71561660836783], [-73.92064258940593, 40.715773192028834], [-73.92232773978448, 40.71659264406108], [-73.91132095099978, 40.71962422999992], [-73.91384828299984, 40.72289841199989], [-73.905180579, 40.72895657699995], [-73.90041661699985, 40.73465058799992], [-73.8978323689999, 40.73516035399992]]]}}, {\&quot;id\&quot;: \&quot;157\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3155719663057511, \&quot;OBJECTID\&quot;: 158, \&quot;Shape_Leng\&quot;: 0.0548099905515, \&quot;Shape_Area\&quot;: 0.000185568253002, \&quot;zone\&quot;: \&quot;Meatpacking/West Village West\&quot;, \&quot;LocationID\&quot;: 158, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0077911609999, 40.74197084499982], [-74.00515808199998, 40.74085808099991], [-74.0070902079999, 40.72877225299993], [-74.014390699162, 40.728463047760016], [-74.01408693559922, 40.730663173040284], [-74.01116195696464, 40.730450676349065], [-74.01099350879154, 40.732320417940606], [-74.01399957240955, 40.733332277517704], [-74.01072514326883, 40.733459523511115], [-74.01201792010478, 40.734063744456314], [-74.01081359479103, 40.734283443647534], [-74.0103930313456, 40.739174296059204], [-74.01265928208485, 40.74074763849748], [-74.0077911609999, 40.74197084499982]]]}}, {\&quot;id\&quot;: \&quot;158\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6711195928753181, \&quot;OBJECTID\&quot;: 159, \&quot;Shape_Leng\&quot;: 0.064363233206, \&quot;Shape_Area\&quot;: 0.00017124910387, \&quot;zone\&quot;: \&quot;Melrose South\&quot;, \&quot;LocationID\&quot;: 159, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91189154999992, 40.822141481999914], [-73.9012927759998, 40.820475442999914], [-73.9044655149999, 40.81228195999994], [-73.91768626999985, 40.8160812429999], [-73.92048117399989, 40.8145636869999], [-73.92309299899993, 40.81669772799995], [-73.92399951299991, 40.81543891199991], [-73.92662718199988, 40.816118958999915], [-73.91677400599986, 40.82438708699987], [-73.91189154999992, 40.822141481999914]]]}}, {\&quot;id\&quot;: \&quot;159\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5745629070963318, \&quot;OBJECTID\&quot;: 160, \&quot;Shape_Leng\&quot;: 0.14151914297, \&quot;Shape_Area\&quot;: 0.000571234977994, \&quot;zone\&quot;: \&quot;Middle Village\&quot;, \&quot;LocationID\&quot;: 160, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.869707654, 40.72514643399992], [-73.85962920999985, 40.713975294999926], [-73.87016462499984, 40.70920774299987], [-73.86911007199988, 40.707089336999914], [-73.88088332699985, 40.7064539769999], [-73.87761134199985, 40.70716770499993], [-73.88006267699978, 40.71265257399993], [-73.90477244599997, 40.71286579999984], [-73.89750226399987, 40.716383867999916], [-73.89901821099994, 40.71738212699993], [-73.897267579, 40.71814715699985], [-73.89834760099983, 40.719197677999894], [-73.90033904299986, 40.718019947999885], [-73.90062644399997, 40.719764053999874], [-73.89736598399989, 40.72046438299989], [-73.89739704899986, 40.7215512099999], [-73.899816102, 40.721236899999894], [-73.89903191799989, 40.723856959999864], [-73.89426494199992, 40.723143188999856], [-73.8870771209998, 40.72463770199994], [-73.88720524999994, 40.727792996999874], [-73.87509154199992, 40.73067136299992], [-73.87146074199987, 40.729326373999854], [-73.869707654, 40.72514643399992]]]}}, {\&quot;id\&quot;: \&quot;160\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4022771479736624, \&quot;OBJECTID\&quot;: 161, \&quot;Shape_Leng\&quot;: 0.0358039100611, \&quot;Shape_Area\&quot;: 7.19130682992e-05, \&quot;zone\&quot;: \&quot;Midtown Center\&quot;, \&quot;LocationID\&quot;: 161, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97534377999993, 40.7552996949999], [-73.9783696929999, 40.752416226999905], [-73.98411754799999, 40.75484205299995], [-73.977686006, 40.76364440299992], [-73.97124277300004, 40.76093641799984], [-73.97534377999993, 40.7552996949999]]]}}, {\&quot;id\&quot;: \&quot;161\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3596184805923184, \&quot;OBJECTID\&quot;: 162, \&quot;Shape_Leng\&quot;: 0.0352698146219, \&quot;Shape_Area\&quot;: 4.78936962112e-05, \&quot;zone\&quot;: \&quot;Midtown East\&quot;, \&quot;LocationID\&quot;: 162, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9712170449999, 40.75519332399994], [-73.9744494109998, 40.75076644499991], [-73.9783696929999, 40.752416226999905], [-73.96980028899992, 40.76291351199995], [-73.9665833839999, 40.76155093499988], [-73.9712170449999, 40.75519332399994]]]}}, {\&quot;id\&quot;: \&quot;162\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.41203381253818994, \&quot;OBJECTID\&quot;: 163, \&quot;Shape_Leng\&quot;: 0.0341768669752, \&quot;Shape_Area\&quot;: 4.08567804196e-05, \&quot;zone\&quot;: \&quot;Midtown North\&quot;, \&quot;LocationID\&quot;: 163, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98136213699995, 40.767836738999904], [-73.9736358469999, 40.7645699129999], [-73.96980028899992, 40.76291351199995], [-73.97124277300004, 40.76093641799984], [-73.98428230099987, 40.76479181499994], [-73.98136213699995, 40.767836738999904]]]}}, {\&quot;id\&quot;: \&quot;163\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3815021697251198, \&quot;OBJECTID\&quot;: 164, \&quot;Shape_Leng\&quot;: 0.0357716119908, \&quot;Shape_Area\&quot;: 5.56318237441e-05, \&quot;zone\&quot;: \&quot;Midtown South\&quot;, \&quot;LocationID\&quot;: 164, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98362519999995, 40.7439431149999], [-73.99051761299985, 40.746038637999895], [-73.98411754799999, 40.75484205299995], [-73.98088709899987, 40.753480988999875], [-73.98407636100002, 40.74910212499993], [-73.98085054499998, 40.74775036999995], [-73.98362519999995, 40.7439431149999]]]}}, {\&quot;id\&quot;: \&quot;164\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5545425966677145, \&quot;OBJECTID\&quot;: 165, \&quot;Shape_Leng\&quot;: 0.088608036213, \&quot;Shape_Area\&quot;: 0.000353959317019, \&quot;zone\&quot;: \&quot;Midwood\&quot;, \&quot;LocationID\&quot;: 165, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96014773499996, 40.628915184999876], [-73.95995565099992, 40.627778671999884], [-73.94732672199994, 40.629166566999835], [-73.94451833400001, 40.61971364699989], [-73.94651373199997, 40.61949401899995], [-73.94573691999982, 40.61536340699989], [-73.95026514899993, 40.61392435199983], [-73.94978380499997, 40.611371749999854], [-73.96237947799978, 40.609986373999966], [-73.96471983399981, 40.62237296099993], [-73.96864510599995, 40.6219416949999], [-73.97136622199992, 40.62892916199996], [-73.96040734299989, 40.6301625309999], [-73.96014773499996, 40.628915184999876]]]}}, {\&quot;id\&quot;: \&quot;165\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.36056688271411746, \&quot;OBJECTID\&quot;: 166, \&quot;Shape_Leng\&quot;: 0.0688237542871, \&quot;Shape_Area\&quot;: 0.000255276270405, \&quot;zone\&quot;: \&quot;Morningside Heights\&quot;, \&quot;LocationID\&quot;: 166, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95707738499995, 40.8142980939999], [-73.95210125199992, 40.811442853999935], [-73.9535757779999, 40.8094766979999], [-73.95496657099991, 40.81006455499994], [-73.95964685399987, 40.80115642299993], [-73.97110765876137, 40.80579013958964], [-73.96203105797969, 40.81808633074085], [-73.95707738499995, 40.8142980939999]]]}}, {\&quot;id\&quot;: \&quot;166\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6557642487046632, \&quot;OBJECTID\&quot;: 167, \&quot;Shape_Leng\&quot;: 0.0908159737292, \&quot;Shape_Area\&quot;: 0.000167529391193, \&quot;zone\&quot;: \&quot;Morrisania/Melrose\&quot;, \&quot;LocationID\&quot;: 167, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89690017899987, 40.8310333359999], [-73.8899110649999, 40.830124191999865], [-73.88609624199987, 40.82765577699989], [-73.89483522899992, 40.82624684099993], [-73.89548522799996, 40.82824854099993], [-73.90093510699997, 40.82792810199992], [-73.9012927759998, 40.820475442999914], [-73.91181615799985, 40.82203502199991], [-73.91677400599986, 40.82438708699987], [-73.91541108199998, 40.82577390899993], [-73.91130974499993, 40.824848557999886], [-73.91169430299985, 40.82775871599993], [-73.908959903, 40.83022623299989], [-73.90553116799988, 40.82910413299989], [-73.90122534999992, 40.83549991099991], [-73.89697220299995, 40.8343452539999], [-73.89690017899987, 40.8310333359999]]]}}, {\&quot;id\&quot;: \&quot;167\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6374089068825911, \&quot;OBJECTID\&quot;: 168, \&quot;Shape_Leng\&quot;: 0.114517434155, \&quot;Shape_Area\&quot;: 0.000547058100444, \&quot;zone\&quot;: \&quot;Mott Haven/Port Morris\&quot;, \&quot;LocationID\&quot;: 168, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.92480953899991, 40.81565901999993], [-73.92309299899993, 40.81669772799995], [-73.92048117399989, 40.8145636869999], [-73.91768626999985, 40.8160812429999], [-73.9044655149999, 40.81228195999994], [-73.90229231992774, 40.80456477614167], [-73.91168831241185, 40.79662376988872], [-73.91904978748826, 40.798993935843235], [-73.9229271008289, 40.80237329482137], [-73.92762788658843, 40.80269566548149], [-73.93252708785968, 40.80882328177534], [-73.93242632000944, 40.81411751897961], [-73.93027812699984, 40.813248024999965], [-73.92731653099999, 40.81855963399991], [-73.92518486499998, 40.818012668999884], [-73.92662718199988, 40.816118958999915], [-73.92480953899991, 40.81565901999993]]], [[[-73.89833036270552, 40.80241282093997], [-73.89646668834577, 40.80079047089134], [-73.90021004993142, 40.79926415589601], [-73.90003735815736, 40.800908742050225], [-73.89833036270552, 40.80241282093997]]], [[[-73.89680883223778, 40.795808445159786], [-73.89796839783742, 40.79564483916198], [-73.89919434249981, 40.796502456018175], [-73.8978825324018, 40.79711653214704], [-73.89680883223778, 40.795808445159786]]]]}}, {\&quot;id\&quot;: \&quot;168\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6177993527508091, \&quot;OBJECTID\&quot;: 169, \&quot;Shape_Leng\&quot;: 0.0601046580332, \&quot;Shape_Area\&quot;: 0.000146027537733, \&quot;zone\&quot;: \&quot;Mount Hope\&quot;, \&quot;LocationID\&quot;: 169, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89816577499982, 40.85514637599989], [-73.89863543699985, 40.85390697499993], [-73.89560883299981, 40.85457036999986], [-73.901344046, 40.84442875099994], [-73.90483121999989, 40.84480034199987], [-73.9050151499998, 40.842404697999875], [-73.91689747599989, 40.84511773399991], [-73.91416184199993, 40.845179187999925], [-73.90557007299988, 40.855787321999884], [-73.89816577499982, 40.85514637599989]]]}}, {\&quot;id\&quot;: \&quot;169\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.33307616865493717, \&quot;OBJECTID\&quot;: 170, \&quot;Shape_Leng\&quot;: 0.0457690091051, \&quot;Shape_Area\&quot;: 7.43150675972e-05, \&quot;zone\&quot;: \&quot;Murray Hill\&quot;, \&quot;LocationID\&quot;: 170, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97203331099985, 40.745804967999945], [-73.97350835000003, 40.7437820339999], [-73.97812378199983, 40.745727172999885], [-73.98085965399994, 40.74196976799989], [-73.98407485299995, 40.74332471799989], [-73.98085054399985, 40.74775036999991], [-73.98407636100002, 40.74910212499993], [-73.98088709899987, 40.753480988999875], [-73.9744494109998, 40.75076644499991], [-73.9758346669999, 40.74886314599996], [-73.97121971999988, 40.74692154099996], [-73.97203331099985, 40.745804967999945]]]}}, {\&quot;id\&quot;: \&quot;170\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6336734693877552, \&quot;OBJECTID\&quot;: 171, \&quot;Shape_Leng\&quot;: 0.107353876244, \&quot;Shape_Area\&quot;: 0.000520099538161, \&quot;zone\&quot;: \&quot;Murray Hill-Queens\&quot;, \&quot;LocationID\&quot;: 171, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79317944599988, 40.77040317699989], [-73.79343991199988, 40.760764127999934], [-73.79076004599987, 40.76098576899991], [-73.79031517, 40.75782345099988], [-73.81104963199985, 40.761417020999964], [-73.82063593299985, 40.75887226799989], [-73.82657481899986, 40.772345397999885], [-73.82331286899986, 40.77957865999986], [-73.81452997799975, 40.77888817499992], [-73.81485850699985, 40.776485922999875], [-73.79853009399987, 40.775190728999924], [-73.79317944599988, 40.77040317699989]]]}}, {\&quot;id\&quot;: \&quot;171\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5789473684210527, \&quot;OBJECTID\&quot;: 172, \&quot;Shape_Leng\&quot;: 0.118476116148, \&quot;Shape_Area\&quot;: 0.000658402501406, \&quot;zone\&quot;: \&quot;New Dorp/Midland Beach\&quot;, \&quot;LocationID\&quot;: 172, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08654858694766, 40.56963231913558], [-74.08621632224266, 40.56853269814713], [-74.09054960106333, 40.567083597211294], [-74.09938031432728, 40.5589641933612], [-74.11376161199998, 40.56649718899993], [-74.11636336399992, 40.56391563799986], [-74.12489904399992, 40.568949141999916], [-74.12150213699994, 40.571721558999904], [-74.1215372899999, 40.57515325299986], [-74.10525775499997, 40.58592143599986], [-74.09844000899997, 40.581241705999915], [-74.10039083499996, 40.579688665999925], [-74.08597647499992, 40.57223697099986], [-74.08495715819193, 40.57125984002107], [-74.08654858694766, 40.56963231913558]]]}}, {\&quot;id\&quot;: \&quot;0\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.16460313950917532, \&quot;OBJECTID\&quot;: 1, \&quot;Shape_Leng\&quot;: 0.116357453189, \&quot;Shape_Area\&quot;: 0.0007823067885, \&quot;zone\&quot;: \&quot;Newark Airport\&quot;, \&quot;LocationID\&quot;: 1, \&quot;borough\&quot;: \&quot;EWR\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.18445299999996, 40.6949959999999], [-74.18284199999994, 40.70346499999988], [-74.17565999999994, 40.707379999999866], [-74.16081899999995, 40.70764099999991], [-74.15306999999996, 40.7052829999999], [-74.17283399999997, 40.67656399999988], [-74.17862999999994, 40.671037999999896], [-74.18503799999996, 40.67335999999989], [-74.18991599999998, 40.68154099999988], [-74.18922299999997, 40.688623999999905], [-74.18563199999994, 40.69164799999987], [-74.18445299999996, 40.6949959999999]]]}}, {\&quot;id\&quot;: \&quot;172\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.7711670480549199, \&quot;OBJECTID\&quot;: 173, \&quot;Shape_Leng\&quot;: 0.0600639661414, \&quot;Shape_Area\&quot;: 0.000178329851357, \&quot;zone\&quot;: \&quot;North Corona\&quot;, \&quot;LocationID\&quot;: 173, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85540366099997, 40.75834030899989], [-73.85312635499996, 40.75510934299989], [-73.85579909099987, 40.75440952799994], [-73.85442575299999, 40.748851725999884], [-73.86790963899986, 40.74493371599989], [-73.87365721799983, 40.756803485999946], [-73.85540366099997, 40.75834030899989]]]}}, {\&quot;id\&quot;: \&quot;173\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6394817073170732, \&quot;OBJECTID\&quot;: 174, \&quot;Shape_Leng\&quot;: 0.0678177559602, \&quot;Shape_Area\&quot;: 0.000155928664422, \&quot;zone\&quot;: \&quot;Norwood\&quot;, \&quot;LocationID\&quot;: 174, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87772817699984, 40.88345419499995], [-73.87812594399992, 40.88215382599989], [-73.87467601499999, 40.88156285199993], [-73.87494589799991, 40.87994766899988], [-73.87024100099985, 40.88022935299995], [-73.87619224999979, 40.87047671099987], [-73.8830900319999, 40.86659150899993], [-73.88146889699985, 40.868573645999916], [-73.88705142599984, 40.884349575999906], [-73.88124422499992, 40.88270963299992], [-73.87803562399996, 40.887118321999885], [-73.87772817699984, 40.88345419499995]]]}}, {\&quot;id\&quot;: \&quot;174\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4921875, \&quot;OBJECTID\&quot;: 175, \&quot;Shape_Leng\&quot;: 0.134897665102, \&quot;Shape_Area\&quot;: 0.000504920726134, \&quot;zone\&quot;: \&quot;Oakland Gardens\&quot;, \&quot;LocationID\&quot;: 175, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7562560639999, 40.7584304689999], [-73.75230259399993, 40.759455198999916], [-73.75004764499985, 40.75840465799996], [-73.74384322099985, 40.74769009599988], [-73.74625984399985, 40.74671147499993], [-73.74477587099986, 40.74328109699994], [-73.75347299999999, 40.74240484399992], [-73.75098230099987, 40.74002146199996], [-73.7439619359999, 40.74078912699986], [-73.74306820799991, 40.7384408179999], [-73.74016951799993, 40.73848189799986], [-73.75048295699996, 40.72922129399996], [-73.75669771299987, 40.7262287109999], [-73.76564374500005, 40.732533126999954], [-73.7636997919999, 40.73286411699993], [-73.76510920699994, 40.73455658499992], [-73.76248609299982, 40.736730981999884], [-73.76772991399994, 40.74577622599993], [-73.75684127399992, 40.74932207799991], [-73.76184343999986, 40.75553726899989], [-73.76239510599996, 40.759496997999854], [-73.75800131799996, 40.76037986699988], [-73.7562560639999, 40.7584304689999]]]}}, {\&quot;id\&quot;: \&quot;175\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3157894736842105, \&quot;OBJECTID\&quot;: 176, \&quot;Shape_Leng\&quot;: 0.151995190703, \&quot;Shape_Area\&quot;: 0.000657782126267, \&quot;zone\&quot;: \&quot;Oakwood\&quot;, \&quot;LocationID\&quot;: 176, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.12187198599999, 40.57510757499989], [-74.12150213699994, 40.571721558999904], [-74.12489904399992, 40.568949141999916], [-74.11636336299996, 40.56391563799985], [-74.11376161199998, 40.56649718899993], [-74.09992914200652, 40.55907068582615], [-74.10140516910823, 40.555538526164405], [-74.10309839111532, 40.555904641451136], [-74.10484447636338, 40.55302581455626], [-74.10768623464054, 40.553976671477514], [-74.11301046102231, 40.547780065214994], [-74.12730057799996, 40.55729517199993], [-74.13321002499998, 40.552383875999936], [-74.13885092699991, 40.5569511789999], [-74.13170009, 40.56453574899991], [-74.1443874499999, 40.56970609999989], [-74.14418588199999, 40.57203740999988], [-74.13261022999991, 40.573530162999894], [-74.12708814799998, 40.57636910599995], [-74.12187198599999, 40.57510757499989]]]}}, {\&quot;id\&quot;: \&quot;176\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5387278234530506, \&quot;OBJECTID\&quot;: 177, \&quot;Shape_Leng\&quot;: 0.0715805407056, \&quot;Shape_Area\&quot;: 0.000198894762248, \&quot;zone\&quot;: \&quot;Ocean Hill\&quot;, \&quot;LocationID\&quot;: 177, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90287079599995, 40.6786314149999], [-73.90004626199993, 40.67689308999995], [-73.92275257199998, 40.667097332999894], [-73.92164666399992, 40.67886992299994], [-73.9163011989999, 40.67857711199991], [-73.91804607, 40.68721324799989], [-73.90287079599995, 40.6786314149999]]]}}, {\&quot;id\&quot;: \&quot;177\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5568573397656789, \&quot;OBJECTID\&quot;: 178, \&quot;Shape_Leng\&quot;: 0.0682528770739, \&quot;Shape_Area\&quot;: 0.000175805409143, \&quot;zone\&quot;: \&quot;Ocean Parkway South\&quot;, \&quot;LocationID\&quot;: 178, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97080408199997, 40.62593266699988], [-73.96864510599995, 40.6219416949999], [-73.96471983399981, 40.62237296099993], [-73.96285973999984, 40.61254948599989], [-73.96478112799986, 40.61233092199988], [-73.96429649899991, 40.60977642599992], [-73.97403097799986, 40.608702309999906], [-73.97517176999993, 40.61472418599991], [-73.97290326899996, 40.61415296799988], [-73.97335879399992, 40.616541714999904], [-73.97537335500002, 40.6157547219999], [-73.97785009299986, 40.617287605999906], [-73.97539380499998, 40.62076998699995], [-73.97705352899999, 40.62153252199987], [-73.9772614999999, 40.625852772999906], [-73.97080408199997, 40.62593266699988]]]}}, {\&quot;id\&quot;: \&quot;178\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4905891712293509, \&quot;OBJECTID\&quot;: 179, \&quot;Shape_Leng\&quot;: 0.0713808644377, \&quot;Shape_Area\&quot;: 0.000183893478476, \&quot;zone\&quot;: \&quot;Old Astoria\&quot;, \&quot;LocationID\&quot;: 179, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93290347544752, 40.77794449857707], [-73.92782147400004, 40.776697526999946], [-73.91770217299991, 40.7703931119999], [-73.91995596899991, 40.768440064999865], [-73.91849336999996, 40.76773465699995], [-73.91977764799998, 40.7661521839999], [-73.92218946199995, 40.767267356999895], [-73.92425288799978, 40.76472456399995], [-73.93344468499993, 40.768817789999915], [-73.93493511099992, 40.76701302399987], [-73.93618379699991, 40.767691800999934], [-73.93424609600005, 40.771029275999894], [-73.93746638537067, 40.77253149512518], [-73.93765483090819, 40.775085685383594], [-73.93508232492144, 40.77794423372776], [-73.93290347544752, 40.77794449857707]]]}}, {\&quot;id\&quot;: \&quot;179\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5601821730644112, \&quot;OBJECTID\&quot;: 180, \&quot;Shape_Leng\&quot;: 0.0805277671523, \&quot;Shape_Area\&quot;: 0.000247682193353, \&quot;zone\&quot;: \&quot;Ozone Park\&quot;, \&quot;LocationID\&quot;: 180, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84119605699982, 40.68335136599989], [-73.83334819299995, 40.66677318699994], [-73.86131863599985, 40.6750212689999], [-73.86334943599995, 40.67935163999989], [-73.85878576899987, 40.68063046299989], [-73.85819836099995, 40.67943084899987], [-73.85392389199987, 40.679686155999875], [-73.85099089299987, 40.68056836699987], [-73.85197864599989, 40.682564210999864], [-73.84786817599985, 40.681486831999905], [-73.84119605699982, 40.68335136599989]]]}}, {\&quot;id\&quot;: \&quot;180\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.376107582178342, \&quot;OBJECTID\&quot;: 181, \&quot;Shape_Leng\&quot;: 0.0895372399547, \&quot;Shape_Area\&quot;: 0.000306890292807, \&quot;zone\&quot;: \&quot;Park Slope\&quot;, \&quot;LocationID\&quot;: 181, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97583132299987, 40.66581507999991], [-73.97965353499985, 40.661243232999915], [-73.98223034199995, 40.66214149299991], [-73.985086794, 40.65901328799989], [-73.988716511, 40.66240493799995], [-73.9906354539999, 40.66057908799997], [-73.99692689899985, 40.664374914999925], [-73.99490350199993, 40.66678543499988], [-73.99277080699981, 40.665507280999876], [-73.97804289599988, 40.68485661499987], [-73.97375598499991, 40.68303401999988], [-73.97618051399984, 40.67806432099995], [-73.96949738899991, 40.67590637999996], [-73.96871822199984, 40.67392423399988], [-73.97583132299987, 40.66581507999991]]]}}, {\&quot;id\&quot;: \&quot;181\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6496305418719212, \&quot;OBJECTID\&quot;: 182, \&quot;Shape_Leng\&quot;: 0.0393606369479, \&quot;Shape_Area\&quot;: 9.10644156732e-05, \&quot;zone\&quot;: \&quot;Parkchester\&quot;, \&quot;LocationID\&quot;: 182, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85465135700002, 40.83388802699987], [-73.86271114399993, 40.83299150899997], [-73.86448011799995, 40.84108779699994], [-73.85333524999986, 40.84247015499987], [-73.85168459699997, 40.8342010519999], [-73.85465135700002, 40.83388802699987]]]}}, {\&quot;id\&quot;: \&quot;182\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.620253164556962, \&quot;OBJECTID\&quot;: 183, \&quot;Shape_Leng\&quot;: 0.0398262960348, \&quot;Shape_Area\&quot;: 9.51929451066e-05, \&quot;zone\&quot;: \&quot;Pelham Bay\&quot;, \&quot;LocationID\&quot;: 183, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83676643699985, 40.84338596999994], [-73.83463970299987, 40.853817993999904], [-73.82860197199996, 40.85571784799988], [-73.82721751200002, 40.853250512999935], [-73.82799676999998, 40.84862431399989], [-73.82611300699996, 40.84533869399991], [-73.83676643699985, 40.84338596999994]]]}}, {\&quot;id\&quot;: \&quot;183\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.489247311827957, \&quot;OBJECTID\&quot;: 184, \&quot;Shape_Leng\&quot;: 0.260815683043, \&quot;Shape_Area\&quot;: 0.00198883363103, \&quot;zone\&quot;: \&quot;Pelham Bay Park\&quot;, \&quot;LocationID\&quot;: 184, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.80728647099995, 40.885931813999875], [-73.79322870891143, 40.88282259495222], [-73.80087270458245, 40.87159011989393], [-73.80252284756597, 40.87050664469679], [-73.80339117523091, 40.87250503763108], [-73.80431849468228, 40.87115974106797], [-73.80302203685277, 40.86915511979648], [-73.80588410012888, 40.869068502184916], [-73.80841596818787, 40.87118969336752], [-73.80464604502912, 40.86664711643685], [-73.80300388108948, 40.86704183656889], [-73.80225816157765, 40.8656082064109], [-73.79780377219292, 40.87225613227397], [-73.794790446816, 40.873200484033966], [-73.79384702788171, 40.87859445979086], [-73.7895587294431, 40.881261284915404], [-73.789523093688, 40.87899812706048], [-73.7843816810755, 40.878420531670514], [-73.78719087560506, 40.872730553729134], [-73.78508139658601, 40.87358996322568], [-73.78526152075709, 40.87174532233236], [-73.78358738486025, 40.87378095468029], [-73.78320175426292, 40.87067036085376], [-73.78560245305444, 40.86834165222368], [-73.78795446145405, 40.86984541906357], [-73.79139032586131, 40.868141307466146], [-73.79190454927502, 40.86082956271207], [-73.79454562318031, 40.85888825916121], [-73.79435005934273, 40.85652702380392], [-73.7987225560008, 40.85491440117259], [-73.79780522990592, 40.85194959859714], [-73.80040387554423, 40.84810822100142], [-73.80417557932397, 40.853340120189074], [-73.80478410547944, 40.86154633053462], [-73.80592716427573, 40.86194119699028], [-73.80612390783546, 40.85981220661901], [-73.80783343870087, 40.860318133305384], [-73.80768048107562, 40.858538063289515], [-73.81411414337536, 40.86373145821164], [-73.81641392102723, 40.86118062770394], [-73.81273146495035, 40.85887754194771], [-73.81230602708418, 40.854162026473176], [-73.81684183599076, 40.85362521315728], [-73.81712409042197, 40.85126957344483], [-73.81507165904237, 40.84913361979451], [-73.82495697699986, 40.846105444999864], [-73.82517999, 40.842700058999874], [-73.82624132899997, 40.84299359399996], [-73.82799676999987, 40.8486243129999], [-73.82723026100001, 40.853350756999895], [-73.82860197199996, 40.85571784799988], [-73.83283502299986, 40.8560358449999], [-73.82834347399992, 40.86089202599988], [-73.82699653199998, 40.85908778599986], [-73.82037552999996, 40.86103300499993], [-73.81578764099999, 40.8657580609999], [-73.821266938, 40.869071605999885], [-73.82329599399986, 40.87309741799988], [-73.81992586499996, 40.88211933299987], [-73.82027432999985, 40.885550699999925], [-73.81442762200005, 40.88677196499989], [-73.80728647099995, 40.885931813999875]]], [[[-73.78650554049733, 40.880940134479225], [-73.78578002611279, 40.88036396266133], [-73.78742039384403, 40.87977089028999], [-73.787127834652, 40.88092346317125], [-73.78650554049733, 40.880940134479225]]], [[[-73.78103351104939, 40.87648400204775], [-73.78120649649391, 40.87628502546013], [-73.78132704118002, 40.87636132654635], [-73.78112767478156, 40.87665268050809], [-73.78103351104939, 40.87648400204775]]], [[[-73.78241811865315, 40.87492327042177], [-73.78265785360905, 40.87479265669398], [-73.78280207510406, 40.87494886620542], [-73.78247604125525, 40.87516813337884], [-73.78241811865315, 40.87492327042177]]], [[[-73.77435244645233, 40.874169955874805], [-73.77453640510954, 40.87471001543833], [-73.77409538292126, 40.87489618448013], [-73.7740318153443, 40.874394774956215], [-73.77435244645233, 40.874169955874805]]], [[[-73.78605394964902, 40.873782646192794], [-73.78618924358646, 40.87359972769974], [-73.78633325996694, 40.87367772488745], [-73.7861946371647, 40.87388531941464], [-73.78605394964902, 40.873782646192794]]], [[[-73.78648510546586, 40.87320925495041], [-73.7867268909535, 40.87307453926568], [-73.78626202153426, 40.87339368663393], [-73.78632869488987, 40.873271144554096], [-73.78648510546586, 40.87320925495041]]], [[[-73.77080975398195, 40.871549946847985], [-73.76990710668544, 40.87047694447026], [-73.77288042665229, 40.871245263430254], [-73.77217786492288, 40.87198111068936], [-73.77080975398195, 40.871549946847985]]], [[[-73.76668965841925, 40.86709778162448], [-73.76709907439783, 40.8667045727482], [-73.76779449382023, 40.86678117376544], [-73.76760072096499, 40.86749638654143], [-73.76668965841925, 40.86709778162448]]], [[[-73.76964988627088, 40.86548557242442], [-73.76979148260493, 40.86512823356445], [-73.77022931630273, 40.865138939396005], [-73.770068972998, 40.86552587618341], [-73.76964988627088, 40.86548557242442]]], [[[-73.78401249138903, 40.863131994074394], [-73.78376770348979, 40.86261060846434], [-73.78469165850701, 40.86254278990822], [-73.7842865050008, 40.86320508878048], [-73.78401249138903, 40.863131994074394]]], [[[-73.78312589594455, 40.862856167300684], [-73.7828819783119, 40.862406433091266], [-73.7831450428813, 40.86206867890555], [-73.78328053505923, 40.86278070671258], [-73.78312589594455, 40.862856167300684]]], [[[-73.77460156350928, 40.86206904745972], [-73.7749432115575, 40.861391499889486], [-73.77529297955127, 40.86123200821588], [-73.77485681624742, 40.86198363433426], [-73.77460156350928, 40.86206904745972]]], [[[-73.77290231992438, 40.86120858327854], [-73.77323150244695, 40.86074716979338], [-73.77351264165688, 40.861241184087085], [-73.77310632921937, 40.861614575032775], [-73.77290231992438, 40.86120858327854]]], [[[-73.8022229535527, 40.84163481314409], [-73.80263811156135, 40.841081153267076], [-73.80694608641589, 40.84146244718637], [-73.80680801372397, 40.84248913998752], [-73.8022229535527, 40.84163481314409]]]]}}, {\&quot;id\&quot;: \&quot;184\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6146718146718146, \&quot;OBJECTID\&quot;: 185, \&quot;Shape_Leng\&quot;: 0.0861619681636, \&quot;Shape_Area\&quot;: 0.000228537100218, \&quot;zone\&quot;: \&quot;Pelham Parkway\&quot;, \&quot;LocationID\&quot;: 185, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84004614299985, 40.857806268999866], [-73.83499552599994, 40.85657120099989], [-73.84049767399992, 40.8541841049999], [-73.84494053799982, 40.8482182209999], [-73.84430846999992, 40.85119046399989], [-73.85304526899994, 40.849547331999865], [-73.85457388299992, 40.85150834599995], [-73.86250923799993, 40.84836228099987], [-73.86303938099996, 40.850611306999944], [-73.86860515599989, 40.85206864599991], [-73.86990421600002, 40.85577329299987], [-73.8681883059999, 40.858063833999964], [-73.84004614299985, 40.857806268999866]]]}}, {\&quot;id\&quot;: \&quot;185\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4211778279738312, \&quot;OBJECTID\&quot;: 186, \&quot;Shape_Leng\&quot;: 0.0246963902234, \&quot;Shape_Area\&quot;: 3.70729416953e-05, \&quot;zone\&quot;: \&quot;Penn Station/Madison Sq West\&quot;, \&quot;LocationID\&quot;: 186, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99096832799995, 40.74542088999985], [-73.99709902899994, 40.74720510199991], [-73.99346417699986, 40.75219005499987], [-73.98776905899994, 40.749787028999926], [-73.99096832799995, 40.74542088999985]]]}}, {\&quot;id\&quot;: \&quot;186\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4489795918367347, \&quot;OBJECTID\&quot;: 187, \&quot;Shape_Leng\&quot;: 0.126868431324, \&quot;Shape_Area\&quot;: 0.000421195755741, \&quot;zone\&quot;: \&quot;Port Richmond\&quot;, \&quot;LocationID\&quot;: 187, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.13435269573621, 40.64188679740515], [-74.12890729033458, 40.64119482758617], [-74.1268887269999, 40.637210087999925], [-74.12867047299994, 40.63734826499993], [-74.13047428999985, 40.6308855089999], [-74.13806393799992, 40.627568470999904], [-74.13581008299997, 40.62506433999991], [-74.13826358199992, 40.624243769999936], [-74.13982184799993, 40.61629982499988], [-74.14603562099998, 40.61701277699996], [-74.14696864199988, 40.610151355999896], [-74.15018666499996, 40.60949781099991], [-74.15379116699992, 40.612255611999906], [-74.15231170399994, 40.61716275599988], [-74.14622812499992, 40.6249253619999], [-74.14554071999994, 40.62783252199995], [-74.14752618999992, 40.62938928799988], [-74.14478228999994, 40.637953779999904], [-74.14229766980965, 40.64030580709358], [-74.13435269573621, 40.64188679740515]]], [[[-74.12117246275159, 40.64166914557247], [-74.12128074797168, 40.64143249599354], [-74.12131194814832, 40.64145253116248], [-74.12117246275159, 40.64166914557247]]], [[[-74.1215534360538, 40.64161162832474], [-74.12176052602824, 40.64157431506241], [-74.12175764698422, 40.64142342422718], [-74.12177911197513, 40.641592547117035], [-74.1215534360538, 40.64161162832474]]], [[[-74.12107727405213, 40.64160742058869], [-74.12118039503834, 40.64138344518971], [-74.12121470277087, 40.64139683999368], [-74.12110124737936, 40.64161328229901], [-74.12107727405213, 40.64160742058869]]], [[[-74.12130529083001, 40.64160070313003], [-74.12137332919554, 40.64147647512165], [-74.12132617111645, 40.64160656922885], [-74.12130529083001, 40.64160070313003]]], [[[-74.12185329597821, 40.64158069227959], [-74.12180661091023, 40.64141215903768], [-74.1218414704778, 40.641405894387034], [-74.12199083807539, 40.64155463949942], [-74.12185329597821, 40.64158069227959]]], [[[-74.12270319595869, 40.64137664893253], [-74.12272114424832, 40.64134762377306], [-74.12276203509289, 40.641426635297144], [-74.12271103075855, 40.641433755252706], [-74.12270319595869, 40.64137664893253]]], [[[-74.12613276551227, 40.6412643880282], [-74.1259954246122, 40.640231242814394], [-74.12636808688976, 40.64133238048696], [-74.12564026870598, 40.64141849208226], [-74.12613276551227, 40.6412643880282]]]]}}, {\&quot;id\&quot;: \&quot;188\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.38907375217283335, \&quot;OBJECTID\&quot;: 189, \&quot;Shape_Leng\&quot;: 0.0486743306502, \&quot;Shape_Area\&quot;: 0.000101427594033, \&quot;zone\&quot;: \&quot;Prospect Heights\&quot;, \&quot;LocationID\&quot;: 189, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96070974499996, 40.673121393999985], [-73.96131877999991, 40.67140667599988], [-73.96892332199981, 40.67293755299988], [-73.96949738899991, 40.67590637999996], [-73.97618051399984, 40.67806432099995], [-73.97375598499991, 40.68303401999988], [-73.96134655899995, 40.6804635239999], [-73.96318238899983, 40.675529503999876], [-73.96007428300001, 40.67487807099994], [-73.96070974499996, 40.673121393999985]]]}}, {\&quot;id\&quot;: \&quot;189\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.43336449568920743, \&quot;OBJECTID\&quot;: 190, \&quot;Shape_Leng\&quot;: 0.0743294660829, \&quot;Shape_Area\&quot;: 0.000270873666522, \&quot;zone\&quot;: \&quot;Prospect Park\&quot;, \&quot;LocationID\&quot;: 190, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96307724199983, 40.66213019499987], [-73.96190028499997, 40.65487096199992], [-73.96621321999996, 40.653189404999885], [-73.96465438699984, 40.650887727999894], [-73.97139631700004, 40.64825778599986], [-73.97436701299992, 40.65818790399992], [-73.98022902599985, 40.660985325999896], [-73.96865541400003, 40.673023838999924], [-73.96258784899996, 40.671711596999884], [-73.96095595499996, 40.66328505499992], [-73.96307724199983, 40.66213019499987]]]}}, {\&quot;id\&quot;: \&quot;187\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5083754107557906, \&quot;OBJECTID\&quot;: 188, \&quot;Shape_Leng\&quot;: 0.0977983968367, \&quot;Shape_Area\&quot;: 0.000313003032771, \&quot;zone\&quot;: \&quot;Prospect-Lefferts Gardens\&quot;, \&quot;LocationID\&quot;: 188, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95729172699996, 40.6643026319999], [-73.94269628999989, 40.664055128999934], [-73.94282892199992, 40.6628474859999], [-73.93068465499985, 40.66362047699992], [-73.92646424299983, 40.659814361999956], [-73.92834017599988, 40.660060035999884], [-73.92799465199988, 40.65680210099988], [-73.9500666489999, 40.65542299699989], [-73.94957113100006, 40.65080789999991], [-73.9587078989999, 40.65038727299989], [-73.95986103199981, 40.65563478899989], [-73.96190028499997, 40.65487096199992], [-73.96307724199983, 40.66213019499987], [-73.95729172699996, 40.6643026319999]]]}}, {\&quot;id\&quot;: \&quot;190\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6291390728476821, \&quot;OBJECTID\&quot;: 191, \&quot;Shape_Leng\&quot;: 0.130932637664, \&quot;Shape_Area\&quot;: 0.000688460603185, \&quot;zone\&quot;: \&quot;Queens Village\&quot;, \&quot;LocationID\&quot;: 191, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.73016587199996, 40.72395859599988], [-73.72816233910697, 40.7230841398913], [-73.73032628984046, 40.722157296892334], [-73.7269714679152, 40.710714504016735], [-73.72677759516957, 40.7030592911994], [-73.74590871000004, 40.70228727399988], [-73.74500119100004, 40.70026221299988], [-73.74773012199991, 40.69955313699991], [-73.74618157999997, 40.696121925999904], [-73.74863325999986, 40.6954447609999], [-73.75205066499986, 40.70522802799995], [-73.75047058199985, 40.70563993099994], [-73.75725671499985, 40.71813860199992], [-73.7523343839998, 40.72026246099993], [-73.75669771299987, 40.7262287109999], [-73.74672140400006, 40.73247715099991], [-73.74555667199989, 40.73063689799994], [-73.7314721509999, 40.727411794999924], [-73.73016587199996, 40.72395859599988]]]}}, {\&quot;id\&quot;: \&quot;191\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6389183457051962, \&quot;OBJECTID\&quot;: 192, \&quot;Shape_Leng\&quot;: 0.11196461971, \&quot;Shape_Area\&quot;: 0.000373808019026, \&quot;zone\&quot;: \&quot;Queensboro Hill\&quot;, \&quot;LocationID\&quot;: 192, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82239598999983, 40.74986422299986], [-73.81416171999987, 40.74613857999992], [-73.80750599299991, 40.750136586999936], [-73.80287666499983, 40.749765149999895], [-73.8033521419999, 40.74643196499987], [-73.7946756879998, 40.74721192799994], [-73.79453507400001, 40.74450763799989], [-73.79723084999992, 40.74169550699993], [-73.79640218700004, 40.73828235799987], [-73.8243501109999, 40.73975360599992], [-73.82946751999994, 40.737024481999896], [-73.83143025500006, 40.73913573299994], [-73.83113122799989, 40.74233799999994], [-73.83586131899989, 40.743227984999926], [-73.83392218299996, 40.74753207499989], [-73.82584440999999, 40.74934839099993], [-73.82426493799994, 40.75183288799992], [-73.82239598999983, 40.74986422299986]]]}}, {\&quot;id\&quot;: \&quot;192\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5230718942379283, \&quot;OBJECTID\&quot;: 193, \&quot;Shape_Leng\&quot;: 0.0655299584801, \&quot;Shape_Area\&quot;: 0.000145591657944, \&quot;zone\&quot;: \&quot;Queensbridge/Ravenswood\&quot;, \&quot;LocationID\&quot;: 193, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93522718099996, 40.76952572899989], [-73.93858976899998, 40.766817358999916], [-73.93398092199995, 40.76282598199987], [-73.944052652, 40.75231325999992], [-73.95080763809156, 40.75526368005708], [-73.9413117494144, 40.76691800476961], [-73.93424609599985, 40.771029274999925], [-73.93522718099996, 40.76952572899989]]]}}, {\&quot;id\&quot;: \&quot;193\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.35847492747617077, \&quot;OBJECTID\&quot;: 194, \&quot;Shape_Leng\&quot;: 0.0817938353532, \&quot;Shape_Area\&quot;: 0.000273481702719, \&quot;zone\&quot;: \&quot;Randalls Island\&quot;, \&quot;LocationID\&quot;: 194, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91639852914044, 40.79768484203896], [-73.91378385370595, 40.793836285482065], [-73.92412113996787, 40.78252307401082], [-73.92810118993664, 40.78092032002105], [-73.93598226003293, 40.7839423680532], [-73.93084178719639, 40.79099143000079], [-73.9261041024332, 40.79073160730996], [-73.92560814781015, 40.79189695828146], [-73.9278688922052, 40.79095483831721], [-73.9283194359912, 40.79309126608271], [-73.9254929354651, 40.80195616882528], [-73.92263378594883, 40.80186873814113], [-73.91639852914044, 40.79768484203896]]]}}, {\&quot;id\&quot;: \&quot;194\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4375217059109537, \&quot;OBJECTID\&quot;: 195, \&quot;Shape_Leng\&quot;: 0.131308244067, \&quot;Shape_Area\&quot;: 0.000801651953985, \&quot;zone\&quot;: \&quot;Red Hook\&quot;, \&quot;LocationID\&quot;: 195, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0071710969999, 40.68635700999991], [-74.00485241599992, 40.685668130999886], [-74.00596041099988, 40.683362870999936], [-73.9986188799999, 40.67183017199989], [-74.00289483876944, 40.66734846594933], [-74.0058636618068, 40.66799376258568], [-74.00683236078251, 40.666049645526776], [-74.00696707834247, 40.666052182356665], [-74.00543926529353, 40.6709214682384], [-74.00754821618384, 40.66705174573358], [-74.00708724221813, 40.668591358535764], [-74.00985411855632, 40.668523628335336], [-74.01154017543327, 40.6650859197566], [-74.01574872882654, 40.6645683362916], [-74.01690267361069, 40.66484660233888], [-74.01933946871777, 40.671624948422625], [-74.01751037086694, 40.671034530984144], [-74.01648665554487, 40.664930508953816], [-74.01227967872792, 40.66573241415882], [-74.01033845947926, 40.669078195448], [-74.01162527521356, 40.670581028275876], [-74.01424926931875, 40.66972860473708], [-74.01175350509699, 40.670657757578326], [-74.0151998057007, 40.6707540276644], [-74.01423289452782, 40.67213000051297], [-74.01568625497515, 40.671038834928844], [-74.0129758779219, 40.67332791872093], [-74.01632099922307, 40.6729082695637], [-74.01496392184576, 40.67467763029424], [-74.0188009477692, 40.6722507648487], [-74.01727138470127, 40.67360864580548], [-74.0188577695892, 40.6751022924089], [-74.01791198226178, 40.676510462801936], [-74.01995197864673, 40.67710301044993], [-74.01825267004557, 40.67855288672587], [-74.01928128101008, 40.67964814029763], [-74.01282000316418, 40.68362241624865], [-74.01410549647976, 40.68171251937541], [-74.013018354221, 40.68041237401427], [-74.00967108558879, 40.683268727715], [-74.01193259955522, 40.683887749077535], [-74.0071710969999, 40.68635700999991]]]}}, {\&quot;id\&quot;: \&quot;195\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.576746434614455, \&quot;OBJECTID\&quot;: 196, \&quot;Shape_Leng\&quot;: 0.0832421106332, \&quot;Shape_Area\&quot;: 0.0001974713336, \&quot;zone\&quot;: \&quot;Rego Park\&quot;, \&quot;LocationID\&quot;: 196, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85762923599995, 40.728606921999884], [-73.8594198799999, 40.726464837999885], [-73.85727108100001, 40.72568129799988], [-73.85805416899993, 40.72444540599986], [-73.86203833799982, 40.72595678499994], [-73.8586809759999, 40.72261243999988], [-73.85729287299985, 40.711467676999874], [-73.85975932900001, 40.711845058999856], [-73.86003789899996, 40.71493223599987], [-73.86929270499994, 40.72443592899991], [-73.87146074199987, 40.729326373999854], [-73.87509154199992, 40.73067136299992], [-73.85886555799988, 40.73593913899987], [-73.85625665099991, 40.73095912299993], [-73.85851097899999, 40.73028680199993], [-73.85762923599995, 40.728606921999884]]]}}, {\&quot;id\&quot;: \&quot;196\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5873639121898983, \&quot;OBJECTID\&quot;: 197, \&quot;Shape_Leng\&quot;: 0.108568532229, \&quot;Shape_Area\&quot;: 0.000504689160432, \&quot;zone\&quot;: \&quot;Richmond Hill\&quot;, \&quot;LocationID\&quot;: 197, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83696237799982, 40.70421245199992], [-73.83152109599999, 40.70138962899994], [-73.82245890399994, 40.70365553099989], [-73.81637824499992, 40.70245196399987], [-73.81063298299996, 40.69194738299988], [-73.82501128899997, 40.68795231799991], [-73.82599347399987, 40.689953661999894], [-73.82851136799994, 40.689239055999934], [-73.82753021399995, 40.687239482999914], [-73.83807769099997, 40.68423890999988], [-73.83697486299991, 40.6819880179999], [-73.84012856099982, 40.6811466509999], [-73.84947763499991, 40.69819580699987], [-73.83696237799982, 40.70421245199992]]]}}, {\&quot;id\&quot;: \&quot;197\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5301869033212316, \&quot;OBJECTID\&quot;: 198, \&quot;Shape_Leng\&quot;: 0.134094242763, \&quot;Shape_Area\&quot;: 0.000499809882564, \&quot;zone\&quot;: \&quot;Ridgewood\&quot;, \&quot;LocationID\&quot;: 198, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90768387299997, 40.71737969499987], [-73.90639010099999, 40.71736369199989], [-73.90537582199983, 40.71287658099986], [-73.88006267699978, 40.71265257399993], [-73.87761134199985, 40.70716770499993], [-73.88911917799989, 40.705598876999915], [-73.90123290699994, 40.69144227899997], [-73.90579597099993, 40.69412715499987], [-73.9042601839999, 40.69570037099989], [-73.91180820099989, 40.69993800299986], [-73.91067882699998, 40.701045968999914], [-73.91290404099983, 40.70236189199989], [-73.91180710099992, 40.703434952999864], [-73.92189184699987, 40.709396095999836], [-73.92074519699985, 40.71052968599989], [-73.92404011299993, 40.714008312999916], [-73.91077807399988, 40.71318759999986], [-73.91283037699992, 40.71536090799986], [-73.90965980099996, 40.71779315499991], [-73.90768387299997, 40.71737969499987]]]}}, {\&quot;id\&quot;: \&quot;198\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.36363636363636365, \&quot;OBJECTID\&quot;: 199, \&quot;Shape_Leng\&quot;: 0.0778085005169, \&quot;Shape_Area\&quot;: 0.000288747549303, \&quot;zone\&quot;: \&quot;Rikers Island\&quot;, \&quot;LocationID\&quot;: 199, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88885148496314, 40.79870632895875], [-73.88665108524579, 40.79803819669988], [-73.88375741590156, 40.79570856541983], [-73.87288457445655, 40.79145210820714], [-73.87080888583708, 40.78789669184152], [-73.87308761694455, 40.78585495239161], [-73.8783068007881, 40.785356620754236], [-73.88905212421602, 40.78737256012899], [-73.89282283610926, 40.79281708195147], [-73.89179289686568, 40.79677524575864], [-73.88885148496314, 40.79870632895875]]]}}, {\&quot;id\&quot;: \&quot;199\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5158437730287398, \&quot;OBJECTID\&quot;: 200, \&quot;Shape_Leng\&quot;: 0.112661735435, \&quot;Shape_Area\&quot;: 0.000744643168558, \&quot;zone\&quot;: \&quot;Riverdale/North Riverdale/Fieldston\&quot;, \&quot;LocationID\&quot;: 200, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.896411335, 40.90450452099991], [-73.89643170799987, 40.89365527899989], [-73.89787887499983, 40.89027610099993], [-73.9028594909999, 40.88916474399989], [-73.90413642399992, 40.887080708999896], [-73.90975930299997, 40.889250027999886], [-73.91489276999991, 40.8846247709999], [-73.92058641888602, 40.88718267830985], [-73.9103325682445, 40.91553277700258], [-73.89663333881637, 40.911417374923055], [-73.896411335, 40.90450452099991]]]}}, {\&quot;id\&quot;: \&quot;200\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40789473684210525, \&quot;OBJECTID\&quot;: 201, \&quot;Shape_Leng\&quot;: 0.130404117686, \&quot;Shape_Area\&quot;: 0.000619350747819, \&quot;zone\&quot;: \&quot;Rockaway Park\&quot;, \&quot;LocationID\&quot;: 201, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.81849901800001, 40.5873623529999], [-73.81544517899997, 40.58337349199993], [-73.81730795916116, 40.58233475897], [-73.86255286029154, 40.56681001230082], [-73.86662812000002, 40.573057648999914], [-73.8504438514919, 40.582130243581396], [-73.83929597982016, 40.581863545478186], [-73.82480116623435, 40.587154615369926], [-73.81849901800001, 40.5873623529999]]]}}, {\&quot;id\&quot;: \&quot;201\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4365333836288193, \&quot;OBJECTID\&quot;: 202, \&quot;Shape_Leng\&quot;: 0.0699215712618, \&quot;Shape_Area\&quot;: 0.000106175396322, \&quot;zone\&quot;: \&quot;Roosevelt Island\&quot;, \&quot;LocationID\&quot;: 202, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94180032729437, 40.76904692662474], [-73.95254079336881, 40.757095314537246], [-73.96158304969282, 40.74941430105318], [-73.94472478498723, 40.76978627176733], [-73.94007665725826, 40.77292618617896], [-73.94180032729437, 40.76904692662474]]]}}, {\&quot;id\&quot;: \&quot;202\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4336734693877551, \&quot;OBJECTID\&quot;: 203, \&quot;Shape_Leng\&quot;: 0.189937815868, \&quot;Shape_Area\&quot;: 0.000615129861659, \&quot;zone\&quot;: \&quot;Rosedale\&quot;, \&quot;LocationID\&quot;: 203, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7275350030123, 40.673930284146124], [-73.72833071887973, 40.66304394386548], [-73.72522608103498, 40.652001000073724], [-73.74143706021165, 40.646889178160706], [-73.74227387212949, 40.64012338122567], [-73.739471216134, 40.63570643191466], [-73.74246642615259, 40.635119228252094], [-73.74096487686366, 40.63730477503007], [-73.74397128496219, 40.63788001261484], [-73.7437342150463, 40.6390221176639], [-73.7464954765674, 40.63651030383521], [-73.74516219973704, 40.63811218797305], [-73.74704226024105, 40.636932365240085], [-73.74631467883957, 40.641394313090785], [-73.7487767478731, 40.64511819098248], [-73.75522386899995, 40.64744446899989], [-73.7541108669999, 40.648697664999915], [-73.76406290099993, 40.65435626599989], [-73.76165732899996, 40.658238085999855], [-73.74867194699979, 40.65267808799992], [-73.74332546799988, 40.652537803999905], [-73.74328714099991, 40.65613473199991], [-73.74853177199994, 40.65757569699993], [-73.74281884699987, 40.66530554899986], [-73.73891022900001, 40.66595449199986], [-73.74117817299991, 40.666402953999885], [-73.72718272499995, 40.68359732999987], [-73.72586264191175, 40.683241080973865], [-73.72563005109944, 40.67958795089065], [-73.7275350030123, 40.673930284146124]]]}}, {\&quot;id\&quot;: \&quot;203\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.2608695652173913, \&quot;OBJECTID\&quot;: 204, \&quot;Shape_Leng\&quot;: 0.101912418311, \&quot;Shape_Area\&quot;: 0.000641384265972, \&quot;zone\&quot;: \&quot;Rossville/Woodrow\&quot;, \&quot;LocationID\&quot;: 204, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.2032648999999, 40.55562847699989], [-74.19174368799999, 40.53191669699986], [-74.20152661599995, 40.526265205999934], [-74.2156723039999, 40.52395762799989], [-74.21800676499996, 40.53229858999995], [-74.21776941599994, 40.54112662999992], [-74.22131562699998, 40.55025307399992], [-74.21784397799998, 40.55443271799988], [-74.21050789400002, 40.557064181999934], [-74.205854485, 40.55750245699993], [-74.2032648999999, 40.55562847699989]]]}}, {\&quot;id\&quot;: \&quot;204\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5065573770491804, \&quot;OBJECTID\&quot;: 205, \&quot;Shape_Leng\&quot;: 0.141953388327, \&quot;Shape_Area\&quot;: 0.000766216513505, \&quot;zone\&quot;: \&quot;Saint Albans\&quot;, \&quot;LocationID\&quot;: 205, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.766369252, 40.70256339699992], [-73.75205066499986, 40.70522802799995], [-73.74863325999986, 40.6954447609999], [-73.7435928609999, 40.69621532499986], [-73.75576169199995, 40.67588590899988], [-73.76380484799996, 40.67376993299995], [-73.77469730199986, 40.680486045999906], [-73.77220275299989, 40.681610338999896], [-73.7732870399999, 40.683454731999866], [-73.77699767599997, 40.68628268899992], [-73.77966850599998, 40.685377122999945], [-73.7832662499999, 40.68999429299992], [-73.78078155499992, 40.69102994299994], [-73.77977295099997, 40.689281169999916], [-73.77789337399993, 40.68991768999992], [-73.7802372379999, 40.692972334999894], [-73.77230768699997, 40.70057150699989], [-73.77559218799982, 40.70532930899986], [-73.7749009329999, 40.707066661999875], [-73.76844546499984, 40.709637026999886], [-73.766369252, 40.70256339699992]]]}}, {\&quot;id\&quot;: \&quot;205\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.44565217391304346, \&quot;OBJECTID\&quot;: 206, \&quot;Shape_Leng\&quot;: 0.212756793386, \&quot;Shape_Area\&quot;: 0.000944392507762, \&quot;zone\&quot;: \&quot;Saint George/New Brighton\&quot;, \&quot;LocationID\&quot;: 206, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08221272914942, 40.64828016229008], [-74.07165829759784, 40.64503374643502], [-74.07093784471476, 40.64334596384062], [-74.07210952444638, 40.64246321679278], [-74.07032923715386, 40.64252612813239], [-74.07314400586021, 40.641852974480116], [-74.07019399559213, 40.6420075028053], [-74.07289005609624, 40.64092267287602], [-74.06998354653952, 40.64106894311676], [-74.07285041194942, 40.64080368844508], [-74.07258133886755, 40.63794187429597], [-74.07865269699992, 40.63830402499987], [-74.08373397299994, 40.63573714399991], [-74.08870582299987, 40.63684520599986], [-74.09242513499994, 40.63558181299992], [-74.09409312599998, 40.639266913999975], [-74.09767290799995, 40.63896067899989], [-74.09787969199995, 40.64035805499988], [-74.10974833299994, 40.63786583299993], [-74.11765722499996, 40.638062466999905], [-74.11614321199995, 40.62870226399988], [-74.1132624959999, 40.62305442499995], [-74.12125677899994, 40.62782274999989], [-74.1313098529999, 40.62632834299998], [-74.12867047299994, 40.63734826499993], [-74.1268887269999, 40.637210087999925], [-74.12705362202625, 40.64024173781949], [-74.11861635236262, 40.641530365028935], [-74.11883624616948, 40.64254186406039], [-74.1171709328468, 40.64162427104175], [-74.1172247008255, 40.64302735996259], [-74.11535082182925, 40.64247054015812], [-74.1097393256449, 40.64546372818479], [-74.09880066885808, 40.64504703431087], [-74.08570754378212, 40.648880553370454], [-74.08221272914942, 40.64828016229008]]]}}, {\&quot;id\&quot;: \&quot;206\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.8937827830916384, \&quot;OBJECTID\&quot;: 207, \&quot;Shape_Leng\&quot;: 0.0283756831492, \&quot;Shape_Area\&quot;: 4.47230848441e-05, \&quot;zone\&quot;: \&quot;Saint Michaels Cemetery/Woodside\&quot;, \&quot;LocationID\&quot;: 207, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90137640299986, 40.75964203799989], [-73.90356915599997, 40.765781788999924], [-73.90217951699996, 40.76731584199997], [-73.89349605899986, 40.765950929999924], [-73.89866137899992, 40.75992101699997], [-73.90137640299986, 40.75964203799989]]]}}, {\&quot;id\&quot;: \&quot;207\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5824493731918997, \&quot;OBJECTID\&quot;: 208, \&quot;Shape_Leng\&quot;: 0.214721009581, \&quot;Shape_Area\&quot;: 0.00202032598969, \&quot;zone\&quot;: \&quot;Schuylerville/Edgewater Park\&quot;, \&quot;LocationID\&quot;: 208, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.825986869, 40.84067575199988], [-73.82601252600003, 40.83402077799985], [-73.81552500922504, 40.83597630692601], [-73.81476387691956, 40.830816799993485], [-73.81275469994516, 40.82824823625135], [-73.80992515914596, 40.82817971199259], [-73.81384974851248, 40.8268035287504], [-73.81379523517661, 40.82529808600147], [-73.81211350556435, 40.82555263465937], [-73.81388934712506, 40.82408736742192], [-73.80766604765235, 40.825896992059], [-73.80451800414906, 40.81892768751854], [-73.79759032777322, 40.816507532070055], [-73.80140380968845, 40.8123633086586], [-73.80361390158114, 40.812521106621354], [-73.80453081609834, 40.81425461992442], [-73.80351667337368, 40.81395196364859], [-73.80704600153508, 40.816533693875236], [-73.80505213646254, 40.81289496243412], [-73.80224245334347, 40.81019739366033], [-73.79086475738406, 40.80734114044052], [-73.79028410874172, 40.80481710368888], [-73.7933898228672, 40.804204330036214], [-73.80185524738366, 40.808967826140574], [-73.80392673417204, 40.80852797081171], [-73.8099202908178, 40.81292915226176], [-73.81620056896291, 40.81384747647932], [-73.83017915330238, 40.81083454948945], [-73.8321661704888, 40.80850227767013], [-73.831615744777, 40.80493825599657], [-73.83743612112924, 40.80620264259155], [-73.84043199520461, 40.81254112811847], [-73.83974355921865, 40.816406071751366], [-73.83696070299992, 40.81634054099991], [-73.83614239499985, 40.81919890299987], [-73.83661819699992, 40.82711414899993], [-73.83709061399992, 40.82896714699996], [-73.84233077477266, 40.8290739624537], [-73.83885232384739, 40.83369066784824], [-73.83956700299987, 40.84054722799986], [-73.83771374899992, 40.840406309999885], [-73.83688925199996, 40.84337478799992], [-73.82611300699996, 40.84533869399991], [-73.825986869, 40.84067575199988]]], [[[-73.83960098545435, 40.83567071869858], [-73.83961672561374, 40.835667752627316], [-73.83962599488439, 40.83569971218477], [-73.83960850400152, 40.83570805084221], [-73.83960098545435, 40.83567071869858]]], [[[-73.83979488581072, 40.835619207246324], [-73.8396148723857, 40.83561056836579], [-73.83948374192397, 40.83457420079436], [-73.83959266810578, 40.83456047582325], [-73.83979488581072, 40.835619207246324]]]]}}, {\&quot;id\&quot;: \&quot;208\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3496639011687761, \&quot;OBJECTID\&quot;: 209, \&quot;Shape_Leng\&quot;: 0.0306953113473, \&quot;Shape_Area\&quot;: 3.88703351209e-05, \&quot;zone\&quot;: \&quot;Seaport\&quot;, \&quot;LocationID\&quot;: 209, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00499805099996, 40.71201189699987], [-73.99919451154408, 40.707947376175724], [-74.00143661179398, 40.70487217770521], [-74.00906264699988, 40.71088670399993], [-74.00499805099996, 40.71201189699987]]]}}, {\&quot;id\&quot;: \&quot;209\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5185512367491166, \&quot;OBJECTID\&quot;: 210, \&quot;Shape_Leng\&quot;: 0.114851983372, \&quot;Shape_Area\&quot;: 0.000453155131253, \&quot;zone\&quot;: \&quot;Sheepshead Bay\&quot;, \&quot;LocationID\&quot;: 210, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92759936700004, 40.5950607789999], [-73.91805571865743, 40.58643685311621], [-73.92520361514241, 40.58580627115536], [-73.92802185276429, 40.588068756350886], [-73.9239529485009, 40.59113985052502], [-73.92863061415638, 40.58857263642073], [-73.92844090493661, 40.589030428141996], [-73.9291344038264, 40.588879241681944], [-73.92875703499415, 40.589152966925], [-73.92976615773313, 40.589292069447644], [-73.93003427450557, 40.58942599650075], [-73.93057705718242, 40.589890641203176], [-73.93010325988745, 40.58960610507142], [-73.93001650952081, 40.5940945360621], [-73.93260420556844, 40.59492954452495], [-73.93121294858955, 40.58953130811921], [-73.92972846380192, 40.58861391582969], [-73.93125191267133, 40.58684982521422], [-73.92857393936458, 40.58706150237135], [-73.92552860874584, 40.58497837657265], [-73.9344471859999, 40.586652074999925], [-73.96025825899996, 40.58502930799994], [-73.9603495359999, 40.58730628599994], [-73.95619313699986, 40.58776226899994], [-73.956927197, 40.596612075999865], [-73.94248473299992, 40.598200364999855], [-73.94288954099984, 40.600318649999934], [-73.93447158899997, 40.60123151199989], [-73.9335511719998, 40.60268728099991], [-73.92813139699999, 40.59777792799987], [-73.92956858299992, 40.5968202649999], [-73.92759936700004, 40.5950607789999]]]}}, {\&quot;id\&quot;: \&quot;210\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3508851733003059, \&quot;OBJECTID\&quot;: 211, \&quot;Shape_Leng\&quot;: 0.0252345082132, \&quot;Shape_Area\&quot;: 3.97291966087e-05, \&quot;zone\&quot;: \&quot;SoHo\&quot;, \&quot;LocationID\&quot;: 211, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.001523638, 40.719820797999944], [-74.00539186699989, 40.722037365999896], [-74.00214891499996, 40.728035366999904], [-73.9967717579999, 40.7254319439999], [-74.001523638, 40.719820797999944]]]}}, {\&quot;id\&quot;: \&quot;211\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6535480023852117, \&quot;OBJECTID\&quot;: 212, \&quot;Shape_Leng\&quot;: 0.0671290653429, \&quot;Shape_Area\&quot;: 0.000161276191858, \&quot;zone\&quot;: \&quot;Soundview/Bruckner\&quot;, \&quot;LocationID\&quot;: 212, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88421976599987, 40.82299645799987], [-73.88378414099992, 40.828274291999946], [-73.87729930499995, 40.8287427739999], [-73.86085019699983, 40.833613537999874], [-73.857391213, 40.83229737199986], [-73.85615112900003, 40.82677004599987], [-73.88421976599987, 40.82299645799987]]]}}, {\&quot;id\&quot;: \&quot;212\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6376811594202898, \&quot;OBJECTID\&quot;: 213, \&quot;Shape_Leng\&quot;: 0.159958783822, \&quot;Shape_Area\&quot;: 0.000904077906339, \&quot;zone\&quot;: \&quot;Soundview/Castle Hill\&quot;, \&quot;LocationID\&quot;: 213, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.83667856399991, 40.81758876299995], [-73.83696070299992, 40.81634054099991], [-73.84003308726955, 40.81682214096213], [-73.83888231646733, 40.822140489856025], [-73.84228428387955, 40.82864660449135], [-73.83709061399992, 40.82896714699996], [-73.83667856399991, 40.81758876299995]]], [[[-73.84231712480313, 40.82718468468027], [-73.83999860407422, 40.81993494681306], [-73.84198684834051, 40.818774373908084], [-73.84617302872044, 40.81067666443039], [-73.8511447226069, 40.814396548876], [-73.85538030243693, 40.81428888208278], [-73.84903294180673, 40.81211891007852], [-73.84996696802818, 40.808578018843576], [-73.847488226419, 40.805448909149185], [-73.85019839036403, 40.80451002497395], [-73.856614854502, 40.80479692395033], [-73.85866549456955, 40.806833088596065], [-73.85895141221772, 40.810271417586556], [-73.8601269523559, 40.80960549989125], [-73.85935625734362, 40.80898803428646], [-73.85938875426787, 40.80816614120708], [-73.86065222514291, 40.80963668169183], [-73.86765646284456, 40.81058376193711], [-73.87077804885932, 40.814486895487775], [-73.8780628329999, 40.81618263199993], [-73.88244779599998, 40.81926832299992], [-73.8843985489999, 40.822965575999866], [-73.85635677499994, 40.82675208499993], [-73.85513639699997, 40.822436188999866], [-73.84289858800003, 40.82408305899986], [-73.84390624999999, 40.828407828999936], [-73.84231712480313, 40.82718468468027]]]]}}, {\&quot;id\&quot;: \&quot;213\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4583333333333333, \&quot;OBJECTID\&quot;: 214, \&quot;Shape_Leng\&quot;: 0.135300314246, \&quot;Shape_Area\&quot;: 0.000811976523012, \&quot;zone\&quot;: \&quot;South Beach/Dongan Hills\&quot;, \&quot;LocationID\&quot;: 214, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08491019899996, 40.59570472799985], [-74.08173342999991, 40.59215628599987], [-74.07043976099992, 40.59673474699988], [-74.06436003721248, 40.58826789117477], [-74.07499413073505, 40.57923655741631], [-74.07336118472098, 40.578275488289144], [-74.07508288192615, 40.579160158755506], [-74.08495715819193, 40.57125984002107], [-74.10039083499996, 40.579688665999925], [-74.09844000899997, 40.581241705999915], [-74.10525775499997, 40.58592143599986], [-74.10088251699995, 40.59017921599992], [-74.09979588999995, 40.59387136599988], [-74.09375453799998, 40.59674488999988], [-74.08983655899989, 40.60077409499996], [-74.08218729299988, 40.601941007999876], [-74.08130343799999, 40.59938765599991], [-74.08532650099991, 40.59700832199995], [-74.08491019899996, 40.59570472799985]]]}}, {\&quot;id\&quot;: \&quot;214\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4187683900798655, \&quot;OBJECTID\&quot;: 215, \&quot;Shape_Leng\&quot;: 0.103556453625, \&quot;Shape_Area\&quot;: 0.000395647022725, \&quot;zone\&quot;: \&quot;South Jamaica\&quot;, \&quot;LocationID\&quot;: 215, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7769103769999, 40.70252488499994], [-73.77395659499986, 40.699805781999906], [-73.7802372379999, 40.692972334999894], [-73.77789337399993, 40.68991768999992], [-73.77977295099997, 40.689281169999916], [-73.78078155499992, 40.69102994299994], [-73.793908417, 40.68630469099985], [-73.79561486799987, 40.688656890999916], [-73.79995042799996, 40.68682771899991], [-73.79898209099994, 40.68485873799988], [-73.80576840199991, 40.682932390999916], [-73.81063298299996, 40.69194738299988], [-73.80890216900004, 40.69256434899993], [-73.80642479399984, 40.690873857999904], [-73.79260506799987, 40.70043209999988], [-73.79239170299988, 40.7021665299999], [-73.78256582599995, 40.70542486399989], [-73.78034491200003, 40.70541241699986], [-73.7769103769999, 40.70252488499994]]]}}, {\&quot;id\&quot;: \&quot;215\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4507669470559129, \&quot;OBJECTID\&quot;: 216, \&quot;Shape_Leng\&quot;: 0.116797554681, \&quot;Shape_Area\&quot;: 0.000816076647781, \&quot;zone\&quot;: \&quot;South Ozone Park\&quot;, \&quot;LocationID\&quot;: 216, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.80857655199986, 40.688330889999925], [-73.80142836799988, 40.673666833999874], [-73.80203207699995, 40.66524802499994], [-73.81496922499986, 40.66247266799991], [-73.832705339, 40.665405772999854], [-73.84012856099982, 40.6811466509999], [-73.83697486299991, 40.6819880179999], [-73.83807769099997, 40.68423890999988], [-73.82753021399995, 40.687239482999914], [-73.82851136799994, 40.689239055999934], [-73.82599347399987, 40.689953661999894], [-73.82501128899997, 40.68795231799991], [-73.81063298299996, 40.69194738299988], [-73.80857655199986, 40.688330889999925]]]}}, {\&quot;id\&quot;: \&quot;216\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5170361472097849, \&quot;OBJECTID\&quot;: 217, \&quot;Shape_Leng\&quot;: 0.0553905251285, \&quot;Shape_Area\&quot;: 0.000114733270758, \&quot;zone\&quot;: \&quot;South Williamsburg\&quot;, \&quot;LocationID\&quot;: 217, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95554165799997, 40.70759344799989], [-73.94705205299991, 40.70366394899985], [-73.95128819399989, 40.700922364999855], [-73.95381196900003, 40.703180979999914], [-73.95745736399992, 40.70082260299993], [-73.95701993199991, 40.69897391399995], [-73.96283963699993, 40.698038667999946], [-73.96217978199998, 40.70022070999989], [-73.96838933699995, 40.70682918699989], [-73.95554165799997, 40.70759344799989]]]}}, {\&quot;id\&quot;: \&quot;217\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.55, \&quot;OBJECTID\&quot;: 218, \&quot;Shape_Leng\&quot;: 0.0837008281049, \&quot;Shape_Area\&quot;: 0.000281293736407, \&quot;zone\&quot;: \&quot;Springfield Gardens North\&quot;, \&quot;LocationID\&quot;: 218, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76561573099998, 40.6747790199999], [-73.76380484799996, 40.67376993299995], [-73.76031463999993, 40.67510997099984], [-73.75857198899986, 40.67263733099987], [-73.75636239300002, 40.67242923699999], [-73.75763129599993, 40.66645115699992], [-73.77342462799993, 40.66802761899988], [-73.78940999399987, 40.66684115899995], [-73.78808647399985, 40.6730096269999], [-73.78573730899993, 40.67238503499988], [-73.77722923600001, 40.679652720999904], [-73.77469730199986, 40.680486045999906], [-73.76561573099998, 40.6747790199999]]]}}, {\&quot;id\&quot;: \&quot;218\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4395918367346939, \&quot;OBJECTID\&quot;: 219, \&quot;Shape_Leng\&quot;: 0.155126669675, \&quot;Shape_Area\&quot;: 0.000428176336771, \&quot;zone\&quot;: \&quot;Springfield Gardens South\&quot;, \&quot;LocationID\&quot;: 219, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.761822313, 40.666877759999856], [-73.73856469500002, 40.66639689799991], [-73.74450922599979, 40.663821277999865], [-73.74853177199994, 40.65757569699993], [-73.74328714099991, 40.65613473199991], [-73.74332546899993, 40.65253780399992], [-73.74867194699979, 40.65267808799992], [-73.76165732899996, 40.658238085999855], [-73.76406290099993, 40.65435626599989], [-73.78321833499997, 40.663166283999864], [-73.80203207699995, 40.66524802499994], [-73.80155565300004, 40.6667533639999], [-73.77342462799993, 40.66802761899988], [-73.761822313, 40.666877759999856]]]}}, {\&quot;id\&quot;: \&quot;219\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6061746987951807, \&quot;OBJECTID\&quot;: 220, \&quot;Shape_Leng\&quot;: 0.106015943267, \&quot;Shape_Area\&quot;: 0.000313035744467, \&quot;zone\&quot;: \&quot;Spuyten Duyvil/Kingsbridge\&quot;, \&quot;LocationID\&quot;: 220, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89827216899992, 40.8894579429999], [-73.89972588599989, 40.88651488699985], [-73.89661546599986, 40.885955255999946], [-73.90369454799992, 40.878501617999895], [-73.90608130599988, 40.873239628999904], [-73.90746489699994, 40.87354735399985], [-73.9068187309999, 40.87661958799993], [-73.91033193599998, 40.879038046999895], [-73.91775669364831, 40.8756636279301], [-73.92490327486523, 40.87888836792653], [-73.92058641888602, 40.88718267830985], [-73.91489276999991, 40.8846247709999], [-73.90900536, 40.88950014099986], [-73.90413642399992, 40.887080708999896], [-73.9028594909999, 40.88916474399989], [-73.89827216899992, 40.8894579429999]]]}}, {\&quot;id\&quot;: \&quot;220\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.51875, \&quot;OBJECTID\&quot;: 221, \&quot;Shape_Leng\&quot;: 0.166218220846, \&quot;Shape_Area\&quot;: 0.000890111567051, \&quot;zone\&quot;: \&quot;Stapleton\&quot;, \&quot;LocationID\&quot;: 221, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.07530550099992, 40.637729958999955], [-74.07053959705199, 40.63747140462426], [-74.07341562632824, 40.63689395096554], [-74.07209483807503, 40.63664727762461], [-74.07335822045584, 40.63653609416517], [-74.0729847461233, 40.630308978981404], [-74.06802173543946, 40.62878758518541], [-74.07291177936548, 40.62999637940653], [-74.07225500955778, 40.62460875019394], [-74.06975543088323, 40.6212081398724], [-74.06544586069478, 40.61920262828925], [-74.06668207982919, 40.61806749593851], [-74.06425721751587, 40.61817168758555], [-74.06509908407213, 40.61751095612543], [-74.05685812390232, 40.608056357772554], [-74.0651709129999, 40.604213507999894], [-74.06350565699996, 40.60215005499991], [-74.07399965299999, 40.60572556699987], [-74.0815547009999, 40.60629029699987], [-74.0714060829999, 40.61943137899991], [-74.07253551699989, 40.622464021999896], [-74.08720982799996, 40.61330697299989], [-74.0878234189999, 40.615087934999885], [-74.08415419899998, 40.626267114999905], [-74.07972492199995, 40.62895068799986], [-74.08574928999992, 40.633955556999865], [-74.07878831099995, 40.63826855899991], [-74.07530550099992, 40.637729958999955]]]}}, {\&quot;id\&quot;: \&quot;221\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.48883374689826303, \&quot;OBJECTID\&quot;: 222, \&quot;Shape_Leng\&quot;: 0.0483893527976, \&quot;Shape_Area\&quot;: 0.000130268343918, \&quot;zone\&quot;: \&quot;Starrett City\&quot;, \&quot;LocationID\&quot;: 222, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.87908517399995, 40.65020211699988], [-73.8745808109999, 40.64561010599992], [-73.87841589406925, 40.638912189353306], [-73.88006714132425, 40.64200344662675], [-73.88341999203011, 40.64452381564944], [-73.88557762124442, 40.644040950146135], [-73.88764072166725, 40.64780239000726], [-73.89125147199995, 40.65002559699993], [-73.88221364899994, 40.65451863799996], [-73.87908517399995, 40.65020211699988]]], [[[-73.8882853135604, 40.64672241327608], [-73.88864137620679, 40.647079553158], [-73.88851637568528, 40.64736069152191], [-73.88820050726648, 40.647140869529046], [-73.8882853135604, 40.64672241327608]]]]}}, {\&quot;id\&quot;: \&quot;222\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.49356204481304666, \&quot;OBJECTID\&quot;: 223, \&quot;Shape_Leng\&quot;: 0.166021925275, \&quot;Shape_Area\&quot;: 0.00076436070058, \&quot;zone\&quot;: \&quot;Steinway\&quot;, \&quot;LocationID\&quot;: 223, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90649492923363, 40.7901809903447], [-73.90032629743816, 40.789007662825696], [-73.8959296297551, 40.785648944313756], [-73.89874897638398, 40.78278115576602], [-73.90114577552107, 40.78271110609054], [-73.90257929672345, 40.78028912083556], [-73.89437777934127, 40.78424320348422], [-73.89606377738421, 40.783157201805224], [-73.895284679113, 40.78154124925482], [-73.89274917876409, 40.78296570668481], [-73.89165459123714, 40.78219478153064], [-73.89300986180193, 40.78179802356213], [-73.89119589704391, 40.77856328788702], [-73.89251064542336, 40.77739286927271], [-73.89183244902246, 40.77488019994431], [-73.88945486901865, 40.77353295106357], [-73.88770661799987, 40.76683859799995], [-73.89349605899986, 40.765950929999924], [-73.91759120499997, 40.769900870999926], [-73.92398142900002, 40.77461511299991], [-73.92375761299998, 40.77654701199991], [-73.91796581399993, 40.78125629199991], [-73.91996458796496, 40.78263506876824], [-73.912599859115, 40.78937632963394], [-73.90985862925774, 40.790945493781884], [-73.90649492923363, 40.7901809903447]]]}}, {\&quot;id\&quot;: \&quot;223\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.30801459765711636, \&quot;OBJECTID\&quot;: 224, \&quot;Shape_Leng\&quot;: 0.0440204462769, \&quot;Shape_Area\&quot;: 9.84786989135e-05, \&quot;zone\&quot;: \&quot;Stuy Town/Peter Cooper Village\&quot;, \&quot;LocationID\&quot;: 224, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97511055399991, 40.735390254999864], [-73.97151882628022, 40.72935136174009], [-73.97162697285862, 40.72662845299842], [-73.98255629299986, 40.731350133999875], [-73.97849845599995, 40.73679095699989], [-73.97511055399991, 40.735390254999864]]]}}, {\&quot;id\&quot;: \&quot;224\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.46939986043265874, \&quot;OBJECTID\&quot;: 225, \&quot;Shape_Leng\&quot;: 0.0887992073281, \&quot;Shape_Area\&quot;: 0.000310835395162, \&quot;zone\&quot;: \&quot;Stuyvesant Heights\&quot;, \&quot;LocationID\&quot;: 225, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91741294299999, 40.68403405199993], [-73.9163011989999, 40.67857711199991], [-73.92183500099998, 40.67894555899991], [-73.92281374299995, 40.68341442999991], [-73.93500821699992, 40.68276376799985], [-73.93435066499993, 40.67956340799991], [-73.94032794, 40.679889974999874], [-73.94394947299996, 40.698221278999924], [-73.93817718599986, 40.69864022299987], [-73.91804607, 40.68721324799989], [-73.91741294299999, 40.68403405199993]]]}}, {\&quot;id\&quot;: \&quot;225\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5400358347151585, \&quot;OBJECTID\&quot;: 226, \&quot;Shape_Leng\&quot;: 0.168957762041, \&quot;Shape_Area\&quot;: 0.00076194414504, \&quot;zone\&quot;: \&quot;Sunnyside\&quot;, \&quot;LocationID\&quot;: 226, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90989961499994, 40.749087274999944], [-73.91187504099992, 40.74822079599992], [-73.9119412979999, 40.742382948999925], [-73.91567469599988, 40.740784929999904], [-73.91903825199986, 40.73200596599987], [-73.917342506, 40.731382825999916], [-73.91796696699996, 40.7285007709999], [-73.91205021299994, 40.72850636299993], [-73.91174734199988, 40.72991203299991], [-73.90712253099991, 40.727424727999924], [-73.91384828299984, 40.72289841199989], [-73.91132095099978, 40.71962422999992], [-73.92232773978448, 40.71659264406108], [-73.92515207271921, 40.722335339820816], [-73.9244229875485, 40.723589975986165], [-73.92037064235664, 40.723681113821044], [-73.92490316165177, 40.72450657567146], [-73.92923485876162, 40.72826016576104], [-73.93804478507161, 40.730509967846054], [-73.94162472636452, 40.73584144233816], [-73.94594410333028, 40.73751251570048], [-73.94140886345744, 40.73929957085316], [-73.93869664599998, 40.738140816999866], [-73.93726110699994, 40.745176490999896], [-73.94401030399996, 40.7436394539999], [-73.93383269399993, 40.7516047019999], [-73.91547326299991, 40.75379181799991], [-73.91035492999984, 40.75274990899987], [-73.90989961499994, 40.749087274999944]]]}}, {\&quot;id\&quot;: \&quot;226\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5770998746343502, \&quot;OBJECTID\&quot;: 227, \&quot;Shape_Leng\&quot;: 0.0828301570789, \&quot;Shape_Area\&quot;: 0.000268316529534, \&quot;zone\&quot;: \&quot;Sunset Park East\&quot;, \&quot;LocationID\&quot;: 227, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.991928124, 40.6422049039999], [-73.9955103369999, 40.63980966699993], [-73.99917564699989, 40.642025441999934], [-74.00735636699996, 40.6341636269999], [-74.00556490399993, 40.63308317599992], [-74.01000340799995, 40.630113088999906], [-74.01602010100001, 40.63331711399997], [-74.016835401, 40.63535542899995], [-74.0139608859999, 40.63815326699995], [-74.01616711499993, 40.63948244099991], [-74.00214474699993, 40.65295610699995], [-73.98905872499985, 40.64411924099995], [-73.991928124, 40.6422049039999]]]}}, {\&quot;id\&quot;: \&quot;227\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4474304804952344, \&quot;OBJECTID\&quot;: 228, \&quot;Shape_Leng\&quot;: 0.177685177706, \&quot;Shape_Area\&quot;: 0.000993414783816, \&quot;zone\&quot;: \&quot;Sunset Park West\&quot;, \&quot;LocationID\&quot;: 228, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9969179149999, 40.6691534839999], [-73.99490350099988, 40.6667854349999], [-73.99692689899985, 40.664374914999925], [-73.99063545399997, 40.660579088999896], [-73.988716511, 40.66240493799995], [-73.98725068899996, 40.66037895599992], [-73.990188415, 40.657600817999906], [-73.99516890199999, 40.659669521999945], [-74.01616711499993, 40.63948244099991], [-74.0139608859999, 40.63815326699995], [-74.016835401, 40.63535542899995], [-74.02141038399992, 40.638584902999845], [-74.02108051399998, 40.64149093699994], [-74.02475437599998, 40.6381214179999], [-74.03266558998958, 40.643720344890056], [-74.03051830863413, 40.645274425208974], [-74.02820569545007, 40.644015982890345], [-74.02604948400315, 40.64626135032611], [-74.0293899048662, 40.64880405511391], [-74.02571758804807, 40.64661549229093], [-74.02461487103106, 40.64715112511878], [-74.02622102475574, 40.64824842780924], [-74.02414566050564, 40.647615101259845], [-74.02605133196793, 40.6509943007431], [-74.02285141795983, 40.651169195161685], [-74.02522662972656, 40.652829856959634], [-74.02154138319214, 40.650671622911226], [-74.02380703903121, 40.65304472851146], [-74.02118670027885, 40.652839836895325], [-74.02320464727141, 40.654096116817925], [-74.0186223830857, 40.653491349022964], [-74.02005182454292, 40.655335948874416], [-74.01715319581021, 40.65477510436213], [-74.01970596410222, 40.656581163751035], [-74.01639437533773, 40.65562064285071], [-74.01910843803118, 40.657368884303494], [-74.01585370056823, 40.65621324055534], [-74.01786573109669, 40.65830844729852], [-74.01442130484548, 40.657608021951376], [-74.01745803087898, 40.6594501973867], [-74.01554165388997, 40.66075835547614], [-74.01183862056543, 40.65891283727472], [-74.0131555493881, 40.66198159772593], [-74.00859956968284, 40.65952092309827], [-74.00745858163884, 40.66055847620986], [-74.0103720129723, 40.66239888023248], [-74.00955074142026, 40.6632676941304], [-74.0034880110065, 40.66224055612849], [-74.00599748682693, 40.66325861082859], [-74.00772133506703, 40.66471863301977], [-74.0071253264673, 40.66491521847423], [-74.00362862508561, 40.66273484753458], [-74.00486193792649, 40.66506482193817], [-74.00083401108444, 40.66300644269171], [-73.99953152609916, 40.6643974859369], [-74.00292463516384, 40.66646231216332], [-73.99998149339123, 40.66745027490869], [-73.99902600998384, 40.66844297212693], [-73.9986188799999, 40.67183017199989], [-73.9969179149999, 40.6691534839999]]]}}, {\&quot;id\&quot;: \&quot;228\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.37824867930601785, \&quot;OBJECTID\&quot;: 229, \&quot;Shape_Leng\&quot;: 0.0425252900116, \&quot;Shape_Area\&quot;: 9.47058230931e-05, \&quot;zone\&quot;: \&quot;Sutton Place/Turtle Bay North\&quot;, \&quot;LocationID\&quot;: 229, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96162927534907, 40.75515238425915], [-73.96482214210387, 40.75159632579112], [-73.9712170449999, 40.75519332399994], [-73.9665833839999, 40.76155093499988], [-73.95877790811335, 40.75827092092435], [-73.96162927534907, 40.75515238425915]]]}}, {\&quot;id\&quot;: \&quot;229\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4514735032996653, \&quot;OBJECTID\&quot;: 230, \&quot;Shape_Leng\&quot;: 0.0310283096779, \&quot;Shape_Area\&quot;: 5.60914463266e-05, \&quot;zone\&quot;: \&quot;Times Sq/Theatre District\&quot;, \&quot;LocationID\&quot;: 230, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98362433299988, 40.75551634599986], [-73.98979085399996, 40.7572331319999], [-73.98428230099987, 40.76479181499994], [-73.97860169399989, 40.762396071999945], [-73.98362433299988, 40.75551634599986]]]}}, {\&quot;id\&quot;: \&quot;230\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.31503652615196714, \&quot;OBJECTID\&quot;: 231, \&quot;Shape_Leng\&quot;: 0.0634201165587, \&quot;Shape_Area\&quot;: 0.000166929752992, \&quot;zone\&quot;: \&quot;TriBeCa/Civic Center\&quot;, \&quot;LocationID\&quot;: 231, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00931760399995, 40.72470155099989], [-73.99995620900002, 40.71801709499987], [-74.00485768099996, 40.7124525409999], [-74.00834760999993, 40.71135854599987], [-74.01375388499997, 40.71369055499987], [-74.01244109199989, 40.719057672999874], [-74.01457231438083, 40.72027413774219], [-74.01296558526825, 40.720328675587126], [-74.01102457999994, 40.72579386199991], [-74.00931760399995, 40.72470155099989]]]}}, {\&quot;id\&quot;: \&quot;231\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3511347457547214, \&quot;OBJECTID\&quot;: 232, \&quot;Shape_Leng\&quot;: 0.0614709085331, \&quot;Shape_Area\&quot;: 0.000216049973456, \&quot;zone\&quot;: \&quot;Two Bridges/Seward Park\&quot;, \&quot;LocationID\&quot;: 232, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97635525199995, 40.71913288399983], [-73.97347975524508, 40.7188614291129], [-73.97782091638247, 40.71064544490706], [-73.9919434659999, 40.70958905299992], [-73.99256242199989, 40.71438807699996], [-73.99022012699989, 40.71440493999988], [-73.98382387299982, 40.72147287199987], [-73.97635525199995, 40.71913288399983]]]}}, {\&quot;id\&quot;: \&quot;232\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.34280284974617936, \&quot;OBJECTID\&quot;: 233, \&quot;Shape_Leng\&quot;: 0.048035918294, \&quot;Shape_Area\&quot;: 0.000116188094682, \&quot;zone\&quot;: \&quot;UN/Turtle Bay South\&quot;, \&quot;LocationID\&quot;: 233, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.96547092299994, 40.75193959699991], [-73.97123301520192, 40.743414663960074], [-73.97350835000003, 40.7437820339999], [-73.97121971999988, 40.74692154099996], [-73.9758346669999, 40.74886314599996], [-73.9712170449999, 40.75519332399994], [-73.96547092299994, 40.75193959699991]]], [[[-73.96421230395673, 40.74660431847665], [-73.96444522752618, 40.74641042576318], [-73.96458318426942, 40.746454400673315], [-73.96415980288437, 40.74686554735954], [-73.96421230395673, 40.74660431847665]]]]}}, {\&quot;id\&quot;: \&quot;233\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.30875189761032007, \&quot;OBJECTID\&quot;: 234, \&quot;Shape_Leng\&quot;: 0.0360721994984, \&quot;Shape_Area\&quot;: 7.31054382894e-05, \&quot;zone\&quot;: \&quot;Union Sq\&quot;, \&quot;LocationID\&quot;: 234, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98996936399989, 40.73490456699994], [-73.99683993899998, 40.73736088899995], [-73.99051761299985, 40.746038637999895], [-73.98407485299995, 40.74332471799989], [-73.98996936399989, 40.73490456699994]]]}}, {\&quot;id\&quot;: \&quot;234\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6193901035673187, \&quot;OBJECTID\&quot;: 235, \&quot;Shape_Leng\&quot;: 0.0761668426519, \&quot;Shape_Area\&quot;: 0.000212844547337, \&quot;zone\&quot;: \&quot;University Heights/Morris Heights\&quot;, \&quot;LocationID\&quot;: 235, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90947862999988, 40.86180812899987], [-73.91328437000003, 40.859618600999944], [-73.90976165899988, 40.857182611999896], [-73.90679734899983, 40.85937358899988], [-73.90468371399987, 40.85706030199991], [-73.91416184199993, 40.845179187999925], [-73.92808209386837, 40.84539159691672], [-73.91422824049913, 40.862490790359615], [-73.90947862999988, 40.86180812899987]]]}}, {\&quot;id\&quot;: \&quot;235\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3990667864186673, \&quot;OBJECTID\&quot;: 236, \&quot;Shape_Leng\&quot;: 0.0442519223099, \&quot;Shape_Area\&quot;: 0.000102864345211, \&quot;zone\&quot;: \&quot;Upper East Side North\&quot;, \&quot;LocationID\&quot;: 236, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95779380499984, 40.773599896999926], [-73.96468735799992, 40.77567708199994], [-73.9557773589999, 40.78791392399995], [-73.94933170599992, 40.78519312699994], [-73.95779380499984, 40.773599896999926]]]}}, {\&quot;id\&quot;: \&quot;236\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4185696491397384, \&quot;OBJECTID\&quot;: 237, \&quot;Shape_Leng\&quot;: 0.0422126003388, \&quot;Shape_Area\&quot;: 9.59873206621e-05, \&quot;zone\&quot;: \&quot;Upper East Side South\&quot;, \&quot;LocationID\&quot;: 237, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9661274729999, 40.762179299999914], [-73.97301487199995, 40.76427887899991], [-73.96468735799992, 40.77567708199994], [-73.95825534899998, 40.772965336999896], [-73.9661274729999, 40.762179299999914]]]}}, {\&quot;id\&quot;: \&quot;237\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3847097692019964, \&quot;OBJECTID\&quot;: 238, \&quot;Shape_Leng\&quot;: 0.0601093114033, \&quot;Shape_Area\&quot;: 0.000184763693765, \&quot;zone\&quot;: \&quot;Upper West Side North\&quot;, \&quot;LocationID\&quot;: 238, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96884378999985, 40.78596738899994], [-73.98188645923244, 40.7905165804675], [-73.97639951965265, 40.79827321084623], [-73.96417598599989, 40.79236204499989], [-73.96884378999985, 40.78596738899994]]]}}, {\&quot;id\&quot;: \&quot;238\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3883914600771428, \&quot;OBJECTID\&quot;: 239, \&quot;Shape_Leng\&quot;: 0.0636261152958, \&quot;Shape_Area\&quot;: 0.000204715440774, \&quot;zone\&quot;: \&quot;Upper West Side South\&quot;, \&quot;LocationID\&quot;: 239, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97501417199996, 40.78768560599987], [-73.96933573299991, 40.78529327999992], [-73.97499744000007, 40.77753254599988], [-73.98507184299989, 40.781779680999946], [-73.98567936099997, 40.780312632999944], [-73.9881274613434, 40.78140179672366], [-73.98546581197031, 40.78536070057545], [-73.98711901394246, 40.7852103190041], [-73.98542932126932, 40.78541394218458], [-73.98465507883023, 40.78653474180792], [-73.98594956155647, 40.78648711396651], [-73.98188645923244, 40.7905165804675], [-73.97501417199996, 40.78768560599987]]]}}, {\&quot;id\&quot;: \&quot;239\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5970464135021097, \&quot;OBJECTID\&quot;: 240, \&quot;Shape_Leng\&quot;: 0.146069764379, \&quot;Shape_Area\&quot;: 0.000722130920707, \&quot;zone\&quot;: \&quot;Van Cortlandt Park\&quot;, \&quot;LocationID\&quot;: 240, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87643743099994, 40.89687059299995], [-73.8771197409999, 40.895468663999964], [-73.87048672599987, 40.896640210999905], [-73.86135927899984, 40.89466231899991], [-73.86943471300005, 40.87812919899994], [-73.87094367500002, 40.87851076699998], [-73.87024100099985, 40.88022935299995], [-73.87494589799991, 40.87994766899988], [-73.87467601499999, 40.88156285199993], [-73.87812594399992, 40.88215382599989], [-73.87803562399996, 40.887118321999885], [-73.88124422499992, 40.88270963299992], [-73.89972588499982, 40.886514886999926], [-73.89643170799987, 40.89365527899989], [-73.89663333831646, 40.91141737492314], [-73.86789043706806, 40.90298695407611], [-73.87643743099994, 40.89687059299995]]]}}, {\&quot;id\&quot;: \&quot;240\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6392638036809816, \&quot;OBJECTID\&quot;: 241, \&quot;Shape_Leng\&quot;: 0.0687645777649, \&quot;Shape_Area\&quot;: 0.00025467697592, \&quot;zone\&quot;: \&quot;Van Cortlandt Village\&quot;, \&quot;LocationID\&quot;: 241, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88840157099996, 40.88441707499993], [-73.88705142599984, 40.884349575999906], [-73.88567517999988, 40.87887251099986], [-73.88937163799984, 40.87338229799993], [-73.8879350369998, 40.87203023199988], [-73.89438130299995, 40.866068850999966], [-73.89891854299988, 40.86965857399992], [-73.89942436199988, 40.86788083799993], [-73.90374975899987, 40.86959562699992], [-73.90608130599988, 40.873239628999904], [-73.89855059899999, 40.88437472699996], [-73.89661546599986, 40.885955255999946], [-73.88840157099996, 40.88441707499993]]]}}, {\&quot;id\&quot;: \&quot;241\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6652794292508918, \&quot;OBJECTID\&quot;: 242, \&quot;Shape_Leng\&quot;: 0.138136446433, \&quot;Shape_Area\&quot;: 0.000360072450014, \&quot;zone\&quot;: \&quot;Van Nest/Morris Park\&quot;, \&quot;LocationID\&quot;: 242, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83593362199987, 40.84840635599993], [-73.83771374799997, 40.84040630999987], [-73.84204144699997, 40.84064589699992], [-73.84458129199986, 40.838535507999914], [-73.85052278099987, 40.84278948899985], [-73.87359713599987, 40.83979855499992], [-73.86804200399997, 40.8448138389999], [-73.86860515599989, 40.85206864599991], [-73.86303938099996, 40.850611306999944], [-73.86250923799993, 40.84836228099987], [-73.85457388299992, 40.85150834599995], [-73.85304526899994, 40.849547331999865], [-73.84430846999992, 40.85119046399989], [-73.84494053799982, 40.8482182209999], [-73.84049767399992, 40.8541841049999], [-73.83499552599994, 40.85657120099989], [-73.8368191849999, 40.85727680899989], [-73.82847346699995, 40.860731352999906], [-73.83283502299986, 40.8560358449999], [-73.83129157699989, 40.85543410499991], [-73.83463970199993, 40.853817993999904], [-73.83593362199987, 40.84840635599993]]]}}, {\&quot;id\&quot;: \&quot;242\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4757057629620518, \&quot;OBJECTID\&quot;: 243, \&quot;Shape_Leng\&quot;: 0.0943314999364, \&quot;Shape_Area\&quot;: 0.000438377341503, \&quot;zone\&quot;: \&quot;Washington Heights North\&quot;, \&quot;LocationID\&quot;: 243, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93156536999994, 40.86958215799991], [-73.92474153399992, 40.86159363799992], [-73.92709951599986, 40.85827552099992], [-73.92467094699998, 40.8568108889999], [-73.92747680599985, 40.85069436999992], [-73.93139355399987, 40.84742823099985], [-73.94203871799984, 40.851931028999914], [-73.94317806099995, 40.84979994299991], [-73.94692626452422, 40.850528055834154], [-73.94186996426673, 40.853867739442755], [-73.93156536999994, 40.86958215799991]]]}}, {\&quot;id\&quot;: \&quot;243\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4486486486486487, \&quot;OBJECTID\&quot;: 244, \&quot;Shape_Leng\&quot;: 0.0805686044599, \&quot;Shape_Area\&quot;: 0.000359702747951, \&quot;zone\&quot;: \&quot;Washington Heights South\&quot;, \&quot;LocationID\&quot;: 244, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94068822000003, 40.85131543299985], [-73.93139355399987, 40.84742823099985], [-73.93556697199989, 40.841712527999924], [-73.93505508799984, 40.8393332359999], [-73.94034643299983, 40.8304578419999], [-73.95015521048293, 40.83439675940791], [-73.94612416421772, 40.84389249655712], [-73.9469644175959, 40.85046552581819], [-73.94317806099984, 40.84979994399989], [-73.94203871799984, 40.851931028999914], [-73.94068822000003, 40.85131543299985]]]}}, {\&quot;id\&quot;: \&quot;244\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40476190476190477, \&quot;OBJECTID\&quot;: 245, \&quot;Shape_Leng\&quot;: 0.0959830596604, \&quot;Shape_Area\&quot;: 0.000466175414294, \&quot;zone\&quot;: \&quot;West Brighton\&quot;, \&quot;LocationID\&quot;: 245, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.09787969199995, 40.64035805499988], [-74.09767290799995, 40.63896067899989], [-74.09409312599998, 40.639266913999975], [-74.09242513499994, 40.63558181299992], [-74.08870582299987, 40.63684520599986], [-74.08373397299994, 40.63573714399991], [-74.09223971399994, 40.62574291599987], [-74.10350925299994, 40.61641607499991], [-74.1132624959999, 40.62305442499995], [-74.11614321199995, 40.62870226399988], [-74.11765722499997, 40.63806246599996], [-74.10974833299994, 40.63786583299993], [-74.09787969199995, 40.64035805499988]]]}}, {\&quot;id\&quot;: \&quot;245\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3119482485571439, \&quot;OBJECTID\&quot;: 246, \&quot;Shape_Leng\&quot;: 0.0694671937437, \&quot;Shape_Area\&quot;: 0.000281298327076, \&quot;zone\&quot;: \&quot;West Chelsea/Hudson Yards\&quot;, \&quot;LocationID\&quot;: 246, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00439976203513, 40.76267135909888], [-73.99547450199992, 40.759626856999894], [-74.00820401899988, 40.74214751799986], [-74.01213726936172, 40.74353192705926], [-74.0087278005888, 40.74485823290996], [-74.01183642872407, 40.74512596367872], [-74.00946389855962, 40.74575014365948], [-74.01150411235528, 40.74699080250515], [-74.0091373625992, 40.74735976280298], [-74.01133174441699, 40.748000575341926], [-74.0090584790135, 40.74778564533286], [-74.00894606502312, 40.74841189316866], [-74.01121562130406, 40.74869682117583], [-74.00842636447226, 40.75215785023921], [-74.0099905581974, 40.75281618714907], [-74.00997058797012, 40.75293356415314], [-74.00835352838844, 40.752350739342255], [-74.00480392560178, 40.75780984316466], [-74.00700358904015, 40.759231870341075], [-74.00390742032765, 40.75937569218354], [-74.00233528130057, 40.76154372700156], [-74.00439976203513, 40.76267135909888]]]}}, {\&quot;id\&quot;: \&quot;246\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6112880032867708, \&quot;OBJECTID\&quot;: 247, \&quot;Shape_Leng\&quot;: 0.0929678582271, \&quot;Shape_Area\&quot;: 0.000205617157843, \&quot;zone\&quot;: \&quot;West Concourse\&quot;, \&quot;LocationID\&quot;: 247, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91222180499983, 40.84235659099988], [-73.91986089399987, 40.83194722699992], [-73.92885642099992, 40.81487986599991], [-73.93027812699984, 40.813248024999965], [-73.93242632000944, 40.81411751897961], [-73.9330725108407, 40.82815615201811], [-73.92850073899989, 40.829352349999965], [-73.92399049499993, 40.83505229799987], [-73.91901668400004, 40.83838109299989], [-73.91618344399991, 40.84233489999991], [-73.91794965199988, 40.842229570999976], [-73.91729224999992, 40.84510993999991], [-73.91222180499983, 40.84235659099988]]]}}, {\&quot;id\&quot;: \&quot;247\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6047957371225577, \&quot;OBJECTID\&quot;: 248, \&quot;Shape_Leng\&quot;: 0.0569191167671, \&quot;Shape_Area\&quot;: 0.000149592769799, \&quot;zone\&quot;: \&quot;West Farms/Bronx River\&quot;, \&quot;LocationID\&quot;: 248, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86393748099981, 40.84004456599994], [-73.86271114399993, 40.83299150899997], [-73.88378414099992, 40.828274291999946], [-73.88005188499987, 40.83470205899989], [-73.87379590199993, 40.837445132999896], [-73.87277204699981, 40.83975128199995], [-73.86448011799995, 40.84108779699994], [-73.86393748099981, 40.84004456599994]]]}}, {\&quot;id\&quot;: \&quot;248\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.30907245039802766, \&quot;OBJECTID\&quot;: 249, \&quot;Shape_Leng\&quot;: 0.03638434365, \&quot;Shape_Area\&quot;: 7.22155957729e-05, \&quot;zone\&quot;: \&quot;West Village\&quot;, \&quot;LocationID\&quot;: 249, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00250642399995, 40.729016384999966], [-74.0070902079999, 40.72877225299993], [-74.00515808199998, 40.74085808099991], [-73.99683993899998, 40.73736088899995], [-74.00250642399995, 40.729016384999966]]]}}, {\&quot;id\&quot;: \&quot;249\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6452546296296297, \&quot;OBJECTID\&quot;: 250, \&quot;Shape_Leng\&quot;: 0.0796263465454, \&quot;Shape_Area\&quot;: 0.000240975845956, \&quot;zone\&quot;: \&quot;Westchester Village/Unionport\&quot;, \&quot;LocationID\&quot;: 250, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8455308949999, 40.83917330699989], [-73.83936452799996, 40.84087706699995], [-73.83959108476137, 40.834041688045254], [-73.84390624999997, 40.82840782999993], [-73.84289858800003, 40.82408305899986], [-73.85513639799981, 40.822436188999866], [-73.857391213, 40.83229737199986], [-73.86033845899995, 40.833253165999935], [-73.85168459699997, 40.8342010519999], [-73.85333524999986, 40.84247015499987], [-73.85052278099987, 40.84278948899985], [-73.8455308949999, 40.83917330699989]]]}}, {\&quot;id\&quot;: \&quot;250\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.4626865671641791, \&quot;OBJECTID\&quot;: 251, \&quot;Shape_Leng\&quot;: 0.1377111611, \&quot;Shape_Area\&quot;: 0.000625754983157, \&quot;zone\&quot;: \&quot;Westerleigh\&quot;, \&quot;LocationID\&quot;: 251, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.13107460299996, 40.631147728999956], [-74.1313098529999, 40.62632834299998], [-74.12125677899994, 40.62782274999989], [-74.10552598799994, 40.618592329999906], [-74.0977696879999, 40.61062359299988], [-74.1156683379999, 40.611175384999896], [-74.13210459699991, 40.608152923999924], [-74.14471100599997, 40.60803429699994], [-74.14954343599996, 40.60962717299988], [-74.14696864199988, 40.610151355999896], [-74.14603562099998, 40.61701277699996], [-74.13982184799993, 40.61629982499988], [-74.13826358199992, 40.624243769999936], [-74.13581008299997, 40.62506433999991], [-74.13806393799992, 40.627568470999904], [-74.13107460299996, 40.631147728999956]]]}}, {\&quot;id\&quot;: \&quot;251\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5337837837837838, \&quot;OBJECTID\&quot;: 252, \&quot;Shape_Leng\&quot;: 0.158004373564, \&quot;Shape_Area\&quot;: 0.00102526406057, \&quot;zone\&quot;: \&quot;Whitestone\&quot;, \&quot;LocationID\&quot;: 252, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82049919995306, 40.80101146781907], [-73.81369963725258, 40.79707941566509], [-73.81225365567188, 40.79812694680175], [-73.79640953426332, 40.795728824199614], [-73.79442844782817, 40.794806810498535], [-73.79375126484103, 40.78906193333896], [-73.79058298999988, 40.78819290999989], [-73.79582463099997, 40.7861305879999], [-73.80242791599977, 40.786068273999945], [-73.8037902289999, 40.77561011199992], [-73.81485850699985, 40.776485922999875], [-73.81452997799975, 40.77888817499992], [-73.82331286899986, 40.77957865999986], [-73.82224127699999, 40.781693878999924], [-73.83869921299997, 40.781676956999874], [-73.83824429099994, 40.78778591599995], [-73.84008157499997, 40.78785153099992], [-73.83895676099984, 40.79143843099996], [-73.84081532599994, 40.7915048849999], [-73.84067828300006, 40.79390789199993], [-73.83663288911686, 40.79251637576927], [-73.83728024446076, 40.78900952077265], [-73.83251063648018, 40.788624476626765], [-73.83166080927866, 40.79110259115967], [-73.8278487557192, 40.79308767321416], [-73.82945991534359, 40.79682336759143], [-73.82506496699443, 40.79737577656827], [-73.82049919995306, 40.80101146781907]]]}}, {\&quot;id\&quot;: \&quot;252\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5381062355658198, \&quot;OBJECTID\&quot;: 253, \&quot;Shape_Leng\&quot;: 0.0360514998192, \&quot;Shape_Area\&quot;: 7.83395761191e-05, \&quot;zone\&quot;: \&quot;Willets Point\&quot;, \&quot;LocationID\&quot;: 253, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83908354399988, 40.76525691299991], [-73.83679107299986, 40.76116667099992], [-73.83867321899987, 40.75701997899995], [-73.84324381399976, 40.75533680399995], [-73.84670933714987, 40.76134526931977], [-73.84272819396486, 40.76462854893166], [-73.83908354399988, 40.76525691299991]]]}}, {\&quot;id\&quot;: \&quot;253\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6320254506892895, \&quot;OBJECTID\&quot;: 254, \&quot;Shape_Leng\&quot;: 0.0858863754861, \&quot;Shape_Area\&quot;: 0.000360040216032, \&quot;zone\&quot;: \&quot;Williamsbridge/Olinville\&quot;, \&quot;LocationID\&quot;: 254, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85186563799999, 40.87905886499989], [-73.85091896099982, 40.877893440999856], [-73.85254854099988, 40.877091586999924], [-73.8506895569999, 40.87548667799993], [-73.85363638799987, 40.87330059899996], [-73.85651292399994, 40.874217792999936], [-73.85661382499993, 40.87125016699991], [-73.87056192499989, 40.87151077799995], [-73.87019944899986, 40.87631135499987], [-73.860710982, 40.89537054399996], [-73.84590568599998, 40.889741368999864], [-73.85186563799999, 40.87905886499989]]]}}, {\&quot;id\&quot;: \&quot;254\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.323157726432142, \&quot;OBJECTID\&quot;: 255, \&quot;Shape_Leng\&quot;: 0.0623841997664, \&quot;Shape_Area\&quot;: 0.000172309184842, \&quot;zone\&quot;: \&quot;Williamsburg (North Side)\&quot;, \&quot;LocationID\&quot;: 255, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96176070375392, 40.72522879205536], [-73.95477662900004, 40.72245950499994], [-73.94907816799986, 40.72254028699993], [-73.94841638599995, 40.71845553299995], [-73.94721341799986, 40.718560985999865], [-73.95547596099992, 40.7122654259999], [-73.96736391666703, 40.71648367952745], [-73.96176070375392, 40.72522879205536]]]}}, {\&quot;id\&quot;: \&quot;255\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.3502633655734395, \&quot;OBJECTID\&quot;: 256, \&quot;Shape_Leng\&quot;: 0.0679149669603, \&quot;Shape_Area\&quot;: 0.000168611097013, \&quot;zone\&quot;: \&quot;Williamsburg (South Side)\&quot;, \&quot;LocationID\&quot;: 256, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95834207500002, 40.71330630099992], [-73.95547596099992, 40.7122654259999], [-73.95433904200002, 40.714071701999906], [-73.94937231899985, 40.71406687799986], [-73.94865533499987, 40.70972498299988], [-73.95087492699996, 40.70951311499991], [-73.95023693799996, 40.70547324699994], [-73.9579043079999, 40.70842717299994], [-73.958455768, 40.707251846999895], [-73.96838933699995, 40.70682918699989], [-73.96984864823531, 40.708003041687675], [-73.96736391666705, 40.71648367902752], [-73.95834207500002, 40.71330630099992]]]}}, {\&quot;id\&quot;: \&quot;256\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.39972197649437635, \&quot;OBJECTID\&quot;: 257, \&quot;Shape_Leng\&quot;: 0.0586690259793, \&quot;Shape_Area\&quot;: 0.00013890947321, \&quot;zone\&quot;: \&quot;Windsor Terrace\&quot;, \&quot;LocationID\&quot;: 257, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97984261899994, 40.660727440999956], [-73.97436701299992, 40.65818790399992], [-73.97084113699994, 40.64637857099993], [-73.97777380600002, 40.645341876999964], [-73.97819074399992, 40.64752599199992], [-73.98029115499993, 40.647297160999855], [-73.98179568699996, 40.65524609699991], [-73.98843135299977, 40.65925121199996], [-73.9868846449999, 40.6603663889999], [-73.985086794, 40.65901328799989], [-73.982230342, 40.66214149199994], [-73.97984261899994, 40.660727440999956]]]}}, {\&quot;id\&quot;: \&quot;257\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.5877040639110802, \&quot;OBJECTID\&quot;: 258, \&quot;Shape_Leng\&quot;: 0.0890133787693, \&quot;Shape_Area\&quot;: 0.000366209617143, \&quot;zone\&quot;: \&quot;Woodhaven\&quot;, \&quot;LocationID\&quot;: 258, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8450419489999, 40.68931894699996], [-73.84119605699982, 40.68335136599989], [-73.84786817599985, 40.681486831999905], [-73.85197864599989, 40.682564210999864], [-73.85099089299987, 40.68056836699987], [-73.85392389199987, 40.679686155999875], [-73.85819836099995, 40.67943084899987], [-73.85878576899987, 40.68063046299989], [-73.86334943599995, 40.67935163999989], [-73.86410096700003, 40.68237284999988], [-73.86602666899996, 40.681918051999915], [-73.86868454399996, 40.694034691999924], [-73.85277238699999, 40.69755711199987], [-73.85443455699989, 40.70060295199994], [-73.85070842300001, 40.70020312499988], [-73.8450419489999, 40.68931894699996]]]}}, {\&quot;id\&quot;: \&quot;258\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6758304696449027, \&quot;OBJECTID\&quot;: 259, \&quot;Shape_Leng\&quot;: 0.126750305191, \&quot;Shape_Area\&quot;: 0.000394552487366, \&quot;zone\&quot;: \&quot;Woodlawn/Wakefield\&quot;, \&quot;LocationID\&quot;: 259, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.851071161919, 40.91037152011096], [-73.85347522366716, 40.90753029351422], [-73.84138689269206, 40.90417274176649], [-73.83554853999995, 40.88913350399993], [-73.84704957999995, 40.8876718159999], [-73.84590568599998, 40.889741368999864], [-73.860710982, 40.89537054399996], [-73.87048672599987, 40.896640210999905], [-73.8771197409999, 40.895468663999964], [-73.86789043706806, 40.90298695407611], [-73.85946778750369, 40.90051720913338], [-73.85957882974115, 40.9024408428857], [-73.85601023344621, 40.9053059838135], [-73.85681013619275, 40.90615582816297], [-73.85374103615364, 40.90778791636777], [-73.85458940544117, 40.9089394991491], [-73.851071161919, 40.91037152011096]]]}}, {\&quot;id\&quot;: \&quot;259\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.6612424781761166, \&quot;OBJECTID\&quot;: 260, \&quot;Shape_Leng\&quot;: 0.133514154636, \&quot;Shape_Area\&quot;: 0.000422345326907, \&quot;zone\&quot;: \&quot;Woodside\&quot;, \&quot;LocationID\&quot;: 260, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9017537339999, 40.760775474999946], [-73.90147053099994, 40.759633049999884], [-73.89866137799999, 40.759921016999904], [-73.89976862099998, 40.75666423699991], [-73.8949120899999, 40.74428123099996], [-73.90057825399985, 40.73949289599988], [-73.90926002999988, 40.736403179999854], [-73.91068876399997, 40.73347108099995], [-73.90628903499987, 40.732400751999876], [-73.90516948899983, 40.73585964299986], [-73.90107970900003, 40.73391463399987], [-73.90712253099991, 40.727424727999924], [-73.91174734199988, 40.72991203299991], [-73.91205021299994, 40.72850636299993], [-73.91796696699996, 40.7285007709999], [-73.917342506, 40.731382825999916], [-73.91903825199986, 40.73200596599987], [-73.91651190599994, 40.738944757999874], [-73.9137938869998, 40.742514491999934], [-73.9119412979999, 40.742382948999925], [-73.91190979099993, 40.748105394999875], [-73.90945182799983, 40.75065550699994], [-73.91067474899997, 40.752995076999895], [-73.90631505099988, 40.75984387599992], [-73.90779405499987, 40.760517799999896], [-73.90356915599997, 40.765781788999924], [-73.9017537339999, 40.760775474999946]]]}}, {\&quot;id\&quot;: \&quot;260\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.40379712206598456, \&quot;OBJECTID\&quot;: 261, \&quot;Shape_Leng\&quot;: 0.0271204563616, \&quot;Shape_Area\&quot;: 3.43423231652e-05, \&quot;zone\&quot;: \&quot;World Trade Center\&quot;, \&quot;LocationID\&quot;: 261, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01332610899989, 40.7050307879999], [-74.01668613099999, 40.70479933799992], [-74.01375388499997, 40.71369055499987], [-74.00860085399992, 40.711392239999945], [-74.01332610899989, 40.7050307879999]]]}}, {\&quot;id\&quot;: \&quot;261\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.37741681139529365, \&quot;OBJECTID\&quot;: 262, \&quot;Shape_Leng\&quot;: 0.0490636231541, \&quot;Shape_Area\&quot;: 0.000122330270966, \&quot;zone\&quot;: \&quot;Yorkville East\&quot;, \&quot;LocationID\&quot;: 262, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.94383256699986, 40.78285908899991], [-73.94207418803879, 40.77691784697707], [-73.94293043781381, 40.774676268035776], [-73.9474897547817, 40.77011515400953], [-73.95268514999995, 40.772339404999926], [-73.94383256699986, 40.78285908899991]]], [[[-73.93804640603422, 40.78082954427547], [-73.93759894622617, 40.78046784086141], [-73.93958378972465, 40.779576474007136], [-73.9387442308927, 40.78104387604228], [-73.93804640603422, 40.78082954427547]]]]}}, {\&quot;id\&quot;: \&quot;262\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;payment_type\&quot;: 0.36019673393354124, \&quot;OBJECTID\&quot;: 263, \&quot;Shape_Leng\&quot;: 0.0370166252994, \&quot;Shape_Area\&quot;: 6.57697664169e-05, \&quot;zone\&quot;: \&quot;Yorkville West\&quot;, \&quot;LocationID\&quot;: 263, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95218621999996, 40.7730198449999], [-73.95729409999986, 40.7742835549999], [-73.94933170599992, 40.78519312699994], [-73.94472264499986, 40.78324757199987], [-73.95218621999996, 40.7730198449999]]]}}]}&quot;},&quot;id&quot;:&quot;10ea5377-ee43-4b43-9633-3c452e6ae727&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;eee50ee7-f6fd-4709-b706-20e6342ba4eb&quot;,&quot;type&quot;:&quot;PanTool&quot;},{&quot;attributes&quot;:{&quot;dimension&quot;:1,&quot;plot&quot;:{&quot;id&quot;:&quot;ae53cc6f-7f97-4812-a208-ab913d90eb10&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;26eacfd5-0f25-4429-acdb-7da3f6282337&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;36cfaa0d-2256-478f-9e32-09a8af5f4faf&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;attributes&quot;:{&quot;color_mapper&quot;:{&quot;id&quot;:&quot;fe7eac4c-a6ac-449b-a2da-89f027e5010b&quot;,&quot;type&quot;:&quot;LogColorMapper&quot;},&quot;formatter&quot;:{&quot;id&quot;:&quot;7b7b968c-bf9d-4fda-ad38-7e3a534a2390&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;label_standoff&quot;:12,&quot;location&quot;:[0,0],&quot;plot&quot;:{&quot;id&quot;:&quot;ae53cc6f-7f97-4812-a208-ab913d90eb10&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;cdd73a27-a419-4f2d-be6c-98f427087f04&quot;,&quot;type&quot;:&quot;BasicTicker&quot;}},&quot;id&quot;:&quot;01599911-7bd9-4ceb-93b4-1d76c6b84013&quot;,&quot;type&quot;:&quot;ColorBar&quot;},{&quot;attributes&quot;:{&quot;active_drag&quot;:&quot;auto&quot;,&quot;active_inspect&quot;:&quot;auto&quot;,&quot;active_scroll&quot;:&quot;auto&quot;,&quot;active_tap&quot;:&quot;auto&quot;,&quot;tools&quot;:[{&quot;id&quot;:&quot;6351fc86-4cb0-48f1-906d-40c4646bf983&quot;,&quot;type&quot;:&quot;PanTool&quot;},{&quot;id&quot;:&quot;f6f9dda6-1d51-4e39-80d2-22bb8a3e4a7d&quot;,&quot;type&quot;:&quot;WheelZoomTool&quot;},{&quot;id&quot;:&quot;4c82bbf0-af1f-4b96-b5c7-19931b678383&quot;,&quot;type&quot;:&quot;BoxZoomTool&quot;},{&quot;id&quot;:&quot;4a794f89-97c4-4344-b538-0ef0498b3219&quot;,&quot;type&quot;:&quot;SaveTool&quot;},{&quot;id&quot;:&quot;7f3fe531-7586-4d07-b55d-917e998d17dc&quot;,&quot;type&quot;:&quot;ResetTool&quot;},{&quot;id&quot;:&quot;2693a195-e9cc-48e0-b8c7-94ab6f8d0cf7&quot;,&quot;type&quot;:&quot;HelpTool&quot;},{&quot;id&quot;:&quot;24f7aaa5-0834-45f8-a0a9-6bf207fb7a90&quot;,&quot;type&quot;:&quot;HoverTool&quot;}]},&quot;id&quot;:&quot;c72f958d-87e1-4f05-9a9b-e2316d42004b&quot;,&quot;type&quot;:&quot;Toolbar&quot;},{&quot;attributes&quot;:{&quot;below&quot;:[{&quot;id&quot;:&quot;981a4af8-3ccf-4507-8498-13e2a0e4095e&quot;,&quot;type&quot;:&quot;LinearAxis&quot;}],&quot;left&quot;:[{&quot;id&quot;:&quot;fd734f94-2867-4ad8-957e-b2b46fc077fc&quot;,&quot;type&quot;:&quot;LinearAxis&quot;}],&quot;renderers&quot;:[{&quot;id&quot;:&quot;981a4af8-3ccf-4507-8498-13e2a0e4095e&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;id&quot;:&quot;fe6ec5d9-95fe-4fc8-b82e-9574f7c0d667&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;id&quot;:&quot;fd734f94-2867-4ad8-957e-b2b46fc077fc&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;id&quot;:&quot;e47b8c6a-ee73-4698-8e94-0349d21c6c88&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;id&quot;:&quot;b63fb838-d1f0-4417-b06a-2253fff02424&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;},{&quot;id&quot;:&quot;698fbc56-a4d3-478b-bd22-f23784c8fbf5&quot;,&quot;type&quot;:&quot;GlyphRenderer&quot;}],&quot;title&quot;:{&quot;id&quot;:&quot;2860cfea-9a49-4816-b1ef-156fc5fef34d&quot;,&quot;type&quot;:&quot;Title&quot;},&quot;toolbar&quot;:{&quot;id&quot;:&quot;e103e054-aec9-4b1c-a5c7-a9229ea8251e&quot;,&quot;type&quot;:&quot;Toolbar&quot;},&quot;x_range&quot;:{&quot;id&quot;:&quot;488c23b0-642f-43c5-a709-d530ececa55a&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},&quot;x_scale&quot;:{&quot;id&quot;:&quot;2e37b525-1a12-4a01-9264-a099c6ca242b&quot;,&quot;type&quot;:&quot;LinearScale&quot;},&quot;y_range&quot;:{&quot;id&quot;:&quot;be2f1631-6335-467f-9d36-88a1e10dee8c&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},&quot;y_scale&quot;:{&quot;id&quot;:&quot;26612bd9-9ba6-4d61-95ab-5284b5499ee3&quot;,&quot;type&quot;:&quot;LinearScale&quot;}},&quot;id&quot;:&quot;62ba6d47-3ae9-4aa5-be3a-40808ec4ef1a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},{&quot;attributes&quot;:{&quot;formatter&quot;:{&quot;id&quot;:&quot;f3b86a6f-66d5-48ed-adbf-ebdc3e9fd079&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;plot&quot;:{&quot;id&quot;:&quot;62ba6d47-3ae9-4aa5-be3a-40808ec4ef1a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;7d621023-4d97-44a1-8ccf-0992cf3ef267&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;fd734f94-2867-4ad8-957e-b2b46fc077fc&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;attributes&quot;:{&quot;below&quot;:[{&quot;id&quot;:&quot;1b83b15e-0089-4812-ad82-87c5a6ed9480&quot;,&quot;type&quot;:&quot;LinearAxis&quot;}],&quot;left&quot;:[{&quot;id&quot;:&quot;eee6a093-e6be-4073-88b7-824d43352607&quot;,&quot;type&quot;:&quot;LinearAxis&quot;}],&quot;renderers&quot;:[{&quot;id&quot;:&quot;1b83b15e-0089-4812-ad82-87c5a6ed9480&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;id&quot;:&quot;5ab58e62-0c50-4e83-a7f6-40cf7b7ce86c&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;id&quot;:&quot;eee6a093-e6be-4073-88b7-824d43352607&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;id&quot;:&quot;f396af5d-43b1-43d6-ad17-82a9e1272208&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;id&quot;:&quot;be3cc134-22fc-4afb-bd0a-a527d820071d&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;},{&quot;id&quot;:&quot;3b1fa4e4-5bf6-4bf4-85d2-091d7ff789d5&quot;,&quot;type&quot;:&quot;GlyphRenderer&quot;},{&quot;id&quot;:&quot;3f99e069-bc47-41e6-9ed0-a9e0856d105c&quot;,&quot;type&quot;:&quot;ColorBar&quot;}],&quot;right&quot;:[{&quot;id&quot;:&quot;3f99e069-bc47-41e6-9ed0-a9e0856d105c&quot;,&quot;type&quot;:&quot;ColorBar&quot;}],&quot;title&quot;:{&quot;id&quot;:&quot;27996c4c-da44-4dda-b78a-1aeaac693387&quot;,&quot;type&quot;:&quot;Title&quot;},&quot;toolbar&quot;:{&quot;id&quot;:&quot;c72f958d-87e1-4f05-9a9b-e2316d42004b&quot;,&quot;type&quot;:&quot;Toolbar&quot;},&quot;x_range&quot;:{&quot;id&quot;:&quot;5c81d120-72b6-43b4-824c-758a8d5e8726&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},&quot;x_scale&quot;:{&quot;id&quot;:&quot;c936782d-eea5-4fb4-bd79-1d11686a2dfa&quot;,&quot;type&quot;:&quot;LinearScale&quot;},&quot;y_range&quot;:{&quot;id&quot;:&quot;f0c21fdb-3905-4866-bbf5-d191494f134c&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},&quot;y_scale&quot;:{&quot;id&quot;:&quot;9d08d013-0e4e-429d-a37a-b7275a5c84b8&quot;,&quot;type&quot;:&quot;LinearScale&quot;}},&quot;id&quot;:&quot;3058396c-651f-4f74-b4de-a7e737c8665a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null},&quot;id&quot;:&quot;24209739-d5c4-4529-abcf-6ff415a2dfd5&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},{&quot;attributes&quot;:{&quot;palette&quot;:[&quot;#053061&quot;,&quot;#2166ac&quot;,&quot;#4393c3&quot;,&quot;#92c5de&quot;,&quot;#d1e5f0&quot;,&quot;#f7f7f7&quot;,&quot;#fddbc7&quot;,&quot;#f4a582&quot;,&quot;#d6604d&quot;,&quot;#b2182b&quot;,&quot;#67001f&quot;]},&quot;id&quot;:&quot;fd673fd5-348f-4441-b09b-846332ca8ea1&quot;,&quot;type&quot;:&quot;LinearColorMapper&quot;},{&quot;attributes&quot;:{&quot;active_drag&quot;:&quot;auto&quot;,&quot;active_inspect&quot;:&quot;auto&quot;,&quot;active_scroll&quot;:&quot;auto&quot;,&quot;active_tap&quot;:&quot;auto&quot;,&quot;tools&quot;:[{&quot;id&quot;:&quot;6960645d-737b-442b-a2f0-cdb7e93d4e91&quot;,&quot;type&quot;:&quot;PanTool&quot;},{&quot;id&quot;:&quot;5150062a-68b9-4228-a3ca-5a2795f8ae24&quot;,&quot;type&quot;:&quot;WheelZoomTool&quot;},{&quot;id&quot;:&quot;ee3c44cb-3c2f-4de1-82d6-8a8ccf913021&quot;,&quot;type&quot;:&quot;BoxZoomTool&quot;},{&quot;id&quot;:&quot;a0586146-b37e-490f-a532-dc621364d57f&quot;,&quot;type&quot;:&quot;SaveTool&quot;},{&quot;id&quot;:&quot;f7b30ba4-fd79-4d13-a3c7-49803d251345&quot;,&quot;type&quot;:&quot;ResetTool&quot;},{&quot;id&quot;:&quot;d9c616aa-dc6d-4459-af43-73444362b3b2&quot;,&quot;type&quot;:&quot;HelpTool&quot;},{&quot;id&quot;:&quot;a84bfab3-9687-4112-8322-4e604f5954f2&quot;,&quot;type&quot;:&quot;HoverTool&quot;}]},&quot;id&quot;:&quot;e103e054-aec9-4b1c-a5c7-a9229ea8251e&quot;,&quot;type&quot;:&quot;Toolbar&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;7b7b968c-bf9d-4fda-ad38-7e3a534a2390&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{&quot;formatter&quot;:{&quot;id&quot;:&quot;d41fbb68-5ad0-439f-87ea-f1e11384576c&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;plot&quot;:{&quot;id&quot;:&quot;ae53cc6f-7f97-4812-a208-ab913d90eb10&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;26eacfd5-0f25-4429-acdb-7da3f6282337&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;e0e3f2e8-d02e-461e-ad09-3f799e56ae49&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;b868a9e2-54ac-4484-a27c-2920d66d903b&quot;,&quot;type&quot;:&quot;LinearScale&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;7d621023-4d97-44a1-8ccf-0992cf3ef267&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{&quot;plot&quot;:null,&quot;text&quot;:&quot;Fraction of rides that tip in cash&quot;},&quot;id&quot;:&quot;94dcf2d1-8432-4868-9512-d05dfca60e65&quot;,&quot;type&quot;:&quot;Title&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null},&quot;id&quot;:&quot;488c23b0-642f-43c5-a709-d530ececa55a&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},{&quot;attributes&quot;:{&quot;formatter&quot;:{&quot;id&quot;:&quot;502eda31-9e62-48de-b5af-2bd75bfc8082&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;plot&quot;:{&quot;id&quot;:&quot;ae53cc6f-7f97-4812-a208-ab913d90eb10&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;72328d45-1f26-4e3d-9388-ba39a0b07bbd&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;2a692866-0932-40ef-ab57-5680f5882b98&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;72328d45-1f26-4e3d-9388-ba39a0b07bbd&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;7077852c-6855-4480-8785-509b9fbeb00e&quot;,&quot;type&quot;:&quot;LinearScale&quot;},{&quot;attributes&quot;:{&quot;source&quot;:{&quot;id&quot;:&quot;18193dc2-af18-430d-8541-849ff6cf74a5&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;}},&quot;id&quot;:&quot;4bcfec7d-c05c-448a-94b4-1d2866409a23&quot;,&quot;type&quot;:&quot;CDSView&quot;},{&quot;attributes&quot;:{&quot;factors&quot;:[&quot;EWR&quot;,&quot;Queens&quot;,&quot;Bronx&quot;,&quot;Manhattan&quot;,&quot;Staten Island&quot;,&quot;Brooklyn&quot;],&quot;palette&quot;:[&quot;#1f77b4&quot;,&quot;#ff7f0e&quot;,&quot;#2ca02c&quot;,&quot;#d62728&quot;,&quot;#9467bd&quot;,&quot;#8c564b&quot;,&quot;#e377c2&quot;,&quot;#7f7f7f&quot;,&quot;#bcbd22&quot;,&quot;#17becf&quot;]},&quot;id&quot;:&quot;6f4f819e-7190-454c-a7a3-ba5d768d5c31&quot;,&quot;type&quot;:&quot;CategoricalColorMapper&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null},&quot;id&quot;:&quot;d92819cb-157e-408e-979a-4aab8e0d4596&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;62e9be12-1576-4008-82b6-0a61f5cf77ea&quot;,&quot;type&quot;:&quot;LinearScale&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;2a08cff9-d6de-4308-8dfb-94ef1c977983&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;7eade2b2-57b6-47a4-9a00-ec5b4a408ce6&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null},&quot;id&quot;:&quot;be2f1631-6335-467f-9d36-88a1e10dee8c&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null},&quot;id&quot;:&quot;5c81d120-72b6-43b4-824c-758a8d5e8726&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},{&quot;attributes&quot;:{&quot;plot&quot;:null,&quot;text&quot;:&quot;Number of rides&quot;},&quot;id&quot;:&quot;a4bd85d5-54d7-4339-95e8-726aa5564454&quot;,&quot;type&quot;:&quot;Title&quot;},{&quot;attributes&quot;:{&quot;active_drag&quot;:&quot;auto&quot;,&quot;active_inspect&quot;:&quot;auto&quot;,&quot;active_scroll&quot;:&quot;auto&quot;,&quot;active_tap&quot;:&quot;auto&quot;,&quot;tools&quot;:[{&quot;id&quot;:&quot;ed93bc07-ab38-4459-adf7-0bce0b3fe3b5&quot;,&quot;type&quot;:&quot;PanTool&quot;},{&quot;id&quot;:&quot;022fd809-ec00-4851-b661-c49991bfae3a&quot;,&quot;type&quot;:&quot;WheelZoomTool&quot;},{&quot;id&quot;:&quot;9bdf7e1b-f00b-4377-87b0-82d52037d7df&quot;,&quot;type&quot;:&quot;BoxZoomTool&quot;},{&quot;id&quot;:&quot;d301bef6-61e1-4d2e-85d6-2a8e369373b7&quot;,&quot;type&quot;:&quot;SaveTool&quot;},{&quot;id&quot;:&quot;0d27ecfc-706b-4857-9f4b-080d014b15e4&quot;,&quot;type&quot;:&quot;ResetTool&quot;},{&quot;id&quot;:&quot;085f3735-0ce5-463d-99a2-c12f409f4b0e&quot;,&quot;type&quot;:&quot;HelpTool&quot;},{&quot;id&quot;:&quot;05d6bea6-6455-4d7f-a047-890c32987b9a&quot;,&quot;type&quot;:&quot;HoverTool&quot;}]},&quot;id&quot;:&quot;61f82afe-2e85-4d6b-8872-1435a20bc13a&quot;,&quot;type&quot;:&quot;Toolbar&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null,&quot;point_policy&quot;:&quot;follow_mouse&quot;,&quot;tooltips&quot;:&quot;&lt;div&gt;&lt;b&gt;Borough&lt;/b&gt;: @borough&lt;/div&gt;&lt;div&gt;&lt;b&gt;Zone&lt;/b&gt;: @zone&lt;/div&gt;&lt;div&gt;&lt;b&gt;Tip Fraction&lt;/b&gt;: @tip_fraction&lt;/div&gt;&quot;},&quot;id&quot;:&quot;24f7aaa5-0834-45f8-a0a9-6bf207fb7a90&quot;,&quot;type&quot;:&quot;HoverTool&quot;},{&quot;attributes&quot;:{&quot;active_drag&quot;:&quot;auto&quot;,&quot;active_inspect&quot;:&quot;auto&quot;,&quot;active_scroll&quot;:&quot;auto&quot;,&quot;active_tap&quot;:&quot;auto&quot;,&quot;tools&quot;:[{&quot;id&quot;:&quot;eee50ee7-f6fd-4709-b706-20e6342ba4eb&quot;,&quot;type&quot;:&quot;PanTool&quot;},{&quot;id&quot;:&quot;6a2d253b-ce19-4ab5-8e57-e3afe7f8a209&quot;,&quot;type&quot;:&quot;WheelZoomTool&quot;},{&quot;id&quot;:&quot;5e99a9d3-a981-45fc-8281-f0e7c0c6021c&quot;,&quot;type&quot;:&quot;BoxZoomTool&quot;},{&quot;id&quot;:&quot;8b6fba3c-2dc4-43a3-9e6b-3b0aa55f67a7&quot;,&quot;type&quot;:&quot;SaveTool&quot;},{&quot;id&quot;:&quot;3b6a7eac-00a3-410a-8bc1-41a46ac7b38a&quot;,&quot;type&quot;:&quot;ResetTool&quot;},{&quot;id&quot;:&quot;aa4113e2-b3e7-4170-a486-16fa7c11995b&quot;,&quot;type&quot;:&quot;HelpTool&quot;},{&quot;id&quot;:&quot;bf29975f-fcdb-444f-ad6b-270f10ab2b06&quot;,&quot;type&quot;:&quot;HoverTool&quot;}]},&quot;id&quot;:&quot;f408f7d2-a34f-43a8-8561-003142236b1c&quot;,&quot;type&quot;:&quot;Toolbar&quot;},{&quot;attributes&quot;:{&quot;plot&quot;:{&quot;id&quot;:&quot;62ba6d47-3ae9-4aa5-be3a-40808ec4ef1a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;2a08cff9-d6de-4308-8dfb-94ef1c977983&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;fe6ec5d9-95fe-4fc8-b82e-9574f7c0d667&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;attributes&quot;:{&quot;plot&quot;:null,&quot;text&quot;:&quot;&quot;},&quot;id&quot;:&quot;2860cfea-9a49-4816-b1ef-156fc5fef34d&quot;,&quot;type&quot;:&quot;Title&quot;},{&quot;attributes&quot;:{&quot;data_source&quot;:{&quot;id&quot;:&quot;76c418d0-c7d9-48f9-8111-ae726987d2b2&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;},&quot;glyph&quot;:{&quot;id&quot;:&quot;f1f65e0f-b376-4763-ba65-310d09a85747&quot;,&quot;type&quot;:&quot;Patches&quot;},&quot;hover_glyph&quot;:null,&quot;muted_glyph&quot;:null,&quot;nonselection_glyph&quot;:{&quot;id&quot;:&quot;027cf8e6-f083-4db2-bf4b-6e525b959e2d&quot;,&quot;type&quot;:&quot;Patches&quot;},&quot;selection_glyph&quot;:null,&quot;view&quot;:{&quot;id&quot;:&quot;a00c5370-a7c6-4a7c-8839-0d6510dfa166&quot;,&quot;type&quot;:&quot;CDSView&quot;}},&quot;id&quot;:&quot;45c59d93-f760-4cc4-a732-46d46cef1f47&quot;,&quot;type&quot;:&quot;GlyphRenderer&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null,&quot;geojson&quot;:&quot;{\&quot;type\&quot;: \&quot;FeatureCollection\&quot;, \&quot;features\&quot;: [{\&quot;id\&quot;: \&quot;2\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2754100159069716, \&quot;OBJECTID\&quot;: 3, \&quot;Shape_Leng\&quot;: 0.0843411059012, \&quot;Shape_Area\&quot;: 0.000314414156821, \&quot;zone\&quot;: \&quot;Allerton/Pelham Gardens\&quot;, \&quot;LocationID\&quot;: 3, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84792614099985, 40.87134223399991], [-73.82950892699994, 40.86184121299988], [-73.82834347399992, 40.86089202599988], [-73.8368191849999, 40.85727680899989], [-73.8566377469999, 40.8581191719999], [-73.85780378799993, 40.86303621699989], [-73.85961281199982, 40.865512717999856], [-73.86156274099987, 40.86554946399989], [-73.86137924099984, 40.8713365119999], [-73.85661382499993, 40.87125016699991], [-73.85651292399994, 40.874217792999936], [-73.84792614099985, 40.87134223399991]]]}}, {\&quot;id\&quot;: \&quot;3\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20128964432728239, \&quot;OBJECTID\&quot;: 4, \&quot;Shape_Leng\&quot;: 0.0435665270921, \&quot;Shape_Area\&quot;: 0.000111871946192, \&quot;zone\&quot;: \&quot;Alphabet City\&quot;, \&quot;LocationID\&quot;: 4, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97177410965318, 40.72582128133705], [-73.97347975574512, 40.71886142911285], [-73.98382387299982, 40.72147287199987], [-73.97802697999985, 40.729433059999984], [-73.97177410965318, 40.72582128133705]]]}}, {\&quot;id\&quot;: \&quot;4\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2386701533140724, \&quot;OBJECTID\&quot;: 5, \&quot;Shape_Leng\&quot;: 0.0921464898574, \&quot;Shape_Area\&quot;: 0.000497957489363, \&quot;zone\&quot;: \&quot;Arden Heights\&quot;, \&quot;LocationID\&quot;: 5, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.17421738099989, 40.56256808599987], [-74.17185166499996, 40.56152092299991], [-74.18018524699995, 40.54837960899992], [-74.18903145199995, 40.53815934199989], [-74.19377169299999, 40.53583384699993], [-74.20314825999996, 40.55606178499986], [-74.20046730799992, 40.55623049099987], [-74.19317388399995, 40.56260434399992], [-74.18340311699991, 40.56540496199994], [-74.17421738099989, 40.56256808599987]]]}}, {\&quot;id\&quot;: \&quot;5\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.35032516419868276, \&quot;OBJECTID\&quot;: 6, \&quot;Shape_Leng\&quot;: 0.150490542523, \&quot;Shape_Area\&quot;: 0.000606460984581, \&quot;zone\&quot;: \&quot;Arrochar/Fort Wadsworth\&quot;, \&quot;LocationID\&quot;: 6, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.06367318899999, 40.60219816599994], [-74.0651709129999, 40.604213507999894], [-74.05685812390232, 40.608056357772554], [-74.05381069805436, 40.605912718852984], [-74.05222826954189, 40.599776102303636], [-74.06503332378131, 40.58899099843518], [-74.07043976099992, 40.59673474699988], [-74.08173342999991, 40.59215628599987], [-74.08376862299998, 40.595520956999934], [-74.08587511899998, 40.59589012099985], [-74.0814942209999, 40.599081990999935], [-74.08184498199992, 40.601535196999926], [-74.08947630599992, 40.60090432199991], [-74.09172051499995, 40.59922085699985], [-74.09271908099993, 40.60636222199992], [-74.09045495899996, 40.60909452599991], [-74.06367318899999, 40.60219816599994]]]}}, {\&quot;id\&quot;: \&quot;6\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2124765567833194, \&quot;OBJECTID\&quot;: 7, \&quot;Shape_Leng\&quot;: 0.107417171123, \&quot;Shape_Area\&quot;: 0.000389787989274, \&quot;zone\&quot;: \&quot;Astoria\&quot;, \&quot;LocationID\&quot;: 7, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90413637799996, 40.76752031699986], [-73.90202516599992, 40.767416783999884], [-73.90779405499987, 40.760517799999896], [-73.90631505099988, 40.75984387599992], [-73.91023124699991, 40.75297652299985], [-73.91763192900005, 40.75385784899993], [-73.92562743799996, 40.75213724499991], [-73.92415699999985, 40.753961141999845], [-73.93679091699993, 40.75988288099991], [-73.93398092100001, 40.76282598199987], [-73.93858976899998, 40.766817358999916], [-73.93493511099992, 40.76701302399987], [-73.93344468499993, 40.768817789999915], [-73.92425288799978, 40.76472456399995], [-73.92218946199995, 40.767267356999895], [-73.91977764799998, 40.7661521839999], [-73.91849336999996, 40.76773465699995], [-73.91995596899991, 40.768440064999865], [-73.91811686499992, 40.77002848599989], [-73.90413637799996, 40.76752031699986]]]}}, {\&quot;id\&quot;: \&quot;7\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21507594133064187, \&quot;OBJECTID\&quot;: 8, \&quot;Shape_Leng\&quot;: 0.0275906911574, \&quot;Shape_Area\&quot;: 2.6587716279e-05, \&quot;zone\&quot;: \&quot;Astoria Park\&quot;, \&quot;LocationID\&quot;: 8, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92334041500001, 40.77512891199993], [-73.92827730816353, 40.77689897516217], [-73.91996458796496, 40.78263506876824], [-73.91796581399998, 40.78125629099988], [-73.92375761299998, 40.77654701199991], [-73.92334041500001, 40.77512891199993]]]}}, {\&quot;id\&quot;: \&quot;8\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.25747118529129204, \&quot;OBJECTID\&quot;: 9, \&quot;Shape_Leng\&quot;: 0.0997840924705, \&quot;Shape_Area\&quot;: 0.000338443803197, \&quot;zone\&quot;: \&quot;Auburndale\&quot;, \&quot;LocationID\&quot;: 9, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.78502434699996, 40.761036515999855], [-73.77573836999991, 40.74332564699993], [-73.79672497900003, 40.738416642999894], [-73.79723084999992, 40.74169550699993], [-73.7944636839999, 40.74497002199991], [-73.79472264899997, 40.74759932999989], [-73.79729524699995, 40.74943505299987], [-73.79471901099991, 40.75064761699991], [-73.79493246199993, 40.75779802999994], [-73.79031517, 40.75782345099988], [-73.79076004599987, 40.76098576899991], [-73.79343991199988, 40.760764127999934], [-73.79317944599984, 40.77040317799988], [-73.78502434699996, 40.761036515999855]]]}}, {\&quot;id\&quot;: \&quot;9\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20393170306830094, \&quot;OBJECTID\&quot;: 10, \&quot;Shape_Leng\&quot;: 0.0998394794152, \&quot;Shape_Area\&quot;: 0.000435823818081, \&quot;zone\&quot;: \&quot;Baisley Park\&quot;, \&quot;LocationID\&quot;: 10, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7832662499999, 40.68999429299992], [-73.77966850599998, 40.685377122999945], [-73.77699767599997, 40.68628268899992], [-73.77220275299989, 40.681610338999896], [-73.78025859499995, 40.6778409239999], [-73.78573730899993, 40.67238503499988], [-73.78808647399985, 40.6730096269999], [-73.78940999399993, 40.66684115799993], [-73.80155565300004, 40.6667533639999], [-73.80142836799988, 40.673666833999874], [-73.80576840199991, 40.682932390999916], [-73.79898209099989, 40.68485873699989], [-73.79995042799996, 40.68682771899991], [-73.79561486799987, 40.688656890999916], [-73.793908417, 40.68630469099985], [-73.7832662499999, 40.68999429299992]]]}}, {\&quot;id\&quot;: \&quot;10\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2038587415178357, \&quot;OBJECTID\&quot;: 11, \&quot;Shape_Leng\&quot;: 0.0792110389596, \&quot;Shape_Area\&quot;: 0.00026452053504, \&quot;zone\&quot;: \&quot;Bath Beach\&quot;, \&quot;LocationID\&quot;: 11, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00109809499993, 40.60303462599992], [-73.99559320799995, 40.600232221999875], [-74.00200394754667, 40.594132371137796], [-74.01041238886523, 40.60047518174621], [-74.01942760861903, 40.602871578425265], [-74.01549854999998, 40.606841523999925], [-74.01701910199995, 40.60765441699994], [-74.01050403599997, 40.613896610999866], [-74.00094408399997, 40.60863970999988], [-74.00493448899994, 40.60507440599987], [-74.00109809499993, 40.60303462599992]]]}}, {\&quot;id\&quot;: \&quot;11\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20504672364754467, \&quot;OBJECTID\&quot;: 12, \&quot;Shape_Leng\&quot;: 0.0366613013579, \&quot;Shape_Area\&quot;: 4.15116236727e-05, \&quot;zone\&quot;: \&quot;Battery Park\&quot;, \&quot;LocationID\&quot;: 12, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01565756599994, 40.70483308799993], [-74.01425861399996, 40.70448944299991], [-74.01376867799992, 40.7011432629999], [-74.014220631955, 40.70011149186829], [-74.0176479750685, 40.70349459987955], [-74.01565756599994, 40.70483308799993]]]}}, {\&quot;id\&quot;: \&quot;12\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.1986931306821436, \&quot;OBJECTID\&quot;: 13, \&quot;Shape_Leng\&quot;: 0.0502813228631, \&quot;Shape_Area\&quot;: 0.000149358592917, \&quot;zone\&quot;: \&quot;Battery Park City\&quot;, \&quot;LocationID\&quot;: 13, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01244109299991, 40.7190576729999], [-74.01668714699993, 40.704743941999865], [-74.01844770243774, 40.70416216823156], [-74.0174808615258, 40.704667487696156], [-74.01934254624483, 40.706093673029706], [-74.01777014254499, 40.71283457478916], [-74.01662424425285, 40.71215731899529], [-74.01632006627581, 40.71340798247826], [-74.01772496219284, 40.71307018162274], [-74.01671018605829, 40.718624176057965], [-74.01244109299991, 40.7190576729999]]]}}, {\&quot;id\&quot;: \&quot;13\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.26867475824303777, \&quot;OBJECTID\&quot;: 14, \&quot;Shape_Leng\&quot;: 0.175213698053, \&quot;Shape_Area\&quot;: 0.00138177826442, \&quot;zone\&quot;: \&quot;Bay Ridge\&quot;, \&quot;LocationID\&quot;: 14, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.03407329297129, 40.64431393298185], [-74.02475437599998, 40.6381214179999], [-74.02108051399998, 40.64149093699994], [-74.02141038399992, 40.638584902999845], [-74.01514630699995, 40.63322193799993], [-74.01970491599991, 40.6221849649999], [-74.02754297299998, 40.61293718299988], [-74.02637609099996, 40.61245060299993], [-74.02710660599995, 40.61024395599991], [-74.02150602899994, 40.60782209899992], [-74.02247769499994, 40.60667421599987], [-74.02078541, 40.605673685999875], [-74.02139467299999, 40.60449399799991], [-74.01869135799996, 40.60360792399991], [-74.01942760861903, 40.602871578425265], [-74.0321315955131, 40.605901836264245], [-74.04038132338673, 40.61534178232843], [-74.04189123741789, 40.62406041492981], [-74.04108656611493, 40.63009852389527], [-74.03680662048858, 40.63898422154557], [-74.03876297920752, 40.639588258980524], [-74.03672484374877, 40.63914119020668], [-74.03571276150724, 40.64064015404647], [-74.03675840317513, 40.641611762713936], [-74.03407329297129, 40.64431393298185]]]}}, {\&quot;id\&quot;: \&quot;14\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.254714931883147, \&quot;OBJECTID\&quot;: 15, \&quot;Shape_Leng\&quot;: 0.14433622262, \&quot;Shape_Area\&quot;: 0.000925219395547, \&quot;zone\&quot;: \&quot;Bay Terrace/Fort Totten\&quot;, \&quot;LocationID\&quot;: 15, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7774039129087, 40.79659824126783], [-73.77063124537418, 40.78846290603716], [-73.77426836058959, 40.78675665865473], [-73.77633728818715, 40.78848722575376], [-73.76820055460033, 40.77944417919097], [-73.76702392346498, 40.78008623415827], [-73.76677570373936, 40.77981245869834], [-73.76782207615058, 40.77881037615661], [-73.77553732199992, 40.777025597999916], [-73.77583958299994, 40.778612371999884], [-73.79565702099983, 40.773036085999905], [-73.79853009399987, 40.775190728999924], [-73.8037902289999, 40.77561011199992], [-73.80242791699989, 40.78606827399991], [-73.79491977600001, 40.78633880799987], [-73.79058298999988, 40.78819290999989], [-73.79179280401884, 40.789351616549254], [-73.79028202353197, 40.79031696339975], [-73.78174708763098, 40.79113340664446], [-73.78079182072646, 40.79403591986439], [-73.78325271025878, 40.79492032976596], [-73.7774039129087, 40.79659824126783]]]}}, {\&quot;id\&quot;: \&quot;15\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.25765685399940524, \&quot;OBJECTID\&quot;: 16, \&quot;Shape_Leng\&quot;: 0.141291873771, \&quot;Shape_Area\&quot;: 0.000871889446182, \&quot;zone\&quot;: \&quot;Bayside\&quot;, \&quot;LocationID\&quot;: 16, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7685730499999, 40.77910542899991], [-73.75864264358073, 40.767357170035446], [-73.75377036482266, 40.76530463124142], [-73.75921689799992, 40.76432485599988], [-73.75800131799996, 40.76037986699988], [-73.76239510499991, 40.75949699799992], [-73.76184343999986, 40.75553726899989], [-73.75684127399991, 40.74932207699987], [-73.77573836999991, 40.74332564699993], [-73.78546383099984, 40.76259192499988], [-73.79565702099983, 40.773036085999905], [-73.77678363299991, 40.77840958299987], [-73.77553732199992, 40.777025597999916], [-73.7685730499999, 40.77910542899991]]]}}, {\&quot;id\&quot;: \&quot;16\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22623919619656271, \&quot;OBJECTID\&quot;: 17, \&quot;Shape_Leng\&quot;: 0.093522632948, \&quot;Shape_Area\&quot;: 0.000322957654799, \&quot;zone\&quot;: \&quot;Bedford\&quot;, \&quot;LocationID\&quot;: 17, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94306406899986, 40.701424434999886], [-73.94193078899983, 40.70072523399989], [-73.94438788599984, 40.70042452299993], [-73.94032794, 40.679889974999874], [-73.9533701749999, 40.680640507999904], [-73.95468418899998, 40.68724485399985], [-73.95956770199984, 40.686682554999955], [-73.96029281699998, 40.69034624999995], [-73.95541057999996, 40.69090829199994], [-73.95614239299985, 40.694579018999896], [-73.96015854699988, 40.69411730899989], [-73.96105100699992, 40.69832607899989], [-73.95701993199991, 40.69897391399995], [-73.95745736399992, 40.70082260299993], [-73.95381196900003, 40.703180979999914], [-73.95128819399989, 40.700922364999855], [-73.94705205299991, 40.70366394899985], [-73.94306406899986, 40.701424434999886]]]}}, {\&quot;id\&quot;: \&quot;17\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2512246624287454, \&quot;OBJECTID\&quot;: 18, \&quot;Shape_Leng\&quot;: 0.0697995498569, \&quot;Shape_Area\&quot;: 0.000148850163948, \&quot;zone\&quot;: \&quot;Bedford Park\&quot;, \&quot;LocationID\&quot;: 18, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88513907699999, 40.86638287399992], [-73.88889566099989, 40.86475415299988], [-73.89573924699978, 40.85813820699986], [-73.89883814599983, 40.859307307999906], [-73.897143798, 40.86244506499991], [-73.90107966999994, 40.86275638299992], [-73.8974032329998, 40.86747418999989], [-73.89438130299995, 40.866068850999966], [-73.88785196299986, 40.87211417599992], [-73.88937163799984, 40.87338229799993], [-73.88527683199987, 40.87921766899991], [-73.88146889699985, 40.868573645999916], [-73.88513907699999, 40.86638287399992]]]}}, {\&quot;id\&quot;: \&quot;18\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2448542868183707, \&quot;OBJECTID\&quot;: 19, \&quot;Shape_Leng\&quot;: 0.101824875452, \&quot;Shape_Area\&quot;: 0.000546661094782, \&quot;zone\&quot;: \&quot;Bellerose\&quot;, \&quot;LocationID\&quot;: 19, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.72339596299987, 40.750389075999855], [-73.72258571899978, 40.74885045099991], [-73.72010148299994, 40.74977568599991], [-73.71147804899985, 40.73250140099988], [-73.71049995381028, 40.72722708720663], [-73.72990512499977, 40.723272494999954], [-73.7314721509999, 40.727411794999924], [-73.74640108899996, 40.7312928389999], [-73.74672140400006, 40.73247715099991], [-73.73933151399987, 40.739474474999916], [-73.72829094199989, 40.74745895699992], [-73.727664654, 40.749654641999946], [-73.72339596299987, 40.750389075999855]]]}}, {\&quot;id\&quot;: \&quot;19\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.26669397215120155, \&quot;OBJECTID\&quot;: 20, \&quot;Shape_Leng\&quot;: 0.0514401924362, \&quot;Shape_Area\&quot;: 0.000134512633032, \&quot;zone\&quot;: \&quot;Belmont\&quot;, \&quot;LocationID\&quot;: 20, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88386792099986, 40.8642908889999], [-73.88060896899991, 40.860357092999884], [-73.88311982600001, 40.848221091999925], [-73.88987871399985, 40.85207022099993], [-73.89109710400002, 40.856779813999886], [-73.89027555599993, 40.86110907299996], [-73.89177188799992, 40.86187171599992], [-73.88362518100003, 40.86725758799991], [-73.88267624699999, 40.86608914099984], [-73.88386792099986, 40.8642908889999]]]}}, {\&quot;id\&quot;: \&quot;20\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.290912805733734, \&quot;OBJECTID\&quot;: 21, \&quot;Shape_Leng\&quot;: 0.115973569062, \&quot;Shape_Area\&quot;: 0.000380251345507, \&quot;zone\&quot;: \&quot;Bensonhurst East\&quot;, \&quot;LocationID\&quot;: 21, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97418385499991, 40.609463501999905], [-73.97299433999983, 40.6088141419999], [-73.97291116900001, 40.599315803999964], [-73.97148350899987, 40.59717158499996], [-73.98035785499995, 40.59619154099992], [-73.97995443499985, 40.594073811999884], [-73.98601936799993, 40.594446048999906], [-73.98962150099992, 40.59098199299996], [-73.99923690396953, 40.588935328269024], [-73.99710730365224, 40.591390755943046], [-74.00004314944917, 40.59120428665461], [-73.9994830488618, 40.59296919994875], [-73.99530829599992, 40.59442758699989], [-73.99674706899995, 40.59564312599992], [-73.9868476259999, 40.60509723599994], [-73.98913191499994, 40.6064561369999], [-73.97963821799982, 40.61556454699991], [-73.97477658, 40.6126384749999], [-73.97418385499991, 40.609463501999905]]]}}, {\&quot;id\&quot;: \&quot;21\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2618891755765469, \&quot;OBJECTID\&quot;: 22, \&quot;Shape_Leng\&quot;: 0.126170229196, \&quot;Shape_Area\&quot;: 0.000472062684608, \&quot;zone\&quot;: \&quot;Bensonhurst West\&quot;, \&quot;LocationID\&quot;: 22, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99254973599997, 40.62427426799996], [-73.97963821799982, 40.61556454699991], [-73.98913191499994, 40.6064561369999], [-73.9868476259999, 40.60509723599994], [-73.99674706899995, 40.59564312599992], [-73.99530829599992, 40.59442758699989], [-74.00105748445709, 40.5925370050623], [-74.00200394804675, 40.594132371137796], [-73.99559320799995, 40.600232221999875], [-74.00493448899994, 40.60507440599987], [-74.00094408399997, 40.60863970999988], [-74.01050403599997, 40.613896610999866], [-73.99932090299998, 40.62465524699996], [-73.99771358999998, 40.62368026999996], [-73.99678847599995, 40.626826050999895], [-73.99254973599997, 40.62427426799996]]]}}, {\&quot;id\&quot;: \&quot;22\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.5886561171973435, \&quot;OBJECTID\&quot;: 23, \&quot;Shape_Leng\&quot;: 0.290556028962, \&quot;Shape_Area\&quot;: 0.00219556576201, \&quot;zone\&quot;: \&quot;Bloomfield/Emerson Hill\&quot;, \&quot;LocationID\&quot;: 23, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.19568609223377, 40.63501686464005], [-74.17459706299995, 40.622364010999874], [-74.16163010299996, 40.61793493599989], [-74.15018666499996, 40.60949781099991], [-74.14391816399994, 40.60798983699987], [-74.11742466500002, 40.609289008999916], [-74.11487058499988, 40.602136659999864], [-74.12059546299996, 40.601809757999874], [-74.12506115499997, 40.59818005599987], [-74.13091909399999, 40.598855047999905], [-74.13864458599996, 40.58906080499989], [-74.14790576499993, 40.58855634599993], [-74.16025756099997, 40.59534393799988], [-74.16189940599996, 40.59529877099993], [-74.16369888199995, 40.59225833899993], [-74.16360268199993, 40.593374198999854], [-74.16886362399997, 40.59472808699995], [-74.16719634899995, 40.602075311999926], [-74.17260229799992, 40.602971490999934], [-74.17822457299994, 40.5998280609999], [-74.17932277499995, 40.59676057899984], [-74.18730248699987, 40.588488221999896], [-74.185371048, 40.58745101499987], [-74.19423261399992, 40.58514680599991], [-74.19964981299998, 40.58226262599991], [-74.20048848899994, 40.5799497779999], [-74.20583829199992, 40.57984126099989], [-74.204646089432, 40.589285745465865], [-74.19751357718701, 40.59679898603677], [-74.20281628374593, 40.608270827967345], [-74.20244374449518, 40.61328469393197], [-74.2003834842897, 40.616428098243766], [-74.20163201104123, 40.623121565457346], [-74.2007872998309, 40.63034627446781], [-74.19568609223377, 40.63501686464005]]]}}, {\&quot;id\&quot;: \&quot;23\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2047782987154244, \&quot;OBJECTID\&quot;: 24, \&quot;Shape_Leng\&quot;: 0.0469999619287, \&quot;Shape_Area\&quot;: 6.07235737749e-05, \&quot;zone\&quot;: \&quot;Bloomingdale\&quot;, \&quot;LocationID\&quot;: 24, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95953658899998, 40.798718525999895], [-73.96004456499999, 40.79804123499991], [-73.97287179090726, 40.8033561875739], [-73.97110765876137, 40.80579013958964], [-73.95817297099987, 40.800582540999876], [-73.95953658899998, 40.798718525999895]]]}}, {\&quot;id\&quot;: \&quot;24\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21232970147950983, \&quot;OBJECTID\&quot;: 25, \&quot;Shape_Leng\&quot;: 0.0471458199319, \&quot;Shape_Area\&quot;: 0.000124168267356, \&quot;zone\&quot;: \&quot;Boerum Hill\&quot;, \&quot;LocationID\&quot;: 25, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98155298299992, 40.689146163999936], [-73.97804289599988, 40.68485661499987], [-73.98175642299985, 40.67931462399987], [-73.99490113599977, 40.6844302379999], [-73.99236366999985, 40.689690123999924], [-73.99054474599986, 40.689168104999936], [-73.98902944799994, 40.69212386099992], [-73.98155298299992, 40.689146163999936]]]}}, {\&quot;id\&quot;: \&quot;25\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24551625174334002, \&quot;OBJECTID\&quot;: 26, \&quot;Shape_Leng\&quot;: 0.12354780707, \&quot;Shape_Area\&quot;: 0.000534039927626, \&quot;zone\&quot;: \&quot;Borough Park\&quot;, \&quot;LocationID\&quot;: 26, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98331628499983, 40.6414786819999], [-73.98042057899988, 40.64238522699991], [-73.97911188699993, 40.63544038599991], [-73.9768886119999, 40.6356748619999], [-73.97705352899999, 40.62153252199987], [-73.97539380499998, 40.62076998699995], [-73.97785009299986, 40.617287605999906], [-73.97537335500002, 40.6157547219999], [-73.97335879399992, 40.616541714999904], [-73.97290326899996, 40.61415296799988], [-73.97517176999993, 40.61472418599991], [-73.97477658, 40.6126384749999], [-74.00702302499997, 40.63210999499996], [-74.00556490399993, 40.63308317599992], [-74.00735636699996, 40.6341636269999], [-73.99917564799993, 40.642025441999856], [-73.9955103369999, 40.63980966699993], [-73.98834986699991, 40.64456224399992], [-73.98331628499983, 40.6414786819999]]]}}, {\&quot;id\&quot;: \&quot;26\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23818890723242828, \&quot;OBJECTID\&quot;: 27, \&quot;Shape_Leng\&quot;: 0.202508808518, \&quot;Shape_Area\&quot;: 0.00134088762746, \&quot;zone\&quot;: \&quot;Breezy Point/Fort Tilden/Riis Beach\&quot;, \&quot;LocationID\&quot;: 27, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86522555399998, 40.57045847199989], [-73.86268391251235, 40.56650565604353], [-73.8949181726631, 40.5570787962983], [-73.90658574923901, 40.555710625377294], [-73.94073681682697, 40.54182008707755], [-73.93985107460422, 40.55456005374592], [-73.9261572327542, 40.56155260972308], [-73.91766081900093, 40.56282614968639], [-73.91197024752503, 40.56586941753247], [-73.90683894638656, 40.562856359344565], [-73.90121507272005, 40.563008460632346], [-73.89261013445609, 40.56858724728667], [-73.87780808995733, 40.56880063006316], [-73.86288301945429, 40.576059761127304], [-73.86361132999998, 40.573823056999835], [-73.86662812000002, 40.573057648999914], [-73.86522555399998, 40.57045847199989]]]}}, {\&quot;id\&quot;: \&quot;27\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20950062225886823, \&quot;OBJECTID\&quot;: 28, \&quot;Shape_Leng\&quot;: 0.097960782214, \&quot;Shape_Area\&quot;: 0.000291203927662, \&quot;zone\&quot;: \&quot;Briarwood/Jamaica Hills\&quot;, \&quot;LocationID\&quot;: 28, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79240413399991, 40.716193040999926], [-73.79303800099989, 40.71071107499988], [-73.79776810199988, 40.7091431879999], [-73.79870150699992, 40.71066337699988], [-73.80130625, 40.709742148999965], [-73.80302414799988, 40.70813965699997], [-73.80165725599993, 40.705761474999846], [-73.8056477309999, 40.70467172799994], [-73.80694856299993, 40.70736709999989], [-73.81201248599983, 40.70594494499993], [-73.81152856899989, 40.70227287499991], [-73.81637824499992, 40.70245196399987], [-73.82591945199992, 40.71598987599992], [-73.80494148499987, 40.715996230999956], [-73.79073248899982, 40.71920875699987], [-73.79240413399991, 40.716193040999926]]]}}, {\&quot;id\&quot;: \&quot;28\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.26611204508792763, \&quot;OBJECTID\&quot;: 29, \&quot;Shape_Leng\&quot;: 0.0714083127733, \&quot;Shape_Area\&quot;: 0.000201673837402, \&quot;zone\&quot;: \&quot;Brighton Beach\&quot;, \&quot;LocationID\&quot;: 29, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96004798699995, 40.58326987199995], [-73.95414287899986, 40.58310613999989], [-73.95235846771321, 40.574274685845246], [-73.9589871897255, 40.57343065573189], [-73.95941778299985, 40.57517798299994], [-73.9688899589999, 40.57526123899986], [-73.96514385199995, 40.5911019159999], [-73.9606798409999, 40.591597582999945], [-73.96004798699995, 40.58326987199995]]]}}, {\&quot;id\&quot;: \&quot;29\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2900523560209424, \&quot;OBJECTID\&quot;: 30, \&quot;Shape_Leng\&quot;: 0.0945097669793, \&quot;Shape_Area\&quot;: 0.000145862107626, \&quot;zone\&quot;: \&quot;Broad Channel\&quot;, \&quot;LocationID\&quot;: 30, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82075892499992, 40.61523267899991], [-73.81652681189118, 40.61494701007998], [-73.81475287105245, 40.6086327967523], [-73.81739192103247, 40.60515812414338], [-73.82071206789055, 40.59517051496212], [-73.83465599507487, 40.59516845882606], [-73.83239364476839, 40.59780335319121], [-73.82806159687702, 40.59768040282441], [-73.8259798598142, 40.599472067181495], [-73.82465420648664, 40.5981492468515], [-73.82376612290614, 40.60004007091038], [-73.82146929866913, 40.59999372263383], [-73.82445218054455, 40.60079696284418], [-73.81961795381072, 40.610479041032136], [-73.82087841795061, 40.61225734590997], [-73.82161460094558, 40.60848031911391], [-73.8238246859766, 40.61149866495507], [-73.82075892499992, 40.61523267899991]]]}}, {\&quot;id\&quot;: \&quot;30\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20674295285310215, \&quot;OBJECTID\&quot;: 31, \&quot;Shape_Leng\&quot;: 0.0964245666516, \&quot;Shape_Area\&quot;: 0.000333975927329, \&quot;zone\&quot;: \&quot;Bronx Park\&quot;, \&quot;LocationID\&quot;: 31, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87094462199981, 40.85726608099992], [-73.86841539699994, 40.85778035799994], [-73.86990379599995, 40.85587302199991], [-73.86823466099995, 40.85091373699986], [-73.86889243299996, 40.848112321999906], [-73.87459175399982, 40.841520647999914], [-73.878171756, 40.84262443699987], [-73.8773292409999, 40.84398312499995], [-73.88311982600001, 40.848221091999925], [-73.88060896899991, 40.860357092999884], [-73.88394303099996, 40.86494818699985], [-73.87619224900003, 40.87047671099988], [-73.87094367500002, 40.87851076699998], [-73.86943471300005, 40.87812919899994], [-73.87094462199981, 40.85726608099992]]]}}, {\&quot;id\&quot;: \&quot;31\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2757900533762603, \&quot;OBJECTID\&quot;: 32, \&quot;Shape_Leng\&quot;: 0.05426721601, \&quot;Shape_Area\&quot;: 0.000150879171971, \&quot;zone\&quot;: \&quot;Bronxdale\&quot;, \&quot;LocationID\&quot;: 32, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85882515999995, 40.85806135699987], [-73.87104944999982, 40.857304836999965], [-73.87056192499989, 40.87151077799995], [-73.86137924099984, 40.8713365119999], [-73.86156274099987, 40.86554946399989], [-73.85961281199982, 40.865512717999856], [-73.85780378799993, 40.86303621699989], [-73.8566377469999, 40.8581191719999], [-73.85882515999995, 40.85806135699987]]]}}, {\&quot;id\&quot;: \&quot;32\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2051921193027173, \&quot;OBJECTID\&quot;: 33, \&quot;Shape_Leng\&quot;: 0.0532702931967, \&quot;Shape_Area\&quot;: 0.000147416802448, \&quot;zone\&quot;: \&quot;Brooklyn Heights\&quot;, \&quot;LocationID\&quot;: 33, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99619227264343, 40.70337714093203], [-73.99087453800003, 40.70067311699993], [-73.99097187, 40.692548799999926], [-73.98902944799994, 40.69212386099992], [-73.99054474599986, 40.689168104999936], [-74.00110519399988, 40.692056594999954], [-74.0009586845849, 40.694069083791064], [-74.00301393814541, 40.69477784423956], [-74.00026872377784, 40.69496580257801], [-74.00043147340423, 40.69705246617853], [-73.99876458027717, 40.697120733093975], [-74.0010490305752, 40.697908236697415], [-73.9983776068576, 40.698063296146074], [-74.00001840433616, 40.699466048073575], [-73.99716054243916, 40.69979281264407], [-73.99813879899439, 40.701518788248414], [-73.99619227264343, 40.70337714093203]]]}}, {\&quot;id\&quot;: \&quot;33\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2211178584290075, \&quot;OBJECTID\&quot;: 34, \&quot;Shape_Leng\&quot;: 0.0657059323545, \&quot;Shape_Area\&quot;: 0.000173946146651, \&quot;zone\&quot;: \&quot;Brooklyn Navy Yard\&quot;, \&quot;LocationID\&quot;: 34, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.97232032119902, 40.70908288315216], [-73.9702621853228, 40.706887504284005], [-73.97018075572805, 40.70492927056683], [-73.96751516691087, 40.703437356878126], [-73.96929693837701, 40.705088331229625], [-73.96838933699995, 40.70682918699989], [-73.96217978199998, 40.70022070999989], [-73.963971858, 40.69637865499991], [-73.98054419199988, 40.69824651199988], [-73.97885303360711, 40.7060655352846], [-73.97713562625376, 40.703005581402515], [-73.97596096344841, 40.704715506440465], [-73.9769274918834, 40.70279782040038], [-73.97455023388345, 40.70159034430477], [-73.97573541084542, 40.69957044770558], [-73.97411513926478, 40.70130527141927], [-73.97239201397464, 40.700166322752274], [-73.97318676670886, 40.70166980367368], [-73.97078200587988, 40.69997866301123], [-73.97283512788735, 40.70272874074404], [-73.96948655218084, 40.70051906125818], [-73.97283889974949, 40.70334642860182], [-73.96898517428966, 40.70174708878653], [-73.97465569608048, 40.70607426299424], [-73.97254880057814, 40.70620449000379], [-73.9742361696854, 40.70802438612241], [-73.97109655489108, 40.705850056558255], [-73.97232032119902, 40.70908288315216]]], [[[-73.97892920137538, 40.705931589879214], [-73.97893110285521, 40.70592490623034], [-73.97906084872884, 40.705946028470365], [-73.97905767006142, 40.705952889050316], [-73.97892920137538, 40.705931589879214]]], [[[-73.98237340600002, 40.70554334999991], [-73.98242287179853, 40.70582205595453], [-73.98102390618274, 40.705898913893535], [-73.98230205183869, 40.705736979399674], [-73.98237340600002, 40.70554334999991]]]]}}, {\&quot;id\&quot;: \&quot;34\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19658802029964945, \&quot;OBJECTID\&quot;: 35, \&quot;Shape_Leng\&quot;: 0.085787918592, \&quot;Shape_Area\&quot;: 0.000323825195932, \&quot;zone\&quot;: \&quot;Brownsville\&quot;, \&quot;LocationID\&quot;: 35, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90105329800004, 40.66212482099994], [-73.89880698499995, 40.65740666199988], [-73.90784346399994, 40.65459152999988], [-73.90855790499995, 40.65209593799989], [-73.91012255699995, 40.655851770999945], [-73.91236458899995, 40.65551356499985], [-73.9195947979998, 40.66199567899985], [-73.92008167099986, 40.659857632999866], [-73.92637970499992, 40.6655148919999], [-73.90347422300006, 40.67550668299985], [-73.90105329800004, 40.66212482099994]]]}}, {\&quot;id\&quot;: \&quot;35\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22147737761861785, \&quot;OBJECTID\&quot;: 36, \&quot;Shape_Leng\&quot;: 0.0870507867063, \&quot;Shape_Area\&quot;: 0.000247666139269, \&quot;zone\&quot;: \&quot;Bushwick North\&quot;, \&quot;LocationID\&quot;: 36, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91254913799993, 40.70387341999989], [-73.912904041, 40.7023618909999], [-73.91067882699998, 40.701045968999914], [-73.91180820099989, 40.69993800299986], [-73.9042601839999, 40.69570037099989], [-73.90579597099993, 40.69412715499987], [-73.90123290699994, 40.69144227899997], [-73.904055772, 40.68854627799986], [-73.93115533899987, 40.70377233499987], [-73.93269784899994, 40.70317039099989], [-73.93391870799988, 40.70748702599992], [-73.92189184700005, 40.709396096999896], [-73.91254913799993, 40.70387341999989]]]}}, {\&quot;id\&quot;: \&quot;36\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22153532506500048, \&quot;OBJECTID\&quot;: 37, \&quot;Shape_Leng\&quot;: 0.142810040466, \&quot;Shape_Area\&quot;: 0.000452062644782, \&quot;zone\&quot;: \&quot;Bushwick South\&quot;, \&quot;LocationID\&quot;: 37, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93312548700004, 40.70470086199992], [-73.93269784899994, 40.70317039099989], [-73.93115533899987, 40.70377233499987], [-73.90482499699988, 40.688808569999956], [-73.90180467199995, 40.6907662979999], [-73.90116154999988, 40.68787793499991], [-73.89646625099995, 40.68233642199988], [-73.89704472199993, 40.68056181599996], [-73.90047001100004, 40.679535243999936], [-73.90262262299991, 40.6806645029999], [-73.9040463979999, 40.67922059799985], [-73.93856854799981, 40.698848135999874], [-73.94394947299996, 40.698221278999924], [-73.94438788599984, 40.70042452299993], [-73.94042057899993, 40.701076597999865], [-73.94103009699987, 40.7046361769999], [-73.94273448399997, 40.70447330599988], [-73.94378799599994, 40.710900378999945], [-73.93480281900003, 40.713372495999884], [-73.93229708600003, 40.70774944699988], [-73.93391870799988, 40.70748702599992], [-73.93312548700004, 40.70470086199992]]]}}, {\&quot;id\&quot;: \&quot;37\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22644071960907428, \&quot;OBJECTID\&quot;: 38, \&quot;Shape_Leng\&quot;: 0.0832175685234, \&quot;Shape_Area\&quot;: 0.000327392684821, \&quot;zone\&quot;: \&quot;Cambria Heights\&quot;, \&quot;LocationID\&quot;: 38, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.73624941199995, 40.702536977999884], [-73.72677759516957, 40.7030592911994], [-73.72586264191175, 40.683241080973865], [-73.7475517539999, 40.68934733599984], [-73.7435928609999, 40.69621532499986], [-73.74618157999997, 40.696121925999904], [-73.74773012199991, 40.69955313699991], [-73.74500119100004, 40.70026221299988], [-73.74590871000004, 40.70228727399988], [-73.74109293999989, 40.7034810629999], [-73.73624941199995, 40.702536977999884]]]}}, {\&quot;id\&quot;: \&quot;38\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.28362403401946795, \&quot;OBJECTID\&quot;: 39, \&quot;Shape_Leng\&quot;: 0.132369620757, \&quot;Shape_Area\&quot;: 0.00090028293862, \&quot;zone\&quot;: \&quot;Canarsie\&quot;, \&quot;LocationID\&quot;: 39, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.89121853499988, 40.64998769899987], [-73.88805587182881, 40.64511978725729], [-73.87714434884276, 40.63597649800373], [-73.88364451728226, 40.630943312138584], [-73.88263248433404, 40.62827427312689], [-73.88369231571497, 40.62755937391403], [-73.88752673706196, 40.628331824482444], [-73.89577374598754, 40.62251907138477], [-73.91860649599992, 40.632090414999894], [-73.91995062999999, 40.64470762999989], [-73.91830152299998, 40.645812262999925], [-73.90944846399994, 40.65152159899992], [-73.90398200599991, 40.64662856799988], [-73.89586154900002, 40.65188052699987], [-73.89761013299987, 40.65345381599992], [-73.89354677099988, 40.65520271399988], [-73.89000589199988, 40.651148696999925], [-73.89121853499988, 40.64998769899987]]], [[[-73.88833929256269, 40.64671022891759], [-73.88849720193863, 40.64675678600008], [-73.88853291212868, 40.646861882230674], [-73.88846787961647, 40.646899734025276], [-73.88833929256269, 40.64671022891759]]]]}}, {\&quot;id\&quot;: \&quot;39\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21723129248724968, \&quot;OBJECTID\&quot;: 40, \&quot;Shape_Leng\&quot;: 0.0518506648762, \&quot;Shape_Area\&quot;: 0.000108949211644, \&quot;zone\&quot;: \&quot;Carroll Gardens\&quot;, \&quot;LocationID\&quot;: 40, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.998192111, 40.68228732999989], [-73.99620846299992, 40.681723424999916], [-73.99490113599977, 40.6844302379999], [-73.98722413899985, 40.68144730199988], [-73.99069861899994, 40.67580741899994], [-73.99506451099984, 40.67584047499984], [-73.9986188799999, 40.67183017199989], [-74.00329231299999, 40.67964328799992], [-74.00064737999996, 40.685253946999914], [-73.99908066099994, 40.68481599199985], [-74.00004865199998, 40.682803355999965], [-73.998192111, 40.68228732999989]]]}}, {\&quot;id\&quot;: \&quot;40\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20351002119843972, \&quot;OBJECTID\&quot;: 41, \&quot;Shape_Leng\&quot;: 0.052793109453, \&quot;Shape_Area\&quot;: 0.000143093037737, \&quot;zone\&quot;: \&quot;Central Harlem\&quot;, \&quot;LocationID\&quot;: 41, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94773985499985, 40.809599720999884], [-73.94177140199992, 40.807088999999955], [-73.94523965199991, 40.80513601399989], [-73.94613131, 40.80387735799992], [-73.94459751299998, 40.803228144999906], [-73.94922045699984, 40.796909858999896], [-73.95964685399987, 40.80115642299993], [-73.954966572, 40.81006455499988], [-73.9535757779999, 40.8094766979999], [-73.95210125199992, 40.811442853999935], [-73.94773985499985, 40.809599720999884]]]}}, {\&quot;id\&quot;: \&quot;41\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19878137510607055, \&quot;OBJECTID\&quot;: 42, \&quot;Shape_Leng\&quot;: 0.0927092274616, \&quot;Shape_Area\&quot;: 0.000263896952605, \&quot;zone\&quot;: \&quot;Central Harlem North\&quot;, \&quot;LocationID\&quot;: 42, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93436121591056, 40.83620061961779], [-73.93383089287109, 40.819521063761556], [-73.93901753299998, 40.81085655699991], [-73.93580780199986, 40.80949763799987], [-73.93854407899988, 40.80572965299991], [-73.95210125199992, 40.811442853999935], [-73.94607828700005, 40.821263215999906], [-73.93924885599988, 40.82829635099989], [-73.93864026699997, 40.82973887399988], [-73.9401708989999, 40.83038439099996], [-73.93868316299985, 40.832800788999904], [-73.93436121591056, 40.83620061961779]]]}}, {\&quot;id\&quot;: \&quot;42\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2120281596812563, \&quot;OBJECTID\&quot;: 43, \&quot;Shape_Leng\&quot;: 0.0997386183576, \&quot;Shape_Area\&quot;: 0.000379662912054, \&quot;zone\&quot;: \&quot;Central Park\&quot;, \&quot;LocationID\&quot;: 43, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97255352299985, 40.76489773199991], [-73.98164804599995, 40.76843632199994], [-73.95817297099987, 40.800582540999876], [-73.94922045699984, 40.796909858999896], [-73.97255352299985, 40.76489773199991]]]}}, {\&quot;id\&quot;: \&quot;43\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23410887397464583, \&quot;OBJECTID\&quot;: 44, \&quot;Shape_Leng\&quot;: 0.235688967594, \&quot;Shape_Area\&quot;: 0.00194465649192, \&quot;zone\&quot;: \&quot;Charleston/Tottenville\&quot;, \&quot;LocationID\&quot;: 44, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.21220034099994, 40.556443429999874], [-74.21784397899994, 40.554432717999894], [-74.22131562699998, 40.55025307399992], [-74.21776941599994, 40.54112662999992], [-74.21800676499996, 40.53229858999995], [-74.21354593399995, 40.521235715999886], [-74.22379595899992, 40.518196345999876], [-74.22690993299994, 40.5191713979999], [-74.22159300278173, 40.50250043822093], [-74.23114494958575, 40.50185121588201], [-74.23988017293566, 40.49757362656005], [-74.24917156868965, 40.49656729705339], [-74.25335538022304, 40.50041319788582], [-74.25554269163935, 40.50783774249614], [-74.25056007272197, 40.516106741535], [-74.24921528676096, 40.51508486129925], [-74.24994158808036, 40.516137488190985], [-74.24854589291671, 40.51616991714839], [-74.24940770789283, 40.516980831423645], [-74.24851449056031, 40.517475626265046], [-74.24644039651318, 40.515965028508525], [-74.2456347316994, 40.518075580745766], [-74.23991937852388, 40.52004699652993], [-74.24293235036517, 40.52122716113276], [-74.24396500758859, 40.52490536633781], [-74.24150733322897, 40.531041342795135], [-74.24204570286014, 40.53434637705037], [-74.24533651176053, 40.53690599443462], [-74.24560205698324, 40.54094959457726], [-74.24803463735688, 40.54309324044144], [-74.24336346552776, 40.54786513523582], [-74.24039182810051, 40.547663310173775], [-74.23641623448965, 40.55050862684339], [-74.23641559733107, 40.55232806634515], [-74.23334188482498, 40.55249971061369], [-74.2287242997478, 40.5562970171392], [-74.22062175949124, 40.55589882100512], [-74.21974356930723, 40.55461267207239], [-74.21921716370927, 40.55579696987855], [-74.21859325782798, 40.55467421024778], [-74.21870767560165, 40.55604101620115], [-74.21775342391726, 40.55500528477618], [-74.2056960519999, 40.55851600599987], [-74.21220034099994, 40.556443429999874]]]}}, {\&quot;id\&quot;: \&quot;44\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20451319801273937, \&quot;OBJECTID\&quot;: 45, \&quot;Shape_Leng\&quot;: 0.0459068626235, \&quot;Shape_Area\&quot;: 9.13594688556e-05, \&quot;zone\&quot;: \&quot;Chinatown\&quot;, \&quot;LocationID\&quot;: 45, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99750445299988, 40.71406913199995], [-73.99256242199989, 40.71438807699996], [-73.99190824271031, 40.70953292664334], [-73.99919451154429, 40.70794737667571], [-74.0058917509999, 40.71200715999989], [-73.99995620900002, 40.71801709499987], [-73.99605872699998, 40.7162316399999], [-73.99750445299988, 40.71406913199995]]]}}, {\&quot;id\&quot;: \&quot;45\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23050374219567998, \&quot;OBJECTID\&quot;: 46, \&quot;Shape_Leng\&quot;: 0.134475429879, \&quot;Shape_Area\&quot;: 0.000926391677672, \&quot;zone\&quot;: \&quot;City Island\&quot;, \&quot;LocationID\&quot;: 46, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.78452431937963, 40.86047706314786], [-73.78519664387113, 40.85882702363741], [-73.78743186194176, 40.858935245614425], [-73.78685886773299, 40.86004505783956], [-73.78452431937963, 40.86047706314786]]], [[[-73.76783205637173, 40.854442205742075], [-73.76938529139694, 40.85253613399675], [-73.76959674311465, 40.84759451909819], [-73.76789492672636, 40.84528943351961], [-73.76901389181107, 40.84509734272193], [-73.77157218833237, 40.8475000585803], [-73.7708892022117, 40.84975177133807], [-73.77296356611284, 40.8521592539586], [-73.77173060411904, 40.852476831319095], [-73.77296285334867, 40.853800062246464], [-73.77219223055407, 40.85998663859697], [-73.76947305423998, 40.85933013666858], [-73.76533243995276, 40.85504359512487], [-73.76783205637173, 40.854442205742075]]], [[[-73.79018745194999, 40.8586099173861], [-73.788043429758, 40.85755991768708], [-73.7884773265335, 40.8544005205322], [-73.78690734702697, 40.854063972299144], [-73.78796264288079, 40.8534747209355], [-73.78338158610377, 40.85158673391434], [-73.78420047134377, 40.8500606442406], [-73.78154449088599, 40.84940043464333], [-73.78267467078706, 40.84813967294664], [-73.78097820938946, 40.8484583479135], [-73.78263740397888, 40.848072649245836], [-73.78148431950568, 40.8478821938486], [-73.78216393435586, 40.84663633778076], [-73.780403269586, 40.846931134166056], [-73.7833653613534, 40.84444472298169], [-73.78348428748797, 40.84367854599843], [-73.78290650949755, 40.84393612584013], [-73.78052736048552, 40.84452514033816], [-73.7799270374445, 40.843883081355834], [-73.78347481249244, 40.843654738109784], [-73.78288778301486, 40.84249482884962], [-73.78022773872677, 40.84377818129771], [-73.78286499304913, 40.84247810188268], [-73.78059735822595, 40.84278659994098], [-73.78216624418964, 40.84168914411004], [-73.7804257718152, 40.842494394206874], [-73.78019599955293, 40.84204621097616], [-73.78185048197766, 40.841653946394324], [-73.7807975292347, 40.84125614604844], [-73.78282260139727, 40.836338155887844], [-73.78485009222643, 40.83747048917844], [-73.78563997845448, 40.83706443458537], [-73.78583067964128, 40.83720998000451], [-73.7857350929868, 40.83923423177581], [-73.78815921166512, 40.84049077856704], [-73.79179343625451, 40.846731672329284], [-73.78951371516173, 40.85130077171307], [-73.79311837183832, 40.851578295240834], [-73.79042053780161, 40.85302297821258], [-73.79281511966936, 40.852494819308916], [-73.79080758729923, 40.85319906006435], [-73.79287610048584, 40.8529441813284], [-73.79105721254825, 40.85391841242664], [-73.79245816844812, 40.85360070875487], [-73.79107002765942, 40.85394495666465], [-73.79253714604873, 40.85384932781285], [-73.79129282160633, 40.854584025976855], [-73.79201712228527, 40.85617694860626], [-73.79270523985137, 40.85619232890572], [-73.79268768222656, 40.856335218720375], [-73.79315700296156, 40.85635091107476], [-73.7931468608596, 40.856467828471146], [-73.79018745194999, 40.8586099173861]]], [[[-73.78283291447852, 40.85587030844573], [-73.78302371522504, 40.85509276666495], [-73.78394699722007, 40.85563043752662], [-73.78343487501385, 40.856362865958886], [-73.78283291447852, 40.85587030844573]]], [[[-73.78061730829718, 40.855735175810025], [-73.78090476851291, 40.8549681331623], [-73.7815638969994, 40.855001286433904], [-73.78122782332017, 40.856087789162764], [-73.78061730829718, 40.855735175810025]]], [[[-73.78833349834521, 40.834667129759346], [-73.78931223606624, 40.83446488655343], [-73.78951019872322, 40.835364042525754], [-73.78845700015209, 40.835309914315395], [-73.78833349834521, 40.834667129759346]]]]}}, {\&quot;id\&quot;: \&quot;46\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23327044941651862, \&quot;OBJECTID\&quot;: 47, \&quot;Shape_Leng\&quot;: 0.0898275563294, \&quot;Shape_Area\&quot;: 0.000163198117339, \&quot;zone\&quot;: \&quot;Claremont/Bathgate\&quot;, \&quot;LocationID\&quot;: 47, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89090203399996, 40.854116885999865], [-73.89431774099977, 40.851891310999854], [-73.89617712999998, 40.8466583209999], [-73.89290102299996, 40.84626832999992], [-73.89537836199995, 40.842938778999965], [-73.89666161699988, 40.84352460699992], [-73.90553116799988, 40.82910413299989], [-73.91049010699992, 40.830737372999884], [-73.90538357999992, 40.839768982999885], [-73.90483121999989, 40.84480034199987], [-73.901344046, 40.84442875099994], [-73.89106280699994, 40.8615294119999], [-73.89090203399996, 40.854116885999865]]]}}, {\&quot;id\&quot;: \&quot;47\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21261808278031644, \&quot;OBJECTID\&quot;: 48, \&quot;Shape_Leng\&quot;: 0.0437467441431, \&quot;Shape_Area\&quot;: 9.42538425377e-05, \&quot;zone\&quot;: \&quot;Clinton East\&quot;, \&quot;LocationID\&quot;: 48, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99117738199989, 40.75532984899992], [-73.99730671499998, 40.757110506999894], [-73.98806289599996, 40.769790799999925], [-73.98236545099999, 40.7673921529999], [-73.99117738199989, 40.75532984899992]]]}}, {\&quot;id\&quot;: \&quot;48\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21935920217712804, \&quot;OBJECTID\&quot;: 49, \&quot;Shape_Leng\&quot;: 0.0752900183427, \&quot;Shape_Area\&quot;: 0.000203185525471, \&quot;zone\&quot;: \&quot;Clinton Hill\&quot;, \&quot;LocationID\&quot;: 49, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96062056499981, 40.69632013999993], [-73.96015854699988, 40.69411730899989], [-73.95614239299985, 40.694579018999896], [-73.95541057999996, 40.69090829199994], [-73.96029281699998, 40.69034624999995], [-73.95956770199984, 40.686682554999955], [-73.95468418899998, 40.68724485399985], [-73.95328187399996, 40.68020003099985], [-73.95529361599996, 40.679203150999825], [-73.96868961400001, 40.68200525799988], [-73.97013154199992, 40.68950630799986], [-73.96910362499993, 40.68946752199986], [-73.9693945009999, 40.696080388999846], [-73.9645507049999, 40.696107591999855], [-73.96105100699992, 40.69832607899989], [-73.96062056499981, 40.69632013999993]]]}}, {\&quot;id\&quot;: \&quot;49\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20820841160617087, \&quot;OBJECTID\&quot;: 50, \&quot;Shape_Leng\&quot;: 0.0557479867536, \&quot;Shape_Area\&quot;: 0.000173249283326, \&quot;zone\&quot;: \&quot;Clinton West\&quot;, \&quot;LocationID\&quot;: 50, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99667705784736, 40.77351005394221], [-73.98806289599996, 40.769790799999925], [-73.99547450199992, 40.759626856999894], [-74.00375735018837, 40.763582241820224], [-74.0009730802201, 40.763420271725614], [-74.00311291631381, 40.76474559615368], [-73.99915098087908, 40.76420525958265], [-74.0020245433034, 40.76589326657037], [-73.99857638530527, 40.76499860727083], [-74.00157335385273, 40.766977192210646], [-73.9980667590535, 40.76587188113572], [-73.99737808447954, 40.76682338637958], [-74.00064950530414, 40.76824523610559], [-73.99715588949206, 40.76712869617278], [-73.9964571540504, 40.76809881579563], [-73.99973590247859, 40.76950617733152], [-73.99707176039315, 40.768732643576804], [-73.9987620691431, 40.7708250567092], [-73.99631327022087, 40.76979883633644], [-73.99493501658995, 40.77146814657798], [-73.99667705784736, 40.77351005394221]]]}}, {\&quot;id\&quot;: \&quot;50\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23636520312166318, \&quot;OBJECTID\&quot;: 51, \&quot;Shape_Leng\&quot;: 0.0953613442277, \&quot;Shape_Area\&quot;: 0.000395756553505, \&quot;zone\&quot;: \&quot;Co-Op City\&quot;, \&quot;LocationID\&quot;: 51, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82091617199997, 40.86891693399989], [-73.81578764099999, 40.8657580609999], [-73.82037552999996, 40.86103300499993], [-73.82699653199998, 40.85908778599986], [-73.83315960399985, 40.86831975599994], [-73.83565766499987, 40.86751275599992], [-73.83829221499984, 40.87295133899995], [-73.83924788999988, 40.876618737999905], [-73.8381484219999, 40.876953298999915], [-73.84324113799987, 40.879108912999904], [-73.82387140599998, 40.88778362799996], [-73.82077408699998, 40.886710602999884], [-73.81992586499996, 40.88211933299987], [-73.82329599399986, 40.87309741799988], [-73.82091617199997, 40.86891693399989]]]}}, {\&quot;id\&quot;: \&quot;51\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20822031786021278, \&quot;OBJECTID\&quot;: 52, \&quot;Shape_Leng\&quot;: 0.0289076710093, \&quot;Shape_Area\&quot;: 4.52027509603e-05, \&quot;zone\&quot;: \&quot;Cobble Hill\&quot;, \&quot;LocationID\&quot;: 52, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99588110299992, 40.68239495399995], [-74.00004865199998, 40.682803355999965], [-73.99908066099994, 40.68481599199985], [-74.00064737999996, 40.685253946999914], [-73.99776924399993, 40.691194697999954], [-73.99236366999985, 40.689690123999924], [-73.99588110299992, 40.68239495399995]]]}}, {\&quot;id\&quot;: \&quot;52\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.25258826219014335, \&quot;OBJECTID\&quot;: 53, \&quot;Shape_Leng\&quot;: 0.161500913385, \&quot;Shape_Area\&quot;: 0.000947530980821, \&quot;zone\&quot;: \&quot;College Point\&quot;, \&quot;LocationID\&quot;: 53, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.83839013354552, 40.798304872075995], [-73.83919004727183, 40.7977772664477], [-73.84025860809128, 40.79758885843212], [-73.83840083088981, 40.79675525865344], [-73.83663288911686, 40.79251637576927], [-73.84067828300006, 40.79390789199993], [-73.84081532599994, 40.7915048849999], [-73.83895676099984, 40.79143843099996], [-73.84008157499997, 40.78785153099992], [-73.83824429099994, 40.78778591599995], [-73.83869921299997, 40.781676956999874], [-73.82513740299993, 40.78169970599994], [-73.83000011099983, 40.77373240699996], [-73.83913189281712, 40.765991105784146], [-73.83975387982034, 40.767120445440874], [-73.84491332846012, 40.76552838817853], [-73.84780575104425, 40.76677294817163], [-73.84977407793218, 40.769936012942956], [-73.8486715286884, 40.770761572902536], [-73.85130108374476, 40.77180636079771], [-73.84897619867189, 40.77356166795698], [-73.84895559325399, 40.77796167373135], [-73.84963631633588, 40.77948192035157], [-73.85094705724252, 40.77906915543026], [-73.85148755480326, 40.77899297861757], [-73.84981720066014, 40.77963034805418], [-73.85232086242219, 40.77916928470371], [-73.85238832778414, 40.7795289023869], [-73.84982102259761, 40.779651339303875], [-73.84955315550077, 40.779990415384006], [-73.85169028085423, 40.779867508478176], [-73.85167099162219, 40.780035228878106], [-73.84949381208321, 40.780065828114246], [-73.85093646396534, 40.781119575156005], [-73.8492525818285, 40.782264775014035], [-73.85528242786589, 40.78197538434999], [-73.8595236950597, 40.785561954252664], [-73.85284230133867, 40.78821137173992], [-73.85480194733185, 40.788619154725914], [-73.85265830693045, 40.79110642061034], [-73.85377854910695, 40.79242127400702], [-73.8526309825624, 40.79494485424474], [-73.84906160835088, 40.79336261029852], [-73.84855988738983, 40.79549506021838], [-73.84354668938991, 40.79491394401049], [-73.84225959368331, 40.79558496893736], [-73.8428667525936, 40.79692222907191], [-73.84158721174394, 40.795401069221235], [-73.84041517975831, 40.7976784372587], [-73.83839013354552, 40.798304872075995]]], [[[-73.8678840747076, 40.78736103669457], [-73.86813032000018, 40.78723277784419], [-73.8692349173292, 40.78596991495815], [-73.8680991225789, 40.78745866181839], [-73.8678840747076, 40.78736103669457]]]]}}, {\&quot;id\&quot;: \&quot;53\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2130004273996172, \&quot;OBJECTID\&quot;: 54, \&quot;Shape_Leng\&quot;: 0.0762192448554, \&quot;Shape_Area\&quot;: 0.000132452130536, \&quot;zone\&quot;: \&quot;Columbia Street\&quot;, \&quot;LocationID\&quot;: 54, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.00174362072502, 40.69240674985266], [-74.00400795971088, 40.693208199632345], [-74.00127014951309, 40.69329606183691], [-74.00174362072502, 40.69240674985266]]], [[[-74.00174362072502, 40.69240674985266], [-73.99776924399993, 40.691194697999954], [-74.00329231299999, 40.67964328799992], [-74.00596041099988, 40.683362870999936], [-74.00485241699997, 40.68566813099993], [-74.00783293766679, 40.68738505516274], [-74.00459270521766, 40.688215222986614], [-74.00636461225261, 40.68966966863697], [-74.00382038919723, 40.688929644699236], [-74.0053420962491, 40.6910916029778], [-74.0009615685494, 40.69012876835003], [-74.00479415294552, 40.69176162037443], [-74.00174362072502, 40.69240674985266]]], [[[-74.01092841300002, 40.684491472999824], [-74.01217596614636, 40.68409518562848], [-74.00816320571415, 40.68617364485845], [-74.0086007239999, 40.68590956499989], [-74.01092841300002, 40.684491472999824]]]]}}, {\&quot;id\&quot;: \&quot;54\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22235237171253217, \&quot;OBJECTID\&quot;: 55, \&quot;Shape_Leng\&quot;: 0.149956807524, \&quot;Shape_Area\&quot;: 0.000736274713586, \&quot;zone\&quot;: \&quot;Coney Island\&quot;, \&quot;LocationID\&quot;: 55, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98671582299981, 40.58456849999991], [-73.97742525299988, 40.58290659299994], [-73.96661531499983, 40.58457103699992], [-73.9688899589999, 40.57526123899986], [-73.95941778299985, 40.57517798299994], [-73.95939182223685, 40.57391210937612], [-73.98367270153267, 40.57140705768737], [-73.98336058039273, 40.56952999448666], [-73.98375790448641, 40.571396227250865], [-74.00208547639728, 40.569585983985014], [-74.00303186164808, 40.57218559475904], [-74.01115668729254, 40.57416676185885], [-74.01302222952468, 40.577804459633505], [-74.0111737229432, 40.58028397882522], [-74.00604734235807, 40.58198365303581], [-73.98814208290418, 40.57886596371379], [-73.98604509916208, 40.58172068515157], [-73.98800973376738, 40.579670687155776], [-73.98995504960881, 40.58066166976562], [-73.98671582299981, 40.58456849999991]]]}}, {\&quot;id\&quot;: \&quot;55\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2099739474607889, \&quot;OBJECTID\&quot;: 56, \&quot;Shape_Leng\&quot;: 0.0568478126677, \&quot;Shape_Area\&quot;: 0.000180907844436, \&quot;zone\&quot;: \&quot;Corona\&quot;, \&quot;LocationID\&quot;: 56, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85360568399982, 40.74749682799991], [-73.85011556599989, 40.74072356299995], [-73.84750820299992, 40.73900780699995], [-73.86462193299997, 40.73428275699993], [-73.86790963899986, 40.74493371599989], [-73.85442575299999, 40.748851725999884], [-73.85360568399982, 40.74749682799991]]]}}, {\&quot;id\&quot;: \&quot;56\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2099739474607889, \&quot;OBJECTID\&quot;: 57, \&quot;Shape_Leng\&quot;: 0.0192705048557, \&quot;Shape_Area\&quot;: 1.80259807917e-05, \&quot;zone\&quot;: \&quot;Corona\&quot;, \&quot;LocationID\&quot;: 56, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8513110499998, 40.74984337599988], [-73.85442575299999, 40.748851725999884], [-73.85579909099987, 40.75440952799994], [-73.85312635499996, 40.75510934299989], [-73.8513110499998, 40.74984337599988]]]}}, {\&quot;id\&quot;: \&quot;57\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.33021740969461133, \&quot;OBJECTID\&quot;: 58, \&quot;Shape_Leng\&quot;: 0.0598554094851, \&quot;Shape_Area\&quot;: 0.000204980931361, \&quot;zone\&quot;: \&quot;Country Club\&quot;, \&quot;LocationID\&quot;: 58, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.81561382067721, 40.84818955758243], [-73.81602685114903, 40.846400458770034], [-73.81464594697542, 40.84721961352901], [-73.81570353189448, 40.84629134042384], [-73.81368634738199, 40.84727432550905], [-73.81356372861671, 40.847151411278524], [-73.8150262760428, 40.845499995058404], [-73.81284939958525, 40.84631879949822], [-73.81324326350918, 40.84523590835256], [-73.81310050626846, 40.84517241453328], [-73.8128770359758, 40.8451346679459], [-73.81315597044244, 40.84521210037631], [-73.81285536957633, 40.845186285461466], [-73.81241445328128, 40.846559380748744], [-73.81227790900483, 40.846543458279285], [-73.8128577433794, 40.845129544589135], [-73.81254457815619, 40.84497959800826], [-73.81169971823665, 40.84668170081364], [-73.81266141349049, 40.84420764950083], [-73.81254909120709, 40.84495227514607], [-73.8136558066588, 40.8450591224657], [-73.81414462049185, 40.84481817326274], [-73.81437458252545, 40.8430889259994], [-73.81569792948075, 40.8443864281129], [-73.81823722746202, 40.844355041712625], [-73.81473345817534, 40.8413757283108], [-73.81606068217324, 40.83603019622843], [-73.82601252600003, 40.83402077799985], [-73.82624132999996, 40.84299359399991], [-73.82517999, 40.842700058999874], [-73.82495697699986, 40.846105444999864], [-73.82048405599983, 40.84850102599995], [-73.81507165904237, 40.84913361979451], [-73.81561382067721, 40.84818955758243]]]}}, {\&quot;id\&quot;: \&quot;58\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.3125641025641025, \&quot;OBJECTID\&quot;: 59, \&quot;Shape_Leng\&quot;: 0.0377948070893, \&quot;Shape_Area\&quot;: 6.28765230648e-05, \&quot;zone\&quot;: \&quot;Crotona Park\&quot;, \&quot;LocationID\&quot;: 59, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88941724899998, 40.839422732999836], [-73.88659802299989, 40.839279049999895], [-73.89697220299995, 40.8343452539999], [-73.9012157839999, 40.8354101409999], [-73.89666161699988, 40.84352460699992], [-73.88941724899998, 40.839422732999836]]]}}, {\&quot;id\&quot;: \&quot;59\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20183312353378732, \&quot;OBJECTID\&quot;: 60, \&quot;Shape_Leng\&quot;: 0.0786482878226, \&quot;Shape_Area\&quot;: 0.000161833284912, \&quot;zone\&quot;: \&quot;Crotona Park East\&quot;, \&quot;LocationID\&quot;: 60, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87823856799989, 40.839985917999854], [-73.87277204699981, 40.83975128199995], [-73.87379590199993, 40.837445132999896], [-73.88005188499987, 40.83470205899989], [-73.88390094800003, 40.82980281599986], [-73.8843985489999, 40.822965575999866], [-73.88753429599987, 40.82250933899995], [-73.88601262699991, 40.828238530999926], [-73.88761307899992, 40.8293374189999], [-73.89717220999982, 40.830368832999966], [-73.89697220299995, 40.8343452539999], [-73.89408527499982, 40.8362973469999], [-73.88730373200002, 40.83812719099994], [-73.88618432099992, 40.840105043999884], [-73.88200384100001, 40.837443781999895], [-73.880061996, 40.840162234999845], [-73.87823856799989, 40.839985917999854]]]}}, {\&quot;id\&quot;: \&quot;60\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22889710182733514, \&quot;OBJECTID\&quot;: 61, \&quot;Shape_Leng\&quot;: 0.117310808097, \&quot;Shape_Area\&quot;: 0.000510772092295, \&quot;zone\&quot;: \&quot;Crown Heights North\&quot;, \&quot;LocationID\&quot;: 61, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92916130699993, 40.68343632399992], [-73.92281374299995, 40.68341442999991], [-73.92164666399992, 40.67886992299994], [-73.92275257199998, 40.667097332999894], [-73.92872204599985, 40.66449556899988], [-73.93698362399992, 40.665535507999955], [-73.93674946999998, 40.66812737099991], [-73.96131877999991, 40.67140667599988], [-73.96007428300001, 40.67487807099994], [-73.96318238899983, 40.675529503999876], [-73.96134655899995, 40.6804635239999], [-73.95529361599996, 40.679203150999825], [-73.9533701749999, 40.680640507999904], [-73.93435066499993, 40.67956340799991], [-73.93500821699992, 40.68276376799985], [-73.92916130699993, 40.68343632399992]]]}}, {\&quot;id\&quot;: \&quot;61\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22874497410870423, \&quot;OBJECTID\&quot;: 62, \&quot;Shape_Leng\&quot;: 0.0822593359838, \&quot;Shape_Area\&quot;: 0.000158238169004, \&quot;zone\&quot;: \&quot;Crown Heights South\&quot;, \&quot;LocationID\&quot;: 62, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92916752199997, 40.664299531999895], [-73.94282892199992, 40.6628474859999], [-73.94269628999989, 40.664055128999934], [-73.94546293699983, 40.66422610399989], [-73.96095595499996, 40.66328505499992], [-73.96258784899996, 40.671711596999884], [-73.93674946999998, 40.66812737099991], [-73.93698362399992, 40.665535507999955], [-73.92916752199997, 40.664299531999895]]]}}, {\&quot;id\&quot;: \&quot;62\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2276520478649459, \&quot;OBJECTID\&quot;: 63, \&quot;Shape_Leng\&quot;: 0.119100721883, \&quot;Shape_Area\&quot;: 0.000353190910142, \&quot;zone\&quot;: \&quot;Cypress Hills\&quot;, \&quot;LocationID\&quot;: 63, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86650407899994, 40.684474051999885], [-73.86602666799992, 40.681918051999936], [-73.86410096700003, 40.68237284999988], [-73.86234580499983, 40.67916478599994], [-73.86106294999989, 40.67434293499984], [-73.87231018000001, 40.67775574699987], [-73.87531627599998, 40.68011098399988], [-73.88061377799994, 40.679110031999876], [-73.88116730300005, 40.68135366299988], [-73.9000462609999, 40.676893089999936], [-73.9040463979999, 40.67922059799985], [-73.90262262299991, 40.6806645029999], [-73.89786299899986, 40.67987501099987], [-73.89417463299992, 40.6852832479999], [-73.89252316799995, 40.683424532999865], [-73.88962787599998, 40.684236453999894], [-73.87402053199992, 40.69419129499995], [-73.86891704399994, 40.69515042299987], [-73.86650407899994, 40.684474051999885]]]}}, {\&quot;id\&quot;: \&quot;65\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20316071145856007, \&quot;OBJECTID\&quot;: 66, \&quot;Shape_Leng\&quot;: 0.0546334593634, \&quot;Shape_Area\&quot;: 0.000108378855948, \&quot;zone\&quot;: \&quot;DUMBO/Vinegar Hill\&quot;, \&quot;LocationID\&quot;: 66, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97906084869959, 40.7059460290057], [-73.98050926199988, 40.69744627499991], [-73.98696892299995, 40.698503613999954], [-73.98679382799996, 40.700633222999954], [-73.99093201799984, 40.7007662159999], [-73.99544564312069, 40.70327530547179], [-73.99350881403605, 40.70462350527397], [-73.97906084869959, 40.7059460290057]]]}}, {\&quot;id\&quot;: \&quot;63\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24992247891334698, \&quot;OBJECTID\&quot;: 64, \&quot;Shape_Leng\&quot;: 0.18445188474, \&quot;Shape_Area\&quot;: 0.00105790284614, \&quot;zone\&quot;: \&quot;Douglaston\&quot;, \&quot;LocationID\&quot;: 64, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.74412314584049, 40.77863865777706], [-73.71351828186042, 40.75983773091619], [-73.72031595299998, 40.75789725799992], [-73.72771356199995, 40.750626894999904], [-73.7310646189999, 40.744888375999885], [-73.74016951799993, 40.73848189799986], [-73.74306820799991, 40.7384408179999], [-73.74396193599988, 40.740789125999925], [-73.75098230100001, 40.740021462999884], [-73.75347299999999, 40.74240484399992], [-73.74477587099986, 40.74328109699994], [-73.74625984399985, 40.74671147499993], [-73.74384322099985, 40.74769009599988], [-73.75004764499985, 40.75840465799996], [-73.75230259399993, 40.759455198999916], [-73.75583713299987, 40.757742061999934], [-73.75921689799992, 40.76432485599988], [-73.75377036482259, 40.76530463174143], [-73.7510743225255, 40.76176367133622], [-73.74455864030779, 40.756557885832535], [-73.75507210849031, 40.76753310678742], [-73.7555733264932, 40.77152912592269], [-73.75336691999294, 40.77320784776336], [-73.75551737581792, 40.77770404836418], [-73.75080593606877, 40.782893378833954], [-73.74412314584049, 40.77863865777706]]]}}, {\&quot;id\&quot;: \&quot;64\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20345705416422957, \&quot;OBJECTID\&quot;: 65, \&quot;Shape_Leng\&quot;: 0.0446070683658, \&quot;Shape_Area\&quot;: 8.1803882541e-05, \&quot;zone\&quot;: \&quot;Downtown Brooklyn/MetroTech\&quot;, \&quot;LocationID\&quot;: 65, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98712491499988, 40.70063447999997], [-73.98696892299995, 40.698503613999954], [-73.98050926199988, 40.69744627499991], [-73.97916718399999, 40.69348832299992], [-73.98251122999989, 40.69361433399992], [-73.98147568199991, 40.689930943999876], [-73.99097186899995, 40.69254879999995], [-73.99093201799984, 40.7007662159999], [-73.98712491499988, 40.70063447999997]]]}}, {\&quot;id\&quot;: \&quot;66\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.8331543174013877, \&quot;OBJECTID\&quot;: 67, \&quot;Shape_Leng\&quot;: 0.0997470781551, \&quot;Shape_Area\&quot;: 0.000394282272487, \&quot;zone\&quot;: \&quot;Dyker Heights\&quot;, \&quot;LocationID\&quot;: 67, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0109702639999, 40.63068186899988], [-74.00702302499997, 40.63210999499996], [-73.99724067099987, 40.62528868699994], [-73.99771358999998, 40.62368026999996], [-73.99932090299998, 40.62465524699996], [-74.01701910199995, 40.60765441699994], [-74.01549854999998, 40.606841523999925], [-74.0186913569999, 40.60360792399995], [-74.02129949199998, 40.60442832299987], [-74.02078540899996, 40.60567368599989], [-74.02247769499994, 40.60667421599987], [-74.02150602899994, 40.60782209899992], [-74.02710660599995, 40.61024395599991], [-74.02637609099996, 40.61245060299993], [-74.02754297299998, 40.61293718299988], [-74.01970491599991, 40.6221849649999], [-74.01514630699995, 40.63322193799993], [-74.0109702639999, 40.63068186899988]]]}}, {\&quot;id\&quot;: \&quot;67\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20994906302799735, \&quot;OBJECTID\&quot;: 68, \&quot;Shape_Leng\&quot;: 0.0493373795569, \&quot;Shape_Area\&quot;: 0.000111073378655, \&quot;zone\&quot;: \&quot;East Chelsea\&quot;, \&quot;LocationID\&quot;: 68, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00201937799989, 40.74044408899989], [-74.00820401899988, 40.74214751799986], [-73.99730671499998, 40.757110506999894], [-73.99163271299996, 40.75470680499996], [-74.00201937799989, 40.74044408899989]]]}}, {\&quot;id\&quot;: \&quot;68\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23014388796730298, \&quot;OBJECTID\&quot;: 69, \&quot;Shape_Leng\&quot;: 0.0789896450483, \&quot;Shape_Area\&quot;: 0.00019905160381, \&quot;zone\&quot;: \&quot;East Concourse/Concourse Village\&quot;, \&quot;LocationID\&quot;: 69, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91179361999997, 40.8264281559999], [-73.91130974499993, 40.824848557999886], [-73.91541108199998, 40.82577390899993], [-73.92518486499998, 40.818012668999884], [-73.92731653099999, 40.81855963399991], [-73.91193751499992, 40.843202387999916], [-73.90514893999989, 40.84254719499995], [-73.91049010699992, 40.830737372999884], [-73.908959903, 40.83022623299989], [-73.91179361999997, 40.8264281559999]]]}}, {\&quot;id\&quot;: \&quot;69\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20393045142390617, \&quot;OBJECTID\&quot;: 70, \&quot;Shape_Leng\&quot;: 0.0638403183367, \&quot;Shape_Area\&quot;: 0.000195458476728, \&quot;zone\&quot;: \&quot;East Elmhurst\&quot;, \&quot;LocationID\&quot;: 70, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85912375899987, 40.76127549899994], [-73.85449593299987, 40.75827863899985], [-73.87513874300004, 40.756633815999905], [-73.87608949699984, 40.77153690299987], [-73.868098735, 40.77017200899994], [-73.85912375899987, 40.76127549899994]]]}}, {\&quot;id\&quot;: \&quot;70\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.27721745883940074, \&quot;OBJECTID\&quot;: 71, \&quot;Shape_Leng\&quot;: 0.0931694551828, \&quot;Shape_Area\&quot;: 0.000382572587364, \&quot;zone\&quot;: \&quot;East Flatbush/Farragut\&quot;, \&quot;LocationID\&quot;: 71, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93177153199984, 40.65527364199989], [-73.92910623099985, 40.63979510599992], [-73.92574389399985, 40.64001446599985], [-73.92652490899994, 40.63649272299989], [-73.92744822299987, 40.635258409999864], [-73.9372670019998, 40.634650624999885], [-73.93701746200003, 40.63231097899989], [-73.94462885499995, 40.63183773499993], [-73.94537272499998, 40.638786954999865], [-73.94826499699982, 40.63860718999994], [-73.94841343400003, 40.639987463999944], [-73.94778994699976, 40.643305735999924], [-73.94586879199989, 40.64342374399988], [-73.94715896299984, 40.65559378699993], [-73.931907438, 40.656537652999916], [-73.93177153199984, 40.65527364199989]]]}}, {\&quot;id\&quot;: \&quot;71\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.3046321399452469, \&quot;OBJECTID\&quot;: 72, \&quot;Shape_Leng\&quot;: 0.0952020695166, \&quot;Shape_Area\&quot;: 0.000323532461947, \&quot;zone\&quot;: \&quot;East Flatbush/Remsen Village\&quot;, \&quot;LocationID\&quot;: 72, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92021313099984, 40.65997544099987], [-73.9195947979998, 40.66199567899985], [-73.91236458899995, 40.65551356499985], [-73.91012255699995, 40.655851770999945], [-73.90855790499995, 40.65209593799989], [-73.91995062999999, 40.64470762999989], [-73.91973736999988, 40.64277814799987], [-73.92332654599986, 40.63990021599991], [-73.92356525899983, 40.642499297999905], [-73.92538233099987, 40.64238453199987], [-73.92574389499987, 40.64001446599983], [-73.92910623199991, 40.6397951059999], [-73.93190743899989, 40.656537652999944], [-73.92799465199988, 40.65680210099988], [-73.92834017599988, 40.660060035999884], [-73.92646424299983, 40.659814361999956], [-73.93068465499985, 40.66362047699992], [-73.92637970499992, 40.6655148919999], [-73.92021313099984, 40.65997544099987]]]}}, {\&quot;id\&quot;: \&quot;72\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24850480224803922, \&quot;OBJECTID\&quot;: 73, \&quot;Shape_Leng\&quot;: 0.0853020209129, \&quot;Shape_Area\&quot;: 0.000291799754395, \&quot;zone\&quot;: \&quot;East Flushing\&quot;, \&quot;LocationID\&quot;: 73, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79566545000003, 40.75023619999991], [-73.79729524799988, 40.74943505299992], [-73.7946756879998, 40.74721192799994], [-73.8033521419999, 40.74643196499987], [-73.80287666499987, 40.749765148999856], [-73.80750599299991, 40.750136586999936], [-73.81416172099998, 40.74613857999986], [-73.820849288, 40.75224154499988], [-73.8184078289999, 40.75383042199998], [-73.82030067699999, 40.75551497999992], [-73.81789245699991, 40.75708633799991], [-73.82063593299985, 40.75887226799989], [-73.81104963199985, 40.761417020999964], [-73.79940088899988, 40.759397218999936], [-73.79493246199993, 40.75779802999994], [-73.79566545000003, 40.75023619999991]]]}}, {\&quot;id\&quot;: \&quot;73\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.1997390877776161, \&quot;OBJECTID\&quot;: 74, \&quot;Shape_Leng\&quot;: 0.11029093625, \&quot;Shape_Area\&quot;: 0.000295038418204, \&quot;zone\&quot;: \&quot;East Harlem North\&quot;, \&quot;LocationID\&quot;: 74, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.93380589881859, 40.81651249324708], [-73.93412073484292, 40.80865645197743], [-73.92903490240305, 40.80108090385195], [-73.9290364017962, 40.79676259410132], [-73.93505300002766, 40.79168720295447], [-73.93773612099982, 40.792815803999936], [-73.93864883299987, 40.79155775499987], [-73.94327251199996, 40.79348810299993], [-73.94187604699994, 40.79540586899984], [-73.94831125500004, 40.79812921799992], [-73.94459751299998, 40.803228144999906], [-73.94613131, 40.80387735799992], [-73.94430194599991, 40.806390824999916], [-73.93854407899988, 40.80572965299991], [-73.93580780199986, 40.80949763799987], [-73.93901753299998, 40.81085655699991], [-73.93407463999996, 40.81782651399992], [-73.93440039999986, 40.81966778299989], [-73.93380589881859, 40.81651249324708]]], [[[-73.92688606022001, 40.800840648368855], [-73.92650954883642, 40.80065703126224], [-73.92704640297914, 40.800651743031324], [-73.92688606022001, 40.800840648368855]]], [[[-73.92666565490181, 40.80018271401784], [-73.92669572614771, 40.80014697707624], [-73.9272477078927, 40.800392957368906], [-73.92711464230626, 40.80056375622957], [-73.92666565490181, 40.80018271401784]]], [[[-73.92672091168967, 40.800414210943586], [-73.92653846445016, 40.80033389815394], [-73.92674263892977, 40.800403498972756], [-73.92672091168967, 40.800414210943586]]], [[[-73.92718514789182, 40.797349896890104], [-73.92767122620857, 40.79721701426623], [-73.92770694127064, 40.7972986638821], [-73.92738263624496, 40.797377063580456], [-73.92718514789182, 40.797349896890104]]]]}}, {\&quot;id\&quot;: \&quot;74\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19871991798898933, \&quot;OBJECTID\&quot;: 75, \&quot;Shape_Leng\&quot;: 0.0876638997685, \&quot;Shape_Area\&quot;: 0.00024056392715, \&quot;zone\&quot;: \&quot;East Harlem South\&quot;, \&quot;LocationID\&quot;: 75, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94103496899987, 40.79254666899993], [-73.93505300002766, 40.79168720295447], [-73.93708104382307, 40.78936639571], [-73.93621859869943, 40.78880049757431], [-73.94354420706223, 40.78288052416259], [-73.9557773589999, 40.78791392399995], [-73.94831125500004, 40.79812921799992], [-73.94187604699994, 40.79540586899984], [-73.94327251199996, 40.79348810299993], [-73.94103496899987, 40.79254666899993]]]}}, {\&quot;id\&quot;: \&quot;75\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24959927966792073, \&quot;OBJECTID\&quot;: 76, \&quot;Shape_Leng\&quot;: 0.241203016269, \&quot;Shape_Area\&quot;: 0.00126660143241, \&quot;zone\&quot;: \&quot;East New York\&quot;, \&quot;LocationID\&quot;: 76, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88063900599983, 40.679176984999856], [-73.87507136399991, 40.68003514599991], [-73.87231018000001, 40.67775574699987], [-73.86106294999989, 40.67434293499984], [-73.86038937900003, 40.67126877499985], [-73.85763323199998, 40.67165619399985], [-73.85568461199988, 40.66386749199993], [-73.85842950899992, 40.66345335999987], [-73.85761052799985, 40.660108355999924], [-73.86317083299996, 40.65827651199994], [-73.86327623068586, 40.656941215328104], [-73.85695870295893, 40.65058737348713], [-73.85840315341014, 40.64700390123735], [-73.85716978298207, 40.64367855888597], [-73.86289463224384, 40.64255067968245], [-73.86670411973783, 40.6400217634955], [-73.86563247391335, 40.63878676362291], [-73.86867282895084, 40.640925079203356], [-73.87061492461066, 40.64485674188673], [-73.87971979034293, 40.65437592977636], [-73.86989583386247, 40.63893452891954], [-73.86799709668125, 40.63811526520958], [-73.86960972136559, 40.63708553460871], [-73.87347939154502, 40.63628554579879], [-73.87841589406925, 40.638912189353306], [-73.8745808109999, 40.64561010599992], [-73.88221364899994, 40.65451863799996], [-73.89000589199988, 40.651148696999925], [-73.89354677099988, 40.65520271399988], [-73.89761013299987, 40.65345381599992], [-73.89586154900002, 40.65188052699987], [-73.90398200599991, 40.64662856799988], [-73.90944846399994, 40.65152159899992], [-73.90740035699999, 40.6528439899999], [-73.90784346399994, 40.65459152999988], [-73.89612587299993, 40.657814663999936], [-73.88185557299985, 40.66414998799994], [-73.88330883399975, 40.66611200499991], [-73.889906696, 40.66377828999986], [-73.89087805100002, 40.671318086999875], [-73.89271090700004, 40.67104582799992], [-73.89367036399987, 40.67482177099988], [-73.89930675399987, 40.67398204199991], [-73.90004626199993, 40.67689308999995], [-73.88116730300005, 40.68135366299988], [-73.88063900599983, 40.679176984999856]]]}}, {\&quot;id\&quot;: \&quot;76\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.33051263613883086, \&quot;OBJECTID\&quot;: 77, \&quot;Shape_Leng\&quot;: 0.075461081444, \&quot;Shape_Area\&quot;: 0.000191917981315, \&quot;zone\&quot;: \&quot;East New York/Pennsylvania Avenue\&quot;, \&quot;LocationID\&quot;: 77, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8997089949999, 40.67549425099991], [-73.89930675399987, 40.67398204199991], [-73.89367036399987, 40.67482177099988], [-73.89271090699994, 40.671045828999915], [-73.89087805100002, 40.671318086999875], [-73.889906696, 40.66377828999986], [-73.88330883399975, 40.66611200499991], [-73.88185557299985, 40.66414998799994], [-73.89880698499995, 40.65740666199988], [-73.90066118699986, 40.66058615799992], [-73.90347422300006, 40.67550668299985], [-73.90004626199993, 40.67689308999995], [-73.8997089949999, 40.67549425099991]]]}}, {\&quot;id\&quot;: \&quot;77\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21610668061184468, \&quot;OBJECTID\&quot;: 78, \&quot;Shape_Leng\&quot;: 0.0935944495806, \&quot;Shape_Area\&quot;: 0.000191114419551, \&quot;zone\&quot;: \&quot;East Tremont\&quot;, \&quot;LocationID\&quot;: 78, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88963328299991, 40.85317381799993], [-73.88987871399985, 40.85207022099993], [-73.8773292409999, 40.84398312499995], [-73.878171756, 40.84262443699987], [-73.87459175399982, 40.841520647999914], [-73.87109207899995, 40.84432478099992], [-73.86920944599997, 40.84923837199993], [-73.86785992999985, 40.84886493099987], [-73.86804200399997, 40.8448138389999], [-73.87359713599987, 40.83979855499992], [-73.880061996, 40.840162234999845], [-73.88200384100001, 40.837443781999895], [-73.88618432099993, 40.8401050449999], [-73.88941724899988, 40.83942273399985], [-73.89537836099996, 40.842938778999944], [-73.89290102299996, 40.84626832999992], [-73.89617712999998, 40.8466583209999], [-73.89307140900002, 40.85324998699989], [-73.89038953999983, 40.85468905799996], [-73.88963328299991, 40.85317381799993]]]}}, {\&quot;id\&quot;: \&quot;78\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20790510405693716, \&quot;OBJECTID\&quot;: 79, \&quot;Shape_Leng\&quot;: 0.0426249113144, \&quot;Shape_Area\&quot;: 0.000107893068218, \&quot;zone\&quot;: \&quot;East Village\&quot;, \&quot;LocationID\&quot;: 79, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98377990999991, 40.72153595399992], [-73.99260322199994, 40.72413644999987], [-73.98990295999991, 40.7344347899999], [-73.97802697999985, 40.729433059999984], [-73.98377990999991, 40.72153595399992]]]}}, {\&quot;id\&quot;: \&quot;79\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2205123190575919, \&quot;OBJECTID\&quot;: 80, \&quot;Shape_Leng\&quot;: 0.117212621448, \&quot;Shape_Area\&quot;: 0.00040732245622, \&quot;zone\&quot;: \&quot;East Williamsburg\&quot;, \&quot;LocationID\&quot;: 80, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93174841322003, 40.728053727696675], [-73.92849418540158, 40.72661460330786], [-73.92453854985803, 40.719342580204575], [-73.93220607307306, 40.71496398092936], [-73.93124067059496, 40.71372481088467], [-73.93328349320237, 40.71097870745788], [-73.9319010192085, 40.71133847142828], [-73.9303609456579, 40.7087177385352], [-73.93184868877432, 40.71256477418327], [-73.93042294313065, 40.71317255867104], [-73.93105231901723, 40.71461022392334], [-73.92460339476072, 40.717953306073376], [-73.92305500014334, 40.71634266479336], [-73.92488553507611, 40.71526718765259], [-73.92433589757124, 40.71412259346647], [-73.92074519699985, 40.71052968599989], [-73.93229708600003, 40.70774944699988], [-73.93480281900003, 40.713372495999884], [-73.94378799599994, 40.710900378999945], [-73.94273448399997, 40.70447330599988], [-73.9408928719998, 40.70391415699989], [-73.94042057899993, 40.701076597999865], [-73.94193078899983, 40.70072523399989], [-73.95023693799996, 40.705473245999876], [-73.95087492699996, 40.70951311499991], [-73.94865533499987, 40.70972498299988], [-73.94937231899985, 40.71406687799986], [-73.95348472199983, 40.71407020799988], [-73.93174841322003, 40.728053727696675]]]}}, {\&quot;id\&quot;: \&quot;80\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2818767298453197, \&quot;OBJECTID\&quot;: 81, \&quot;Shape_Leng\&quot;: 0.197592771731, \&quot;Shape_Area\&quot;: 0.00039956655019, \&quot;zone\&quot;: \&quot;Eastchester\&quot;, \&quot;LocationID\&quot;: 81, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8236684811033, 40.889903740147645], [-73.82285335053221, 40.8912068290476], [-73.79300652624502, 40.88335873744268], [-73.81209659199986, 40.88671500999993], [-73.82027432999985, 40.885550699999925], [-73.82387140599998, 40.88778362799996], [-73.84324113799987, 40.879108912999904], [-73.8381484219999, 40.876953298999915], [-73.83924788999988, 40.876618737999905], [-73.83829221499984, 40.87295133899995], [-73.83565766499987, 40.86751275599992], [-73.83315960399985, 40.86831975599994], [-73.82834347399992, 40.86089202599988], [-73.85363638799987, 40.87330059899996], [-73.8506895569999, 40.87548667799993], [-73.85254854099988, 40.877091586999924], [-73.85091896099982, 40.877893440999856], [-73.85248305800003, 40.87946370499989], [-73.84704957999995, 40.8876718159999], [-73.83554853999995, 40.88913350399993], [-73.83737956161106, 40.893924741304346], [-73.8236684811033, 40.889903740147645]]]}}, {\&quot;id\&quot;: \&quot;81\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20500494016299856, \&quot;OBJECTID\&quot;: 82, \&quot;Shape_Leng\&quot;: 0.119875649697, \&quot;Shape_Area\&quot;: 0.000323601079994, \&quot;zone\&quot;: \&quot;Elmhurst\&quot;, \&quot;LocationID\&quot;: 82, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86768504899995, 40.744071717999915], [-73.86447086199989, 40.73400727399998], [-73.88720524999994, 40.727792996999874], [-73.8885228599999, 40.734531159999904], [-73.87752195799992, 40.731593168999915], [-73.87708276299998, 40.73290931699991], [-73.88066188999987, 40.73570787399994], [-73.88033059399996, 40.73733367699989], [-73.88230252700001, 40.737707700999934], [-73.87743058400002, 40.73860051599991], [-73.88100387999987, 40.74184066199995], [-73.88551225099985, 40.74016501899988], [-73.887511321, 40.74108252699992], [-73.88798650799986, 40.743548191999935], [-73.89071647499993, 40.74312778399992], [-73.89175048799991, 40.7468117269999], [-73.86942458599987, 40.74915685199991], [-73.86768504899995, 40.744071717999915]]]}}, {\&quot;id\&quot;: \&quot;82\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20252139285873935, \&quot;OBJECTID\&quot;: 83, \&quot;Shape_Leng\&quot;: 0.105984933269, \&quot;Shape_Area\&quot;: 0.000217463718718, \&quot;zone\&quot;: \&quot;Elmhurst/Maspeth\&quot;, \&quot;LocationID\&quot;: 83, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89111026199994, 40.745202717999874], [-73.89071647499993, 40.74312778399992], [-73.88798650799986, 40.743548191999935], [-73.887511321, 40.74108252699992], [-73.88551225099985, 40.74016501899988], [-73.88100387999987, 40.74184066199995], [-73.87791831799989, 40.739394956999874], [-73.88230252700001, 40.737707700999934], [-73.88033059399996, 40.73733367699989], [-73.88066188999987, 40.73570787399994], [-73.87725122499988, 40.7317941529999], [-73.88910318999984, 40.73459239599987], [-73.89854772799987, 40.735191909999855], [-73.90107970900003, 40.73391463399987], [-73.90516948899983, 40.73585964299986], [-73.90628903499987, 40.732400751999876], [-73.91068876399997, 40.733471081999916], [-73.90926002999988, 40.736403179999854], [-73.90057825399985, 40.73949289599988], [-73.89524819599988, 40.74381972999992], [-73.89624245599988, 40.74871954499987], [-73.89139145499985, 40.74664100399984], [-73.89111026199994, 40.745202717999874]]]}}, {\&quot;id\&quot;: \&quot;83\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.39373205563220104, \&quot;OBJECTID\&quot;: 84, \&quot;Shape_Leng\&quot;: 0.233623987032, \&quot;Shape_Area\&quot;: 0.00207375572052, \&quot;zone\&quot;: \&quot;Eltingville/Annadale/Prince&apos;s Bay\&quot;, \&quot;LocationID\&quot;: 84, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.16005732699996, 40.527635041999886], [-74.1720632017547, 40.52332056936472], [-74.17756306042942, 40.519217618159864], [-74.18104081208887, 40.520705036287154], [-74.1848311647976, 40.519341358600826], [-74.19521339999068, 40.5099776529556], [-74.19967205357709, 40.511426850497486], [-74.19936127407836, 40.51301019443217], [-74.20821982874101, 40.51161821258057], [-74.21754755095681, 40.50336004949062], [-74.22153919955196, 40.50250347421612], [-74.22690993399992, 40.51917139799985], [-74.22379595899992, 40.518196345999876], [-74.21354593499994, 40.521235714999925], [-74.21409806799993, 40.52409719499991], [-74.20152661599995, 40.526265205999934], [-74.19174368799999, 40.53191669699986], [-74.19377169299999, 40.53583384699993], [-74.18903145199995, 40.53815934199989], [-74.18128532999992, 40.54695757299989], [-74.17185166499996, 40.56152092299991], [-74.16982582400001, 40.56109042099991], [-74.16540080799992, 40.54443272299989], [-74.15397419799994, 40.53426814799993], [-74.16134961699994, 40.5293734239999], [-74.16005732699996, 40.527635041999886]]]}}, {\&quot;id\&quot;: \&quot;84\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23689531114725296, \&quot;OBJECTID\&quot;: 85, \&quot;Shape_Leng\&quot;: 0.0574751473562, \&quot;Shape_Area\&quot;: 0.000143637804933, \&quot;zone\&quot;: \&quot;Erasmus\&quot;, \&quot;LocationID\&quot;: 85, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94715896299984, 40.65559378699993], [-73.94586879199989, 40.64342374399988], [-73.94778994699976, 40.643305735999924], [-73.94826499600005, 40.63860718999994], [-73.9536000469999, 40.63842234699991], [-73.95763644599988, 40.64268949899989], [-73.9587078989999, 40.65038727299989], [-73.94957113100006, 40.65080789999991], [-73.9500666489999, 40.65542299699989], [-73.94715896299984, 40.65559378699993]]]}}, {\&quot;id\&quot;: \&quot;85\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.3207894328727415, \&quot;OBJECTID\&quot;: 86, \&quot;Shape_Leng\&quot;: 0.134245282582, \&quot;Shape_Area\&quot;: 0.000623278815249, \&quot;zone\&quot;: \&quot;Far Rockaway\&quot;, \&quot;LocationID\&quot;: 86, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76669071688973, 40.61422662157113], [-73.76505961679173, 40.612035230610466], [-73.76023635756965, 40.610820864950284], [-73.76178242960594, 40.60915167005445], [-73.76155051905889, 40.60903136580077], [-73.75998446974822, 40.61087937784668], [-73.7556083701559, 40.61007791963748], [-73.7457615018933, 40.611991654374336], [-73.73815143112287, 40.60271044008338], [-73.73808925304178, 40.59768829704553], [-73.74183083531219, 40.59669555145679], [-73.73812220887619, 40.597386102069386], [-73.73763679389783, 40.594415399837956], [-73.74664920374843, 40.594280895008744], [-73.75352988157324, 40.59094648500059], [-73.76376223423699, 40.591439709016804], [-73.76440183099987, 40.59457168299989], [-73.76277845599988, 40.59475654399989], [-73.7633344969999, 40.59782287399992], [-73.76128753399995, 40.59954927099993], [-73.76654204999997, 40.599434441999904], [-73.76771811799993, 40.596261309999925], [-73.76795043655434, 40.5981585114185], [-73.77098168371995, 40.59889409104954], [-73.76895714023856, 40.60927991805636], [-73.77417180232338, 40.61182871527586], [-73.77339803484179, 40.61368296748421], [-73.76669071688973, 40.61422662157113]]]}}, {\&quot;id\&quot;: \&quot;86\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19877920535763455, \&quot;OBJECTID\&quot;: 87, \&quot;Shape_Leng\&quot;: 0.0369015496117, \&quot;Shape_Area\&quot;: 6.72050210692e-05, \&quot;zone\&quot;: \&quot;Financial District North\&quot;, \&quot;LocationID\&quot;: 87, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00372234899996, 40.70693234399989], [-74.00197014837809, 40.704731159202304], [-74.00332307270776, 40.70562859522001], [-74.00459003883662, 40.70478775294495], [-74.00349632042315, 40.70379676926777], [-74.0053502722475, 40.70431007996148], [-74.004272587521, 40.70301566641148], [-74.00659591913875, 40.70368590245183], [-74.00530412596079, 40.70255986563306], [-74.00550166067457, 40.70243086779703], [-74.01250773999998, 40.706767065999934], [-74.00906264799988, 40.71088670399992], [-74.00372234899996, 40.70693234399989]]]}}, {\&quot;id\&quot;: \&quot;87\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20630995600678215, \&quot;OBJECTID\&quot;: 88, \&quot;Shape_Leng\&quot;: 0.0352046035327, \&quot;Shape_Area\&quot;: 5.72999455414e-05, \&quot;zone\&quot;: \&quot;Financial District South\&quot;, \&quot;LocationID\&quot;: 88, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00974639299997, 40.704775247999905], [-74.00760498189766, 40.70299314132918], [-74.00930907655483, 40.70195460302249], [-74.00759136204225, 40.70132808104815], [-74.01367479307396, 40.70012582122537], [-74.01428922899998, 40.70454907499989], [-74.01250773999998, 40.706767065999934], [-74.00974639299997, 40.704775247999905]]]}}, {\&quot;id\&quot;: \&quot;88\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2310376392540709, \&quot;OBJECTID\&quot;: 89, \&quot;Shape_Leng\&quot;: 0.122794569553, \&quot;Shape_Area\&quot;: 0.000447548142373, \&quot;zone\&quot;: \&quot;Flatbush/Ditmas Park\&quot;, \&quot;LocationID\&quot;: 89, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95374853799996, 40.63858633799993], [-73.94537272499998, 40.638786954999865], [-73.94462885499995, 40.63183773499993], [-73.94647961799998, 40.631708161999896], [-73.94415535299993, 40.629508284999886], [-73.95995565099992, 40.627778671999884], [-73.96040734299989, 40.6301625309999], [-73.96232599399991, 40.6299687169999], [-73.97136622199992, 40.62892916199996], [-73.97092126300004, 40.62656998499993], [-73.97623453700001, 40.625976349999895], [-73.97716511999984, 40.63074665399988], [-73.96986869299992, 40.63419467499989], [-73.97029036199991, 40.63640634099988], [-73.96803868499985, 40.636650984999925], [-73.97139631700004, 40.64825778599986], [-73.96465438699984, 40.650887727999894], [-73.96621321999996, 40.653189404999885], [-73.95986103199981, 40.65563478899989], [-73.95763644599988, 40.64268949899989], [-73.95374853799996, 40.63858633799993]]]}}, {\&quot;id\&quot;: \&quot;89\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2116001251654537, \&quot;OBJECTID\&quot;: 90, \&quot;Shape_Leng\&quot;: 0.0307591620819, \&quot;Shape_Area\&quot;: 5.53132476305e-05, \&quot;zone\&quot;: \&quot;Flatiron\&quot;, \&quot;LocationID\&quot;: 90, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9963368949999, 40.7380437469999], [-74.00252381499989, 40.73975264399995], [-73.99709902899994, 40.74720510199991], [-73.99141858599994, 40.74480268199988], [-73.9963368949999, 40.7380437469999]]]}}, {\&quot;id\&quot;: \&quot;90\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22113815404518197, \&quot;OBJECTID\&quot;: 91, \&quot;Shape_Leng\&quot;: 0.124996624585, \&quot;Shape_Area\&quot;: 0.000537330013243, \&quot;zone\&quot;: \&quot;Flatlands\&quot;, \&quot;LocationID\&quot;: 91, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91945472999996, 40.6401731369999], [-73.91690302699992, 40.61627422899993], [-73.9205269409999, 40.61394269499987], [-73.92640044599996, 40.61447853499988], [-73.92629604599998, 40.61311679899991], [-73.93686699599992, 40.620253280999904], [-73.94573691999982, 40.61536340699989], [-73.94651373199997, 40.61949401899995], [-73.94451833400001, 40.61971364699989], [-73.94732672199994, 40.629166566999835], [-73.94415535299993, 40.629508284999886], [-73.94647961799998, 40.631708161999896], [-73.93701746200003, 40.63231097899989], [-73.9372670019998, 40.634650624999885], [-73.92744822299987, 40.635258409999864], [-73.92538233099987, 40.64238453199987], [-73.92356525899983, 40.642499297999905], [-73.92332654599986, 40.63990021599991], [-73.91973736999988, 40.64277814799987], [-73.91945472999996, 40.6401731369999]]]}}, {\&quot;id\&quot;: \&quot;91\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21449369418026523, \&quot;OBJECTID\&quot;: 92, \&quot;Shape_Leng\&quot;: 0.117830066799, \&quot;Shape_Area\&quot;: 0.000374946617289, \&quot;zone\&quot;: \&quot;Flushing\&quot;, \&quot;LocationID\&quot;: 92, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82656578899986, 40.77064147599989], [-73.82466908999987, 40.77040760799985], [-73.82080684899987, 40.7589417829999], [-73.81789245699991, 40.75708633799991], [-73.82030067699999, 40.75551497999992], [-73.8184078289999, 40.75383042199998], [-73.820849288, 40.75224154499988], [-73.81575069499985, 40.7469794799999], [-73.82108427599998, 40.748558445999954], [-73.82426493900002, 40.75183288899994], [-73.82584440999999, 40.74934839099993], [-73.83300302099987, 40.74783363099988], [-73.8322953569999, 40.751941790999844], [-73.83560230899995, 40.75139485299991], [-73.83805974199996, 40.75466660699988], [-73.83689970199995, 40.7626981179999], [-73.8394581342306, 40.76544576822929], [-73.83000011099983, 40.77373240699996], [-73.82513740299993, 40.78169970599994], [-73.82224127699999, 40.781693878999924], [-73.82583089999997, 40.77591527099986], [-73.82656578899986, 40.77064147599989]]]}}, {\&quot;id\&quot;: \&quot;92\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20875280230972412, \&quot;OBJECTID\&quot;: 93, \&quot;Shape_Leng\&quot;: 0.170998027597, \&quot;Shape_Area\&quot;: 0.000594278183978, \&quot;zone\&quot;: \&quot;Flushing Meadows-Corona Park\&quot;, \&quot;LocationID\&quot;: 93, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8569635593979, 40.76407442786308], [-73.8566748236235, 40.763930188326135], [-73.85758285470693, 40.76307290062661], [-73.8565867538878, 40.762722840114236], [-73.85817631070509, 40.7623962942238], [-73.85661195813331, 40.761649542759294], [-73.8585852628444, 40.76191700859695], [-73.85747662435531, 40.76130891668733], [-73.85158552901191, 40.75935542065696], [-73.84930110814332, 40.76024287534997], [-73.85207200177854, 40.7603928846721], [-73.84670933714987, 40.76134526931977], [-73.84324381399976, 40.75533680399995], [-73.83867321899987, 40.75701997899995], [-73.83560230899995, 40.75139485299991], [-73.8322953569999, 40.751941790999844], [-73.83300302099987, 40.74783363099988], [-73.83699037399995, 40.74209330099992], [-73.8361277859999, 40.734241311999924], [-73.83073214599987, 40.72654932799991], [-73.8273090039999, 40.72464607699988], [-73.82531644999993, 40.71727569999994], [-73.81729568999994, 40.71757964499995], [-73.83145866999996, 40.714554448999934], [-73.8297961659998, 40.71556571899986], [-73.83488359399998, 40.719303271999934], [-73.85436928099995, 40.748738929999874], [-73.85086439699992, 40.74999564199986], [-73.85379813799992, 40.757177611999914], [-73.86109724399991, 40.76366447799989], [-73.85861915281858, 40.7619355969989], [-73.8569635593979, 40.76407442786308]]]}}, {\&quot;id\&quot;: \&quot;93\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2623495634389995, \&quot;OBJECTID\&quot;: 94, \&quot;Shape_Leng\&quot;: 0.0498326083147, \&quot;Shape_Area\&quot;: 6.25819407393e-05, \&quot;zone\&quot;: \&quot;Fordham South\&quot;, \&quot;LocationID\&quot;: 94, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89964261700001, 40.862210436999874], [-73.897143798, 40.86244506499991], [-73.89883814599983, 40.859307307999906], [-73.89573924699978, 40.85813820699986], [-73.89106059999996, 40.861471814999945], [-73.89560883299981, 40.85457036999986], [-73.89863543699985, 40.85390697499993], [-73.89816577499982, 40.85514637599989], [-73.90077922699986, 40.85604710999993], [-73.90185996099993, 40.85458614899994], [-73.90557007299988, 40.855787321999884], [-73.90351390599986, 40.86091750999989], [-73.89964261700001, 40.862210436999874]]]}}, {\&quot;id\&quot;: \&quot;94\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20937220078946203, \&quot;OBJECTID\&quot;: 95, \&quot;Shape_Leng\&quot;: 0.113629605476, \&quot;Shape_Area\&quot;: 0.00057277033803, \&quot;zone\&quot;: \&quot;Forest Hills\&quot;, \&quot;LocationID\&quot;: 95, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84732494199989, 40.738771457999896], [-73.83488359399998, 40.719303271999934], [-73.8297961659998, 40.71556571899986], [-73.8377089419999, 40.71103648399989], [-73.85593991699984, 40.7063980339999], [-73.8586809759999, 40.72261243999988], [-73.86203833799982, 40.72595678499994], [-73.85805416899993, 40.72444540599986], [-73.85727108100001, 40.72568129799988], [-73.8594198799999, 40.726464837999885], [-73.85741240699991, 40.72832247999986], [-73.85851097899999, 40.73028680199993], [-73.85625665099991, 40.73095912299993], [-73.85872465799989, 40.73570864399988], [-73.84732494199989, 40.738771457999896]]]}}, {\&quot;id\&quot;: \&quot;95\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.25047847935328815, \&quot;OBJECTID\&quot;: 96, \&quot;Shape_Leng\&quot;: 0.185180248095, \&quot;Shape_Area\&quot;: 0.000547566253402, \&quot;zone\&quot;: \&quot;Forest Park/Highland Park\&quot;, \&quot;LocationID\&quot;: 96, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83804164799996, 40.70832329499994], [-73.83696237799982, 40.70421245199992], [-73.84502472899999, 40.6993593769999], [-73.84913837299978, 40.69828274099995], [-73.85070842300001, 40.70020312499988], [-73.85443455699989, 40.70060295199994], [-73.85277238699999, 40.69755711199987], [-73.874020533, 40.69419129499994], [-73.88962787599998, 40.684236453999894], [-73.89252316899987, 40.683424532999865], [-73.89417463299992, 40.6852832479999], [-73.89646625099995, 40.68233642199988], [-73.90116155099986, 40.687877934999946], [-73.90180467199995, 40.6907662979999], [-73.9003866789998, 40.69313995999992], [-73.89736265799978, 40.6941108469999], [-73.89695653499987, 40.6919492069999], [-73.89326209899984, 40.69220094699994], [-73.8950769439999, 40.694591389999886], [-73.88642048199995, 40.696458148999945], [-73.88771297999986, 40.699678075999906], [-73.88280948499987, 40.7006834549999], [-73.88182690599986, 40.69952929899987], [-73.87639785199997, 40.70229404199989], [-73.86285374199994, 40.7034144919999], [-73.85819890699996, 40.70291107399986], [-73.85893224399979, 40.70132034499989], [-73.85725351500002, 40.70121217699989], [-73.85252019099998, 40.70229172399997], [-73.85473240499985, 40.70676414299989], [-73.84314625299982, 40.70922345599992], [-73.83804164799996, 40.70832329499994]]]}}, {\&quot;id\&quot;: \&quot;96\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.212340176461046, \&quot;OBJECTID\&quot;: 97, \&quot;Shape_Leng\&quot;: 0.0624760147423, \&quot;Shape_Area\&quot;: 0.000163303970435, \&quot;zone\&quot;: \&quot;Fort Greene\&quot;, \&quot;LocationID\&quot;: 97, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9693409769999, 40.69576842999993], [-73.96910362499993, 40.68946752199986], [-73.97013154199992, 40.68950630799986], [-73.96868961400001, 40.68200525799988], [-73.97745722099988, 40.68405228699988], [-73.98092822899991, 40.68890247699988], [-73.98372011099993, 40.69000671899992], [-73.98147568199991, 40.689930943999876], [-73.98251122999989, 40.69361433399992], [-73.97916718399999, 40.69348832299992], [-73.98054419199988, 40.69824651199988], [-73.9697278989999, 40.69780401399986], [-73.9693409769999, 40.69576842999993]]]}}, {\&quot;id\&quot;: \&quot;97\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20503104303252664, \&quot;OBJECTID\&quot;: 98, \&quot;Shape_Leng\&quot;: 0.121661018278, \&quot;Shape_Area\&quot;: 0.000485773020954, \&quot;zone\&quot;: \&quot;Fresh Meadows\&quot;, \&quot;LocationID\&quot;: 98, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76360860199983, 40.73917476499987], [-73.76273303499985, 40.73526216299995], [-73.76510920699994, 40.73455658499992], [-73.7636997919999, 40.73286411699993], [-73.76564374500005, 40.732533126999954], [-73.75669771299987, 40.7262287109999], [-73.76924074899993, 40.72590270099988], [-73.77727808000003, 40.72234633599988], [-73.77803765999981, 40.723284268999855], [-73.7752338719998, 40.725237532999884], [-73.77757506899988, 40.73019327299987], [-73.79174472699992, 40.725788849999944], [-73.79651029099988, 40.7379086369999], [-73.76772991399994, 40.74577622599993], [-73.76360860199983, 40.73917476499987]]]}}, {\&quot;id\&quot;: \&quot;98\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2975, \&quot;OBJECTID\&quot;: 99, \&quot;Shape_Leng\&quot;: 0.1833714893, \&quot;Shape_Area\&quot;: 0.00121016463877, \&quot;zone\&quot;: \&quot;Freshkills Park\&quot;, \&quot;LocationID\&quot;: 99, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.16842916199994, 40.58649792299988], [-74.16982582400001, 40.56109042099991], [-74.18295815999996, 40.56548019999992], [-74.193410946, 40.56248503899994], [-74.20091501299991, 40.55600525999987], [-74.20699885299997, 40.55756748899989], [-74.2056960519999, 40.55851600599987], [-74.21324031454323, 40.55667262386906], [-74.20596154297344, 40.580046993882775], [-74.20048848799996, 40.57994977799989], [-74.19964981299998, 40.58226262599991], [-74.19423261299991, 40.58514680599988], [-74.185371048, 40.58745101499987], [-74.18730248699987, 40.588488221999896], [-74.17488959399996, 40.602216572999914], [-74.16719634899995, 40.602075311999926], [-74.16886362299992, 40.59472808699995], [-74.16350785499993, 40.59327217999993], [-74.16842916199994, 40.58649792299988]]]}}, {\&quot;id\&quot;: \&quot;99\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21675614089247308, \&quot;OBJECTID\&quot;: 100, \&quot;Shape_Leng\&quot;: 0.0248131090342, \&quot;Shape_Area\&quot;: 3.74700210291e-05, \&quot;zone\&quot;: \&quot;Garment District\&quot;, \&quot;LocationID\&quot;: 100, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98729377099981, 40.75045160899988], [-73.99346417699986, 40.75219005499987], [-73.98979085399996, 40.7572331319999], [-73.98411754799999, 40.75484205299995], [-73.98729377099981, 40.75045160899988]]]}}, {\&quot;id\&quot;: \&quot;100\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.1935076788238434, \&quot;OBJECTID\&quot;: 101, \&quot;Shape_Leng\&quot;: 0.101709836277, \&quot;Shape_Area\&quot;: 0.000452342528877, \&quot;zone\&quot;: \&quot;Glen Oaks\&quot;, \&quot;LocationID\&quot;: 101, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.70134715908382, 40.750780580935846], [-73.70002020501624, 40.73923654186594], [-73.70766217302989, 40.727830934754685], [-73.71049995381028, 40.72722708720663], [-73.71147804899985, 40.73250140099988], [-73.72010148299994, 40.74977568599991], [-73.727664654, 40.749654641999946], [-73.728962516, 40.74763288799986], [-73.72737889099987, 40.751029566999854], [-73.7206331939999, 40.75761683499996], [-73.71612528199985, 40.75966071399991], [-73.71244940715339, 40.75924170410932], [-73.70163345846068, 40.75249332984642], [-73.70134715908382, 40.750780580935846]]]}}, {\&quot;id\&quot;: \&quot;101\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2244166676757176, \&quot;OBJECTID\&quot;: 102, \&quot;Shape_Leng\&quot;: 0.136900484646, \&quot;Shape_Area\&quot;: 0.000296595466345, \&quot;zone\&quot;: \&quot;Glendale\&quot;, \&quot;LocationID\&quot;: 102, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85595536199988, 40.70642977899992], [-73.85473240499985, 40.70676414299989], [-73.85252019099998, 40.70229172399997], [-73.85827405799986, 40.70122365899992], [-73.85819890699996, 40.70291107399986], [-73.86285374199994, 40.7034144919999], [-73.87639785199997, 40.70229404199989], [-73.88182690599986, 40.69952929899987], [-73.88280948499988, 40.70068345599986], [-73.88771297999986, 40.699678075999906], [-73.88642048199995, 40.696458148999945], [-73.8950769439999, 40.694591389999886], [-73.89326209899984, 40.69220094699994], [-73.89695653499987, 40.6919492069999], [-73.89736265799978, 40.6941108469999], [-73.900030392, 40.693437450999895], [-73.88911917799989, 40.705598876999915], [-73.86911007199988, 40.707089336999914], [-73.87016462499984, 40.70920774299987], [-73.85965416799995, 40.713379960999866], [-73.85975932900001, 40.711845058999856], [-73.85729287299985, 40.711467676999874], [-73.85595536199988, 40.70642977899992]]]}}, {\&quot;id\&quot;: \&quot;102\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19578838174273858, \&quot;OBJECTID\&quot;: 103, \&quot;Shape_Leng\&quot;: 0.0143055167343, \&quot;Shape_Area\&quot;: 6.33056361314e-06, \&quot;zone\&quot;: \&quot;Governor&apos;s Island/Ellis Island/Liberty Island\&quot;, \&quot;LocationID\&quot;: 103, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.04388559600675, 40.690184824096946], [-74.04350596056258, 40.689687359818144], [-74.04270428413375, 40.69015520482211], [-74.04255372018648, 40.68996275914475], [-74.04438521705613, 40.68851617820147], [-74.04772962698515, 40.689915318233105], [-74.04614707204328, 40.69112264601653], [-74.04388559600675, 40.690184824096946]]]}}, {\&quot;id\&quot;: \&quot;103\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19578838174273858, \&quot;OBJECTID\&quot;: 104, \&quot;Shape_Leng\&quot;: 0.0212208330928, \&quot;Shape_Area\&quot;: 1.19205339715e-05, \&quot;zone\&quot;: \&quot;Governor&apos;s Island/Ellis Island/Liberty Island\&quot;, \&quot;LocationID\&quot;: 103, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.03995040794246, 40.70089063032128], [-74.03771124798313, 40.69934404017382], [-74.03934037685066, 40.698115514418], [-74.04124261816106, 40.69953674121738], [-74.0399124888631, 40.69770204019913], [-74.0416605190741, 40.696452971319864], [-74.04367371215382, 40.69802040416498], [-74.03995040794246, 40.70089063032128]]]}}, {\&quot;id\&quot;: \&quot;104\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19578838174273858, \&quot;OBJECTID\&quot;: 105, \&quot;Shape_Leng\&quot;: 0.0774253398314, \&quot;Shape_Area\&quot;: 0.000368636392805, \&quot;zone\&quot;: \&quot;Governor&apos;s Island/Ellis Island/Liberty Island\&quot;, \&quot;LocationID\&quot;: 103, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01674756096064, 40.693343368217555], [-74.0118118564723, 40.69247933506435], [-74.01333264149613, 40.69201997010238], [-74.01182575354963, 40.69106481621614], [-74.01316926402752, 40.6881547712032], [-74.02259359581036, 40.68435969594992], [-74.02213250186877, 40.683767672385194], [-74.02305574749599, 40.6829169454452], [-74.0227589902996, 40.68428444833225], [-74.026334042424, 40.6848016977242], [-74.01971454942077, 40.69313300682718], [-74.01674756096064, 40.693343368217555]]]}}, {\&quot;id\&quot;: \&quot;105\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22341501041707898, \&quot;OBJECTID\&quot;: 106, \&quot;Shape_Leng\&quot;: 0.0492110119798, \&quot;Shape_Area\&quot;: 0.000113616826567, \&quot;zone\&quot;: \&quot;Gowanus\&quot;, \&quot;LocationID\&quot;: 106, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98610388199985, 40.68100852199994], [-73.98175642299985, 40.67931462399987], [-73.99277080699981, 40.665507280999876], [-73.9986188799999, 40.67183017199989], [-73.99506451099984, 40.67584047499984], [-73.99069861899994, 40.67580741899994], [-73.9876680399999, 40.68081780999993], [-73.98610388199985, 40.68100852199994]]]}}, {\&quot;id\&quot;: \&quot;106\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20887280634012714, \&quot;OBJECTID\&quot;: 107, \&quot;Shape_Leng\&quot;: 0.0380413645908, \&quot;Shape_Area\&quot;: 7.46112192675e-05, \&quot;zone\&quot;: \&quot;Gramercy\&quot;, \&quot;LocationID\&quot;: 107, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98238628799993, 40.73141124499993], [-73.98990295999991, 40.7344347899999], [-73.98407485299995, 40.74332471799989], [-73.98085965399994, 40.74196976799989], [-73.98266497499989, 40.73949733299987], [-73.97805226499996, 40.7375539539999], [-73.98238628799993, 40.73141124499993]]]}}, {\&quot;id\&quot;: \&quot;107\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.35813379122664674, \&quot;OBJECTID\&quot;: 108, \&quot;Shape_Leng\&quot;: 0.11117141227, \&quot;Shape_Area\&quot;: 0.000352866009465, \&quot;zone\&quot;: \&quot;Gravesend\&quot;, \&quot;LocationID\&quot;: 108, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97148350899987, 40.59717158499996], [-73.97115101799994, 40.59044244399989], [-73.96514385199995, 40.5911019159999], [-73.96661531499983, 40.58457103699992], [-73.97742525299988, 40.58290659299994], [-73.98710120299997, 40.58464459199988], [-73.98654457099988, 40.583658590999946], [-73.98829948299982, 40.58346674699986], [-73.98995504960881, 40.58066166976562], [-73.99185535656628, 40.5816239785461], [-73.99026244714351, 40.5846191482053], [-73.99547188560318, 40.58221005511802], [-74.0003088081067, 40.58317703751469], [-73.99808523776004, 40.585364721581485], [-73.99956511570304, 40.5862439200957], [-73.9940790462178, 40.58869344199059], [-74.00038207107852, 40.58713305717468], [-73.98962150099992, 40.59098199299996], [-73.98601936799993, 40.594446048999906], [-73.97995443499985, 40.594073811999884], [-73.98035785499995, 40.59619154099992], [-73.97148350899987, 40.59717158499996]]]}}, {\&quot;id\&quot;: \&quot;108\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2538771539744302, \&quot;OBJECTID\&quot;: 109, \&quot;Shape_Leng\&quot;: 0.178267819599, \&quot;Shape_Area\&quot;: 0.00116960076185, \&quot;zone\&quot;: \&quot;Great Kills\&quot;, \&quot;LocationID\&quot;: 109, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.14706472699994, 40.5705086149999], [-74.13170009, 40.56453574899991], [-74.13885092699991, 40.5569511789999], [-74.13316825999992, 40.552356178999936], [-74.13861798499994, 40.548492384999875], [-74.13585712583111, 40.546451696357344], [-74.1371798712987, 40.5457928646606], [-74.13611540724054, 40.54501984567978], [-74.13794966050746, 40.54600033758068], [-74.13886951340419, 40.545130197607286], [-74.13762430745145, 40.54425356641828], [-74.13875534703455, 40.544933958426874], [-74.13786798524545, 40.54405254413092], [-74.13903307178627, 40.54470491029999], [-74.13953937915736, 40.54429514087214], [-74.13834151288823, 40.543551828814046], [-74.14038573073617, 40.54403318500786], [-74.13921993485874, 40.54316608513788], [-74.14141073560397, 40.543022415080344], [-74.14026290400692, 40.54196151152258], [-74.14134901379589, 40.54257752313157], [-74.14179719957052, 40.54220041538235], [-74.14063984172124, 40.54169454203723], [-74.14095816832888, 40.54143207796496], [-74.14229632246158, 40.54225784915546], [-74.14104157916547, 40.53734688546733], [-74.14374951249268, 40.53719106134627], [-74.15970134520207, 40.52729599283152], [-74.16134961699994, 40.5293734239999], [-74.15397419799994, 40.53426814799993], [-74.16540080799992, 40.54443272299989], [-74.16982582400001, 40.56109042099991], [-74.1649414939999, 40.56011179699991], [-74.15725974199995, 40.562553318999896], [-74.14706472699994, 40.5705086149999]]]}}, {\&quot;id\&quot;: \&quot;109\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22599999999999998, \&quot;OBJECTID\&quot;: 110, \&quot;Shape_Leng\&quot;: 0.103946292913, \&quot;Shape_Area\&quot;: 0.000525745098785, \&quot;zone\&quot;: \&quot;Great Kills Park\&quot;, \&quot;LocationID\&quot;: 110, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.11813477599993, 40.550592692999906], [-74.11338340608127, 40.54807337507532], [-74.12245306050386, 40.544770545629824], [-74.1335644349803, 40.5315111748056], [-74.1369079907634, 40.529281918882695], [-74.13883030715276, 40.529889356352996], [-74.14032475393472, 40.5352845797219], [-74.13381005153853, 40.53564293988989], [-74.12738789634466, 40.54229542996431], [-74.13011404715266, 40.54597572663567], [-74.13585712583111, 40.546451696357344], [-74.13861798499991, 40.548492383999886], [-74.12730057799996, 40.55729517199993], [-74.11813477599993, 40.550592692999906]]]}}, {\&quot;id\&quot;: \&quot;110\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22327868305062104, \&quot;OBJECTID\&quot;: 111, \&quot;Shape_Leng\&quot;: 0.0599308800658, \&quot;Shape_Area\&quot;: 0.000208683276503, \&quot;zone\&quot;: \&quot;Green-Wood Cemetery\&quot;, \&quot;LocationID\&quot;: 111, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99516890099986, 40.6596695219999], [-73.990188415, 40.657600817999906], [-73.98843135299977, 40.65925121199996], [-73.98179568699996, 40.65524609699991], [-73.98029115499993, 40.647297160999855], [-73.98905872499985, 40.64411924099995], [-74.00214474599989, 40.65295610699996], [-73.99516890099986, 40.6596695219999]]]}}, {\&quot;id\&quot;: \&quot;111\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2204978606181463, \&quot;OBJECTID\&quot;: 112, \&quot;Shape_Leng\&quot;: 0.107267875765, \&quot;Shape_Area\&quot;: 0.000462068671429, \&quot;zone\&quot;: \&quot;Greenpoint\&quot;, \&quot;LocationID\&quot;: 112, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.95439555417066, 40.73911477252253], [-73.94652352854791, 40.73692685395814], [-73.94719983367108, 40.73535517811412], [-73.94706532915383, 40.734401992819265], [-73.94557048457217, 40.736612303910405], [-73.94239443542429, 40.73542574994758], [-73.9381033496066, 40.729728519521366], [-73.93226852175046, 40.72817465801565], [-73.94841638599995, 40.71845553299995], [-73.94907816799986, 40.72254028699993], [-73.95477662900004, 40.72245950499994], [-73.95842611843923, 40.725400535832165], [-73.9616151883593, 40.725865563073995], [-73.96143187677845, 40.730965171647846], [-73.96226340423281, 40.732915551623485], [-73.96406507049178, 40.732779040653625], [-73.95837507902779, 40.73809694936863], [-73.95439555417066, 40.73911477252253]]], [[[-73.96236596889429, 40.72420906161418], [-73.96200744849497, 40.7239919013038], [-73.96207271921921, 40.72388030020147], [-73.96246790011047, 40.72413157960129], [-73.96236596889429, 40.72420906161418]]]]}}, {\&quot;id\&quot;: \&quot;112\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21042639149415804, \&quot;OBJECTID\&quot;: 113, \&quot;Shape_Leng\&quot;: 0.032745350566, \&quot;Shape_Area\&quot;: 5.79634566998e-05, \&quot;zone\&quot;: \&quot;Greenwich Village North\&quot;, \&quot;LocationID\&quot;: 113, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99136388099988, 40.72755978299991], [-73.99657214499979, 40.729552233999904], [-73.99556245499996, 40.73071521599994], [-74.000066577, 40.7329292359999], [-73.99683993899998, 40.73736088899995], [-73.98990295999991, 40.7344347899999], [-73.99136388099988, 40.72755978299991]]]}}, {\&quot;id\&quot;: \&quot;113\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20914651077761146, \&quot;OBJECTID\&quot;: 114, \&quot;Shape_Leng\&quot;: 0.0317270347711, \&quot;Shape_Area\&quot;: 4.70207704945e-05, \&quot;zone\&quot;: \&quot;Greenwich Village South\&quot;, \&quot;LocationID\&quot;: 114, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99257987399992, 40.724201554999915], [-74.00281726599992, 40.72836312899993], [-74.000066577, 40.7329292359999], [-73.99154832699986, 40.72708947099994], [-73.99257987399992, 40.724201554999915]]]}}, {\&quot;id\&quot;: \&quot;114\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.32119751984248307, \&quot;OBJECTID\&quot;: 115, \&quot;Shape_Leng\&quot;: 0.116169413964, \&quot;Shape_Area\&quot;: 0.000373168991958, \&quot;zone\&quot;: \&quot;Grymes Hill/Clifton\&quot;, \&quot;LocationID\&quot;: 115, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08069514799999, 40.62753689699988], [-74.08326107499997, 40.627194742999954], [-74.08496211899991, 40.624625232999925], [-74.08785147699994, 40.615243072999924], [-74.08720982799997, 40.61330697399994], [-74.07253551699989, 40.622464021999896], [-74.071134623, 40.62035994799992], [-74.0815547009999, 40.60629029699987], [-74.0977696879999, 40.61062359299988], [-74.10350925299994, 40.61641607499991], [-74.0922397139999, 40.62574291499989], [-74.08574928999992, 40.633955556999865], [-74.07972492199995, 40.62895068799986], [-74.08069514799999, 40.62753689699988]]]}}, {\&quot;id\&quot;: \&quot;115\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19669953317303726, \&quot;OBJECTID\&quot;: 116, \&quot;Shape_Leng\&quot;: 0.0681164844265, \&quot;Shape_Area\&quot;: 0.000260415337217, \&quot;zone\&quot;: \&quot;Hamilton Heights\&quot;, \&quot;LocationID\&quot;: 116, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93924885699987, 40.82829635099989], [-73.94515456999994, 40.82087626499993], [-73.94808289799983, 40.82210802199994], [-73.95082880000002, 40.820827936999876], [-73.95954472552476, 40.82364494182928], [-73.95015521048293, 40.83439675940791], [-73.93864026699997, 40.82973887399988], [-73.93924885699987, 40.82829635099989]]]}}, {\&quot;id\&quot;: \&quot;116\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2567155021697498, \&quot;OBJECTID\&quot;: 117, \&quot;Shape_Leng\&quot;: 0.169885857987, \&quot;Shape_Area\&quot;: 0.00090429427072, \&quot;zone\&quot;: \&quot;Hammels/Arverne\&quot;, \&quot;LocationID\&quot;: 117, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7763584369479, 40.609655838242304], [-73.77412897394224, 40.60874659586809], [-73.77460294599074, 40.607417648882524], [-73.77484886546486, 40.60802483315967], [-73.77523851986173, 40.60855094300021], [-73.77600772152827, 40.60919075424813], [-73.77469363854065, 40.60430696481727], [-73.7818572569845, 40.59837293018506], [-73.78005493695551, 40.596861344908895], [-73.7749751364952, 40.60174817941184], [-73.77363244061033, 40.598153123466695], [-73.76809925802587, 40.59784597005487], [-73.76771811799993, 40.596261309999925], [-73.76654204999997, 40.599434441999904], [-73.76165797299986, 40.599973069999876], [-73.7633344969999, 40.59782287399992], [-73.76277845599988, 40.59475654399989], [-73.76440183099987, 40.59457168299989], [-73.76376223423699, 40.591439709016804], [-73.81730795916116, 40.58233475897], [-73.81544517899997, 40.58337349199993], [-73.81909407399996, 40.58783196099988], [-73.8176380045051, 40.58928579948519], [-73.81170344836342, 40.59159374663789], [-73.81149423585859, 40.592901326696776], [-73.81132554567534, 40.59174649614576], [-73.81081791874632, 40.59209026869603], [-73.81138593152033, 40.592442318454566], [-73.81140751227157, 40.592871257238706], [-73.81107287021051, 40.593022330572076], [-73.80991130015991, 40.59225371768247], [-73.80959170493088, 40.593580688618054], [-73.80577902839048, 40.59075949966858], [-73.8058134261234, 40.59186886150206], [-73.80430333508215, 40.59131887880457], [-73.8079775709933, 40.59415786866439], [-73.80604149807385, 40.595554555213546], [-73.8024384629031, 40.59264006383509], [-73.80234513845657, 40.59449597525689], [-73.80344017041448, 40.59443420917679], [-73.80321494251235, 40.59514564845063], [-73.80389507006726, 40.594990875367245], [-73.80331453729063, 40.59517956193947], [-73.80368468695728, 40.59519779018381], [-73.80486462646938, 40.5967336283515], [-73.80513406252756, 40.59660758897049], [-73.80524832538248, 40.596895032613546], [-73.80297943325748, 40.598844304553005], [-73.79233256449508, 40.59995439142583], [-73.78635332811808, 40.60319465903842], [-73.79034006550985, 40.59919167636005], [-73.79102536652763, 40.595527157215926], [-73.78973901889819, 40.59474366855456], [-73.7890682912148, 40.598019927382616], [-73.78350560905308, 40.60256343874268], [-73.78366696292244, 40.60532443693426], [-73.77927015444938, 40.60930736180752], [-73.7763584369479, 40.609655838242304]]]}}, {\&quot;id\&quot;: \&quot;117\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.3010802469135802, \&quot;OBJECTID\&quot;: 118, \&quot;Shape_Leng\&quot;: 0.243966217692, \&quot;Shape_Area\&quot;: 0.00182693922711, \&quot;zone\&quot;: \&quot;Heartland Village/Todt Hill\&quot;, \&quot;LocationID\&quot;: 118, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.10834417899996, 40.610234766999945], [-74.09555829799993, 40.61062477799989], [-74.09045495899996, 40.60909452599991], [-74.09271908099993, 40.60636222199992], [-74.09192827899989, 40.598504050999914], [-74.10041498999992, 40.59334309299988], [-74.10149482299994, 40.58934426099992], [-74.10790851599995, 40.58368563799992], [-74.1212571389999, 40.575254893999904], [-74.12708814699995, 40.57636910599994], [-74.13261022999991, 40.573530162999894], [-74.14418588199999, 40.57203740999988], [-74.14438744999991, 40.56970610099991], [-74.14789716899996, 40.57088728599995], [-74.15725974199995, 40.562553318999896], [-74.1649414939999, 40.56011179699991], [-74.16982582400001, 40.56109042099991], [-74.16842916199994, 40.58649792299988], [-74.16189940599996, 40.59529877099993], [-74.1481980769999, 40.588599680999934], [-74.13864458599996, 40.58906080499989], [-74.13091909399999, 40.598855047999905], [-74.12506115499997, 40.59818005599987], [-74.12059546299996, 40.601809757999874], [-74.11487058399989, 40.602136659999935], [-74.11742466500002, 40.609289008999916], [-74.12135179599994, 40.609765267999926], [-74.11508745399988, 40.61120943099993], [-74.10834417899996, 40.610234766999945]]]}}, {\&quot;id\&quot;: \&quot;118\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.234484146595079, \&quot;OBJECTID\&quot;: 119, \&quot;Shape_Leng\&quot;: 0.0835070355744, \&quot;Shape_Area\&quot;: 0.000185779447534, \&quot;zone\&quot;: \&quot;Highbridge\&quot;, \&quot;LocationID\&quot;: 119, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9247831879999, 40.84475266499989], [-73.91729224999992, 40.84510993999991], [-73.91794965199988, 40.842229570999976], [-73.91618344399991, 40.84233489999991], [-73.92802724899998, 40.82971953899987], [-73.93307251084072, 40.828156152518105], [-73.93314306709256, 40.83519412761651], [-73.92861574822331, 40.844676865029925], [-73.9247831879999, 40.84475266499989]]]}}, {\&quot;id\&quot;: \&quot;119\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2355613175632274, \&quot;OBJECTID\&quot;: 120, \&quot;Shape_Leng\&quot;: 0.0832612702158, \&quot;Shape_Area\&quot;: 9.31462821313e-05, \&quot;zone\&quot;: \&quot;Highbridge Park\&quot;, \&quot;LocationID\&quot;: 120, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92295449499989, 40.85885076199988], [-73.92227873064479, 40.85565498884376], [-73.93436121591056, 40.83620061961779], [-73.94034643299983, 40.8304578419999], [-73.93505508799984, 40.8393332359999], [-73.93556697199989, 40.841712527999924], [-73.92707982300001, 40.851432342999885], [-73.92466977999999, 40.856982610999886], [-73.92709951599986, 40.85827552099992], [-73.92499818399988, 40.86146373799991], [-73.92295449499989, 40.85885076199988]]]}}, {\&quot;id\&quot;: \&quot;120\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2291746213170489, \&quot;OBJECTID\&quot;: 121, \&quot;Shape_Leng\&quot;: 0.0969153373445, \&quot;Shape_Area\&quot;: 0.000384563286473, \&quot;zone\&quot;: \&quot;Hillcrest/Pomonok\&quot;, \&quot;LocationID\&quot;: 121, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79911195699995, 40.738206139999875], [-73.79584803299987, 40.7380746799999], [-73.79037661699995, 40.720103723999934], [-73.80780927699995, 40.715853895999906], [-73.80904032699983, 40.71991160499987], [-73.80452680199981, 40.721462545999884], [-73.80487958299983, 40.725049592999895], [-73.80652142399995, 40.7248730639999], [-73.80717042299993, 40.72826913299987], [-73.8111179729999, 40.72781641599994], [-73.81074426599986, 40.72626511299991], [-73.81510024099985, 40.72854342299991], [-73.81504998799986, 40.73894313399992], [-73.79911195699995, 40.738206139999875]]]}}, {\&quot;id\&quot;: \&quot;121\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22058927043739104, \&quot;OBJECTID\&quot;: 122, \&quot;Shape_Leng\&quot;: 0.0665318439446, \&quot;Shape_Area\&quot;: 0.000226597104976, \&quot;zone\&quot;: \&quot;Hollis\&quot;, \&quot;LocationID\&quot;: 122, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.75725671499985, 40.71813860199992], [-73.75047058199985, 40.70563993099994], [-73.76612489399999, 40.702334485999884], [-73.76825969099993, 40.709526367999956], [-73.771724447, 40.71031681899991], [-73.76943987099992, 40.711976892999864], [-73.77192122100001, 40.71568504499992], [-73.76664095199988, 40.717646613999875], [-73.765714472, 40.71639337899988], [-73.75832728699997, 40.71958208899985], [-73.75725671499985, 40.71813860199992]]]}}, {\&quot;id\&quot;: \&quot;122\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.3048929295890292, \&quot;OBJECTID\&quot;: 123, \&quot;Shape_Leng\&quot;: 0.0834211389387, \&quot;Shape_Area\&quot;: 0.000296445173366, \&quot;zone\&quot;: \&quot;Homecrest\&quot;, \&quot;LocationID\&quot;: 123, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96285973999984, 40.61254948599989], [-73.96237947799978, 40.609986373999966], [-73.95859278499987, 40.61040303099988], [-73.95619313699986, 40.58776226899994], [-73.9603495359999, 40.58730628599994], [-73.9606798409999, 40.59159758199995], [-73.97115101799994, 40.59044244399989], [-73.97299433999983, 40.6088141419999], [-73.96429649899991, 40.60977642599992], [-73.96478112799986, 40.61233092199988], [-73.96285973999984, 40.61254948599989]]]}}, {\&quot;id\&quot;: \&quot;123\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24496189515275907, \&quot;OBJECTID\&quot;: 124, \&quot;Shape_Leng\&quot;: 0.127724410062, \&quot;Shape_Area\&quot;: 0.000754837821479, \&quot;zone\&quot;: \&quot;Howard Beach\&quot;, \&quot;LocationID\&quot;: 124, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.85096453700001, 40.671719510999885], [-73.83334819299995, 40.66677318699994], [-73.82859942399985, 40.657196972999884], [-73.82639242872236, 40.64832434880783], [-73.83133151403268, 40.65274755744263], [-73.82901417557953, 40.65610788445241], [-73.8317081441153, 40.65393117429689], [-73.83221698518575, 40.654460386292925], [-73.83149330103005, 40.65497982053967], [-73.83116100809627, 40.65591923373715], [-73.82937603410723, 40.65650633521598], [-73.82896778740296, 40.65720524792007], [-73.8291791973457, 40.65779977854427], [-73.83013028740389, 40.65840264372116], [-73.82970706838907, 40.658502513864484], [-73.82959986903019, 40.65865680691539], [-73.83014950104759, 40.6598086849573], [-73.83024427039376, 40.658349969348166], [-73.82909434825203, 40.65733421866331], [-73.83127112568108, 40.656003271494676], [-73.8318523847929, 40.65488503826691], [-73.83290309524602, 40.657483771623006], [-73.83194394578256, 40.65617142725338], [-73.832600363706, 40.65782659162732], [-73.83096907996668, 40.65823029417234], [-73.83338439472544, 40.65805185920798], [-73.83109184464118, 40.64848480675928], [-73.83561034795801, 40.64850568470053], [-73.8387360855594, 40.662454060021076], [-73.83978752612934, 40.660485998048], [-73.83592320073285, 40.645499790674954], [-73.84950699084165, 40.64413376567876], [-73.85183280737658, 40.64586005671262], [-73.85230349886227, 40.647771028550196], [-73.84939766406322, 40.65143487895031], [-73.85591932944749, 40.65130926166608], [-73.86136381950391, 40.65641475416531], [-73.85983363521494, 40.65697706322045], [-73.8596355866937, 40.65845777205655], [-73.86124943398261, 40.65872091007865], [-73.85976839588899, 40.65828193634574], [-73.86087597607579, 40.65690816207006], [-73.86317083299996, 40.65827651199994], [-73.85761052799985, 40.660108355999924], [-73.85842950899992, 40.66345335999987], [-73.85568461199988, 40.66386749199993], [-73.85763323099987, 40.67165619399989], [-73.86038937900003, 40.67126877499985], [-73.86131863599985, 40.6750212689999], [-73.85096453700001, 40.671719510999885]]], [[[-73.83032725337058, 40.65513280580328], [-73.83026601851493, 40.65542864678473], [-73.82988919856028, 40.655522822584075], [-73.82994556435834, 40.655424494353], [-73.83032725337058, 40.65513280580328]]], [[[-73.85975533686633, 40.65410417609493], [-73.86048308199986, 40.65465892799988], [-73.86098917376947, 40.65520976705256], [-73.85979242750741, 40.65447615737696], [-73.85975533686633, 40.65410417609493]]], [[[-73.85898002989568, 40.65267545791771], [-73.85975533686633, 40.65410417609493], [-73.85941022942576, 40.65386473792502], [-73.85898002989568, 40.65267545791771]]], [[[-73.85898002989568, 40.65267545791771], [-73.85731941515513, 40.65123709900783], [-73.85695870295893, 40.65058737348713], [-73.85898002989568, 40.65267545791771]]]]}}, {\&quot;id\&quot;: \&quot;124\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21255053776296673, \&quot;OBJECTID\&quot;: 125, \&quot;Shape_Leng\&quot;: 0.0497322121757, \&quot;Shape_Area\&quot;: 7.64293209892e-05, \&quot;zone\&quot;: \&quot;Hudson Sq\&quot;, \&quot;LocationID\&quot;: 125, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00269315099992, 40.72831405499989], [-74.0053098609999, 40.721824191999865], [-74.0108123829999, 40.72578980299994], [-74.0119643202455, 40.72432986461987], [-74.01165326569942, 40.725871761851344], [-74.01520426531133, 40.726361949379644], [-74.011542018976, 40.72644734692706], [-74.01067264999996, 40.72911266599987], [-74.00269315099992, 40.72831405499989]]]}}, {\&quot;id\&quot;: \&quot;125\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24660924474130255, \&quot;OBJECTID\&quot;: 126, \&quot;Shape_Leng\&quot;: 0.12994872606, \&quot;Shape_Area\&quot;: 0.0007032738273, \&quot;zone\&quot;: \&quot;Hunts Point\&quot;, \&quot;LocationID\&quot;: 126, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88615037899993, 40.82730567799994], [-73.88753429599987, 40.82250933899995], [-73.8843985489999, 40.822965575999866], [-73.88244779599998, 40.81926832299992], [-73.87056806927927, 40.81208731762241], [-73.86811219140058, 40.806751832831786], [-73.87234684998835, 40.800174763010446], [-73.87814218819929, 40.801319290306495], [-73.87843295513449, 40.80270273469493], [-73.8850517233671, 40.80213090679797], [-73.89197929534278, 40.80638470897619], [-73.89128402413917, 40.80497628189916], [-73.89509836487399, 40.80686363917353], [-73.8952796287401, 40.805766184067906], [-73.90222284749719, 40.80494811309474], [-73.90307457199998, 40.80988061199988], [-73.89542858799986, 40.81584467199988], [-73.8970446669999, 40.8168018599999], [-73.89283653100001, 40.820974054999965], [-73.8958813589999, 40.82099257499987], [-73.89586019599982, 40.82263104599987], [-73.89320004999998, 40.82400818299992], [-73.89487088500002, 40.82393727199992], [-73.89483522899992, 40.82624684099993], [-73.88615037899993, 40.82730567799994]]]}}, {\&quot;id\&quot;: \&quot;126\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20417863580813, \&quot;OBJECTID\&quot;: 127, \&quot;Shape_Leng\&quot;: 0.0600188855815, \&quot;Shape_Area\&quot;: 0.000163195647796, \&quot;zone\&quot;: \&quot;Inwood\&quot;, \&quot;LocationID\&quot;: 127, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.911224294065, 40.87302771883775], [-73.91043824727869, 40.871377478551786], [-73.91254775130287, 40.866514943004354], [-73.91589911645785, 40.86430803808506], [-73.91538673051149, 40.863084384200725], [-73.91950213660932, 40.85879113379047], [-73.92159014848224, 40.86007280002688], [-73.92035142875443, 40.858195220619145], [-73.92282845999992, 40.8568514089999], [-73.92872203199994, 40.86674266299988], [-73.92135975499993, 40.869551853999894], [-73.91845930899993, 40.873022052999936], [-73.9140098549999, 40.871160593999946], [-73.911224294065, 40.87302771883775]]], [[[-73.92151894059094, 40.85660117062315], [-73.92229611007241, 40.855663835114505], [-73.92234459387058, 40.85568233590737], [-73.92169841904696, 40.85667230185494], [-73.92151894059094, 40.85660117062315]]]]}}, {\&quot;id\&quot;: \&quot;127\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2127845499894611, \&quot;OBJECTID\&quot;: 128, \&quot;Shape_Leng\&quot;: 0.0702090290681, \&quot;Shape_Area\&quot;: 0.000207405982869, \&quot;zone\&quot;: \&quot;Inwood Hill Park\&quot;, \&quot;LocationID\&quot;: 128, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.92359742020389, 40.878898712992644], [-73.92363695289211, 40.87881535593209], [-73.92367919311681, 40.878826074498626], [-73.92362973975199, 40.87896394312155], [-73.92359742020389, 40.878898712992644]]], [[[-73.9264055692112, 40.87762147653741], [-73.92258387170895, 40.87692253928837], [-73.921169296781, 40.87306939228805], [-73.91978312944534, 40.87360369743557], [-73.92090325515422, 40.87546616638258], [-73.91855365026461, 40.873180588115396], [-73.9175772988473, 40.87454867854727], [-73.91154281116535, 40.873253706161705], [-73.9140098549999, 40.871160593999946], [-73.91845930899993, 40.873022052999936], [-73.92135975499993, 40.869551853999894], [-73.92872203199994, 40.86674266299988], [-73.93220600531866, 40.870096445104515], [-73.9264055692112, 40.87762147653741]]]]}}, {\&quot;id\&quot;: \&quot;131\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2007000051677815, \&quot;OBJECTID\&quot;: 132, \&quot;Shape_Leng\&quot;: 0.24547851707, \&quot;Shape_Area\&quot;: 0.00203830095472, \&quot;zone\&quot;: \&quot;JFK Airport\&quot;, \&quot;LocationID\&quot;: 132, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.8250346749999, 40.663580133999844], [-73.81496922499986, 40.66247266799991], [-73.80072889200001, 40.66526937699988], [-73.780755286, 40.66240660199992], [-73.7541108669999, 40.648697664999915], [-73.75522386899995, 40.64744446899989], [-73.7474246205621, 40.6413764680137], [-73.74849297657127, 40.63567172844184], [-73.7650077554797, 40.62941398784963], [-73.77077016777163, 40.62003118215498], [-73.77082069703974, 40.62328299797239], [-73.77704080084247, 40.62766646976843], [-73.77999420781757, 40.62668929803533], [-73.78419483298926, 40.6208926699551], [-73.78949653224412, 40.62274664610792], [-73.78264543417806, 40.630247968544396], [-73.79076956011139, 40.63386374895698], [-73.79222318018806, 40.63589008813999], [-73.81830607819735, 40.64638698303703], [-73.82182513624882, 40.649899795874894], [-73.82348381110747, 40.65536991271862], [-73.82227996040434, 40.659425007931176], [-73.8186953155868, 40.661105051055245], [-73.81143921922407, 40.66074562606795], [-73.81867189288894, 40.66213298725428], [-73.82338324351308, 40.6602057470252], [-73.82498070378553, 40.65543197118367], [-73.82290717700891, 40.64809344600474], [-73.82614483059669, 40.65008184094253], [-73.82639242822242, 40.64832434880782], [-73.82859942399985, 40.657196972999884], [-73.832705339, 40.665405772999854], [-73.8250346749999, 40.663580133999844]]], [[[-73.74661040472857, 40.638724973885545], [-73.74653979797041, 40.63871136266965], [-73.74654132522075, 40.63869678799164], [-73.74664302817305, 40.638662249807076], [-73.74661040472857, 40.638724973885545]]], [[[-73.74693721618013, 40.63755610186007], [-73.74694320619099, 40.637529202088494], [-73.74704913170525, 40.63754513439954], [-73.74704316342154, 40.637566426459216], [-73.74693721618013, 40.63755610186007]]], [[[-73.74712154262465, 40.63716227570799], [-73.74706485671244, 40.637160999268374], [-73.74699391228548, 40.63715064484292], [-73.74715781614569, 40.637060524028364], [-73.74712154262465, 40.63716227570799]]]]}}, {\&quot;id\&quot;: \&quot;128\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21345779820790622, \&quot;OBJECTID\&quot;: 129, \&quot;Shape_Leng\&quot;: 0.0932727273403, \&quot;Shape_Area\&quot;: 0.00047398833179, \&quot;zone\&quot;: \&quot;Jackson Heights\&quot;, \&quot;LocationID\&quot;: 129, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87586503899996, 40.76605165399989], [-73.87513874300004, 40.756633815999905], [-73.87365721799983, 40.756803485999946], [-73.86942458599987, 40.74915685199991], [-73.89175048799984, 40.74681172799989], [-73.89624245599988, 40.74871954499987], [-73.89984592699983, 40.75756215299985], [-73.89437624799997, 40.7655265849999], [-73.87608949699984, 40.77153690299987], [-73.87586503899996, 40.76605165399989]]]}}, {\&quot;id\&quot;: \&quot;129\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21380360285717254, \&quot;OBJECTID\&quot;: 130, \&quot;Shape_Leng\&quot;: 0.142028320665, \&quot;Shape_Area\&quot;: 0.000468322514327, \&quot;zone\&quot;: \&quot;Jamaica\&quot;, \&quot;LocationID\&quot;: 130, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76962552399995, 40.71178631999993], [-73.771724447, 40.71031681899991], [-73.76844546499984, 40.709637026999886], [-73.77555451099995, 40.70607083499987], [-73.77230768699997, 40.70057150699989], [-73.77395659499993, 40.69980578099988], [-73.78034491200003, 40.70541241699986], [-73.78256582599995, 40.70542486399989], [-73.79239170299988, 40.7021665299999], [-73.79260506799987, 40.70043209999988], [-73.80642479399984, 40.690873857999904], [-73.80890216900004, 40.69256434899993], [-73.81063298299996, 40.69194738299988], [-73.81637824499992, 40.70245196399987], [-73.81152856899989, 40.70227287499991], [-73.81201248599983, 40.70594494499993], [-73.80694856299993, 40.70736709999989], [-73.8056477309999, 40.70467172799994], [-73.80165725599993, 40.705761474999846], [-73.80302414799988, 40.70813965699997], [-73.79870150699992, 40.71066337699988], [-73.79776810199988, 40.7091431879999], [-73.77192121999992, 40.715685043999905], [-73.76962552399995, 40.71178631999993]]]}}, {\&quot;id\&quot;: \&quot;1\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2174912891986063, \&quot;OBJECTID\&quot;: 2, \&quot;Shape_Leng\&quot;: 0.43346966679, \&quot;Shape_Area\&quot;: 0.00486634037837, \&quot;zone\&quot;: \&quot;Jamaica Bay\&quot;, \&quot;LocationID\&quot;: 2, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.82337597260663, 40.63898704717671], [-73.82107505533321, 40.62973377456623], [-73.81611483429545, 40.624604655173044], [-73.81891708039825, 40.62309026716333], [-73.81571468044605, 40.62148955151693], [-73.81777429834523, 40.61750112169565], [-73.81652681189122, 40.61494700958006], [-73.82141601599992, 40.615054762999925], [-73.8238246859766, 40.61149866495507], [-73.82575322105271, 40.614192081540075], [-73.83776702143372, 40.61552223141874], [-73.83496222645587, 40.61778030881177], [-73.83514355859735, 40.62548708279667], [-73.83342230809954, 40.626781983462095], [-73.83464377224975, 40.62742707942435], [-73.83115393179625, 40.63256052752952], [-73.83340607979225, 40.63850135589897], [-73.82591657926903, 40.63574741296666], [-73.82443032497055, 40.6362165210408], [-73.82419327293158, 40.63995327448778], [-73.82337597260663, 40.63898704717671]]], [[[-73.84721834832125, 40.63196568670605], [-73.8485899664393, 40.63013198680654], [-73.8585583634798, 40.63045828819559], [-73.8561374187591, 40.63508154601468], [-73.84667914840234, 40.63873171175714], [-73.84352007697278, 40.636503685327924], [-73.84721834832125, 40.63196568670605]]], [[[-73.79577948747226, 40.63215847659964], [-73.79811872226199, 40.6310375092611], [-73.79827615415297, 40.63125217936581], [-73.7907928429953, 40.63428204310243], [-73.79577948747226, 40.63215847659964]]], [[[-73.83623731597828, 40.631110861231726], [-73.84110205447426, 40.62455643651514], [-73.84445711462239, 40.62984779443998], [-73.83765174362401, 40.63283973295598], [-73.83623731597828, 40.631110861231726]]], [[[-73.81307233892618, 40.62926109964263], [-73.81352502122876, 40.62730617268596], [-73.81258556038132, 40.628371916183724], [-73.81129432207656, 40.624703779000406], [-73.81089990481607, 40.61621847134095], [-73.81679073502552, 40.62634891812118], [-73.81382899493154, 40.62613507764411], [-73.81627026043981, 40.62714580591711], [-73.8173057692762, 40.63062197379782], [-73.81506788441455, 40.63116405857793], [-73.81307233892618, 40.62926109964263]]], [[[-73.84734350666976, 40.62909473971626], [-73.84984630167418, 40.62622449074592], [-73.8472783772798, 40.626621669791945], [-73.84358010755503, 40.623178164184395], [-73.86364988794934, 40.617878773642374], [-73.86404106276488, 40.61920759671402], [-73.86151825485233, 40.619049218399226], [-73.86102883383386, 40.624138986994076], [-73.86347880947007, 40.6233886093158], [-73.86334955670225, 40.62592490877777], [-73.86041082270874, 40.62516691297755], [-73.8565055097758, 40.629097353726586], [-73.8539654419115, 40.62761094389788], [-73.85436931062769, 40.62881767654389], [-73.84734350666976, 40.62909473971626]]], [[[-73.87084603194215, 40.61696742645758], [-73.8782477932424, 40.615444608331536], [-73.87481386865049, 40.62358718918363], [-73.86684384142526, 40.62782924286026], [-73.86498193495926, 40.625660706041025], [-73.86626127665735, 40.618456348023955], [-73.87084603194215, 40.61696742645758]]], [[[-73.79783533398513, 40.627408716571516], [-73.79566256726108, 40.626114004327796], [-73.79921493427759, 40.6240847129885], [-73.7936292748135, 40.62515647619494], [-73.79809093107174, 40.62306294824432], [-73.79992057632684, 40.61857524016598], [-73.80172498640165, 40.61996700873167], [-73.80128049504093, 40.615879839747535], [-73.80270343867807, 40.61358065232171], [-73.80508906012292, 40.61343256041943], [-73.80476592616557, 40.61580099137086], [-73.80764116896117, 40.62119965469225], [-73.80698502381061, 40.623871998829976], [-73.8001117714566, 40.626927441987085], [-73.80092841565032, 40.627524104895656], [-73.79783533398513, 40.627408716571516]]], [[[-73.77348616522504, 40.625085118163526], [-73.77381024409397, 40.624925596730954], [-73.77383258726536, 40.624944848253456], [-73.77348560409436, 40.62511314810922], [-73.77348616522504, 40.625085118163526]]], [[[-73.77172760292548, 40.62358502801516], [-73.7720313143135, 40.62299121290296], [-73.77218824028017, 40.622995793795134], [-73.77511891254433, 40.619233847487365], [-73.77518045935567, 40.61926471788484], [-73.77172760292548, 40.62358502801516]]], [[[-73.79162058913477, 40.62231334348308], [-73.78419483298926, 40.6208926699551], [-73.78446087067887, 40.617027835129704], [-73.78070887195283, 40.614026809005864], [-73.79139721011913, 40.60761085524994], [-73.79480633875043, 40.61037836048121], [-73.80080125919478, 40.611933904481596], [-73.7946062540462, 40.62257170055433], [-73.79162058913477, 40.62231334348308]]], [[[-73.76670827781236, 40.61491086618553], [-73.76825288003378, 40.614877725169315], [-73.77397692018825, 40.61600357567147], [-73.76873454755717, 40.62090086822023], [-73.76745926975256, 40.620511322031255], [-73.76670827781236, 40.61491086618553]]], [[[-73.84304421296773, 40.617737696390435], [-73.84454193473684, 40.614867921675135], [-73.8409994253963, 40.613029126216134], [-73.83825667290532, 40.613847216216406], [-73.8407944240835, 40.60564326638265], [-73.8471480968766, 40.60361424219198], [-73.85179402215192, 40.60689716858368], [-73.84779013405834, 40.60923538526278], [-73.84614804513843, 40.61772842036632], [-73.84304421296773, 40.617737696390435]]], [[[-73.85523067631884, 40.61613145335797], [-73.85530325465119, 40.6131454135728], [-73.84973986306498, 40.61515605814331], [-73.85010857555366, 40.61021219334599], [-73.8551559228834, 40.606120513001486], [-73.85708638173246, 40.60646824293355], [-73.85924855452187, 40.61125483087423], [-73.85648360749232, 40.61319069486381], [-73.85858056782772, 40.61691708722184], [-73.85523067631884, 40.61613145335797]]], [[[-73.814090115668, 40.614466920099765], [-73.81503638494628, 40.6129762137494], [-73.81615626666235, 40.61294211575494], [-73.8164315038978, 40.614282334964926], [-73.814090115668, 40.614466920099765]]], [[[-73.81496830662114, 40.61042065495561], [-73.81520720849484, 40.60981673379666], [-73.81559858789666, 40.61067251616471], [-73.81450261566708, 40.61105847350542], [-73.81496830662114, 40.61042065495561]]], [[[-73.86966442958492, 40.606540123412906], [-73.87109330768071, 40.604694173994694], [-73.87300122724774, 40.61055545845987], [-73.8710387011171, 40.60972358252655], [-73.86966442958492, 40.606540123412906]]], [[[-73.79420172624032, 40.607730675613354], [-73.79352152715475, 40.60632759139594], [-73.79509002319158, 40.607271060105596], [-73.79424799033224, 40.60590038003164], [-73.79696327795033, 40.60411784876779], [-73.80428530678597, 40.604519279530564], [-73.80520676583323, 40.60673953810017], [-73.80159206744115, 40.61023096250127], [-73.79420172624032, 40.607730675613354]]], [[[-73.83244207358176, 40.605929449536745], [-73.83587601623029, 40.605636907545566], [-73.83610156628845, 40.60736279382329], [-73.83252192275347, 40.610384993603816], [-73.83032947905777, 40.60848787991649], [-73.83045815392722, 40.606669201403214], [-73.83244207358176, 40.605929449536745]]], [[[-73.82607472604538, 40.60843779954612], [-73.82771104235977, 40.608398668130704], [-73.82805077260065, 40.61004629686527], [-73.82688326414805, 40.6095966780694], [-73.82607472604538, 40.60843779954612]]], [[[-73.86702399475149, 40.60806817876942], [-73.86874317559169, 40.60703517927931], [-73.86868468826752, 40.608241158183915], [-73.86702399475149, 40.60806817876942]]], [[[-73.82718282107048, 40.607919778091194], [-73.82590092720767, 40.60646593064943], [-73.82861671457653, 40.60583848413761], [-73.82815085191197, 40.60795028983291], [-73.82718282107048, 40.607919778091194]]], [[[-73.81569926225602, 40.6064570673649], [-73.81546066483351, 40.60642813700742], [-73.81552816722274, 40.606163069945154], [-73.81552536723665, 40.60640738028192], [-73.81569926225602, 40.6064570673649]]], [[[-73.81339665223344, 40.60436407224534], [-73.80986333857152, 40.60189579000784], [-73.81157550345523, 40.59814119925956], [-73.81501471568424, 40.60205629156354], [-73.81339665223344, 40.60436407224534]]], [[[-73.86702905185578, 40.603743388853935], [-73.8676819415421, 40.603070766677334], [-73.8683080846461, 40.603139161146146], [-73.86793505372694, 40.60396113545295], [-73.86702905185578, 40.603743388853935]]], [[[-73.85243335807012, 40.59733339779527], [-73.86044420534076, 40.596471905596275], [-73.86335999147606, 40.600322202771196], [-73.86112814224546, 40.60255033107426], [-73.85482595782968, 40.601867195353634], [-73.85076748001559, 40.598839443837406], [-73.85243335807012, 40.59733339779527]]], [[[-73.87019491489939, 40.598996405901886], [-73.87108141811476, 40.598901147470094], [-73.87049411914771, 40.602604446204595], [-73.87026280564918, 40.60168122225861], [-73.87019491489939, 40.598996405901886]]], [[[-73.8231174097477, 40.60007949252535], [-73.82315293179705, 40.599976662824794], [-73.82317356168161, 40.59997800515576], [-73.82318015964296, 40.60008384902813], [-73.8231174097477, 40.60007949252535]]], [[[-73.82292757811203, 40.60006142816309], [-73.822978576463, 40.600043707224835], [-73.82303195183424, 40.59993051694214], [-73.82304007849375, 40.60006807478574], [-73.82292757811203, 40.60006142816309]]], [[[-73.82445629476595, 40.59911583868227], [-73.82395871079126, 40.59887689683851], [-73.82477088992478, 40.5983918438742], [-73.82453084258555, 40.59911949829181], [-73.82445629476595, 40.59911583868227]]], [[[-73.86952707548932, 40.598713750354406], [-73.86967070711478, 40.59668856362211], [-73.87020899836229, 40.59695423278937], [-73.86952707548932, 40.598713750354406]]], [[[-73.83668274106707, 40.5949466970158], [-73.8325749810638, 40.592118209113956], [-73.83422777067327, 40.59137381382269], [-73.83253569485043, 40.59021893579835], [-73.83495422767699, 40.589728155618005], [-73.83347866645357, 40.589368748710896], [-73.83719541135855, 40.58969911736292], [-73.8398907019092, 40.59280021149386], [-73.84385894083933, 40.59342531196059], [-73.83902964248091, 40.59625348474866], [-73.83668274106707, 40.5949466970158]]], [[[-73.86706149472118, 40.5820879767934], [-73.87000313642912, 40.582636614815954], [-73.87115922675414, 40.5868738879673], [-73.86635052164085, 40.591892676564676], [-73.86327273492819, 40.59090807569255], [-73.86125299377363, 40.58798808592123], [-73.86327471071942, 40.58387684853184], [-73.86706149472118, 40.5820879767934]]]]}}, {\&quot;id\&quot;: \&quot;130\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23815582345541045, \&quot;OBJECTID\&quot;: 131, \&quot;Shape_Leng\&quot;: 0.116547120922, \&quot;Shape_Area\&quot;: 0.000423696152789, \&quot;zone\&quot;: \&quot;Jamaica Estates\&quot;, \&quot;LocationID\&quot;: 131, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.77732562899998, 40.722392700999926], [-73.76924074899993, 40.72590270099988], [-73.75669771299987, 40.7262287109999], [-73.7523343839998, 40.72026246099993], [-73.79303800099989, 40.71071107499988], [-73.79358570299998, 40.714128677999874], [-73.790302674, 40.7208914649999], [-73.79174472699992, 40.725788849999944], [-73.77757506899988, 40.73019327299987], [-73.7752338719998, 40.725237532999884], [-73.77803765999981, 40.723284268999855], [-73.77732562899998, 40.722392700999926]]]}}, {\&quot;id\&quot;: \&quot;132\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21164169685230344, \&quot;OBJECTID\&quot;: 133, \&quot;Shape_Leng\&quot;: 0.065134863162, \&quot;Shape_Area\&quot;: 0.000157188987507, \&quot;zone\&quot;: \&quot;Kensington\&quot;, \&quot;LocationID\&quot;: 133, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97819074399992, 40.64752599199992], [-73.97777380600002, 40.645341876999964], [-73.974642245, 40.644813218999914], [-73.97084113799984, 40.64637857099989], [-73.96803868499985, 40.636650984999925], [-73.97029036199991, 40.63640634099988], [-73.96986869299992, 40.63419467499989], [-73.97604935699995, 40.63127590599986], [-73.9768886119999, 40.6356748619999], [-73.97911188699993, 40.63544038599991], [-73.98042057899988, 40.64238522699991], [-73.98299419199994, 40.64132499699987], [-73.98834986699991, 40.64456224399992], [-73.97819074399992, 40.64752599199992]]]}}, {\&quot;id\&quot;: \&quot;133\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.227634622322135, \&quot;OBJECTID\&quot;: 134, \&quot;Shape_Leng\&quot;: 0.0695878223284, \&quot;Shape_Area\&quot;: 0.000202375182143, \&quot;zone\&quot;: \&quot;Kew Gardens\&quot;, \&quot;LocationID\&quot;: 134, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82288529599995, 40.71192805799993], [-73.81637824499992, 40.70245196399987], [-73.82245890399994, 40.70365553099989], [-73.83152109599999, 40.70138962899994], [-73.83460244999996, 40.70392746699988], [-73.83661882199989, 40.70342001799988], [-73.83809584699989, 40.70616458099993], [-73.83714702999997, 40.70795704599989], [-73.84314625299982, 40.70922345599992], [-73.82591945199992, 40.71598987599992], [-73.82288529599995, 40.71192805799993]]]}}, {\&quot;id\&quot;: \&quot;134\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2281682886463108, \&quot;OBJECTID\&quot;: 135, \&quot;Shape_Leng\&quot;: 0.121793045659, \&quot;Shape_Area\&quot;: 0.000467912240542, \&quot;zone\&quot;: \&quot;Kew Gardens Hills\&quot;, \&quot;LocationID\&quot;: 135, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83126834299986, 40.74026227599991], [-73.8294675199999, 40.73702448299991], [-73.8243501109999, 40.73975360599992], [-73.81497208299996, 40.738560715999874], [-73.81510024099985, 40.72854342299991], [-73.81074426599986, 40.72626511299991], [-73.8111179729999, 40.72781641599994], [-73.80717042299993, 40.72826913299987], [-73.80652142399995, 40.7248730639999], [-73.80487958299983, 40.725049592999895], [-73.80452680199981, 40.721462545999884], [-73.80904032699983, 40.71991160499987], [-73.80780927699995, 40.715853895999906], [-73.82018883899984, 40.71673522399984], [-73.81732944799997, 40.717660456999916], [-73.82531644999993, 40.71727569999994], [-73.8273090039999, 40.72464607699988], [-73.83073214599987, 40.72654932799991], [-73.83635625099998, 40.73500859199989], [-73.83564585599999, 40.738491010999894], [-73.83699037399995, 40.74209330099992], [-73.83586131899989, 40.743227984999926], [-73.83113122799989, 40.74233799999994], [-73.83126834299986, 40.74026227599991]]]}}, {\&quot;id\&quot;: \&quot;135\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.25770158357179074, \&quot;OBJECTID\&quot;: 136, \&quot;Shape_Leng\&quot;: 0.0906287154122, \&quot;Shape_Area\&quot;: 0.000148524994129, \&quot;zone\&quot;: \&quot;Kingsbridge Heights\&quot;, \&quot;LocationID\&quot;: 136, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89996501599988, 40.86801852399986], [-73.89891854299988, 40.86965857399992], [-73.89656060599998, 40.868565199999935], [-73.90486847199993, 40.8586932249999], [-73.90777320599983, 40.85960753799984], [-73.90976165899988, 40.857182611999896], [-73.91328437100006, 40.859618600999916], [-73.90908822499988, 40.8623996959999], [-73.91422823999919, 40.862490790359615], [-73.91044282747865, 40.866527868551835], [-73.90746489699994, 40.87354735399985], [-73.90452070499992, 40.87249521099988], [-73.90318667499999, 40.86914899099988], [-73.89996501599988, 40.86801852399986]]]}}, {\&quot;id\&quot;: \&quot;136\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20523623109779018, \&quot;OBJECTID\&quot;: 137, \&quot;Shape_Leng\&quot;: 0.0461076242707, \&quot;Shape_Area\&quot;: 0.000116455098947, \&quot;zone\&quot;: \&quot;Kips Bay\&quot;, \&quot;LocationID\&quot;: 137, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97219641647804, 40.74040257875022], [-73.97248994174741, 40.73580328010761], [-73.97446647047282, 40.736278456829886], [-73.9735447289197, 40.73494432655072], [-73.98266497499989, 40.73949733299987], [-73.97812378199983, 40.745727172999885], [-73.97167921200406, 40.74305446402989], [-73.97219641647804, 40.74040257875022]]]}}, {\&quot;id\&quot;: \&quot;137\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22660132406930011, \&quot;OBJECTID\&quot;: 138, \&quot;Shape_Leng\&quot;: 0.107466933508, \&quot;Shape_Area\&quot;: 0.000536797294367, \&quot;zone\&quot;: \&quot;LaGuardia Airport\&quot;, \&quot;LocationID\&quot;: 138, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.8712485624251, 40.78603815125499], [-73.86918113468879, 40.78594348978492], [-73.86847981674143, 40.78369082919537], [-73.87255732673727, 40.78082112154256], [-73.85505106271819, 40.772195389989086], [-73.8582051105021, 40.77032345647716], [-73.85624565746174, 40.768885714198944], [-73.86268864176631, 40.76687591050486], [-73.86043337809801, 40.76386888243776], [-73.86728193799998, 40.76965000299989], [-73.87223577699984, 40.77169565899993], [-73.87743339799992, 40.77120025499991], [-73.88770661799987, 40.76683859799995], [-73.88945486901865, 40.77353295106357], [-73.88391627963797, 40.774132606591536], [-73.88493466381185, 40.77993691280691], [-73.87870562518874, 40.78058590995002], [-73.878858374856, 40.78239817868118], [-73.87974777853563, 40.782836564207], [-73.8797016367226, 40.78288281807235], [-73.8751575489337, 40.781509449653285], [-73.8712485624251, 40.78603815125499]]], [[[-73.8728719590193, 40.785975027902346], [-73.87282839783694, 40.78595446173833], [-73.8727740594054, 40.78594192145881], [-73.87280920016116, 40.78590310909999], [-73.8728719590193, 40.785975027902346]]], [[[-73.89008921683674, 40.77362643576237], [-73.89034195999996, 40.77323760499998], [-73.89183244902246, 40.77488019994431], [-73.89017369508576, 40.77785081277782], [-73.89008921683674, 40.77362643576237]]]]}}, {\&quot;id\&quot;: \&quot;138\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22943852755661254, \&quot;OBJECTID\&quot;: 139, \&quot;Shape_Leng\&quot;: 0.0932997884483, \&quot;Shape_Area\&quot;: 0.000446669880154, \&quot;zone\&quot;: \&quot;Laurelton\&quot;, \&quot;LocationID\&quot;: 139, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.74125253099989, 40.68745783899989], [-73.72718272499995, 40.68359732999987], [-73.74117817299991, 40.666402953999885], [-73.75763129599993, 40.66645115699992], [-73.75636239300002, 40.67242923699999], [-73.75857198899986, 40.67263733099987], [-73.76031463999993, 40.67510997099984], [-73.75576169199995, 40.67588590899988], [-73.747551754, 40.689347336999944], [-73.74125253099989, 40.68745783899989]]]}}, {\&quot;id\&quot;: \&quot;139\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19977256954329828, \&quot;OBJECTID\&quot;: 140, \&quot;Shape_Leng\&quot;: 0.0475842911325, \&quot;Shape_Area\&quot;: 0.000114203907779, \&quot;zone\&quot;: \&quot;Lenox Hill East\&quot;, \&quot;LocationID\&quot;: 140, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95854329689507, 40.758495622967885], [-73.96196573699997, 40.759619460999865], [-73.95268514999995, 40.772339404999926], [-73.9474897547817, 40.77011515400953], [-73.95854329689507, 40.758495622967885]]]}}, {\&quot;id\&quot;: \&quot;140\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.204524443078156, \&quot;OBJECTID\&quot;: 141, \&quot;Shape_Leng\&quot;: 0.0415144638712, \&quot;Shape_Area\&quot;: 7.66545579019e-05, \&quot;zone\&quot;: \&quot;Lenox Hill West\&quot;, \&quot;LocationID\&quot;: 141, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96177668399997, 40.75987971599993], [-73.9665833839999, 40.76155093499988], [-73.95729409999986, 40.7742835549999], [-73.95268514999995, 40.772339404999926], [-73.96177668399997, 40.75987971599993]]]}}, {\&quot;id\&quot;: \&quot;141\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2107594949183379, \&quot;OBJECTID\&quot;: 142, \&quot;Shape_Leng\&quot;: 0.0381758942321, \&quot;Shape_Area\&quot;: 7.56537920738e-05, \&quot;zone\&quot;: \&quot;Lincoln Square East\&quot;, \&quot;LocationID\&quot;: 142, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98147898799989, 40.7677250589999], [-73.98806289599996, 40.769790799999925], [-73.980673654, 40.77992518199991], [-73.97499744000007, 40.77753254599988], [-73.98147898799989, 40.7677250589999]]]}}, {\&quot;id\&quot;: \&quot;142\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20312332917308562, \&quot;OBJECTID\&quot;: 143, \&quot;Shape_Leng\&quot;: 0.0541798538849, \&quot;Shape_Area\&quot;: 0.00015109426901, \&quot;zone\&quot;: \&quot;Lincoln Square West\&quot;, \&quot;LocationID\&quot;: 143, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.981627874, 40.780328934999936], [-73.980673654, 40.77992518199991], [-73.98806289599996, 40.769790799999925], [-73.99624065194922, 40.77378979119886], [-73.99393587681126, 40.773179512586104], [-73.98886861739992, 40.779692922911416], [-73.9915510592274, 40.779574821437386], [-73.98812746184332, 40.78140179672363], [-73.981627874, 40.780328934999936]]]}}, {\&quot;id\&quot;: \&quot;143\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20642499987740578, \&quot;OBJECTID\&quot;: 144, \&quot;Shape_Leng\&quot;: 0.0276201668505, \&quot;Shape_Area\&quot;: 4.74789670369e-05, \&quot;zone\&quot;: \&quot;Little Italy/NoLiTa\&quot;, \&quot;LocationID\&quot;: 144, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99580912300002, 40.71664465899988], [-74.00188406299992, 40.71939757099991], [-73.9967717579999, 40.7254319439999], [-73.99260322299989, 40.724136449999925], [-73.99580912300002, 40.71664465899988]]]}}, {\&quot;id\&quot;: \&quot;144\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21807667611524306, \&quot;OBJECTID\&quot;: 145, \&quot;Shape_Leng\&quot;: 0.114313844981, \&quot;Shape_Area\&quot;: 0.000346641733797, \&quot;zone\&quot;: \&quot;Long Island City/Hunters Point\&quot;, \&quot;LocationID\&quot;: 145, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94345411699997, 40.75205360799992], [-73.93663681899982, 40.748204093999895], [-73.94419561599983, 40.742882145999914], [-73.93726110699994, 40.745176490999896], [-73.9386966449998, 40.73814081699989], [-73.94140886345744, 40.73929957085316], [-73.93866991753185, 40.74253408202486], [-73.9400192297566, 40.74320827221074], [-73.94159470030033, 40.73986412616895], [-73.94548236590111, 40.738207031293705], [-73.95380883920839, 40.73982029297784], [-73.96256114655104, 40.73868995735329], [-73.95978468552276, 40.74349771658391], [-73.96064863700711, 40.74413031761407], [-73.9587753700448, 40.74455559986341], [-73.95965229755977, 40.745216588173435], [-73.95849389303115, 40.74498786491623], [-73.9567945329049, 40.748839516955584], [-73.95318382492853, 40.74773481196097], [-73.9564856879466, 40.74911169015581], [-73.95080763809156, 40.75526368005708], [-73.94345411699997, 40.75205360799992]]]}}, {\&quot;id\&quot;: \&quot;145\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20850320456341914, \&quot;OBJECTID\&quot;: 146, \&quot;Shape_Leng\&quot;: 0.0471405215717, \&quot;Shape_Area\&quot;: 0.000104638923425, \&quot;zone\&quot;: \&quot;Long Island City/Queens Plaza\&quot;, \&quot;LocationID\&quot;: 146, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93675697199996, 40.74914697199991], [-73.944052652, 40.75231325999992], [-73.93679091699993, 40.75988288099991], [-73.92415699999985, 40.753961141999845], [-73.92562743799989, 40.752137243999904], [-73.93383269399993, 40.7516047019999], [-73.93675697199996, 40.74914697199991]]]}}, {\&quot;id\&quot;: \&quot;146\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.3140665848583471, \&quot;OBJECTID\&quot;: 147, \&quot;Shape_Leng\&quot;: 0.0587654949268, \&quot;Shape_Area\&quot;: 0.000106418172757, \&quot;zone\&quot;: \&quot;Longwood\&quot;, \&quot;LocationID\&quot;: 147, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89515277899991, 40.82783428999991], [-73.89487088500002, 40.82393727199992], [-73.89320004999998, 40.82400818299992], [-73.89586019599982, 40.82263104599987], [-73.8958813589999, 40.82099257499987], [-73.89290156199988, 40.82081122299989], [-73.8970446669999, 40.8168018599999], [-73.89542858799986, 40.81584467199988], [-73.90307457199998, 40.80988061199988], [-73.9044655149999, 40.81228195999994], [-73.9006114109999, 40.822108807999875], [-73.90198758599993, 40.82244042299992], [-73.90093510699997, 40.82792810199992], [-73.89515277899991, 40.82783428999991]]]}}, {\&quot;id\&quot;: \&quot;147\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20466813701268594, \&quot;OBJECTID\&quot;: 148, \&quot;Shape_Leng\&quot;: 0.0391305015633, \&quot;Shape_Area\&quot;: 6.97489921327e-05, \&quot;zone\&quot;: \&quot;Lower East Side\&quot;, \&quot;LocationID\&quot;: 148, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98447731699999, 40.72023423899987], [-73.98675136699994, 40.71959284599997], [-73.99022012699989, 40.71440493999988], [-73.99750445299988, 40.71406913199995], [-73.99260322199994, 40.72413644999987], [-73.98382387299982, 40.72147287199987], [-73.98447731699999, 40.72023423899987]]]}}, {\&quot;id\&quot;: \&quot;148\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24634533488192023, \&quot;OBJECTID\&quot;: 149, \&quot;Shape_Leng\&quot;: 0.0836805821837, \&quot;Shape_Area\&quot;: 0.000270639618955, \&quot;zone\&quot;: \&quot;Madison\&quot;, \&quot;LocationID\&quot;: 149, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94405560899996, 40.61199284199993], [-73.94231175899985, 40.60826819699985], [-73.93934703399997, 40.610187140999884], [-73.93753749399987, 40.60855738999986], [-73.93972613899992, 40.60713291499995], [-73.93447158899997, 40.60123151199989], [-73.94288954099984, 40.600318649999934], [-73.94248473299992, 40.598200364999855], [-73.956927197, 40.596612075999865], [-73.95859278499987, 40.61040303099988], [-73.94978380499997, 40.611371749999854], [-73.95026514899993, 40.61392435199983], [-73.9448277099998, 40.61604620899986], [-73.94405560899996, 40.61199284199993]]]}}, {\&quot;id\&quot;: \&quot;149\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.26958079894788756, \&quot;OBJECTID\&quot;: 150, \&quot;Shape_Leng\&quot;: 0.089331491183, \&quot;Shape_Area\&quot;: 0.000332568036088, \&quot;zone\&quot;: \&quot;Manhattan Beach\&quot;, \&quot;LocationID\&quot;: 150, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9301907789999, 40.58508559299986], [-73.9319281118675, 40.58286976893519], [-73.95349322048675, 40.58298819826098], [-73.94274062592493, 40.58099558955925], [-73.93258006568031, 40.58126474120341], [-73.93106028107997, 40.57626592009687], [-73.9523584672133, 40.574274685845204], [-73.95414287899986, 40.58310613999989], [-73.95900739999992, 40.58283812799991], [-73.96025825899996, 40.58502930799994], [-73.9344471859999, 40.586652074999925], [-73.9301907789999, 40.58508559299986]]]}}, {\&quot;id\&quot;: \&quot;150\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2055035885179721, \&quot;OBJECTID\&quot;: 151, \&quot;Shape_Leng\&quot;: 0.0548899410999, \&quot;Shape_Area\&quot;: 0.000128848901918, \&quot;zone\&quot;: \&quot;Manhattan Valley\&quot;, \&quot;LocationID\&quot;: 151, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96371096499993, 40.7930129339999], [-73.97639951915279, 40.79827321034625], [-73.97287179090726, 40.8033561875739], [-73.96004456499999, 40.79804123499991], [-73.96371096499993, 40.7930129339999]]]}}, {\&quot;id\&quot;: \&quot;151\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2016859069361659, \&quot;OBJECTID\&quot;: 152, \&quot;Shape_Leng\&quot;: 0.0579094768782, \&quot;Shape_Area\&quot;: 0.000146637644064, \&quot;zone\&quot;: \&quot;Manhattanville\&quot;, \&quot;LocationID\&quot;: 152, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95357262899982, 40.82197589199988], [-73.94607828700005, 40.821263215999906], [-73.95210125199992, 40.811442853999935], [-73.96203105797969, 40.81808633074085], [-73.95881892233997, 40.82151852484672], [-73.9596033246027, 40.82299468678336], [-73.95793904909117, 40.82277435354731], [-73.9595089796959, 40.82359578895142], [-73.95357262899982, 40.82197589199988]]]}}, {\&quot;id\&quot;: \&quot;152\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2886802831030572, \&quot;OBJECTID\&quot;: 153, \&quot;Shape_Leng\&quot;: 0.024737239022, \&quot;Shape_Area\&quot;: 3.24684964817e-05, \&quot;zone\&quot;: \&quot;Marble Hill\&quot;, \&quot;LocationID\&quot;: 153, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90666530999995, 40.8757156089999], [-73.90893235220783, 40.87215734798524], [-73.91578609320084, 40.87571718248032], [-73.91033193599998, 40.879038046999895], [-73.90666530999995, 40.8757156089999]]]}}, {\&quot;id\&quot;: \&quot;153\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2099080638471448, \&quot;OBJECTID\&quot;: 154, \&quot;Shape_Leng\&quot;: 0.22733157076, \&quot;Shape_Area\&quot;: 0.00178968692433, \&quot;zone\&quot;: \&quot;Marine Park/Floyd Bennett Field\&quot;, \&quot;LocationID\&quot;: 154, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.93531145199985, 40.60886003999987], [-73.92986880199989, 40.60507134099995], [-73.92624885099994, 40.60741352199989], [-73.92444144399987, 40.60579356899993], [-73.91970928699986, 40.607302162999886], [-73.91331444593793, 40.60225844819831], [-73.90903689530528, 40.60267734322018], [-73.91073123013267, 40.60202137602758], [-73.90894225138031, 40.60160704069869], [-73.8839804295303, 40.60556651972071], [-73.87671672482064, 40.584914430200875], [-73.88174676983894, 40.5791588072124], [-73.89552381007165, 40.576769818436354], [-73.89903425420563, 40.587676171745805], [-73.90426874447125, 40.58691226298856], [-73.90651874663754, 40.588025473892536], [-73.91148171990072, 40.586078718712315], [-73.91204234015626, 40.594506954288846], [-73.91513297459494, 40.59878111593029], [-73.92151689981944, 40.60192365414108], [-73.92457042932716, 40.599723602732396], [-73.92950671202776, 40.60270923350431], [-73.92927458471804, 40.60399357480484], [-73.93117476161734, 40.603850406434695], [-73.93108919528449, 40.601722258264104], [-73.91454059121104, 40.58994422917544], [-73.91819087799986, 40.58660685499996], [-73.92956858299992, 40.5968202649999], [-73.92813139699999, 40.59777792799987], [-73.93972613899992, 40.60713291499995], [-73.93531145199985, 40.60886003999987]]], [[[-73.91990064335972, 40.59960052259278], [-73.91626393108346, 40.59816113731273], [-73.91295122631982, 40.59205432996962], [-73.91524478304683, 40.59158750817847], [-73.92182277731894, 40.59733293287253], [-73.92213049353394, 40.598662596177306], [-73.91990064335972, 40.59960052259278]]], [[[-73.91513331918175, 40.58626938540072], [-73.91282142952436, 40.58589683033704], [-73.91242103069457, 40.58339278402727], [-73.91729861410717, 40.58319080174952], [-73.91191058860355, 40.58296337725262], [-73.9114996013066, 40.58181878146464], [-73.92443604094977, 40.58355820344426], [-73.93184655018902, 40.58294105529734], [-73.9320424499999, 40.5842339599999], [-73.9300961629999, 40.584502075999886], [-73.93139947599984, 40.58607989499989], [-73.92101255523748, 40.58457501880612], [-73.91513331918175, 40.58626938540072]]]]}}, {\&quot;id\&quot;: \&quot;154\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2529824332576436, \&quot;OBJECTID\&quot;: 155, \&quot;Shape_Leng\&quot;: 0.169808473032, \&quot;Shape_Area\&quot;: 0.000868261018498, \&quot;zone\&quot;: \&quot;Marine Park/Mill Basin\&quot;, \&quot;LocationID\&quot;: 155, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90464209220775, 40.62513319188153], [-73.90546206137252, 40.62577481968345], [-73.9022870793228, 40.624409853930224], [-73.90071952540437, 40.62163492049855], [-73.89644123346895, 40.621394756190135], [-73.89586112894177, 40.614518137494784], [-73.89095414564672, 40.61283404731705], [-73.89394013317667, 40.61118142665126], [-73.88971513183803, 40.611598996904085], [-73.89334621420008, 40.606743446234645], [-73.89986880363854, 40.605524640544004], [-73.90133303458649, 40.611717882905985], [-73.90249392985292, 40.611814999032276], [-73.90119253465456, 40.61056381754662], [-73.90132962659396, 40.61048104310328], [-73.90879088017641, 40.617436396721416], [-73.90797306390525, 40.615736844061175], [-73.90959740910328, 40.616392669799325], [-73.90225859966276, 40.61042277259991], [-73.90177669809985, 40.605674686555815], [-73.90524300992108, 40.60491009032442], [-73.90863959535422, 40.606658722047854], [-73.90803306097814, 40.60535860211721], [-73.9098515484547, 40.605999722177685], [-73.9083253683517, 40.60407337391859], [-73.91365119759595, 40.60398251383695], [-73.91708838503304, 40.608820854898525], [-73.91449542205973, 40.61165322366488], [-73.91428072663338, 40.61493881616294], [-73.91662804371141, 40.6134435892654], [-73.91573181927129, 40.61183084451381], [-73.91811036679019, 40.61020839405809], [-73.91813814889971, 40.607645386907706], [-73.91935398484114, 40.60804292228766], [-73.91825269092949, 40.6072293506405], [-73.91950358918922, 40.60797490397521], [-73.91794980550603, 40.60620925217101], [-73.92158429099997, 40.607639084999875], [-73.92444144399987, 40.60579356899993], [-73.92624885099994, 40.60741352199989], [-73.92986880199989, 40.60507134099995], [-73.936046277, 40.609514868999966], [-73.93753749399987, 40.60855738999986], [-73.93934703399997, 40.610187140999884], [-73.94231175899985, 40.60826819699985], [-73.94354698000001, 40.6093465549999], [-73.9448277099998, 40.61604620899986], [-73.93686699599992, 40.620253280999904], [-73.92629604599998, 40.61311679899991], [-73.92640044599996, 40.61447853499988], [-73.9205269409999, 40.61394269499987], [-73.91690302699992, 40.61627422899993], [-73.91860649599992, 40.632090414999894], [-73.90464209220775, 40.62513319188153]]]}}, {\&quot;id\&quot;: \&quot;155\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.5348244979658148, \&quot;OBJECTID\&quot;: 156, \&quot;Shape_Leng\&quot;: 0.144476890476, \&quot;Shape_Area\&quot;: 0.0010521217443, \&quot;zone\&quot;: \&quot;Mariners Harbor\&quot;, \&quot;LocationID\&quot;: 156, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.17989568340026, 40.64526879647802], [-74.1795871372141, 40.64191768346404], [-74.17918728067563, 40.64298753999647], [-74.1763578661754, 40.64232722056289], [-74.17436572943608, 40.64513625864542], [-74.17133587281808, 40.642855765052], [-74.17298798800311, 40.640489105066244], [-74.17105017239898, 40.642593819129914], [-74.1660998989604, 40.642406587001155], [-74.1658011075589, 40.64122451144941], [-74.16494139041178, 40.64220899988932], [-74.16519041758224, 40.64064230577938], [-74.16167534694229, 40.640610784766764], [-74.1622846525209, 40.63876565277233], [-74.16034819993155, 40.63844372645346], [-74.15986410465037, 40.639927823692716], [-74.1592271162294, 40.637796119756985], [-74.15900957887435, 40.63882257790974], [-74.15718782782525, 40.63795080522895], [-74.15710126690709, 40.63927771860018], [-74.15707077305574, 40.63794713564092], [-74.15482932461856, 40.63772385541876], [-74.15469263864514, 40.63919396811424], [-74.15459670163321, 40.63734334406899], [-74.15279703511403, 40.637132754852544], [-74.15124827966567, 40.63940934288591], [-74.14855815092196, 40.63743783752723], [-74.14877792005885, 40.6388762511277], [-74.14312802471521, 40.63968037306379], [-74.14752618999992, 40.62938928799988], [-74.14554071999994, 40.62783252199995], [-74.14650354399993, 40.62420010099991], [-74.15231170399994, 40.61716275599988], [-74.15379116699992, 40.612255611999906], [-74.1623545779999, 40.618335637999955], [-74.17459706299995, 40.622364010999874], [-74.1955597527974, 40.635023986316575], [-74.19462310145185, 40.637391183563665], [-74.18652496897599, 40.64338866217145], [-74.18483594580836, 40.644128266338726], [-74.18365067064063, 40.642239641050644], [-74.1836674587201, 40.64461048505006], [-74.17989568340026, 40.64526879647802]]], [[[-74.15945602438187, 40.641448333324036], [-74.16111242522163, 40.64183545373729], [-74.16146036002637, 40.644294969882374], [-74.15743349200979, 40.643302857779], [-74.15945602438187, 40.641448333324036]]]]}}, {\&quot;id\&quot;: \&quot;156\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21303884823986907, \&quot;OBJECTID\&quot;: 157, \&quot;Shape_Leng\&quot;: 0.131300217777, \&quot;Shape_Area\&quot;: 0.000354370128323, \&quot;zone\&quot;: \&quot;Maspeth\&quot;, \&quot;LocationID\&quot;: 157, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8978323689999, 40.73516035399992], [-73.8885228599999, 40.734531159999904], [-73.8870771209998, 40.72463770199994], [-73.90010558699989, 40.72329624099992], [-73.899816102, 40.721236899999894], [-73.89739704899986, 40.7215512099999], [-73.89736598399989, 40.72046438299989], [-73.90062644399997, 40.719764053999874], [-73.90033904299986, 40.718019947999885], [-73.89834760099983, 40.719197677999894], [-73.897267579, 40.71814715699985], [-73.89901821099994, 40.71738212699993], [-73.89750226399987, 40.716383867999916], [-73.90477244599997, 40.71286579999984], [-73.90639010099999, 40.71736369199989], [-73.90965980099996, 40.71779315499991], [-73.91283037699982, 40.71536090699993], [-73.91077807399988, 40.71318759999986], [-73.92404011299993, 40.714008312999916], [-73.92352547251075, 40.71561660836783], [-73.92064258940593, 40.715773192028834], [-73.92232773978448, 40.71659264406108], [-73.91132095099978, 40.71962422999992], [-73.91384828299984, 40.72289841199989], [-73.905180579, 40.72895657699995], [-73.90041661699985, 40.73465058799992], [-73.8978323689999, 40.73516035399992]]]}}, {\&quot;id\&quot;: \&quot;157\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20634919674108937, \&quot;OBJECTID\&quot;: 158, \&quot;Shape_Leng\&quot;: 0.0548099905515, \&quot;Shape_Area\&quot;: 0.000185568253002, \&quot;zone\&quot;: \&quot;Meatpacking/West Village West\&quot;, \&quot;LocationID\&quot;: 158, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0077911609999, 40.74197084499982], [-74.00515808199998, 40.74085808099991], [-74.0070902079999, 40.72877225299993], [-74.014390699162, 40.728463047760016], [-74.01408693559922, 40.730663173040284], [-74.01116195696464, 40.730450676349065], [-74.01099350879154, 40.732320417940606], [-74.01399957240955, 40.733332277517704], [-74.01072514326883, 40.733459523511115], [-74.01201792010478, 40.734063744456314], [-74.01081359479103, 40.734283443647534], [-74.0103930313456, 40.739174296059204], [-74.01265928208485, 40.74074763849748], [-74.0077911609999, 40.74197084499982]]]}}, {\&quot;id\&quot;: \&quot;158\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21316049433835588, \&quot;OBJECTID\&quot;: 159, \&quot;Shape_Leng\&quot;: 0.064363233206, \&quot;Shape_Area\&quot;: 0.00017124910387, \&quot;zone\&quot;: \&quot;Melrose South\&quot;, \&quot;LocationID\&quot;: 159, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91189154999992, 40.822141481999914], [-73.9012927759998, 40.820475442999914], [-73.9044655149999, 40.81228195999994], [-73.91768626999985, 40.8160812429999], [-73.92048117399989, 40.8145636869999], [-73.92309299899993, 40.81669772799995], [-73.92399951299991, 40.81543891199991], [-73.92662718199988, 40.816118958999915], [-73.91677400599986, 40.82438708699987], [-73.91189154999992, 40.822141481999914]]]}}, {\&quot;id\&quot;: \&quot;159\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24346227332445658, \&quot;OBJECTID\&quot;: 160, \&quot;Shape_Leng\&quot;: 0.14151914297, \&quot;Shape_Area\&quot;: 0.000571234977994, \&quot;zone\&quot;: \&quot;Middle Village\&quot;, \&quot;LocationID\&quot;: 160, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.869707654, 40.72514643399992], [-73.85962920999985, 40.713975294999926], [-73.87016462499984, 40.70920774299987], [-73.86911007199988, 40.707089336999914], [-73.88088332699985, 40.7064539769999], [-73.87761134199985, 40.70716770499993], [-73.88006267699978, 40.71265257399993], [-73.90477244599997, 40.71286579999984], [-73.89750226399987, 40.716383867999916], [-73.89901821099994, 40.71738212699993], [-73.897267579, 40.71814715699985], [-73.89834760099983, 40.719197677999894], [-73.90033904299986, 40.718019947999885], [-73.90062644399997, 40.719764053999874], [-73.89736598399989, 40.72046438299989], [-73.89739704899986, 40.7215512099999], [-73.899816102, 40.721236899999894], [-73.89903191799989, 40.723856959999864], [-73.89426494199992, 40.723143188999856], [-73.8870771209998, 40.72463770199994], [-73.88720524999994, 40.727792996999874], [-73.87509154199992, 40.73067136299992], [-73.87146074199987, 40.729326373999854], [-73.869707654, 40.72514643399992]]]}}, {\&quot;id\&quot;: \&quot;160\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21907665299078571, \&quot;OBJECTID\&quot;: 161, \&quot;Shape_Leng\&quot;: 0.0358039100611, \&quot;Shape_Area\&quot;: 7.19130682992e-05, \&quot;zone\&quot;: \&quot;Midtown Center\&quot;, \&quot;LocationID\&quot;: 161, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97534377999993, 40.7552996949999], [-73.9783696929999, 40.752416226999905], [-73.98411754799999, 40.75484205299995], [-73.977686006, 40.76364440299992], [-73.97124277300004, 40.76093641799984], [-73.97534377999993, 40.7552996949999]]]}}, {\&quot;id\&quot;: \&quot;161\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2176980165487151, \&quot;OBJECTID\&quot;: 162, \&quot;Shape_Leng\&quot;: 0.0352698146219, \&quot;Shape_Area\&quot;: 4.78936962112e-05, \&quot;zone\&quot;: \&quot;Midtown East\&quot;, \&quot;LocationID\&quot;: 162, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9712170449999, 40.75519332399994], [-73.9744494109998, 40.75076644499991], [-73.9783696929999, 40.752416226999905], [-73.96980028899992, 40.76291351199995], [-73.9665833839999, 40.76155093499988], [-73.9712170449999, 40.75519332399994]]]}}, {\&quot;id\&quot;: \&quot;162\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2150476451227831, \&quot;OBJECTID\&quot;: 163, \&quot;Shape_Leng\&quot;: 0.0341768669752, \&quot;Shape_Area\&quot;: 4.08567804196e-05, \&quot;zone\&quot;: \&quot;Midtown North\&quot;, \&quot;LocationID\&quot;: 163, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98136213699995, 40.767836738999904], [-73.9736358469999, 40.7645699129999], [-73.96980028899992, 40.76291351199995], [-73.97124277300004, 40.76093641799984], [-73.98428230099987, 40.76479181499994], [-73.98136213699995, 40.767836738999904]]]}}, {\&quot;id\&quot;: \&quot;163\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21359687372617775, \&quot;OBJECTID\&quot;: 164, \&quot;Shape_Leng\&quot;: 0.0357716119908, \&quot;Shape_Area\&quot;: 5.56318237441e-05, \&quot;zone\&quot;: \&quot;Midtown South\&quot;, \&quot;LocationID\&quot;: 164, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98362519999995, 40.7439431149999], [-73.99051761299985, 40.746038637999895], [-73.98411754799999, 40.75484205299995], [-73.98088709899987, 40.753480988999875], [-73.98407636100002, 40.74910212499993], [-73.98085054499998, 40.74775036999995], [-73.98362519999995, 40.7439431149999]]]}}, {\&quot;id\&quot;: \&quot;164\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23905773324731538, \&quot;OBJECTID\&quot;: 165, \&quot;Shape_Leng\&quot;: 0.088608036213, \&quot;Shape_Area\&quot;: 0.000353959317019, \&quot;zone\&quot;: \&quot;Midwood\&quot;, \&quot;LocationID\&quot;: 165, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96014773499996, 40.628915184999876], [-73.95995565099992, 40.627778671999884], [-73.94732672199994, 40.629166566999835], [-73.94451833400001, 40.61971364699989], [-73.94651373199997, 40.61949401899995], [-73.94573691999982, 40.61536340699989], [-73.95026514899993, 40.61392435199983], [-73.94978380499997, 40.611371749999854], [-73.96237947799978, 40.609986373999966], [-73.96471983399981, 40.62237296099993], [-73.96864510599995, 40.6219416949999], [-73.97136622199992, 40.62892916199996], [-73.96040734299989, 40.6301625309999], [-73.96014773499996, 40.628915184999876]]]}}, {\&quot;id\&quot;: \&quot;165\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20308903256101277, \&quot;OBJECTID\&quot;: 166, \&quot;Shape_Leng\&quot;: 0.0688237542871, \&quot;Shape_Area\&quot;: 0.000255276270405, \&quot;zone\&quot;: \&quot;Morningside Heights\&quot;, \&quot;LocationID\&quot;: 166, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95707738499995, 40.8142980939999], [-73.95210125199992, 40.811442853999935], [-73.9535757779999, 40.8094766979999], [-73.95496657099991, 40.81006455499994], [-73.95964685399987, 40.80115642299993], [-73.97110765876137, 40.80579013958964], [-73.96203105797969, 40.81808633074085], [-73.95707738499995, 40.8142980939999]]]}}, {\&quot;id\&quot;: \&quot;166\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23551928942158487, \&quot;OBJECTID\&quot;: 167, \&quot;Shape_Leng\&quot;: 0.0908159737292, \&quot;Shape_Area\&quot;: 0.000167529391193, \&quot;zone\&quot;: \&quot;Morrisania/Melrose\&quot;, \&quot;LocationID\&quot;: 167, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89690017899987, 40.8310333359999], [-73.8899110649999, 40.830124191999865], [-73.88609624199987, 40.82765577699989], [-73.89483522899992, 40.82624684099993], [-73.89548522799996, 40.82824854099993], [-73.90093510699997, 40.82792810199992], [-73.9012927759998, 40.820475442999914], [-73.91181615799985, 40.82203502199991], [-73.91677400599986, 40.82438708699987], [-73.91541108199998, 40.82577390899993], [-73.91130974499993, 40.824848557999886], [-73.91169430299985, 40.82775871599993], [-73.908959903, 40.83022623299989], [-73.90553116799988, 40.82910413299989], [-73.90122534999992, 40.83549991099991], [-73.89697220299995, 40.8343452539999], [-73.89690017899987, 40.8310333359999]]]}}, {\&quot;id\&quot;: \&quot;167\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20540890156612437, \&quot;OBJECTID\&quot;: 168, \&quot;Shape_Leng\&quot;: 0.114517434155, \&quot;Shape_Area\&quot;: 0.000547058100444, \&quot;zone\&quot;: \&quot;Mott Haven/Port Morris\&quot;, \&quot;LocationID\&quot;: 168, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.92480953899991, 40.81565901999993], [-73.92309299899993, 40.81669772799995], [-73.92048117399989, 40.8145636869999], [-73.91768626999985, 40.8160812429999], [-73.9044655149999, 40.81228195999994], [-73.90229231992774, 40.80456477614167], [-73.91168831241185, 40.79662376988872], [-73.91904978748826, 40.798993935843235], [-73.9229271008289, 40.80237329482137], [-73.92762788658843, 40.80269566548149], [-73.93252708785968, 40.80882328177534], [-73.93242632000944, 40.81411751897961], [-73.93027812699984, 40.813248024999965], [-73.92731653099999, 40.81855963399991], [-73.92518486499998, 40.818012668999884], [-73.92662718199988, 40.816118958999915], [-73.92480953899991, 40.81565901999993]]], [[[-73.89833036270552, 40.80241282093997], [-73.89646668834577, 40.80079047089134], [-73.90021004993142, 40.79926415589601], [-73.90003735815736, 40.800908742050225], [-73.89833036270552, 40.80241282093997]]], [[[-73.89680883223778, 40.795808445159786], [-73.89796839783742, 40.79564483916198], [-73.89919434249981, 40.796502456018175], [-73.8978825324018, 40.79711653214704], [-73.89680883223778, 40.795808445159786]]]]}}, {\&quot;id\&quot;: \&quot;168\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23977688244305467, \&quot;OBJECTID\&quot;: 169, \&quot;Shape_Leng\&quot;: 0.0601046580332, \&quot;Shape_Area\&quot;: 0.000146027537733, \&quot;zone\&quot;: \&quot;Mount Hope\&quot;, \&quot;LocationID\&quot;: 169, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89816577499982, 40.85514637599989], [-73.89863543699985, 40.85390697499993], [-73.89560883299981, 40.85457036999986], [-73.901344046, 40.84442875099994], [-73.90483121999989, 40.84480034199987], [-73.9050151499998, 40.842404697999875], [-73.91689747599989, 40.84511773399991], [-73.91416184199993, 40.845179187999925], [-73.90557007299988, 40.855787321999884], [-73.89816577499982, 40.85514637599989]]]}}, {\&quot;id\&quot;: \&quot;169\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21336368006251963, \&quot;OBJECTID\&quot;: 170, \&quot;Shape_Leng\&quot;: 0.0457690091051, \&quot;Shape_Area\&quot;: 7.43150675972e-05, \&quot;zone\&quot;: \&quot;Murray Hill\&quot;, \&quot;LocationID\&quot;: 170, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97203331099985, 40.745804967999945], [-73.97350835000003, 40.7437820339999], [-73.97812378199983, 40.745727172999885], [-73.98085965399994, 40.74196976799989], [-73.98407485299995, 40.74332471799989], [-73.98085054399985, 40.74775036999991], [-73.98407636100002, 40.74910212499993], [-73.98088709899987, 40.753480988999875], [-73.9744494109998, 40.75076644499991], [-73.9758346669999, 40.74886314599996], [-73.97121971999988, 40.74692154099996], [-73.97203331099985, 40.745804967999945]]]}}, {\&quot;id\&quot;: \&quot;170\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2337356586482648, \&quot;OBJECTID\&quot;: 171, \&quot;Shape_Leng\&quot;: 0.107353876244, \&quot;Shape_Area\&quot;: 0.000520099538161, \&quot;zone\&quot;: \&quot;Murray Hill-Queens\&quot;, \&quot;LocationID\&quot;: 171, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79317944599988, 40.77040317699989], [-73.79343991199988, 40.760764127999934], [-73.79076004599987, 40.76098576899991], [-73.79031517, 40.75782345099988], [-73.81104963199985, 40.761417020999964], [-73.82063593299985, 40.75887226799989], [-73.82657481899986, 40.772345397999885], [-73.82331286899986, 40.77957865999986], [-73.81452997799975, 40.77888817499992], [-73.81485850699985, 40.776485922999875], [-73.79853009399987, 40.775190728999924], [-73.79317944599988, 40.77040317699989]]]}}, {\&quot;id\&quot;: \&quot;171\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.281725262992855, \&quot;OBJECTID\&quot;: 172, \&quot;Shape_Leng\&quot;: 0.118476116148, \&quot;Shape_Area\&quot;: 0.000658402501406, \&quot;zone\&quot;: \&quot;New Dorp/Midland Beach\&quot;, \&quot;LocationID\&quot;: 172, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08654858694766, 40.56963231913558], [-74.08621632224266, 40.56853269814713], [-74.09054960106333, 40.567083597211294], [-74.09938031432728, 40.5589641933612], [-74.11376161199998, 40.56649718899993], [-74.11636336399992, 40.56391563799986], [-74.12489904399992, 40.568949141999916], [-74.12150213699994, 40.571721558999904], [-74.1215372899999, 40.57515325299986], [-74.10525775499997, 40.58592143599986], [-74.09844000899997, 40.581241705999915], [-74.10039083499996, 40.579688665999925], [-74.08597647499992, 40.57223697099986], [-74.08495715819193, 40.57125984002107], [-74.08654858694766, 40.56963231913558]]]}}, {\&quot;id\&quot;: \&quot;0\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2185816410601061, \&quot;OBJECTID\&quot;: 1, \&quot;Shape_Leng\&quot;: 0.116357453189, \&quot;Shape_Area\&quot;: 0.0007823067885, \&quot;zone\&quot;: \&quot;Newark Airport\&quot;, \&quot;LocationID\&quot;: 1, \&quot;borough\&quot;: \&quot;EWR\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.18445299999996, 40.6949959999999], [-74.18284199999994, 40.70346499999988], [-74.17565999999994, 40.707379999999866], [-74.16081899999995, 40.70764099999991], [-74.15306999999996, 40.7052829999999], [-74.17283399999997, 40.67656399999988], [-74.17862999999994, 40.671037999999896], [-74.18503799999996, 40.67335999999989], [-74.18991599999998, 40.68154099999988], [-74.18922299999997, 40.688623999999905], [-74.18563199999994, 40.69164799999987], [-74.18445299999996, 40.6949959999999]]]}}, {\&quot;id\&quot;: \&quot;172\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2269099119196972, \&quot;OBJECTID\&quot;: 173, \&quot;Shape_Leng\&quot;: 0.0600639661414, \&quot;Shape_Area\&quot;: 0.000178329851357, \&quot;zone\&quot;: \&quot;North Corona\&quot;, \&quot;LocationID\&quot;: 173, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85540366099997, 40.75834030899989], [-73.85312635499996, 40.75510934299989], [-73.85579909099987, 40.75440952799994], [-73.85442575299999, 40.748851725999884], [-73.86790963899986, 40.74493371599989], [-73.87365721799983, 40.756803485999946], [-73.85540366099997, 40.75834030899989]]]}}, {\&quot;id\&quot;: \&quot;173\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.25843157826105, \&quot;OBJECTID\&quot;: 174, \&quot;Shape_Leng\&quot;: 0.0678177559602, \&quot;Shape_Area\&quot;: 0.000155928664422, \&quot;zone\&quot;: \&quot;Norwood\&quot;, \&quot;LocationID\&quot;: 174, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87772817699984, 40.88345419499995], [-73.87812594399992, 40.88215382599989], [-73.87467601499999, 40.88156285199993], [-73.87494589799991, 40.87994766899988], [-73.87024100099985, 40.88022935299995], [-73.87619224999979, 40.87047671099987], [-73.8830900319999, 40.86659150899993], [-73.88146889699985, 40.868573645999916], [-73.88705142599984, 40.884349575999906], [-73.88124422499992, 40.88270963299992], [-73.87803562399996, 40.887118321999885], [-73.87772817699984, 40.88345419499995]]]}}, {\&quot;id\&quot;: \&quot;174\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2016697843747185, \&quot;OBJECTID\&quot;: 175, \&quot;Shape_Leng\&quot;: 0.134897665102, \&quot;Shape_Area\&quot;: 0.000504920726134, \&quot;zone\&quot;: \&quot;Oakland Gardens\&quot;, \&quot;LocationID\&quot;: 175, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7562560639999, 40.7584304689999], [-73.75230259399993, 40.759455198999916], [-73.75004764499985, 40.75840465799996], [-73.74384322099985, 40.74769009599988], [-73.74625984399985, 40.74671147499993], [-73.74477587099986, 40.74328109699994], [-73.75347299999999, 40.74240484399992], [-73.75098230099987, 40.74002146199996], [-73.7439619359999, 40.74078912699986], [-73.74306820799991, 40.7384408179999], [-73.74016951799993, 40.73848189799986], [-73.75048295699996, 40.72922129399996], [-73.75669771299987, 40.7262287109999], [-73.76564374500005, 40.732533126999954], [-73.7636997919999, 40.73286411699993], [-73.76510920699994, 40.73455658499992], [-73.76248609299982, 40.736730981999884], [-73.76772991399994, 40.74577622599993], [-73.75684127399992, 40.74932207799991], [-73.76184343999986, 40.75553726899989], [-73.76239510599996, 40.759496997999854], [-73.75800131799996, 40.76037986699988], [-73.7562560639999, 40.7584304689999]]]}}, {\&quot;id\&quot;: \&quot;175\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.17177692481372772, \&quot;OBJECTID\&quot;: 176, \&quot;Shape_Leng\&quot;: 0.151995190703, \&quot;Shape_Area\&quot;: 0.000657782126267, \&quot;zone\&quot;: \&quot;Oakwood\&quot;, \&quot;LocationID\&quot;: 176, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.12187198599999, 40.57510757499989], [-74.12150213699994, 40.571721558999904], [-74.12489904399992, 40.568949141999916], [-74.11636336299996, 40.56391563799985], [-74.11376161199998, 40.56649718899993], [-74.09992914200652, 40.55907068582615], [-74.10140516910823, 40.555538526164405], [-74.10309839111532, 40.555904641451136], [-74.10484447636338, 40.55302581455626], [-74.10768623464054, 40.553976671477514], [-74.11301046102231, 40.547780065214994], [-74.12730057799996, 40.55729517199993], [-74.13321002499998, 40.552383875999936], [-74.13885092699991, 40.5569511789999], [-74.13170009, 40.56453574899991], [-74.1443874499999, 40.56970609999989], [-74.14418588199999, 40.57203740999988], [-74.13261022999991, 40.573530162999894], [-74.12708814799998, 40.57636910599995], [-74.12187198599999, 40.57510757499989]]]}}, {\&quot;id\&quot;: \&quot;176\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.28871928482258397, \&quot;OBJECTID\&quot;: 177, \&quot;Shape_Leng\&quot;: 0.0715805407056, \&quot;Shape_Area\&quot;: 0.000198894762248, \&quot;zone\&quot;: \&quot;Ocean Hill\&quot;, \&quot;LocationID\&quot;: 177, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90287079599995, 40.6786314149999], [-73.90004626199993, 40.67689308999995], [-73.92275257199998, 40.667097332999894], [-73.92164666399992, 40.67886992299994], [-73.9163011989999, 40.67857711199991], [-73.91804607, 40.68721324799989], [-73.90287079599995, 40.6786314149999]]]}}, {\&quot;id\&quot;: \&quot;177\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21526255079957998, \&quot;OBJECTID\&quot;: 178, \&quot;Shape_Leng\&quot;: 0.0682528770739, \&quot;Shape_Area\&quot;: 0.000175805409143, \&quot;zone\&quot;: \&quot;Ocean Parkway South\&quot;, \&quot;LocationID\&quot;: 178, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97080408199997, 40.62593266699988], [-73.96864510599995, 40.6219416949999], [-73.96471983399981, 40.62237296099993], [-73.96285973999984, 40.61254948599989], [-73.96478112799986, 40.61233092199988], [-73.96429649899991, 40.60977642599992], [-73.97403097799986, 40.608702309999906], [-73.97517176999993, 40.61472418599991], [-73.97290326899996, 40.61415296799988], [-73.97335879399992, 40.616541714999904], [-73.97537335500002, 40.6157547219999], [-73.97785009299986, 40.617287605999906], [-73.97539380499998, 40.62076998699995], [-73.97705352899999, 40.62153252199987], [-73.9772614999999, 40.625852772999906], [-73.97080408199997, 40.62593266699988]]]}}, {\&quot;id\&quot;: \&quot;178\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20926966950433043, \&quot;OBJECTID\&quot;: 179, \&quot;Shape_Leng\&quot;: 0.0713808644377, \&quot;Shape_Area\&quot;: 0.000183893478476, \&quot;zone\&quot;: \&quot;Old Astoria\&quot;, \&quot;LocationID\&quot;: 179, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93290347544752, 40.77794449857707], [-73.92782147400004, 40.776697526999946], [-73.91770217299991, 40.7703931119999], [-73.91995596899991, 40.768440064999865], [-73.91849336999996, 40.76773465699995], [-73.91977764799998, 40.7661521839999], [-73.92218946199995, 40.767267356999895], [-73.92425288799978, 40.76472456399995], [-73.93344468499993, 40.768817789999915], [-73.93493511099992, 40.76701302399987], [-73.93618379699991, 40.767691800999934], [-73.93424609600005, 40.771029275999894], [-73.93746638537067, 40.77253149512518], [-73.93765483090819, 40.775085685383594], [-73.93508232492144, 40.77794423372776], [-73.93290347544752, 40.77794449857707]]]}}, {\&quot;id\&quot;: \&quot;179\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22245118569541122, \&quot;OBJECTID\&quot;: 180, \&quot;Shape_Leng\&quot;: 0.0805277671523, \&quot;Shape_Area\&quot;: 0.000247682193353, \&quot;zone\&quot;: \&quot;Ozone Park\&quot;, \&quot;LocationID\&quot;: 180, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84119605699982, 40.68335136599989], [-73.83334819299995, 40.66677318699994], [-73.86131863599985, 40.6750212689999], [-73.86334943599995, 40.67935163999989], [-73.85878576899987, 40.68063046299989], [-73.85819836099995, 40.67943084899987], [-73.85392389199987, 40.679686155999875], [-73.85099089299987, 40.68056836699987], [-73.85197864599989, 40.682564210999864], [-73.84786817599985, 40.681486831999905], [-73.84119605699982, 40.68335136599989]]]}}, {\&quot;id\&quot;: \&quot;180\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21747093307404936, \&quot;OBJECTID\&quot;: 181, \&quot;Shape_Leng\&quot;: 0.0895372399547, \&quot;Shape_Area\&quot;: 0.000306890292807, \&quot;zone\&quot;: \&quot;Park Slope\&quot;, \&quot;LocationID\&quot;: 181, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97583132299987, 40.66581507999991], [-73.97965353499985, 40.661243232999915], [-73.98223034199995, 40.66214149299991], [-73.985086794, 40.65901328799989], [-73.988716511, 40.66240493799995], [-73.9906354539999, 40.66057908799997], [-73.99692689899985, 40.664374914999925], [-73.99490350199993, 40.66678543499988], [-73.99277080699981, 40.665507280999876], [-73.97804289599988, 40.68485661499987], [-73.97375598499991, 40.68303401999988], [-73.97618051399984, 40.67806432099995], [-73.96949738899991, 40.67590637999996], [-73.96871822199984, 40.67392423399988], [-73.97583132299987, 40.66581507999991]]]}}, {\&quot;id\&quot;: \&quot;181\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20946044788320664, \&quot;OBJECTID\&quot;: 182, \&quot;Shape_Leng\&quot;: 0.0393606369479, \&quot;Shape_Area\&quot;: 9.10644156732e-05, \&quot;zone\&quot;: \&quot;Parkchester\&quot;, \&quot;LocationID\&quot;: 182, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85465135700002, 40.83388802699987], [-73.86271114399993, 40.83299150899997], [-73.86448011799995, 40.84108779699994], [-73.85333524999986, 40.84247015499987], [-73.85168459699997, 40.8342010519999], [-73.85465135700002, 40.83388802699987]]]}}, {\&quot;id\&quot;: \&quot;182\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2847370571411895, \&quot;OBJECTID\&quot;: 183, \&quot;Shape_Leng\&quot;: 0.0398262960348, \&quot;Shape_Area\&quot;: 9.51929451066e-05, \&quot;zone\&quot;: \&quot;Pelham Bay\&quot;, \&quot;LocationID\&quot;: 183, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83676643699985, 40.84338596999994], [-73.83463970299987, 40.853817993999904], [-73.82860197199996, 40.85571784799988], [-73.82721751200002, 40.853250512999935], [-73.82799676999998, 40.84862431399989], [-73.82611300699996, 40.84533869399991], [-73.83676643699985, 40.84338596999994]]]}}, {\&quot;id\&quot;: \&quot;183\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.1773082366260968, \&quot;OBJECTID\&quot;: 184, \&quot;Shape_Leng\&quot;: 0.260815683043, \&quot;Shape_Area\&quot;: 0.00198883363103, \&quot;zone\&quot;: \&quot;Pelham Bay Park\&quot;, \&quot;LocationID\&quot;: 184, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.80728647099995, 40.885931813999875], [-73.79322870891143, 40.88282259495222], [-73.80087270458245, 40.87159011989393], [-73.80252284756597, 40.87050664469679], [-73.80339117523091, 40.87250503763108], [-73.80431849468228, 40.87115974106797], [-73.80302203685277, 40.86915511979648], [-73.80588410012888, 40.869068502184916], [-73.80841596818787, 40.87118969336752], [-73.80464604502912, 40.86664711643685], [-73.80300388108948, 40.86704183656889], [-73.80225816157765, 40.8656082064109], [-73.79780377219292, 40.87225613227397], [-73.794790446816, 40.873200484033966], [-73.79384702788171, 40.87859445979086], [-73.7895587294431, 40.881261284915404], [-73.789523093688, 40.87899812706048], [-73.7843816810755, 40.878420531670514], [-73.78719087560506, 40.872730553729134], [-73.78508139658601, 40.87358996322568], [-73.78526152075709, 40.87174532233236], [-73.78358738486025, 40.87378095468029], [-73.78320175426292, 40.87067036085376], [-73.78560245305444, 40.86834165222368], [-73.78795446145405, 40.86984541906357], [-73.79139032586131, 40.868141307466146], [-73.79190454927502, 40.86082956271207], [-73.79454562318031, 40.85888825916121], [-73.79435005934273, 40.85652702380392], [-73.7987225560008, 40.85491440117259], [-73.79780522990592, 40.85194959859714], [-73.80040387554423, 40.84810822100142], [-73.80417557932397, 40.853340120189074], [-73.80478410547944, 40.86154633053462], [-73.80592716427573, 40.86194119699028], [-73.80612390783546, 40.85981220661901], [-73.80783343870087, 40.860318133305384], [-73.80768048107562, 40.858538063289515], [-73.81411414337536, 40.86373145821164], [-73.81641392102723, 40.86118062770394], [-73.81273146495035, 40.85887754194771], [-73.81230602708418, 40.854162026473176], [-73.81684183599076, 40.85362521315728], [-73.81712409042197, 40.85126957344483], [-73.81507165904237, 40.84913361979451], [-73.82495697699986, 40.846105444999864], [-73.82517999, 40.842700058999874], [-73.82624132899997, 40.84299359399996], [-73.82799676999987, 40.8486243129999], [-73.82723026100001, 40.853350756999895], [-73.82860197199996, 40.85571784799988], [-73.83283502299986, 40.8560358449999], [-73.82834347399992, 40.86089202599988], [-73.82699653199998, 40.85908778599986], [-73.82037552999996, 40.86103300499993], [-73.81578764099999, 40.8657580609999], [-73.821266938, 40.869071605999885], [-73.82329599399986, 40.87309741799988], [-73.81992586499996, 40.88211933299987], [-73.82027432999985, 40.885550699999925], [-73.81442762200005, 40.88677196499989], [-73.80728647099995, 40.885931813999875]]], [[[-73.78650554049733, 40.880940134479225], [-73.78578002611279, 40.88036396266133], [-73.78742039384403, 40.87977089028999], [-73.787127834652, 40.88092346317125], [-73.78650554049733, 40.880940134479225]]], [[[-73.78103351104939, 40.87648400204775], [-73.78120649649391, 40.87628502546013], [-73.78132704118002, 40.87636132654635], [-73.78112767478156, 40.87665268050809], [-73.78103351104939, 40.87648400204775]]], [[[-73.78241811865315, 40.87492327042177], [-73.78265785360905, 40.87479265669398], [-73.78280207510406, 40.87494886620542], [-73.78247604125525, 40.87516813337884], [-73.78241811865315, 40.87492327042177]]], [[[-73.77435244645233, 40.874169955874805], [-73.77453640510954, 40.87471001543833], [-73.77409538292126, 40.87489618448013], [-73.7740318153443, 40.874394774956215], [-73.77435244645233, 40.874169955874805]]], [[[-73.78605394964902, 40.873782646192794], [-73.78618924358646, 40.87359972769974], [-73.78633325996694, 40.87367772488745], [-73.7861946371647, 40.87388531941464], [-73.78605394964902, 40.873782646192794]]], [[[-73.78648510546586, 40.87320925495041], [-73.7867268909535, 40.87307453926568], [-73.78626202153426, 40.87339368663393], [-73.78632869488987, 40.873271144554096], [-73.78648510546586, 40.87320925495041]]], [[[-73.77080975398195, 40.871549946847985], [-73.76990710668544, 40.87047694447026], [-73.77288042665229, 40.871245263430254], [-73.77217786492288, 40.87198111068936], [-73.77080975398195, 40.871549946847985]]], [[[-73.76668965841925, 40.86709778162448], [-73.76709907439783, 40.8667045727482], [-73.76779449382023, 40.86678117376544], [-73.76760072096499, 40.86749638654143], [-73.76668965841925, 40.86709778162448]]], [[[-73.76964988627088, 40.86548557242442], [-73.76979148260493, 40.86512823356445], [-73.77022931630273, 40.865138939396005], [-73.770068972998, 40.86552587618341], [-73.76964988627088, 40.86548557242442]]], [[[-73.78401249138903, 40.863131994074394], [-73.78376770348979, 40.86261060846434], [-73.78469165850701, 40.86254278990822], [-73.7842865050008, 40.86320508878048], [-73.78401249138903, 40.863131994074394]]], [[[-73.78312589594455, 40.862856167300684], [-73.7828819783119, 40.862406433091266], [-73.7831450428813, 40.86206867890555], [-73.78328053505923, 40.86278070671258], [-73.78312589594455, 40.862856167300684]]], [[[-73.77460156350928, 40.86206904745972], [-73.7749432115575, 40.861391499889486], [-73.77529297955127, 40.86123200821588], [-73.77485681624742, 40.86198363433426], [-73.77460156350928, 40.86206904745972]]], [[[-73.77290231992438, 40.86120858327854], [-73.77323150244695, 40.86074716979338], [-73.77351264165688, 40.861241184087085], [-73.77310632921937, 40.861614575032775], [-73.77290231992438, 40.86120858327854]]], [[[-73.8022229535527, 40.84163481314409], [-73.80263811156135, 40.841081153267076], [-73.80694608641589, 40.84146244718637], [-73.80680801372397, 40.84248913998752], [-73.8022229535527, 40.84163481314409]]]]}}, {\&quot;id\&quot;: \&quot;184\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24992585526126967, \&quot;OBJECTID\&quot;: 185, \&quot;Shape_Leng\&quot;: 0.0861619681636, \&quot;Shape_Area\&quot;: 0.000228537100218, \&quot;zone\&quot;: \&quot;Pelham Parkway\&quot;, \&quot;LocationID\&quot;: 185, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84004614299985, 40.857806268999866], [-73.83499552599994, 40.85657120099989], [-73.84049767399992, 40.8541841049999], [-73.84494053799982, 40.8482182209999], [-73.84430846999992, 40.85119046399989], [-73.85304526899994, 40.849547331999865], [-73.85457388299992, 40.85150834599995], [-73.86250923799993, 40.84836228099987], [-73.86303938099996, 40.850611306999944], [-73.86860515599989, 40.85206864599991], [-73.86990421600002, 40.85577329299987], [-73.8681883059999, 40.858063833999964], [-73.84004614299985, 40.857806268999866]]]}}, {\&quot;id\&quot;: \&quot;185\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21923492475874293, \&quot;OBJECTID\&quot;: 186, \&quot;Shape_Leng\&quot;: 0.0246963902234, \&quot;Shape_Area\&quot;: 3.70729416953e-05, \&quot;zone\&quot;: \&quot;Penn Station/Madison Sq West\&quot;, \&quot;LocationID\&quot;: 186, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99096832799995, 40.74542088999985], [-73.99709902899994, 40.74720510199991], [-73.99346417699986, 40.75219005499987], [-73.98776905899994, 40.749787028999926], [-73.99096832799995, 40.74542088999985]]]}}, {\&quot;id\&quot;: \&quot;186\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2644006948465547, \&quot;OBJECTID\&quot;: 187, \&quot;Shape_Leng\&quot;: 0.126868431324, \&quot;Shape_Area\&quot;: 0.000421195755741, \&quot;zone\&quot;: \&quot;Port Richmond\&quot;, \&quot;LocationID\&quot;: 187, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.13435269573621, 40.64188679740515], [-74.12890729033458, 40.64119482758617], [-74.1268887269999, 40.637210087999925], [-74.12867047299994, 40.63734826499993], [-74.13047428999985, 40.6308855089999], [-74.13806393799992, 40.627568470999904], [-74.13581008299997, 40.62506433999991], [-74.13826358199992, 40.624243769999936], [-74.13982184799993, 40.61629982499988], [-74.14603562099998, 40.61701277699996], [-74.14696864199988, 40.610151355999896], [-74.15018666499996, 40.60949781099991], [-74.15379116699992, 40.612255611999906], [-74.15231170399994, 40.61716275599988], [-74.14622812499992, 40.6249253619999], [-74.14554071999994, 40.62783252199995], [-74.14752618999992, 40.62938928799988], [-74.14478228999994, 40.637953779999904], [-74.14229766980965, 40.64030580709358], [-74.13435269573621, 40.64188679740515]]], [[[-74.12117246275159, 40.64166914557247], [-74.12128074797168, 40.64143249599354], [-74.12131194814832, 40.64145253116248], [-74.12117246275159, 40.64166914557247]]], [[[-74.1215534360538, 40.64161162832474], [-74.12176052602824, 40.64157431506241], [-74.12175764698422, 40.64142342422718], [-74.12177911197513, 40.641592547117035], [-74.1215534360538, 40.64161162832474]]], [[[-74.12107727405213, 40.64160742058869], [-74.12118039503834, 40.64138344518971], [-74.12121470277087, 40.64139683999368], [-74.12110124737936, 40.64161328229901], [-74.12107727405213, 40.64160742058869]]], [[[-74.12130529083001, 40.64160070313003], [-74.12137332919554, 40.64147647512165], [-74.12132617111645, 40.64160656922885], [-74.12130529083001, 40.64160070313003]]], [[[-74.12185329597821, 40.64158069227959], [-74.12180661091023, 40.64141215903768], [-74.1218414704778, 40.641405894387034], [-74.12199083807539, 40.64155463949942], [-74.12185329597821, 40.64158069227959]]], [[[-74.12270319595869, 40.64137664893253], [-74.12272114424832, 40.64134762377306], [-74.12276203509289, 40.641426635297144], [-74.12271103075855, 40.641433755252706], [-74.12270319595869, 40.64137664893253]]], [[[-74.12613276551227, 40.6412643880282], [-74.1259954246122, 40.640231242814394], [-74.12636808688976, 40.64133238048696], [-74.12564026870598, 40.64141849208226], [-74.12613276551227, 40.6412643880282]]]]}}, {\&quot;id\&quot;: \&quot;188\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21968928524172474, \&quot;OBJECTID\&quot;: 189, \&quot;Shape_Leng\&quot;: 0.0486743306502, \&quot;Shape_Area\&quot;: 0.000101427594033, \&quot;zone\&quot;: \&quot;Prospect Heights\&quot;, \&quot;LocationID\&quot;: 189, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96070974499996, 40.673121393999985], [-73.96131877999991, 40.67140667599988], [-73.96892332199981, 40.67293755299988], [-73.96949738899991, 40.67590637999996], [-73.97618051399984, 40.67806432099995], [-73.97375598499991, 40.68303401999988], [-73.96134655899995, 40.6804635239999], [-73.96318238899983, 40.675529503999876], [-73.96007428300001, 40.67487807099994], [-73.96070974499996, 40.673121393999985]]]}}, {\&quot;id\&quot;: \&quot;189\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2160607750894813, \&quot;OBJECTID\&quot;: 190, \&quot;Shape_Leng\&quot;: 0.0743294660829, \&quot;Shape_Area\&quot;: 0.000270873666522, \&quot;zone\&quot;: \&quot;Prospect Park\&quot;, \&quot;LocationID\&quot;: 190, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96307724199983, 40.66213019499987], [-73.96190028499997, 40.65487096199992], [-73.96621321999996, 40.653189404999885], [-73.96465438699984, 40.650887727999894], [-73.97139631700004, 40.64825778599986], [-73.97436701299992, 40.65818790399992], [-73.98022902599985, 40.660985325999896], [-73.96865541400003, 40.673023838999924], [-73.96258784899996, 40.671711596999884], [-73.96095595499996, 40.66328505499992], [-73.96307724199983, 40.66213019499987]]]}}, {\&quot;id\&quot;: \&quot;187\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2188398180407007, \&quot;OBJECTID\&quot;: 188, \&quot;Shape_Leng\&quot;: 0.0977983968367, \&quot;Shape_Area\&quot;: 0.000313003032771, \&quot;zone\&quot;: \&quot;Prospect-Lefferts Gardens\&quot;, \&quot;LocationID\&quot;: 188, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95729172699996, 40.6643026319999], [-73.94269628999989, 40.664055128999934], [-73.94282892199992, 40.6628474859999], [-73.93068465499985, 40.66362047699992], [-73.92646424299983, 40.659814361999956], [-73.92834017599988, 40.660060035999884], [-73.92799465199988, 40.65680210099988], [-73.9500666489999, 40.65542299699989], [-73.94957113100006, 40.65080789999991], [-73.9587078989999, 40.65038727299989], [-73.95986103199981, 40.65563478899989], [-73.96190028499997, 40.65487096199992], [-73.96307724199983, 40.66213019499987], [-73.95729172699996, 40.6643026319999]]]}}, {\&quot;id\&quot;: \&quot;190\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.30035481171136735, \&quot;OBJECTID\&quot;: 191, \&quot;Shape_Leng\&quot;: 0.130932637664, \&quot;Shape_Area\&quot;: 0.000688460603185, \&quot;zone\&quot;: \&quot;Queens Village\&quot;, \&quot;LocationID\&quot;: 191, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.73016587199996, 40.72395859599988], [-73.72816233910697, 40.7230841398913], [-73.73032628984046, 40.722157296892334], [-73.7269714679152, 40.710714504016735], [-73.72677759516957, 40.7030592911994], [-73.74590871000004, 40.70228727399988], [-73.74500119100004, 40.70026221299988], [-73.74773012199991, 40.69955313699991], [-73.74618157999997, 40.696121925999904], [-73.74863325999986, 40.6954447609999], [-73.75205066499986, 40.70522802799995], [-73.75047058199985, 40.70563993099994], [-73.75725671499985, 40.71813860199992], [-73.7523343839998, 40.72026246099993], [-73.75669771299987, 40.7262287109999], [-73.74672140400006, 40.73247715099991], [-73.74555667199989, 40.73063689799994], [-73.7314721509999, 40.727411794999924], [-73.73016587199996, 40.72395859599988]]]}}, {\&quot;id\&quot;: \&quot;191\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20838730672371972, \&quot;OBJECTID\&quot;: 192, \&quot;Shape_Leng\&quot;: 0.11196461971, \&quot;Shape_Area\&quot;: 0.000373808019026, \&quot;zone\&quot;: \&quot;Queensboro Hill\&quot;, \&quot;LocationID\&quot;: 192, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82239598999983, 40.74986422299986], [-73.81416171999987, 40.74613857999992], [-73.80750599299991, 40.750136586999936], [-73.80287666499983, 40.749765149999895], [-73.8033521419999, 40.74643196499987], [-73.7946756879998, 40.74721192799994], [-73.79453507400001, 40.74450763799989], [-73.79723084999992, 40.74169550699993], [-73.79640218700004, 40.73828235799987], [-73.8243501109999, 40.73975360599992], [-73.82946751999994, 40.737024481999896], [-73.83143025500006, 40.73913573299994], [-73.83113122799989, 40.74233799999994], [-73.83586131899989, 40.743227984999926], [-73.83392218299996, 40.74753207499989], [-73.82584440999999, 40.74934839099993], [-73.82426493799994, 40.75183288799992], [-73.82239598999983, 40.74986422299986]]]}}, {\&quot;id\&quot;: \&quot;192\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20413753185240252, \&quot;OBJECTID\&quot;: 193, \&quot;Shape_Leng\&quot;: 0.0655299584801, \&quot;Shape_Area\&quot;: 0.000145591657944, \&quot;zone\&quot;: \&quot;Queensbridge/Ravenswood\&quot;, \&quot;LocationID\&quot;: 193, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93522718099996, 40.76952572899989], [-73.93858976899998, 40.766817358999916], [-73.93398092199995, 40.76282598199987], [-73.944052652, 40.75231325999992], [-73.95080763809156, 40.75526368005708], [-73.9413117494144, 40.76691800476961], [-73.93424609599985, 40.771029274999925], [-73.93522718099996, 40.76952572899989]]]}}, {\&quot;id\&quot;: \&quot;193\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21631961892463786, \&quot;OBJECTID\&quot;: 194, \&quot;Shape_Leng\&quot;: 0.0817938353532, \&quot;Shape_Area\&quot;: 0.000273481702719, \&quot;zone\&quot;: \&quot;Randalls Island\&quot;, \&quot;LocationID\&quot;: 194, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91639852914044, 40.79768484203896], [-73.91378385370595, 40.793836285482065], [-73.92412113996787, 40.78252307401082], [-73.92810118993664, 40.78092032002105], [-73.93598226003293, 40.7839423680532], [-73.93084178719639, 40.79099143000079], [-73.9261041024332, 40.79073160730996], [-73.92560814781015, 40.79189695828146], [-73.9278688922052, 40.79095483831721], [-73.9283194359912, 40.79309126608271], [-73.9254929354651, 40.80195616882528], [-73.92263378594883, 40.80186873814113], [-73.91639852914044, 40.79768484203896]]]}}, {\&quot;id\&quot;: \&quot;194\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2211924311571713, \&quot;OBJECTID\&quot;: 195, \&quot;Shape_Leng\&quot;: 0.131308244067, \&quot;Shape_Area\&quot;: 0.000801651953985, \&quot;zone\&quot;: \&quot;Red Hook\&quot;, \&quot;LocationID\&quot;: 195, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0071710969999, 40.68635700999991], [-74.00485241599992, 40.685668130999886], [-74.00596041099988, 40.683362870999936], [-73.9986188799999, 40.67183017199989], [-74.00289483876944, 40.66734846594933], [-74.0058636618068, 40.66799376258568], [-74.00683236078251, 40.666049645526776], [-74.00696707834247, 40.666052182356665], [-74.00543926529353, 40.6709214682384], [-74.00754821618384, 40.66705174573358], [-74.00708724221813, 40.668591358535764], [-74.00985411855632, 40.668523628335336], [-74.01154017543327, 40.6650859197566], [-74.01574872882654, 40.6645683362916], [-74.01690267361069, 40.66484660233888], [-74.01933946871777, 40.671624948422625], [-74.01751037086694, 40.671034530984144], [-74.01648665554487, 40.664930508953816], [-74.01227967872792, 40.66573241415882], [-74.01033845947926, 40.669078195448], [-74.01162527521356, 40.670581028275876], [-74.01424926931875, 40.66972860473708], [-74.01175350509699, 40.670657757578326], [-74.0151998057007, 40.6707540276644], [-74.01423289452782, 40.67213000051297], [-74.01568625497515, 40.671038834928844], [-74.0129758779219, 40.67332791872093], [-74.01632099922307, 40.6729082695637], [-74.01496392184576, 40.67467763029424], [-74.0188009477692, 40.6722507648487], [-74.01727138470127, 40.67360864580548], [-74.0188577695892, 40.6751022924089], [-74.01791198226178, 40.676510462801936], [-74.01995197864673, 40.67710301044993], [-74.01825267004557, 40.67855288672587], [-74.01928128101008, 40.67964814029763], [-74.01282000316418, 40.68362241624865], [-74.01410549647976, 40.68171251937541], [-74.013018354221, 40.68041237401427], [-74.00967108558879, 40.683268727715], [-74.01193259955522, 40.683887749077535], [-74.0071710969999, 40.68635700999991]]]}}, {\&quot;id\&quot;: \&quot;195\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20640880709365245, \&quot;OBJECTID\&quot;: 196, \&quot;Shape_Leng\&quot;: 0.0832421106332, \&quot;Shape_Area\&quot;: 0.0001974713336, \&quot;zone\&quot;: \&quot;Rego Park\&quot;, \&quot;LocationID\&quot;: 196, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85762923599995, 40.728606921999884], [-73.8594198799999, 40.726464837999885], [-73.85727108100001, 40.72568129799988], [-73.85805416899993, 40.72444540599986], [-73.86203833799982, 40.72595678499994], [-73.8586809759999, 40.72261243999988], [-73.85729287299985, 40.711467676999874], [-73.85975932900001, 40.711845058999856], [-73.86003789899996, 40.71493223599987], [-73.86929270499994, 40.72443592899991], [-73.87146074199987, 40.729326373999854], [-73.87509154199992, 40.73067136299992], [-73.85886555799988, 40.73593913899987], [-73.85625665099991, 40.73095912299993], [-73.85851097899999, 40.73028680199993], [-73.85762923599995, 40.728606921999884]]]}}, {\&quot;id\&quot;: \&quot;196\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21599472468336775, \&quot;OBJECTID\&quot;: 197, \&quot;Shape_Leng\&quot;: 0.108568532229, \&quot;Shape_Area\&quot;: 0.000504689160432, \&quot;zone\&quot;: \&quot;Richmond Hill\&quot;, \&quot;LocationID\&quot;: 197, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83696237799982, 40.70421245199992], [-73.83152109599999, 40.70138962899994], [-73.82245890399994, 40.70365553099989], [-73.81637824499992, 40.70245196399987], [-73.81063298299996, 40.69194738299988], [-73.82501128899997, 40.68795231799991], [-73.82599347399987, 40.689953661999894], [-73.82851136799994, 40.689239055999934], [-73.82753021399995, 40.687239482999914], [-73.83807769099997, 40.68423890999988], [-73.83697486299991, 40.6819880179999], [-73.84012856099982, 40.6811466509999], [-73.84947763499991, 40.69819580699987], [-73.83696237799982, 40.70421245199992]]]}}, {\&quot;id\&quot;: \&quot;197\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2320048953352985, \&quot;OBJECTID\&quot;: 198, \&quot;Shape_Leng\&quot;: 0.134094242763, \&quot;Shape_Area\&quot;: 0.000499809882564, \&quot;zone\&quot;: \&quot;Ridgewood\&quot;, \&quot;LocationID\&quot;: 198, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90768387299997, 40.71737969499987], [-73.90639010099999, 40.71736369199989], [-73.90537582199983, 40.71287658099986], [-73.88006267699978, 40.71265257399993], [-73.87761134199985, 40.70716770499993], [-73.88911917799989, 40.705598876999915], [-73.90123290699994, 40.69144227899997], [-73.90579597099993, 40.69412715499987], [-73.9042601839999, 40.69570037099989], [-73.91180820099989, 40.69993800299986], [-73.91067882699998, 40.701045968999914], [-73.91290404099983, 40.70236189199989], [-73.91180710099992, 40.703434952999864], [-73.92189184699987, 40.709396095999836], [-73.92074519699985, 40.71052968599989], [-73.92404011299993, 40.714008312999916], [-73.91077807399988, 40.71318759999986], [-73.91283037699992, 40.71536090799986], [-73.90965980099996, 40.71779315499991], [-73.90768387299997, 40.71737969499987]]]}}, {\&quot;id\&quot;: \&quot;198\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22719946272666225, \&quot;OBJECTID\&quot;: 199, \&quot;Shape_Leng\&quot;: 0.0778085005169, \&quot;Shape_Area\&quot;: 0.000288747549303, \&quot;zone\&quot;: \&quot;Rikers Island\&quot;, \&quot;LocationID\&quot;: 199, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88885148496314, 40.79870632895875], [-73.88665108524579, 40.79803819669988], [-73.88375741590156, 40.79570856541983], [-73.87288457445655, 40.79145210820714], [-73.87080888583708, 40.78789669184152], [-73.87308761694455, 40.78585495239161], [-73.8783068007881, 40.785356620754236], [-73.88905212421602, 40.78737256012899], [-73.89282283610926, 40.79281708195147], [-73.89179289686568, 40.79677524575864], [-73.88885148496314, 40.79870632895875]]]}}, {\&quot;id\&quot;: \&quot;199\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22788726971129314, \&quot;OBJECTID\&quot;: 200, \&quot;Shape_Leng\&quot;: 0.112661735435, \&quot;Shape_Area\&quot;: 0.000744643168558, \&quot;zone\&quot;: \&quot;Riverdale/North Riverdale/Fieldston\&quot;, \&quot;LocationID\&quot;: 200, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.896411335, 40.90450452099991], [-73.89643170799987, 40.89365527899989], [-73.89787887499983, 40.89027610099993], [-73.9028594909999, 40.88916474399989], [-73.90413642399992, 40.887080708999896], [-73.90975930299997, 40.889250027999886], [-73.91489276999991, 40.8846247709999], [-73.92058641888602, 40.88718267830985], [-73.9103325682445, 40.91553277700258], [-73.89663333881637, 40.911417374923055], [-73.896411335, 40.90450452099991]]]}}, {\&quot;id\&quot;: \&quot;200\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.26130578966267454, \&quot;OBJECTID\&quot;: 201, \&quot;Shape_Leng\&quot;: 0.130404117686, \&quot;Shape_Area\&quot;: 0.000619350747819, \&quot;zone\&quot;: \&quot;Rockaway Park\&quot;, \&quot;LocationID\&quot;: 201, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.81849901800001, 40.5873623529999], [-73.81544517899997, 40.58337349199993], [-73.81730795916116, 40.58233475897], [-73.86255286029154, 40.56681001230082], [-73.86662812000002, 40.573057648999914], [-73.8504438514919, 40.582130243581396], [-73.83929597982016, 40.581863545478186], [-73.82480116623435, 40.587154615369926], [-73.81849901800001, 40.5873623529999]]]}}, {\&quot;id\&quot;: \&quot;201\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20122313630249722, \&quot;OBJECTID\&quot;: 202, \&quot;Shape_Leng\&quot;: 0.0699215712618, \&quot;Shape_Area\&quot;: 0.000106175396322, \&quot;zone\&quot;: \&quot;Roosevelt Island\&quot;, \&quot;LocationID\&quot;: 202, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94180032729437, 40.76904692662474], [-73.95254079336881, 40.757095314537246], [-73.96158304969282, 40.74941430105318], [-73.94472478498723, 40.76978627176733], [-73.94007665725826, 40.77292618617896], [-73.94180032729437, 40.76904692662474]]]}}, {\&quot;id\&quot;: \&quot;202\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2045135499499479, \&quot;OBJECTID\&quot;: 203, \&quot;Shape_Leng\&quot;: 0.189937815868, \&quot;Shape_Area\&quot;: 0.000615129861659, \&quot;zone\&quot;: \&quot;Rosedale\&quot;, \&quot;LocationID\&quot;: 203, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7275350030123, 40.673930284146124], [-73.72833071887973, 40.66304394386548], [-73.72522608103498, 40.652001000073724], [-73.74143706021165, 40.646889178160706], [-73.74227387212949, 40.64012338122567], [-73.739471216134, 40.63570643191466], [-73.74246642615259, 40.635119228252094], [-73.74096487686366, 40.63730477503007], [-73.74397128496219, 40.63788001261484], [-73.7437342150463, 40.6390221176639], [-73.7464954765674, 40.63651030383521], [-73.74516219973704, 40.63811218797305], [-73.74704226024105, 40.636932365240085], [-73.74631467883957, 40.641394313090785], [-73.7487767478731, 40.64511819098248], [-73.75522386899995, 40.64744446899989], [-73.7541108669999, 40.648697664999915], [-73.76406290099993, 40.65435626599989], [-73.76165732899996, 40.658238085999855], [-73.74867194699979, 40.65267808799992], [-73.74332546799988, 40.652537803999905], [-73.74328714099991, 40.65613473199991], [-73.74853177199994, 40.65757569699993], [-73.74281884699987, 40.66530554899986], [-73.73891022900001, 40.66595449199986], [-73.74117817299991, 40.666402953999885], [-73.72718272499995, 40.68359732999987], [-73.72586264191175, 40.683241080973865], [-73.72563005109944, 40.67958795089065], [-73.7275350030123, 40.673930284146124]]]}}, {\&quot;id\&quot;: \&quot;203\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24250863084994317, \&quot;OBJECTID\&quot;: 204, \&quot;Shape_Leng\&quot;: 0.101912418311, \&quot;Shape_Area\&quot;: 0.000641384265972, \&quot;zone\&quot;: \&quot;Rossville/Woodrow\&quot;, \&quot;LocationID\&quot;: 204, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.2032648999999, 40.55562847699989], [-74.19174368799999, 40.53191669699986], [-74.20152661599995, 40.526265205999934], [-74.2156723039999, 40.52395762799989], [-74.21800676499996, 40.53229858999995], [-74.21776941599994, 40.54112662999992], [-74.22131562699998, 40.55025307399992], [-74.21784397799998, 40.55443271799988], [-74.21050789400002, 40.557064181999934], [-74.205854485, 40.55750245699993], [-74.2032648999999, 40.55562847699989]]]}}, {\&quot;id\&quot;: \&quot;204\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2272722620789881, \&quot;OBJECTID\&quot;: 205, \&quot;Shape_Leng\&quot;: 0.141953388327, \&quot;Shape_Area\&quot;: 0.000766216513505, \&quot;zone\&quot;: \&quot;Saint Albans\&quot;, \&quot;LocationID\&quot;: 205, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.766369252, 40.70256339699992], [-73.75205066499986, 40.70522802799995], [-73.74863325999986, 40.6954447609999], [-73.7435928609999, 40.69621532499986], [-73.75576169199995, 40.67588590899988], [-73.76380484799996, 40.67376993299995], [-73.77469730199986, 40.680486045999906], [-73.77220275299989, 40.681610338999896], [-73.7732870399999, 40.683454731999866], [-73.77699767599997, 40.68628268899992], [-73.77966850599998, 40.685377122999945], [-73.7832662499999, 40.68999429299992], [-73.78078155499992, 40.69102994299994], [-73.77977295099997, 40.689281169999916], [-73.77789337399993, 40.68991768999992], [-73.7802372379999, 40.692972334999894], [-73.77230768699997, 40.70057150699989], [-73.77559218799982, 40.70532930899986], [-73.7749009329999, 40.707066661999875], [-73.76844546499984, 40.709637026999886], [-73.766369252, 40.70256339699992]]]}}, {\&quot;id\&quot;: \&quot;205\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21166864022103807, \&quot;OBJECTID\&quot;: 206, \&quot;Shape_Leng\&quot;: 0.212756793386, \&quot;Shape_Area\&quot;: 0.000944392507762, \&quot;zone\&quot;: \&quot;Saint George/New Brighton\&quot;, \&quot;LocationID\&quot;: 206, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08221272914942, 40.64828016229008], [-74.07165829759784, 40.64503374643502], [-74.07093784471476, 40.64334596384062], [-74.07210952444638, 40.64246321679278], [-74.07032923715386, 40.64252612813239], [-74.07314400586021, 40.641852974480116], [-74.07019399559213, 40.6420075028053], [-74.07289005609624, 40.64092267287602], [-74.06998354653952, 40.64106894311676], [-74.07285041194942, 40.64080368844508], [-74.07258133886755, 40.63794187429597], [-74.07865269699992, 40.63830402499987], [-74.08373397299994, 40.63573714399991], [-74.08870582299987, 40.63684520599986], [-74.09242513499994, 40.63558181299992], [-74.09409312599998, 40.639266913999975], [-74.09767290799995, 40.63896067899989], [-74.09787969199995, 40.64035805499988], [-74.10974833299994, 40.63786583299993], [-74.11765722499996, 40.638062466999905], [-74.11614321199995, 40.62870226399988], [-74.1132624959999, 40.62305442499995], [-74.12125677899994, 40.62782274999989], [-74.1313098529999, 40.62632834299998], [-74.12867047299994, 40.63734826499993], [-74.1268887269999, 40.637210087999925], [-74.12705362202625, 40.64024173781949], [-74.11861635236262, 40.641530365028935], [-74.11883624616948, 40.64254186406039], [-74.1171709328468, 40.64162427104175], [-74.1172247008255, 40.64302735996259], [-74.11535082182925, 40.64247054015812], [-74.1097393256449, 40.64546372818479], [-74.09880066885808, 40.64504703431087], [-74.08570754378212, 40.648880553370454], [-74.08221272914942, 40.64828016229008]]]}}, {\&quot;id\&quot;: \&quot;206\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22106390335282308, \&quot;OBJECTID\&quot;: 207, \&quot;Shape_Leng\&quot;: 0.0283756831492, \&quot;Shape_Area\&quot;: 4.47230848441e-05, \&quot;zone\&quot;: \&quot;Saint Michaels Cemetery/Woodside\&quot;, \&quot;LocationID\&quot;: 207, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90137640299986, 40.75964203799989], [-73.90356915599997, 40.765781788999924], [-73.90217951699996, 40.76731584199997], [-73.89349605899986, 40.765950929999924], [-73.89866137899992, 40.75992101699997], [-73.90137640299986, 40.75964203799989]]]}}, {\&quot;id\&quot;: \&quot;207\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19966128241805375, \&quot;OBJECTID\&quot;: 208, \&quot;Shape_Leng\&quot;: 0.214721009581, \&quot;Shape_Area\&quot;: 0.00202032598969, \&quot;zone\&quot;: \&quot;Schuylerville/Edgewater Park\&quot;, \&quot;LocationID\&quot;: 208, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.825986869, 40.84067575199988], [-73.82601252600003, 40.83402077799985], [-73.81552500922504, 40.83597630692601], [-73.81476387691956, 40.830816799993485], [-73.81275469994516, 40.82824823625135], [-73.80992515914596, 40.82817971199259], [-73.81384974851248, 40.8268035287504], [-73.81379523517661, 40.82529808600147], [-73.81211350556435, 40.82555263465937], [-73.81388934712506, 40.82408736742192], [-73.80766604765235, 40.825896992059], [-73.80451800414906, 40.81892768751854], [-73.79759032777322, 40.816507532070055], [-73.80140380968845, 40.8123633086586], [-73.80361390158114, 40.812521106621354], [-73.80453081609834, 40.81425461992442], [-73.80351667337368, 40.81395196364859], [-73.80704600153508, 40.816533693875236], [-73.80505213646254, 40.81289496243412], [-73.80224245334347, 40.81019739366033], [-73.79086475738406, 40.80734114044052], [-73.79028410874172, 40.80481710368888], [-73.7933898228672, 40.804204330036214], [-73.80185524738366, 40.808967826140574], [-73.80392673417204, 40.80852797081171], [-73.8099202908178, 40.81292915226176], [-73.81620056896291, 40.81384747647932], [-73.83017915330238, 40.81083454948945], [-73.8321661704888, 40.80850227767013], [-73.831615744777, 40.80493825599657], [-73.83743612112924, 40.80620264259155], [-73.84043199520461, 40.81254112811847], [-73.83974355921865, 40.816406071751366], [-73.83696070299992, 40.81634054099991], [-73.83614239499985, 40.81919890299987], [-73.83661819699992, 40.82711414899993], [-73.83709061399992, 40.82896714699996], [-73.84233077477266, 40.8290739624537], [-73.83885232384739, 40.83369066784824], [-73.83956700299987, 40.84054722799986], [-73.83771374899992, 40.840406309999885], [-73.83688925199996, 40.84337478799992], [-73.82611300699996, 40.84533869399991], [-73.825986869, 40.84067575199988]]], [[[-73.83960098545435, 40.83567071869858], [-73.83961672561374, 40.835667752627316], [-73.83962599488439, 40.83569971218477], [-73.83960850400152, 40.83570805084221], [-73.83960098545435, 40.83567071869858]]], [[[-73.83979488581072, 40.835619207246324], [-73.8396148723857, 40.83561056836579], [-73.83948374192397, 40.83457420079436], [-73.83959266810578, 40.83456047582325], [-73.83979488581072, 40.835619207246324]]]]}}, {\&quot;id\&quot;: \&quot;208\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20156080292580283, \&quot;OBJECTID\&quot;: 209, \&quot;Shape_Leng\&quot;: 0.0306953113473, \&quot;Shape_Area\&quot;: 3.88703351209e-05, \&quot;zone\&quot;: \&quot;Seaport\&quot;, \&quot;LocationID\&quot;: 209, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00499805099996, 40.71201189699987], [-73.99919451154408, 40.707947376175724], [-74.00143661179398, 40.70487217770521], [-74.00906264699988, 40.71088670399993], [-74.00499805099996, 40.71201189699987]]]}}, {\&quot;id\&quot;: \&quot;209\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.25580338073910863, \&quot;OBJECTID\&quot;: 210, \&quot;Shape_Leng\&quot;: 0.114851983372, \&quot;Shape_Area\&quot;: 0.000453155131253, \&quot;zone\&quot;: \&quot;Sheepshead Bay\&quot;, \&quot;LocationID\&quot;: 210, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92759936700004, 40.5950607789999], [-73.91805571865743, 40.58643685311621], [-73.92520361514241, 40.58580627115536], [-73.92802185276429, 40.588068756350886], [-73.9239529485009, 40.59113985052502], [-73.92863061415638, 40.58857263642073], [-73.92844090493661, 40.589030428141996], [-73.9291344038264, 40.588879241681944], [-73.92875703499415, 40.589152966925], [-73.92976615773313, 40.589292069447644], [-73.93003427450557, 40.58942599650075], [-73.93057705718242, 40.589890641203176], [-73.93010325988745, 40.58960610507142], [-73.93001650952081, 40.5940945360621], [-73.93260420556844, 40.59492954452495], [-73.93121294858955, 40.58953130811921], [-73.92972846380192, 40.58861391582969], [-73.93125191267133, 40.58684982521422], [-73.92857393936458, 40.58706150237135], [-73.92552860874584, 40.58497837657265], [-73.9344471859999, 40.586652074999925], [-73.96025825899996, 40.58502930799994], [-73.9603495359999, 40.58730628599994], [-73.95619313699986, 40.58776226899994], [-73.956927197, 40.596612075999865], [-73.94248473299992, 40.598200364999855], [-73.94288954099984, 40.600318649999934], [-73.93447158899997, 40.60123151199989], [-73.9335511719998, 40.60268728099991], [-73.92813139699999, 40.59777792799987], [-73.92956858299992, 40.5968202649999], [-73.92759936700004, 40.5950607789999]]]}}, {\&quot;id\&quot;: \&quot;210\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2083806733799869, \&quot;OBJECTID\&quot;: 211, \&quot;Shape_Leng\&quot;: 0.0252345082132, \&quot;Shape_Area\&quot;: 3.97291966087e-05, \&quot;zone\&quot;: \&quot;SoHo\&quot;, \&quot;LocationID\&quot;: 211, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.001523638, 40.719820797999944], [-74.00539186699989, 40.722037365999896], [-74.00214891499996, 40.728035366999904], [-73.9967717579999, 40.7254319439999], [-74.001523638, 40.719820797999944]]]}}, {\&quot;id\&quot;: \&quot;211\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22523481603235468, \&quot;OBJECTID\&quot;: 212, \&quot;Shape_Leng\&quot;: 0.0671290653429, \&quot;Shape_Area\&quot;: 0.000161276191858, \&quot;zone\&quot;: \&quot;Soundview/Bruckner\&quot;, \&quot;LocationID\&quot;: 212, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88421976599987, 40.82299645799987], [-73.88378414099992, 40.828274291999946], [-73.87729930499995, 40.8287427739999], [-73.86085019699983, 40.833613537999874], [-73.857391213, 40.83229737199986], [-73.85615112900003, 40.82677004599987], [-73.88421976599987, 40.82299645799987]]]}}, {\&quot;id\&quot;: \&quot;212\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2409995051733899, \&quot;OBJECTID\&quot;: 213, \&quot;Shape_Leng\&quot;: 0.159958783822, \&quot;Shape_Area\&quot;: 0.000904077906339, \&quot;zone\&quot;: \&quot;Soundview/Castle Hill\&quot;, \&quot;LocationID\&quot;: 213, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.83667856399991, 40.81758876299995], [-73.83696070299992, 40.81634054099991], [-73.84003308726955, 40.81682214096213], [-73.83888231646733, 40.822140489856025], [-73.84228428387955, 40.82864660449135], [-73.83709061399992, 40.82896714699996], [-73.83667856399991, 40.81758876299995]]], [[[-73.84231712480313, 40.82718468468027], [-73.83999860407422, 40.81993494681306], [-73.84198684834051, 40.818774373908084], [-73.84617302872044, 40.81067666443039], [-73.8511447226069, 40.814396548876], [-73.85538030243693, 40.81428888208278], [-73.84903294180673, 40.81211891007852], [-73.84996696802818, 40.808578018843576], [-73.847488226419, 40.805448909149185], [-73.85019839036403, 40.80451002497395], [-73.856614854502, 40.80479692395033], [-73.85866549456955, 40.806833088596065], [-73.85895141221772, 40.810271417586556], [-73.8601269523559, 40.80960549989125], [-73.85935625734362, 40.80898803428646], [-73.85938875426787, 40.80816614120708], [-73.86065222514291, 40.80963668169183], [-73.86765646284456, 40.81058376193711], [-73.87077804885932, 40.814486895487775], [-73.8780628329999, 40.81618263199993], [-73.88244779599998, 40.81926832299992], [-73.8843985489999, 40.822965575999866], [-73.85635677499994, 40.82675208499993], [-73.85513639699997, 40.822436188999866], [-73.84289858800003, 40.82408305899986], [-73.84390624999999, 40.828407828999936], [-73.84231712480313, 40.82718468468027]]]]}}, {\&quot;id\&quot;: \&quot;213\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2380262504761795, \&quot;OBJECTID\&quot;: 214, \&quot;Shape_Leng\&quot;: 0.135300314246, \&quot;Shape_Area\&quot;: 0.000811976523012, \&quot;zone\&quot;: \&quot;South Beach/Dongan Hills\&quot;, \&quot;LocationID\&quot;: 214, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.08491019899996, 40.59570472799985], [-74.08173342999991, 40.59215628599987], [-74.07043976099992, 40.59673474699988], [-74.06436003721248, 40.58826789117477], [-74.07499413073505, 40.57923655741631], [-74.07336118472098, 40.578275488289144], [-74.07508288192615, 40.579160158755506], [-74.08495715819193, 40.57125984002107], [-74.10039083499996, 40.579688665999925], [-74.09844000899997, 40.581241705999915], [-74.10525775499997, 40.58592143599986], [-74.10088251699995, 40.59017921599992], [-74.09979588999995, 40.59387136599988], [-74.09375453799998, 40.59674488999988], [-74.08983655899989, 40.60077409499996], [-74.08218729299988, 40.601941007999876], [-74.08130343799999, 40.59938765599991], [-74.08532650099991, 40.59700832199995], [-74.08491019899996, 40.59570472799985]]]}}, {\&quot;id\&quot;: \&quot;214\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20337276167364543, \&quot;OBJECTID\&quot;: 215, \&quot;Shape_Leng\&quot;: 0.103556453625, \&quot;Shape_Area\&quot;: 0.000395647022725, \&quot;zone\&quot;: \&quot;South Jamaica\&quot;, \&quot;LocationID\&quot;: 215, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7769103769999, 40.70252488499994], [-73.77395659499986, 40.699805781999906], [-73.7802372379999, 40.692972334999894], [-73.77789337399993, 40.68991768999992], [-73.77977295099997, 40.689281169999916], [-73.78078155499992, 40.69102994299994], [-73.793908417, 40.68630469099985], [-73.79561486799987, 40.688656890999916], [-73.79995042799996, 40.68682771899991], [-73.79898209099994, 40.68485873799988], [-73.80576840199991, 40.682932390999916], [-73.81063298299996, 40.69194738299988], [-73.80890216900004, 40.69256434899993], [-73.80642479399984, 40.690873857999904], [-73.79260506799987, 40.70043209999988], [-73.79239170299988, 40.7021665299999], [-73.78256582599995, 40.70542486399989], [-73.78034491200003, 40.70541241699986], [-73.7769103769999, 40.70252488499994]]]}}, {\&quot;id\&quot;: \&quot;215\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2098709574326453, \&quot;OBJECTID\&quot;: 216, \&quot;Shape_Leng\&quot;: 0.116797554681, \&quot;Shape_Area\&quot;: 0.000816076647781, \&quot;zone\&quot;: \&quot;South Ozone Park\&quot;, \&quot;LocationID\&quot;: 216, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.80857655199986, 40.688330889999925], [-73.80142836799988, 40.673666833999874], [-73.80203207699995, 40.66524802499994], [-73.81496922499986, 40.66247266799991], [-73.832705339, 40.665405772999854], [-73.84012856099982, 40.6811466509999], [-73.83697486299991, 40.6819880179999], [-73.83807769099997, 40.68423890999988], [-73.82753021399995, 40.687239482999914], [-73.82851136799994, 40.689239055999934], [-73.82599347399987, 40.689953661999894], [-73.82501128899997, 40.68795231799991], [-73.81063298299996, 40.69194738299988], [-73.80857655199986, 40.688330889999925]]]}}, {\&quot;id\&quot;: \&quot;216\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21720397511326678, \&quot;OBJECTID\&quot;: 217, \&quot;Shape_Leng\&quot;: 0.0553905251285, \&quot;Shape_Area\&quot;: 0.000114733270758, \&quot;zone\&quot;: \&quot;South Williamsburg\&quot;, \&quot;LocationID\&quot;: 217, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95554165799997, 40.70759344799989], [-73.94705205299991, 40.70366394899985], [-73.95128819399989, 40.700922364999855], [-73.95381196900003, 40.703180979999914], [-73.95745736399992, 40.70082260299993], [-73.95701993199991, 40.69897391399995], [-73.96283963699993, 40.698038667999946], [-73.96217978199998, 40.70022070999989], [-73.96838933699995, 40.70682918699989], [-73.95554165799997, 40.70759344799989]]]}}, {\&quot;id\&quot;: \&quot;217\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22582323002551435, \&quot;OBJECTID\&quot;: 218, \&quot;Shape_Leng\&quot;: 0.0837008281049, \&quot;Shape_Area\&quot;: 0.000281293736407, \&quot;zone\&quot;: \&quot;Springfield Gardens North\&quot;, \&quot;LocationID\&quot;: 218, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76561573099998, 40.6747790199999], [-73.76380484799996, 40.67376993299995], [-73.76031463999993, 40.67510997099984], [-73.75857198899986, 40.67263733099987], [-73.75636239300002, 40.67242923699999], [-73.75763129599993, 40.66645115699992], [-73.77342462799993, 40.66802761899988], [-73.78940999399987, 40.66684115899995], [-73.78808647399985, 40.6730096269999], [-73.78573730899993, 40.67238503499988], [-73.77722923600001, 40.679652720999904], [-73.77469730199986, 40.680486045999906], [-73.76561573099998, 40.6747790199999]]]}}, {\&quot;id\&quot;: \&quot;218\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20879320172163654, \&quot;OBJECTID\&quot;: 219, \&quot;Shape_Leng\&quot;: 0.155126669675, \&quot;Shape_Area\&quot;: 0.000428176336771, \&quot;zone\&quot;: \&quot;Springfield Gardens South\&quot;, \&quot;LocationID\&quot;: 219, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.761822313, 40.666877759999856], [-73.73856469500002, 40.66639689799991], [-73.74450922599979, 40.663821277999865], [-73.74853177199994, 40.65757569699993], [-73.74328714099991, 40.65613473199991], [-73.74332546899993, 40.65253780399992], [-73.74867194699979, 40.65267808799992], [-73.76165732899996, 40.658238085999855], [-73.76406290099993, 40.65435626599989], [-73.78321833499997, 40.663166283999864], [-73.80203207699995, 40.66524802499994], [-73.80155565300004, 40.6667533639999], [-73.77342462799993, 40.66802761899988], [-73.761822313, 40.666877759999856]]]}}, {\&quot;id\&quot;: \&quot;219\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.24984324430717308, \&quot;OBJECTID\&quot;: 220, \&quot;Shape_Leng\&quot;: 0.106015943267, \&quot;Shape_Area\&quot;: 0.000313035744467, \&quot;zone\&quot;: \&quot;Spuyten Duyvil/Kingsbridge\&quot;, \&quot;LocationID\&quot;: 220, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89827216899992, 40.8894579429999], [-73.89972588599989, 40.88651488699985], [-73.89661546599986, 40.885955255999946], [-73.90369454799992, 40.878501617999895], [-73.90608130599988, 40.873239628999904], [-73.90746489699994, 40.87354735399985], [-73.9068187309999, 40.87661958799993], [-73.91033193599998, 40.879038046999895], [-73.91775669364831, 40.8756636279301], [-73.92490327486523, 40.87888836792653], [-73.92058641888602, 40.88718267830985], [-73.91489276999991, 40.8846247709999], [-73.90900536, 40.88950014099986], [-73.90413642399992, 40.887080708999896], [-73.9028594909999, 40.88916474399989], [-73.89827216899992, 40.8894579429999]]]}}, {\&quot;id\&quot;: \&quot;220\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19856595619290837, \&quot;OBJECTID\&quot;: 221, \&quot;Shape_Leng\&quot;: 0.166218220846, \&quot;Shape_Area\&quot;: 0.000890111567051, \&quot;zone\&quot;: \&quot;Stapleton\&quot;, \&quot;LocationID\&quot;: 221, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.07530550099992, 40.637729958999955], [-74.07053959705199, 40.63747140462426], [-74.07341562632824, 40.63689395096554], [-74.07209483807503, 40.63664727762461], [-74.07335822045584, 40.63653609416517], [-74.0729847461233, 40.630308978981404], [-74.06802173543946, 40.62878758518541], [-74.07291177936548, 40.62999637940653], [-74.07225500955778, 40.62460875019394], [-74.06975543088323, 40.6212081398724], [-74.06544586069478, 40.61920262828925], [-74.06668207982919, 40.61806749593851], [-74.06425721751587, 40.61817168758555], [-74.06509908407213, 40.61751095612543], [-74.05685812390232, 40.608056357772554], [-74.0651709129999, 40.604213507999894], [-74.06350565699996, 40.60215005499991], [-74.07399965299999, 40.60572556699987], [-74.0815547009999, 40.60629029699987], [-74.0714060829999, 40.61943137899991], [-74.07253551699989, 40.622464021999896], [-74.08720982799996, 40.61330697299989], [-74.0878234189999, 40.615087934999885], [-74.08415419899998, 40.626267114999905], [-74.07972492199995, 40.62895068799986], [-74.08574928999992, 40.633955556999865], [-74.07878831099995, 40.63826855899991], [-74.07530550099992, 40.637729958999955]]]}}, {\&quot;id\&quot;: \&quot;221\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21978536087443468, \&quot;OBJECTID\&quot;: 222, \&quot;Shape_Leng\&quot;: 0.0483893527976, \&quot;Shape_Area\&quot;: 0.000130268343918, \&quot;zone\&quot;: \&quot;Starrett City\&quot;, \&quot;LocationID\&quot;: 222, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.87908517399995, 40.65020211699988], [-73.8745808109999, 40.64561010599992], [-73.87841589406925, 40.638912189353306], [-73.88006714132425, 40.64200344662675], [-73.88341999203011, 40.64452381564944], [-73.88557762124442, 40.644040950146135], [-73.88764072166725, 40.64780239000726], [-73.89125147199995, 40.65002559699993], [-73.88221364899994, 40.65451863799996], [-73.87908517399995, 40.65020211699988]]], [[[-73.8882853135604, 40.64672241327608], [-73.88864137620679, 40.647079553158], [-73.88851637568528, 40.64736069152191], [-73.88820050726648, 40.647140869529046], [-73.8882853135604, 40.64672241327608]]]]}}, {\&quot;id\&quot;: \&quot;222\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2201778840572781, \&quot;OBJECTID\&quot;: 223, \&quot;Shape_Leng\&quot;: 0.166021925275, \&quot;Shape_Area\&quot;: 0.00076436070058, \&quot;zone\&quot;: \&quot;Steinway\&quot;, \&quot;LocationID\&quot;: 223, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90649492923363, 40.7901809903447], [-73.90032629743816, 40.789007662825696], [-73.8959296297551, 40.785648944313756], [-73.89874897638398, 40.78278115576602], [-73.90114577552107, 40.78271110609054], [-73.90257929672345, 40.78028912083556], [-73.89437777934127, 40.78424320348422], [-73.89606377738421, 40.783157201805224], [-73.895284679113, 40.78154124925482], [-73.89274917876409, 40.78296570668481], [-73.89165459123714, 40.78219478153064], [-73.89300986180193, 40.78179802356213], [-73.89119589704391, 40.77856328788702], [-73.89251064542336, 40.77739286927271], [-73.89183244902246, 40.77488019994431], [-73.88945486901865, 40.77353295106357], [-73.88770661799987, 40.76683859799995], [-73.89349605899986, 40.765950929999924], [-73.91759120499997, 40.769900870999926], [-73.92398142900002, 40.77461511299991], [-73.92375761299998, 40.77654701199991], [-73.91796581399993, 40.78125629199991], [-73.91996458796496, 40.78263506876824], [-73.912599859115, 40.78937632963394], [-73.90985862925774, 40.790945493781884], [-73.90649492923363, 40.7901809903447]]]}}, {\&quot;id\&quot;: \&quot;223\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2023397908303294, \&quot;OBJECTID\&quot;: 224, \&quot;Shape_Leng\&quot;: 0.0440204462769, \&quot;Shape_Area\&quot;: 9.84786989135e-05, \&quot;zone\&quot;: \&quot;Stuy Town/Peter Cooper Village\&quot;, \&quot;LocationID\&quot;: 224, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97511055399991, 40.735390254999864], [-73.97151882628022, 40.72935136174009], [-73.97162697285862, 40.72662845299842], [-73.98255629299986, 40.731350133999875], [-73.97849845599995, 40.73679095699989], [-73.97511055399991, 40.735390254999864]]]}}, {\&quot;id\&quot;: \&quot;224\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2502146360440248, \&quot;OBJECTID\&quot;: 225, \&quot;Shape_Leng\&quot;: 0.0887992073281, \&quot;Shape_Area\&quot;: 0.000310835395162, \&quot;zone\&quot;: \&quot;Stuyvesant Heights\&quot;, \&quot;LocationID\&quot;: 225, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91741294299999, 40.68403405199993], [-73.9163011989999, 40.67857711199991], [-73.92183500099998, 40.67894555899991], [-73.92281374299995, 40.68341442999991], [-73.93500821699992, 40.68276376799985], [-73.93435066499993, 40.67956340799991], [-73.94032794, 40.679889974999874], [-73.94394947299996, 40.698221278999924], [-73.93817718599986, 40.69864022299987], [-73.91804607, 40.68721324799989], [-73.91741294299999, 40.68403405199993]]]}}, {\&quot;id\&quot;: \&quot;225\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20844430739268255, \&quot;OBJECTID\&quot;: 226, \&quot;Shape_Leng\&quot;: 0.168957762041, \&quot;Shape_Area\&quot;: 0.00076194414504, \&quot;zone\&quot;: \&quot;Sunnyside\&quot;, \&quot;LocationID\&quot;: 226, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90989961499994, 40.749087274999944], [-73.91187504099992, 40.74822079599992], [-73.9119412979999, 40.742382948999925], [-73.91567469599988, 40.740784929999904], [-73.91903825199986, 40.73200596599987], [-73.917342506, 40.731382825999916], [-73.91796696699996, 40.7285007709999], [-73.91205021299994, 40.72850636299993], [-73.91174734199988, 40.72991203299991], [-73.90712253099991, 40.727424727999924], [-73.91384828299984, 40.72289841199989], [-73.91132095099978, 40.71962422999992], [-73.92232773978448, 40.71659264406108], [-73.92515207271921, 40.722335339820816], [-73.9244229875485, 40.723589975986165], [-73.92037064235664, 40.723681113821044], [-73.92490316165177, 40.72450657567146], [-73.92923485876162, 40.72826016576104], [-73.93804478507161, 40.730509967846054], [-73.94162472636452, 40.73584144233816], [-73.94594410333028, 40.73751251570048], [-73.94140886345744, 40.73929957085316], [-73.93869664599998, 40.738140816999866], [-73.93726110699994, 40.745176490999896], [-73.94401030399996, 40.7436394539999], [-73.93383269399993, 40.7516047019999], [-73.91547326299991, 40.75379181799991], [-73.91035492999984, 40.75274990899987], [-73.90989961499994, 40.749087274999944]]]}}, {\&quot;id\&quot;: \&quot;226\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.6067164249108072, \&quot;OBJECTID\&quot;: 227, \&quot;Shape_Leng\&quot;: 0.0828301570789, \&quot;Shape_Area\&quot;: 0.000268316529534, \&quot;zone\&quot;: \&quot;Sunset Park East\&quot;, \&quot;LocationID\&quot;: 227, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.991928124, 40.6422049039999], [-73.9955103369999, 40.63980966699993], [-73.99917564699989, 40.642025441999934], [-74.00735636699996, 40.6341636269999], [-74.00556490399993, 40.63308317599992], [-74.01000340799995, 40.630113088999906], [-74.01602010100001, 40.63331711399997], [-74.016835401, 40.63535542899995], [-74.0139608859999, 40.63815326699995], [-74.01616711499993, 40.63948244099991], [-74.00214474699993, 40.65295610699995], [-73.98905872499985, 40.64411924099995], [-73.991928124, 40.6422049039999]]]}}, {\&quot;id\&quot;: \&quot;227\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2527603720000839, \&quot;OBJECTID\&quot;: 228, \&quot;Shape_Leng\&quot;: 0.177685177706, \&quot;Shape_Area\&quot;: 0.000993414783816, \&quot;zone\&quot;: \&quot;Sunset Park West\&quot;, \&quot;LocationID\&quot;: 228, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9969179149999, 40.6691534839999], [-73.99490350099988, 40.6667854349999], [-73.99692689899985, 40.664374914999925], [-73.99063545399997, 40.660579088999896], [-73.988716511, 40.66240493799995], [-73.98725068899996, 40.66037895599992], [-73.990188415, 40.657600817999906], [-73.99516890199999, 40.659669521999945], [-74.01616711499993, 40.63948244099991], [-74.0139608859999, 40.63815326699995], [-74.016835401, 40.63535542899995], [-74.02141038399992, 40.638584902999845], [-74.02108051399998, 40.64149093699994], [-74.02475437599998, 40.6381214179999], [-74.03266558998958, 40.643720344890056], [-74.03051830863413, 40.645274425208974], [-74.02820569545007, 40.644015982890345], [-74.02604948400315, 40.64626135032611], [-74.0293899048662, 40.64880405511391], [-74.02571758804807, 40.64661549229093], [-74.02461487103106, 40.64715112511878], [-74.02622102475574, 40.64824842780924], [-74.02414566050564, 40.647615101259845], [-74.02605133196793, 40.6509943007431], [-74.02285141795983, 40.651169195161685], [-74.02522662972656, 40.652829856959634], [-74.02154138319214, 40.650671622911226], [-74.02380703903121, 40.65304472851146], [-74.02118670027885, 40.652839836895325], [-74.02320464727141, 40.654096116817925], [-74.0186223830857, 40.653491349022964], [-74.02005182454292, 40.655335948874416], [-74.01715319581021, 40.65477510436213], [-74.01970596410222, 40.656581163751035], [-74.01639437533773, 40.65562064285071], [-74.01910843803118, 40.657368884303494], [-74.01585370056823, 40.65621324055534], [-74.01786573109669, 40.65830844729852], [-74.01442130484548, 40.657608021951376], [-74.01745803087898, 40.6594501973867], [-74.01554165388997, 40.66075835547614], [-74.01183862056543, 40.65891283727472], [-74.0131555493881, 40.66198159772593], [-74.00859956968284, 40.65952092309827], [-74.00745858163884, 40.66055847620986], [-74.0103720129723, 40.66239888023248], [-74.00955074142026, 40.6632676941304], [-74.0034880110065, 40.66224055612849], [-74.00599748682693, 40.66325861082859], [-74.00772133506703, 40.66471863301977], [-74.0071253264673, 40.66491521847423], [-74.00362862508561, 40.66273484753458], [-74.00486193792649, 40.66506482193817], [-74.00083401108444, 40.66300644269171], [-73.99953152609916, 40.6643974859369], [-74.00292463516384, 40.66646231216332], [-73.99998149339123, 40.66745027490869], [-73.99902600998384, 40.66844297212693], [-73.9986188799999, 40.67183017199989], [-73.9969179149999, 40.6691534839999]]]}}, {\&quot;id\&quot;: \&quot;228\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20838347666004042, \&quot;OBJECTID\&quot;: 229, \&quot;Shape_Leng\&quot;: 0.0425252900116, \&quot;Shape_Area\&quot;: 9.47058230931e-05, \&quot;zone\&quot;: \&quot;Sutton Place/Turtle Bay North\&quot;, \&quot;LocationID\&quot;: 229, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96162927534907, 40.75515238425915], [-73.96482214210387, 40.75159632579112], [-73.9712170449999, 40.75519332399994], [-73.9665833839999, 40.76155093499988], [-73.95877790811335, 40.75827092092435], [-73.96162927534907, 40.75515238425915]]]}}, {\&quot;id\&quot;: \&quot;229\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22121627185013748, \&quot;OBJECTID\&quot;: 230, \&quot;Shape_Leng\&quot;: 0.0310283096779, \&quot;Shape_Area\&quot;: 5.60914463266e-05, \&quot;zone\&quot;: \&quot;Times Sq/Theatre District\&quot;, \&quot;LocationID\&quot;: 230, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98362433299988, 40.75551634599986], [-73.98979085399996, 40.7572331319999], [-73.98428230099987, 40.76479181499994], [-73.97860169399989, 40.762396071999945], [-73.98362433299988, 40.75551634599986]]]}}, {\&quot;id\&quot;: \&quot;230\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20480204546289757, \&quot;OBJECTID\&quot;: 231, \&quot;Shape_Leng\&quot;: 0.0634201165587, \&quot;Shape_Area\&quot;: 0.000166929752992, \&quot;zone\&quot;: \&quot;TriBeCa/Civic Center\&quot;, \&quot;LocationID\&quot;: 231, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00931760399995, 40.72470155099989], [-73.99995620900002, 40.71801709499987], [-74.00485768099996, 40.7124525409999], [-74.00834760999993, 40.71135854599987], [-74.01375388499997, 40.71369055499987], [-74.01244109199989, 40.719057672999874], [-74.01457231438083, 40.72027413774219], [-74.01296558526825, 40.720328675587126], [-74.01102457999994, 40.72579386199991], [-74.00931760399995, 40.72470155099989]]]}}, {\&quot;id\&quot;: \&quot;231\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2053885710041709, \&quot;OBJECTID\&quot;: 232, \&quot;Shape_Leng\&quot;: 0.0614709085331, \&quot;Shape_Area\&quot;: 0.000216049973456, \&quot;zone\&quot;: \&quot;Two Bridges/Seward Park\&quot;, \&quot;LocationID\&quot;: 232, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97635525199995, 40.71913288399983], [-73.97347975524508, 40.7188614291129], [-73.97782091638247, 40.71064544490706], [-73.9919434659999, 40.70958905299992], [-73.99256242199989, 40.71438807699996], [-73.99022012699989, 40.71440493999988], [-73.98382387299982, 40.72147287199987], [-73.97635525199995, 40.71913288399983]]]}}, {\&quot;id\&quot;: \&quot;232\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2093244003439885, \&quot;OBJECTID\&quot;: 233, \&quot;Shape_Leng\&quot;: 0.048035918294, \&quot;Shape_Area\&quot;: 0.000116188094682, \&quot;zone\&quot;: \&quot;UN/Turtle Bay South\&quot;, \&quot;LocationID\&quot;: 233, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.96547092299994, 40.75193959699991], [-73.97123301520192, 40.743414663960074], [-73.97350835000003, 40.7437820339999], [-73.97121971999988, 40.74692154099996], [-73.9758346669999, 40.74886314599996], [-73.9712170449999, 40.75519332399994], [-73.96547092299994, 40.75193959699991]]], [[[-73.96421230395673, 40.74660431847665], [-73.96444522752618, 40.74641042576318], [-73.96458318426942, 40.746454400673315], [-73.96415980288437, 40.74686554735954], [-73.96421230395673, 40.74660431847665]]]]}}, {\&quot;id\&quot;: \&quot;233\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21232037209124394, \&quot;OBJECTID\&quot;: 234, \&quot;Shape_Leng\&quot;: 0.0360721994984, \&quot;Shape_Area\&quot;: 7.31054382894e-05, \&quot;zone\&quot;: \&quot;Union Sq\&quot;, \&quot;LocationID\&quot;: 234, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98996936399989, 40.73490456699994], [-73.99683993899998, 40.73736088899995], [-73.99051761299985, 40.746038637999895], [-73.98407485299995, 40.74332471799989], [-73.98996936399989, 40.73490456699994]]]}}, {\&quot;id\&quot;: \&quot;234\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2623165632922229, \&quot;OBJECTID\&quot;: 235, \&quot;Shape_Leng\&quot;: 0.0761668426519, \&quot;Shape_Area\&quot;: 0.000212844547337, \&quot;zone\&quot;: \&quot;University Heights/Morris Heights\&quot;, \&quot;LocationID\&quot;: 235, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90947862999988, 40.86180812899987], [-73.91328437000003, 40.859618600999944], [-73.90976165899988, 40.857182611999896], [-73.90679734899983, 40.85937358899988], [-73.90468371399987, 40.85706030199991], [-73.91416184199993, 40.845179187999925], [-73.92808209386837, 40.84539159691672], [-73.91422824049913, 40.862490790359615], [-73.90947862999988, 40.86180812899987]]]}}, {\&quot;id\&quot;: \&quot;235\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20648591384041076, \&quot;OBJECTID\&quot;: 236, \&quot;Shape_Leng\&quot;: 0.0442519223099, \&quot;Shape_Area\&quot;: 0.000102864345211, \&quot;zone\&quot;: \&quot;Upper East Side North\&quot;, \&quot;LocationID\&quot;: 236, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95779380499984, 40.773599896999926], [-73.96468735799992, 40.77567708199994], [-73.9557773589999, 40.78791392399995], [-73.94933170599992, 40.78519312699994], [-73.95779380499984, 40.773599896999926]]]}}, {\&quot;id\&quot;: \&quot;236\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21094145359954042, \&quot;OBJECTID\&quot;: 237, \&quot;Shape_Leng\&quot;: 0.0422126003388, \&quot;Shape_Area\&quot;: 9.59873206621e-05, \&quot;zone\&quot;: \&quot;Upper East Side South\&quot;, \&quot;LocationID\&quot;: 237, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9661274729999, 40.762179299999914], [-73.97301487199995, 40.76427887899991], [-73.96468735799992, 40.77567708199994], [-73.95825534899998, 40.772965336999896], [-73.9661274729999, 40.762179299999914]]]}}, {\&quot;id\&quot;: \&quot;237\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20696143472837536, \&quot;OBJECTID\&quot;: 238, \&quot;Shape_Leng\&quot;: 0.0601093114033, \&quot;Shape_Area\&quot;: 0.000184763693765, \&quot;zone\&quot;: \&quot;Upper West Side North\&quot;, \&quot;LocationID\&quot;: 238, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96884378999985, 40.78596738899994], [-73.98188645923244, 40.7905165804675], [-73.97639951965265, 40.79827321084623], [-73.96417598599989, 40.79236204499989], [-73.96884378999985, 40.78596738899994]]]}}, {\&quot;id\&quot;: \&quot;238\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21181264080136739, \&quot;OBJECTID\&quot;: 239, \&quot;Shape_Leng\&quot;: 0.0636261152958, \&quot;Shape_Area\&quot;: 0.000204715440774, \&quot;zone\&quot;: \&quot;Upper West Side South\&quot;, \&quot;LocationID\&quot;: 239, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97501417199996, 40.78768560599987], [-73.96933573299991, 40.78529327999992], [-73.97499744000007, 40.77753254599988], [-73.98507184299989, 40.781779680999946], [-73.98567936099997, 40.780312632999944], [-73.9881274613434, 40.78140179672366], [-73.98546581197031, 40.78536070057545], [-73.98711901394246, 40.7852103190041], [-73.98542932126932, 40.78541394218458], [-73.98465507883023, 40.78653474180792], [-73.98594956155647, 40.78648711396651], [-73.98188645923244, 40.7905165804675], [-73.97501417199996, 40.78768560599987]]]}}, {\&quot;id\&quot;: \&quot;239\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.3395252354336962, \&quot;OBJECTID\&quot;: 240, \&quot;Shape_Leng\&quot;: 0.146069764379, \&quot;Shape_Area\&quot;: 0.000722130920707, \&quot;zone\&quot;: \&quot;Van Cortlandt Park\&quot;, \&quot;LocationID\&quot;: 240, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87643743099994, 40.89687059299995], [-73.8771197409999, 40.895468663999964], [-73.87048672599987, 40.896640210999905], [-73.86135927899984, 40.89466231899991], [-73.86943471300005, 40.87812919899994], [-73.87094367500002, 40.87851076699998], [-73.87024100099985, 40.88022935299995], [-73.87494589799991, 40.87994766899988], [-73.87467601499999, 40.88156285199993], [-73.87812594399992, 40.88215382599989], [-73.87803562399996, 40.887118321999885], [-73.88124422499992, 40.88270963299992], [-73.89972588499982, 40.886514886999926], [-73.89643170799987, 40.89365527899989], [-73.89663333831646, 40.91141737492314], [-73.86789043706806, 40.90298695407611], [-73.87643743099994, 40.89687059299995]]]}}, {\&quot;id\&quot;: \&quot;240\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.280474301843297, \&quot;OBJECTID\&quot;: 241, \&quot;Shape_Leng\&quot;: 0.0687645777649, \&quot;Shape_Area\&quot;: 0.00025467697592, \&quot;zone\&quot;: \&quot;Van Cortlandt Village\&quot;, \&quot;LocationID\&quot;: 241, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88840157099996, 40.88441707499993], [-73.88705142599984, 40.884349575999906], [-73.88567517999988, 40.87887251099986], [-73.88937163799984, 40.87338229799993], [-73.8879350369998, 40.87203023199988], [-73.89438130299995, 40.866068850999966], [-73.89891854299988, 40.86965857399992], [-73.89942436199988, 40.86788083799993], [-73.90374975899987, 40.86959562699992], [-73.90608130599988, 40.873239628999904], [-73.89855059899999, 40.88437472699996], [-73.89661546599986, 40.885955255999946], [-73.88840157099996, 40.88441707499993]]]}}, {\&quot;id\&quot;: \&quot;241\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23964565561431272, \&quot;OBJECTID\&quot;: 242, \&quot;Shape_Leng\&quot;: 0.138136446433, \&quot;Shape_Area\&quot;: 0.000360072450014, \&quot;zone\&quot;: \&quot;Van Nest/Morris Park\&quot;, \&quot;LocationID\&quot;: 242, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83593362199987, 40.84840635599993], [-73.83771374799997, 40.84040630999987], [-73.84204144699997, 40.84064589699992], [-73.84458129199986, 40.838535507999914], [-73.85052278099987, 40.84278948899985], [-73.87359713599987, 40.83979855499992], [-73.86804200399997, 40.8448138389999], [-73.86860515599989, 40.85206864599991], [-73.86303938099996, 40.850611306999944], [-73.86250923799993, 40.84836228099987], [-73.85457388299992, 40.85150834599995], [-73.85304526899994, 40.849547331999865], [-73.84430846999992, 40.85119046399989], [-73.84494053799982, 40.8482182209999], [-73.84049767399992, 40.8541841049999], [-73.83499552599994, 40.85657120099989], [-73.8368191849999, 40.85727680899989], [-73.82847346699995, 40.860731352999906], [-73.83283502299986, 40.8560358449999], [-73.83129157699989, 40.85543410499991], [-73.83463970199993, 40.853817993999904], [-73.83593362199987, 40.84840635599993]]]}}, {\&quot;id\&quot;: \&quot;242\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20627447361808154, \&quot;OBJECTID\&quot;: 243, \&quot;Shape_Leng\&quot;: 0.0943314999364, \&quot;Shape_Area\&quot;: 0.000438377341503, \&quot;zone\&quot;: \&quot;Washington Heights North\&quot;, \&quot;LocationID\&quot;: 243, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93156536999994, 40.86958215799991], [-73.92474153399992, 40.86159363799992], [-73.92709951599986, 40.85827552099992], [-73.92467094699998, 40.8568108889999], [-73.92747680599985, 40.85069436999992], [-73.93139355399987, 40.84742823099985], [-73.94203871799984, 40.851931028999914], [-73.94317806099995, 40.84979994299991], [-73.94692626452422, 40.850528055834154], [-73.94186996426673, 40.853867739442755], [-73.93156536999994, 40.86958215799991]]]}}, {\&quot;id\&quot;: \&quot;243\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19844548136535045, \&quot;OBJECTID\&quot;: 244, \&quot;Shape_Leng\&quot;: 0.0805686044599, \&quot;Shape_Area\&quot;: 0.000359702747951, \&quot;zone\&quot;: \&quot;Washington Heights South\&quot;, \&quot;LocationID\&quot;: 244, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94068822000003, 40.85131543299985], [-73.93139355399987, 40.84742823099985], [-73.93556697199989, 40.841712527999924], [-73.93505508799984, 40.8393332359999], [-73.94034643299983, 40.8304578419999], [-73.95015521048293, 40.83439675940791], [-73.94612416421772, 40.84389249655712], [-73.9469644175959, 40.85046552581819], [-73.94317806099984, 40.84979994399989], [-73.94203871799984, 40.851931028999914], [-73.94068822000003, 40.85131543299985]]]}}, {\&quot;id\&quot;: \&quot;244\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.31326437153170633, \&quot;OBJECTID\&quot;: 245, \&quot;Shape_Leng\&quot;: 0.0959830596604, \&quot;Shape_Area\&quot;: 0.000466175414294, \&quot;zone\&quot;: \&quot;West Brighton\&quot;, \&quot;LocationID\&quot;: 245, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.09787969199995, 40.64035805499988], [-74.09767290799995, 40.63896067899989], [-74.09409312599998, 40.639266913999975], [-74.09242513499994, 40.63558181299992], [-74.08870582299987, 40.63684520599986], [-74.08373397299994, 40.63573714399991], [-74.09223971399994, 40.62574291599987], [-74.10350925299994, 40.61641607499991], [-74.1132624959999, 40.62305442499995], [-74.11614321199995, 40.62870226399988], [-74.11765722499997, 40.63806246599996], [-74.10974833299994, 40.63786583299993], [-74.09787969199995, 40.64035805499988]]]}}, {\&quot;id\&quot;: \&quot;245\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20686532766408525, \&quot;OBJECTID\&quot;: 246, \&quot;Shape_Leng\&quot;: 0.0694671937437, \&quot;Shape_Area\&quot;: 0.000281298327076, \&quot;zone\&quot;: \&quot;West Chelsea/Hudson Yards\&quot;, \&quot;LocationID\&quot;: 246, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00439976203513, 40.76267135909888], [-73.99547450199992, 40.759626856999894], [-74.00820401899988, 40.74214751799986], [-74.01213726936172, 40.74353192705926], [-74.0087278005888, 40.74485823290996], [-74.01183642872407, 40.74512596367872], [-74.00946389855962, 40.74575014365948], [-74.01150411235528, 40.74699080250515], [-74.0091373625992, 40.74735976280298], [-74.01133174441699, 40.748000575341926], [-74.0090584790135, 40.74778564533286], [-74.00894606502312, 40.74841189316866], [-74.01121562130406, 40.74869682117583], [-74.00842636447226, 40.75215785023921], [-74.0099905581974, 40.75281618714907], [-74.00997058797012, 40.75293356415314], [-74.00835352838844, 40.752350739342255], [-74.00480392560178, 40.75780984316466], [-74.00700358904015, 40.759231870341075], [-74.00390742032765, 40.75937569218354], [-74.00233528130057, 40.76154372700156], [-74.00439976203513, 40.76267135909888]]]}}, {\&quot;id\&quot;: \&quot;246\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21327531999755805, \&quot;OBJECTID\&quot;: 247, \&quot;Shape_Leng\&quot;: 0.0929678582271, \&quot;Shape_Area\&quot;: 0.000205617157843, \&quot;zone\&quot;: \&quot;West Concourse\&quot;, \&quot;LocationID\&quot;: 247, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91222180499983, 40.84235659099988], [-73.91986089399987, 40.83194722699992], [-73.92885642099992, 40.81487986599991], [-73.93027812699984, 40.813248024999965], [-73.93242632000944, 40.81411751897961], [-73.9330725108407, 40.82815615201811], [-73.92850073899989, 40.829352349999965], [-73.92399049499993, 40.83505229799987], [-73.91901668400004, 40.83838109299989], [-73.91618344399991, 40.84233489999991], [-73.91794965199988, 40.842229570999976], [-73.91729224999992, 40.84510993999991], [-73.91222180499983, 40.84235659099988]]]}}, {\&quot;id\&quot;: \&quot;247\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23975959776939262, \&quot;OBJECTID\&quot;: 248, \&quot;Shape_Leng\&quot;: 0.0569191167671, \&quot;Shape_Area\&quot;: 0.000149592769799, \&quot;zone\&quot;: \&quot;West Farms/Bronx River\&quot;, \&quot;LocationID\&quot;: 248, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86393748099981, 40.84004456599994], [-73.86271114399993, 40.83299150899997], [-73.88378414099992, 40.828274291999946], [-73.88005188499987, 40.83470205899989], [-73.87379590199993, 40.837445132999896], [-73.87277204699981, 40.83975128199995], [-73.86448011799995, 40.84108779699994], [-73.86393748099981, 40.84004456599994]]]}}, {\&quot;id\&quot;: \&quot;248\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.3739594338742877, \&quot;OBJECTID\&quot;: 249, \&quot;Shape_Leng\&quot;: 0.03638434365, \&quot;Shape_Area\&quot;: 7.22155957729e-05, \&quot;zone\&quot;: \&quot;West Village\&quot;, \&quot;LocationID\&quot;: 249, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00250642399995, 40.729016384999966], [-74.0070902079999, 40.72877225299993], [-74.00515808199998, 40.74085808099991], [-73.99683993899998, 40.73736088899995], [-74.00250642399995, 40.729016384999966]]]}}, {\&quot;id\&quot;: \&quot;249\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22424487863230827, \&quot;OBJECTID\&quot;: 250, \&quot;Shape_Leng\&quot;: 0.0796263465454, \&quot;Shape_Area\&quot;: 0.000240975845956, \&quot;zone\&quot;: \&quot;Westchester Village/Unionport\&quot;, \&quot;LocationID\&quot;: 250, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8455308949999, 40.83917330699989], [-73.83936452799996, 40.84087706699995], [-73.83959108476137, 40.834041688045254], [-73.84390624999997, 40.82840782999993], [-73.84289858800003, 40.82408305899986], [-73.85513639799981, 40.822436188999866], [-73.857391213, 40.83229737199986], [-73.86033845899995, 40.833253165999935], [-73.85168459699997, 40.8342010519999], [-73.85333524999986, 40.84247015499987], [-73.85052278099987, 40.84278948899985], [-73.8455308949999, 40.83917330699989]]]}}, {\&quot;id\&quot;: \&quot;250\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2908846826274664, \&quot;OBJECTID\&quot;: 251, \&quot;Shape_Leng\&quot;: 0.1377111611, \&quot;Shape_Area\&quot;: 0.000625754983157, \&quot;zone\&quot;: \&quot;Westerleigh\&quot;, \&quot;LocationID\&quot;: 251, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.13107460299996, 40.631147728999956], [-74.1313098529999, 40.62632834299998], [-74.12125677899994, 40.62782274999989], [-74.10552598799994, 40.618592329999906], [-74.0977696879999, 40.61062359299988], [-74.1156683379999, 40.611175384999896], [-74.13210459699991, 40.608152923999924], [-74.14471100599997, 40.60803429699994], [-74.14954343599996, 40.60962717299988], [-74.14696864199988, 40.610151355999896], [-74.14603562099998, 40.61701277699996], [-74.13982184799993, 40.61629982499988], [-74.13826358199992, 40.624243769999936], [-74.13581008299997, 40.62506433999991], [-74.13806393799992, 40.627568470999904], [-74.13107460299996, 40.631147728999956]]]}}, {\&quot;id\&quot;: \&quot;251\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.19230468294425673, \&quot;OBJECTID\&quot;: 252, \&quot;Shape_Leng\&quot;: 0.158004373564, \&quot;Shape_Area\&quot;: 0.00102526406057, \&quot;zone\&quot;: \&quot;Whitestone\&quot;, \&quot;LocationID\&quot;: 252, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82049919995306, 40.80101146781907], [-73.81369963725258, 40.79707941566509], [-73.81225365567188, 40.79812694680175], [-73.79640953426332, 40.795728824199614], [-73.79442844782817, 40.794806810498535], [-73.79375126484103, 40.78906193333896], [-73.79058298999988, 40.78819290999989], [-73.79582463099997, 40.7861305879999], [-73.80242791599977, 40.786068273999945], [-73.8037902289999, 40.77561011199992], [-73.81485850699985, 40.776485922999875], [-73.81452997799975, 40.77888817499992], [-73.82331286899986, 40.77957865999986], [-73.82224127699999, 40.781693878999924], [-73.83869921299997, 40.781676956999874], [-73.83824429099994, 40.78778591599995], [-73.84008157499997, 40.78785153099992], [-73.83895676099984, 40.79143843099996], [-73.84081532599994, 40.7915048849999], [-73.84067828300006, 40.79390789199993], [-73.83663288911686, 40.79251637576927], [-73.83728024446076, 40.78900952077265], [-73.83251063648018, 40.788624476626765], [-73.83166080927866, 40.79110259115967], [-73.8278487557192, 40.79308767321416], [-73.82945991534359, 40.79682336759143], [-73.82506496699443, 40.79737577656827], [-73.82049919995306, 40.80101146781907]]]}}, {\&quot;id\&quot;: \&quot;252\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.1968457090250007, \&quot;OBJECTID\&quot;: 253, \&quot;Shape_Leng\&quot;: 0.0360514998192, \&quot;Shape_Area\&quot;: 7.83395761191e-05, \&quot;zone\&quot;: \&quot;Willets Point\&quot;, \&quot;LocationID\&quot;: 253, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83908354399988, 40.76525691299991], [-73.83679107299986, 40.76116667099992], [-73.83867321899987, 40.75701997899995], [-73.84324381399976, 40.75533680399995], [-73.84670933714987, 40.76134526931977], [-73.84272819396486, 40.76462854893166], [-73.83908354399988, 40.76525691299991]]]}}, {\&quot;id\&quot;: \&quot;253\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.27103593179914537, \&quot;OBJECTID\&quot;: 254, \&quot;Shape_Leng\&quot;: 0.0858863754861, \&quot;Shape_Area\&quot;: 0.000360040216032, \&quot;zone\&quot;: \&quot;Williamsbridge/Olinville\&quot;, \&quot;LocationID\&quot;: 254, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85186563799999, 40.87905886499989], [-73.85091896099982, 40.877893440999856], [-73.85254854099988, 40.877091586999924], [-73.8506895569999, 40.87548667799993], [-73.85363638799987, 40.87330059899996], [-73.85651292399994, 40.874217792999936], [-73.85661382499993, 40.87125016699991], [-73.87056192499989, 40.87151077799995], [-73.87019944899986, 40.87631135499987], [-73.860710982, 40.89537054399996], [-73.84590568599998, 40.889741368999864], [-73.85186563799999, 40.87905886499989]]]}}, {\&quot;id\&quot;: \&quot;254\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.21100623323921086, \&quot;OBJECTID\&quot;: 255, \&quot;Shape_Leng\&quot;: 0.0623841997664, \&quot;Shape_Area\&quot;: 0.000172309184842, \&quot;zone\&quot;: \&quot;Williamsburg (North Side)\&quot;, \&quot;LocationID\&quot;: 255, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96176070375392, 40.72522879205536], [-73.95477662900004, 40.72245950499994], [-73.94907816799986, 40.72254028699993], [-73.94841638599995, 40.71845553299995], [-73.94721341799986, 40.718560985999865], [-73.95547596099992, 40.7122654259999], [-73.96736391666703, 40.71648367952745], [-73.96176070375392, 40.72522879205536]]]}}, {\&quot;id\&quot;: \&quot;255\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.211436788357516, \&quot;OBJECTID\&quot;: 256, \&quot;Shape_Leng\&quot;: 0.0679149669603, \&quot;Shape_Area\&quot;: 0.000168611097013, \&quot;zone\&quot;: \&quot;Williamsburg (South Side)\&quot;, \&quot;LocationID\&quot;: 256, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95834207500002, 40.71330630099992], [-73.95547596099992, 40.7122654259999], [-73.95433904200002, 40.714071701999906], [-73.94937231899985, 40.71406687799986], [-73.94865533499987, 40.70972498299988], [-73.95087492699996, 40.70951311499991], [-73.95023693799996, 40.70547324699994], [-73.9579043079999, 40.70842717299994], [-73.958455768, 40.707251846999895], [-73.96838933699995, 40.70682918699989], [-73.96984864823531, 40.708003041687675], [-73.96736391666705, 40.71648367902752], [-73.95834207500002, 40.71330630099992]]]}}, {\&quot;id\&quot;: \&quot;256\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.23592163517446302, \&quot;OBJECTID\&quot;: 257, \&quot;Shape_Leng\&quot;: 0.0586690259793, \&quot;Shape_Area\&quot;: 0.00013890947321, \&quot;zone\&quot;: \&quot;Windsor Terrace\&quot;, \&quot;LocationID\&quot;: 257, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97984261899994, 40.660727440999956], [-73.97436701299992, 40.65818790399992], [-73.97084113699994, 40.64637857099993], [-73.97777380600002, 40.645341876999964], [-73.97819074399992, 40.64752599199992], [-73.98029115499993, 40.647297160999855], [-73.98179568699996, 40.65524609699991], [-73.98843135299977, 40.65925121199996], [-73.9868846449999, 40.6603663889999], [-73.985086794, 40.65901328799989], [-73.982230342, 40.66214149199994], [-73.97984261899994, 40.660727440999956]]]}}, {\&quot;id\&quot;: \&quot;257\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.22047778849365984, \&quot;OBJECTID\&quot;: 258, \&quot;Shape_Leng\&quot;: 0.0890133787693, \&quot;Shape_Area\&quot;: 0.000366209617143, \&quot;zone\&quot;: \&quot;Woodhaven\&quot;, \&quot;LocationID\&quot;: 258, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8450419489999, 40.68931894699996], [-73.84119605699982, 40.68335136599989], [-73.84786817599985, 40.681486831999905], [-73.85197864599989, 40.682564210999864], [-73.85099089299987, 40.68056836699987], [-73.85392389199987, 40.679686155999875], [-73.85819836099995, 40.67943084899987], [-73.85878576899987, 40.68063046299989], [-73.86334943599995, 40.67935163999989], [-73.86410096700003, 40.68237284999988], [-73.86602666899996, 40.681918051999915], [-73.86868454399996, 40.694034691999924], [-73.85277238699999, 40.69755711199987], [-73.85443455699989, 40.70060295199994], [-73.85070842300001, 40.70020312499988], [-73.8450419489999, 40.68931894699996]]]}}, {\&quot;id\&quot;: \&quot;258\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.27829088737692265, \&quot;OBJECTID\&quot;: 259, \&quot;Shape_Leng\&quot;: 0.126750305191, \&quot;Shape_Area\&quot;: 0.000394552487366, \&quot;zone\&quot;: \&quot;Woodlawn/Wakefield\&quot;, \&quot;LocationID\&quot;: 259, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.851071161919, 40.91037152011096], [-73.85347522366716, 40.90753029351422], [-73.84138689269206, 40.90417274176649], [-73.83554853999995, 40.88913350399993], [-73.84704957999995, 40.8876718159999], [-73.84590568599998, 40.889741368999864], [-73.860710982, 40.89537054399996], [-73.87048672599987, 40.896640210999905], [-73.8771197409999, 40.895468663999964], [-73.86789043706806, 40.90298695407611], [-73.85946778750369, 40.90051720913338], [-73.85957882974115, 40.9024408428857], [-73.85601023344621, 40.9053059838135], [-73.85681013619275, 40.90615582816297], [-73.85374103615364, 40.90778791636777], [-73.85458940544117, 40.9089394991491], [-73.851071161919, 40.91037152011096]]]}}, {\&quot;id\&quot;: \&quot;259\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20437281528599283, \&quot;OBJECTID\&quot;: 260, \&quot;Shape_Leng\&quot;: 0.133514154636, \&quot;Shape_Area\&quot;: 0.000422345326907, \&quot;zone\&quot;: \&quot;Woodside\&quot;, \&quot;LocationID\&quot;: 260, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9017537339999, 40.760775474999946], [-73.90147053099994, 40.759633049999884], [-73.89866137799999, 40.759921016999904], [-73.89976862099998, 40.75666423699991], [-73.8949120899999, 40.74428123099996], [-73.90057825399985, 40.73949289599988], [-73.90926002999988, 40.736403179999854], [-73.91068876399997, 40.73347108099995], [-73.90628903499987, 40.732400751999876], [-73.90516948899983, 40.73585964299986], [-73.90107970900003, 40.73391463399987], [-73.90712253099991, 40.727424727999924], [-73.91174734199988, 40.72991203299991], [-73.91205021299994, 40.72850636299993], [-73.91796696699996, 40.7285007709999], [-73.917342506, 40.731382825999916], [-73.91903825199986, 40.73200596599987], [-73.91651190599994, 40.738944757999874], [-73.9137938869998, 40.742514491999934], [-73.9119412979999, 40.742382948999925], [-73.91190979099993, 40.748105394999875], [-73.90945182799983, 40.75065550699994], [-73.91067474899997, 40.752995076999895], [-73.90631505099988, 40.75984387599992], [-73.90779405499987, 40.760517799999896], [-73.90356915599997, 40.765781788999924], [-73.9017537339999, 40.760775474999946]]]}}, {\&quot;id\&quot;: \&quot;260\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20724657615053085, \&quot;OBJECTID\&quot;: 261, \&quot;Shape_Leng\&quot;: 0.0271204563616, \&quot;Shape_Area\&quot;: 3.43423231652e-05, \&quot;zone\&quot;: \&quot;World Trade Center\&quot;, \&quot;LocationID\&quot;: 261, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01332610899989, 40.7050307879999], [-74.01668613099999, 40.70479933799992], [-74.01375388499997, 40.71369055499987], [-74.00860085399992, 40.711392239999945], [-74.01332610899989, 40.7050307879999]]]}}, {\&quot;id\&quot;: \&quot;261\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.20094480581780036, \&quot;OBJECTID\&quot;: 262, \&quot;Shape_Leng\&quot;: 0.0490636231541, \&quot;Shape_Area\&quot;: 0.000122330270966, \&quot;zone\&quot;: \&quot;Yorkville East\&quot;, \&quot;LocationID\&quot;: 262, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.94383256699986, 40.78285908899991], [-73.94207418803879, 40.77691784697707], [-73.94293043781381, 40.774676268035776], [-73.9474897547817, 40.77011515400953], [-73.95268514999995, 40.772339404999926], [-73.94383256699986, 40.78285908899991]]], [[[-73.93804640603422, 40.78082954427547], [-73.93759894622617, 40.78046784086141], [-73.93958378972465, 40.779576474007136], [-73.9387442308927, 40.78104387604228], [-73.93804640603422, 40.78082954427547]]]]}}, {\&quot;id\&quot;: \&quot;262\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;tip_fraction\&quot;: 0.2030808607390993, \&quot;OBJECTID\&quot;: 263, \&quot;Shape_Leng\&quot;: 0.0370166252994, \&quot;Shape_Area\&quot;: 6.57697664169e-05, \&quot;zone\&quot;: \&quot;Yorkville West\&quot;, \&quot;LocationID\&quot;: 263, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95218621999996, 40.7730198449999], [-73.95729409999986, 40.7742835549999], [-73.94933170599992, 40.78519312699994], [-73.94472264499986, 40.78324757199987], [-73.95218621999996, 40.7730198449999]]]}}]}&quot;},&quot;id&quot;:&quot;79833421-4b37-4874-b257-e91f6932982f&quot;,&quot;type&quot;:&quot;GeoJSONDataSource&quot;},{&quot;attributes&quot;:{&quot;fill_alpha&quot;:{&quot;value&quot;:0.1},&quot;fill_color&quot;:{&quot;value&quot;:&quot;#1f77b4&quot;},&quot;line_alpha&quot;:{&quot;value&quot;:0.1},&quot;line_color&quot;:{&quot;value&quot;:&quot;#1f77b4&quot;},&quot;xs&quot;:{&quot;field&quot;:&quot;xs&quot;},&quot;ys&quot;:{&quot;field&quot;:&quot;ys&quot;}},&quot;id&quot;:&quot;027cf8e6-f083-4db2-bf4b-6e525b959e2d&quot;,&quot;type&quot;:&quot;Patches&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;7297bf13-8681-427a-88cb-a60cd7da3cc9&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},{&quot;attributes&quot;:{&quot;plot&quot;:{&quot;id&quot;:&quot;ae53cc6f-7f97-4812-a208-ab913d90eb10&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;72328d45-1f26-4e3d-9388-ba39a0b07bbd&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;8ee03255-55ef-4637-8819-7dae96f8299a&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;aa4113e2-b3e7-4170-a486-16fa7c11995b&quot;,&quot;type&quot;:&quot;HelpTool&quot;},{&quot;attributes&quot;:{&quot;formatter&quot;:{&quot;id&quot;:&quot;7eade2b2-57b6-47a4-9a00-ec5b4a408ce6&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;plot&quot;:{&quot;id&quot;:&quot;62ba6d47-3ae9-4aa5-be3a-40808ec4ef1a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;2a08cff9-d6de-4308-8dfb-94ef1c977983&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;981a4af8-3ccf-4507-8498-13e2a0e4095e&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;attributes&quot;:{&quot;formatter&quot;:{&quot;id&quot;:&quot;4863a02c-a14f-44ad-b059-4fa0a7811065&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;plot&quot;:{&quot;id&quot;:&quot;3058396c-651f-4f74-b4de-a7e737c8665a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;7297bf13-8681-427a-88cb-a60cd7da3cc9&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;1b83b15e-0089-4812-ad82-87c5a6ed9480&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;26612bd9-9ba6-4d61-95ab-5284b5499ee3&quot;,&quot;type&quot;:&quot;LinearScale&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;9d08d013-0e4e-429d-a37a-b7275a5c84b8&quot;,&quot;type&quot;:&quot;LinearScale&quot;},{&quot;attributes&quot;:{&quot;below&quot;:[{&quot;id&quot;:&quot;2a692866-0932-40ef-ab57-5680f5882b98&quot;,&quot;type&quot;:&quot;LinearAxis&quot;}],&quot;left&quot;:[{&quot;id&quot;:&quot;e0e3f2e8-d02e-461e-ad09-3f799e56ae49&quot;,&quot;type&quot;:&quot;LinearAxis&quot;}],&quot;renderers&quot;:[{&quot;id&quot;:&quot;2a692866-0932-40ef-ab57-5680f5882b98&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;id&quot;:&quot;8ee03255-55ef-4637-8819-7dae96f8299a&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;id&quot;:&quot;e0e3f2e8-d02e-461e-ad09-3f799e56ae49&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;id&quot;:&quot;36cfaa0d-2256-478f-9e32-09a8af5f4faf&quot;,&quot;type&quot;:&quot;Grid&quot;},{&quot;id&quot;:&quot;3872cd96-a3c4-4d3c-a8d3-d671c5190f24&quot;,&quot;type&quot;:&quot;BoxAnnotation&quot;},{&quot;id&quot;:&quot;45c59d93-f760-4cc4-a732-46d46cef1f47&quot;,&quot;type&quot;:&quot;GlyphRenderer&quot;},{&quot;id&quot;:&quot;01599911-7bd9-4ceb-93b4-1d76c6b84013&quot;,&quot;type&quot;:&quot;ColorBar&quot;}],&quot;right&quot;:[{&quot;id&quot;:&quot;01599911-7bd9-4ceb-93b4-1d76c6b84013&quot;,&quot;type&quot;:&quot;ColorBar&quot;}],&quot;title&quot;:{&quot;id&quot;:&quot;a4bd85d5-54d7-4339-95e8-726aa5564454&quot;,&quot;type&quot;:&quot;Title&quot;},&quot;toolbar&quot;:{&quot;id&quot;:&quot;f408f7d2-a34f-43a8-8561-003142236b1c&quot;,&quot;type&quot;:&quot;Toolbar&quot;},&quot;x_range&quot;:{&quot;id&quot;:&quot;24209739-d5c4-4529-abcf-6ff415a2dfd5&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},&quot;x_scale&quot;:{&quot;id&quot;:&quot;a41f3949-e45f-4f6e-b29c-14b4306bdc8a&quot;,&quot;type&quot;:&quot;LinearScale&quot;},&quot;y_range&quot;:{&quot;id&quot;:&quot;d92819cb-157e-408e-979a-4aab8e0d4596&quot;,&quot;type&quot;:&quot;DataRange1d&quot;},&quot;y_scale&quot;:{&quot;id&quot;:&quot;b868a9e2-54ac-4484-a27c-2920d66d903b&quot;,&quot;type&quot;:&quot;LinearScale&quot;}},&quot;id&quot;:&quot;ae53cc6f-7f97-4812-a208-ab913d90eb10&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},{&quot;attributes&quot;:{},&quot;id&quot;:&quot;a41f3949-e45f-4f6e-b29c-14b4306bdc8a&quot;,&quot;type&quot;:&quot;LinearScale&quot;},{&quot;attributes&quot;:{&quot;formatter&quot;:{&quot;id&quot;:&quot;b7d58927-6ebb-4002-8dd1-f651f3cd7cc3&quot;,&quot;type&quot;:&quot;BasicTickFormatter&quot;},&quot;plot&quot;:{&quot;id&quot;:&quot;3058396c-651f-4f74-b4de-a7e737c8665a&quot;,&quot;subtype&quot;:&quot;Figure&quot;,&quot;type&quot;:&quot;Plot&quot;},&quot;ticker&quot;:{&quot;id&quot;:&quot;2a7eb668-a58d-46ed-9e0b-0f25d7fff4c5&quot;,&quot;type&quot;:&quot;BasicTicker&quot;},&quot;visible&quot;:false},&quot;id&quot;:&quot;eee6a093-e6be-4073-88b7-824d43352607&quot;,&quot;type&quot;:&quot;LinearAxis&quot;},{&quot;attributes&quot;:{&quot;callback&quot;:null,&quot;geojson&quot;:&quot;{\&quot;type\&quot;: \&quot;FeatureCollection\&quot;, \&quot;features\&quot;: [{\&quot;id\&quot;: \&quot;0\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 1, \&quot;Shape_Leng\&quot;: 0.116357453189, \&quot;Shape_Area\&quot;: 0.0007823067885, \&quot;zone\&quot;: \&quot;Newark Airport\&quot;, \&quot;LocationID\&quot;: 1, \&quot;borough\&quot;: \&quot;EWR\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.18445299999996, 40.6949959999999], [-74.18448899999999, 40.69509499999987], [-74.18449799999996, 40.69518499999987], [-74.18438099999997, 40.69587799999988], [-74.18428199999994, 40.6962109999999], [-74.18402099999997, 40.69707499999986], [-74.18391299999996, 40.697506999999845], [-74.18375099999997, 40.69779499999988], [-74.18363399999998, 40.6983259999999], [-74.18356199999994, 40.69845199999987], [-74.18354399999998, 40.69855999999987], [-74.18350799999996, 40.69870399999992], [-74.18327399999998, 40.70008999999988], [-74.18315699999994, 40.701214999999884], [-74.18316599999997, 40.70238499999987], [-74.18313899999998, 40.702627999999876], [-74.18309399999998, 40.7028529999999], [-74.18299499999995, 40.703158999999864], [-74.18284199999994, 40.70346499999988], [-74.18264399999998, 40.703734999999874], [-74.18242799999996, 40.703950999999904], [-74.18220299999996, 40.70413999999989], [-74.18203199999994, 40.70425699999987], [-74.18180699999994, 40.704391999999885], [-74.18157299999996, 40.704499999999875], [-74.18132099999997, 40.70460799999991], [-74.18080799999996, 40.704787999999894], [-74.179467, 40.70534599999992], [-74.17887299999995, 40.705543999999875], [-74.17831499999994, 40.70572399999986], [-74.17776599999996, 40.70589499999988], [-74.17709099999996, 40.706092999999896], [-74.17699199999998, 40.70613799999988], [-74.17689299999995, 40.70619199999987], [-74.17664999999994, 40.70641699999988], [-74.17642499999994, 40.706695999999916], [-74.17628999999994, 40.70689399999986], [-74.17608299999995, 40.70710999999988], [-74.17599299999995, 40.70719099999991], [-74.17589399999997, 40.7072629999999], [-74.17565999999994, 40.707379999999866], [-74.17538099999996, 40.707469999999894], [-74.17515599999996, 40.70751499999988], [-74.17475999999994, 40.70759599999993], [-74.17417499999993, 40.7076679999999], [-74.17388699999998, 40.70773099999992], [-74.17347299999994, 40.707748999999865], [-74.17275299999994, 40.707802999999906], [-74.17188899999996, 40.707910999999854], [-74.17163699999998, 40.707955999999875], [-74.17133999999999, 40.707964999999895], [-74.17120499999999, 40.707955999999875], [-74.16994499999998, 40.70797399999988], [-74.16888299999994, 40.7079379999999], [-74.16681299999993, 40.70785699999988], [-74.16442799999999, 40.70779399999987], [-74.16401399999995, 40.70777599999992], [-74.16233999999997, 40.707721999999876], [-74.16081899999995, 40.70764099999991], [-74.16057599999993, 40.70760499999988], [-74.16033299999998, 40.707568999999864], [-74.160063, 40.7074879999999], [-74.15938799999998, 40.7072629999999], [-74.15904599999999, 40.707145999999916], [-74.15891999999997, 40.70710999999989], [-74.15827199999995, 40.706875999999916], [-74.15459099999998, 40.705651999999866], [-74.15409599999998, 40.70544499999989], [-74.15401499999997, 40.70538199999988], [-74.15387999999996, 40.70532799999989], [-74.15376299999997, 40.70540899999987], [-74.15323199999995, 40.70524699999987], [-74.15317799999997, 40.70531899999987], [-74.15306999999996, 40.7052829999999], [-74.15359199999995, 40.70437399999987], [-74.15386199999995, 40.70384299999989], [-74.15513999999996, 40.70155699999985], [-74.15544599999998, 40.70108899999987], [-74.15575199999995, 40.7006659999999], [-74.15600399999994, 40.70026099999991], [-74.15635499999996, 40.69975699999986], [-74.15745299999998, 40.69809199999987], [-74.15754299999998, 40.6979389999999], [-74.15758799999998, 40.69781299999988], [-74.15762399999994, 40.69767799999991], [-74.15829899999994, 40.696705999999885], [-74.15951399999994, 40.694887999999885], [-74.15958599999993, 40.69476199999984], [-74.16014399999995, 40.69410499999987], [-74.16057599999993, 40.693222999999875], [-74.16262799999998, 40.69028899999989], [-74.16279899999995, 40.690027999999884], [-74.16290699999996, 40.689874999999866], [-74.16292499999997, 40.689874999999866], [-74.16295199999996, 40.689874999999866], [-74.16306899999995, 40.68989299999987], [-74.16309599999994, 40.689928999999886], [-74.16322199999996, 40.68998299999987], [-74.16331199999996, 40.68999199999992], [-74.16341099999994, 40.6900009999999], [-74.16352799999999, 40.69000999999986], [-74.16380699999996, 40.69004599999989], [-74.16410399999995, 40.6900819999999], [-74.16417599999994, 40.690081999999904], [-74.16422999999998, 40.69005499999986], [-74.16436499999998, 40.6900369999999], [-74.16450899999995, 40.68998299999986], [-74.16467099999994, 40.68988399999989], [-74.16479699999996, 40.689757999999884], [-74.16491399999995, 40.689586999999904], [-74.16499499999998, 40.689388999999885], [-74.16528299999999, 40.68891199999988], [-74.16542699999997, 40.68875899999989], [-74.16548099999994, 40.688632999999854], [-74.16560699999997, 40.688425999999865], [-74.16576899999995, 40.68802999999986], [-74.16587699999997, 40.68787699999991], [-74.16583199999997, 40.68757999999987], [-74.16582299999999, 40.68748999999985], [-74.16580499999998, 40.687156999999914], [-74.16582299999999, 40.68703999999986], [-74.16589499999998, 40.68684199999989], [-74.16604799999999, 40.68655399999988], [-74.16639899999996, 40.686022999999864], [-74.16650699999997, 40.68588799999986], [-74.16674099999994, 40.6854919999999], [-74.16695699999997, 40.68523099999986], [-74.16738899999996, 40.68454699999991], [-74.16781199999997, 40.68394399999988], [-74.16791099999995, 40.683790999999864], [-74.16804599999995, 40.68360199999991], [-74.16816299999994, 40.68347599999988], [-74.16822599999995, 40.683349999999905], [-74.16848699999997, 40.682998999999896], [-74.16886499999998, 40.68239599999987], [-74.16916199999997, 40.681999999999896], [-74.16929699999997, 40.68178399999987], [-74.16947699999997, 40.68155899999989], [-74.16981899999996, 40.681018999999885], [-74.16995399999996, 40.68087499999991], [-74.17005299999994, 40.68066799999987], [-74.17041299999994, 40.68015499999989], [-74.17051199999997, 40.67999299999987], [-74.17067399999996, 40.679650999999865], [-74.17093499999999, 40.67929099999988], [-74.17144799999994, 40.67847199999989], [-74.17151999999999, 40.678381999999885], [-74.17160999999999, 40.678255999999884], [-74.17193399999996, 40.67782399999988], [-74.17200599999995, 40.67773399999988], [-74.17283399999997, 40.67656399999988], [-74.17314899999997, 40.67619499999991], [-74.17322999999999, 40.6760779999999], [-74.17329299999994, 40.67601499999989], [-74.17358999999993, 40.67571799999991], [-74.17423799999995, 40.67493499999991], [-74.17437299999995, 40.674817999999895], [-74.17484999999994, 40.67432299999992], [-74.17500299999995, 40.67416999999991], [-74.17538999999995, 40.67375599999988], [-74.17604699999998, 40.673044999999895], [-74.17630799999995, 40.67276599999986], [-74.17641599999996, 40.67262199999986], [-74.17663199999998, 40.672396999999876], [-74.17678499999994, 40.67218099999991], [-74.17697399999997, 40.671937999999884], [-74.17709099999996, 40.67178499999988], [-74.17734299999995, 40.67155999999989], [-74.17754999999994, 40.67142499999989], [-74.17778399999997, 40.67131699999989], [-74.17802699999999, 40.671208999999855], [-74.17862999999994, 40.671037999999896], [-74.17888199999999, 40.671001999999866], [-74.17912499999994, 40.670992999999896], [-74.17933199999999, 40.67101099999991], [-74.17979099999997, 40.67115499999987], [-74.17997999999994, 40.671208999999884], [-74.18010599999997, 40.67126299999989], [-74.18030399999998, 40.67129899999986], [-74.18133899999998, 40.67170399999987], [-74.18213999999996, 40.67202799999989], [-74.18384999999995, 40.672648999999865], [-74.18437199999994, 40.6729099999999], [-74.18458799999996, 40.67302699999989], [-74.18492099999997, 40.673269999999896], [-74.18503799999996, 40.67335999999989], [-74.18513699999994, 40.673458999999866], [-74.18547899999999, 40.67390899999987], [-74.18594699999994, 40.67466499999989], [-74.18670299999997, 40.67578999999991], [-74.18733299999997, 40.67674399999987], [-74.18767499999996, 40.67729299999991], [-74.18795399999995, 40.67761699999989], [-74.18819699999995, 40.67792299999991], [-74.18852099999998, 40.67848099999987], [-74.18877299999997, 40.67885899999989], [-74.18905199999995, 40.679335999999864], [-74.18935799999997, 40.67975899999988], [-74.18949299999997, 40.680091999999895], [-74.18969999999996, 40.68079399999987], [-74.18977199999995, 40.68113599999987], [-74.189781, 40.681198999999886], [-74.18983499999996, 40.68131599999987], [-74.18991599999998, 40.68154099999988], [-74.18996999999996, 40.6818019999999], [-74.18999699999995, 40.682251999999885], [-74.18999699999995, 40.68262999999992], [-74.18996999999996, 40.68295399999991], [-74.18998799999997, 40.6831789999999], [-74.18995199999995, 40.68352099999987], [-74.18993399999994, 40.68370999999992], [-74.189871, 40.684078999999876], [-74.189781, 40.68481699999991], [-74.18976299999997, 40.685032999999876], [-74.18962799999997, 40.6861039999999], [-74.18955599999998, 40.68689599999987], [-74.18951999999996, 40.6872019999999], [-74.18947499999996, 40.68748999999985], [-74.18939399999994, 40.68773299999989], [-74.18939399999994, 40.687831999999894], [-74.18941199999995, 40.687939999999855], [-74.18940299999997, 40.68809299999987], [-74.18934899999994, 40.68826399999989], [-74.18922299999997, 40.688623999999905], [-74.18898899999994, 40.68904699999991], [-74.18870099999998, 40.689442999999855], [-74.18779199999994, 40.69018999999985], [-74.18723399999999, 40.69059499999986], [-74.18636999999995, 40.69118899999991], [-74.18591099999998, 40.69144999999987], [-74.18563199999994, 40.69164799999987], [-74.18445299999996, 40.6949959999999]]]}}, {\&quot;id\&quot;: \&quot;1\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 2, \&quot;Shape_Leng\&quot;: 0.43346966679, \&quot;Shape_Area\&quot;: 0.00486634037837, \&quot;zone\&quot;: \&quot;Jamaica Bay\&quot;, \&quot;LocationID\&quot;: 2, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.82337597260663, 40.63898704717671], [-73.82277105438693, 40.63557691408512], [-73.82265046764824, 40.63536884414308], [-73.82253791037438, 40.63515817971118], [-73.82243347854202, 40.63494510056532], [-73.8223372611914, 40.63472978853998], [-73.82224934035098, 40.63451242737345], [-73.8221697909667, 40.63429320255108], [-73.82209868083864, 40.6340723011465], [-73.82203607056276, 40.63384991166226], [-73.82198201348179, 40.633626223869015], [-73.82193655563646, 40.633401428643005], [-73.82189973572993, 40.63317571780407], [-73.82187158509225, 40.632949283951106], [-73.82185212765629, 40.63272232029805], [-73.82184137993583, 40.63249502050889], [-73.82183935101227, 40.63226757853259], [-73.8218460425281, 40.63204018843732], [-73.82107505533321, 40.62973377456623], [-73.82081417085445, 40.629390439641234], [-73.82059122816396, 40.62892422501728], [-73.8202234085928, 40.62844358255744], [-73.8200841811797, 40.628261639526286], [-73.8199971542669, 40.62805115103772], [-73.81991014068153, 40.62784065311699], [-73.81973384601805, 40.627712304087076], [-73.81947843088552, 40.62762863286645], [-73.81796414839563, 40.62710556569678], [-73.81800752228978, 40.62647634385673], [-73.81769796593258, 40.62596162249622], [-73.81710538785215, 40.625384851107945], [-73.81611483429545, 40.624604655173044], [-73.8160864347078, 40.62431541030936], [-73.81664198730377, 40.62393220944394], [-73.8167299805857, 40.62387151407256], [-73.81795284720685, 40.62409328011744], [-73.81891708039825, 40.62309026716333], [-73.81889389047457, 40.62262915803264], [-73.81825303631376, 40.62209423858474], [-73.81778633288076, 40.62193777763477], [-73.81778718310667, 40.621626331776106], [-73.8169700782087, 40.62149155710105], [-73.81691065059803, 40.621869647095345], [-73.81653074259579, 40.62200251874798], [-73.81571468044605, 40.62148955151693], [-73.81557294001617, 40.62073484077254], [-73.81543174704264, 40.62011653124222], [-73.81639131315181, 40.61962195550727], [-73.81682455918784, 40.61946156485392], [-73.81718053878453, 40.619267274493204], [-73.81744426110988, 40.61891175591167], [-73.81744645138826, 40.61811089699635], [-73.81764711074565, 40.617611944960316], [-73.81777429834523, 40.61750112169565], [-73.81775726750763, 40.61730714881576], [-73.81760298632462, 40.616983832581454], [-73.81751717814184, 40.61639641166187], [-73.8171684613709, 40.61584319772224], [-73.81711893622217, 40.61528219234544], [-73.81652681189122, 40.61494700958006], [-73.81768666599999, 40.61493299799986], [-73.82075892599994, 40.61523267899991], [-73.82141601599992, 40.615054762999925], [-73.8215706029998, 40.61490868999993], [-73.82163921899993, 40.614870614999845], [-73.82170208100001, 40.61482419099985], [-73.82176857999997, 40.61476625499992], [-73.82234961099986, 40.61426002599995], [-73.82379847999995, 40.61212942099992], [-73.8238246859766, 40.61149866495507], [-73.82397101271293, 40.61192149929154], [-73.82403572267913, 40.61213048090672], [-73.82410048459043, 40.61231956879447], [-73.82424356049395, 40.61250877658137], [-73.82432166316987, 40.61258847036726], [-73.8243870281721, 40.61254878272031], [-73.82436121280683, 40.61243932957914], [-73.82444821239913, 40.61234112665787], [-73.82458320331664, 40.61239988154398], [-73.82467451637949, 40.612419914122576], [-73.82473943706756, 40.612549320589395], [-73.82460797477792, 40.61290720498259], [-73.82468584347531, 40.61307641875661], [-73.824907237176, 40.61326574495243], [-73.82520683961239, 40.61349497719592], [-73.82525834646223, 40.613763619289685], [-73.82540161085667, 40.61388319788558], [-73.82555758997881, 40.61413210471074], [-73.82575322105271, 40.614192081540075], [-73.82593603373292, 40.614162518209255], [-73.82609287085626, 40.614083182229585], [-73.826197496476, 40.61400376542788], [-73.82619778134861, 40.61389435100908], [-73.82635390865978, 40.61378615702355], [-73.82662889857586, 40.613745800855575], [-73.82673157371033, 40.613664956123905], [-73.82703834217757, 40.6133950021526], [-73.82715194745357, 40.613378557154796], [-73.82725636632989, 40.61337871412455], [-73.82737373432043, 40.61341867797081], [-73.82747351895246, 40.61355236332681], [-73.82747779183, 40.61355808935558], [-73.82758192904869, 40.61366765928358], [-73.82767204227477, 40.613624148862804], [-73.82772568489919, 40.61359824867005], [-73.82787525471795, 40.613697628598395], [-73.82769886106767, 40.61387671827217], [-73.82758123538642, 40.613936221503465], [-73.8273200321807, 40.61399551069022], [-73.82724153726997, 40.61406502057191], [-73.82750222609539, 40.61420466672019], [-73.82773709441845, 40.614234859242316], [-73.82807653538532, 40.614205527127346], [-73.82845503182497, 40.614216039151735], [-73.82900287951898, 40.61435611007713], [-73.82932878428791, 40.61451574332958], [-73.82964171605141, 40.6146455161249], [-73.83009815098022, 40.614805340060016], [-73.83054575285917, 40.61493306078065], [-73.83091996001404, 40.61500548703347], [-73.8314812223769, 40.615006311228164], [-73.83170324361234, 40.61495690244544], [-73.8320297090652, 40.61489770036318], [-73.83246091965542, 40.614709339811256], [-73.83331105440271, 40.61449331081881], [-73.83401888200429, 40.61438116642064], [-73.83405492385512, 40.61436188793414], [-73.83406504547996, 40.61435647443239], [-73.83410581152143, 40.61435944275289], [-73.8341784916688, 40.61436199003059], [-73.83434168122284, 40.61436543719744], [-73.83445946628927, 40.614392450421285], [-73.8346032336605, 40.61441390158446], [-73.83472391325719, 40.61445052666856], [-73.83484247863916, 40.6144679338274], [-73.83490183563694, 40.614468157475095], [-73.83496190251225, 40.61447290875004], [-73.83501220878382, 40.61449233293344], [-73.83504177385295, 40.61450939365018], [-73.83506620220827, 40.61452021523822], [-73.83512098542279, 40.61453569210867], [-73.83517134812571, 40.61454663430032], [-73.83520623957126, 40.61453597904436], [-73.83525501050032, 40.61454974496719], [-73.83532281744199, 40.614570675723115], [-73.83538891957515, 40.614596598377865], [-73.83542288683323, 40.61461045443579], [-73.83545449273417, 40.614632458068606], [-73.83546955939202, 40.614657264070445], [-73.83547876382073, 40.61469339938509], [-73.83545814612324, 40.61471384545857], [-73.83543987928485, 40.61473067291295], [-73.83542879838902, 40.614754701507835], [-73.83542479353247, 40.614772372280925], [-73.83542777742117, 40.614774599832785], [-73.83546600150866, 40.614873466279484], [-73.83551649420116, 40.61494874641214], [-73.83558894560753, 40.61502891644492], [-73.83565778576532, 40.61509867837635], [-73.83574792728226, 40.6151629251546], [-73.83579322194048, 40.61518439875596], [-73.83585572623771, 40.615208999052946], [-73.83590450244563, 40.6152205139514], [-73.83598591313452, 40.61523188491708], [-73.83604642983012, 40.61522977594597], [-73.83610164292601, 40.61523130833409], [-73.83615138042873, 40.61521842487933], [-73.83620170280982, 40.61520235666928], [-73.83622173494702, 40.6151850655438], [-73.83622104005505, 40.61517466115949], [-73.83621145405357, 40.61516204947466], [-73.83615370058651, 40.61513926713333], [-73.83614289101911, 40.61512618712993], [-73.83614816967186, 40.61511801504228], [-73.83619025265256, 40.61511239276597], [-73.83623192892556, 40.615125765525484], [-73.83625516805921, 40.61513787463743], [-73.83627296218822, 40.61513779075455], [-73.83629664347178, 40.6151308795602], [-73.83631971425355, 40.615122623237674], [-73.83634403495043, 40.615119337102726], [-73.83634298945309, 40.61513473338826], [-73.83630165045997, 40.61515978999668], [-73.8362555309456, 40.615180832315154], [-73.836256190453, 40.61519123497351], [-73.83625868102743, 40.61520342593361], [-73.83628443659826, 40.615232255019855], [-73.83632259460953, 40.615255586365365], [-73.8363821447316, 40.6152801816666], [-73.83642080855896, 40.61528902058307], [-73.83647071166415, 40.61529647509992], [-73.83650810164664, 40.61529584208576], [-73.83654842492393, 40.61528840551515], [-73.83658509337694, 40.61527286721724], [-73.83660620420999, 40.61524245801393], [-73.83660293659774, 40.61520855451133], [-73.83659202032008, 40.61517966383299], [-73.83660663290642, 40.61515470684256], [-73.83663626355332, 40.61514552697837], [-73.83667370236468, 40.61515392380227], [-73.8367397195242, 40.61517081523142], [-73.83679106388888, 40.61520810759664], [-73.83684841155214, 40.61524988249358], [-73.83686341804386, 40.61527016091644], [-73.83688967112587, 40.61528677736101], [-73.83691998426377, 40.61529250094956], [-73.83697872940104, 40.61529313377217], [-73.83702921808582, 40.61529740498504], [-73.83707080859173, 40.61530171834586], [-73.8371224799956, 40.61530870901978], [-73.83717716917288, 40.615317953526734], [-73.83721530341752, 40.615336754552786], [-73.83724567284065, 40.61534925887809], [-73.83726642394453, 40.61534689979378], [-73.83726283632416, 40.61534104878436], [-73.83727813973981, 40.61532877380782], [-73.83729720614221, 40.61533815998089], [-73.83733296587165, 40.61535607975402], [-73.83736778999722, 40.615402955273666], [-73.83738923070878, 40.615413250620804], [-73.83742250503579, 40.61541670120903], [-73.83746760280816, 40.61541558474026], [-73.83750808709809, 40.615430765838326], [-73.83753077231013, 40.61544830972719], [-73.83757377957497, 40.615477932533985], [-73.83761124299842, 40.61549088655009], [-73.83770572740917, 40.615502629926624], [-73.83774137083236, 40.61550923917903], [-73.83776702143372, 40.61552223141874], [-73.83778556555642, 40.6155393313238], [-73.83779167484144, 40.615559650342874], [-73.83778783177006, 40.61559991222926], [-73.83775556201697, 40.61564304180018], [-73.8377251129955, 40.615692486933575], [-73.83771154036306, 40.615704325318845], [-73.83767959707981, 40.615717125850004], [-73.8376222064016, 40.61573730141596], [-73.83749594902788, 40.615756474960634], [-73.83742299815893, 40.615761778476745], [-73.83729967326363, 40.61577414773579], [-73.83724993001131, 40.61578931091298], [-73.83721865108845, 40.615810264393254], [-73.83717327566708, 40.61585074017479], [-73.83704926990326, 40.615994693811], [-73.83701342650974, 40.6160410031713], [-73.83695526084304, 40.61611275149117], [-73.83690989149997, 40.6161509496178], [-73.83688206247315, 40.61615969401999], [-73.83682027132109, 40.616152304059945], [-73.83674770660578, 40.6161318351782], [-73.83661044646236, 40.61611305900015], [-73.8365605989011, 40.616112383691814], [-73.83653038538397, 40.61612141008841], [-73.83646539870269, 40.616156714051925], [-73.83644029720082, 40.616170402327306], [-73.83633821743527, 40.6162437078502], [-73.83621028429496, 40.616343380215234], [-73.8361498330899, 40.61639228980907], [-73.83594162529525, 40.61654526191713], [-73.83574510959822, 40.616717848584244], [-73.83558888700725, 40.61688072107752], [-73.83554316307831, 40.616931852746745], [-73.83543187671067, 40.61705630065517], [-73.83527378301078, 40.61724722195531], [-73.83520018779365, 40.61735205002421], [-73.83515679945094, 40.617418632078284], [-73.8351060716087, 40.61749651113463], [-73.83506760060499, 40.61755555184745], [-73.83503079738357, 40.61762461418816], [-73.8349818113314, 40.61774073002495], [-73.83496222645587, 40.61778030881177], [-73.83495416881976, 40.61783362863525], [-73.83494283780968, 40.617885709738324], [-73.83495035743844, 40.61791830026055], [-73.83496031607699, 40.617940849237], [-73.83496600704768, 40.61795901756522], [-73.83496699909188, 40.61796218646273], [-73.83497854383712, 40.617969668301804], [-73.83501307295018, 40.617960824747996], [-73.8350509052779, 40.61795635072771], [-73.83508222781771, 40.617961939542305], [-73.83511105765169, 40.61797128630448], [-73.8351473448356, 40.61799442268986], [-73.83516472778436, 40.618015059898376], [-73.83516892325414, 40.618037024292306], [-73.83515913111307, 40.618064622904704], [-73.83514848023428, 40.618074681660424], [-73.83512875541668, 40.61808288776387], [-73.83510899173636, 40.61807852259004], [-73.83508428232517, 40.61807859637329], [-73.83505386643535, 40.618084289936675], [-73.83503172539164, 40.61810879665894], [-73.83501865754488, 40.61813518284088], [-73.83500397387171, 40.61817345172101], [-73.83500412587884, 40.61821423958553], [-73.83498947570031, 40.61826820816863], [-73.8349682566798, 40.61831341308498], [-73.83497341954912, 40.618381134093426], [-73.83496138913816, 40.618468950331085], [-73.83496079783818, 40.61853293069665], [-73.83497585229192, 40.61859185621791], [-73.83503367077738, 40.61864817839469], [-73.83508817813792, 40.61870326344785], [-73.8351220063932, 40.61873015666991], [-73.83515004883148, 40.61873763417457], [-73.83516730584809, 40.61873634197401], [-73.83520566728862, 40.61870740421659], [-73.83521290614456, 40.61870794381802], [-73.83525802361956, 40.61870029561122], [-73.8353150144414, 40.61869719337912], [-73.83534349182173, 40.61870357464657], [-73.83535650781197, 40.61871309017983], [-73.83536182798973, 40.618732091245384], [-73.8353404200944, 40.618751055704635], [-73.83533027499944, 40.61877546876064], [-73.8353355951704, 40.618794471502646], [-73.83535629616419, 40.6188283988267], [-73.83538885612354, 40.61885784279428], [-73.83541435759753, 40.61887324960184], [-73.83543510318425, 40.618889115661545], [-73.8354611268023, 40.61892620767172], [-73.83549183618312, 40.61900585240989], [-73.83550350266252, 40.61910989580282], [-73.83549383449827, 40.61920350812297], [-73.83549488479503, 40.61927404976679], [-73.83549481789157, 40.619301196254895], [-73.83550310305235, 40.61931567324388], [-73.8355207781153, 40.61937899354336], [-73.83554976450334, 40.619427424622074], [-73.83557218292678, 40.61944571066124], [-73.83560872508038, 40.61947310115986], [-73.83565958049579, 40.61950495916942], [-73.835714468994, 40.619537261008624], [-73.83572870016225, 40.61955051178868], [-73.83574513689678, 40.61957556780851], [-73.83574706558579, 40.61961152632981], [-73.83572583140196, 40.61966265954252], [-73.83571454012318, 40.6196989844889], [-73.83570733216746, 40.619729166951956], [-73.8356673493013, 40.619758753071764], [-73.83564923064897, 40.619787987299176], [-73.83563870292694, 40.61980589568313], [-73.83560626485749, 40.61982849387304], [-73.83556282642932, 40.61985673059368], [-73.83554696400546, 40.61989126496709], [-73.8355369686483, 40.61991268752325], [-73.83553327031747, 40.6199376318377], [-73.83551236293482, 40.61995810614527], [-73.83549391596809, 40.619959753532186], [-73.83538308531075, 40.619942000135865], [-73.83531699866492, 40.61993724046734], [-73.83526739330783, 40.619953172108715], [-73.83522937910507, 40.61995819493326], [-73.83520875852072, 40.61995017859354], [-73.8351961685202, 40.61994310472235], [-73.83514645819189, 40.61989977659646], [-73.83511766376013, 40.61989062255555], [-73.83508243198399, 40.61989150465222], [-73.83504962373301, 40.61988863103023], [-73.83501268056406, 40.61988267613292], [-73.8349920065259, 40.61986722071551], [-73.83495815063704, 40.61983928773372], [-73.83495620861927, 40.61982089259598], [-73.83495585537514, 40.619817487562536], [-73.83495550518768, 40.61981400211941], [-73.83495511701948, 40.619810405885126], [-73.83495473079734, 40.619806644972414], [-73.83495434339326, 40.619802828605884], [-73.83495392079347, 40.61979893093737], [-73.8349534982628, 40.61979500529139], [-73.83495311224588, 40.619791161452135], [-73.83495272588691, 40.619787455991435], [-73.83495267403252, 40.619787176478376], [-73.8349530577307, 40.61978377786393], [-73.83495342746937, 40.61978015641562], [-73.83495375978538, 40.619776642969875], [-73.8349538231922, 40.61977607379697], [-73.83495466899879, 40.61977313152508], [-73.8349559415767, 40.61976857639302], [-73.83495605003769, 40.619768191734494], [-73.83495721478977, 40.619764120104065], [-73.83495757467031, 40.61976341850631], [-73.83495779121424, 40.619762979723426], [-73.83496003675234, 40.61975856319457], [-73.83496028948841, 40.619758069514056], [-73.83496249817028, 40.619753709557045], [-73.83496284723834, 40.61975302385905], [-73.83496513817671, 40.61974954069981], [-73.83496781315462, 40.619745454819714], [-73.83497048872262, 40.61974139691764], [-73.83497072365829, 40.619741077776865], [-73.834970814756, 40.6197409576218], [-73.83497446314935, 40.61973709276949], [-73.834974859619, 40.619736709026846], [-73.83497850647574, 40.619732842999525], [-73.83497886776435, 40.61973246088167], [-73.83498258899671, 40.61972856865893], [-73.83498291263044, 40.61972821061124], [-73.83498663238724, 40.619724292586724], [-73.83498695749064, 40.61972396251848], [-73.83498732003198, 40.61972360737459], [-73.83498764366566, 40.61972324932688], [-73.83499095388885, 40.619719752217684], [-73.8349913280428, 40.61971941300569], [-73.83499168832026, 40.61971908416062], [-73.83499573129845, 40.619715330108114], [-73.83499605765442, 40.619715027013896], [-73.83500010062926, 40.61971127413395], [-73.83500038938872, 40.61971097148827], [-73.83500447068995, 40.61970718951313], [-73.83500475739861, 40.61970691601449], [-73.83500887401334, 40.61970307863788], [-73.83500988633324, 40.619702147456245], [-73.83501013817067, 40.61970192818702], [-73.83501421668167, 40.619698118230254], [-73.83501465125362, 40.619697707234984], [-73.83501872969266, 40.61969392626034], [-73.83503035670653, 40.61968310046283], [-73.83503295469998, 40.619680716231215], [-73.83503562771511, 40.619678222375775], [-73.8350388417635, 40.61967520761084], [-73.8350420905473, 40.6196721935658], [-73.83504541136438, 40.619669122496774], [-73.83504600631076, 40.619668582063824], [-73.83504866200768, 40.61966588949363], [-73.83505187585239, 40.61966260081804], [-73.8350527483464, 40.619661757220676], [-73.83505566434685, 40.61965977853022], [-73.8350599580499, 40.619656875213074], [-73.8350628545967, 40.619654939381846], [-73.83506468473206, 40.61965367113188], [-73.83506995210881, 40.619650083012125], [-73.83507612289257, 40.619645863765754], [-73.83507655587348, 40.6196455624994], [-73.83508222142333, 40.61964170104017], [-73.8350881028403, 40.61963767403644], [-73.8350938384386, 40.619633757727634], [-73.83509986472069, 40.61962964917692], [-73.83510571089066, 40.61962564959658], [-73.83510776823056, 40.61962425384717], [-73.83511087117782, 40.619621622730016], [-73.83511563653995, 40.61961762159892], [-73.83511787957178, 40.61961572654381], [-73.83511986031176, 40.61961356591393], [-73.83512339906771, 40.619609755179], [-73.8351257453126, 40.61960719601896], [-73.8351265079198, 40.619605890050686], [-73.83512882201632, 40.61960174869952], [-73.83513117502804, 40.61959760690171], [-73.83513348964644, 40.6195935210033], [-73.83513580587247, 40.61958940712991], [-73.8351392553219, 40.61958329944254], [-73.83514423938809, 40.61957273031025], [-73.83514489049413, 40.61957134896137], [-73.83514551135299, 40.61956850571017], [-73.83514642197723, 40.619564417798145], [-73.83514715832642, 40.619561102615606], [-73.83514733267062, 40.619560301908926], [-73.83514824336787, 40.61955618434434], [-73.83514915406101, 40.61955206845503], [-73.83514942572108, 40.61955085509625], [-73.83514909177528, 40.61954808954956], [-73.83514863265606, 40.61954410839969], [-73.83514832854563, 40.61954145815572], [-73.83514795827979, 40.61954004568952], [-73.83514688852236, 40.61953592696025], [-73.83514610712336, 40.61953291366635], [-73.83514570968407, 40.619531643393394], [-73.83514499386496, 40.61952949481127], [-73.83514377633992, 40.61952716658857], [-73.83514276321685, 40.61952522012284], [-73.83514069003044, 40.61952244052232], [-73.83513829404646, 40.619519236107664], [-73.83513659621009, 40.61951741279902], [-73.83513451176393, 40.619515186530826], [-73.83513270384385, 40.6195132483068], [-73.83513109800163, 40.619511831890556], [-73.83512599216328, 40.6195072593997], [-73.83512498779872, 40.61950666289585], [-73.83512039717206, 40.61950383411642], [-73.83511725433776, 40.61950223322396], [-73.83511367982304, 40.61950040772576], [-73.83511143853501, 40.619499551452805], [-73.83510843704316, 40.61949876160357], [-73.83510807841144, 40.61949869189964], [-73.83510471762445, 40.61949783402076], [-73.83510247642766, 40.61949783080596], [-73.83509911353333, 40.619497825982094], [-73.83509575041911, 40.61949782115781], [-73.83509013557159, 40.619499586231306], [-73.83508234969528, 40.619502045948664], [-73.8350822889517, 40.61950207166105], [-73.83507654554161, 40.61950390406364], [-73.8350720393931, 40.619505325449445], [-73.83506882681762, 40.61950632433968], [-73.83506854261785, 40.61950647269773], [-73.83506630662428, 40.61950756680533], [-73.8350643232077, 40.619508497766795], [-73.83506259282973, 40.61950934566194], [-73.83506107884065, 40.61951008396828], [-73.8350564819437, 40.61951228473611], [-73.83505494634642, 40.61951331518214], [-73.8350538626772, 40.619514027803866], [-73.83505285389694, 40.619514684578256], [-73.83505195181418, 40.619515314030984], [-73.83505108598817, 40.61951586228417], [-73.83505029146416, 40.61951638266211], [-73.83504749952071, 40.61951825112877], [-73.83503401904368, 40.61953019034733], [-73.83501812440286, 40.619545924822], [-73.8350174383641, 40.61954658373455], [-73.83501678750642, 40.61954724102232], [-73.83501617306054, 40.619547843412874], [-73.83501501883251, 40.61954899452402], [-73.83501444057265, 40.61954954436226], [-73.83501389947668, 40.61955009090331], [-73.83501335800345, 40.61955061214684], [-73.83501285170817, 40.619551132938355], [-73.83501176920393, 40.619552174420875], [-73.83501122810381, 40.61955272263716], [-73.83500817335559, 40.619555777669376], [-73.83500797686946, 40.61955592933623], [-73.83500462000539, 40.619558998174725], [-73.83499739945185, 40.61956560387044], [-73.83499693894599, 40.61956601164536], [-73.83499353773406, 40.619568343124314], [-73.83498967769185, 40.619571026928355], [-73.83498581617673, 40.6195736839255], [-73.83498202816111, 40.61957631338561], [-73.83497823933318, 40.61957891553737], [-73.83497398161872, 40.61958184688058], [-73.8349722351652, 40.61958305979717], [-73.83496957971555, 40.6195845853582], [-73.83496499971633, 40.61958724015046], [-73.83496034584253, 40.619589896009245], [-73.83495565555567, 40.61959260710008], [-73.83495093009276, 40.61959531763774], [-73.83494616931696, 40.619598083073946], [-73.83494173227032, 40.619600629344255], [-73.83493968118961, 40.619601804463855], [-73.83493743655649, 40.61960265597438], [-73.8349366472464, 40.61960284532163], [-73.83493407154735, 40.6196035042009], [-73.8349318282333, 40.61960435571321], [-73.83492954791917, 40.619604344229906], [-73.83492846599323, 40.61960435088531], [-73.83491650941178, 40.61960388741827], [-73.83490492692965, 40.61960346234883], [-73.83490307284829, 40.619603922569006], [-73.8349015619159, 40.619604312249635], [-73.8349014869658, 40.61960430393302], [-73.83490141551309, 40.6196043038304], [-73.83490130690464, 40.619604303674414], [-73.83490105473129, 40.619604303312244], [-73.83489819967585, 40.619604307420836], [-73.83489694687438, 40.61960459997019], [-73.83489483466322, 40.61960515681886], [-73.83489371362325, 40.61960515520877], [-73.8348925904722, 40.61960600715647], [-73.83489197374509, 40.619606020007964], [-73.8348914696521, 40.61960600554669], [-73.83488922611876, 40.619606856555194], [-73.83488922400447, 40.619607711285646], [-73.83488810107427, 40.61960856273096], [-73.83488782426414, 40.619608923023556], [-73.83488684804733, 40.61961010186395], [-73.83488659512682, 40.6196104033881], [-73.83488655959444, 40.61961045828664], [-73.83488652215, 40.61961048621021], [-73.83488648749562, 40.61961054161261], [-73.83488294676292, 40.619614790425906], [-73.8348824800685, 40.61961538867216], [-73.83487998302958, 40.61961917727434], [-73.83487998296161, 40.61961920474897], [-73.83487797702384, 40.6196222162189], [-73.83487723359994, 40.619623675334644], [-73.83487719740646, 40.61962373073483], [-73.83487480869455, 40.619628255112715], [-73.83487477131926, 40.61962825505903], [-73.83487347349393, 40.61963075038366], [-73.83487336078586, 40.619631163181], [-73.83487317748829, 40.61963184911696], [-73.83487154282814, 40.6196379944168], [-73.83487154262299, 40.6196380773434], [-73.83487120962234, 40.619639288938124], [-73.83487052091054, 40.61964307142602], [-73.83486780155245, 40.61965807494431], [-73.83486805894447, 40.61966272005846], [-73.8348680582627, 40.61966299564281], [-73.83486833459253, 40.619668072841606], [-73.8348683682949, 40.61966840225223], [-73.83486860929065, 40.61967345410345], [-73.83486864373661, 40.61967383846478], [-73.8348688705577, 40.61967857684858], [-73.83486891960808, 40.61967883441131], [-73.83486895523896, 40.6196792730536], [-73.8348694830632, 40.61968426986476], [-73.83486955322564, 40.619684791483515], [-73.83486996756154, 40.61968882802232], [-73.83487026126434, 40.619689815525625], [-73.83487179751529, 40.61969492251164], [-73.83487308349402, 40.619699260514516], [-73.83487333383293, 40.619700002525484], [-73.83487458329964, 40.61970425821917], [-73.83487483468762, 40.619705109460575], [-73.83487608523482, 40.61970928390425], [-73.83487636955081, 40.61971024442188], [-73.8348766377702, 40.61971104626632], [-73.83487690090588, 40.61971416972173], [-73.8348770072858, 40.61971515963651], [-73.8348773571777, 40.61971902922375], [-73.83487746188544, 40.619720072912834], [-73.83487756799781, 40.61972117105097], [-73.83487767295904, 40.619722378919036], [-73.83487772768987, 40.61972300639408], [-73.83487774135509, 40.61972361471197], [-73.83487772981483, 40.61972827971068], [-73.8348777264198, 40.61972965210416], [-73.83487770655927, 40.619731548169995], [-73.83487735609071, 40.61973404385018], [-73.83487713717255, 40.619735442236205], [-73.83487656803999, 40.619739233607476], [-73.83487640579283, 40.61973958635823], [-73.834874311164, 40.6197452096468], [-73.83487206295995, 40.6197477689426], [-73.83486981541657, 40.61975032773673], [-73.83486307480958, 40.6197562973351], [-73.8348540914557, 40.619762264213854], [-73.83485325984896, 40.6197626644189], [-73.83485160003306, 40.619763513417276], [-73.83484986957967, 40.61976438811365], [-73.83484766933802, 40.619765511418485], [-73.83484543326422, 40.61976663299639], [-73.834843232584, 40.619767755797824], [-73.83484139316472, 40.61976868578969], [-73.83483958986686, 40.6197695895313], [-73.83483778657002, 40.61977049277032], [-73.83483605545379, 40.619771368638254], [-73.83483208731447, 40.619773394059855], [-73.83482967163266, 40.619774598306385], [-73.8348271829766, 40.619775884202035], [-73.83482458695994, 40.61977719859099], [-73.83482184592403, 40.61977856705094], [-73.83482042054405, 40.61977929894784], [-73.83481921278555, 40.61978004539738], [-73.8348167235161, 40.61978157890005], [-73.83480807158676, 40.619786968778634], [-73.83480499749777, 40.619789302397336], [-73.83480160512086, 40.619791876632924], [-73.83480021058838, 40.619792936260815], [-73.83479853640046, 40.61979461701979], [-73.83479346785425, 40.61979976108818], [-73.83478202158658, 40.61981641545874], [-73.83477996605193, 40.61981938614613], [-73.83477872965373, 40.61982148803197], [-73.8347756193006, 40.619826835446226], [-73.83477546438883, 40.61982706674876], [-73.83477427491415, 40.619831528684536], [-73.83477320071925, 40.619835604798844], [-73.83477310957899, 40.61983627495178], [-73.83477206006914, 40.6198441454682], [-73.83477203469464, 40.61985439620219], [-73.8347752830575, 40.61987536395475], [-73.83477534387069, 40.619875754384886], [-73.8347767126989, 40.619879839539045], [-73.83478171846966, 40.6198946417306], [-73.83478275512489, 40.619897826608415], [-73.83478386448336, 40.619901039568134], [-73.83478424558758, 40.61990224565519], [-73.83478963457533, 40.61991296035216], [-73.8347898237671, 40.619913358003075], [-73.83479124855907, 40.6199157074684], [-73.83479297066026, 40.61991856447163], [-73.83479476431347, 40.61992155945395], [-73.83479652145589, 40.619924471457], [-73.83479670104235, 40.61992466387095], [-73.83479943094244, 40.61992779740505], [-73.83480223326198, 40.61993098482005], [-73.83480503427865, 40.61993425465736], [-73.83480546312809, 40.61993473557952], [-73.83480812350956, 40.619937442987016], [-73.83481143130801, 40.61994079698195], [-73.8348148431988, 40.61994428833264], [-73.83481552717186, 40.61994499963882], [-73.83481894145231, 40.6199476143131], [-73.83482318391319, 40.619950859248895], [-73.83482746235862, 40.619954133386436], [-73.8348278341032, 40.61995441335898], [-73.83483199380255, 40.61995707517439], [-73.83483652603833, 40.61995996368912], [-73.8348409850447, 40.61996277034422], [-73.83484126464018, 40.619962973288594], [-73.83484537325917, 40.61996557639494], [-73.83484968839795, 40.61996832739093], [-73.83485393281136, 40.61997105081036], [-73.83485469539761, 40.61997153438967], [-73.8348581422215, 40.6199731709071], [-73.83486220641197, 40.61997507066187], [-73.83486605747945, 40.619976914658146], [-73.83486925121079, 40.61997838881105], [-73.83487911894214, 40.619982696923394], [-73.83488448117433, 40.61998503880824], [-73.83488973311268, 40.6199873508817], [-73.83489020092962, 40.61998754421212], [-73.83489070539567, 40.619987764567284], [-73.8348958868922, 40.619990023265096], [-73.8349006027422, 40.619992100194985], [-73.8349058543044, 40.61999420922202], [-73.83491071255162, 40.619996136919994], [-73.83491553445205, 40.61999809321307], [-73.83492035598107, 40.620000022030695], [-73.8349241199416, 40.62000152933402], [-73.8349251798322, 40.62000181196983], [-73.83493007474962, 40.62000313644744], [-73.83494497840654, 40.62000713951085], [-73.83494652564518, 40.62000754145676], [-73.83495037894774, 40.62000821660289], [-73.83495138570291, 40.62000838222683], [-73.83495682336319, 40.62000929636612], [-73.83496669339895, 40.62001098699956], [-73.8349729909799, 40.6200114324535], [-73.83497889815727, 40.62001185271982], [-73.83498473196929, 40.62001224590833], [-73.8349903869734, 40.620012665142056], [-73.83499593255537, 40.62001305741369], [-73.83503648675614, 40.62003029806967], [-73.83506194119016, 40.62003508370845], [-73.83511140979229, 40.620059693162624], [-73.83514945421035, 40.620086261214205], [-73.8351892113884, 40.62011966873837], [-73.83521267286356, 40.62012988546007], [-73.83524713409838, 40.6201344633323], [-73.8352833721993, 40.620134240681075], [-73.8352988919852, 40.62013698090934], [-73.83531201853388, 40.62014537181385], [-73.83530504599716, 40.620153649991664], [-73.83525703590811, 40.620180122834086], [-73.835228061921, 40.62019965339754], [-73.83517947408095, 40.62022697676222], [-73.83511109381281, 40.620260583712735], [-73.83505992869569, 40.62029591875947], [-73.83501945449157, 40.62033368338847], [-73.8349766806337, 40.620384565412664], [-73.83494291247693, 40.62043414290278], [-73.83487095582524, 40.62074744644516], [-73.83498716099349, 40.62101129988884], [-73.83497579529411, 40.62101949048852], [-73.8349325067799, 40.62102980425339], [-73.83488425945177, 40.621035169107174], [-73.83484210233186, 40.62106920004676], [-73.8348018333844, 40.62112568442332], [-73.83479426014556, 40.62117255353669], [-73.83477106595734, 40.621215174948134], [-73.83475117363801, 40.62126213775865], [-73.83477206223073, 40.621293211422895], [-73.83480605640716, 40.62132603264879], [-73.83485905038059, 40.62136747339013], [-73.83487573996096, 40.62139230975941], [-73.83486860012296, 40.62140983929493], [-73.83486007514385, 40.62144861103434], [-73.83485302732606, 40.62147239774434], [-73.8348617532606, 40.621512896024406], [-73.83486110670388, 40.621526647054374], [-73.8348400277696, 40.621543662018155], [-73.83481229773928, 40.62155509540437], [-73.83478297712946, 40.62156905116115], [-73.83474970830171, 40.62159238855885], [-73.83475426084244, 40.62162983516908], [-73.8347735869859, 40.621666505909815], [-73.83480360476744, 40.621705606942754], [-73.83480411594866, 40.62174620382317], [-73.83479301877969, 40.6217762439309], [-73.8347526375955, 40.62182023816353], [-73.834706371938, 40.621854290620504], [-73.8346676730216, 40.62190202129716], [-73.83464866926714, 40.62195398041147], [-73.8346451380572, 40.6219977273897], [-73.83466547391477, 40.622048755499776], [-73.8346921164322, 40.62208351605373], [-73.83472608413201, 40.62211323613151], [-73.83476020875996, 40.62215231560311], [-73.8347597397065, 40.62218165680579], [-73.83476098931946, 40.62221473285871], [-73.83478255229285, 40.62223515833474], [-73.83482124702645, 40.62224797713946], [-73.83485757192346, 40.622270810596916], [-73.83487846094775, 40.62230185743407], [-73.83488283700238, 40.62232368421127], [-73.83485615308435, 40.62234947551252], [-73.83484340044038, 40.62237890829777], [-73.8348497664996, 40.62242632062673], [-73.83489935765645, 40.62246028951774], [-73.83497320567402, 40.6225327758058], [-73.8349712094714, 40.622567741614176], [-73.8349690567791, 40.62259334751715], [-73.83498020634333, 40.62263008890535], [-73.83500259350858, 40.62265240876774], [-73.83502173941585, 40.62267348828023], [-73.83502020554216, 40.622682241984705], [-73.83500804316691, 40.622691694612286], [-73.83499413194808, 40.622694310213376], [-73.83534733990399, 40.62369577884393], [-73.83514355859735, 40.62548708279667], [-73.83342230809954, 40.626781983462095], [-73.83464377224975, 40.62742707942435], [-73.83304100907748, 40.628261271060616], [-73.83286528731682, 40.628408350262575], [-73.83286508734435, 40.62848820264789], [-73.83287721797437, 40.62859207399194], [-73.83288560857211, 40.62866390752471], [-73.83289548956779, 40.628903478732965], [-73.83268559314394, 40.6290149678853], [-73.8326635580086, 40.62902359237241], [-73.83236036671222, 40.62914225774722], [-73.83219207032315, 40.629381569075036], [-73.83196080768154, 40.62965272987937], [-73.83188649602349, 40.63002792793848], [-73.83183334645541, 40.63032330422833], [-73.83189666398192, 40.630572394052024], [-73.83171090635092, 40.63126149809776], [-73.83166394135613, 40.63142672049938], [-73.83160808634373, 40.63159032946402], [-73.83154343599053, 40.63175204747618], [-73.83147009989457, 40.63191160022591], [-73.8313882023895, 40.63206871707372], [-73.83129788233452, 40.632223131510294], [-73.83119929287734, 40.63237458160876], [-73.8311726114447, 40.63246698807974], [-73.83115393179625, 40.63256052752952], [-73.83114333418939, 40.632654798233716], [-73.83114086417227, 40.632749395325924], [-73.83114653238748, 40.63284391253632], [-73.83116031452592, 40.6329379439361], [-73.83118215143037, 40.633031085681694], [-73.83121194934962, 40.63312293774828], [-73.83124958033936, 40.63321310564855], [-73.83128625882125, 40.63341587766314], [-73.83133112864137, 40.633617691427716], [-73.8315519507211, 40.63384438316006], [-73.83168397540554, 40.63397811777474], [-73.83193878472684, 40.63423622542843], [-73.8319116731582, 40.63457621843594], [-73.83190631367316, 40.634643426189925], [-73.83195787786688, 40.63497888056586], [-73.83212076365058, 40.63512543734713], [-73.8323134547505, 40.635298808974646], [-73.83249094435719, 40.63557855183555], [-73.83245895783561, 40.63579410645499], [-73.83263580697175, 40.63632937448189], [-73.83290683934878, 40.63692866084925], [-73.83309423850194, 40.63743998965629], [-73.83340607979225, 40.63850135589897], [-73.83294956256923, 40.638823494236775], [-73.83289974361197, 40.63886268506689], [-73.832812666356, 40.63888193721898], [-73.8322165881916, 40.638928490220756], [-73.82938003995758, 40.637074927368005], [-73.82866782109734, 40.63661471844797], [-73.82808567353285, 40.63587972683653], [-73.82706379083446, 40.635811456523534], [-73.82665496763366, 40.635810840934084], [-73.8265099853732, 40.63578398166053], [-73.82636306756064, 40.635764144352805], [-73.82621479958787, 40.6357514080522], [-73.8260657722256, 40.63574582350641], [-73.82591657926903, 40.63574741296666], [-73.82576781517317, 40.635756170100024], [-73.82562007268534, 40.63577206001383], [-73.8254739404821, 40.63579501939495], [-73.82533000082624, 40.63582495676232], [-73.82518882724635, 40.63586175283105], [-73.82505098225157, 40.63590526098733], [-73.8249170150923, 40.63595530787298], [-73.82478745957022, 40.636011694076004], [-73.82466283191333, 40.63607419492457], [-73.82454362871778, 40.63614256138235], [-73.82443032497055, 40.6362165210408], [-73.82413577690048, 40.638787996704544], [-73.82457379890309, 40.639353873239195], [-73.82419327293158, 40.63995327448778], [-73.82337597260663, 40.63898704717671]]], [[[-73.84721834832125, 40.63196568670605], [-73.8485899664393, 40.63013198680654], [-73.8585583634798, 40.63045828819559], [-73.8561374187591, 40.63508154601468], [-73.84667914840234, 40.63873171175714], [-73.84352007697278, 40.636503685327924], [-73.84504859278633, 40.63317483899965], [-73.84721834832125, 40.63196568670605]]], [[[-73.79577948747226, 40.63215847659964], [-73.79803751834721, 40.631196239807494], [-73.79796829437942, 40.63110130747364], [-73.79811872226199, 40.6310375092611], [-73.79827615415297, 40.63125217936581], [-73.79812347917935, 40.631317681629135], [-73.7980553716909, 40.63122445859815], [-73.79581864007577, 40.63217769654574], [-73.79365017276974, 40.63310177435078], [-73.79364942874943, 40.633102090315504], [-73.79119486069375, 40.63414821967486], [-73.7908111127525, 40.63431035575525], [-73.7907928429953, 40.63428204310243], [-73.79356534109542, 40.63310193937666], [-73.79356608423642, 40.63310162341087], [-73.79577948747226, 40.63215847659964]]], [[[-73.83623731597828, 40.631110861231726], [-73.84110205447426, 40.62455643651514], [-73.84445711462239, 40.62984779443998], [-73.842423745765, 40.63153254924423], [-73.83765174362401, 40.63283973295598], [-73.83623731597828, 40.631110861231726]]], [[[-73.81307233892618, 40.62926109964263], [-73.81352502122876, 40.62730617268596], [-73.81258556038132, 40.628371916183724], [-73.81129432207656, 40.624703779000406], [-73.81135581995851, 40.62293751504066], [-73.81185181296344, 40.622097618373914], [-73.81210045334295, 40.62110059681489], [-73.81171450418677, 40.620703573736186], [-73.81171923661802, 40.62009423414049], [-73.81150542539498, 40.61979681095144], [-73.81109451157876, 40.61791025228185], [-73.81024066504992, 40.616487640654206], [-73.81089990481607, 40.61621847134095], [-73.81200717773355, 40.617179371483296], [-73.81211344524338, 40.61792554683542], [-73.81288213914506, 40.61891091965568], [-73.81370354000288, 40.62138674458606], [-73.81449543302412, 40.622394945305274], [-73.81418278559646, 40.6236946315581], [-73.81518203155235, 40.624744171143405], [-73.8161270318486, 40.62534899918069], [-73.81679073502552, 40.62634891812118], [-73.81383288662273, 40.62592623399761], [-73.81382899493154, 40.62613507764411], [-73.81627026043981, 40.62714580591711], [-73.81720935727392, 40.62910635115234], [-73.8173057692762, 40.63062197379782], [-73.81637181200166, 40.63137272824912], [-73.81506788441455, 40.63116405857793], [-73.81391733219806, 40.630776392218095], [-73.81307233892618, 40.62926109964263]]], [[[-73.84734350666976, 40.62909473971626], [-73.84984630167418, 40.62622449074592], [-73.8472783772798, 40.626621669791945], [-73.84504991718353, 40.62541106188362], [-73.84358010755503, 40.623178164184395], [-73.8461475400832, 40.622223609607744], [-73.84847781581286, 40.62241878479054], [-73.85665510191748, 40.61999364918834], [-73.85947697626024, 40.61866521683819], [-73.86107132214268, 40.61771207937058], [-73.86364988794934, 40.617878773642374], [-73.86404106276488, 40.61920759671402], [-73.86343910789503, 40.61894217513062], [-73.86151825485233, 40.619049218399226], [-73.86147000631671, 40.62123924718382], [-73.86102883383386, 40.624138986994076], [-73.86347880947007, 40.6233886093158], [-73.86334955670225, 40.62592490877777], [-73.86137632465496, 40.625979153993065], [-73.86041082270874, 40.62516691297755], [-73.86008391106512, 40.6256745170403], [-73.85861338934723, 40.62796202232805], [-73.8576777902821, 40.62798375894847], [-73.85786309317032, 40.628444902667404], [-73.8565055097758, 40.629097353726586], [-73.8561347984124, 40.628280911272874], [-73.8539654419115, 40.62761094389788], [-73.85436931062769, 40.62881767654389], [-73.85071696108574, 40.62800299210944], [-73.84846868196166, 40.6296433307532], [-73.84734350666976, 40.62909473971626]]], [[[-73.87084603194215, 40.61696742645758], [-73.8782477932424, 40.615444608331536], [-73.87481386865049, 40.62358718918363], [-73.86684384142526, 40.62782924286026], [-73.86498193495926, 40.625660706041025], [-73.86606533106142, 40.6214933267491], [-73.86626127665735, 40.618456348023955], [-73.87084603194215, 40.61696742645758]]], [[[-73.79783533398513, 40.627408716571516], [-73.79783848156961, 40.62701346630369], [-73.79744863612672, 40.627110476260945], [-73.79566256726108, 40.626114004327796], [-73.79921493427759, 40.6240847129885], [-73.79698347650404, 40.62486468974474], [-73.79403741688607, 40.62563519595493], [-73.7936292748135, 40.62515647619494], [-73.79809093107174, 40.62306294824432], [-73.79951085673736, 40.62117553302096], [-73.79992057632684, 40.61857524016598], [-73.80172498640165, 40.61996700873167], [-73.80096292242341, 40.61777236939703], [-73.80128049504093, 40.615879839747535], [-73.80270343867807, 40.61358065232171], [-73.8033982096119, 40.613172104348564], [-73.80508906012292, 40.61343256041943], [-73.80466968986522, 40.614301827300864], [-73.80476592616557, 40.61580099137086], [-73.80575302222282, 40.61669485753826], [-73.80565945060563, 40.617600255343724], [-73.80764116896117, 40.62119965469225], [-73.80728331329274, 40.62166643562193], [-73.80768917829106, 40.6222776604247], [-73.80698502381061, 40.623871998829976], [-73.80557147888442, 40.62496900157379], [-73.80516248846952, 40.62465622418597], [-73.80271345029576, 40.62593478734804], [-73.80251577946906, 40.6263291376923], [-73.8001117714566, 40.626927441987085], [-73.80092841565032, 40.627524104895656], [-73.79783533398513, 40.627408716571516]]], [[[-73.77348616522504, 40.625085118163526], [-73.77381024409397, 40.624925596730954], [-73.77383258726536, 40.624944848253456], [-73.77348560409436, 40.62511314810922], [-73.77348616522504, 40.625085118163526]]], [[[-73.77172760292548, 40.62358502801516], [-73.77178742171202, 40.62350408187312], [-73.77168780941253, 40.62345775824798], [-73.7716990840563, 40.623438989211046], [-73.77180205088992, 40.6234878803381], [-73.7718065553057, 40.62348190999068], [-73.77197318324889, 40.623272116308335], [-73.77187021304596, 40.62322407888819], [-73.77188149343576, 40.623203602050566], [-73.77198669843922, 40.62325335218967], [-73.77214546970639, 40.62304610520043], [-73.7720313143135, 40.62299121290296], [-73.77207296880073, 40.62293919036048], [-73.7721490467794, 40.622976724329334], [-73.77218824028017, 40.622995793795134], [-73.77272418290725, 40.62230839938326], [-73.77308562752837, 40.62183676009294], [-73.77347337495445, 40.62134402610005], [-73.77363729197724, 40.621135724360485], [-73.77411466469975, 40.620522520213164], [-73.77456049454024, 40.619951959126276], [-73.7750332232728, 40.619343178695], [-73.77503335134442, 40.619343013761736], [-73.77511891254433, 40.619233847487365], [-73.77518045935567, 40.61926471788484], [-73.77515794285773, 40.61929371606763], [-73.77511877728904, 40.61927399379186], [-73.77506473853114, 40.61934307518107], [-73.77506460979983, 40.6193432401131], [-73.77495328183132, 40.61948635632548], [-73.77500588175907, 40.6195112300096], [-73.77499461579019, 40.61952828992289], [-73.77493976825987, 40.61950426656821], [-73.77476640595854, 40.61972259439369], [-73.77482012770623, 40.61974746935469], [-73.77480885456588, 40.61976623803491], [-73.77475625738923, 40.6197405112075], [-73.77458288591141, 40.6199605455242], [-73.77463437522347, 40.61998285399991], [-73.77462198893457, 40.61999905929049], [-73.77457162552267, 40.619975898617575], [-73.77439825015809, 40.62019678670988], [-73.77445085909794, 40.620219098134356], [-73.774438476271, 40.62023444800687], [-73.7743858730955, 40.62021042879396], [-73.77421473327387, 40.62043302878822], [-73.77426958798799, 40.620454491646065], [-73.77425720928375, 40.62046898727483], [-73.77420347429072, 40.62044752778313], [-73.77402897875453, 40.620667560052944], [-73.77408383225163, 40.62068987655831], [-73.77407143925994, 40.62070778889978], [-73.77401659017951, 40.6206846193378], [-73.77384546527352, 40.62090209425039], [-73.77389694638455, 40.62092696573332], [-73.77388568146198, 40.62094317298173], [-73.77383308349965, 40.62091744405923], [-73.7736608298803, 40.621136625440286], [-73.7737167938199, 40.621161506331575], [-73.77370215913446, 40.621180268452285], [-73.77364843599236, 40.621155392468694], [-73.77350067294029, 40.62134390917439], [-73.7734773057808, 40.621373721048805], [-73.77353102837378, 40.6213985976132], [-73.77352087855442, 40.62141651548622], [-73.77346603422149, 40.621391637209406], [-73.77329266580485, 40.621608253307166], [-73.77334974791422, 40.6216348443745], [-73.7733362347926, 40.62165275560001], [-73.77328363248037, 40.62162788115485], [-73.77310914042, 40.62184534831895], [-73.77316286325559, 40.62187022505424], [-73.77315159799728, 40.62188643172646], [-73.77309787515313, 40.62186155498594], [-73.77292561377533, 40.6220815899726], [-73.7729815822394, 40.622105616492675], [-73.77296470321912, 40.62212437458906], [-73.77291322087405, 40.622099502187915], [-73.77274432125824, 40.62232039659964], [-73.7727935624733, 40.62234440991182], [-73.77278118331373, 40.622358906551966], [-73.77272857395504, 40.62233574030543], [-73.77255744039574, 40.62255321426784], [-73.7726089222986, 40.62257808682594], [-73.7725965330078, 40.622595145451754], [-73.77254616993127, 40.62257112983641], [-73.77237278964559, 40.622789451129925], [-73.772425392748, 40.622814327664635], [-73.77241188430918, 40.62283052932034], [-73.77236152244429, 40.622806512454694], [-73.77220950703806, 40.62300523248699], [-73.7724031363917, 40.62309530229876], [-73.7723626016271, 40.62314732600432], [-73.7721689786699, 40.62305554733859], [-73.77215455823358, 40.62307319410719], [-73.77215434472937, 40.62307345553245], [-73.7720046057531, 40.62326192901904], [-73.77215464477041, 40.623326795120775], [-73.77218482383529, 40.62334001519293], [-73.77217018334778, 40.62335963116915], [-73.77215360357187, 40.62335285173819], [-73.77199669270388, 40.62328155948756], [-73.77182107912483, 40.62349645992333], [-73.77181882771771, 40.62349901798295], [-73.77182442403672, 40.62350159111614], [-73.77199904490342, 40.623577104443584], [-73.77198776448255, 40.623597582464626], [-73.77185569638743, 40.623535820446456], [-73.77181316781842, 40.62351523514535], [-73.77173897590608, 40.6236057260367], [-73.77172760292548, 40.62358502801516]]], [[[-73.79162058913477, 40.62231334348308], [-73.79142802632143, 40.62227765834795], [-73.79075818793622, 40.62232836832426], [-73.79059984430631, 40.62244948577123], [-73.79048062923107, 40.62252084743856], [-73.79030507811355, 40.622582563102306], [-73.79017983899541, 40.62257756252419], [-73.79007341842517, 40.62256305186657], [-73.79005044260067, 40.622563009909435], [-73.78988553708297, 40.62256270863351], [-73.78981035453674, 40.62257211483743], [-73.78967870292792, 40.622614822524326], [-73.78949653224412, 40.62274664610792], [-73.78419483298926, 40.6208926699551], [-73.78426326908115, 40.62083272323078], [-73.7843383029774, 40.620777550807404], [-73.78441936332378, 40.62072757273768], [-73.78450583289406, 40.62068316956702], [-73.78459705327867, 40.6206446793915], [-73.78469232989883, 40.62061239528353], [-73.78477773362741, 40.62057023304006], [-73.7848576953853, 40.62052227307279], [-73.78493153947468, 40.62046892066322], [-73.78499864189892, 40.62041062666032], [-73.78505843563585, 40.62034788367028], [-73.78511041542829, 40.62028122189329], [-73.78515414205441, 40.62021120464334], [-73.78518924603695, 40.620138423587036], [-73.78521543076681, 40.62006349374441], [-73.78507784902251, 40.61996661358056], [-73.78512331439762, 40.61981492104341], [-73.78517524443524, 40.61965100037344], [-73.78514372469022, 40.61946244452387], [-73.78516032368115, 40.619296009374345], [-73.78520870265943, 40.61923734791775], [-73.7851833013958, 40.61914427645058], [-73.7851545601093, 40.61909036591641], [-73.7851711510987, 40.618926379687885], [-73.78516495572417, 40.61885537554957], [-73.78514920785406, 40.61875742472632], [-73.78515920006004, 40.61864728248332], [-73.7850632794476, 40.618505118554204], [-73.78488368265464, 40.61840930965986], [-73.78478111816777, 40.61833567667866], [-73.78476856019043, 40.61824507642237], [-73.78477534795478, 40.61813248093754], [-73.78478291732561, 40.61811635181475], [-73.78481093058895, 40.6180566587725], [-73.78481106475007, 40.61801504289331], [-73.78478547486449, 40.61798072183545], [-73.7847244609295, 40.61797326360713], [-73.78467752923336, 40.61797939255476], [-73.78465054000075, 40.61798291740893], [-73.78458950259879, 40.617982803048655], [-73.78451882678749, 40.61798267058927], [-73.78450284231191, 40.6179581614057], [-73.78449655136116, 40.61791653247601], [-73.78455126699085, 40.617884811163975], [-73.78458184988712, 40.61785505060126], [-73.78453859900476, 40.61782848281919], [-73.7844101694661, 40.61780620957503], [-73.7843556902111, 40.6177644905874], [-73.78434624252294, 40.61770572099269], [-73.78438813142866, 40.617666630704974], [-73.78445579298352, 40.61760555728037], [-73.78445273734563, 40.617556590931486], [-73.78440144915797, 40.617522222601856], [-73.78432120689806, 40.61750004012531], [-73.78429575194136, 40.61742410357805], [-73.78429919287694, 40.617353117964186], [-73.78433788632171, 40.617309125484866], [-73.78433998512607, 40.61730479761577], [-73.78437346044376, 40.617235752376715], [-73.78442813736525, 40.617216270743896], [-73.78444768097869, 40.617133074620874], [-73.78445326249802, 40.61708854087404], [-73.78446087067887, 40.617027835129704], [-73.78438089785311, 40.616922419251615], [-73.78426867510038, 40.61685611283726], [-73.78418536377005, 40.61678985942237], [-73.78414720948078, 40.61666738664297], [-73.78415237624955, 40.61663524595187], [-73.78415704405519, 40.61660620428706], [-73.78412181771587, 40.616571865985456], [-73.78406670589821, 40.61654371889476], [-73.78405446729549, 40.61653746850265], [-73.7839679358515, 40.61647365614667], [-73.78390060938848, 40.61643191346047], [-73.78390327278183, 40.61636910751812], [-73.78390756529659, 40.61626790874861], [-73.78381802921346, 40.61614044420899], [-73.78370885300865, 40.616125550865654], [-73.78366473079498, 40.616114250907856], [-73.78366070504741, 40.616113220062005], [-73.78366002987642, 40.61610922673384], [-73.7836449441638, 40.61602016468612], [-73.7835543329955, 40.615996299924284], [-73.78353260458239, 40.61599057725003], [-73.78344597109687, 40.61595859086472], [-73.78333396543637, 40.61582618521764], [-73.7832782049081, 40.61570128109888], [-73.78326717962132, 40.61561797810338], [-73.78322554530014, 40.61557873072326], [-73.78310021264996, 40.61559318344571], [-73.7829884433602, 40.61564124591981], [-73.78298118565476, 40.61564436669286], [-73.78275635553686, 40.615631701809015], [-73.7825669578421, 40.61558972756902], [-73.78248993127501, 40.615567549886805], [-73.78238409631444, 40.61551349272969], [-73.78231042656971, 40.615447257365275], [-73.78230713854042, 40.61543656008269], [-73.78228181716396, 40.61535417796198], [-73.78231752089329, 40.61524163684286], [-73.78229527471422, 40.61516815367754], [-73.78221175978906, 40.61516554770508], [-73.7821313541849, 40.61519477128253], [-73.78205109149752, 40.61517993165954], [-73.78199656877105, 40.61515289959362], [-73.78197744644285, 40.615106350463265], [-73.78189090283789, 40.61504743389118], [-73.78186828033726, 40.615089008115866], [-73.7818790370823, 40.61516485585312], [-73.78184222128019, 40.61519911963102], [-73.7818100802744, 40.61520395366908], [-73.78171700912468, 40.61517684879661], [-73.78164014281379, 40.6151057102113], [-73.78158240022272, 40.61508112127921], [-73.78149577687142, 40.61504668348637], [-73.78147617328904, 40.61501039771566], [-73.78144149492915, 40.614946211580346], [-73.7814159727366, 40.61489230670212], [-73.78127785533971, 40.61488714843479], [-73.78122023166848, 40.61488130926985], [-73.78120399415778, 40.61487966338073], [-73.78115269211109, 40.61485018910313], [-73.7811399071764, 40.614830580573596], [-73.78114968573595, 40.61480474370714], [-73.78115934985756, 40.61477920968273], [-73.78113050286747, 40.614759570571785], [-73.78111067894662, 40.614762408299036], [-73.7810630097626, 40.614769233967756], [-73.78098597748865, 40.61474950353707], [-73.78085789171315, 40.61462440929852], [-73.7807937650353, 40.614587567092435], [-73.7808103408408, 40.61443092653004], [-73.78080415768376, 40.614357473192506], [-73.78076582541503, 40.614291303032175], [-73.78072433857183, 40.614207991596345], [-73.78075878329834, 40.614177856769054], [-73.78076621936054, 40.6141713515442], [-73.7807535478932, 40.61411747051919], [-73.78070887195283, 40.614026809005864], [-73.78085046476025, 40.6139511902222], [-73.78097249377586, 40.613963663010324], [-73.7811490607288, 40.613998271982446], [-73.78114590422712, 40.61398112905265], [-73.78112055120368, 40.61387581600957], [-73.7810403451562, 40.613813496770575], [-73.78100199089187, 40.61378501389626], [-73.78092185869777, 40.61373100434156], [-73.78088360834359, 40.61364035463625], [-73.78090621621647, 40.61360367661871], [-73.78098980054023, 40.61358425171302], [-73.78105720259778, 40.61360151703611], [-73.78115999778085, 40.61360171278711], [-73.78119226513, 40.61355771028799], [-73.78119576665524, 40.61346958792765], [-73.78122166520576, 40.61340843637568], [-73.78127952806562, 40.61339630628866], [-73.7812605110188, 40.61331793350504], [-73.78137959932596, 40.61324716678573], [-73.78160136846203, 40.613210868422776], [-73.78177836610467, 40.61311328429783], [-73.78197506772605, 40.612883542643644], [-73.78231954307886, 40.61265163449765], [-73.78239337732361, 40.61266646227556], [-73.78239023652235, 40.6126444243652], [-73.78261557467621, 40.612497968636845], [-73.78272796594388, 40.612510421340204], [-73.78278570606835, 40.61253501137741], [-73.7828790134917, 40.61248867479037], [-73.7829146271154, 40.61240306079756], [-73.78292121972007, 40.61235166533054], [-73.78296005311707, 40.612263609630624], [-73.78302450498049, 40.6122000831892], [-73.78315942025627, 40.61220033778338], [-73.78322696610739, 40.61217353650431], [-73.78330429802995, 40.6121002429373], [-73.78335575780689, 40.61208075524395], [-73.78345861352133, 40.61206136486561], [-73.7835263575679, 40.61197336343408], [-73.78355221437404, 40.61192445198088], [-73.78371299347518, 40.611873346707824], [-73.7837605485183, 40.61193510310074], [-73.78382814992248, 40.612022891547255], [-73.78394373669919, 40.61204024579138], [-73.78422271946083, 40.61194038033933], [-73.78436963663604, 40.6118877889443], [-73.78447437567272, 40.61185029594851], [-73.78458968364842, 40.61195332910705], [-73.78458789348959, 40.61195962067106], [-73.7845799363939, 40.61198758300819], [-73.78464086652882, 40.612019520908184], [-73.78472760664935, 40.612017235618886], [-73.78475981475188, 40.61199036775516], [-73.7847728543081, 40.61193163909378], [-73.78485638084535, 40.61192934769011], [-73.78497523353337, 40.61192957008814], [-73.78501066349975, 40.61190026040854], [-73.78507185385064, 40.61185141469719], [-73.78509129264212, 40.61180004195303], [-73.78505931114388, 40.61175591822391], [-73.78506792206909, 40.611684101720336], [-73.78507251590148, 40.61164578191831], [-73.78516282917359, 40.6115308935415], [-73.78521116182439, 40.61148447099247], [-73.78522423150612, 40.61141595124298], [-73.78544973958921, 40.61121318664408], [-73.78551080380369, 40.611203508345326], [-73.78553984649244, 40.61116194688065], [-73.78577809315796, 40.61099347707069], [-73.78621843179218, 40.610911064582744], [-73.78646972800934, 40.610678968981624], [-73.78682445265207, 40.6107883309109], [-73.78684518697295, 40.61079472358821], [-73.78710253758436, 40.610677695554664], [-73.78719897412161, 40.61065584216966], [-73.78721512862111, 40.61062649494941], [-73.78719602603874, 40.6105726038908], [-73.78722835948798, 40.610506566677444], [-73.78722999351474, 40.61047392407473], [-73.78723178914876, 40.610438028181576], [-73.78719984810371, 40.61038166491338], [-73.78726107424681, 40.61032057789604], [-73.78741544568005, 40.6102621115996], [-73.78757610833092, 40.610245271710774], [-73.78759578527854, 40.610281761814086], [-73.7876144287936, 40.61031633464022], [-73.78770742637307, 40.61036546826493], [-73.78783925815156, 40.61032409384312], [-73.7879132621454, 40.6102850621979], [-73.78790602838673, 40.61027675011098], [-73.78787485581836, 40.61024092722476], [-73.78785894330079, 40.610194384978335], [-73.78824140912991, 40.61012654656824], [-73.78829264835399, 40.61017560060223], [-73.78832480067743, 40.61016586788916], [-73.78836030518765, 40.61011207640171], [-73.78837012007149, 40.610055790335615], [-73.78853725349592, 40.610024274213146], [-73.78859475483435, 40.61012474855982], [-73.78865910627547, 40.61009059422679], [-73.78871402336283, 40.60999277489203], [-73.78870777636307, 40.609936458768004], [-73.7887080088047, 40.60986301813367], [-73.78876926429395, 40.60979213860528], [-73.78879514030761, 40.60973588201696], [-73.78875680409138, 40.609669714493045], [-73.78876011660967, 40.60963789567892], [-73.78880507094011, 40.60964287450448], [-73.78884041217606, 40.60964049216583], [-73.7888662029074, 40.609611163587566], [-73.78893706313524, 40.609550092870656], [-73.78897525486545, 40.60955358796784], [-73.78899165373358, 40.609555089820525], [-73.78908160165909, 40.60955280596736], [-73.78909787128777, 40.60948673874685], [-73.78911184344186, 40.609413459520624], [-73.78911746868255, 40.60938395768333], [-73.78910162466049, 40.609315384936835], [-73.78903435482209, 40.609256508399184], [-73.78901840238645, 40.60922220694455], [-73.78916957340999, 40.609158836202404], [-73.78928528024618, 40.60913701641445], [-73.78938805806573, 40.609130085288214], [-73.78939130309898, 40.609129866744794], [-73.78948118868126, 40.60914716666045], [-73.78953913741638, 40.609105656619974], [-73.78960657372537, 40.6090710693147], [-73.78964852690937, 40.60904955272555], [-73.78984776252041, 40.609022988992386], [-73.78995389362336, 40.60898156632591], [-73.78998612257973, 40.60894735304491], [-73.78999907091941, 40.60891555179987], [-73.79006660916056, 40.60888874699258], [-73.79011167083348, 40.60885945333057], [-73.7900957887504, 40.60880312018514], [-73.79001236552747, 40.608773590842034], [-73.79001264272644, 40.608685463306934], [-73.79007706133319, 40.60862927633309], [-73.7901736401271, 40.60856090783165], [-73.79028941414941, 40.60851705451778], [-73.79029670742352, 40.60851625044823], [-73.79039866370154, 40.608505014261475], [-73.79047269491804, 40.60845618791433], [-73.7904812468437, 40.608409233934886], [-73.79048250009374, 40.60840235008777], [-73.79046997488345, 40.60829951022694], [-73.79038020614568, 40.60824549017297], [-73.79054444426578, 40.608111147653055], [-73.79071592085809, 40.6081304766207], [-73.79072104674593, 40.60813105354399], [-73.79077575139577, 40.60809932990773], [-73.79085621325443, 40.608048067245385], [-73.7908659950587, 40.60800157215921], [-73.79085658903483, 40.60792811514515], [-73.79083984839724, 40.60787640669498], [-73.79089225900364, 40.607820466797165], [-73.79088916294998, 40.607783741214334], [-73.79087659100047, 40.607695589287495], [-73.79091191580129, 40.60769810132761], [-73.79098584610873, 40.60768110004131], [-73.79098892075747, 40.60772516957295], [-73.79104666876955, 40.60774730654251], [-73.79104723143563, 40.60774732733384], [-73.79118798343292, 40.60775245958023], [-73.79133899604432, 40.60773804585382], [-73.79139058757958, 40.607674491367234], [-73.79139192215438, 40.60766166622427], [-73.79139721011913, 40.60761085524994], [-73.79147416230792, 40.60765505882776], [-73.7914796291121, 40.607661825377406], [-73.79156369380654, 40.60776587244002], [-73.79159895008118, 40.607809510119296], [-73.79151114690586, 40.60815452141681], [-73.7915097486129, 40.608155516350855], [-73.79140813105519, 40.60822777557577], [-73.79128604191624, 40.60823734570321], [-73.79115751304454, 40.608251801389216], [-73.791115556099, 40.60831537327887], [-73.79107360039092, 40.60837894565771], [-73.79117287672476, 40.60847459910882], [-73.79126583521303, 40.608535968322805], [-73.79133325013775, 40.60854833043536], [-73.79141980894755, 40.608602343748586], [-73.7914741007453, 40.60870281201171], [-73.7915832433979, 40.6087250414358], [-73.7917598105094, 40.60875718636972], [-73.7919771311963, 40.60872949173802], [-73.79214499541327, 40.60874948499667], [-73.79274948626171, 40.60864636687806], [-73.792920727321, 40.6086751632376], [-73.79292606044487, 40.608676060584486], [-73.79293361676645, 40.60868158407414], [-73.79299656635982, 40.60872759550929], [-73.79305747543663, 40.60876687407996], [-73.79311408510226, 40.60877147197761], [-73.79321161830435, 40.608779391207065], [-73.7932724972324, 40.608828461873294], [-73.7932854153539, 40.60885680763679], [-73.79329482918058, 40.60887746218556], [-73.79330754229287, 40.60892154898023], [-73.79340051851256, 40.60897802195192], [-73.79351938111789, 40.60897333932672], [-73.7935579122261, 40.60897830475483], [-73.79365104095642, 40.60898581496914], [-73.79372793482922, 40.6090496021196], [-73.79372780624465, 40.60909121804704], [-73.79377580688372, 40.60915005608764], [-73.79381432923432, 40.60915746918647], [-73.7938527911191, 40.609184466356325], [-73.79394893616826, 40.60925563254132], [-73.79394239014113, 40.60929478801782], [-73.79388132265457, 40.60930691922945], [-73.7938799776454, 40.609308174461006], [-73.79383944411542, 40.609346012506236], [-73.7938456491542, 40.60941701574549], [-73.79389688394807, 40.609468517220755], [-73.79397714240278, 40.609483348078506], [-73.79406359128787, 40.60957408030573], [-73.7941544822748, 40.609592483388184], [-73.79418557615644, 40.60959877853627], [-73.7942466746913, 40.6095768559605], [-73.79433651754034, 40.609608841147214], [-73.79443270053278, 40.609667765111794], [-73.79454166514711, 40.609748744979655], [-73.79454478656235, 40.609778126510626], [-73.79446700696276, 40.60980986612718], [-73.79446116506642, 40.609812249676345], [-73.7944674687868, 40.60985142933027], [-73.79452510633077, 40.60991028495337], [-73.79452178213785, 40.6099469994519], [-73.79455369214612, 40.61001560132704], [-73.79467600571685, 40.610106854540525], [-73.79467868056405, 40.6101088487307], [-73.79475872103917, 40.61019467293104], [-73.79480995093128, 40.610248621254094], [-73.79478325170489, 40.610262116499385], [-73.79476169204892, 40.610273014828095], [-73.79476157163172, 40.61031218299261], [-73.79480633875043, 40.61037836048121], [-73.79487372764495, 40.610400511721046], [-73.79494752459134, 40.61042757140562], [-73.79505655097407, 40.61048896619427], [-73.79508550143615, 40.61048901780995], [-73.79514006718176, 40.610489115075225], [-73.79523965260138, 40.610486845252964], [-73.79529736025292, 40.610523667976324], [-73.79537441438853, 40.61053604538012], [-73.79555747865007, 40.610546164067614], [-73.79566026938924, 40.61054634685171], [-73.79579178957168, 40.6106053324849], [-73.79603232973153, 40.61072816075954], [-73.79624422255735, 40.61076525650763], [-73.79637893337657, 40.61083159228128], [-73.79655209352363, 40.610929819676294], [-73.79679919436889, 40.61100859285839], [-73.79689556095903, 40.61100876317943], [-73.79692441928965, 40.61102595108638], [-73.79691788228041, 40.61106265896639], [-73.79691732271, 40.611070426818635], [-73.79691452867704, 40.611109165904274], [-73.79696581925703, 40.611143529177376], [-73.79701077653216, 40.61114850479514], [-73.79711999198145, 40.61114869761805], [-73.7971624469114, 40.61114877254543], [-73.79722278233363, 40.611148879002506], [-73.79731593657868, 40.61114904330363], [-73.79736731722681, 40.61115402893564], [-73.79737045480938, 40.611178515370305], [-73.79736385663233, 40.61121314479721], [-73.79735739829847, 40.61124703717324], [-73.79745676195705, 40.61131820439622], [-73.79752750476399, 40.611293849301305], [-73.79771064649509, 40.61127948261544], [-73.79794184478439, 40.61130681744336], [-73.79808315944648, 40.61131441143469], [-73.7982470203558, 40.61130245846462], [-73.7983634556353, 40.61131132153457], [-73.79837869240349, 40.611312481263546], [-73.79839061713035, 40.611316369093494], [-73.7985070549989, 40.61135432249593], [-73.79848442127278, 40.61140324294632], [-73.79848744997311, 40.6114644490874], [-73.79852584119676, 40.61151592428682], [-73.79864139333537, 40.61154550388557], [-73.79876353846713, 40.61151878962435], [-73.79886957949955, 40.61150673452405], [-73.79898529394339, 40.61148245771915], [-73.79903982792398, 40.61150703230239], [-73.79912946875938, 40.61160755768692], [-73.7991259695635, 40.6117030255618], [-73.79912554232706, 40.61184500898044], [-73.79911239018125, 40.61194535519122], [-73.79917318059519, 40.6120262469318], [-73.79932094418534, 40.612026505004486], [-73.79937883934394, 40.612002125167955], [-73.79938235953564, 40.61198821297142], [-73.79939184177391, 40.61195073879188], [-73.79944972926401, 40.61192880785067], [-73.7996105031139, 40.61187523140935], [-73.79970685649201, 40.61188029556174], [-73.7997262371791, 40.611868790745774], [-73.79978086995465, 40.61183636059688], [-73.79988381658069, 40.6117851308024], [-73.79988394133282, 40.611743514879436], [-73.8000159585105, 40.61163848040781], [-73.80007703500371, 40.61162389868435], [-73.80017340117134, 40.61162406625498], [-73.80025700070239, 40.6115972828881], [-73.80030502354087, 40.61165122317155], [-73.80034349615052, 40.61167576973235], [-73.80039810464088, 40.611675864574025], [-73.800436695706, 40.61166124361109], [-73.80049472403928, 40.61164318147944], [-73.80052668996203, 40.61164426408016], [-73.8005395167722, 40.61165163032446], [-73.80057149294561, 40.611700645932906], [-73.80057144723526, 40.61171594698154], [-73.80057138324905, 40.61173736566871], [-73.80056162959758, 40.61177651761589], [-73.8006033005496, 40.611805965851936], [-73.8006546021935, 40.61183787921729], [-73.80069947118977, 40.61187222968045], [-73.80074112012176, 40.61190902181293], [-73.80080125919478, 40.611933904481596], [-73.80073775474803, 40.61196042387409], [-73.8007119835992, 40.6119848595921], [-73.80067977373251, 40.612014179682696], [-73.80062192312624, 40.612023872280965], [-73.80056088361394, 40.61202621415962], [-73.8004774226873, 40.61200648463071], [-73.80041950019094, 40.61204065672905], [-73.80035197001881, 40.612065019851826], [-73.80023948919161, 40.612081960169164], [-73.80019944719878, 40.61213616188071], [-73.80019433453432, 40.612143082510855], [-73.80021346073205, 40.61219207587892], [-73.80019080019999, 40.612250789542124], [-73.80007134482238, 40.61245131953739], [-73.80007125684408, 40.61248069532333], [-73.80005830484173, 40.6125149449467], [-73.80004543342157, 40.61252610380153], [-73.79999067071368, 40.612573580330825], [-73.80001625835416, 40.612610344774794], [-73.80006058206881, 40.61264427738756], [-73.80007074363093, 40.61265205569257], [-73.80008992919088, 40.612681464999554], [-73.80008978990149, 40.6127279776089], [-73.80007677854819, 40.61278181181506], [-73.80006848765422, 40.6128016631935], [-73.80005736632921, 40.612828290398596], [-73.80001550298633, 40.61286248972253], [-73.80001213766509, 40.61291389175862], [-73.80000872033965, 40.61298243061675], [-73.79999243799428, 40.613055843302526], [-73.7999343527159, 40.61314387003032], [-73.79987003947546, 40.61316579119973], [-73.79978007368867, 40.613172978511734], [-73.79972220057734, 40.61319001343029], [-73.7996867102713, 40.61324136065051], [-73.79960319061053, 40.61324121507318], [-73.799542126579, 40.61325089985135], [-73.79947902190645, 40.61328836008456], [-73.7994681113871, 40.61329483582882], [-73.7993748959427, 40.61331425785442], [-73.79931694077328, 40.61335822059154], [-73.79930387847645, 40.61342918985625], [-73.7993517832537, 40.613522298682746], [-73.79939200146262, 40.6135474925859], [-73.79942232263285, 40.6135664856972], [-73.79947157403302, 40.61356969956874], [-73.79953794488276, 40.613574031379144], [-73.79959252486924, 40.61358391830638], [-73.7996502507532, 40.61361584331301], [-73.7996595570501, 40.61372602046493], [-73.799685101531, 40.613777474043054], [-73.7996367993324, 40.61381655754866], [-73.79959903264584, 40.61384520724655], [-73.79951767033212, 40.61390692658454], [-73.79947510832075, 40.614173686542635], [-73.79950698933646, 40.614254527145995], [-73.79947799745693, 40.614281405240085], [-73.79944259530328, 40.61430337542756], [-73.79950678346574, 40.61432307158209], [-73.79951311218878, 40.614354907498125], [-73.79951021374198, 40.61437755693212], [-73.79950653347994, 40.61440630390767], [-73.79950266109694, 40.614408401321874], [-73.79946148689586, 40.614430704547196], [-73.79945817122423, 40.61446497258375], [-73.79947688999992, 40.61451366178858], [-73.79949960873981, 40.61457275684785], [-73.79945762700558, 40.61464612461835], [-73.79944032859643, 40.61466299362397], [-73.79936741505662, 40.61473409616842], [-73.7993768387615, 40.614805104676854], [-73.79939159947278, 40.61486201971181], [-73.79940224366943, 40.614903069235034], [-73.79929581592357, 40.61504242030885], [-73.79928524480067, 40.615048588038725], [-73.79917031100385, 40.61511564261107], [-73.79912189571496, 40.61519144628431], [-73.79909594590342, 40.61527463368828], [-73.79906364553028, 40.61533333026594], [-73.79904620025569, 40.615337673794166], [-73.79902991524453, 40.615344123060886], [-73.79901522475771, 40.61535250608832], [-73.79900252053618, 40.61536259933242], [-73.79900205053465, 40.61538772682638], [-73.79900623216679, 40.615412654018094], [-73.79901498196996, 40.6154368833502], [-73.7990259290895, 40.615456639688794], [-73.79903991670028, 40.6154752484791], [-73.79905674147689, 40.615492439219196], [-73.79905492951963, 40.61551244394932], [-73.7990489771576, 40.61553197650975], [-73.79903903505591, 40.615550542484], [-73.79902535487066, 40.615567671921646], [-73.79900828287819, 40.61558293123431], [-73.79897187441813, 40.61556987336722], [-73.79893881229017, 40.61555239464188], [-73.79891001234513, 40.61553097923683], [-73.7989024492685, 40.61552399310073], [-73.798882156658, 40.61552117121894], [-73.79886153142323, 40.615520927515696], [-73.79884113376117, 40.61552326861022], [-73.79882151768798, 40.61552813091637], [-73.7988032159917, 40.6155353823705], [-73.7987867257609, 40.61554482601728], [-73.79877249488439, 40.615556205359745], [-73.79876090988529, 40.615569211325955], [-73.79875228542326, 40.61558349066319], [-73.79874685574764, 40.615598655532864], [-73.79874476833575, 40.615614294044015], [-73.7987596034431, 40.615665809649045], [-73.79877337735275, 40.61571471261737], [-73.79872463344243, 40.61573029717817], [-73.7986799466203, 40.61575181460492], [-73.79864054950353, 40.61577867137472], [-73.79860752880491, 40.61581012668706], [-73.79858179535775, 40.61584531289663], [-73.79856405899156, 40.6158832594461], [-73.79855468966309, 40.61588701778433], [-73.79854465671518, 40.61588959618309], [-73.79853421412332, 40.6158909293723], [-73.79852362623315, 40.615890983603514], [-73.79851316106756, 40.61588975750392], [-73.79850308354331, 40.61588728211109], [-73.79849364876466, 40.61588362008753], [-73.79848509556415, 40.61587886413417], [-73.79847764045894, 40.61587313464396], [-73.79847147216802, 40.61586657665371], [-73.79846674683574, 40.61585935617338], [-73.798463546398, 40.61585152959327], [-73.79846204259528, 40.615843412317126], [-73.79846227472295, 40.61583521645854], [-73.79846423671493, 40.61582715618434], [-73.79846787730132, 40.61581944211858], [-73.7984411026312, 40.61579187521958], [-73.79840921414502, 40.61576767343401], [-73.79837293055456, 40.6157473822248], [-73.7983330696275, 40.61573145891766], [-73.79829052975519, 40.6157202623939], [-73.79824626970642, 40.61571404500148], [-73.79820740884634, 40.615712793192124], [-73.79816866238929, 40.61571538603761], [-73.79816300611748, 40.615716090283584], [-73.79812948535049, 40.6157463350454], [-73.79810231859612, 40.6157800792528], [-73.79808291105947, 40.61581478786383], [-73.7980702376693, 40.615851258973024], [-73.79806456056252, 40.615888738242774], [-73.7980659971718, 40.61592645048177], [-73.79808371498052, 40.61592289435658], [-73.79810195949871, 40.61592161118434], [-73.79812023213249, 40.61592263603208], [-73.79813803352123, 40.61592594089244], [-73.79815487718109, 40.61593143544886], [-73.79817030280194, 40.61593896954392], [-73.79818388882569, 40.61594833728307], [-73.79819526396729, 40.615959282660796], [-73.79820411736088, 40.615971506557294], [-73.7982102070556, 40.61598467491258], [-73.79821336662795, 40.61599842785603], [-73.7982135097299, 40.61601238954078], [-73.79821099289485, 40.616060366072105], [-73.79819977174908, 40.61610761337566], [-73.79818006300701, 40.61615321888526], [-73.79815224732067, 40.616196301744026], [-73.7981168619278, 40.61623602981712], [-73.79807459027694, 40.61627163576555], [-73.79807726070206, 40.616281150942704], [-73.79807792215901, 40.61629086822486], [-73.79807655798858, 40.616300542881916], [-73.79807320254595, 40.61630993125736], [-73.79806794033756, 40.61631879690427], [-73.7980609038916, 40.61632691654107], [-73.79805227042077, 40.616334085674126], [-73.7980422573597, 40.61634012374823], [-73.79799600560548, 40.61635410137157], [-73.79789585988114, 40.616388899727255], [-73.79779911547128, 40.61642889740473], [-73.79770623653002, 40.61647390250824], [-73.79761766866868, 40.6165236991177], [-73.79755006077956, 40.61656692375326], [-73.7974865779239, 40.61657159119655], [-73.79742284775487, 40.61656971617212], [-73.79738616088451, 40.61657964154207], [-73.7973522037096, 40.616594149876335], [-73.79732195358513, 40.61661282359746], [-73.79729628117188, 40.61663512523925], [-73.79727592537725, 40.61666041291677], [-73.79726147208783, 40.616687958800156], [-73.79725333730627, 40.616716970062946], [-73.79725175517643, 40.61674661170099], [-73.79725677124432, 40.61677603056553], [-73.79726824114535, 40.61680437991874], [-73.7972858347583, 40.6168308438045], [-73.79730344910976, 40.61682809755179], [-73.79732140914075, 40.61682746430595], [-73.79733928101942, 40.61682895936337], [-73.79735663304317, 40.616832546610304], [-73.79737304606743, 40.61683813939532], [-73.79738812362802, 40.61684560262253], [-73.79740150151996, 40.616854756014526], [-73.79741285659374, 40.61686537846716], [-73.7974219145618, 40.616877213390644], [-73.79742873273153, 40.616890678809106], [-73.79743257606708, 40.61690481155978], [-73.79743334153846, 40.61691923278799], [-73.79742164092688, 40.61696737851773], [-73.79740304786137, 40.61701748579913], [-73.79737828290916, 40.617066017734686], [-73.79738846778457, 40.617071526947086], [-73.79739744399028, 40.61707814508095], [-73.79740500561536, 40.6170857203192], [-73.79741097919928, 40.61709407888925], [-73.79741567900955, 40.61710431943163], [-73.79741799741426, 40.61711502334536], [-73.79741786531413, 40.6171258716079], [-73.79741528664454, 40.61713654089428], [-73.79741033826045, 40.61714671321377], [-73.7974031676439, 40.6171560853871], [-73.79739398850936, 40.617164378082954], [-73.79738307443444, 40.61717134414276], [-73.79737437783018, 40.61717539776419], [-73.79736509127339, 40.61717860264889], [-73.7973025665911, 40.61723142723815], [-73.79723481710543, 40.61728036799297], [-73.7971622569712, 40.61732512572864], [-73.79714541720053, 40.61735256304975], [-73.79713317353263, 40.617381380164495], [-73.79716194894681, 40.61743281446217], [-73.7971950402285, 40.61748271879482], [-73.79723230812465, 40.61753088314312], [-73.79723859239994, 40.61753931321156], [-73.79724333558096, 40.61754830955737], [-73.79724685822482, 40.617559541699144], [-73.79724798226711, 40.61757105833647], [-73.7972466788679, 40.617582563992634], [-73.7972429814662, 40.61759376347242], [-73.79723698492384, 40.617604369435774], [-73.79722884309027, 40.61761410977018], [-73.79722082448347, 40.617607828187424], [-73.79720876210737, 40.617600780727976], [-73.7971953419327, 40.6175953424115], [-73.79718093007504, 40.61759166160027], [-73.79716591970326, 40.6175898387103], [-73.79715072031405, 40.617589923471726], [-73.79713574656108, 40.617591913572056], [-73.79711152049389, 40.617615720530324], [-73.79708298940882, 40.61763657451953], [-73.79705076574594, 40.61765402789129], [-73.79701554121124, 40.61766770599419], [-73.7969780719283, 40.617677315215566], [-73.7969518297396, 40.61768142573818], [-73.79692505707091, 40.61768217807085], [-73.79689848885276, 40.61767955156143], [-73.79687285440359, 40.617673618309794], [-73.79684885740897, 40.61766454118809], [-73.79682715660415, 40.61765256937057], [-73.79681528937235, 40.61765844504974], [-73.79680488647284, 40.617665756673006], [-73.79679624371698, 40.6176742963312], [-73.79678960686611, 40.617683821195136], [-73.7967851646435, 40.61769406042085], [-73.79678304336666, 40.61770472285115], [-73.79678330335601, 40.61771550529431], [-73.79678593722032, 40.617726101146225], [-73.79679087006495, 40.61773620910837], [-73.7967979616229, 40.61774554175527], [-73.79680711815642, 40.617749199716755], [-73.79681536108711, 40.61775395483375], [-73.7968224661755, 40.61775967774874], [-73.79682824013456, 40.617766212775834], [-73.79683252589022, 40.61777338213689], [-73.79683520685202, 40.61778099079728], [-73.79683621008719, 40.61778883177156], [-73.79683550830332, 40.61779669175436], [-73.79683312059072, 40.61780435692334], [-73.79681130421892, 40.61783395529965], [-73.79679645333708, 40.617865961080696], [-73.79678900569206, 40.61789943088135], [-73.79678918081787, 40.6179333781625], [-73.79679432022968, 40.61795855030528], [-73.79680366406913, 40.617983010023146], [-73.79681506826151, 40.61803887028155], [-73.79683551278102, 40.618093213468164], [-73.79685530183276, 40.618130335621814], [-73.79687931758346, 40.61816598032531], [-73.79690098172009, 40.61819271142592], [-73.79692502482435, 40.61821823422007], [-73.79697639665079, 40.61822811671141], [-73.79698912798531, 40.61826730754102], [-73.7970049966818, 40.618330984124846], [-73.79700484778857, 40.61837994395792], [-73.79697270043968, 40.61838723116663], [-73.79689881105924, 40.61838710064378], [-73.7968570552419, 40.6183845790924], [-73.79682174691476, 40.61837472544337], [-73.79678892958304, 40.618369400147465], [-73.79676073741287, 40.618364824671666], [-73.79670932209949, 40.618369629969294], [-73.79665464913575, 40.61838911794599], [-73.79660959004038, 40.61841596638524], [-73.79655815251495, 40.61842811505436], [-73.79651316930017, 40.61843048370957], [-73.79650023582766, 40.61845738896819], [-73.796455245125, 40.61846220602791], [-73.7964103073449, 40.618449885756306], [-73.7963556790422, 40.618454684535365], [-73.7963362531319, 40.61850361138954], [-73.79632956787496, 40.61858927954574], [-73.79635192027044, 40.618633383030996], [-73.79634215632429, 40.618674983523206], [-73.7962938552147, 40.61871161784586], [-73.79631300438106, 40.618753267891556], [-73.79628721338942, 40.618782598113334], [-73.79623256238474, 40.618794741444866], [-73.79622603236346, 40.618829002505706], [-73.79628373194903, 40.618870720884715], [-73.79628362735241, 40.61890499283249], [-73.79621915173756, 40.618978319534456], [-73.79620007770853, 40.61901561336169], [-73.79618784068263, 40.61905453804855], [-73.79618266830488, 40.619094369517356], [-73.79618465680534, 40.61913436682054], [-73.79619376920586, 40.61917378592504], [-73.79620983600927, 40.61921189355172], [-73.79623255834962, 40.61924798081692], [-73.79625038803628, 40.61926968869612], [-73.79629197255309, 40.61932851423564], [-73.79623393627779, 40.61939695614389], [-73.79615340374144, 40.619467806573454], [-73.79612434843372, 40.61951426669914], [-73.79615312712687, 40.61955838278801], [-73.79618830890925, 40.61960985302919], [-73.79615920936664, 40.61967100171486], [-73.79602718518987, 40.61977113716199], [-73.7959703456468, 40.61978065515557], [-73.79596932719024, 40.61978082573557], [-73.79592429747481, 40.6197978827093], [-73.79593052903357, 40.61986154232402], [-73.79559534308251, 40.620211013607275], [-73.79555957594641, 40.62035048679241], [-73.79557680732991, 40.620526585312554], [-73.7954917359122, 40.62075602931512], [-73.79547474221752, 40.620776290894604], [-73.79549708296938, 40.62080707886347], [-73.7955172338287, 40.62083873209171], [-73.79553742958896, 40.62087569380565], [-73.79555463970607, 40.620913522525065], [-73.79555062776872, 40.620921877976166], [-73.79554530911442, 40.620929798484546], [-73.79553649126696, 40.62093932848453], [-73.79552579101806, 40.620947664467955], [-73.79551348247503, 40.62095459289186], [-73.79549988094514, 40.62095993627105], [-73.79545176147752, 40.62095970637506], [-73.79540418923348, 40.620965225133986], [-73.79535833969949, 40.62097635618212], [-73.79531534579557, 40.62099282447685], [-73.79527626988178, 40.62101422309462], [-73.79524207751014, 40.62104002328583], [-73.79521361356514, 40.62106958753898], [-73.79519736218977, 40.62113075936381], [-73.79515200782235, 40.62115464508866], [-73.79511148378306, 40.62118312978857], [-73.79507658678963, 40.62121565344854], [-73.79504800293363, 40.6212515766458], [-73.79502629419169, 40.62129019312082], [-73.79501188737623, 40.621330743662135], [-73.7950050657438, 40.62137243103301], [-73.79500514352377, 40.62140576001699], [-73.79501007899763, 40.621438876202525], [-73.79503337737094, 40.621472753364685], [-73.79506306561069, 40.62150359299404], [-73.79509847534585, 40.621530700789556], [-73.7951388093929, 40.62155346646536], [-73.79518315970257, 40.62157137749001], [-73.79520301100749, 40.62159021267853], [-73.79521891255902, 40.62161111134561], [-73.7952305015144, 40.62163359662908], [-73.79523751343378, 40.62165715546329], [-73.79516938062133, 40.621695014715996], [-73.7950962193355, 40.62172696487349], [-73.7950189085003, 40.62175262209942], [-73.79493837689395, 40.62177167815794], [-73.79488671677727, 40.62185481870539], [-73.79487299710861, 40.62186695103254], [-73.79485692002076, 40.62187726656349], [-73.7948388946738, 40.62188550276833], [-73.79481937981173, 40.62189145003592], [-73.79479887208713, 40.6218949570082], [-73.79477789342168, 40.62189593443298], [-73.79475697772168, 40.62189435743464], [-73.79473665729232, 40.621890266147815], [-73.79471744928763, 40.62188376469572], [-73.7946998425511, 40.62187501854031], [-73.79468428517264, 40.62186425027076], [-73.7946806977154, 40.621850909137535], [-73.79467422297094, 40.621838215910586], [-73.79466504457541, 40.62182653059095], [-73.79465342284485, 40.62181618459348], [-73.79463968739142, 40.62180747134773], [-73.79462422777566, 40.621800637975596], [-73.7946074824578, 40.621795878282455], [-73.79458992636214, 40.62179332726087], [-73.79457205740796, 40.62179305726193], [-73.7945498866044, 40.62179299670093], [-73.79453008043839, 40.62179537252888], [-73.79451097265147, 40.62180000106543], [-73.79449300186825, 40.62180677606106], [-73.79447658061319, 40.621815541993946], [-73.79446208584234, 40.62182609763951], [-73.79444985028817, 40.6218382006897], [-73.79444015482304, 40.621851573315205], [-73.79443425229591, 40.62189321840058], [-73.79442386285947, 40.62194964635316], [-73.7944107655114, 40.622005746156155], [-73.79442001628661, 40.62203446985182], [-73.7944353710467, 40.62206163324823], [-73.79445640734178, 40.62208648899569], [-73.79448254640309, 40.6221083532343], [-73.79451306906626, 40.622126624409596], [-73.79454713555884, 40.62214079982292], [-73.79458380860342, 40.622150489463145], [-73.79460957198225, 40.622158726001054], [-73.7946331233919, 40.62217017909578], [-73.79465377756067, 40.62218451549909], [-73.79467093351647, 40.62220131806769], [-73.79468409207296, 40.622220097900176], [-73.79469287035404, 40.62224030856271], [-73.7946970129351, 40.62226136198848], [-73.79469703112095, 40.622276965022344], [-73.79469349867145, 40.622296150456435], [-73.79468611203347, 40.62231468817971], [-73.79468715884306, 40.6223683225769], [-73.79467951459112, 40.62242164572645], [-73.79466329602539, 40.62247384309935], [-73.79463875087076, 40.622524117361976], [-73.7946062540462, 40.62257170055433], [-73.79456630193827, 40.62261586582284], [-73.79451950481986, 40.62265593852227], [-73.79446657752885, 40.62269130652243], [-73.79440832854812, 40.6227214295587], [-73.79434564765546, 40.62274584748536], [-73.79421064090884, 40.622765875014835], [-73.79407428620424, 40.62277961327007], [-73.79393708771487, 40.62278701145347], [-73.7937995527352, 40.62278804221028], [-73.79366218980341, 40.62278270172928], [-73.79352550682152, 40.62277100975673], [-73.79339000917749, 40.62275300952429], [-73.792883580545, 40.622559220696914], [-73.79260056336351, 40.622462721580554], [-73.79226351352034, 40.62236908907301], [-73.79187800516166, 40.622361047834765], [-73.79162058913477, 40.62231334348308]]], [[[-73.76670827781236, 40.61491086618553], [-73.76825288003378, 40.614877725169315], [-73.77397692018825, 40.61600357567147], [-73.76873454755717, 40.62090086822023], [-73.76745926975256, 40.620511322031255], [-73.7667193110134, 40.61500363286468], [-73.76670827781236, 40.61491086618553]]], [[[-73.84304421296773, 40.617737696390435], [-73.84283573528793, 40.61660943616361], [-73.84400850201834, 40.61704136615355], [-73.84454193473684, 40.614867921675135], [-73.8409994253963, 40.613029126216134], [-73.83825667290532, 40.613847216216406], [-73.8407944240835, 40.60564326638265], [-73.8471480968766, 40.60361424219198], [-73.85179402215192, 40.60689716858368], [-73.85124092910449, 40.607719613414964], [-73.84779013405834, 40.60923538526278], [-73.84816769367677, 40.61253422829745], [-73.84731105470064, 40.613438461926826], [-73.84639522711923, 40.616036814801745], [-73.84614804513843, 40.61772842036632], [-73.84304421296773, 40.617737696390435]]], [[[-73.85523067631884, 40.61613145335797], [-73.85530325465119, 40.6131454135728], [-73.85236704384849, 40.61315598907671], [-73.85376845962072, 40.61408759651678], [-73.85263195046835, 40.61509408190896], [-73.84973986306498, 40.61515605814331], [-73.85010857555366, 40.61021219334599], [-73.8551559228834, 40.606120513001486], [-73.85708638173246, 40.60646824293355], [-73.85704052727723, 40.60829948887597], [-73.85901755318278, 40.60947575392508], [-73.85924855452187, 40.61125483087423], [-73.85802093146347, 40.61264381691059], [-73.85648360749232, 40.61319069486381], [-73.85858056782772, 40.61691708722184], [-73.85523067631884, 40.61613145335797]]], [[[-73.814090115668, 40.614466920099765], [-73.81413268075418, 40.61436629043908], [-73.81416449897701, 40.61429106964075], [-73.81441441488526, 40.614101424008155], [-73.8146826267648, 40.61397515785498], [-73.81486725972127, 40.61401064975278], [-73.81486681073604, 40.61417254228434], [-73.814857222891, 40.614299226214776], [-73.81504193462983, 40.61430656181428], [-73.81535634872849, 40.61417332968294], [-73.81549526637583, 40.61403981513316], [-73.81535703015994, 40.61392697127488], [-73.81536653934614, 40.6138284438187], [-73.81519143554301, 40.61368738556275], [-73.81499776068877, 40.61358149086307], [-73.81487519159299, 40.61336984895391], [-73.81479563255313, 40.613194029981294], [-73.81485122699522, 40.61313077018466], [-73.81487213107738, 40.61311332049703], [-73.81503638494628, 40.6129762137494], [-73.81523956494507, 40.61298357925722], [-73.81528551351116, 40.61306811885985], [-73.81527590714306, 40.61320184104876], [-73.81532195326875, 40.61325118690909], [-73.81546948317194, 40.61334292900841], [-73.81560806899893, 40.61332907375156], [-73.81571906149262, 40.61327294163629], [-73.81578420222384, 40.61309707529883], [-73.81588601679647, 40.613019810910956], [-73.81598763622685, 40.61301293489119], [-73.81615626666235, 40.61294211575494], [-73.8164315038978, 40.614282334964926], [-73.81623366684653, 40.61423104619861], [-73.8161412617739, 40.61424497658887], [-73.81598412428654, 40.61428695826425], [-73.81582696674197, 40.614335978434866], [-73.81569763477397, 40.614342809885336], [-73.81554994675568, 40.61430737811123], [-73.81538349309263, 40.6143774996555], [-73.81523555167247, 40.61443357256184], [-73.8150691571859, 40.61448257634695], [-73.81495837543912, 40.61446128234239], [-73.81471812627856, 40.61449608855192], [-73.81458844285291, 40.61462961822811], [-73.81444032345223, 40.61474903867063], [-73.81420926754464, 40.614703443269974], [-73.81408062432926, 40.61455840923629], [-73.814090115668, 40.614466920099765]]], [[[-73.81496830662114, 40.61042065495561], [-73.8150251664767, 40.61035320555015], [-73.81507481822895, 40.610282527928845], [-73.8151169482724, 40.61020906853107], [-73.8151512905161, 40.61013329136652], [-73.81517762806351, 40.61005567508305], [-73.81519579458158, 40.60997670994407], [-73.81520567535078, 40.60989689473104], [-73.81520720849484, 40.60981673379666], [-73.81559858789666, 40.61067251616471], [-73.8154036618984, 40.610384802015474], [-73.81526445493755, 40.61049963818177], [-73.8150387432527, 40.61072453111434], [-73.81484699639005, 40.61081905690231], [-73.814613646295, 40.61093407380671], [-73.81450261566708, 40.61105847350542], [-73.81449876827786, 40.61073545365928], [-73.81458991478213, 40.610695427156486], [-73.81467660241397, 40.61065001075345], [-73.8147582836064, 40.61059949133032], [-73.81483444241965, 40.6105441880006], [-73.81490459780065, 40.61048445009514], [-73.81496830662114, 40.61042065495561]]], [[[-73.86966442958492, 40.606540123412906], [-73.87109330768071, 40.604694173994694], [-73.87105656646135, 40.606285088494246], [-73.87245579811875, 40.60818553034854], [-73.87268959311653, 40.60917799830844], [-73.87300122724774, 40.61055545845987], [-73.87180082867997, 40.61028041358032], [-73.8710387011171, 40.60972358252655], [-73.87076008541273, 40.60870540090801], [-73.86966442958492, 40.606540123412906]]], [[[-73.79420172624032, 40.607730675613354], [-73.79352152715475, 40.60632759139594], [-73.79399754952593, 40.60608015346263], [-73.79509002319158, 40.607271060105596], [-73.79424799033224, 40.60590038003164], [-73.79696327795033, 40.60411784876779], [-73.8012001966788, 40.60391220065208], [-73.8018028511679, 40.604211431452256], [-73.80428530678597, 40.604519279530564], [-73.80520676583323, 40.60673953810017], [-73.80419695590167, 40.608744199035584], [-73.80159206744115, 40.61023096250127], [-73.79878198680099, 40.61033327568909], [-73.79630654215427, 40.60933803253817], [-73.79609453981675, 40.6088264839427], [-73.79559832739619, 40.60872535630222], [-73.79529977914471, 40.608229878318475], [-73.79420172624032, 40.607730675613354]]], [[[-73.83244207358176, 40.605929449536745], [-73.83454144109655, 40.60547738376589], [-73.83587601623029, 40.605636907545566], [-73.83610156628845, 40.60736279382329], [-73.83428342685944, 40.60918568185396], [-73.83373275973192, 40.60928603307339], [-73.83380311515587, 40.609550591858046], [-73.83252192275347, 40.610384993603816], [-73.83140871257932, 40.609421755813216], [-73.83067824786619, 40.60878967826978], [-73.83032947905777, 40.60848787991649], [-73.83045815392722, 40.606669201403214], [-73.83244207358176, 40.605929449536745]]], [[[-73.82607472604538, 40.60843779954612], [-73.82661051008785, 40.60819620584165], [-73.82771104235977, 40.608398668130704], [-73.82805077260065, 40.61004629686527], [-73.82688326414805, 40.6095966780694], [-73.82607472604538, 40.60843779954612]]], [[[-73.86702399475149, 40.60806817876942], [-73.86874317559169, 40.60703517927931], [-73.86868468826752, 40.608241158183915], [-73.86777501561137, 40.60853948877828], [-73.86702399475149, 40.60806817876942]]], [[[-73.82718282107048, 40.607919778091194], [-73.82679537497145, 40.607720440593134], [-73.82629763015808, 40.607817072229714], [-73.82617361009859, 40.60755411178232], [-73.8263911775284, 40.60735743365122], [-73.82598212776448, 40.60715799759935], [-73.82590092720767, 40.60646593064943], [-73.82649618795769, 40.60622446371768], [-73.8269052458468, 40.606423897977294], [-73.82861671457653, 40.60583848413761], [-73.82866060090204, 40.606256158374734], [-73.82815085191197, 40.60795028983291], [-73.82718282107048, 40.607919778091194]]], [[[-73.81569926225602, 40.6064570673649], [-73.8155212646286, 40.60641964237777], [-73.8155168973555, 40.60643588521717], [-73.81546066483351, 40.60642813700742], [-73.81552816722274, 40.606163069945154], [-73.81558381764519, 40.60617290276205], [-73.81552536723665, 40.60640738028192], [-73.81570815854799, 40.606439294195894], [-73.81572726392088, 40.606354262277904], [-73.81576751589343, 40.60637159210934], [-73.81574174081905, 40.60646524511771], [-73.81571005865179, 40.60645862779], [-73.81569926225602, 40.6064570673649]]], [[[-73.81339665223344, 40.60436407224534], [-73.81184130264785, 40.603134665085776], [-73.81085365186647, 40.60322371301433], [-73.81053636758658, 40.60249598881469], [-73.80986333857152, 40.60189579000784], [-73.80992146111767, 40.60178709534227], [-73.80999658353151, 40.601696439012215], [-73.8100342593758, 40.6016109084604], [-73.81003453242589, 40.60151494013756], [-73.8100244640379, 40.60146564385276], [-73.80994982919876, 40.601385114165566], [-73.80991258166577, 40.60132020993271], [-73.8099433702624, 40.601263199129335], [-73.80999459024659, 40.60120103437945], [-73.81003914574595, 40.60108957743949], [-73.81003591240686, 40.60102991701338], [-73.81004293231338, 40.60095471054518], [-73.81002618357127, 40.60086130844196], [-73.80997877227131, 40.60078082493845], [-73.80993821798249, 40.60068219691062], [-73.80992817216713, 40.60062511756395], [-73.80989100609673, 40.600531682170455], [-73.80986053496292, 40.6004771638921], [-73.80985064502396, 40.600365616758594], [-73.80988145450942, 40.6003008250928], [-73.80993943621954, 40.60025423403637], [-73.80999055209632, 40.60022838130371], [-73.81000088663791, 40.600184305288366], [-73.81001471187018, 40.600109109564016], [-73.80997059406056, 40.60006753738019], [-73.81000132948452, 40.60002868281523], [-73.81006930440077, 40.60005732629201], [-73.81014417523036, 40.60005485564211], [-73.81014430798412, 40.60000816889966], [-73.81010697922734, 40.59997179570274], [-73.81004927959846, 40.59991982516422], [-73.80998813232418, 40.599883412557276], [-73.80997465251733, 40.59983670280388], [-73.81005295429873, 40.59982386412303], [-73.81010053621723, 40.59984469179265], [-73.81013110919791, 40.599862898655715], [-73.81018896434578, 40.599860400365955], [-73.81022311058264, 40.59981895701237], [-73.81024025805883, 40.59977229836463], [-73.81024380045234, 40.599723024061134], [-73.81024048657294, 40.599691893612174], [-73.81022695590293, 40.59966334015216], [-73.81026778270058, 40.599666001924916], [-73.81029493857316, 40.59968938965007], [-73.81030183970356, 40.59965568220466], [-73.81030198708322, 40.59960380843507], [-73.81028510566179, 40.59955709360473], [-73.81025462859844, 40.59950516927546], [-73.81025479075838, 40.59944810730722], [-73.81025503399489, 40.599362515359445], [-73.81033001323586, 40.59932113988604], [-73.81035740538844, 40.59926152899451], [-73.81034740297027, 40.59918888826432], [-73.81033056583131, 40.59912661051977], [-73.81030695226997, 40.59905394732009], [-73.81029011586071, 40.598991670072344], [-73.81033106684644, 40.59895023791682], [-73.81038898814394, 40.59892439673993], [-73.8104163272087, 40.59888294259712], [-73.81040964716155, 40.59883883796755], [-73.8104880810805, 40.59877931173957], [-73.81058684830285, 40.59874834959015], [-73.8106856684498, 40.59869923159592], [-73.81078441560808, 40.59867605082374], [-73.81085937905794, 40.59863986152541], [-73.81090036686123, 40.59858546109986], [-73.8109616972456, 40.59855703088099], [-73.81104335601387, 40.59855975903601], [-73.8111181504355, 40.59858322539088], [-73.81117974133485, 40.59858489283772], [-73.81122022555856, 40.59858598697425], [-73.81131560541287, 40.59854983208716], [-73.81138719612315, 40.5985032621373], [-73.81141798216156, 40.598446250923026], [-73.81148965192016, 40.59837115042115], [-73.81152379592731, 40.598329707176575], [-73.81153417375009, 40.598270068095545], [-73.81150861997385, 40.598216183527164], [-73.81157550345523, 40.59814119925956], [-73.81172811474971, 40.59827557421149], [-73.81178922582542, 40.598324953967484], [-73.81193874830761, 40.59839523079278], [-73.81205766969288, 40.59845767362346], [-73.81222073287758, 40.598553908477776], [-73.81222404674801, 40.59858503769893], [-73.81221034899123, 40.59861614029549], [-73.81222386439053, 40.59864988071621], [-73.81224417176405, 40.598688819784165], [-73.8122678748163, 40.59873035775287], [-73.81228818953024, 40.59876670363495], [-73.81239671422856, 40.59889656680437], [-73.81253246018585, 40.59902647427727], [-73.81261044089611, 40.59912775679624], [-73.81272920416659, 40.59924726207325], [-73.81297362359823, 40.59945515849486], [-73.81305369627488, 40.59950371201523], [-73.81329372961245, 40.59981659270371], [-73.81444738136224, 40.60054316885366], [-73.81501471568424, 40.60205629156354], [-73.8142869369858, 40.60445566622167], [-73.81339665223344, 40.60436407224534]]], [[[-73.86702905185578, 40.603743388853935], [-73.8676819415421, 40.603070766677334], [-73.8683080846461, 40.603139161146146], [-73.86793505372694, 40.60396113545295], [-73.86702607287029, 40.6041715840082], [-73.86702905185578, 40.603743388853935]]], [[[-73.85243335807012, 40.59733339779527], [-73.85269029351811, 40.597170750463306], [-73.85286117431974, 40.597244308232646], [-73.85365316421074, 40.59683787744518], [-73.853995595994, 40.59668348634672], [-73.85436974704125, 40.596692110402316], [-73.85465863090106, 40.596578388927576], [-73.85492648581442, 40.596301664373286], [-73.85595300562048, 40.59618887618966], [-73.85673364394975, 40.59607576435409], [-73.85716132350703, 40.59604369786466], [-73.85778119968528, 40.59611781491794], [-73.86044420534076, 40.596471905596275], [-73.86054977985192, 40.59706302019168], [-73.86141485166918, 40.597753696377694], [-73.86177276370987, 40.598299178571146], [-73.86274820792643, 40.59907120592458], [-73.86328663134141, 40.599810042163234], [-73.86335999147606, 40.600322202771196], [-73.86297506260962, 40.601018272615576], [-73.86187189847233, 40.602164325815906], [-73.86154081260408, 40.60238035986936], [-73.86117495608606, 40.60248664842694], [-73.86112814224546, 40.60255033107426], [-73.86078169166855, 40.60260840025625], [-73.86048884213515, 40.60233934739461], [-73.85905914327755, 40.602061431573915], [-73.85482595782968, 40.601867195353634], [-73.85471200729276, 40.60164902532504], [-73.85427387360807, 40.601430436697015], [-73.85372090340685, 40.60140066517852], [-73.85276838155842, 40.600948854025916], [-73.85257851635212, 40.600570688348604], [-73.8520453763197, 40.600206622800954], [-73.85176045305586, 40.59969751381257], [-73.85076748001559, 40.598839443837406], [-73.85153122893772, 40.59843393622049], [-73.85200481909777, 40.597748438274294], [-73.85243335807012, 40.59733339779527]]], [[[-73.87019491489939, 40.598996405901886], [-73.87108141811476, 40.598901147470094], [-73.87049411914771, 40.602604446204595], [-73.87026280564918, 40.60168122225861], [-73.87019491489939, 40.598996405901886]]], [[[-73.8231174097477, 40.60007949252535], [-73.82311789977163, 40.60005688484153], [-73.82313294399587, 40.600057236353436], [-73.82313384374159, 40.600042165446055], [-73.82314760323396, 40.60004087570288], [-73.82315293179705, 40.599976662824794], [-73.82317356168161, 40.59997800515576], [-73.82316692767215, 40.60004811439995], [-73.82317337306215, 40.60004910637507], [-73.82317376718535, 40.60006286885787], [-73.82318408196349, 40.60006321191322], [-73.82318015964296, 40.60008384902813], [-73.8231174097477, 40.60007949252535]]], [[[-73.82292757811203, 40.60006142816309], [-73.8229361266004, 40.60004040516013], [-73.822978576463, 40.600043707224835], [-73.82300436542411, 40.59992561919807], [-73.82303195183424, 40.59993051694214], [-73.82300403883895, 40.60004860044176], [-73.82304012567126, 40.600050274348874], [-73.82304007849375, 40.60006807478574], [-73.82292757811203, 40.60006142816309]]], [[[-73.82445629476595, 40.59911583868227], [-73.82439004315057, 40.59909811302643], [-73.82439431638863, 40.599087873285136], [-73.82446713343744, 40.599107464858584], [-73.82450212274327, 40.599008662160735], [-73.8245173365546, 40.59896580873303], [-73.82436255896116, 40.59895043633271], [-73.82435472080273, 40.59894946809494], [-73.82433824076556, 40.59894743204931], [-73.82422585197662, 40.59893354607241], [-73.82417340595445, 40.59892573150956], [-73.82412749012028, 40.59891622247147], [-73.82407791355021, 40.59890920383301], [-73.82406984190722, 40.598922481127985], [-73.82395853199995, 40.59888785399994], [-73.82395871079126, 40.59887689683851], [-73.82405944857535, 40.598889422330345], [-73.82410071394857, 40.59889732688409], [-73.82418471900705, 40.59891282190698], [-73.82427026010049, 40.598925932927], [-73.82434640845658, 40.59893433752879], [-73.82452271276402, 40.598951263990585], [-73.82453702420634, 40.59891221796511], [-73.82461363488147, 40.598723790015384], [-73.824617199115, 40.59871502361059], [-73.82461901353119, 40.59871056004336], [-73.82463684641318, 40.59866669670713], [-73.82463881301405, 40.59866186229396], [-73.8246517839916, 40.59862995900571], [-73.8246632500266, 40.59860175816713], [-73.82468443801113, 40.598553328229684], [-73.82469739000635, 40.59852068593453], [-73.82470460364472, 40.59850250658538], [-73.82470658714921, 40.598497508688], [-73.82471777465584, 40.59846931294721], [-73.82472773089512, 40.598444221491945], [-73.82474292407974, 40.59839899042229], [-73.82474761015331, 40.59840015536492], [-73.82474907564067, 40.598389453972615], [-73.82477088992478, 40.5983918438742], [-73.82476908857363, 40.598396277308574], [-73.82474806935706, 40.598448025943796], [-73.8247464666553, 40.59845196999208], [-73.8247324778652, 40.598486409140925], [-73.82471455960446, 40.59853052097605], [-73.82470430756192, 40.59855576191769], [-73.82470216485918, 40.598561038006395], [-73.82468323745927, 40.59860709767021], [-73.82468179156804, 40.59861083220977], [-73.82468019919393, 40.59861494162449], [-73.82466068784454, 40.598665332706396], [-73.82465836742638, 40.59867132437647], [-73.82464109016925, 40.59871594445675], [-73.82463894522901, 40.598721482891946], [-73.82462212690153, 40.59876491622056], [-73.82462028423028, 40.59876967677444], [-73.82460303016, 40.598814235903426], [-73.82460174601978, 40.59881755354045], [-73.82458387696438, 40.59886370040984], [-73.82458200685116, 40.598868530613565], [-73.82456502381463, 40.59891238753149], [-73.82456317472412, 40.59891716231478], [-73.82454580594191, 40.598962020467106], [-73.82454404027547, 40.59896657959944], [-73.82450563123234, 40.599065769777305], [-73.82450339642126, 40.5990715419436], [-73.82448805568868, 40.59911116118601], [-73.82453084258555, 40.59911949829181], [-73.82452624858546, 40.599129027223235], [-73.82447690960616, 40.59912000982335], [-73.82445629476595, 40.59911583868227]]], [[[-73.86952707548932, 40.598713750354406], [-73.86967070711478, 40.59668856362211], [-73.87020899836229, 40.59695423278937], [-73.86952707548932, 40.598713750354406]]], [[[-73.83668274106707, 40.5949466970158], [-73.83678395742554, 40.594887574408126], [-73.83677470021847, 40.59483025309939], [-73.83670920760002, 40.59471196329247], [-73.83647454514829, 40.59460059573057], [-73.83624456552002, 40.59449639775504], [-73.83599100458636, 40.59442798314016], [-73.83587798121873, 40.594531692254336], [-73.83581100477463, 40.59453372437038], [-73.83576520416725, 40.5945351125751], [-73.83565342677645, 40.59447730803854], [-73.83559157397217, 40.59444532110318], [-73.83548957637792, 40.59445475446702], [-73.83541276835358, 40.59454893562655], [-73.8352719938995, 40.594473517514494], [-73.83511720319443, 40.59436584359023], [-73.83505672124198, 40.59412219884756], [-73.83513188170217, 40.59412947010124], [-73.83514512951908, 40.594097700379216], [-73.83516024257754, 40.5940614577799], [-73.83511348532718, 40.593968265052986], [-73.83496333298632, 40.59388566970452], [-73.8348693335679, 40.59389628051196], [-73.83433212684879, 40.59366076774679], [-73.83431911140642, 40.59361700835926], [-73.83430516205212, 40.593557889352816], [-73.83433345400043, 40.59351763526879], [-73.8343018578103, 40.59346923616374], [-73.83431256331623, 40.593415525880886], [-73.83422463139402, 40.59334824199578], [-73.83410834072814, 40.59334807417262], [-73.83401323492436, 40.59333181881704], [-73.83387239778445, 40.59328326224798], [-73.83385114672677, 40.59332621139611], [-73.8337313334338, 40.593326038098006], [-73.83361163952554, 40.59327751230226], [-73.83352017803828, 40.59321290776129], [-73.83349924180611, 40.59312960217402], [-73.833481783144, 40.593065105808606], [-73.833362250994, 40.59295210791204], [-73.83329545012083, 40.59289022545178], [-73.83324963971388, 40.59289015898433], [-73.83323193224741, 40.59292505599578], [-73.83322124739877, 40.592970706867405], [-73.83314367447208, 40.59298939894405], [-73.83308377330324, 40.59298662645063], [-73.83303817170851, 40.5929032839407], [-73.83303504965276, 40.592742101730266], [-73.83307051685698, 40.59265081882316], [-73.83313425607417, 40.59252734092462], [-73.83316620690034, 40.59243336671119], [-73.83312766467343, 40.59234466298055], [-73.83312434323057, 40.59226407007009], [-73.83279328686963, 40.59218837240355], [-73.83271223681659, 40.59218825443817], [-73.83265939228929, 40.592182803648186], [-73.83262065649224, 40.592172001885004], [-73.8325749810638, 40.592118209113956], [-73.83260558943994, 40.59208255751101], [-73.83263966877404, 40.592042862938094], [-73.83262993706295, 40.591983974348985], [-73.83260892825395, 40.59193021801814], [-73.83267596985205, 40.591895394120044], [-73.83274648102432, 40.59188206475373], [-73.83276840016067, 40.591892922751676], [-73.83280631172961, 40.59191170135953], [-73.83281672314727, 40.59197618808564], [-73.83288011866262, 40.59198971114878], [-73.83298585493124, 40.5919818067063], [-73.83306701801895, 40.59193625658477], [-73.83309890085683, 40.591869145318185], [-73.833049721272, 40.59180728930483], [-73.83305697727148, 40.591724024246005], [-73.83307487165115, 40.59161391211072], [-73.83314190531755, 40.59158177393057], [-73.83324747991823, 40.591638338917456], [-73.83321910088924, 40.59171351532739], [-73.83319072245837, 40.59178869055789], [-73.83322927027885, 40.59187470777639], [-73.83330658794601, 40.59195809505975], [-73.83344030034272, 40.592036192044176], [-73.83355999167891, 40.59208471902894], [-73.8336726955662, 40.59210905841047], [-73.83375728840898, 40.592101122149224], [-73.83367997692342, 40.59201504901109], [-73.83369071615022, 40.59194790630625], [-73.83370144153317, 40.59188613742612], [-73.83378258395456, 40.59184864661736], [-73.83387770851942, 40.59185684234878], [-73.83393396278849, 40.59190796439203], [-73.83399721888573, 40.59197789953869], [-73.83395473218756, 40.592058427245924], [-73.83396870763654, 40.59210680049318], [-73.83408153119412, 40.59208278609028], [-73.83412045489972, 40.59201837121284], [-73.83422638358282, 40.59193256281543], [-73.83414197115772, 40.591867969430936], [-73.83410693316273, 40.591787329758176], [-73.83407541783315, 40.591706695160696], [-73.833994523274, 40.59164479442239], [-73.83392421303131, 40.591577534575535], [-73.83398778268769, 40.59152121353043], [-73.83409020087223, 40.59143002868278], [-73.83422777067327, 40.59137381382269], [-73.83420674164263, 40.59132811592586], [-73.8341504267253, 40.591301171794086], [-73.83406576840979, 40.591335971784574], [-73.83403034912305, 40.591408450384016], [-73.83388588500925, 40.591402868961204], [-73.83376258339992, 40.59138925980156], [-73.83360056172245, 40.591359475252], [-73.83349484594545, 40.59135932211596], [-73.83343130283038, 40.59140489758093], [-73.83335740358869, 40.59136449555018], [-73.833283482777, 40.59133215278572], [-73.83320601241849, 40.59131055016864], [-73.8331144130332, 40.591302358496705], [-73.83305089657865, 40.591337187773185], [-73.83299440094652, 40.59138277323608], [-73.83292381035615, 40.591428338680565], [-73.83287440201715, 40.59145781519542], [-73.83283563342253, 40.591460444804795], [-73.83281812203546, 40.59141743844208], [-73.83277600359993, 40.59135022007501], [-73.83268085970118, 40.59135008157465], [-73.8326495671695, 40.591343717459395], [-73.83256110970056, 40.591325729776635], [-73.83256476938875, 40.59127200937696], [-73.83260021625141, 40.59118878591861], [-73.83260741887503, 40.59112701082998], [-73.83260052601841, 40.591065216882264], [-73.83253006957867, 40.59105705437029], [-73.8325197333496, 40.59096301885267], [-73.83248832294223, 40.59084208957843], [-73.83247096606243, 40.59073729947652], [-73.83247465948892, 40.59067014660304], [-73.83249597709224, 40.59060033392233], [-73.8324996885007, 40.590525122900004], [-73.8324822588798, 40.59044988105836], [-73.83245774684436, 40.59038805973487], [-73.83246148069871, 40.59030479057107], [-73.83253569485043, 40.59021893579835], [-73.83262739367129, 40.59018683386004], [-73.83274377975108, 40.59014670910927], [-73.83284962070249, 40.590095823552915], [-73.83298352367508, 40.59009601825906], [-73.83315739581462, 40.5900997583145], [-73.83328307099791, 40.590085708917634], [-73.83342772609485, 40.59001338777054], [-73.83354043983051, 40.5900323546316], [-73.83358956500702, 40.59011570156727], [-73.83367775384623, 40.590078221033835], [-73.8337730080737, 40.59003269130758], [-73.83387892890823, 40.589949569879124], [-73.83400232738634, 40.58992288484003], [-73.83411510118847, 40.589917675027834], [-73.83423133832333, 40.58993664680044], [-73.83439339168011, 40.58995299799172], [-73.83450948849541, 40.5900283816892], [-73.83463980875666, 40.590052746674175], [-73.83478435641427, 40.5900234045573], [-73.83483035177443, 40.58994825424876], [-73.83485519070757, 40.58987844619105], [-73.83488359302017, 40.589792525728036], [-73.83495422767699, 40.589728155618005], [-73.83491913647808, 40.589669006797095], [-73.8348134040974, 40.5896769141929], [-73.83466524585045, 40.58974117219387], [-73.83454181557454, 40.589781288746636], [-73.8344571724885, 40.58981071637507], [-73.83436564163769, 40.58977566225632], [-73.83430585060809, 40.589729908656416], [-73.83418252598175, 40.589727044586326], [-73.83405563128245, 40.58974297942082], [-73.83400263455297, 40.589799315785065], [-73.83394606071681, 40.58987713597731], [-73.83382965577461, 40.58992532126432], [-73.8337487303853, 40.58987685064007], [-73.83363953352385, 40.58986057507662], [-73.83353381408156, 40.589863108639946], [-73.83339288407699, 40.589854845039156], [-73.8333280477052, 40.58983659582867], [-73.833227415183, 40.5897955060834], [-73.83323112660207, 40.58972029503289], [-73.83329476213193, 40.58963711276133], [-73.83340774259358, 40.58954862815871], [-73.83344322834957, 40.589449286964715], [-73.83347866645357, 40.589368748710896], [-73.83359681259313, 40.589328625478906], [-73.8336903586853, 40.58933015090568], [-73.83384520036506, 40.58933267559812], [-73.8339371220968, 40.58933417485337], [-73.8339931251685, 40.589372179119046], [-73.83409883714177, 40.589372331795744], [-73.83427132532549, 40.58933962327683], [-73.83448611494346, 40.58934312397328], [-73.83458883487054, 40.589292449605004], [-73.83470507858038, 40.58930873440548], [-73.83484966329664, 40.58934904939524], [-73.83493035837527, 40.58940576539278], [-73.83501486800172, 40.58943006413598], [-73.83511708989475, 40.589416778340805], [-73.83512404459879, 40.589454396538436], [-73.83522266937197, 40.58947065603458], [-73.83536721419101, 40.58944131485623], [-73.8354800532563, 40.58940923992457], [-73.83561393634105, 40.58941749021539], [-73.8356985057161, 40.58941761117123], [-73.83576901366463, 40.58940428162246], [-73.83583637795317, 40.589365125531586], [-73.83594705454765, 40.58936692773617], [-73.83600508350207, 40.589412676459816], [-73.83607198232245, 40.589434262616834], [-73.83612483726172, 40.589434338009504], [-73.83620230045881, 40.58945862465619], [-73.83626573378614, 40.58945602906099], [-73.83632197535155, 40.58951252260318], [-73.83640642113407, 40.58956368142386], [-73.83646274185439, 40.589587938461406], [-73.8365296600677, 40.589601465032516], [-73.83659313295577, 40.589582752295364], [-73.83664249161001, 40.58957207712938], [-73.83668114048537, 40.58961779845867], [-73.83675859162032, 40.58964745855902], [-73.83684663235576, 40.589669073794745], [-73.83689939038598, 40.5897094429111], [-73.83693453583638, 40.58974710100794], [-73.83704731566715, 40.58973920232521], [-73.83707912070494, 40.589701639209316], [-73.83719541135855, 40.58969911736292], [-73.83724816918233, 40.58973948698858], [-73.83725161485465, 40.589771727912854], [-73.83725148391838, 40.589825453461884], [-73.83724433877009, 40.589865737558476], [-73.83721603048043, 40.58991405051864], [-73.83725123513788, 40.58992753240636], [-73.83731456482138, 40.58996791630324], [-73.83731798282331, 40.59001090203083], [-73.83735312278405, 40.59005124666217], [-73.8374128965695, 40.59010505698781], [-73.83744455749473, 40.59012659247734], [-73.8375536054168, 40.59020465029495], [-73.83766267949973, 40.59027196102248], [-73.83780353914231, 40.590309768152196], [-73.8381061416056, 40.59049286328023], [-73.83809538729548, 40.59056806455161], [-73.83815153368617, 40.59066485076516], [-73.83825709155998, 40.59072947047191], [-73.83829578946876, 40.59073788784501], [-73.83846841001579, 40.59077543528394], [-73.83859154196814, 40.590858884579525], [-73.83865480129, 40.59092881716831], [-73.83866857222813, 40.591063151323155], [-73.83870346633577, 40.5912055738016], [-73.83870659463203, 40.591369443045245], [-73.8386927270338, 40.591427450960076], [-73.83866743647685, 40.59153325175092], [-73.83946303818477, 40.59225656848909], [-73.83949754038912, 40.59216838222548], [-73.83962809824376, 40.59209603359914], [-73.8397304844814, 40.59201558736428], [-73.83984000695787, 40.591897543281654], [-73.83996340087272, 40.59187353901191], [-73.83999494116478, 40.59194611217134], [-73.83992068316992, 40.59205346069026], [-73.83977954149731, 40.592131167564695], [-73.83960308258222, 40.59224106050579], [-73.83946895572447, 40.59233220595793], [-73.83943345735968, 40.5924396094736], [-73.83948958143614, 40.59254713982214], [-73.83961625566648, 40.592625219102246], [-73.83977816861827, 40.592703348051096], [-73.8398907019092, 40.59280021149386], [-73.84006318617527, 40.5928783540975], [-73.84023583948621, 40.59288665361502], [-73.84039433124553, 40.59292179539158], [-73.84059858452798, 40.592978491292754], [-73.84081016081028, 40.59291968620368], [-73.84093026245439, 40.59279896857427], [-73.84094103158732, 40.59271570890763], [-73.84093419484857, 40.59262705102477], [-73.8409450429299, 40.59251155543275], [-73.84098756626545, 40.59241222051886], [-73.84111823141744, 40.592294203977254], [-73.84116420777474, 40.59222442380349], [-73.84122784858577, 40.59213586333136], [-73.84135823835017, 40.592133357919614], [-73.8414637761373, 40.5922087199808], [-73.84141426957216, 40.59228118257597], [-73.84134359949014, 40.592361673598944], [-73.84131169366367, 40.5924422186197], [-73.84116650852377, 40.592446064371934], [-73.84143751160617, 40.59249874471396], [-73.84142831850568, 40.592553276795854], [-73.84168567500943, 40.59263809149378], [-73.84184022507651, 40.59271336809901], [-73.84187475901565, 40.59276266394533], [-73.84190980778224, 40.59284330124291], [-73.84193426610223, 40.592931983304595], [-73.84200478923243, 40.592913275604324], [-73.84206458684868, 40.592959025349444], [-73.84213139591954, 40.59302090153838], [-73.84216295246586, 40.59308810261414], [-73.84220507443722, 40.59315800469281], [-73.84230728725518, 40.593150086834534], [-73.8424024335184, 40.59315021736392], [-73.84245517820459, 40.59319864272924], [-73.84255328808544, 40.59318713590552], [-73.84257613724341, 40.59321741767998], [-73.84265231583105, 40.59328487457759], [-73.84269009181736, 40.593303666149296], [-73.84272271259046, 40.59331989247711], [-73.84279664017409, 40.59335222916294], [-73.84282990630474, 40.59338495431444], [-73.8428867995623, 40.59340791061614], [-73.84293744603644, 40.59341689275641], [-73.84300206150367, 40.59343765386186], [-73.84304660524084, 40.593451964100964], [-73.8430878848422, 40.59345426838658], [-73.84314526308786, 40.59345747148239], [-73.84320943161804, 40.59347450114619], [-73.84326567535612, 40.593484011627936], [-73.84330729609289, 40.59348724139782], [-73.84340242979927, 40.59349274375278], [-73.84345911349182, 40.59349122074316], [-73.84355660708614, 40.59348894427195], [-73.8436504238803, 40.59348603112926], [-73.84372313493482, 40.59348243500604], [-73.84380073754829, 40.593450304991435], [-73.84385894083933, 40.59342531196059], [-73.84382165075462, 40.593488948465804], [-73.84378161417668, 40.59354420676003], [-73.84375969765586, 40.59360778607443], [-73.84376315736597, 40.593679696452824], [-73.84374124012379, 40.59374327576204], [-73.84373384895089, 40.59380134416975], [-73.84371192494658, 40.593867689710706], [-73.84363933259718, 40.59388141817311], [-73.843606530162, 40.59394498281135], [-73.84361726620143, 40.59400860653123], [-73.84361712370776, 40.59406945037141], [-73.84358788589665, 40.59416067579145], [-73.8435260073294, 40.5942463261109], [-73.8434424400089, 40.59429875875416], [-73.84336623167985, 40.59430695129887], [-73.84335158303408, 40.59436500978682], [-73.84331153839406, 40.594423032977005], [-73.84324615524353, 40.59445613123199], [-73.84313364052117, 40.59447533740426], [-73.843046580238, 40.59446968720597], [-73.84291602237036, 40.594447384028406], [-73.84283967082496, 40.594516419558296], [-73.84283218742793, 40.59461320702788], [-73.84271954116224, 40.59468772364996], [-73.84264325365281, 40.59472910303237], [-73.84255616699606, 40.594734515069426], [-73.8424604916988, 40.59471583843021], [-73.84231495048506, 40.59463024852525], [-73.84220803023986, 40.594667662710265], [-73.84218630991286, 40.59471020698651], [-73.84216429081826, 40.59475333770383], [-73.8421060387757, 40.594838991065316], [-73.84196074544143, 40.59491069750994], [-73.84187111474984, 40.594906117756175], [-73.84179387366368, 40.59490217082855], [-73.84164143508538, 40.59492685189063], [-73.84152874189412, 40.595020727491764], [-73.84131074866141, 40.59515041061996], [-73.84131049188757, 40.59525457172557], [-73.8412377057435, 40.595352199349705], [-73.84114504755935, 40.59535740225562], [-73.84104539054935, 40.59536299613645], [-73.84096797936242, 40.59546745557802], [-73.84091435785372, 40.59553981457469], [-73.84078351504536, 40.59563642989195], [-73.84059825592088, 40.59573020401426], [-73.84043404351124, 40.595799312548166], [-73.84031973891216, 40.595870355647605], [-73.84006799452713, 40.59596177972253], [-73.83988646171512, 40.59601407289271], [-73.83970857749765, 40.59605807497322], [-73.83951254398809, 40.59610481650751], [-73.8393926765489, 40.59616272699143], [-73.83918213035949, 40.59620944818109], [-73.83902964248091, 40.59625348474866], [-73.83892079765629, 40.596253332232386], [-73.83871038533843, 40.59624474020713], [-73.83847829729167, 40.59619739892336], [-73.83834418982916, 40.59614189764269], [-73.8381920292834, 40.596050418288996], [-73.8380433968333, 40.59600042802676], [-73.83788751406561, 40.595947661264695], [-73.83772796402187, 40.59591148290797], [-73.83759018910307, 40.595872569529114], [-73.83743435500348, 40.59580044301385], [-73.83734112299042, 40.59570141859261], [-73.83719111158142, 40.595557936776565], [-73.83707862933531, 40.59543958010494], [-73.83701776530886, 40.59534995062072], [-73.83695207059688, 40.59531403945314], [-73.83685364242194, 40.59521361223885], [-73.83671758013152, 40.59513103920251], [-73.83666574166003, 40.59509335783976], [-73.83662377269687, 40.59506285287462], [-73.83660044560382, 40.59499476553555], [-73.83668274106707, 40.5949466970158]]], [[[-73.86706149472118, 40.5820879767934], [-73.86768677970458, 40.58196329228612], [-73.86814728191008, 40.581988903219305], [-73.86896292210412, 40.58169379478866], [-73.86925758051196, 40.58190964107345], [-73.86968631043702, 40.58230878579189], [-73.87000313642912, 40.582636614815954], [-73.87034778401303, 40.58306413703523], [-73.8705059791835, 40.583341953013736], [-73.87051388095846, 40.5840823274032], [-73.87061497794427, 40.58491535106038], [-73.87084743947547, 40.58542105463095], [-73.87099791647937, 40.586061798365314], [-73.87115922675414, 40.5868738879673], [-73.86981356482106, 40.58946092678817], [-73.86849671647204, 40.59008985028954], [-73.8675927577521, 40.591005791690655], [-73.86690268173955, 40.59147303544145], [-73.86635052164085, 40.591892676564676], [-73.86476222962085, 40.59149221858279], [-73.86430826692539, 40.59141474432638], [-73.86371118798182, 40.591129281983044], [-73.86327273492819, 40.59090807569255], [-73.86274156028652, 40.590366407099964], [-73.86272348498059, 40.59007451075339], [-73.86231374617182, 40.58951874680793], [-73.86193216221744, 40.588898945374616], [-73.86149401111527, 40.58854247360196], [-73.86125299377363, 40.58798808592123], [-73.86137584125022, 40.58737342003284], [-73.86150824362481, 40.58698481999754], [-73.86159140175833, 40.58654599627411], [-73.86167447867456, 40.58614479499366], [-73.86192220398715, 40.58566854822555], [-73.86218624579826, 40.58525502227703], [-73.86249965640731, 40.58482901537917], [-73.86282948605064, 40.58441556714235], [-73.86317563293608, 40.584064840860336], [-73.86327471071942, 40.58387684853184], [-73.86383442889513, 40.58365178217413], [-73.86449245335686, 40.58361493817876], [-73.86503589278036, 40.583302060085636], [-73.86557925292553, 40.5830268024549], [-73.86584278235404, 40.58285154128586], [-73.8661228348405, 40.58263867613857], [-73.86651827430362, 40.582300538285615], [-73.86706149472118, 40.5820879767934]]]]}}, {\&quot;id\&quot;: \&quot;2\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 3, \&quot;Shape_Leng\&quot;: 0.0843411059012, \&quot;Shape_Area\&quot;: 0.000314414156821, \&quot;zone\&quot;: \&quot;Allerton/Pelham Gardens\&quot;, \&quot;LocationID\&quot;: 3, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84792614099985, 40.87134223399991], [-73.84725144800001, 40.870987051999926], [-73.84699273699992, 40.87085288799987], [-73.84640766399981, 40.870554300999885], [-73.84608957099984, 40.870389771999946], [-73.84578147499997, 40.870227695999894], [-73.845172567, 40.86991469799994], [-73.84487737499977, 40.86976050699997], [-73.84442133700004, 40.86952229899989], [-73.84423146999998, 40.86942034999993], [-73.84358581499981, 40.86908763699989], [-73.84315715499991, 40.868863265999934], [-73.84280443499989, 40.868680752999886], [-73.842406294, 40.86847474399989], [-73.84185186499998, 40.86819192599989], [-73.84122362600002, 40.867858150999915], [-73.84064364799987, 40.86755417599992], [-73.83974233399985, 40.867087930999894], [-73.83954475699979, 40.86698673799988], [-73.83922085399998, 40.866820839999924], [-73.83875223499997, 40.866572776999945], [-73.83784380199984, 40.86609918799994], [-73.83697021099982, 40.8656431359999], [-73.83678824299999, 40.86554590599999], [-73.8361860139999, 40.86522409899994], [-73.83578436699997, 40.86501601099999], [-73.83162007899985, 40.86265937499991], [-73.83151964200005, 40.86259766899985], [-73.83089329699999, 40.86221284899995], [-73.83012015999996, 40.862049281999894], [-73.82972614799992, 40.86195274499995], [-73.82950892699994, 40.86184121299988], [-73.82924089599999, 40.8616318679999], [-73.82911929099998, 40.86150997699985], [-73.82841963500002, 40.86093193999992], [-73.82834347399992, 40.86089202599988], [-73.82847346699995, 40.860731352999906], [-73.82881978099991, 40.8604491129999], [-73.82945155499976, 40.860000568999894], [-73.82960951799994, 40.85988842099988], [-73.82973719699993, 40.85980973499988], [-73.829874887, 40.859740419999895], [-73.83002075599987, 40.85968150899988], [-73.83017269399993, 40.85963375399996], [-73.83103340899994, 40.85934303399997], [-73.83190625000005, 40.859070198999895], [-73.83308051999994, 40.85867901899998], [-73.83348699499999, 40.85852949499987], [-73.83437708299991, 40.858190848999854], [-73.83533372599987, 40.8578313009999], [-73.83628873399996, 40.85747692099994], [-73.8368191849999, 40.85727680899989], [-73.83724089099992, 40.85735732299986], [-73.838176221, 40.85750772399996], [-73.83911116599994, 40.85765790099987], [-73.84004614299985, 40.857806268999866], [-73.84097144699983, 40.857949078999916], [-73.84191078799992, 40.858091531999925], [-73.8432955319999, 40.85829037599991], [-73.84458712899988, 40.858445809999914], [-73.8455246059999, 40.85853848699988], [-73.84645854099998, 40.8586363739999], [-73.84739746999989, 40.85868254599995], [-73.84833709099989, 40.85870184799994], [-73.84930893499991, 40.85871750299992], [-73.85028234799984, 40.85865726599995], [-73.8512286699999, 40.85857584399987], [-73.85217337899977, 40.858499155999944], [-73.85310947900003, 40.8584097979999], [-73.85405423899992, 40.85832373099985], [-73.85585355899978, 40.858171764999966], [-73.85601437899996, 40.85815817999989], [-73.8566377469999, 40.8581191719999], [-73.85735319699984, 40.859711605999934], [-73.85739481999993, 40.859984102999896], [-73.85746244199993, 40.860426811999915], [-73.85747219599985, 40.860495676999925], [-73.85747885699989, 40.8605427009999], [-73.85752224299985, 40.86084898099988], [-73.85752991799988, 40.86090316799989], [-73.85756682699994, 40.8611637229999], [-73.85759960699981, 40.86141838899994], [-73.8576092669999, 40.861493440999894], [-73.85767084800001, 40.86197187299994], [-73.85767885599986, 40.86203407799992], [-73.85769181699992, 40.8621347729999], [-73.85769842199993, 40.86218608099991], [-73.85770552799988, 40.862241284999925], [-73.85771028399981, 40.862278229999895], [-73.85780378799993, 40.86303621699989], [-73.85806098599983, 40.86304235999992], [-73.85844789699989, 40.86376138999988], [-73.85871220299993, 40.86425255299985], [-73.85890956799982, 40.864636925999875], [-73.85961281199982, 40.865512717999856], [-73.86055100799985, 40.86552969499993], [-73.86156274099987, 40.86554946399989], [-73.86154239799991, 40.86615362299991], [-73.86150246599986, 40.8675514329999], [-73.86149826099988, 40.86778221599998], [-73.8614338389999, 40.869603467999866], [-73.86137924099984, 40.8713365119999], [-73.86036598199989, 40.87131862199991], [-73.85942680499996, 40.8713006969999], [-73.85848731699984, 40.87128405999989], [-73.85754854399994, 40.87126631799993], [-73.85661382499993, 40.87125016699991], [-73.85655118199992, 40.87303042899989], [-73.85651292399994, 40.874217792999936], [-73.85577052399987, 40.87398371299992], [-73.85551758400005, 40.87390395599987], [-73.854508051, 40.87358094199986], [-73.85363638799987, 40.87330059899996], [-73.85357628499997, 40.87327602099987], [-73.85265751899979, 40.872992186999966], [-73.85170987299989, 40.872697458999944], [-73.85108463399987, 40.87249279099995], [-73.85078983299995, 40.87239629199989], [-73.84987645199996, 40.8721018809999], [-73.84859676099995, 40.871670784999864], [-73.84792614099985, 40.87134223399991]]]}}, {\&quot;id\&quot;: \&quot;3\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 4, \&quot;Shape_Leng\&quot;: 0.0435665270921, \&quot;Shape_Area\&quot;: 0.000111871946192, \&quot;zone\&quot;: \&quot;Alphabet City\&quot;, \&quot;LocationID\&quot;: 4, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97177410965318, 40.72582128133705], [-73.97179142961485, 40.72581422114909], [-73.97181650587731, 40.72581496675256], [-73.97185935830923, 40.72558296903031], [-73.97187437695213, 40.72550311607974], [-73.97188490951473, 40.725424405065766], [-73.97191120732055, 40.72529037069991], [-73.97193374501082, 40.725176290351165], [-73.9719397545633, 40.72515803861004], [-73.97196154778592, 40.72503997881088], [-73.97200511841213, 40.72484148970817], [-73.97203666966882, 40.72468407002008], [-73.97206595867397, 40.72455915832874], [-73.97207196960339, 40.72453635085808], [-73.97208098151926, 40.72449756793038], [-73.97208400057282, 40.72446790554567], [-73.97209751290906, 40.7244234152347], [-73.97215609001734, 40.7241701782781], [-73.97216585996632, 40.724131963273145], [-73.9722169237619, 40.723930054646765], [-73.9722334467696, 40.72384677992629], [-73.97226499868246, 40.72371445733361], [-73.97232507731592, 40.723463499327295], [-73.97236115744644, 40.723312060476445], [-73.97239945748277, 40.72314881636666], [-73.97251011180383, 40.722696886006716], [-73.97288971396678, 40.721088297219346], [-73.9730466728251, 40.720436229833325], [-73.97312959090407, 40.72009119241493], [-73.9732107544226, 40.7197848577304], [-73.97332646360798, 40.7193611047339], [-73.97347975574512, 40.71886142911285], [-73.97464720799998, 40.718842349999896], [-73.97468687499985, 40.718841701999914], [-73.97474239999998, 40.71884079399995], [-73.97485919999995, 40.71885547999994], [-73.97491298899988, 40.71886244299986], [-73.97497644799995, 40.71887065199991], [-73.97509520199993, 40.71888074599987], [-73.97545167499995, 40.71894655899996], [-73.97551012699985, 40.71895861299989], [-73.97609249599991, 40.71907870199988], [-73.97635525199995, 40.71913288399983], [-73.97648182399995, 40.719159627999915], [-73.97674495699998, 40.719215233999925], [-73.97722379199992, 40.71930977499991], [-73.978031227, 40.71963834799987], [-73.97875234999982, 40.71993370599995], [-73.97966021699983, 40.72021282999992], [-73.98130824199984, 40.72070878599992], [-73.98216615299982, 40.72096885499996], [-73.98300308699991, 40.721222680999894], [-73.98382387299982, 40.72147287199987], [-73.98377990999991, 40.72153595399992], [-73.98344363599992, 40.72201850699989], [-73.9829641439999, 40.72267132499997], [-73.98252449499985, 40.723277976999945], [-73.9820824239999, 40.72388204399991], [-73.981636639, 40.72449348099985], [-73.9812112959998, 40.72507279999992], [-73.98076713900005, 40.7256855949999], [-73.9803329819999, 40.72628033599988], [-73.97990650199998, 40.72686577299986], [-73.97946913000003, 40.72746767699993], [-73.97899861999981, 40.7281057469999], [-73.97853582899992, 40.728746084999905], [-73.97805542899995, 40.7293830859999], [-73.97802697999985, 40.729433059999984], [-73.97739386799988, 40.72916504799991], [-73.97690436400002, 40.72895782399994], [-73.976269971, 40.7286892589999], [-73.976152041, 40.72864520999985], [-73.9761329, 40.728638271999934], [-73.97580243799992, 40.72851847999986], [-73.97569651100005, 40.728475052999926], [-73.97329796799995, 40.72742800799989], [-73.97205015299988, 40.726880945999866], [-73.97197685099988, 40.726830355999944], [-73.97191244199995, 40.72679100899989], [-73.97185671300005, 40.72675868499989], [-73.97179602099988, 40.72671367999988], [-73.97162697285862, 40.72662845299842], [-73.97166972701174, 40.726392327154294], [-73.97169587451613, 40.72624182930235], [-73.97171894361502, 40.726121993259504], [-73.97173843379353, 40.72599966755553], [-73.97176755410212, 40.72583330345458], [-73.97177410965318, 40.72582128133705]]]}}, {\&quot;id\&quot;: \&quot;4\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 5, \&quot;Shape_Leng\&quot;: 0.0921464898574, \&quot;Shape_Area\&quot;: 0.000497957489363, \&quot;zone\&quot;: \&quot;Arden Heights\&quot;, \&quot;LocationID\&quot;: 5, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.17421738099989, 40.56256808599987], [-74.17348507999998, 40.56226748999993], [-74.17225507699992, 40.56170483699991], [-74.17191921399996, 40.56155171899995], [-74.17185166499996, 40.56152092299991], [-74.17222993499993, 40.561135857999915], [-74.17245326199999, 40.56088825699991], [-74.17321541599998, 40.560077661999884], [-74.17358785199997, 40.55969842799995], [-74.17437344399991, 40.55870866599984], [-74.17475740499992, 40.55816798199986], [-74.1750629909999, 40.55771126399991], [-74.17512402999996, 40.557620037999925], [-74.1754729799999, 40.557065311999914], [-74.17559957599995, 40.55685071199989], [-74.17579913099998, 40.55651243799986], [-74.1761165979999, 40.55593754099987], [-74.17661991899996, 40.55499100699991], [-74.17746276899993, 40.553411145999846], [-74.17815548499992, 40.55211278999988], [-74.17874485199995, 40.5509958689999], [-74.1793348139999, 40.54988835199988], [-74.17991198599996, 40.548834452999905], [-74.18018524699995, 40.54837960899992], [-74.18128532999992, 40.54695757299989], [-74.18206740899994, 40.54604483899989], [-74.18285329599989, 40.545145824999885], [-74.18369101699987, 40.54417358399989], [-74.1855985999999, 40.541957592999914], [-74.18657647099997, 40.54085328399988], [-74.1870889679999, 40.54024712299989], [-74.18738120699997, 40.53989224299986], [-74.18770381799999, 40.5395269479999], [-74.18826921099989, 40.53886614199993], [-74.18903145199995, 40.53815934199989], [-74.189510226, 40.537788579999905], [-74.19030442599997, 40.53724645299995], [-74.19135323799996, 40.53666485899984], [-74.19377169299999, 40.53583384699993], [-74.19409661699994, 40.53650724499989], [-74.19444077699995, 40.5371565929999], [-74.19468316799997, 40.53766189199994], [-74.19476262699999, 40.5378314079999], [-74.19507682399993, 40.53848646999991], [-74.19542518899992, 40.53917847399987], [-74.19576408099995, 40.53983810199987], [-74.19609298399995, 40.540497735999914], [-74.19640185999997, 40.54117319999993], [-74.19671334599992, 40.541846973999895], [-74.19702175199988, 40.54252684899992], [-74.19730759199997, 40.54326204499988], [-74.19840857099993, 40.545306446999895], [-74.19860457899993, 40.545679908999915], [-74.19912044799996, 40.54670870699988], [-74.19985031599995, 40.54813241899989], [-74.20012791899997, 40.54875987399988], [-74.20018262899993, 40.548906645999864], [-74.20097039299995, 40.55079013899987], [-74.20185089099988, 40.552689430999926], [-74.20216129599993, 40.55335994099991], [-74.20234825099999, 40.55375861799991], [-74.20262828599995, 40.554343511999946], [-74.20291038499992, 40.55494466699989], [-74.2032648999999, 40.55562847699989], [-74.20325826899995, 40.55570233899991], [-74.20324645499988, 40.55577582299988], [-74.20322948999994, 40.55584871799988], [-74.20320742499993, 40.555920814999894], [-74.20318032199998, 40.5559919049999], [-74.20314825999996, 40.55606178499986], [-74.20301604799995, 40.55602844299987], [-74.20288252399993, 40.555998296999846], [-74.2027478209999, 40.5559713759999], [-74.20261207199997, 40.55594770599989], [-74.20247541199996, 40.55592731199989], [-74.20233797799996, 40.55591021399987], [-74.2022083119999, 40.55589290699985], [-74.20207764, 40.55588077499988], [-74.2019463179999, 40.55587385199995], [-74.20181469999991, 40.5558721559999], [-74.20168314599995, 40.555875692999926], [-74.20155201099993, 40.55588445199986], [-74.20142165399993, 40.55589840999992], [-74.20129242599992, 40.55591752899991], [-74.20116467999998, 40.55594175599992], [-74.20103876099996, 40.55597102699991], [-74.20091501299993, 40.556005260999854], [-74.20079377199987, 40.55604436599988], [-74.20062607299995, 40.55613226099993], [-74.20046730799992, 40.55623049099987], [-74.20031905499991, 40.5563382259999], [-74.20018273999989, 40.5564544339999], [-74.20005953999996, 40.556577940999894], [-74.19946683299995, 40.557181180999905], [-74.19769481199992, 40.55888705399984], [-74.19407564499997, 40.56207847399989], [-74.19386270699994, 40.562221584999925], [-74.19386255299989, 40.56222168499994], [-74.19386239999993, 40.56222177399991], [-74.19364100699988, 40.56235719999993], [-74.19364075899988, 40.56235735399986], [-74.19364051199993, 40.56235749799986], [-74.19341094699993, 40.56248503999991], [-74.19317388399995, 40.56260434399992], [-74.19307925099996, 40.5626277349999], [-74.19298216699998, 40.56264428199988], [-74.1928834799999, 40.56265383999989], [-74.19278405499998, 40.5626563249999], [-74.192684759, 40.562651716999945], [-74.19258646299993, 40.562640053999885], [-74.19237007799995, 40.56258854699988], [-74.19214711699996, 40.562550214999916], [-74.19191967499992, 40.56252570499986], [-74.19168998299995, 40.5625154089999], [-74.19146034299997, 40.5625194289999], [-74.19123302399998, 40.56253757599988], [-74.19101021699997, 40.562569401999916], [-74.19085177899994, 40.562618932999946], [-74.1907004609999, 40.56268463499989], [-74.19056041299997, 40.56276545599995], [-74.19043537599994, 40.56285950699993], [-74.19032832899994, 40.56296424499989], [-74.19024124699997, 40.56307668499993], [-74.19011908599994, 40.56319841199997], [-74.18997973099991, 40.56331160499996], [-74.18982494799998, 40.56341415199991], [-74.18982482999994, 40.563414223999885], [-74.18982471199989, 40.56341428799993], [-74.18965655100001, 40.563504491999886], [-74.18947754599994, 40.56358098999991], [-74.1892907519999, 40.56364274199991], [-74.18909923999989, 40.56368927199991], [-74.18726897599993, 40.56404169399984], [-74.18677554199998, 40.56419095799989], [-74.18627446199993, 40.564325526999866], [-74.18576707899994, 40.564445037999924], [-74.18576687799995, 40.56444508299994], [-74.18576667699995, 40.56444512799989], [-74.18525395999991, 40.5645493549999], [-74.18502077599994, 40.5647047109999], [-74.18502052799994, 40.56470486499994], [-74.18502026899988, 40.56470502799989], [-74.18477472999997, 40.56485049699993], [-74.18451788299991, 40.56498530499989], [-74.18451768299992, 40.564985404999916], [-74.18451749399999, 40.56498549599994], [-74.18425093099988, 40.56510871899992], [-74.18425062399993, 40.56510885399991], [-74.18425030599994, 40.5651089899999], [-74.18397521799992, 40.56522011499991], [-74.18397488799997, 40.56522024099992], [-74.18397454599993, 40.56522036799989], [-74.18369189099995, 40.5653190679999], [-74.18340311699991, 40.56540496199994], [-74.18318459699992, 40.56545009399985], [-74.18295815999996, 40.56548019999992], [-74.18272650699997, 40.56549428299992], [-74.1824925989999, 40.56549172899984], [-74.18241339499998, 40.56548514599992], [-74.18225953199997, 40.565472349999936], [-74.18203038699987, 40.56543640499994], [-74.18180816599994, 40.56538457899992], [-74.1815955649999, 40.56531796099987], [-74.18139492499988, 40.56523797799991], [-74.17794544199997, 40.56398336699993], [-74.17758036699996, 40.56375543999989], [-74.17659366099998, 40.563241328999894], [-74.17539949099991, 40.56296466199991], [-74.17488750399997, 40.56282641899986], [-74.17421738099989, 40.56256808599987]]]}}, {\&quot;id\&quot;: \&quot;5\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 6, \&quot;Shape_Leng\&quot;: 0.150490542523, \&quot;Shape_Area\&quot;: 0.000606460984581, \&quot;zone\&quot;: \&quot;Arrochar/Fort Wadsworth\&quot;, \&quot;LocationID\&quot;: 6, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.06367318899999, 40.60219816599994], [-74.06350565699998, 40.602150053999914], [-74.06383152699988, 40.60258896799995], [-74.0651709129999, 40.604213507999894], [-74.06046429699992, 40.60640582399985], [-74.06042867199996, 40.6063527299999], [-74.05801067099993, 40.607368791999924], [-74.05778710399987, 40.607449590999906], [-74.0578901689999, 40.607580753999905], [-74.05685812390232, 40.608056357772554], [-74.05677183367786, 40.607899470387395], [-74.05674934830238, 40.607798757335814], [-74.05665999852928, 40.607555930875925], [-74.05649565936758, 40.60724764825619], [-74.05640693287154, 40.60718873802621], [-74.0560104141088, 40.606780566131995], [-74.05552126122357, 40.6064828925687], [-74.05543198004166, 40.60648249104071], [-74.05537932434086, 40.606494223522326], [-74.05528719697126, 40.60653889007871], [-74.05516001122312, 40.60673049135086], [-74.05498867839447, 40.60666069691174], [-74.05499916476879, 40.606645744784], [-74.05503373135794, 40.606659826645995], [-74.05505194098775, 40.60663386047028], [-74.0550195433675, 40.60662066296658], [-74.05505591012927, 40.60656880569464], [-74.05510403532153, 40.60658841067159], [-74.05517250950514, 40.60649076734958], [-74.05518218103546, 40.60647456683434], [-74.05517955854631, 40.606402334922386], [-74.05516855690021, 40.60636554730313], [-74.05515251060758, 40.606329045897695], [-74.05512022975005, 40.60630536171677], [-74.05505974095801, 40.606265420452814], [-74.05381069805436, 40.605912718852984], [-74.05371769396106, 40.60560458157246], [-74.05360729740819, 40.605238809417735], [-74.05367256354405, 40.60518834332228], [-74.0540203995905, 40.60493472091635], [-74.05385099498753, 40.604530274454824], [-74.0537815276551, 40.60436142291274], [-74.05375474319875, 40.604276931421374], [-74.05369607985057, 40.60414810383785], [-74.0536712685173, 40.604004785905076], [-74.05359133556057, 40.60376168855161], [-74.05356753570281, 40.603696466325864], [-74.05353964480109, 40.603633557567264], [-74.05320486119456, 40.60205979370229], [-74.05315799190798, 40.60197598489976], [-74.05311861801997, 40.601889964830484], [-74.05308691752415, 40.6018021224205], [-74.05306303371839, 40.60171285483406], [-74.05304707455683, 40.60162256567726], [-74.05303911216359, 40.60153166317351], [-74.05303330741077, 40.60146647069907], [-74.05303612675755, 40.60140116360679], [-74.05304754163846, 40.6013364030034], [-74.0530674364756, 40.60127284446126], [-74.05309560984993, 40.60121113138266], [-74.05331857342289, 40.60101058824162], [-74.05335468423449, 40.60095402513734], [-74.0533839675499, 40.60089521381433], [-74.05340618556725, 40.60083463190023], [-74.05342115786627, 40.60077277140067], [-74.05342876287239, 40.600710134704016], [-74.05342893884374, 40.600647230500904], [-74.05342168437245, 40.60058456965282], [-74.0534070583946, 40.600522661043904], [-74.05337605959711, 40.60046855454402], [-74.05333852878636, 40.60041690720496], [-74.05329479798284, 40.60036817591043], [-74.05324525405089, 40.60032279174719], [-74.05319033527633, 40.60028115619137], [-74.05300717979289, 40.600160417609814], [-74.05240319632722, 40.59986949892358], [-74.05225411910509, 40.59985116741017], [-74.05222983028327, 40.59982388359393], [-74.05222826954189, 40.599776102303636], [-74.05224531733288, 40.59974801415288], [-74.0522677927031, 40.59973493984094], [-74.05229099291411, 40.59972044052657], [-74.05232494851855, 40.59971490532035], [-74.0523724578026, 40.599718782418186], [-74.05242827330757, 40.59972815401489], [-74.05249178950837, 40.59973684307158], [-74.05260660501526, 40.5998145753706], [-74.0527173663352, 40.599854472448875], [-74.05279416485439, 40.59987346465481], [-74.05287153843383, 40.59986725546714], [-74.05291816194962, 40.5998462571782], [-74.0530228827237, 40.59977868359759], [-74.05309724728707, 40.59973106712562], [-74.05434118619358, 40.59881917533658], [-74.0543115048126, 40.598777505760154], [-74.05433644573098, 40.5987604455301], [-74.05447422333906, 40.5987555395484], [-74.05681139913331, 40.59672692304163], [-74.05719369904648, 40.59639507881197], [-74.05972690577232, 40.59390821671267], [-74.05974734759447, 40.593848611567246], [-74.05964120596147, 40.59370938839296], [-74.05966255766188, 40.593703175710345], [-74.05976660687638, 40.59383525751018], [-74.05984505851372, 40.5937805319415], [-74.06055353637058, 40.593379755423555], [-74.06133778103231, 40.59271541906451], [-74.06215274432542, 40.59202504054202], [-74.06388709125392, 40.590207466209264], [-74.06503332378131, 40.58899099843518], [-74.06563611899992, 40.589628104999896], [-74.06580036099993, 40.589746609999885], [-74.06575530299992, 40.58978965399993], [-74.06572536499986, 40.589845295999915], [-74.06571834999994, 40.58990810299984], [-74.06573690899995, 40.589969516999936], [-74.06577682899997, 40.590021390999915], [-74.0658293969999, 40.59005916499991], [-74.06651182899995, 40.59034492199989], [-74.06662559499993, 40.59034201999989], [-74.06666723999994, 40.590382761999905], [-74.06728410699992, 40.590986202999865], [-74.06751477499988, 40.591334642999925], [-74.06795227299993, 40.59208368299986], [-74.06814585499988, 40.59245576399995], [-74.06831810799993, 40.59278576599994], [-74.06964532799996, 40.59526401099989], [-74.06970478499989, 40.59537635999994], [-74.07043976099992, 40.59673474699988], [-74.07118634999992, 40.59648999199993], [-74.07281699299993, 40.59595221499992], [-74.073679591, 40.59566839599994], [-74.07453730499996, 40.595386779999885], [-74.07539899099994, 40.59510414799992], [-74.07626202999995, 40.5948225699999], [-74.07714922399995, 40.594534080999885], [-74.07802261099994, 40.59425482399996], [-74.07888191699986, 40.593942790999925], [-74.0784669379999, 40.5933000119999], [-74.07936282299997, 40.59299407399992], [-74.08029682099989, 40.59266864199986], [-74.08173342999991, 40.59215628599987], [-74.08177066499995, 40.59221445099991], [-74.08239591899998, 40.59319116199994], [-74.08304163599998, 40.59422972099989], [-74.0832075799999, 40.59453373499988], [-74.08330235099992, 40.59471632799989], [-74.08376862299998, 40.595520956999934], [-74.08406968699998, 40.59549626999994], [-74.08491019899996, 40.59570472799985], [-74.08578780799998, 40.59588407999995], [-74.08587511899998, 40.59589012099985], [-74.08585350599992, 40.5959409809999], [-74.08547413999999, 40.596833816999876], [-74.08532650099991, 40.59700832199995], [-74.08515829199987, 40.59717273799993], [-74.08515824499993, 40.597172791999874], [-74.0851581859999, 40.59717283699992], [-74.08497132899998, 40.59732510999985], [-74.08476818599993, 40.59746346299987], [-74.08476811499993, 40.59746351699994], [-74.08476803199989, 40.597463562999955], [-74.08469129699996, 40.597507131999926], [-74.08360775099997, 40.597912413999936], [-74.08248303399992, 40.59832980799991], [-74.0823092379999, 40.59845665499994], [-74.08199990199995, 40.59868243799987], [-74.08160410699992, 40.59902445899997], [-74.0814942209999, 40.599081990999935], [-74.08144216599995, 40.5991592199999], [-74.08130343799999, 40.59938765599991], [-74.08116420899995, 40.600206553999946], [-74.08119595999997, 40.600415172999874], [-74.081216903, 40.600547931999905], [-74.08125785899989, 40.60067884799985], [-74.081318208, 40.60080532899989], [-74.0813965889999, 40.60092495199989], [-74.08184498199992, 40.601535196999926], [-74.08218729299988, 40.601941007999876], [-74.082815161, 40.60197418199989], [-74.08383802499996, 40.60192576699993], [-74.08432821299992, 40.6018726829999], [-74.08457153399995, 40.601822479999946], [-74.08520894199994, 40.60160095799991], [-74.085837971, 40.60142777299994], [-74.08625420399993, 40.601324188999854], [-74.08647535899999, 40.60126896199992], [-74.08666235099997, 40.6012335389999], [-74.0883067039999, 40.60110777999993], [-74.08920169499996, 40.600963789999916], [-74.08947630599992, 40.60090432199991], [-74.08983655899989, 40.60077409499996], [-74.09010463499996, 40.600592348999896], [-74.09036073899993, 40.60040036399994], [-74.09060390399996, 40.60019882399991], [-74.09083323299996, 40.59998852399986], [-74.09147742399989, 40.599408489999895], [-74.0916133049999, 40.59926156199984], [-74.09172051499995, 40.59922085699985], [-74.091798925, 40.599318209999886], [-74.09197184899992, 40.59982426299994], [-74.09211869899993, 40.600086968999946], [-74.09227904299993, 40.60034540999989], [-74.0924525679999, 40.60059897899986], [-74.09263886099998, 40.60084710199989], [-74.09283746599989, 40.60108923399986], [-74.0928674959999, 40.60117779299992], [-74.092888504, 40.601267850999896], [-74.09290036399996, 40.60135887199993], [-74.09290300799996, 40.601450319999834], [-74.09289641899991, 40.60154165099987], [-74.09288063499999, 40.6016323259999], [-74.09285575199992, 40.60172180699987], [-74.09282191499993, 40.60180956599985], [-74.09272060299999, 40.60249806099995], [-74.09260921099994, 40.60323012299987], [-74.09244145299986, 40.604119585999875], [-74.09258665899993, 40.60514053599992], [-74.09262561899992, 40.60545055399992], [-74.09268272599991, 40.60591244899991], [-74.09271376799991, 40.606059182999914], [-74.09271379199996, 40.606059272999886], [-74.092713803, 40.60605936299993], [-74.09272620699986, 40.60620985699994], [-74.092719093, 40.6063620239999], [-74.09271909299996, 40.60636212299986], [-74.09271908099993, 40.60636222199992], [-74.09269213899994, 40.60651384699985], [-74.09264560299997, 40.60666272199991], [-74.09264557999991, 40.606662785999916], [-74.092645556, 40.60666283899991], [-74.09258024999994, 40.60680678599988], [-74.09249749399994, 40.606943849999894], [-74.09239912899989, 40.607072288999916], [-74.09203043499996, 40.607426039999915], [-74.09187212199998, 40.60756836799993], [-74.09172937299998, 40.60772119199991], [-74.09160388599999, 40.60788297299994], [-74.09149702999991, 40.60805196799984], [-74.0914097369999, 40.60822629799987], [-74.09096036099994, 40.608629682999876], [-74.09080114099994, 40.60877808899989], [-74.09055711299992, 40.60900115099989], [-74.09045495899996, 40.60909452599991], [-74.08949370099997, 40.60868693299991], [-74.08874638699992, 40.60837004599988], [-74.08796268699999, 40.608051827999915], [-74.0871642159999, 40.60772760199992], [-74.08635759599996, 40.60740005899988], [-74.08542756299994, 40.60702238999989], [-74.084900025, 40.60689013199992], [-74.08406781699996, 40.60668148499985], [-74.08355131599996, 40.60655198599987], [-74.08341933399991, 40.60652250899992], [-74.0828094989999, 40.606410978999904], [-74.0815547009999, 40.60629029699987], [-74.07778089599998, 40.60617100899986], [-74.07656734699997, 40.606121663999915], [-74.07606892799996, 40.60606295199986], [-74.07551713999996, 40.60599795099993], [-74.07543239699991, 40.605987966999884], [-74.0747894209999, 40.60587021199996], [-74.0739996529999, 40.60572556799985], [-74.07358326599991, 40.60562106699992], [-74.07335207399997, 40.60556304399993], [-74.07298106899998, 40.605469929999835], [-74.07268510599995, 40.60538461299993], [-74.07242904799989, 40.605302701999946], [-74.07206682799995, 40.60518634699984], [-74.07172956299996, 40.60505808999994], [-74.0691403099999, 40.60403971899988], [-74.06898118299992, 40.60398191899988], [-74.06571018099996, 40.60279382299992], [-74.06550663199994, 40.602719880999935], [-74.06472638299991, 40.602497866999904], [-74.0642173399999, 40.60235301499994], [-74.06367318899999, 40.60219816599994]]]}}, {\&quot;id\&quot;: \&quot;6\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 7, \&quot;Shape_Leng\&quot;: 0.107417171123, \&quot;Shape_Area\&quot;: 0.000389787989274, \&quot;zone\&quot;: \&quot;Astoria\&quot;, \&quot;LocationID\&quot;: 7, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90413637799996, 40.76752031699986], [-73.90325211599989, 40.767504322999905], [-73.9030052879999, 40.767509662999885], [-73.90275780099984, 40.76750354699987], [-73.90251104099987, 40.76748594099992], [-73.90226637199996, 40.76745694399991], [-73.90202516599992, 40.767416783999884], [-73.90217951699996, 40.76731584199997], [-73.90255919500005, 40.766940786999896], [-73.90341888199997, 40.765957306999944], [-73.90351227799994, 40.76584945999989], [-73.90356915599997, 40.765781788999924], [-73.90361058299999, 40.765726577999935], [-73.90370771099997, 40.765597148999845], [-73.90451229899999, 40.76458906399989], [-73.90519286699994, 40.763750940999934], [-73.90566075299986, 40.7631679879999], [-73.90606811199996, 40.7626604449999], [-73.90625691699984, 40.76242520699992], [-73.90651032099997, 40.76210946999992], [-73.90677808699982, 40.7617774819999], [-73.90703976399989, 40.76145304399992], [-73.907419729, 40.76098192599993], [-73.90753042700004, 40.7608446779999], [-73.90779405499987, 40.760517799999896], [-73.90740334999987, 40.76033397899992], [-73.90699741899994, 40.76014299099993], [-73.90631505099988, 40.75984387599992], [-73.9074261499998, 40.75810005299993], [-73.90782817499984, 40.75699926499987], [-73.9079488889999, 40.75667581499994], [-73.90798755699986, 40.756572205999916], [-73.90802408399996, 40.75647433199986], [-73.90806081699996, 40.75637590799995], [-73.90810013899984, 40.75627054199987], [-73.90813601099995, 40.75617442399993], [-73.90817188199993, 40.75607830499995], [-73.90820623799995, 40.75598624799986], [-73.90824210899991, 40.75589012999991], [-73.90827537899996, 40.7558009829999], [-73.90830736999996, 40.7557152619999], [-73.90835663299995, 40.7555832579999], [-73.90840546799983, 40.755452399999896], [-73.90846544599992, 40.75529168599991], [-73.908509019, 40.75521110499989], [-73.90853125399997, 40.75516998399991], [-73.90854932099997, 40.75513657099991], [-73.90860265599999, 40.7550379379999], [-73.90862474299999, 40.75499709099988], [-73.90865671500002, 40.75493796099989], [-73.90868067299994, 40.75489365399992], [-73.90871371100005, 40.7548325549999], [-73.908736451, 40.75479049999993], [-73.90876818500003, 40.754731814999936], [-73.90879316499999, 40.75468561599994], [-73.90901259099992, 40.75427981499996], [-73.90917451199998, 40.75406416699992], [-73.90922139799983, 40.754001722999895], [-73.90922902699994, 40.75399264199997], [-73.90944851199998, 40.75373135399991], [-73.90969314899992, 40.75346973299989], [-73.90995439699995, 40.753217822999936], [-73.91023124699991, 40.75297652299985], [-73.91067474899997, 40.752995076999895], [-73.91256954199997, 40.75330421499995], [-73.9135418349999, 40.7534687139999], [-73.91446450799998, 40.75367641199993], [-73.91468429799998, 40.753680068999856], [-73.91547326299991, 40.75379181799991], [-73.91650534599997, 40.75389159099995], [-73.91763192900005, 40.75385784899993], [-73.91892348099987, 40.75363612399991], [-73.920276847, 40.75333811799993], [-73.92047926000001, 40.75328523699993], [-73.92161909499991, 40.75302765399987], [-73.92204020499989, 40.75293762799992], [-73.92296643399989, 40.752728801999844], [-73.9244174849999, 40.75240430199992], [-73.92562743799996, 40.75213724499991], [-73.92415699999985, 40.753961141999845], [-73.92495400099993, 40.75433675199992], [-73.92575429299997, 40.75471089899986], [-73.92655413100006, 40.75508563499993], [-73.92735228500001, 40.75546007599991], [-73.92815372599988, 40.755835855999905], [-73.92895587499993, 40.75621258399985], [-73.92975052199998, 40.75658057699988], [-73.93055267399994, 40.756958942999916], [-73.93135128699987, 40.75733408499986], [-73.93215200299993, 40.757710384999925], [-73.93335306599997, 40.75827433399995], [-73.93425020699995, 40.75869513399993], [-73.93496053299995, 40.75902508599996], [-73.93503410199992, 40.75905925799991], [-73.93505987399978, 40.759071228999865], [-73.93579879199996, 40.759418044999904], [-73.93588175099988, 40.75945697999986], [-73.93679091699993, 40.75988288099991], [-73.93605584499984, 40.76065330999995], [-73.93601701999981, 40.760694001999894], [-73.93593276099996, 40.7607823119999], [-73.93589256999996, 40.7608244349999], [-73.93584407599987, 40.760875259999935], [-73.93581185199994, 40.7609090339999], [-73.93577489099982, 40.7609477719999], [-73.93569960399994, 40.7610266769999], [-73.93566314299997, 40.76106489099995], [-73.93560854899978, 40.761122109999846], [-73.93556528699992, 40.76116745099992], [-73.93550408999991, 40.76123158999994], [-73.93546712899983, 40.761270327999945], [-73.93543323399999, 40.76130585199992], [-73.93538955299994, 40.76135538399994], [-73.93480791700001, 40.761960415999894], [-73.93472503099987, 40.762047169999875], [-73.93463877499988, 40.762137449999926], [-73.93457323599995, 40.762206044999935], [-73.9343717929999, 40.7624168849999], [-73.93429712599992, 40.76249503399991], [-73.9341081699999, 40.76269280199993], [-73.93404264799992, 40.762761377999915], [-73.93398092100001, 40.76282598199987], [-73.93541372899996, 40.763496787999884], [-73.93614654199985, 40.763842828999906], [-73.93616861799997, 40.76385325299988], [-73.93619184999997, 40.763864223999846], [-73.93621639299991, 40.76387581299986], [-73.9362557499999, 40.7638943969999], [-73.93684249199987, 40.764165082999924], [-73.93687031099991, 40.76417791699989], [-73.93700478599986, 40.76423995399997], [-73.93600532399995, 40.76588489499987], [-73.93682006599995, 40.76618273599989], [-73.93763535399994, 40.76647487199988], [-73.93846096299997, 40.766768302999935], [-73.93858976899998, 40.766817358999916], [-73.93836125899992, 40.76691075499987], [-73.93709253699996, 40.767360392999905], [-73.93618379699991, 40.767691800999934], [-73.93594942700004, 40.76757822499996], [-73.93493511099992, 40.76701302399987], [-73.93422865800001, 40.767854682999875], [-73.93344468499993, 40.768817789999915], [-73.93202371699994, 40.768256495999886], [-73.9298564789999, 40.76732655199985], [-73.92855636599988, 40.76671423899995], [-73.92643792699984, 40.765732814999936], [-73.92506062099999, 40.76509731499991], [-73.92425288799978, 40.76472456399995], [-73.92353865299998, 40.76560349799989], [-73.92218946199995, 40.767267356999895], [-73.92139066099995, 40.76689410499988], [-73.92058727399994, 40.76652069899995], [-73.91977764799998, 40.7661521839999], [-73.918906013, 40.76722677599987], [-73.91849336999996, 40.76773465699995], [-73.91911161599978, 40.76802545099991], [-73.91995596899991, 40.768440064999865], [-73.91828990899992, 40.76987856799984], [-73.91811686499992, 40.77002848599989], [-73.91759120499997, 40.769900870999926], [-73.91682128799984, 40.76979176099995], [-73.91643979099995, 40.76972971399988], [-73.915848706, 40.76963357499988], [-73.91487376500001, 40.76947041699985], [-73.91388850199984, 40.769323929999906], [-73.91291678, 40.76916129699992], [-73.91194026099988, 40.769010152999954], [-73.91094174899979, 40.76885247299993], [-73.909980063, 40.76869723499987], [-73.90900867299995, 40.76854754699986], [-73.90803079099996, 40.76838473399991], [-73.90708728999995, 40.76823623099996], [-73.90611305099988, 40.76806770499989], [-73.90577352999988, 40.76802858899988], [-73.9055484799998, 40.76797657999987], [-73.90531717799979, 40.76789864999989], [-73.90490866399992, 40.76774556099986], [-73.90446527099982, 40.767583778999914], [-73.90427336799988, 40.76754510499992], [-73.90418895299992, 40.767530284999964], [-73.90413637799996, 40.76752031699986]]]}}, {\&quot;id\&quot;: \&quot;7\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 8, \&quot;Shape_Leng\&quot;: 0.0275906911574, \&quot;Shape_Area\&quot;: 2.6587716279e-05, \&quot;zone\&quot;: \&quot;Astoria Park\&quot;, \&quot;LocationID\&quot;: 8, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92334041500001, 40.77512891199993], [-73.92398142899997, 40.774615111999886], [-73.92523246199984, 40.77529885399988], [-73.92531479799985, 40.7753438509999], [-73.92602208199996, 40.77573039899992], [-73.92658081899985, 40.7760392589999], [-73.92737641899994, 40.77646661099989], [-73.92782147400004, 40.776697526999946], [-73.92827730816353, 40.77689897516217], [-73.92708229009109, 40.77771978109686], [-73.92631833401951, 40.77824177509243], [-73.9258220122297, 40.778385906131554], [-73.92574521623308, 40.77840537091916], [-73.9256507618914, 40.77843081191646], [-73.92557304281429, 40.77845885141435], [-73.92481615523091, 40.77875769181163], [-73.92423363003755, 40.7791011938827], [-73.92318694398986, 40.780248393062635], [-73.92295652695057, 40.780441008061004], [-73.92263013815422, 40.78056478536394], [-73.92209965499714, 40.78085187481845], [-73.92097562099832, 40.78176769125319], [-73.91996458796496, 40.78263506876824], [-73.91975969999989, 40.782514177999886], [-73.91796581399998, 40.78125629099988], [-73.91861823099985, 40.780732867999866], [-73.9190647659999, 40.780359563999916], [-73.91939411500002, 40.78009035599996], [-73.92012731100007, 40.7794889519999], [-73.92078680499985, 40.778952266999944], [-73.92139486599993, 40.77845444399985], [-73.92200155699992, 40.77795459099984], [-73.92264888599983, 40.77742265099986], [-73.92331041499993, 40.776883294999934], [-73.92375761299998, 40.77654701199991], [-73.92302571499998, 40.77538430899993], [-73.92314698499983, 40.77528580399993], [-73.92320981399997, 40.775234768999916], [-73.923277837, 40.77517762299988], [-73.92334041500001, 40.77512891199993]]]}}, {\&quot;id\&quot;: \&quot;8\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 9, \&quot;Shape_Leng\&quot;: 0.0997840924705, \&quot;Shape_Area\&quot;: 0.000338443803197, \&quot;zone\&quot;: \&quot;Auburndale\&quot;, \&quot;LocationID\&quot;: 9, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.78502434699996, 40.761036515999855], [-73.78486059299999, 40.760644362999905], [-73.78467742500004, 40.76025720799989], [-73.78447529299982, 40.75987586199995], [-73.78430628699978, 40.759483644999904], [-73.78428991899993, 40.7594402989999], [-73.78425940899996, 40.759382645999914], [-73.78407792999997, 40.75903964399989], [-73.78382076099993, 40.75853003399991], [-73.78346111099987, 40.757864063999904], [-73.78338071499984, 40.75775389699993], [-73.78316157699985, 40.75732618499991], [-73.78303191299983, 40.75708319099989], [-73.78281576399985, 40.75666634299991], [-73.78264852999988, 40.756331903999865], [-73.78248130799982, 40.75599745499987], [-73.78212461999979, 40.75533931199993], [-73.78165171799995, 40.754707752999956], [-73.78113322699984, 40.7540893259999], [-73.78052037799992, 40.753330742999886], [-73.78009357400003, 40.75250750399991], [-73.77980639299984, 40.75189500499989], [-73.77944066999987, 40.751122695999946], [-73.77906558899984, 40.75033257399991], [-73.77831180799991, 40.748745013999944], [-73.77753347599982, 40.74714834199988], [-73.77679196999986, 40.74554428899989], [-73.77616785699998, 40.744240022999904], [-73.77596627999999, 40.74381044799988], [-73.77585237799993, 40.74356469299995], [-73.77575892599995, 40.74336722699992], [-73.77573836999991, 40.74332564699993], [-73.77579713399984, 40.743317665999925], [-73.77805835699986, 40.74298648899991], [-73.778599248, 40.742908122999886], [-73.77965641299991, 40.742729309999895], [-73.78036603499997, 40.74259166299987], [-73.78068584999994, 40.74250560699994], [-73.78100566399996, 40.74241954099993], [-73.78121857699983, 40.742362250999925], [-73.78137698899997, 40.74231999399989], [-73.78176526799983, 40.74221640599993], [-73.7821600969999, 40.742115548999905], [-73.7831101189999, 40.741848304999905], [-73.78349697199984, 40.74174135999992], [-73.78400944099984, 40.74159935699984], [-73.78484244599998, 40.74136852999993], [-73.78577051299996, 40.7411106799999], [-73.78664844699985, 40.74086674899993], [-73.78669085300001, 40.74085298599988], [-73.78673516799984, 40.74084177599985], [-73.78759444399994, 40.74061795799991], [-73.78848243499986, 40.7403682779999], [-73.7886511029998, 40.7403257139999], [-73.78934727299989, 40.74012633799987], [-73.79020750099997, 40.739894702999855], [-73.7911152649998, 40.73964983899984], [-73.79202817599997, 40.73940358099989], [-73.79285797099998, 40.73917973299994], [-73.79291603199995, 40.73916776099987], [-73.79297881699995, 40.73915188099988], [-73.79369341399999, 40.73895006199987], [-73.79440801799996, 40.73874822999989], [-73.79533772999987, 40.738493672999915], [-73.79588681699978, 40.73837637499989], [-73.79611584799986, 40.73833613999987], [-73.79640218700004, 40.73828235799987], [-73.79641178399994, 40.738325325999895], [-73.79643940099992, 40.73843894799993], [-73.79672497900003, 40.738416642999894], [-73.79629297299985, 40.73855230599992], [-73.79640833699986, 40.738593419999894], [-73.7971768669999, 40.739986684999934], [-73.79722362499994, 40.740097800999884], [-73.79722373099987, 40.74009803499988], [-73.79722380199985, 40.740098277999905], [-73.79725664999995, 40.74021283499994], [-73.79725670899992, 40.74021304299991], [-73.79725674299983, 40.740213241999896], [-73.79727515299997, 40.740330033999896], [-73.79727517699985, 40.740330185999895], [-73.79727517699983, 40.74033034899986], [-73.79727886799999, 40.74044760099988], [-73.79727887899985, 40.74044786199991], [-73.79727885499992, 40.74044812399993], [-73.79726795099995, 40.74056448599986], [-73.79723084999992, 40.74169550699993], [-73.79695065300002, 40.741933034999896], [-73.79666622899994, 40.74213522099994], [-73.79666601799985, 40.742135371999886], [-73.79666581899986, 40.742135522999895], [-73.79639432300002, 40.742348348999904], [-73.79639423599997, 40.74234842499992], [-73.79639414999993, 40.74234849999986], [-73.79613638599983, 40.742571410999865], [-73.79613631199986, 40.74257146699995], [-73.79613624999985, 40.74257152399986], [-73.79589335199982, 40.742803526999886], [-73.7958931919999, 40.74280368699995], [-73.79589302899994, 40.74280385699993], [-73.79566566899987, 40.74304423599989], [-73.79543059299992, 40.74326428999993], [-73.7952125779999, 40.74349556899989], [-73.79501312, 40.74373670699995], [-73.79501298499999, 40.74373688099991], [-73.79501285899983, 40.743737044999854], [-73.79483295499979, 40.74398694199992], [-73.79467356599999, 40.7442440949999], [-73.79467340799984, 40.74424434599993], [-73.79467327199988, 40.74424460699987], [-73.79453507400001, 40.74450763799989], [-73.7944912069999, 40.744737567999955], [-73.79449117099993, 40.74473774799991], [-73.7944911469999, 40.744737937999965], [-73.7944636839999, 40.74497002199991], [-73.79445282999983, 40.7452030899999], [-73.79445281699995, 40.74520343199987], [-73.79445282799998, 40.74520375699995], [-73.79445869199989, 40.74543695399997], [-73.79448120499993, 40.74566936999989], [-73.79448121599987, 40.74566953199994], [-73.79448123999998, 40.745669693999915], [-73.79452019299998, 40.7459001589999], [-73.79457976099988, 40.746402682999914], [-73.7946756879998, 40.74721192799994], [-73.79472264899997, 40.74759932999989], [-73.79598269399985, 40.74853189299996], [-73.796581036, 40.74897739799995], [-73.79704716099987, 40.7493323179999], [-73.79729524699995, 40.74943505299987], [-73.79644617199999, 40.74985921699992], [-73.79566545000003, 40.75023619999991], [-73.79471901099991, 40.75064761699991], [-73.79468324699988, 40.75127504499995], [-73.79465583899984, 40.75198814499991], [-73.794627692, 40.75270267499999], [-73.79457726999996, 40.7535630109999], [-73.79474720599988, 40.755628187999925], [-73.79493246199993, 40.75779802999994], [-73.79402473999977, 40.75773596899993], [-73.79303015799997, 40.75775619399999], [-73.79212059099993, 40.75777758199993], [-73.79201171599978, 40.757780149999896], [-73.79122151599987, 40.75779876599992], [-73.79031517, 40.75782345099988], [-73.79053450999999, 40.759373037999886], [-73.79076004599987, 40.76098576899991], [-73.791654662, 40.76091206299987], [-73.79255337999999, 40.76084029399992], [-73.79343991199988, 40.760764127999934], [-73.79344033499987, 40.76082252699995], [-73.79344299999985, 40.761185336999866], [-73.793438002, 40.7615135269999], [-73.79343673799991, 40.76159683099993], [-73.79334546300007, 40.76229534299991], [-73.79322483899982, 40.763142007999946], [-73.79302551399985, 40.76462119199986], [-73.7939591469999, 40.7646953199999], [-73.79361279599985, 40.76722335799996], [-73.793422277, 40.76859990799989], [-73.79321182299991, 40.77033648899987], [-73.79317944599984, 40.77040317799988], [-73.79238243799978, 40.7694838389999], [-73.79235243699989, 40.76944963799987], [-73.79190204099989, 40.768936211999915], [-73.79149870499994, 40.76844739099989], [-73.79137684499982, 40.7683242969999], [-73.79059858199989, 40.76741868799998], [-73.79021960799982, 40.76695117499985], [-73.78990502999987, 40.7665115969999], [-73.78963649799978, 40.76614161099991], [-73.78871017999994, 40.76485425199996], [-73.7886108559999, 40.764709593999925], [-73.78849669799996, 40.764570552999885], [-73.78836856600003, 40.76443842899987], [-73.78822763099994, 40.76431439599985], [-73.78807523699999, 40.76419948999993], [-73.78733166699999, 40.76380781299986], [-73.78714131699988, 40.76370782099992], [-73.78595810599988, 40.76310224399986], [-73.78571993599994, 40.762921464999856], [-73.78546383099984, 40.76259192499988], [-73.78542241999988, 40.76251310799994], [-73.78535911599988, 40.7622563179999], [-73.78530175399992, 40.76197850399994], [-73.78527359199997, 40.761842105999925], [-73.785251708, 40.761756958999904], [-73.78516838299994, 40.76143281799993], [-73.78502434699996, 40.761036515999855]]]}}, {\&quot;id\&quot;: \&quot;9\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 10, \&quot;Shape_Leng\&quot;: 0.0998394794152, \&quot;Shape_Area\&quot;: 0.000435823818081, \&quot;zone\&quot;: \&quot;Baisley Park\&quot;, \&quot;LocationID\&quot;: 10, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7832662499999, 40.68999429299992], [-73.78234452799988, 40.68840743699997], [-73.78148675699995, 40.6886971829999], [-73.78051569899989, 40.6870365199999], [-73.77976509199979, 40.685743601999924], [-73.77966850599998, 40.685377122999945], [-73.77957347199998, 40.68541503299992], [-73.77870794599994, 40.685700419999876], [-73.77784971099992, 40.68598927299989], [-73.77699767599997, 40.68628268899992], [-73.77697494099996, 40.686246713999935], [-73.7767991239999, 40.68596846499985], [-73.77632402199986, 40.6852165559999], [-73.77567289899983, 40.68474158899993], [-73.77501231399985, 40.684275578999845], [-73.77462061100005, 40.68399096999984], [-73.7745579039998, 40.683885621999906], [-73.77441975399977, 40.68365352199991], [-73.77418414899984, 40.68323792099991], [-73.773499153, 40.68348222699995], [-73.77328703999997, 40.68345473099989], [-73.77297749099996, 40.68293379299995], [-73.77256209599992, 40.682209496999846], [-73.77220275299989, 40.681610338999896], [-73.77232211299984, 40.68149096799993], [-73.77299539399996, 40.6812088249999], [-73.77356539499996, 40.68096392599992], [-73.77408130199989, 40.68076015399986], [-73.77469730199986, 40.680486045999906], [-73.77475342099996, 40.68046728099991], [-73.77549588399995, 40.680219045999934], [-73.77636248100002, 40.679935908999916], [-73.77722923600001, 40.679652720999904], [-73.77749031599994, 40.67955740299992], [-73.77774211299992, 40.67944657599985], [-73.77798227199999, 40.67932109299989], [-73.77820864799988, 40.67918207599993], [-73.77841935399988, 40.6790308799999], [-73.7793120879999, 40.6784368039999], [-73.77947817299986, 40.67836454999986], [-73.78025859499995, 40.6778409239999], [-73.7809512629998, 40.677353507999946], [-73.78128277899985, 40.67710972999991], [-73.78157185499998, 40.676901330999954], [-73.782218084, 40.676437536999906], [-73.78304214600001, 40.67584371699991], [-73.7832954899999, 40.675679444999915], [-73.783536133, 40.675503090999904], [-73.78376243999988, 40.675315685999905], [-73.78376261799986, 40.67531553299985], [-73.78376278399993, 40.67531538999988], [-73.78397345, 40.675117994999944], [-73.78397363999976, 40.67511780699991], [-73.78397384099986, 40.67511760899993], [-73.78416807199993, 40.67491103399994], [-73.78434496299991, 40.6746964399999], [-73.78484333899993, 40.67390332299989], [-73.78511037999995, 40.673478363999905], [-73.78532371499995, 40.67312502099992], [-73.78573730899993, 40.67238503499988], [-73.78686902099984, 40.672823923999864], [-73.78808647399985, 40.6730096269999], [-73.78847621499992, 40.67132650099996], [-73.7888310799999, 40.6698234859999], [-73.78915781999983, 40.66833809599989], [-73.78940999399993, 40.66684115799993], [-73.79039544099997, 40.66688770399988], [-73.79129821899986, 40.666970784999904], [-73.79218446699987, 40.66704188899988], [-73.79306694299999, 40.667067293999935], [-73.79319502099987, 40.66705844699985], [-73.79392731599994, 40.667006752999946], [-73.79445715, 40.666981055999926], [-73.79498745799991, 40.66696182699995], [-73.79551810099989, 40.6669490719999], [-73.7960489459999, 40.666942792999855], [-73.7965798539999, 40.666942991999896], [-73.79711068999998, 40.66694966899994], [-73.79739484699991, 40.6669398859999], [-73.798072072, 40.66671288499993], [-73.79828522699991, 40.66664725099992], [-73.79850596999994, 40.66659438099988], [-73.79873226699989, 40.666554982999905], [-73.79896198599992, 40.666529485999874], [-73.79919289299993, 40.666518074999885], [-73.79942279899994, 40.666520663999925], [-73.79968140399984, 40.66656547099993], [-73.80027044399995, 40.66666752699987], [-73.80102008199994, 40.66672907999993], [-73.80139045299981, 40.66674665899994], [-73.80148383499996, 40.66675015199992], [-73.80155565300004, 40.6667533639999], [-73.80153052599994, 40.66683715899995], [-73.80141266299995, 40.66735840999995], [-73.80134286799985, 40.66777379699988], [-73.801250796, 40.66838594499995], [-73.80120616599989, 40.66894442399993], [-73.80117909099995, 40.66910026499992], [-73.80116000899989, 40.66980042099991], [-73.80113236199993, 40.67054866799994], [-73.8011343009999, 40.671294461999906], [-73.80113697299981, 40.67135852899988], [-73.80114238199995, 40.67148794299991], [-73.80115538600003, 40.67179912099987], [-73.80115934999986, 40.67189388999986], [-73.80117234299993, 40.67220503199988], [-73.801194616, 40.67242246499994], [-73.80130166499995, 40.67312152199991], [-73.80140210699993, 40.673561318999894], [-73.80142836799988, 40.673666833999874], [-73.80168194799982, 40.67438384799994], [-73.80202521799998, 40.675114272999934], [-73.80238906400001, 40.67588847899992], [-73.80267769599996, 40.67649796699987], [-73.8030752049999, 40.67734560099988], [-73.80323027699988, 40.677681056999894], [-73.80410226599996, 40.67942454999991], [-73.80428288199992, 40.679817355999916], [-73.80464517099982, 40.68057988999991], [-73.80492976299996, 40.68117697399989], [-73.80522682799987, 40.68179814999995], [-73.80551811199996, 40.68240820999994], [-73.80576840199991, 40.682932390999916], [-73.80568769599995, 40.68295563299993], [-73.80519209299995, 40.683096057999876], [-73.80432351099998, 40.683341794999855], [-73.80344528099988, 40.68359185699996], [-73.80256430899988, 40.68384243899986], [-73.80168572400002, 40.68409195599986], [-73.80077394899995, 40.684349927999904], [-73.79986119199985, 40.684610142999944], [-73.79943031399989, 40.68473198799994], [-73.79898209099989, 40.68485873699989], [-73.79995042799996, 40.68682771899991], [-73.79913531199985, 40.687181957999904], [-73.79828588299998, 40.68752401899992], [-73.79746057199985, 40.68787230199989], [-73.7966293329999, 40.68822145199994], [-73.79561486799987, 40.688656890999916], [-73.7952109489999, 40.688094665999884], [-73.79477837399985, 40.68747068399995], [-73.79437087299995, 40.68691258199987], [-73.793908417, 40.68630469099985], [-73.79317220799987, 40.68659668599987], [-73.79248043499994, 40.68688962999991], [-73.79210699399984, 40.687047535999945], [-73.79038468299987, 40.68775361399986], [-73.78962631299987, 40.68793905899987], [-73.78920529899993, 40.688053212999904], [-73.78867911999995, 40.68818018399991], [-73.78764209899992, 40.68843484999997], [-73.78698344499996, 40.68860847699995], [-73.78643950599998, 40.688781709999894], [-73.78580499899994, 40.68899689699988], [-73.78479240699981, 40.689361599999856], [-73.78409903999982, 40.68964775499987], [-73.7832662499999, 40.68999429299992]]]}}, {\&quot;id\&quot;: \&quot;10\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 11, \&quot;Shape_Leng\&quot;: 0.0792110389596, \&quot;Shape_Area\&quot;: 0.00026452053504, \&quot;zone\&quot;: \&quot;Bath Beach\&quot;, \&quot;LocationID\&quot;: 11, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00109809499993, 40.60303462599992], [-74.00032353799993, 40.60262029199991], [-74.00002266099992, 40.60290731599988], [-73.99927902000005, 40.60245801699991], [-73.998563851, 40.602028433999905], [-73.99782332499991, 40.601578178999915], [-73.99708036399986, 40.60112882899989], [-73.9963651649999, 40.600696053999904], [-73.99559320799995, 40.600232221999875], [-73.99733919599988, 40.5985516119999], [-73.9986558659999, 40.59726856199988], [-73.99931921399997, 40.59664075099992], [-73.99951049399985, 40.59644180899987], [-73.99996502999996, 40.59599430299989], [-73.999997695, 40.59596779199991], [-74.00004233899988, 40.59594037099991], [-74.00027871999994, 40.59570266899989], [-74.00200394754667, 40.594132371137796], [-74.00219143075543, 40.594356454281495], [-74.00230298841333, 40.5945433405649], [-74.00242215707557, 40.59472747670866], [-74.00254882028027, 40.59490868266266], [-74.0026828542343, 40.59508678124064], [-74.0028241279343, 40.59526159829328], [-74.00297250329423, 40.59543296287876], [-74.00312783528081, 40.59560070742998], [-74.00328997205449, 40.59576466791808], [-74.00345875511843, 40.59592468401364], [-74.00363401947315, 40.59608059924292], [-74.00552621986131, 40.5975391540707], [-74.00774585717092, 40.59893572292123], [-74.0084840914256, 40.599391458642174], [-74.00921723904898, 40.59984404515234], [-74.00961563255356, 40.600039964139015], [-74.00977479602606, 40.60013149053109], [-74.00993545102718, 40.60022149043687], [-74.01017239979778, 40.600349996195334], [-74.01041238886523, 40.60047518174621], [-74.01065533816518, 40.60059700531704], [-74.01090145053502, 40.60071555985398], [-74.01115036636867, 40.60083066431848], [-74.01140200242962, 40.60094228021335], [-74.0116363253687, 40.60104205715398], [-74.0118728222616, 40.601138808863034], [-74.01206343136853, 40.60121952230082], [-74.01236981602695, 40.6013492571162], [-74.0129988703337, 40.60155920754662], [-74.0130216004983, 40.60156586710369], [-74.01394137729592, 40.601835344373335], [-74.01478363716735, 40.6020821029708], [-74.0153028898328, 40.60219124627411], [-74.0158240482871, 40.60229498086631], [-74.01617431336636, 40.60235057841938], [-74.0165263578993, 40.60239921156565], [-74.01687994353071, 40.60244084737736], [-74.01723483086067, 40.6024754576642], [-74.0175907796064, 40.60250301899235], [-74.01799227936888, 40.60249195235379], [-74.01829286301476, 40.60244735523035], [-74.01832347216846, 40.60241765113048], [-74.0191356390289, 40.60261275450496], [-74.01913408409737, 40.60264855305148], [-74.01932826647813, 40.60281080817145], [-74.01942760861903, 40.602871578425265], [-74.01939343499993, 40.60291176099992], [-74.01923150299993, 40.603102173999915], [-74.01918088999996, 40.60314959499995], [-74.01917685099995, 40.603154421999875], [-74.01871382199994, 40.60358207499994], [-74.01869135799996, 40.60360792399991], [-74.018660218, 40.60364106799989], [-74.01823145099998, 40.604108472999926], [-74.01821458599989, 40.60418195799988], [-74.01817646699998, 40.604252608999936], [-74.01811904999991, 40.60431522299989], [-74.01804702499993, 40.60436573499991], [-74.0175086849999, 40.60485049699985], [-74.01746711399997, 40.60496510399988], [-74.01728366699999, 40.60513782499991], [-74.01671283899998, 40.60568263499987], [-74.01640553099998, 40.605975924999875], [-74.01549854999998, 40.606841523999925], [-74.0162363669999, 40.60723326599993], [-74.01701910199995, 40.60765441699994], [-74.01522379399994, 40.6093563839999], [-74.01348255899993, 40.61103739799988], [-74.01171201599988, 40.6127350289999], [-74.01108648099991, 40.61333904399986], [-74.01050403599997, 40.613896610999866], [-74.01019858699995, 40.613712166999925], [-74.00830383399986, 40.612567999999925], [-74.00788398499994, 40.61234007199985], [-74.00708800599996, 40.61190794499986], [-74.00601438399993, 40.61132508199992], [-74.00342538899996, 40.609969092999926], [-74.00266468099994, 40.60956996599992], [-74.00185301899995, 40.60913755999995], [-74.00094408399997, 40.60863970999988], [-74.00130866099992, 40.60834356899987], [-74.00171808600001, 40.60800297799994], [-74.00195011999993, 40.60781768299991], [-74.00264412399989, 40.60725717499991], [-74.00442477199992, 40.60556859699992], [-74.00493448899994, 40.60507440599987], [-74.00444636799998, 40.60480184699984], [-74.00416249599996, 40.60465473899992], [-74.00340902699993, 40.60425938099994], [-74.00263069599995, 40.6038464489999], [-74.00184603099991, 40.60343143199989], [-74.00109809499993, 40.60303462599992]]]}}, {\&quot;id\&quot;: \&quot;11\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 12, \&quot;Shape_Leng\&quot;: 0.0366613013579, \&quot;Shape_Area\&quot;: 4.15116236727e-05, \&quot;zone\&quot;: \&quot;Battery Park\&quot;, \&quot;LocationID\&quot;: 12, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01565756599994, 40.70483308799993], [-74.01539758699995, 40.70480014899991], [-74.01527219799995, 40.70483003699996], [-74.01516257, 40.704805094999884], [-74.01496125199992, 40.70475979699996], [-74.01489542099996, 40.7046975179999], [-74.01478059499996, 40.70467411299991], [-74.0146670989999, 40.704647212999895], [-74.01451712299998, 40.704605674999854], [-74.01437031200001, 40.70455803799994], [-74.01428922899998, 40.70454907499989], [-74.01427065899998, 40.70452022899989], [-74.01425861399996, 40.70448944299991], [-74.01425342599994, 40.70445756399993], [-74.01425523899994, 40.704425471999905], [-74.014391769, 40.70359878299993], [-74.01442983199998, 40.70315064799991], [-74.014192151, 40.70275671099995], [-74.01389890399994, 40.702270669999976], [-74.01379120799997, 40.70130547599994], [-74.01378191199989, 40.70122215499992], [-74.01377528899994, 40.70118271299988], [-74.01376867799992, 40.7011432629999], [-74.01415893499998, 40.70109628999988], [-74.01395152778245, 40.70099098222993], [-74.0140919838548, 40.70055161832718], [-74.01410490300086, 40.7005108283869], [-74.01409144949483, 40.700508336726905], [-74.01412821190817, 40.70039328205465], [-74.0141372638859, 40.70039495521028], [-74.01414860637784, 40.7003205717237], [-74.01417467279444, 40.70026089129383], [-74.014220631955, 40.70011149186829], [-74.0143098131129, 40.70012129606874], [-74.01430981586151, 40.70013410151564], [-74.01417787931776, 40.70054147355368], [-74.01416495763299, 40.70053905203081], [-74.014152387873, 40.70057786578352], [-74.01428920741124, 40.700644144765086], [-74.01430157023238, 40.70063221177271], [-74.0142965168929, 40.700629186523706], [-74.01431530264765, 40.70061103797418], [-74.01431796468076, 40.70061249730781], [-74.01436783583218, 40.70054612266748], [-74.01444813150715, 40.70044737239987], [-74.01455999973689, 40.70030978677959], [-74.01457513332028, 40.70031691633122], [-74.01458425440417, 40.70030846895508], [-74.01458234409432, 40.70028387552862], [-74.01463294333476, 40.700197430412395], [-74.01467119992019, 40.70021040169973], [-74.01466717213704, 40.700239380907306], [-74.01465386124688, 40.700242641175116], [-74.01460863003733, 40.700309708245804], [-74.01460825448504, 40.70032365711382], [-74.01455219325995, 40.70038298075157], [-74.01449342549978, 40.70044516925065], [-74.01449246893418, 40.70045466900283], [-74.01448492126369, 40.70046115359205], [-74.01447857931363, 40.70046208215578], [-74.01440947394667, 40.7005513314123], [-74.01439689988958, 40.70056348189321], [-74.01439480693733, 40.70057047909727], [-74.01432384363005, 40.70066130412713], [-74.01464323234902, 40.70081730432509], [-74.01472424834412, 40.70071429389424], [-74.01477142439134, 40.700663651906844], [-74.01481236514043, 40.70061084993608], [-74.01485926659423, 40.70055544464551], [-74.01493032611235, 40.70047926986344], [-74.01499883053579, 40.70040612057649], [-74.0150681826931, 40.70031825755492], [-74.0150983227013, 40.70033426552348], [-74.01503579735073, 40.70042083101053], [-74.01502271060043, 40.70041953605862], [-74.01500850517252, 40.70043770992607], [-74.01499314575906, 40.700436847319885], [-74.01496757071692, 40.70046541487967], [-74.01497495555579, 40.70047017772347], [-74.01494881182722, 40.70049441360121], [-74.01494255505823, 40.70050610329131], [-74.01492322289359, 40.70051519147152], [-74.0149175465081, 40.70052557571268], [-74.01492379463954, 40.70053033870716], [-74.01493687947057, 40.70052297938124], [-74.01494199155965, 40.70052384332575], [-74.0148859896547, 40.70058011443573], [-74.01482004284685, 40.700660619780244], [-74.01472681782191, 40.700774015849575], [-74.01470265033873, 40.70079911602562], [-74.014673656285, 40.70083460953097], [-74.01481072560155, 40.700903831982195], [-74.01482834225268, 40.70089474286971], [-74.01502113661684, 40.700992504013406], [-74.01514231812091, 40.700842892354245], [-74.01567778184732, 40.70125602102741], [-74.01579351711148, 40.701346905807576], [-74.01591034233417, 40.7014609484439], [-74.01611609060468, 40.701630801625356], [-74.01613890635998, 40.70164601710269], [-74.0162444906067, 40.70175272143678], [-74.01639205370195, 40.70189770100826], [-74.01651515260785, 40.70201729867141], [-74.01653258703746, 40.702036539683036], [-74.01681859599911, 40.70233857508047], [-74.01689657041247, 40.70242187995947], [-74.01700396789508, 40.702554535627485], [-74.01713705889382, 40.702711340267676], [-74.01714508062653, 40.70270534997615], [-74.01725182133947, 40.70283555726373], [-74.01724571591124, 40.70283845773918], [-74.01729346221033, 40.70288743870684], [-74.01731837763397, 40.702918871771594], [-74.01739839332275, 40.703019140804905], [-74.01744003546048, 40.70307751454187], [-74.01749381162765, 40.7031548434601], [-74.01754038297949, 40.703236160429874], [-74.01757548561497, 40.70330750305602], [-74.0175964796706, 40.70336138730908], [-74.01761681217123, 40.70342324846537], [-74.01762601904944, 40.70342276122709], [-74.0176479750685, 40.70349459987955], [-74.01766045074616, 40.70354997909756], [-74.01766881307267, 40.703591313467626], [-74.01767132020255, 40.70360642738378], [-74.01768310568107, 40.703711131225276], [-74.01767264581422, 40.70371179104597], [-74.01767689629425, 40.70377050363851], [-74.0176742874818, 40.70383436757152], [-74.01766578442252, 40.703899233718545], [-74.01765792483437, 40.703932661786354], [-74.01764306532696, 40.70398897346138], [-74.01765378898192, 40.70399838081254], [-74.01765461989744, 40.704009682569755], [-74.01764390293607, 40.70402224590194], [-74.01763399890548, 40.70402475178324], [-74.01762657963023, 40.704023500821606], [-74.01757035703022, 40.70418388099316], [-74.01713123899997, 40.70428253499989], [-74.01684600699993, 40.70463488599989], [-74.01675906699995, 40.704742282999845], [-74.01668714699993, 40.704743941999865], [-74.01668613099999, 40.70479933799992], [-74.01662761199991, 40.704799430999856], [-74.01652040399995, 40.70479971799988], [-74.01637519799986, 40.704838484999925], [-74.01629888499991, 40.70484641499997], [-74.01621736899986, 40.7048530269999], [-74.01587396199992, 40.70488211299991], [-74.01565582199999, 40.704882633999915], [-74.01565756599994, 40.70483308799993]]]}}, {\&quot;id\&quot;: \&quot;12\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 13, \&quot;Shape_Leng\&quot;: 0.0502813228631, \&quot;Shape_Area\&quot;: 0.000149358592917, \&quot;zone\&quot;: \&quot;Battery Park City\&quot;, \&quot;LocationID\&quot;: 13, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.01244109299991, 40.7190576729999], [-74.01281566799992, 40.71735629799986], [-74.01286663199996, 40.717176100999936], [-74.0130514639999, 40.7164547709999], [-74.01323384899992, 40.71565618799984], [-74.0133512149999, 40.71523331199992], [-74.01347524299993, 40.71511071099989], [-74.01359239999995, 40.7144943159999], [-74.01375388499997, 40.71369055499987], [-74.01404744699995, 40.7124378149999], [-74.01417753399997, 40.71188266599996], [-74.0142689369999, 40.71146781599992], [-74.01445559399995, 40.71090715299986], [-74.01466507099994, 40.71042693799992], [-74.01482432799999, 40.70982336799991], [-74.01487257099997, 40.70968487399991], [-74.01495415399995, 40.70943269199994], [-74.01534330799996, 40.70849681699988], [-74.01559220199994, 40.70788324299986], [-74.015643777, 40.707756098999894], [-74.01568829399997, 40.70766382499986], [-74.01571815199996, 40.70758531099992], [-74.01584985499994, 40.70724726799987], [-74.01586395999995, 40.707200182999905], [-74.01588574099995, 40.70714217599992], [-74.01590498299998, 40.70709269499987], [-74.01593869399987, 40.70700757399988], [-74.0160596679999, 40.70670512999991], [-74.01619519599998, 40.70625848499991], [-74.0162515959999, 40.70607261399987], [-74.01640305499988, 40.70566620199989], [-74.01662217899997, 40.70509448299992], [-74.01665417299996, 40.7049638209999], [-74.01668613099999, 40.70479933799992], [-74.01668714699993, 40.704743941999865], [-74.01675906699995, 40.704742282999845], [-74.01684600699993, 40.70463488599989], [-74.01713123899997, 40.70428253499989], [-74.01757035703022, 40.70418388099316], [-74.017794545203, 40.70423489810132], [-74.01785585682943, 40.70407884761557], [-74.01775054986874, 40.70405488289344], [-74.01779139303439, 40.70395091258355], [-74.01781758697946, 40.70393792249663], [-74.01783782825969, 40.70396266613854], [-74.01780821746945, 40.70403196447959], [-74.01791229326216, 40.704054497150985], [-74.01794269363918, 40.703973176576255], [-74.01795473982617, 40.703975785608584], [-74.01784441106726, 40.7042420399379], [-74.01844770243774, 40.70416216823156], [-74.01866830837966, 40.704435240621244], [-74.01865606299125, 40.704440968684594], [-74.01751639597092, 40.704580844793384], [-74.0174808615258, 40.704667487696156], [-74.01753166144591, 40.70467109085019], [-74.01754791723494, 40.70466387515681], [-74.01755808298708, 40.70466593603325], [-74.01757026976702, 40.704662836429215], [-74.01757365505411, 40.704667996083565], [-74.01756688836936, 40.70467159878248], [-74.01759804780863, 40.704684480713354], [-74.0176342910399, 40.70467891041742], [-74.01767567049036, 40.704680875362584], [-74.01768666268582, 40.704673985963076], [-74.01771834047513, 40.704679887260674], [-74.01773321304685, 40.70467152000495], [-74.01774937712389, 40.7046754518885], [-74.01776552858085, 40.70467249656343], [-74.01776682871572, 40.70466511126367], [-74.01778363303418, 40.70467101601077], [-74.01779785539696, 40.70466707943758], [-74.0178062672323, 40.70466216121492], [-74.01782889269187, 40.7046651016672], [-74.01783988433819, 40.704661165086556], [-74.01790194580029, 40.70465180844165], [-74.01791034926417, 40.70465919223341], [-74.01794138637455, 40.70465573717841], [-74.01794397538687, 40.704648361727315], [-74.01796918021806, 40.70464736737476], [-74.01797888053436, 40.704640971684015], [-74.01798922454327, 40.7046468779127], [-74.01799827820122, 40.70464982983339], [-74.01800797806544, 40.70463851001485], [-74.01802414308348, 40.704645890908516], [-74.01804288218334, 40.70462817432251], [-74.01805387593451, 40.70462964047163], [-74.01806504689, 40.704635960523234], [-74.01811296129115, 40.704553727487166], [-74.01886287526735, 40.70471961588463], [-74.01888746649367, 40.70472914883739], [-74.0189257238241, 40.704773762570255], [-74.01934155704531, 40.70607053820401], [-74.01934254624483, 40.706093673029706], [-74.0192224228398, 40.706573088725996], [-74.019122759634, 40.70697581433742], [-74.01910255488423, 40.70700043764151], [-74.01909155084701, 40.7070044731845], [-74.0190661714014, 40.707013770621415], [-74.01903338019694, 40.70701319087609], [-74.01895359463364, 40.70699676946552], [-74.01894579167332, 40.7070177709414], [-74.01893740557156, 40.70703420689672], [-74.018926604438, 40.70704425778585], [-74.01890921570659, 40.70706434245121], [-74.01888462028889, 40.70708580553676], [-74.01885943006913, 40.70710041568372], [-74.01882943775024, 40.70711548664006], [-74.01879644936784, 40.707127819847635], [-74.0187610576787, 40.70713786652501], [-74.01872626987436, 40.70714335568639], [-74.01868966870467, 40.707142443753945], [-74.0186554807563, 40.70714153912505], [-74.01863058372689, 40.70713971526927], [-74.0185807840372, 40.707123748102724], [-74.01854718475336, 40.707107770264166], [-74.01857117399432, 40.70707992238869], [-74.01860717601117, 40.70709544097519], [-74.01863417023104, 40.7071031988087], [-74.01864437101163, 40.7071054758605], [-74.01864796262215, 40.70708173802993], [-74.0186869537992, 40.707084009237526], [-74.01872115249107, 40.70708172614977], [-74.01875054622958, 40.70707989330998], [-74.01876194037423, 40.707075785866905], [-74.01874993323987, 40.707049762489504], [-74.01877393087639, 40.70704428278756], [-74.01879432757899, 40.70703241167225], [-74.01882011914348, 40.70701597288301], [-74.01883870432944, 40.70699496965148], [-74.01884829724429, 40.70698309041019], [-74.01884889814508, 40.70697031235021], [-74.01881110035015, 40.7069662117742], [-74.01879851485626, 40.70698218837616], [-74.01877571598487, 40.70699725864644], [-74.01874212416382, 40.70700776337878], [-74.01872292981695, 40.70700685750043], [-74.0186947319076, 40.707010967669895], [-74.01867853372192, 40.70701873300243], [-74.0186479447413, 40.70701781957846], [-74.01862814488057, 40.70701097846493], [-74.01861254498962, 40.70699728514591], [-74.0186047441128, 40.706989064177236], [-74.01860294181307, 40.7069749179781], [-74.01859153053353, 40.70695939491844], [-74.01857952850992, 40.70694981480905], [-74.01857172609165, 40.70693839792395], [-74.0185693319175, 40.70692059520576], [-74.01856452356972, 40.706906440109265], [-74.01854892759579, 40.70690827067913], [-74.01853513269664, 40.70691832201406], [-74.01853033752076, 40.70695073241034], [-74.01840649088626, 40.707257872158465], [-74.01821726389763, 40.707742206471714], [-74.01821699384473, 40.70775130976829], [-74.01819029259642, 40.70782162610998], [-74.01865557049648, 40.70792394888325], [-74.01864689079073, 40.70794681354695], [-74.0188006306842, 40.707980621637354], [-74.0188319588392, 40.70799916729172], [-74.01883395951484, 40.70800221914011], [-74.01885347760366, 40.70802201228401], [-74.01885500911972, 40.70804753444736], [-74.01874689830457, 40.70848058025357], [-74.01863142468959, 40.7089411000542], [-74.01846882134515, 40.70958957100872], [-74.01834136609794, 40.71010647694362], [-74.01826409180671, 40.71040899662683], [-74.01814480361767, 40.71088865018895], [-74.01811057789173, 40.711029628214455], [-74.01804609687575, 40.71134450148705], [-74.01797853231488, 40.711756319208014], [-74.01792224257028, 40.712039242700754], [-74.01787333422655, 40.712315144456404], [-74.01777014254499, 40.71283457478916], [-74.01775292705896, 40.712848327555946], [-74.01773183836696, 40.71284931234664], [-74.01772021563546, 40.71284473093366], [-74.01772148946118, 40.71278414511305], [-74.01780037888389, 40.71234512415861], [-74.01662424425285, 40.71215731899529], [-74.0165446381253, 40.712456037930906], [-74.01659227582768, 40.71254817107677], [-74.01661817655314, 40.71264976356906], [-74.01661840078299, 40.71275615002966], [-74.01659149520512, 40.712861563719784], [-74.0165554889345, 40.71292909550437], [-74.01654112171721, 40.71295556481934], [-74.01647724204135, 40.713029493073954], [-74.01639169485804, 40.713099997950714], [-74.01632006627581, 40.71340798247826], [-74.01654114686625, 40.713441052742326], [-74.01691068695474, 40.71349632851291], [-74.01754443334657, 40.71361122266428], [-74.01756811041477, 40.71352370347795], [-74.01757889322138, 40.71344274342789], [-74.01764810719082, 40.713206185951634], [-74.01765509447189, 40.71316106266698], [-74.01767041664047, 40.71306920796511], [-74.01767270851062, 40.7130659962747], [-74.01767565436691, 40.71306310981558], [-74.01767917626104, 40.71306062496484], [-74.01768318100166, 40.71305860747276], [-74.0176875626216, 40.71305711072315], [-74.01769220518092, 40.71305617432077], [-74.0176969858353, 40.713055823043184], [-74.01770177808676, 40.71305606618535], [-74.01770610821879, 40.713056814196534], [-74.01771024196847, 40.71305804785401], [-74.017714085846, 40.713059739257254], [-74.01771755291756, 40.7130618501529], [-74.01772056477111, 40.7130643328008], [-74.01772305328981, 40.71306713105258], [-74.01772496219284, 40.71307018162274], [-74.01770687258355, 40.713169282968664], [-74.01761833310017, 40.7136543239355], [-74.01753721790737, 40.714097542247806], [-74.01740871360494, 40.71480680040797], [-74.01738223187851, 40.71494446127923], [-74.01726421509528, 40.71559268236992], [-74.01712122293634, 40.716371793579704], [-74.01698274294627, 40.71713064366814], [-74.0168629737726, 40.71778695428783], [-74.01671018605829, 40.718624176057965], [-74.01669419095931, 40.718648843354394], [-74.01665946969602, 40.71866602122463], [-74.01662996338182, 40.71866536845022], [-74.01594695204268, 40.718575548906244], [-74.01594382984199, 40.71858925504418], [-74.01566883666864, 40.718554489265706], [-74.01567062060764, 40.718537748736196], [-74.01555087754495, 40.71852193318381], [-74.01500060682406, 40.71844923605504], [-74.01499619731617, 40.718473001316646], [-74.0149898133956, 40.718507347327694], [-74.01498333230728, 40.71852379143296], [-74.01497036258002, 40.718535850864214], [-74.01494515549334, 40.718543535077174], [-74.01470270021802, 40.718516154884156], [-74.01321322719183, 40.7183157198958], [-74.01306805492324, 40.71892219382553], [-74.013072377692, 40.718938618670066], [-74.01303068113208, 40.71913145590955], [-74.01270167899996, 40.71909177499986], [-74.01255468899996, 40.71906986299998], [-74.01244109299991, 40.7190576729999]]]}}, {\&quot;id\&quot;: \&quot;13\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 14, \&quot;Shape_Leng\&quot;: 0.175213698053, \&quot;Shape_Area\&quot;: 0.00138177826442, \&quot;zone\&quot;: \&quot;Bay Ridge\&quot;, \&quot;LocationID\&quot;: 14, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.03407329297129, 40.64431393298185], [-74.03284292006926, 40.64356371017527], [-74.03266558998958, 40.643720344890056], [-74.03260644399995, 40.643698910999944], [-74.02905968899994, 40.64172667299992], [-74.02889666799992, 40.64121402199986], [-74.02890829899998, 40.641173410999905], [-74.02839277799997, 40.640963136999865], [-74.02802775299989, 40.6407934899999], [-74.02742711399993, 40.64051433699994], [-74.02703439399988, 40.640349985999876], [-74.02691981299992, 40.64030850799986], [-74.02674292499995, 40.64024446799992], [-74.02662323799991, 40.6402011359999], [-74.02626267299999, 40.64009438099988], [-74.02628611999998, 40.64007452899986], [-74.02635007599996, 40.64001846499988], [-74.02646434999998, 40.639918292999916], [-74.02659984399993, 40.63978656099993], [-74.02664251499989, 40.63974743299988], [-74.02686129399991, 40.639536290999885], [-74.02695244699993, 40.63944606499998], [-74.02475437599998, 40.6381214179999], [-74.0245384189999, 40.63832493699993], [-74.02417094699996, 40.63866937099985], [-74.02392610699991, 40.638898857999926], [-74.02354939199988, 40.63932033399992], [-74.02351787199997, 40.63944477399987], [-74.02348203699995, 40.63953321299994], [-74.02346821799988, 40.639567334999875], [-74.02340085399995, 40.63968573199987], [-74.02331682999991, 40.63979778199991], [-74.02321780199998, 40.63990151499989], [-74.02310593199999, 40.639995325999934], [-74.02259016799994, 40.64043910599985], [-74.02246253899987, 40.640538898999836], [-74.02228790899991, 40.64063883599989], [-74.02222562199997, 40.64067782299986], [-74.02180903199998, 40.64095040899988], [-74.02172675999999, 40.641004941999924], [-74.02152001099994, 40.64115336799986], [-74.02120118199991, 40.64138693999995], [-74.0211362599999, 40.6414339679999], [-74.02111136799995, 40.64145200099989], [-74.02108051399998, 40.64149093699994], [-74.0210580239999, 40.641475982999935], [-74.02108520199992, 40.6414403539999], [-74.0211051969999, 40.641414135999895], [-74.02114153299986, 40.64136239499993], [-74.02126975099996, 40.64117350099991], [-74.021471331, 40.64082961299996], [-74.02159214600002, 40.64056920899986], [-74.02161540399997, 40.64050926299993], [-74.02166136899989, 40.64037438299987], [-74.0217092389999, 40.64020009799985], [-74.02172617299989, 40.640113319999934], [-74.02176040899997, 40.639824345999884], [-74.02174189000002, 40.63946629199994], [-74.02173880499991, 40.63944050699994], [-74.02170856799994, 40.63930090299994], [-74.02170098699993, 40.6392654599999], [-74.02167777199992, 40.63919125699987], [-74.02164685099997, 40.63909104799991], [-74.02160867799991, 40.63897677999994], [-74.02154646799997, 40.638830162999916], [-74.02150876399996, 40.63874907199992], [-74.02141038399992, 40.638584902999845], [-74.02129372099995, 40.63842824199984], [-74.02116029799993, 40.6382807979999], [-74.021114445, 40.638235535999904], [-74.02107776199989, 40.63820262199994], [-74.02084657599987, 40.637983350999924], [-74.020598444, 40.63777414199989], [-74.02032883799993, 40.63757296899991], [-74.02002934999997, 40.6373793659999], [-74.01976495999995, 40.63721743499991], [-74.01962150999994, 40.63713106399992], [-74.01955410699993, 40.637091226999914], [-74.01899546799997, 40.63675410399992], [-74.01799939199995, 40.636157921999875], [-74.01755212599994, 40.63588725099987], [-74.01750323299989, 40.635856163999904], [-74.01727269499997, 40.63569567599991], [-74.01705196399995, 40.63552755399995], [-74.016835401, 40.63535542899995], [-74.01667603, 40.63518670499994], [-74.01660869499997, 40.635118833999876], [-74.01650516099988, 40.63499150699987], [-74.01646522999985, 40.63494240699986], [-74.01633863299998, 40.63475616099995], [-74.01626768999998, 40.634628405999855], [-74.01623055699994, 40.6345615299999], [-74.0161423149999, 40.634360157999915], [-74.01607491199997, 40.63415382299994], [-74.01602896399994, 40.633944430999854], [-74.016004681, 40.63373391199987], [-74.01600191100002, 40.63352419099988], [-74.01602010100001, 40.63331711399997], [-74.01591473499991, 40.633365548999905], [-74.01560204999993, 40.63351697799989], [-74.01514630699995, 40.63322193799993], [-74.01542409800001, 40.63251313899987], [-74.01574804399993, 40.63176426999991], [-74.01604820399999, 40.631032888999876], [-74.01634322299998, 40.63028559599991], [-74.01664336499988, 40.62957607899994], [-74.0169264479999, 40.62883563899991], [-74.01696955099997, 40.628728785999925], [-74.01722288099991, 40.62810068899994], [-74.01784193399993, 40.626590693999944], [-74.0187518069999, 40.62431751099996], [-74.0189099719999, 40.62408698799987], [-74.01907578299992, 40.62361467399988], [-74.01938702899992, 40.62289181899993], [-74.01970491599991, 40.6221849649999], [-74.02008667300001, 40.62242095199986], [-74.02062330999992, 40.62180625199994], [-74.02090368299993, 40.62152616599993], [-74.02117792099988, 40.621252195999865], [-74.02167353899998, 40.62073479999989], [-74.02172925499997, 40.6206794519999], [-74.02226919899991, 40.620109624999934], [-74.02287598699992, 40.61946614799993], [-74.02363350499998, 40.61853764799987], [-74.02387367099986, 40.618259319999865], [-74.02462461299996, 40.61738902399985], [-74.02525327199992, 40.616678457999946], [-74.02574989099996, 40.616058222999904], [-74.02607013199996, 40.615486666999885], [-74.02624732399988, 40.61510478099994], [-74.02651463099991, 40.61467032699992], [-74.02736880500001, 40.61323451599991], [-74.02754297299998, 40.61293718299988], [-74.02653228199998, 40.61242537099991], [-74.02637609099996, 40.61245060299993], [-74.02710660599995, 40.61024395599991], [-74.02497932499995, 40.609741974999906], [-74.02478376299999, 40.60969962899984], [-74.0245785549999, 40.610223301999916], [-74.02459593799989, 40.61010922499989], [-74.02459441799985, 40.60999204099988], [-74.02457307699996, 40.6098745279999], [-74.02453195999996, 40.60975959499989], [-74.02447207599994, 40.60965008299994], [-74.02439534399993, 40.60954853399993], [-74.02430437599992, 40.609456968999936], [-74.02150602899994, 40.60782209899992], [-74.02247769499994, 40.60667421599987], [-74.02078541, 40.605673685999875], [-74.02122508399991, 40.604738061999974], [-74.02139467299999, 40.60449399799991], [-74.02129949199998, 40.60442832299987], [-74.0205358359999, 40.60419641799992], [-74.01924239499986, 40.60377850099991], [-74.019189715, 40.60376183999993], [-74.01912316599994, 40.60373976999991], [-74.01909859999992, 40.60373226399985], [-74.01869135799996, 40.60360792399991], [-74.01871382299996, 40.60358207499993], [-74.01917685099995, 40.603154421999875], [-74.01918088999996, 40.60314959499995], [-74.01923150399992, 40.603102173999915], [-74.01939343599999, 40.60291176099992], [-74.01942760861903, 40.602871578425265], [-74.01974772844801, 40.60308480926381], [-74.02010437562546, 40.603259552473915], [-74.02024692223878, 40.60332431782445], [-74.0203938499666, 40.60338312118084], [-74.02054472997047, 40.603435790909074], [-74.02069912187268, 40.60348217327761], [-74.0208565750425, 40.60352213290627], [-74.0210166299108, 40.60355555316099], [-74.0211788193127, 40.60358233649454], [-74.02134266985102, 40.603602404731895], [-74.02150770327854, 40.603615699297556], [-74.02514668248197, 40.604083124229994], [-74.02930882862765, 40.604599064564454], [-74.03005146547684, 40.604759173811956], [-74.03088511216566, 40.60518456375306], [-74.03101612271274, 40.60525141411518], [-74.03143471659999, 40.60552946681069], [-74.03179633794443, 40.60578027459593], [-74.03186039997433, 40.60581118472868], [-74.0321315955131, 40.605901836264245], [-74.0327068147988, 40.606331066038074], [-74.03359224082001, 40.60708260743882], [-74.03378350679236, 40.607254350388594], [-74.03427280539496, 40.60771747923557], [-74.034355360413, 40.60782297472988], [-74.03443004631626, 40.6079318233239], [-74.03449662936796, 40.60804368442151], [-74.03453929685496, 40.60814055535553], [-74.03459014036846, 40.608235106410824], [-74.03464894466927, 40.60832693725557], [-74.0347154608099, 40.60841565907369], [-74.0347894071866, 40.6085008962114], [-74.03487047073257, 40.608582287767895], [-74.03495830824197, 40.608659489123674], [-74.03505254782415, 40.60873217339959], [-74.03515279047687, 40.608800032841515], [-74.03525861177654, 40.60886278012296], [-74.03530371251365, 40.608888235269525], [-74.03535170243764, 40.60891041067642], [-74.03540217219016, 40.60892911718412], [-74.03547715437021, 40.60894504883701], [-74.03554940984297, 40.608967117033416], [-74.03561807682696, 40.608995058569896], [-74.03568233633708, 40.60902854019212], [-74.03574142195207, 40.60906716256955], [-74.03579462895571, 40.609110465057874], [-74.03603977777905, 40.60929563900184], [-74.03608058166901, 40.6093468863874], [-74.03611335501427, 40.60939472941205], [-74.0363093104175, 40.60980339016717], [-74.03634220893493, 40.609963852315985], [-74.0363839712695, 40.61012311228578], [-74.03643452294632, 40.610280885828004], [-74.03649377380209, 40.61043689134577], [-74.03656161814445, 40.61059085039554], [-74.03663793494069, 40.61074248818415], [-74.03672258803354, 40.61089153406034], [-74.03681542638358, 40.61103772199684], [-74.03691628433882, 40.6111807910655], [-74.03702498192945, 40.61132048590398], [-74.0371413251896, 40.611456557170285], [-74.03726510650235, 40.61158876198925], [-74.03739610497087, 40.611716864385166], [-74.03753408681214, 40.6118406357037], [-74.03873050931418, 40.612943761342144], [-74.03892016103417, 40.613141671586604], [-74.03920557647402, 40.61343951273367], [-74.03944150515275, 40.613775944191865], [-74.03982365089743, 40.6143273886638], [-74.04023427278453, 40.615028256649374], [-74.04038132338673, 40.61534178232843], [-74.04047612021522, 40.615625263664015], [-74.04072760517815, 40.617050416395266], [-74.04086140769245, 40.617630765787595], [-74.04101750654688, 40.61830780552467], [-74.0411277728829, 40.618786056113024], [-74.04137522891591, 40.619993552965234], [-74.04143385995191, 40.62008328218532], [-74.04148540020998, 40.6201755043379], [-74.04152966802239, 40.62026989441518], [-74.04156650734973, 40.62036611976727], [-74.04159578832969, 40.6204638412752], [-74.04161740773601, 40.6205627145458], [-74.04162219761896, 40.62066875832983], [-74.0416233689152, 40.620774861150096], [-74.04161785575602, 40.6209422590333], [-74.04160333814035, 40.621109343824465], [-74.04157984042503, 40.62127583441747], [-74.0415996813113, 40.62146631518381], [-74.04167119741669, 40.62209180591905], [-74.0417493234626, 40.62245699566951], [-74.04169490179855, 40.62280245622834], [-74.04170832517198, 40.62324493419511], [-74.04171015812464, 40.6233053206118], [-74.0417579401569, 40.6234283209218], [-74.0417987682504, 40.62355276698131], [-74.04183256751773, 40.62367843064929], [-74.04185927595628, 40.623805081551446], [-74.04187884456147, 40.623932487501996], [-74.04189123741789, 40.62406041492981], [-74.04189643176426, 40.624188629306566], [-74.04189513118017, 40.62429902703854], [-74.0418884929145, 40.62440931329303], [-74.04187652595625, 40.62451933829385], [-74.0417566930148, 40.62505506019891], [-74.04168321534894, 40.6253835421745], [-74.04164207726816, 40.626009357924765], [-74.04156624733882, 40.62674359415526], [-74.04142918710238, 40.62807066515698], [-74.04141650353655, 40.628149960545464], [-74.04130293385225, 40.62886001369012], [-74.04127701609347, 40.62902206057], [-74.04109062117575, 40.62972570042867], [-74.04110307519313, 40.629818740500966], [-74.04110655512133, 40.62991222556074], [-74.04110104224472, 40.63000565384534], [-74.04108656611493, 40.63009852389527], [-74.04106320439342, 40.630190337245], [-74.04103108243446, 40.63028060109854], [-74.04099037261425, 40.63036883097465], [-74.04094129340537, 40.630454553307736], [-74.04088410820547, 40.630537307988796], [-74.04081912392392, 40.63061665083624], [-74.04074668933455, 40.630692155979894], [-74.04065885393268, 40.63088875293372], [-74.04028911535313, 40.63171630457623], [-74.04015481009853, 40.632016901563], [-74.03991790625045, 40.632534443707065], [-74.03929388690396, 40.63388635429643], [-74.03843230568432, 40.6356851891421], [-74.03816058598187, 40.63624398058439], [-74.03783376084706, 40.636916083833164], [-74.03745424937436, 40.637696515307255], [-74.03708957847103, 40.63844640994759], [-74.03680662048858, 40.63898422154557], [-74.03876297920752, 40.639588258980524], [-74.0386880469073, 40.63973825602953], [-74.03672484374877, 40.63914119020668], [-74.03660641448076, 40.63936301858892], [-74.03647949179155, 40.639582104484745], [-74.0363441848906, 40.63979825924039], [-74.03620061021064, 40.64001129672453], [-74.03608560952524, 40.64017159149988], [-74.03596592750286, 40.64032988534885], [-74.0358416240794, 40.64048609895574], [-74.03571276150724, 40.64064015404647], [-74.03597990789547, 40.640940050544415], [-74.03634712296504, 40.64114331106443], [-74.03673442685152, 40.64145842171883], [-74.03675181360583, 40.64147755284508], [-74.03676491282464, 40.64149857295399], [-74.03677338009166, 40.64152092937311], [-74.03677699277581, 40.64154403429451], [-74.03677565588535, 40.641567280229424], [-74.03676940456552, 40.641590055980984], [-74.03675840317513, 40.641611762713936], [-74.03674294096601, 40.64163182969993], [-74.03672342447773, 40.641649729323426], [-74.03670036684926, 40.64166499095433], [-74.03445193181358, 40.64382678668235], [-74.034538297394, 40.64387638151011], [-74.03407329297129, 40.64431393298185]]]}}, {\&quot;id\&quot;: \&quot;14\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 15, \&quot;Shape_Leng\&quot;: 0.14433622262, \&quot;Shape_Area\&quot;: 0.000925219395547, \&quot;zone\&quot;: \&quot;Bay Terrace/Fort Totten\&quot;, \&quot;LocationID\&quot;: 15, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7774039129087, 40.79659824126783], [-73.77738937457792, 40.79659450183191], [-73.77737533353579, 40.79659063854807], [-73.77736151739849, 40.79658715463961], [-73.77734722706326, 40.79658341668249], [-73.77732802081982, 40.796579507397446], [-73.77730831725226, 40.79657527248403], [-73.77729522076002, 40.796572608989926], [-73.77727883366029, 40.79656898558112], [-73.77726240942357, 40.79656565694303], [-73.77724580769197, 40.79656247270167], [-73.77722588125384, 40.79655751782156], [-73.77720481055027, 40.796551497944655], [-73.77718793343199, 40.79654536873484], [-73.77717293031019, 40.796538703545885], [-73.77716048389526, 40.79653321245801], [-73.77714079232376, 40.79652546721037], [-73.77712309051303, 40.79651796670836], [-73.77710551097655, 40.7965129900437], [-73.77709075818875, 40.79650944934304], [-73.77707133827573, 40.79650570143153], [-73.77705491487234, 40.79650213169628], [-73.77703946639896, 40.79649759822766], [-73.77702305739517, 40.79649361355523], [-73.7770085428856, 40.79648968581853], [-73.77699143346936, 40.79648579025017], [-73.77697245275725, 40.796481691870845], [-73.77695981862223, 40.796478812287695], [-73.77694225105256, 40.79647388939687], [-73.77692817826858, 40.79646925152675], [-73.77691718770845, 40.79646388133537], [-73.77690167683939, 40.79645679128878], [-73.77688598311, 40.79645124949161], [-73.77687050489574, 40.7964452046955], [-73.77685666384485, 40.79643845058072], [-73.77684188553589, 40.796428327890354], [-73.7768261853407, 40.79641761673879], [-73.77681399145276, 40.79641092058888], [-73.77679777685923, 40.796401560368025], [-73.77678418987156, 40.79639332999943], [-73.77676727795311, 40.796383797212805], [-73.7767499357965, 40.79637483937548], [-73.77673442631956, 40.79636754291753], [-73.77672082896045, 40.796362212052244], [-73.7767037306246, 40.79635529078489], [-73.77668638249598, 40.79634851226521], [-73.77667185244594, 40.79634213556841], [-73.77665423802641, 40.79632997125392], [-73.77663779999116, 40.79632000731809], [-73.77661855053992, 40.796307921749644], [-73.7766030466047, 40.79629858867732], [-73.7765878071623, 40.79628834762485], [-73.77657209394047, 40.79627832142478], [-73.77655799331602, 40.796270964516765], [-73.77654790396049, 40.796265729889726], [-73.77653362678076, 40.796258435290916], [-73.77651555681871, 40.79625117840095], [-73.77650408698263, 40.79624748249545], [-73.7764911641103, 40.79624283809], [-73.77647569741559, 40.79623680147143], [-73.77645834823085, 40.79622995975812], [-73.77644100212493, 40.79622259603883], [-73.77642436508934, 40.796215783175704], [-73.77640490129258, 40.796207154378905], [-73.7763880218685, 40.79619867499949], [-73.7763743933529, 40.796192138016664], [-73.77635820000582, 40.79618370553079], [-73.77634039397623, 40.79617552187176], [-73.77632679821677, 40.79616986713598], [-73.77631272968648, 40.796163995205845], [-73.77629750991538, 40.79615841856499], [-73.77628271935279, 40.79615224820701], [-73.77626443652422, 40.79614465698604], [-73.77624895989177, 40.7961381795581], [-73.77623536554736, 40.796132174015895], [-73.77621823846742, 40.79612308148995], [-73.77620134180472, 40.796112071409446], [-73.77618988034116, 40.79610268464799], [-73.77617885953198, 40.79609605336272], [-73.77616429083893, 40.79608723584757], [-73.77615232522406, 40.796079558706055], [-73.77613963747997, 40.796071546282526], [-73.77612628144364, 40.79606147953481], [-73.77611429231715, 40.79605030876701], [-73.77610276926637, 40.79603774241092], [-73.7760912856223, 40.79602781432162], [-73.77607828619544, 40.79601744252682], [-73.77606737098047, 40.79600734432826], [-73.77605582008007, 40.79599598443177], [-73.77604725794872, 40.7959842790402], [-73.77603866568093, 40.795973997053494], [-73.7760293623414, 40.79596769409022], [-73.77601318102688, 40.795958990355096], [-73.77599720655718, 40.7959491523693], [-73.77598539923815, 40.795940106332054], [-73.77597432156729, 40.79592555967183], [-73.77596822218737, 40.79591418406017], [-73.775953774968, 40.79590446596955], [-73.77594061502012, 40.79589582304519], [-73.77593061168318, 40.79588608661824], [-73.7759196649338, 40.79587508806209], [-73.77590880304822, 40.79586356816308], [-73.77589905470377, 40.79585168974544], [-73.77588612311689, 40.79583893065471], [-73.77587233417897, 40.79582704437839], [-73.77586326528844, 40.79581803112735], [-73.77585239587621, 40.795804889561275], [-73.77584465498843, 40.7957953289049], [-73.77584290844239, 40.79579317364331], [-73.77583110101452, 40.79578096671862], [-73.77582084085186, 40.79577013198782], [-73.77581022054922, 40.79576039451781], [-73.77579847271905, 40.79575117837077], [-73.77578634075365, 40.79574036629749], [-73.77577227211225, 40.795727434775905], [-73.77576359025652, 40.79571929625015], [-73.775752639847, 40.79570900797877], [-73.77574126696302, 40.7956980353803], [-73.77573108370488, 40.79568898376489], [-73.7757177588325, 40.795676774545896], [-73.7757093058664, 40.79566737432418], [-73.77569673601043, 40.79565601257565], [-73.77568453628999, 40.795644318672885], [-73.77567574597047, 40.79563664699041], [-73.77566926949147, 40.79562815206704], [-73.7756646012886, 40.79562095731017], [-73.77564699764488, 40.795612574581384], [-73.77563103732929, 40.7956017825139], [-73.77562134647184, 40.79559432601978], [-73.77561001797245, 40.79558066152715], [-73.77560040629238, 40.79557070955792], [-73.77558981591773, 40.795562837354396], [-73.77557656568186, 40.7955529590464], [-73.77556708750666, 40.79554558354153], [-73.77555882387453, 40.79553299717454], [-73.7755552874506, 40.795520364561085], [-73.77554058341056, 40.795513177563215], [-73.77553146710926, 40.79550733327298], [-73.77553345786804, 40.795504131884314], [-73.77553195267372, 40.79550061678085], [-73.77552296493784, 40.795488351655145], [-73.77551457646572, 40.795481086489495], [-73.77550330387254, 40.79547170823503], [-73.77548828146153, 40.795460622124196], [-73.77547684312017, 40.79545790670384], [-73.77546627197862, 40.7954446031817], [-73.77546441562504, 40.79543645045462], [-73.77545298499133, 40.795421191071874], [-73.77543937631013, 40.79540878308427], [-73.77542669336691, 40.795399672125725], [-73.77541469117227, 40.79539218363637], [-73.77540246897253, 40.79538332670378], [-73.7753918834261, 40.795374300575375], [-73.77538072181515, 40.795363661057834], [-73.77536976075994, 40.79534963774722], [-73.77535993733348, 40.79533935213663], [-73.77534953272698, 40.79532890406519], [-73.77533948316074, 40.79531880798594], [-73.7753293011994, 40.79530940553838], [-73.77532069352814, 40.79530054575829], [-73.77531105858056, 40.795290458693394], [-73.77530079651218, 40.79527997470998], [-73.77528735896209, 40.795269521222934], [-73.77527655563807, 40.79526187255653], [-73.77526177777118, 40.79525176725157], [-73.77524930736936, 40.79524285604281], [-73.77524109301233, 40.79523666218698], [-73.77522841161719, 40.79522711044956], [-73.77521822784352, 40.79521805761426], [-73.77520778681627, 40.7952081584399], [-73.77519630388718, 40.79519770875406], [-73.77518559691597, 40.795189537754766], [-73.77517458092494, 40.79518135827802], [-73.77515952443582, 40.79516969392657], [-73.7751495765414, 40.79516116472738], [-73.77513845803097, 40.79515194873436], [-73.77512785665888, 40.79514377894077], [-73.77511846078075, 40.79513667428005], [-73.77510333604457, 40.795124272005545], [-73.77509364674852, 40.79511613028997], [-73.77507955910173, 40.79510531432475], [-73.77506900584751, 40.79509699970999], [-73.77505736680486, 40.79508742368608], [-73.77504829571028, 40.79507873368923], [-73.77491790665806, 40.79499012265496], [-73.77479353901879, 40.79489664607736], [-73.77467550675657, 40.79479853995565], [-73.77456410783664, 40.79469605197661], [-73.77445962347299, 40.79458944088831], [-73.77443578887555, 40.79456347302087], [-73.77437784429105, 40.7944951882745], [-73.77432664447697, 40.79442385815788], [-73.77428246509835, 40.794349866750565], [-73.7742455440165, 40.79427361246051], [-73.77421608000793, 40.7941955058792], [-73.7742044616393, 40.7941654454196], [-73.77418705214467, 40.79413704580953], [-73.7741642440045, 40.79411094727948], [-73.77413655140263, 40.794087738184714], [-73.774117023877, 40.79408403853672], [-73.77409859116338, 40.7940778992209], [-73.77408177679733, 40.79406949460936], [-73.77406705834852, 40.794059063414146], [-73.77405485385675, 40.794046901907656], [-73.77404550995897, 40.79403335550693], [-73.7740392920429, 40.79401880896351], [-73.77403637671088, 40.79400367543496], [-73.77403684676305, 40.79398838475068], [-73.77404068884668, 40.793973371203144], [-73.7740477938349, 40.79395906121335], [-73.77405795992715, 40.79394586121933], [-73.77403999017578, 40.79385679444769], [-73.7740182219482, 40.79376821845375], [-73.77398067975606, 40.793643014950185], [-73.77393555059898, 40.7935192666697], [-73.77388293130392, 40.79339723900761], [-73.77382293476086, 40.79327719366772], [-73.77375568967857, 40.79315938810081], [-73.77374905422273, 40.7931207896111], [-73.77374710611448, 40.79308189124953], [-73.77374986177655, 40.793043021100154], [-73.77368083470303, 40.79286575659477], [-73.77363248188914, 40.79274975621505], [-73.77356729524408, 40.79266382842165], [-73.77349649263613, 40.792580507019025], [-73.77342025408298, 40.792500003830064], [-73.77337545326392, 40.79245990149119], [-73.77333601221568, 40.79241666960013], [-73.77330230698017, 40.792370720353105], [-73.77327465890835, 40.792322491854684], [-73.77320467172578, 40.79224253223184], [-73.77307986542115, 40.7921446089333], [-73.77287743738252, 40.791997693320845], [-73.77286059684761, 40.79197709653282], [-73.77277910650301, 40.79189753714522], [-73.77272012268155, 40.79184435699735], [-73.77266865746701, 40.79178684357741], [-73.77260041750584, 40.79172620880269], [-73.77252757063758, 40.79166875332356], [-73.77246875261999, 40.79162818020105], [-73.77241379404522, 40.791584593294274], [-73.77236296162013, 40.79153820413016], [-73.7723264817354, 40.79148082462651], [-73.77229688964472, 40.79142119847368], [-73.7722744217891, 40.791359802123246], [-73.77225925768093, 40.79129712617071], [-73.77225151846997, 40.79123367143485], [-73.77225126597583, 40.791169944956124], [-73.77225850219455, 40.791106455944906], [-73.77227316928341, 40.79104371171239], [-73.77227075371162, 40.790944463780626], [-73.77226051428751, 40.790845504394674], [-73.77224248787607, 40.79074718949841], [-73.77223841615907, 40.79065920649175], [-73.77224206821533, 40.79057121284437], [-73.77225342777682, 40.790483599787535], [-73.77223303752142, 40.79040534229604], [-73.77220607891066, 40.790328241164374], [-73.7721726631949, 40.7902526145021], [-73.77213292826468, 40.79017877433443], [-73.77210255348926, 40.79013000015939], [-73.77202595346799, 40.790063692567394], [-73.77194403848256, 40.790001162427444], [-73.77189574144926, 40.78998417732687], [-73.77185143898816, 40.789961768318506], [-73.77181217739995, 40.78993446464287], [-73.7717788839305, 40.78990291113913], [-73.77175234487125, 40.789867853014314], [-73.77173680635669, 40.789825494472346], [-73.77173042355776, 40.78978178881643], [-73.771733362281, 40.789737871514184], [-73.77174554616062, 40.78969488352967], [-73.77171860487624, 40.78966141348849], [-73.77166811281884, 40.78959191109706], [-73.77144337542126, 40.78934263237258], [-73.7711276990068, 40.78901277421275], [-73.77087816042668, 40.78877673022536], [-73.77063124537418, 40.78846290603716], [-73.77064195008725, 40.78837887603174], [-73.77066138329643, 40.78829575516882], [-73.77068942271313, 40.78821406636863], [-73.77072589190864, 40.78813432354018], [-73.77077056142382, 40.788057028348895], [-73.77082315021427, 40.78798266705989], [-73.7711714496876, 40.787763720001394], [-73.77124371742936, 40.78773161177086], [-73.77131348065242, 40.7876964488439], [-73.77138051609693, 40.787658343752696], [-73.77149672842718, 40.787590496346304], [-73.77161578634065, 40.78752556176706], [-73.77173756350668, 40.787463608911835], [-73.77190205680833, 40.7873865959972], [-73.77199320470947, 40.78735611430665], [-73.77208769981934, 40.78733223636572], [-73.77218471602598, 40.7873151709236], [-73.77228340517985, 40.787305067172205], [-73.77379096552599, 40.786828957833734], [-73.77396728847471, 40.786781774218426], [-73.77412967826919, 40.78676409915586], [-73.77426836058959, 40.78675665865473], [-73.7743460921796, 40.78677223413504], [-73.77439231197853, 40.78681496092917], [-73.77438976901033, 40.78685714529808], [-73.77426439520684, 40.78692887354648], [-73.77420002662137, 40.78696216313965], [-73.77419980868142, 40.78702642524989], [-73.7742301148687, 40.787065041675966], [-73.7743241010546, 40.787082253572294], [-73.77444617141909, 40.78717856502961], [-73.77501922678299, 40.78739447438411], [-73.77628944855437, 40.7885136481994], [-73.77633728818715, 40.78848722575376], [-73.77587233688504, 40.78802031762283], [-73.7750481043881, 40.78719259407269], [-73.77486248240422, 40.78707913013461], [-73.774806953694, 40.78697068727885], [-73.77474124745507, 40.786927235879425], [-73.7746308254633, 40.78691941868919], [-73.7745858466651, 40.78687809258887], [-73.77456236644174, 40.78682149734369], [-73.77451195192242, 40.78672886084857], [-73.77445462503042, 40.7866799092223], [-73.77435661274104, 40.78666172510186], [-73.77426466694423, 40.78665122914519], [-73.7740960989511, 40.78629656530393], [-73.77407638297778, 40.78591728401922], [-73.7726172080581, 40.7841910491489], [-73.7720920025976, 40.78356969320761], [-73.77160731979487, 40.7829962651855], [-73.77060974454855, 40.782079793940724], [-73.76981014523498, 40.78129770845182], [-73.76930405710117, 40.78078195798143], [-73.76908807714565, 40.780532832334075], [-73.76902445493923, 40.780450591996654], [-73.76858058549459, 40.779876824912144], [-73.76833795673872, 40.779634872200724], [-73.76827333570864, 40.77962028411314], [-73.76815915444048, 40.77963595970004], [-73.76813458838144, 40.77958964044201], [-73.76823190254096, 40.77950163764268], [-73.76820055460033, 40.77944417919097], [-73.76716193687588, 40.779782875660686], [-73.76720729367467, 40.779866828611894], [-73.76699783535086, 40.77993147052596], [-73.7670734335662, 40.78007042899436], [-73.76702392346498, 40.78008623415827], [-73.7669275026482, 40.779918316052], [-73.7669580014477, 40.77989958115397], [-73.76688994703834, 40.779779433943396], [-73.76677570373936, 40.77981245869834], [-73.76675868631202, 40.77978350558992], [-73.76686912971435, 40.77974902775042], [-73.76686345436596, 40.779740341271875], [-73.76708815912728, 40.77966705475085], [-73.767135449099, 40.77974233714537], [-73.76816173051576, 40.77939682124199], [-73.76807788861774, 40.77925206154374], [-73.76782207615058, 40.77881037615661], [-73.76796073100003, 40.77877600899994], [-73.76807192199989, 40.77874844899989], [-73.76825889099999, 40.778702104999915], [-73.76833788999983, 40.7786825249999], [-73.7685730499999, 40.77910542899991], [-73.76864150099995, 40.77908686699987], [-73.76877614499993, 40.77904284199991], [-73.76934982499989, 40.77887476899986], [-73.77113180399985, 40.77834080999992], [-73.7720360819999, 40.778069802999866], [-73.772903019, 40.77780428099986], [-73.7737825709999, 40.77754746799989], [-73.77465548700002, 40.777285608999925], [-73.77553732199992, 40.777025597999916], [-73.77572440800002, 40.777900433999896], [-73.77583958299994, 40.778612371999884], [-73.77678363299988, 40.778409583999874], [-73.77769354899995, 40.77816041699992], [-73.77858771199995, 40.77791239199995], [-73.77947656099995, 40.777664169999895], [-73.78036180399994, 40.77738704699991], [-73.78279772899998, 40.77666603599993], [-73.78407645399997, 40.77628882299991], [-73.78440918799984, 40.77619021899989], [-73.78448330699995, 40.77616825899986], [-73.78459339299995, 40.77614122499991], [-73.78491489199986, 40.776040509999895], [-73.78569433800004, 40.775812774999885], [-73.78626498299998, 40.77564607999991], [-73.78655073399982, 40.77555774699991], [-73.78740991599994, 40.77531789199992], [-73.78826972999987, 40.77507535699988], [-73.78893975799984, 40.77490059199992], [-73.78913873699987, 40.774848689999935], [-73.7898420409999, 40.7746873259999], [-73.79034971799999, 40.774573093999926], [-73.79163526099994, 40.774238655999895], [-73.7922679529999, 40.77399004199987], [-73.79271259399978, 40.773787526999875], [-73.7936523029999, 40.77336043899989], [-73.79499129399991, 40.77314334799993], [-73.79557358499984, 40.77304924499992], [-73.79565702099983, 40.773036085999905], [-73.79571707399992, 40.77306964299988], [-73.79652490499979, 40.7735032779999], [-73.79672685099997, 40.77360922899989], [-73.79724339799986, 40.77389389699988], [-73.79730005599994, 40.773932285999884], [-73.79741514499983, 40.774010264999916], [-73.79741522800005, 40.774010318999885], [-73.79741530999986, 40.77401038199986], [-73.79757522899995, 40.77413684199995], [-73.79772190099987, 40.774272372999846], [-73.79785400499989, 40.77441566899992], [-73.79823295499997, 40.77484830499985], [-73.79853009399987, 40.775190728999924], [-73.7986519199999, 40.77520055899988], [-73.800989741, 40.77538911599989], [-73.8037902289999, 40.77561011199992], [-73.80369287499998, 40.77631968799989], [-73.8035964729998, 40.77703047199987], [-73.80346278599977, 40.778008173999865], [-73.80342253099997, 40.77833770799985], [-73.80332690999992, 40.778995479999935], [-73.8032260339999, 40.779702924999846], [-73.80320064599984, 40.77988363099988], [-73.80313481699993, 40.780415805999894], [-73.803066233, 40.78077013599987], [-73.8030331849998, 40.78094086999989], [-73.80324974699984, 40.781275478999916], [-73.80314563299987, 40.78132556799988], [-73.80299781999996, 40.78141047599991], [-73.80293830099997, 40.78183503399991], [-73.8028401069999, 40.78255003699992], [-73.80274225299986, 40.783253667999894], [-73.80254724699995, 40.78467334699992], [-73.80241070199989, 40.78581721099992], [-73.80242243499985, 40.78601897999991], [-73.80242791699989, 40.78606827399991], [-73.80215169199994, 40.78605649899994], [-73.80157320499991, 40.78603473299989], [-73.80067959399986, 40.786001101999894], [-73.79973844499978, 40.78595286999994], [-73.7992594699999, 40.785934836999935], [-73.79880021900001, 40.7859175479999], [-73.7978420549998, 40.78589425899987], [-73.79685935799988, 40.78599452199992], [-73.79582463099997, 40.7861305879999], [-73.79491977600001, 40.78633880799987], [-73.79454742299993, 40.78646433199993], [-73.79392031799995, 40.78667573999992], [-73.7933258969999, 40.78693204899985], [-73.79153624300002, 40.78775191299995], [-73.7906355999999, 40.78816951899994], [-73.79058298999988, 40.78819290999989], [-73.790653771, 40.788249452999864], [-73.79084786600005, 40.78840689799993], [-73.79133754899989, 40.78885774099988], [-73.79156371699993, 40.789103095999884], [-73.79179280401884, 40.789351616549254], [-73.79175254252796, 40.78938643776097], [-73.79162795617712, 40.7894861231687], [-73.79028202353197, 40.79031696339975], [-73.78988738668919, 40.79037193097968], [-73.78930907131766, 40.79038006955028], [-73.78883143352806, 40.790357187582224], [-73.78835429027176, 40.79032784777117], [-73.7879935835311, 40.79034968837414], [-73.78750199944683, 40.79030881800571], [-73.78568101301407, 40.79034067165998], [-73.7838384251435, 40.79064095467152], [-73.78317940975151, 40.79086646470491], [-73.78253080663518, 40.79127678943192], [-73.78252265694827, 40.79135222690715], [-73.78440669003494, 40.79167583933253], [-73.78439845368956, 40.79171891686168], [-73.78434153059591, 40.79174935379487], [-73.78227330183385, 40.791373715717924], [-73.78174708763098, 40.79113340664446], [-73.7817021394188, 40.79117525786651], [-73.78160545881975, 40.791217921223286], [-73.78143260460877, 40.79136512329363], [-73.78123362112055, 40.79148460246174], [-73.78107845970229, 40.79167732177907], [-73.78089784791108, 40.79219370535159], [-73.78077503139014, 40.79299070534052], [-73.78077892481954, 40.793189785863845], [-73.78085015490862, 40.793252479377415], [-73.78083949014304, 40.79327744017283], [-73.78158881545012, 40.793463541012535], [-73.78158781636597, 40.79344838542981], [-73.78158153246125, 40.793444386581825], [-73.78163864257793, 40.793309707768074], [-73.78168372830307, 40.7933217570108], [-73.78162662328144, 40.793454840007925], [-73.78160879379377, 40.793451615702814], [-73.78161607678727, 40.79347077130438], [-73.78166011555379, 40.79348202031304], [-73.7816421343347, 40.79352505337762], [-73.78082154869789, 40.79331942900066], [-73.78080808737927, 40.7933509327133], [-73.7807243506983, 40.793333618824185], [-73.78070025516259, 40.79364850590945], [-73.78079182072646, 40.79403591986439], [-73.78100539667301, 40.79438481862711], [-73.7813176840371, 40.79460466456844], [-73.78152857545292, 40.79472485577791], [-73.78181003762921, 40.79480185241986], [-73.78190385421033, 40.794901203894135], [-73.78258165591822, 40.79488335802936], [-73.78265517138459, 40.79490070120977], [-73.78284362044448, 40.79490185399306], [-73.78307475337424, 40.79491681769891], [-73.78310976963976, 40.79491446050581], [-73.78314000854334, 40.79489731287008], [-73.78317026275754, 40.79487586588125], [-73.78321522572556, 40.794825295774366], [-73.78324789295391, 40.79478855571322], [-73.78328948833689, 40.79475996026348], [-73.78331796684243, 40.794758356474155], [-73.78332856842805, 40.79476160260946], [-73.78332528563587, 40.79479224087093], [-73.7832965245875, 40.79482605743941], [-73.78328163720504, 40.79483570739623], [-73.78327094437915, 40.79486068745444], [-73.78327193181352, 40.794883269736395], [-73.78325271025878, 40.79492032976596], [-73.78318780792462, 40.794973434233306], [-73.78311558348871, 40.794993458539004], [-73.78305415481076, 40.79499109708873], [-73.78286814787282, 40.79498657863788], [-73.78236678802342, 40.794959614703636], [-73.78200326103361, 40.794975462503565], [-73.78182459908278, 40.79507728971345], [-73.78172625575411, 40.79542750602256], [-73.78165761051014, 40.79555862334205], [-73.78154150032744, 40.79565973731996], [-73.77989837558063, 40.79623809836545], [-73.7798030505206, 40.79620552893678], [-73.77944961456502, 40.79657623806387], [-73.77946869192893, 40.796608441296094], [-73.77943301516063, 40.79666153857653], [-73.7793624680482, 40.796685392534904], [-73.77928446350832, 40.79667469847259], [-73.7792728777499, 40.796637683818055], [-73.77871478762599, 40.796597360195996], [-73.77868968820113, 40.79660527281772], [-73.77868530361944, 40.79660919102858], [-73.77867108995639, 40.79661810557603], [-73.778653137277, 40.79662911153307], [-73.7786374737861, 40.79663550136388], [-73.77862394962096, 40.79664044721123], [-73.77860456300029, 40.79664792835134], [-73.77858658990885, 40.79665439498891], [-73.7785723534402, 40.796659555234854], [-73.77855506807938, 40.79666583438733], [-73.77853520981658, 40.79667268437904], [-73.77851818617542, 40.79667861323066], [-73.7784973595596, 40.7966842553393], [-73.77848101850053, 40.79668803312994], [-73.77846700036604, 40.796691437110304], [-73.77844831121799, 40.79669579605253], [-73.77843218488232, 40.79669950171049], [-73.77841209444438, 40.79670470445934], [-73.77839550549669, 40.7967080497132], [-73.77837960824762, 40.79671021607783], [-73.77836745440197, 40.7967125514675], [-73.77834924005742, 40.79671684831703], [-73.77833287754164, 40.796720113752656], [-73.77831089780186, 40.79672303249394], [-73.77829124888358, 40.79672406736736], [-73.77827066301263, 40.796725125731335], [-73.77825056887954, 40.79672772576945], [-73.77823373526176, 40.796730134564555], [-73.77822228238244, 40.79673194877572], [-73.7782013295322, 40.79673279115116], [-73.77818474615981, 40.796734920988136], [-73.77816768905346, 40.79673658938364], [-73.77815154791757, 40.79673738606178], [-73.77813539455161, 40.79673814820391], [-73.77811877759432, 40.79673924215685], [-73.7781028854632, 40.79673986809647], [-73.77808486122399, 40.79674003208208], [-73.77806662937581, 40.79673872730426], [-73.77805024184082, 40.7967354080633], [-73.77803334795568, 40.79673056788638], [-73.77801974867874, 40.79672615554589], [-73.77800593512394, 40.79672148212149], [-73.77799095770179, 40.796717914802265], [-73.77797479179517, 40.7967154979345], [-73.77795864859094, 40.79671321445842], [-73.77794084652679, 40.796711010206906], [-73.7779218631978, 40.79670765964538], [-73.7779050120194, 40.79670449378134], [-73.77788558987741, 40.79670125109234], [-73.77787108189364, 40.796698972430256], [-73.77785421688698, 40.79669651684017], [-73.77783898494677, 40.796694379510484], [-73.77782400143708, 40.796692838880894], [-73.77780760959772, 40.79669041987882], [-73.77778725197105, 40.79668689593743], [-73.77777223683373, 40.79668406680164], [-73.77775422709308, 40.79668002419901], [-73.77773780843233, 40.79667527435354], [-73.77772279891418, 40.79667030156635], [-73.77770874128566, 40.796664727353715], [-73.77769491559815, 40.79666019877806], [-73.77767875245776, 40.79665676298415], [-73.77766142646871, 40.79665392887425], [-73.77764012114096, 40.79665068251131], [-73.77762351135634, 40.79664963325345], [-73.77760947214593, 40.79664897543398], [-73.77759425962752, 40.79664828837734], [-73.77757812464012, 40.79664705122794], [-73.77756101083169, 40.79664471204753], [-73.77754158666977, 40.79664182009476], [-73.777521697539, 40.79664013375986], [-73.77750623891349, 40.79663881665584], [-73.77748973756474, 40.79663737943148], [-73.77747147920505, 40.796633202451844], [-73.77745764333974, 40.79662499915687], [-73.77744564507037, 40.79661646620007], [-73.77743367405546, 40.79661026575175], [-73.77742032900714, 40.79660400837061], [-73.7774039129087, 40.79659824126783]]]}}, {\&quot;id\&quot;: \&quot;15\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 16, \&quot;Shape_Leng\&quot;: 0.141291873771, \&quot;Shape_Area\&quot;: 0.000871889446182, \&quot;zone\&quot;: \&quot;Bayside\&quot;, \&quot;LocationID\&quot;: 16, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.7685730499999, 40.77910542899991], [-73.76833788999983, 40.7786825249999], [-73.76825889099999, 40.778702104999915], [-73.76807192199989, 40.77874844899989], [-73.76796073100003, 40.77877600899994], [-73.76782207615058, 40.77881037615661], [-73.76760454633784, 40.77829903466069], [-73.7676189407549, 40.77799469391587], [-73.76747817366723, 40.77765554086643], [-73.76713717312357, 40.776937753291556], [-73.76709113484746, 40.776844841109174], [-73.76700068069776, 40.77669521396545], [-73.76658827278406, 40.776172594165985], [-73.76632823258105, 40.775843054330814], [-73.76627787969173, 40.77574118632524], [-73.76614233293911, 40.77546695978642], [-73.76600398326563, 40.77506700693253], [-73.76572796903913, 40.7746033280921], [-73.76510436820205, 40.77379903872306], [-73.76469385424426, 40.773340474854514], [-73.76436067006205, 40.77302852084781], [-73.76417633114528, 40.77282999044271], [-73.76358456590272, 40.77235821590673], [-73.76223863110448, 40.77122066177051], [-73.7612630125983, 40.770395965074215], [-73.76085900055723, 40.77002264272332], [-73.76060524066253, 40.76976593345716], [-73.76052349507854, 40.76961682085475], [-73.76044056848673, 40.76948518693146], [-73.76001142296055, 40.76909583162673], [-73.75960078092824, 40.76872325671303], [-73.75937389428368, 40.76863638878568], [-73.75907352924408, 40.76845378633801], [-73.75893512093685, 40.768334328515934], [-73.75880776561003, 40.76818265272536], [-73.75883847871388, 40.768038287739046], [-73.75882204462802, 40.76794933440106], [-73.7588273600204, 40.767767523872216], [-73.75879456995813, 40.76765389115854], [-73.75873403546348, 40.76754922615335], [-73.75864264358073, 40.767357170035446], [-73.75842156550789, 40.767199067448146], [-73.75802387192715, 40.76707532904307], [-73.75787030567056, 40.76694642845211], [-73.75760683799241, 40.7669699190069], [-73.75752194375056, 40.76710675613373], [-73.7573902080387, 40.76716667235849], [-73.75734523174002, 40.76706980756656], [-73.7571843001946, 40.76695200038971], [-73.75703114820047, 40.766823254341304], [-73.75692940163003, 40.76679768260604], [-73.75665982851439, 40.76665032915951], [-73.75641084289745, 40.76651422276766], [-73.75640921140914, 40.766510148930536], [-73.75640836159586, 40.76650604089554], [-73.75640830611397, 40.766501872052565], [-73.75640903262868, 40.766497641202925], [-73.7564131832044, 40.766486492556076], [-73.75642003660344, 40.76647464752031], [-73.75644838018687, 40.76643884892769], [-73.75646019017901, 40.7664253664105], [-73.75649903977315, 40.76638619525873], [-73.75650884816422, 40.76637283532363], [-73.75651240090923, 40.76636639373759], [-73.75651468312392, 40.76636104961193], [-73.75651512522731, 40.766359997643185], [-73.7565155091402, 40.76635871017682], [-73.75651572652936, 40.76635746826089], [-73.75651577784062, 40.76635627055586], [-73.75651563993463, 40.76635511801813], [-73.75651534873262, 40.76635400904841], [-73.75651487825853, 40.766352937058144], [-73.75651424303084, 40.76635190861166], [-73.75651342915802, 40.76635092652746], [-73.75651244924389, 40.7663499786028], [-73.75651129245526, 40.76634907486635], [-73.75650846744547, 40.766347393967386], [-73.75650494248836, 40.76634587358723], [-73.75650071937817, 40.76634450501809], [-73.75649107536171, 40.766342377656294], [-73.75647876240242, 40.76634072126506], [-73.7564737783002, 40.76634035992999], [-73.75643582839564, 40.76633764971248], [-73.75640357156823, 40.76633574525942], [-73.75638758604588, 40.76633479308035], [-73.75634312226629, 40.76633520297428], [-73.75631567038226, 40.76633788196008], [-73.75628664411393, 40.76634340455195], [-73.75625559323588, 40.76635184870079], [-73.75622064503258, 40.76636370615331], [-73.75620578099215, 40.76637041143858], [-73.75619103618445, 40.76637963606818], [-73.75617702002063, 40.76639061121284], [-73.75616353456147, 40.76640233347391], [-73.75614489705069, 40.76641051622121], [-73.75602210333291, 40.76646442121023], [-73.75588294950307, 40.76641229346199], [-73.75547310439798, 40.76636558041649], [-73.7549367434127, 40.7660932521388], [-73.75425553419626, 40.765532892788315], [-73.75425235038242, 40.76552911246537], [-73.75410065488441, 40.765349353964524], [-73.75401961912938, 40.76530745082464], [-73.75397498244763, 40.76530695093847], [-73.75388234874703, 40.76534929289707], [-73.75385085906869, 40.76534212937308], [-73.75382270603563, 40.76533572114292], [-73.75377036482266, 40.76530463124142], [-73.75405049899983, 40.7651753319999], [-73.75435817399999, 40.76505094399988], [-73.75467572399998, 40.76493975999991], [-73.75500165499989, 40.76484240599992], [-73.75533439, 40.764759409999954], [-73.75567226899989, 40.76469114899985], [-73.75601361099996, 40.76463784199992], [-73.75635669699987, 40.764599557999915], [-73.7583941619999, 40.7644052469999], [-73.75850831399994, 40.76439435899995], [-73.75856122399995, 40.76438654599987], [-73.75862488399996, 40.764383148999855], [-73.75921689799992, 40.76432485599988], [-73.759097561, 40.76405669599989], [-73.7588643139999, 40.76327454099993], [-73.75859320499987, 40.764088229999906], [-73.75851382899985, 40.76410483099993], [-73.75844672099987, 40.76411514599987], [-73.75843838499995, 40.763928487999856], [-73.75844568799998, 40.76368152999987], [-73.75836296599996, 40.76349738299991], [-73.75823811499988, 40.763238765999944], [-73.75809857499982, 40.76298453899995], [-73.75794474699994, 40.7627354049999], [-73.75788761399987, 40.76265702199986], [-73.75784858699993, 40.76256679999993], [-73.75783301499989, 40.76246859299991], [-73.75784418199986, 40.76236794099986], [-73.75788220699995, 40.76227115299988], [-73.75794391899996, 40.76218407699988], [-73.75802364199994, 40.76211096099997], [-73.75811452099987, 40.76205389699988], [-73.75848075099995, 40.7619947369999], [-73.75800131799996, 40.76037986699988], [-73.76031788499999, 40.75990455099988], [-73.76125540599999, 40.75971470799989], [-73.76239510499991, 40.75949699799992], [-73.76199745999992, 40.75810219099993], [-73.76176692899985, 40.757278801999846], [-73.76185572299987, 40.756516974999926], [-73.76192713800003, 40.755772852999876], [-73.76189611099981, 40.755654002999904], [-73.76184343999986, 40.75553726899989], [-73.76176970599987, 40.755426020999884], [-73.76167669899993, 40.75532347699988], [-73.7615672369999, 40.75523235199987], [-73.76144497499985, 40.75515465699987], [-73.76128938199999, 40.7550522149999], [-73.76114556499998, 40.7549389489999], [-73.76101539999992, 40.754816091999864], [-73.76090047000001, 40.75468513599987], [-73.76080194199993, 40.754547729999956], [-73.76048623699985, 40.75383961699987], [-73.76018801899988, 40.75316049899985], [-73.76013367999985, 40.75302838899988], [-73.76013364499984, 40.75302828899988], [-73.76013358599997, 40.753028199999925], [-73.76005811999997, 40.75289976499995], [-73.76005800199988, 40.752899574999894], [-73.76005787299981, 40.752899403999926], [-73.75996192099983, 40.752777446999865], [-73.7599618029999, 40.75277730199993], [-73.75996168499987, 40.75277718499993], [-73.75984680199994, 40.75266435499989], [-73.7598466729999, 40.75266422799993], [-73.7598465069999, 40.75266410199989], [-73.75971521799991, 40.75256288999989], [-73.75971508799988, 40.7525627919999], [-73.75971494599995, 40.75256269999991], [-73.75957032200002, 40.75247497699995], [-73.75957016899991, 40.75247487799994], [-73.75957000299998, 40.752474795999895], [-73.75948272499986, 40.75243381299991], [-73.75910049199996, 40.752253820999954], [-73.75782746199997, 40.75075826999989], [-73.75737714099989, 40.750228101999895], [-73.75698991500002, 40.74957500999989], [-73.7568655229999, 40.749361488999966], [-73.75684127399991, 40.74932207699987], [-73.75714080500002, 40.74923725899987], [-73.75744314899997, 40.74915673299992], [-73.7577393699999, 40.7490634429999], [-73.75802805599993, 40.74895781599986], [-73.75805782299985, 40.74894194899988], [-73.75845857499999, 40.748763093999884], [-73.75885932599982, 40.748584227999885], [-73.75972553599988, 40.748188660999894], [-73.76073612099987, 40.74773738499994], [-73.76138355799993, 40.74752917099989], [-73.76145571899991, 40.747507951999864], [-73.76151846699999, 40.74749054799987], [-73.76240045799992, 40.74724325399988], [-73.76297777799992, 40.74708162199994], [-73.76414324400004, 40.74676404599995], [-73.76501623199981, 40.746522881999894], [-73.7658920239999, 40.74628062699993], [-73.76635520899988, 40.74615249699984], [-73.76681551899995, 40.7460300569999], [-73.76729011899992, 40.74590381399993], [-73.76772991399994, 40.74577622599993], [-73.76857701199982, 40.74552220399994], [-73.76937164099995, 40.745220308999876], [-73.770389824, 40.74473791399991], [-73.77137678500003, 40.74425103599991], [-73.77145218799996, 40.7442215229999], [-73.77153402299992, 40.744191625999854], [-73.77156671899986, 40.74417951599989], [-73.77162097999992, 40.744159731999915], [-73.7724146099999, 40.743884844999926], [-73.7728126769999, 40.74378924899988], [-73.77321534799998, 40.74370439599988], [-73.77362185199992, 40.74363046299994], [-73.77403143100003, 40.74356760099993], [-73.77444330499989, 40.74351589999993], [-73.77486382100001, 40.74345333599993], [-73.77551238399978, 40.74335684199993], [-73.77569182399996, 40.74333358899985], [-73.77573836999991, 40.74332564699993], [-73.77575892599995, 40.74336722699992], [-73.77585237799993, 40.74356469299995], [-73.77596627999999, 40.74381044799988], [-73.77616785699998, 40.744240022999904], [-73.77679196999986, 40.74554428899989], [-73.77753347599982, 40.74714834199988], [-73.77831180799991, 40.748745013999944], [-73.77906558899984, 40.75033257399991], [-73.77944066999987, 40.751122695999946], [-73.77980639299984, 40.75189500499989], [-73.78009357400003, 40.75250750399991], [-73.78052037799992, 40.753330742999886], [-73.78113322699984, 40.7540893259999], [-73.78165171799995, 40.754707752999956], [-73.78212461999979, 40.75533931199993], [-73.78248130799982, 40.75599745499987], [-73.78264852999988, 40.756331903999865], [-73.78281576399985, 40.75666634299991], [-73.78303191299983, 40.75708319099989], [-73.78316157699985, 40.75732618499991], [-73.78338071499984, 40.75775389699993], [-73.78346111099987, 40.757864063999904], [-73.78382076099993, 40.75853003399991], [-73.78407792999997, 40.75903964399989], [-73.78425940899996, 40.759382645999914], [-73.78428991899993, 40.7594402989999], [-73.78430628699978, 40.759483644999904], [-73.78447529299982, 40.75987586199995], [-73.78467742500004, 40.76025720799989], [-73.78486059299999, 40.760644362999905], [-73.78502434699996, 40.761036515999855], [-73.78516838299994, 40.76143281799993], [-73.785251708, 40.761756958999904], [-73.78527359199997, 40.761842105999925], [-73.78530175299996, 40.76197850399993], [-73.78535911599988, 40.7622563179999], [-73.78542241999988, 40.76251310799994], [-73.78546383099984, 40.76259192499988], [-73.78571993599994, 40.762921464999856], [-73.78595810599988, 40.76310224399986], [-73.787141317, 40.763707819999865], [-73.78733166699999, 40.76380781299986], [-73.78807523699999, 40.76419948999993], [-73.78822763099994, 40.76431439599985], [-73.78836856600003, 40.76443842899987], [-73.78849669799996, 40.764570552999885], [-73.7886108559999, 40.764709593999925], [-73.78871017999994, 40.76485425199996], [-73.78963649799978, 40.76614161099991], [-73.78990502999987, 40.7665115969999], [-73.79021960799982, 40.76695117499985], [-73.79059858199989, 40.76741868799998], [-73.79137684499982, 40.7683242969999], [-73.79149870499994, 40.76844739099989], [-73.79190204099989, 40.768936211999915], [-73.79235243699989, 40.76944963799987], [-73.79238243799978, 40.7694838389999], [-73.79317944599988, 40.77040317699989], [-73.79323711899993, 40.77046772099994], [-73.79394905799995, 40.7712673749999], [-73.79415923499985, 40.77151603799994], [-73.79480546099995, 40.77225687499992], [-73.794936368, 40.77240452999993], [-73.79507190299978, 40.77254212499992], [-73.7952155069999, 40.77267490699989], [-73.79565702099983, 40.773036085999905], [-73.79557358499984, 40.77304924499992], [-73.79499129399991, 40.77314334799993], [-73.7936523029999, 40.77336043899989], [-73.79271259399978, 40.773787526999875], [-73.7922679529999, 40.77399004199987], [-73.79163526099994, 40.774238655999895], [-73.79034971799999, 40.774573093999926], [-73.78984203999995, 40.77468732599991], [-73.78913873699987, 40.774848689999935], [-73.78893975799984, 40.77490059199992], [-73.78826972999987, 40.77507535699988], [-73.7874099169999, 40.77531789199993], [-73.78655073399982, 40.77555774699991], [-73.78626498299998, 40.77564607999991], [-73.78569433899995, 40.77581277499992], [-73.78491489299977, 40.776040509999845], [-73.78459339399987, 40.776141224999925], [-73.78448330699995, 40.77616825899986], [-73.78440918799984, 40.77619021899989], [-73.78407645399997, 40.77628882299991], [-73.78279772899998, 40.77666603599993], [-73.78036180399994, 40.77738704699991], [-73.77947656099995, 40.777664169999895], [-73.77858771199995, 40.77791239199995], [-73.77769354999994, 40.77816041699992], [-73.77678363299991, 40.77840958299987], [-73.77583958299994, 40.778612371999884], [-73.77572440800002, 40.777900433999896], [-73.77553732199992, 40.777025597999916], [-73.77465548700002, 40.777285608999925], [-73.7737825709999, 40.77754746799989], [-73.772903019, 40.77780428099986], [-73.7720360819999, 40.778069802999866], [-73.77113180399985, 40.77834080999992], [-73.76934982499989, 40.77887476899986], [-73.76877614499993, 40.77904284199991], [-73.76864150099995, 40.77908686699987], [-73.7685730499999, 40.77910542899991]]]}}, {\&quot;id\&quot;: \&quot;16\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 17, \&quot;Shape_Leng\&quot;: 0.093522632948, \&quot;Shape_Area\&quot;: 0.000322957654799, \&quot;zone\&quot;: \&quot;Bedford\&quot;, \&quot;LocationID\&quot;: 17, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94306406899986, 40.701424434999886], [-73.94220058700002, 40.700890666999896], [-73.94193078899983, 40.70072523399989], [-73.94438788599984, 40.70042452299993], [-73.94424286099989, 40.69969927999991], [-73.94409591299996, 40.698972954999924], [-73.94394947200006, 40.698221278999895], [-73.94391750199989, 40.69805620199984], [-73.94380383199999, 40.697469264999945], [-73.94378455600005, 40.69736972899993], [-73.9437430669999, 40.69715549899995], [-73.9437245359998, 40.6970598119999], [-73.94368427099982, 40.69685190199992], [-73.9436380689999, 40.696613317999905], [-73.94362121299996, 40.69652627899993], [-73.94355634200002, 40.696191282999926], [-73.94354024099975, 40.696108141999964], [-73.94352527499989, 40.6960308549999], [-73.943388021, 40.69528898999993], [-73.94324249099988, 40.69455748499995], [-73.94312826799985, 40.69396703799988], [-73.9431142779999, 40.693894719999896], [-73.94310040999994, 40.69382302899988], [-73.942951361, 40.693090783999864], [-73.94280765199987, 40.69235779399988], [-73.94266181699986, 40.691624343999855], [-73.94251587899991, 40.69089200099991], [-73.94236932699991, 40.690159944999884], [-73.94222203500003, 40.689427978999916], [-73.9420768489998, 40.6886972019999], [-73.94193245099987, 40.687962958999904], [-73.94178527599988, 40.68722837199987], [-73.94163933199995, 40.686497269999954], [-73.94149491799988, 40.685764528999904], [-73.94134827200003, 40.68503120299987], [-73.94120399299996, 40.68429983899994], [-73.94105783799992, 40.683566871999844], [-73.940913343, 40.682833616999865], [-73.94076893299986, 40.6821008389999], [-73.94062005399995, 40.68137012999991], [-73.94047634999994, 40.68063569499985], [-73.94032794, 40.679889974999874], [-73.9412086429999, 40.67993835399988], [-73.94326176899995, 40.68005060699992], [-73.94397347799995, 40.680088127999916], [-73.94627471000001, 40.68021332599986], [-73.94674916000001, 40.68023966099991], [-73.94773023599987, 40.6802918459999], [-73.94955688699993, 40.68039040299995], [-73.95115828499993, 40.68047861499993], [-73.95155682700002, 40.680498847999935], [-73.9533701749999, 40.680640507999904], [-73.95351616899988, 40.6813825999999], [-73.95366256199999, 40.68211490399989], [-73.95380893500004, 40.68284800799992], [-73.953954531, 40.683580778999946], [-73.95410042600001, 40.68431310799984], [-73.95424647699987, 40.685046247999914], [-73.95439296899998, 40.68577971999988], [-73.95453798699995, 40.686511174999936], [-73.95468418899998, 40.68724485399985], [-73.95684165199995, 40.68699607899989], [-73.95956770199984, 40.686682554999955], [-73.95971374799981, 40.687415633999926], [-73.959859395, 40.6881474509999], [-73.96000519799986, 40.688881033999955], [-73.96009714599994, 40.68934520999991], [-73.96012172900004, 40.689469306999825], [-73.96017256100002, 40.68972986199988], [-73.96018691899992, 40.6898034559999], [-73.96022304499992, 40.6899886269999], [-73.96023740299987, 40.690062221999874], [-73.96029281699998, 40.69034624999995], [-73.96013760799985, 40.69036437999989], [-73.96008336799996, 40.69037071599989], [-73.95957591899987, 40.69042998799992], [-73.95942791399997, 40.69044727499993], [-73.959348624, 40.69045646099992], [-73.95928133699987, 40.69046425699991], [-73.9589933049999, 40.69049762899987], [-73.95886713600001, 40.69051224799996], [-73.95857844799987, 40.69054569399986], [-73.95818048699985, 40.690590729999876], [-73.95808563499989, 40.690601463999876], [-73.95727249099987, 40.69069347799987], [-73.95635602999991, 40.69079978199989], [-73.95541057999996, 40.69090829199994], [-73.95582662799985, 40.692992382999925], [-73.95614239299985, 40.694579018999896], [-73.95708701900001, 40.69447043999992], [-73.95799732999993, 40.694365838999914], [-73.95931047999983, 40.69421508699989], [-73.96015854699988, 40.69411730899989], [-73.96062056499981, 40.69632013999993], [-73.96092543799982, 40.697736506999895], [-73.96105100699992, 40.69832607899989], [-73.96019688899986, 40.69846272699991], [-73.95885874699991, 40.69867732599986], [-73.9579593819998, 40.69882000299991], [-73.95701993199991, 40.69897391399995], [-73.95716730100004, 40.69970786799989], [-73.95722517499998, 40.69999934999987], [-73.95745736399992, 40.70082260299993], [-73.95572360999994, 40.70194576999991], [-73.95381196900003, 40.703180979999914], [-73.95318085199992, 40.702616904999935], [-73.95255052799989, 40.70205166699994], [-73.95192018899999, 40.70148754899992], [-73.95128819399989, 40.700922364999855], [-73.9502742399999, 40.70157924199991], [-73.94937873499998, 40.70215888999993], [-73.94753858099985, 40.70335064999991], [-73.94705205299991, 40.70366394899985], [-73.94625107799986, 40.703208746999934], [-73.945854991, 40.70298720699987], [-73.94544988199996, 40.70276063599993], [-73.94463910199993, 40.702313693999926], [-73.94431460199992, 40.70213334499988], [-73.94400503999998, 40.70196179199989], [-73.94382473799989, 40.70186200799988], [-73.94322685899992, 40.7015207089999], [-73.94306406899986, 40.701424434999886]]]}}, {\&quot;id\&quot;: \&quot;17\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 18, \&quot;Shape_Leng\&quot;: 0.0697995498569, \&quot;Shape_Area\&quot;: 0.000148850163948, \&quot;zone\&quot;: \&quot;Bedford Park\&quot;, \&quot;LocationID\&quot;: 18, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88513907699999, 40.86638287399992], [-73.88593703500003, 40.86592439799994], [-73.88683316999993, 40.86538999399989], [-73.8881227879999, 40.86425457099988], [-73.88889566099989, 40.86475415299988], [-73.890161637, 40.86347636299995], [-73.8906539299999, 40.86295483399993], [-73.89114803099996, 40.862476137999934], [-73.8917325659999, 40.861909814999905], [-73.89177188799992, 40.86187171599992], [-73.89138023399983, 40.86170058799992], [-73.89141802399983, 40.86166298399996], [-73.89256392599998, 40.860522728999925], [-73.89321520799987, 40.85987420599986], [-73.89381026099987, 40.858986564999924], [-73.8946932639999, 40.85942628199991], [-73.89573924699978, 40.85813820699986], [-73.89636314599984, 40.85837531899991], [-73.89735765499988, 40.85876273499986], [-73.89818244699991, 40.85908368099995], [-73.89866157499996, 40.859246901999896], [-73.89883814599983, 40.859307307999906], [-73.89880457699982, 40.8593642709999], [-73.898590972, 40.859766782999934], [-73.89828973399992, 40.86033442099995], [-73.89822728999994, 40.860448863999885], [-73.89802453099999, 40.86082046099989], [-73.89773815399992, 40.86135113699993], [-73.897143798, 40.86244506499991], [-73.89737274799985, 40.86243236399985], [-73.89798099399988, 40.86240253999991], [-73.89841038399996, 40.862296966999935], [-73.89943670799998, 40.862116911999856], [-73.89964261700001, 40.862210436999874], [-73.89996177599984, 40.86235027999989], [-73.90028368099995, 40.86247183699992], [-73.90107966999994, 40.86275638299992], [-73.90027587299991, 40.863787634999944], [-73.89887282999977, 40.86558402699991], [-73.89797842699994, 40.86672770799987], [-73.8974032329998, 40.86747418999989], [-73.89631315699987, 40.8670385749999], [-73.89544263399986, 40.866602088999855], [-73.89536151600007, 40.86656133099995], [-73.8945304879999, 40.86614380899987], [-73.89438130299995, 40.866068850999966], [-73.89436438800003, 40.86609167199985], [-73.89431825299997, 40.8661539259999], [-73.89408697099991, 40.86645343299995], [-73.89397201799989, 40.8666023039999], [-73.8937613899999, 40.866875057999955], [-73.89368435599988, 40.86698082099989], [-73.89300269899991, 40.86788106799988], [-73.89243509099991, 40.868620597999936], [-73.89221258799988, 40.868915499999936], [-73.8919171829999, 40.869302109999886], [-73.8917463349999, 40.86951054799996], [-73.89157400099995, 40.86968425199998], [-73.89138946999998, 40.869850993999904], [-73.89119350399992, 40.8700100329999], [-73.89098696999984, 40.870160714999905], [-73.89042763899991, 40.870487053999916], [-73.88991744500004, 40.870780631999864], [-73.88950049199994, 40.87102055599993], [-73.88884301599997, 40.87139806699986], [-73.88868449900004, 40.87149511299988], [-73.88833546999989, 40.871709830999905], [-73.8879350369998, 40.87203023199988], [-73.88785196299986, 40.87211417599992], [-73.88798774400006, 40.872227490999855], [-73.88857987899992, 40.87272163999993], [-73.88863187299991, 40.87276503099986], [-73.88937163799984, 40.87338229799993], [-73.88855699899982, 40.8751973129999], [-73.88824333699998, 40.875892194999935], [-73.88808032199985, 40.87627274599987], [-73.88773577599993, 40.87703388199987], [-73.88567517999988, 40.87887251099986], [-73.88541068099991, 40.87910168399991], [-73.88527683199987, 40.87921766899991], [-73.88505419400002, 40.87889287599994], [-73.88489171499985, 40.87860601699993], [-73.88477074799978, 40.87839502799989], [-73.8846776199998, 40.87823547699989], [-73.88382977799998, 40.8767828419999], [-73.88355294399997, 40.87625222899987], [-73.88349725699989, 40.876156739999885], [-73.88345586399996, 40.876056256999945], [-73.88345579299984, 40.87605609499993], [-73.88345575699994, 40.87605593399992], [-73.88342964999991, 40.87595216999989], [-73.88341932399999, 40.87584701799994], [-73.88342472699996, 40.875742665999866], [-73.88343632799992, 40.87538431899991], [-73.88344008999987, 40.87479468399987], [-73.883400353, 40.87394662599995], [-73.88334994299991, 40.87375884999991], [-73.88327982500005, 40.87357380999987], [-73.88319052799997, 40.87339337899994], [-73.88319048200002, 40.87339327999999], [-73.8831904229999, 40.87339318999993], [-73.88308277499985, 40.87321902499988], [-73.88308273999986, 40.873218971999904], [-73.88308270399986, 40.87321891799995], [-73.882957783, 40.87305245199983], [-73.8828305549999, 40.87291666499986], [-73.88283042399992, 40.87291651999991], [-73.88283030599987, 40.87291636699989], [-73.88271951399993, 40.87277078099993], [-73.88262696899983, 40.87261718899993], [-73.88262687499989, 40.87261702799994], [-73.88262679199994, 40.872616855999865], [-73.88255399799999, 40.87245745799991], [-73.88255391499996, 40.872457287999914], [-73.88255385599989, 40.87245711599994], [-73.88250150999994, 40.87229386699992], [-73.8825014739999, 40.87229374999986], [-73.8825014509999, 40.872293623999944], [-73.88246984299988, 40.87212868499994], [-73.88222049399987, 40.871227247999855], [-73.88197649899989, 40.87038728399996], [-73.88174189599988, 40.8695527139999], [-73.88146889699985, 40.868573645999916], [-73.88188379899985, 40.86832083599991], [-73.88284356199999, 40.86773622599992], [-73.88362518100003, 40.86725758799991], [-73.88442861399994, 40.86680037899986], [-73.88513907699999, 40.86638287399992]]]}}, {\&quot;id\&quot;: \&quot;18\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 19, \&quot;Shape_Leng\&quot;: 0.101824875452, \&quot;Shape_Area\&quot;: 0.000546661094782, \&quot;zone\&quot;: \&quot;Bellerose\&quot;, \&quot;LocationID\&quot;: 19, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.72339596299987, 40.750389075999855], [-73.72258571899978, 40.74885045099991], [-73.720144294, 40.74976283099995], [-73.72010148299994, 40.74977568599991], [-73.71988664100002, 40.74936951099994], [-73.71896368299994, 40.74699473999995], [-73.71894406299995, 40.74694425599994], [-73.71892134799997, 40.74689486899994], [-73.71869037499981, 40.746392765999936], [-73.71853063599995, 40.7460393299999], [-73.71823250099993, 40.74539666299989], [-73.71764302999979, 40.744070413999964], [-73.71762516399986, 40.74402847899988], [-73.71760306099992, 40.743974627999876], [-73.71740598499986, 40.74351092999989], [-73.71656758399989, 40.74164908599988], [-73.71578267699999, 40.73989578599985], [-73.71544946799989, 40.73921680399994], [-73.71511121299982, 40.73856840999988], [-73.71496199799985, 40.738276409999855], [-73.71494063099992, 40.73823459999989], [-73.71476982799997, 40.7379003479999], [-73.71436629299991, 40.737243891999896], [-73.71370155699985, 40.73616012199993], [-73.71328662099987, 40.735473124999935], [-73.71289825099977, 40.73485113699988], [-73.71283004500002, 40.73473962799994], [-73.71278769000006, 40.7346703809999], [-73.71250100899985, 40.734201632999905], [-73.7122862199999, 40.73385241799987], [-73.71208085999997, 40.73351852599989], [-73.71186191499989, 40.73315683699991], [-73.71147804899985, 40.73250140099988], [-73.710893249, 40.730971041999936], [-73.71075217299996, 40.73052537499992], [-73.71066275899989, 40.72949571099991], [-73.710655187, 40.729382965999925], [-73.71061871899991, 40.72883987399995], [-73.7105550639999, 40.728020849999915], [-73.71050351799981, 40.72727838999988], [-73.71049995381028, 40.72722708720663], [-73.7105628560812, 40.7272188714254], [-73.71191821920186, 40.72704180707466], [-73.71407555595218, 40.726759930163915], [-73.71496944887915, 40.72664661018486], [-73.71587971997315, 40.7265419058296], [-73.71828706789265, 40.726041111135174], [-73.72038627275316, 40.72547455419105], [-73.7211926570586, 40.725266546195385], [-73.72204226687052, 40.7250126029472], [-73.722578793026, 40.72487767601808], [-73.72291170303338, 40.7247939467331], [-73.72295712084203, 40.724782448805506], [-73.72296233421183, 40.724781127902155], [-73.72315163514787, 40.72473320701826], [-73.7234275409709, 40.72466335095062], [-73.72419675486013, 40.72445460193022], [-73.72454518798916, 40.72436003595222], [-73.72463422510643, 40.72433644820514], [-73.72471792493599, 40.72431260475058], [-73.72473123486797, 40.72430839576523], [-73.72493417712295, 40.72424417017321], [-73.72508489078929, 40.72419561380042], [-73.72567196979708, 40.724037658996544], [-73.72647559477359, 40.723752496193974], [-73.72732826508961, 40.72341196312062], [-73.72797157476118, 40.72315911624762], [-73.72816233910697, 40.7230841398913], [-73.72818574899999, 40.723145636999924], [-73.72836415399992, 40.72361435199985], [-73.72990512499977, 40.723272494999954], [-73.73016587199996, 40.72395859599988], [-73.73043003899987, 40.724640254999876], [-73.73069257599997, 40.72532826699992], [-73.73095653299988, 40.726014939999835], [-73.73121918199986, 40.72669819599986], [-73.73144806399984, 40.72734384999995], [-73.7314721509999, 40.727411794999924], [-73.73161735999996, 40.72744912699996], [-73.73272577999994, 40.727734069999904], [-73.73361727799993, 40.727933573999955], [-73.73424214199999, 40.7280753799999], [-73.73450816499994, 40.7281364099999], [-73.73498719899999, 40.72824220599991], [-73.73545493899995, 40.7283456249999], [-73.73632483599988, 40.72854566199993], [-73.73715501999992, 40.728732010999884], [-73.73816144099993, 40.7289580909999], [-73.73840175399988, 40.729011523999866], [-73.73904904900003, 40.72916463899987], [-73.73968059999994, 40.72930668299992], [-73.74040469999989, 40.72946953699989], [-73.74080920999988, 40.729560507999956], [-73.74200329399991, 40.72982592299992], [-73.74230785999983, 40.72989362199998], [-73.74242143799988, 40.72991886499994], [-73.74376398999986, 40.730227197999966], [-73.74383878399982, 40.7302445999999], [-73.74385189999987, 40.73024764599996], [-73.74398330999986, 40.73027821199988], [-73.74411105400003, 40.73030792499984], [-73.74417482499997, 40.730322763999936], [-73.74488800699997, 40.73048310599994], [-73.74543152500001, 40.73061791799988], [-73.74555667199989, 40.73063689799994], [-73.74629555799991, 40.731180177999875], [-73.74640108899996, 40.7312928389999], [-73.74649162199995, 40.731414588999925], [-73.74656523699987, 40.73154360499996], [-73.74659290699987, 40.73161070999988], [-73.74662058899987, 40.73167780499995], [-73.7466568949999, 40.73181492399991], [-73.74667404599982, 40.73195264999993], [-73.74669850599986, 40.73221018799995], [-73.74671314399986, 40.73236436899988], [-73.74672140400006, 40.73247715099991], [-73.7461625949999, 40.73292721999995], [-73.74555368099982, 40.73340431799991], [-73.74472417799997, 40.734011029999905], [-73.742947859, 40.7354565519999], [-73.74228431199994, 40.736086407999935], [-73.74158944499997, 40.736782008999946], [-73.74151636899985, 40.73686036099986], [-73.74144628700002, 40.736938745999964], [-73.74016951799993, 40.73848189799986], [-73.73986995499992, 40.73886690099992], [-73.73972244199989, 40.739036089999914], [-73.73933151399987, 40.739474474999916], [-73.73901210399985, 40.73974647899997], [-73.738571759, 40.74009212299992], [-73.73816047999985, 40.74037643499986], [-73.73751038099981, 40.74071544799988], [-73.73685894199984, 40.741050400999875], [-73.73560786699984, 40.74169621999989], [-73.73539272699988, 40.74181104999989], [-73.7343696589998, 40.74235159899991], [-73.73375484899985, 40.742747627999975], [-73.73370171599998, 40.7427851569999], [-73.7336646159999, 40.74281318399988], [-73.73241694699988, 40.74369457599995], [-73.73232731699994, 40.74377143299988], [-73.7322691809999, 40.74381896199988], [-73.7310646189999, 40.744888375999885], [-73.7306280189999, 40.745364157999866], [-73.73043134700004, 40.74558483599989], [-73.72993169099983, 40.74618812499993], [-73.72964619299997, 40.74656191399992], [-73.72953448999986, 40.746716395999925], [-73.729145939, 40.74727379999993], [-73.72906670999978, 40.74739095899988], [-73.728962516, 40.74763288799986], [-73.72888621599986, 40.74756663599992], [-73.72829094199989, 40.74745895699992], [-73.72822968899995, 40.747830803999875], [-73.72815098799995, 40.74820123199985], [-73.72805493499999, 40.74856952199987], [-73.7279417009999, 40.74893498799988], [-73.72781151199987, 40.74929691999998], [-73.727664654, 40.749654641999946], [-73.72627213299992, 40.74930649099986], [-73.72339596299987, 40.750389075999855]]]}}, {\&quot;id\&quot;: \&quot;19\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 20, \&quot;Shape_Leng\&quot;: 0.0514401924362, \&quot;Shape_Area\&quot;: 0.000134512633032, \&quot;zone\&quot;: \&quot;Belmont\&quot;, \&quot;LocationID\&quot;: 20, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88386792099986, 40.8642908889999], [-73.88379386499992, 40.86417182299991], [-73.8837937109999, 40.86417157099987], [-73.88200794099986, 40.862046852999946], [-73.88103469099984, 40.861275294999885], [-73.88092572600007, 40.86116228799991], [-73.88083055899997, 40.86104034399993], [-73.88075099099991, 40.86091098799991], [-73.88068839499986, 40.86077599299989], [-73.8806437029999, 40.86063731599991], [-73.88061726900006, 40.860497010999936], [-73.88060896899991, 40.860357092999884], [-73.88075871500001, 40.85949442499993], [-73.880965862, 40.85854520499987], [-73.88098942799995, 40.85845935899989], [-73.88100678999979, 40.85826802299992], [-73.88100464399997, 40.85807565699992], [-73.88098293799995, 40.85788399199989], [-73.88094199099993, 40.857694990999974], [-73.88094193200001, 40.85769473899994], [-73.88094184999994, 40.85769449599996], [-73.88088225100002, 40.85750954499986], [-73.88080810099991, 40.857198447999885], [-73.88079155299991, 40.85712750799994], [-73.88077132199986, 40.8570397609999], [-73.880729541, 40.85680727499991], [-73.88073042799992, 40.85667660499989], [-73.88103358999996, 40.85559995199987], [-73.8816727419998, 40.8533496789999], [-73.88200299099991, 40.85218935799987], [-73.88232256599994, 40.851060791999906], [-73.88255596199991, 40.85022427099987], [-73.88284931500006, 40.84919252699994], [-73.88288269199988, 40.84907404699991], [-73.88311982600001, 40.848221091999925], [-73.88322877699981, 40.84834587799986], [-73.88377755699985, 40.848682183999884], [-73.88480193499986, 40.84930945899987], [-73.88581418499989, 40.84993079699989], [-73.88643555899993, 40.850309427999875], [-73.88751770499984, 40.85094946799988], [-73.88800539899992, 40.85097610299994], [-73.88823974099995, 40.85103536599995], [-73.8887824569999, 40.851341184999924], [-73.88895256299988, 40.85144078099994], [-73.88951837699989, 40.85180274499989], [-73.88963044999998, 40.85188593199995], [-73.88987871399985, 40.85207022099993], [-73.88993961599995, 40.85259076299992], [-73.88963328299991, 40.85317381799993], [-73.88960978099988, 40.85362187999995], [-73.89003039600001, 40.854220991999945], [-73.89038953999983, 40.85468905799996], [-73.89044259299995, 40.85504635099993], [-73.8907742849999, 40.85581193999993], [-73.89108676599993, 40.85659725699984], [-73.89109710400002, 40.856779813999886], [-73.8911055689998, 40.85742738299995], [-73.89111318899985, 40.857850998999865], [-73.89111115400003, 40.85838432199987], [-73.89111943300001, 40.85865896199989], [-73.89112461399988, 40.8588700059999], [-73.89112568799987, 40.860061824999924], [-73.89059489199987, 40.86071569999991], [-73.89027555599993, 40.86110907299996], [-73.89036823899993, 40.86115807599985], [-73.89067455199995, 40.86132004099988], [-73.89082169799998, 40.86139939599989], [-73.89106280699994, 40.8615294119999], [-73.89138023399983, 40.86170058799992], [-73.89177188799992, 40.86187171599992], [-73.8917325659999, 40.861909814999905], [-73.8906539299999, 40.86295483399993], [-73.890161637, 40.86347636299995], [-73.88889566099989, 40.86475415299988], [-73.8881227879999, 40.86425457099988], [-73.88683316999992, 40.865389992999894], [-73.88593703500003, 40.86592439799994], [-73.88513907699999, 40.86638287399992], [-73.88442861399994, 40.86680037899986], [-73.88362518100003, 40.86725758799991], [-73.8830900319999, 40.86659150899993], [-73.88297537099986, 40.86644973199989], [-73.88271794699989, 40.86613296599992], [-73.88267624699999, 40.86608914099984], [-73.88273658899989, 40.86604857299993], [-73.88319816099992, 40.86576631399988], [-73.88344168299979, 40.86561633199988], [-73.883563778, 40.86552635199991], [-73.88367321300004, 40.86542528299993], [-73.88376749199992, 40.86531475299994], [-73.88384464399992, 40.86519681299989], [-73.88390334899988, 40.86507380199995], [-73.88394303099996, 40.86494818699985], [-73.88396922299982, 40.864817740999825], [-73.88397514999986, 40.86468399799992], [-73.88396002399999, 40.864549718999896], [-73.88392395799984, 40.86441776099988], [-73.88386792099986, 40.8642908889999]]]}}, {\&quot;id\&quot;: \&quot;20\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 21, \&quot;Shape_Leng\&quot;: 0.115973569062, \&quot;Shape_Area\&quot;: 0.000380251345507, \&quot;zone\&quot;: \&quot;Bensonhurst East\&quot;, \&quot;LocationID\&quot;: 21, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97418385499991, 40.609463501999905], [-73.97403097799986, 40.608702309999906], [-73.97316643599986, 40.60879557699993], [-73.97299433999983, 40.6088141419999], [-73.97258982399998, 40.60667153299988], [-73.97239735499981, 40.60565188999986], [-73.97217742800002, 40.604194711999845], [-73.97235152099995, 40.60334811899986], [-73.972452617, 40.60261705399988], [-73.9725653369999, 40.601794372999905], [-73.97291116900001, 40.599315803999964], [-73.9719108049999, 40.599423058999896], [-73.97176105299991, 40.59865193199989], [-73.97163038199993, 40.5979440169999], [-73.97148350899987, 40.59717158499996], [-73.97323983499987, 40.59697881799983], [-73.97408390599992, 40.59688294399995], [-73.974926956, 40.596793537999936], [-73.97503940399993, 40.59678002699995], [-73.97558819299998, 40.59671920599991], [-73.97650934500001, 40.59661610899983], [-73.97750674199997, 40.596506452999904], [-73.9785016919999, 40.596394852999914], [-73.97890571399992, 40.59635272999989], [-73.9794258679999, 40.596297522999876], [-73.98035785499995, 40.59619154099992], [-73.98014301299985, 40.595066175999904], [-73.97995443499985, 40.594073811999884], [-73.98071099999997, 40.59399739599998], [-73.98179084800002, 40.593867455999906], [-73.98273346399986, 40.593763698999915], [-73.98303296899982, 40.593730292999915], [-73.9834412439999, 40.593687772999864], [-73.98354622399994, 40.59367650999994], [-73.98366766399984, 40.593663481999926], [-73.98407040399994, 40.593617363999876], [-73.98412888499986, 40.593610666999915], [-73.98463965399982, 40.59355217599988], [-73.98467794099993, 40.5936586499999], [-73.98601936799993, 40.594446048999906], [-73.98798856399989, 40.59255277799986], [-73.98962150099992, 40.59098199299996], [-73.99036425099996, 40.591431931999935], [-73.99066311999997, 40.5911671669999], [-73.99147342099985, 40.590449305999904], [-73.99153934399993, 40.59039090299989], [-73.99161412399994, 40.59035644499992], [-73.99255747799991, 40.5899216749999], [-73.99286067699995, 40.58978269799995], [-73.99291591499997, 40.589757378999884], [-73.99297835999997, 40.58973003299996], [-73.99330855, 40.58958389899994], [-73.99375761899992, 40.590331843999856], [-73.99801867061471, 40.588425400020526], [-73.99867293375554, 40.5891955499396], [-73.99923690396953, 40.588935328269024], [-73.99946446811052, 40.58923326938065], [-73.99837834882116, 40.58977044508854], [-73.99842061695254, 40.5898140545596], [-73.99883618014556, 40.5896254895423], [-73.9988658617368, 40.58966697528812], [-73.99844387079486, 40.58986039917759], [-73.99851059611983, 40.58996013293428], [-73.99855344167928, 40.590017683146215], [-73.99858515364288, 40.59004738497782], [-73.99862485126727, 40.59008456707945], [-73.99868197911874, 40.59012967417432], [-73.99874318832653, 40.590190336045396], [-73.99877991358242, 40.5902323318472], [-73.99879419437912, 40.5902805499443], [-73.99877800589593, 40.59031435534189], [-73.99873298307851, 40.590334987929545], [-73.99868809619367, 40.590325655709115], [-73.99865341212593, 40.59029143644465], [-73.9985942438702, 40.59022766353232], [-73.99853303406093, 40.59020899816093], [-73.99849018691935, 40.59021677414818], [-73.99844325936857, 40.59024010549443], [-73.99839633111722, 40.590282100254925], [-73.99835552304194, 40.59033498314752], [-73.99775972701352, 40.59095246961378], [-73.99711168571537, 40.591277977443745], [-73.99710562330513, 40.59133427927689], [-73.99710730365224, 40.591390755943046], [-73.99711670841539, 40.59144679034145], [-73.99713373485126, 40.5915017702026], [-73.99715819693523, 40.59155509477774], [-73.99718982739483, 40.59160618140396], [-73.9972282806271, 40.59165447187027], [-73.99806438267662, 40.59120946473145], [-73.99812869461262, 40.5912886642579], [-73.99740518642399, 40.59164508498032], [-73.99728269703776, 40.59171481486809], [-73.99754851058395, 40.59191757917553], [-73.99856404800653, 40.591492325309545], [-73.99916761862079, 40.59114913581574], [-73.99957329199391, 40.591092566583356], [-73.99986219746393, 40.59112803340917], [-73.99992669140542, 40.59114738407374], [-73.9999873500428, 40.591172945649255], [-74.00004314944917, 40.59120428665461], [-74.00009314771766, 40.59124087805044], [-74.00013650086177, 40.591282102170034], [-74.00017247706104, 40.59132726314402], [-74.00020046901545, 40.59137559864704], [-74.000220004197, 40.59142629276542], [-74.00023075282738, 40.591478489769656], [-74.00023253344592, 40.59153130855935], [-74.00005812170888, 40.59171484748445], [-73.99967223219585, 40.59196375866878], [-73.99930612934223, 40.592178726406004], [-73.99903131441663, 40.59231280344756], [-73.99902051717862, 40.592323348987264], [-73.99901217208547, 40.59233511698889], [-73.99900651177178, 40.592347779399724], [-73.99900369403004, 40.59236098323367], [-73.99900379741118, 40.59237436041128], [-73.99900681903495, 40.59238753802081], [-73.99901267467028, 40.59240014871337], [-73.99902120108229, 40.59241184094382], [-73.99903216058368, 40.592422288770635], [-73.9990452476599, 40.592431200941924], [-73.9990600974859, 40.59243832901494], [-73.99907629609663, 40.592443474281794], [-73.99909339192617, 40.59244649330885], [-73.99930029587152, 40.592559122665], [-73.99934775356314, 40.592622309479], [-73.99938869468849, 40.592688091910205], [-73.99942287662074, 40.59275608014794], [-73.99945009678441, 40.59282587130941], [-73.99947019385698, 40.59289705182673], [-73.9994830488618, 40.59296919994875], [-73.9991972768818, 40.59317814395959], [-73.99897464310263, 40.59330636943554], [-73.99838831091802, 40.59353139180308], [-73.99736802499984, 40.59397431099996], [-73.99633951299984, 40.59362247499993], [-73.99630983500005, 40.593667751999895], [-73.99629319699989, 40.593716441999916], [-73.99619345599999, 40.593992197999896], [-73.99535761899992, 40.59440332799991], [-73.99530829599992, 40.59442758699989], [-73.99549868199995, 40.594594406999946], [-73.99587725299996, 40.59491413699993], [-73.99611613099994, 40.59511588599987], [-73.99639126099986, 40.595345801999905], [-73.99669451199998, 40.595599205999875], [-73.99674706899995, 40.59564312599992], [-73.99630015799983, 40.59606105399993], [-73.99522558800007, 40.59709332799984], [-73.99336225799983, 40.598888688999885], [-73.99159842599994, 40.60058036599988], [-73.99097171199985, 40.60118455999986], [-73.99038998499982, 40.60174340299995], [-73.989807573, 40.60230291099993], [-73.9892234389999, 40.60286567499987], [-73.98869008799991, 40.603425306999966], [-73.98806312999994, 40.603979451999834], [-73.98747998199978, 40.60453971199996], [-73.9868476259999, 40.60509723599994], [-73.98864528, 40.60616665399989], [-73.98913191499994, 40.6064561369999], [-73.98855078899993, 40.60700228299991], [-73.98842267599987, 40.60711914899985], [-73.98796510300004, 40.60756553599988], [-73.9873779529998, 40.60812811799987], [-73.9873391769999, 40.60816828599996], [-73.98671329999988, 40.60876626099987], [-73.98612915399993, 40.6093298639999], [-73.98575987199992, 40.60968408399989], [-73.9855485319999, 40.60988724299989], [-73.98535587499991, 40.610072013999876], [-73.98496383499996, 40.61044799399991], [-73.98438244899988, 40.611005419999884], [-73.984162011, 40.61121730099988], [-73.98380893599982, 40.61155987299987], [-73.98335142399998, 40.61199230099991], [-73.98322226999993, 40.61212220899992], [-73.98265927499983, 40.61269247099993], [-73.98215550199991, 40.613149614999934], [-73.98206106199993, 40.6132384189999], [-73.98174843299985, 40.613554623999946], [-73.98143750099993, 40.613837687999926], [-73.98080506199987, 40.614447129999846], [-73.98022027499997, 40.61500494899987], [-73.97963821799982, 40.61556454699991], [-73.977408165, 40.614218112999886], [-73.975208294, 40.612885257999906], [-73.97477658, 40.6126384749999], [-73.97458407499984, 40.61161357599985], [-73.97451543899999, 40.61125680099987], [-73.974390729, 40.6105792129999], [-73.97418385499991, 40.609463501999905]]]}}, {\&quot;id\&quot;: \&quot;21\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 22, \&quot;Shape_Leng\&quot;: 0.126170229196, \&quot;Shape_Area\&quot;: 0.000472062684608, \&quot;zone\&quot;: \&quot;Bensonhurst West\&quot;, \&quot;LocationID\&quot;: 22, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99254973599997, 40.62427426799996], [-73.99009356099988, 40.62278895299992], [-73.98785095499996, 40.62143503199991], [-73.9856935779999, 40.6201315139999], [-73.98627524699981, 40.61956661699987], [-73.98406791799982, 40.61824073899987], [-73.98186818299985, 40.61691212699987], [-73.98087912799988, 40.61631443499988], [-73.98003930399985, 40.61580692999995], [-73.97963821799982, 40.61556454699991], [-73.98022027499997, 40.61500494899987], [-73.98080506199987, 40.614447129999846], [-73.98143750099993, 40.613837687999926], [-73.98174843299985, 40.613554623999946], [-73.98206106199993, 40.6132384189999], [-73.98215550199991, 40.613149614999934], [-73.98265927499983, 40.61269247099993], [-73.98322226999993, 40.61212220899992], [-73.98335142399998, 40.61199230099991], [-73.98380893599982, 40.61155987299987], [-73.984162011, 40.61121730099988], [-73.98438244899988, 40.611005419999884], [-73.98496383499996, 40.61044799399991], [-73.98535587499991, 40.610072013999876], [-73.9855485319999, 40.60988724299989], [-73.98575987199992, 40.60968408399989], [-73.98612915399993, 40.6093298639999], [-73.98671329999988, 40.60876626099987], [-73.9873391769999, 40.60816828599996], [-73.9873779529998, 40.60812811799987], [-73.98796510300004, 40.60756553599988], [-73.98842267599987, 40.60711914899985], [-73.98855078899993, 40.60700228299991], [-73.98913191499994, 40.6064561369999], [-73.98864528, 40.60616665399989], [-73.9868476259999, 40.60509723599994], [-73.98747998199978, 40.60453971199996], [-73.98806312999994, 40.603979451999834], [-73.98869008799991, 40.603425306999966], [-73.9892234389999, 40.60286567499987], [-73.989807573, 40.60230291099993], [-73.99038998499982, 40.60174340299995], [-73.99097171199985, 40.60118455999986], [-73.99159842599994, 40.60058036599988], [-73.99336225799983, 40.598888688999885], [-73.99522558800007, 40.59709332799984], [-73.99630015799983, 40.59606105399993], [-73.99674706899995, 40.59564312599992], [-73.99669451199998, 40.595599205999875], [-73.99639126099986, 40.595345801999905], [-73.99611613099994, 40.59511588599987], [-73.99587725299996, 40.59491413699993], [-73.99549868199995, 40.594594406999946], [-73.99530829599992, 40.59442758699989], [-73.99535761899992, 40.59440332799991], [-73.99619345599999, 40.593992197999896], [-73.99629319699989, 40.593716441999916], [-73.99630983500005, 40.593667751999895], [-73.99633951299984, 40.59362247499993], [-73.99736802499984, 40.59397431099996], [-73.99838831091802, 40.59353139180308], [-73.99854421315825, 40.59359676275944], [-74.00030548953626, 40.59280477839979], [-74.00105748445709, 40.5925370050623], [-74.00164017530518, 40.59348065580983], [-74.00193320208321, 40.59389469541273], [-74.00184415135462, 40.593977667237965], [-74.00200394804675, 40.594132371137796], [-74.00027871999994, 40.59570266899989], [-74.00004233999992, 40.59594037099991], [-73.99999769599995, 40.59596779199991], [-73.9999650309999, 40.59599430299989], [-73.99951049399985, 40.59644180899987], [-73.99931921399997, 40.59664075099992], [-73.9986558659999, 40.59726856199988], [-73.99733919599988, 40.5985516119999], [-73.99559320799995, 40.600232221999875], [-73.9963651649999, 40.600696053999904], [-73.99708036399986, 40.60112882899989], [-73.99782332599999, 40.601578178999944], [-73.998563851, 40.602028433999905], [-73.99927902000005, 40.60245801699991], [-74.00002266099992, 40.60290731599988], [-74.00032353899998, 40.60262029199991], [-74.00109809599998, 40.60303462599992], [-74.00184603099991, 40.60343143199989], [-74.002630697, 40.60384644899989], [-74.00340902699993, 40.60425938099994], [-74.00416249599996, 40.60465473899992], [-74.00444636799998, 40.60480184699984], [-74.00493448899994, 40.60507440599987], [-74.00442477199992, 40.60556859699992], [-74.00264412399989, 40.60725717499991], [-74.00195011999993, 40.60781768299991], [-74.00171808600001, 40.60800297799994], [-74.00130866099992, 40.60834356899987], [-74.00094408399997, 40.60863970999988], [-74.00185301899995, 40.60913755999995], [-74.00266468099994, 40.60956996599992], [-74.00342538899996, 40.609969092999926], [-74.00601438399993, 40.61132508199992], [-74.00708800599996, 40.61190794499986], [-74.00788398499994, 40.61234007199985], [-74.00830383399986, 40.612567999999925], [-74.01019858699995, 40.613712166999925], [-74.01050403599997, 40.613896610999866], [-74.0099237199999, 40.61445664299991], [-74.00934164499988, 40.615015095999865], [-74.00876039999996, 40.61557582299988], [-74.00817687599992, 40.61613318099995], [-74.00759806899993, 40.61669446099994], [-74.00701531599991, 40.6172539459999], [-74.00643394999992, 40.617814716999874], [-74.00585319899992, 40.61837047699991], [-74.00522665999992, 40.618973153999875], [-74.00459907, 40.619576852999955], [-74.00401906899995, 40.62013618899991], [-74.0034355699999, 40.62069540399994], [-74.00285701599996, 40.621253642999896], [-74.00227586299998, 40.621814273999874], [-74.00169380199993, 40.622372426999966], [-74.00120222399994, 40.62284271199989], [-74.00052987499996, 40.623489938999946], [-73.99994665000001, 40.624050621999864], [-73.99932090299998, 40.62465524699996], [-73.99771358999998, 40.62368026999996], [-73.99748403999989, 40.624519845999934], [-73.99724067099987, 40.62528868699994], [-73.99701633599989, 40.62606161499991], [-73.99687778399999, 40.626530782999964], [-73.99678847599995, 40.626826050999895], [-73.99507814899985, 40.62580673699993], [-73.99464972999995, 40.62569717899992], [-73.99473485699997, 40.6256147409999], [-73.99489280599995, 40.625461793999925], [-73.99432497399985, 40.62534290799988], [-73.99398197100003, 40.62514139899989], [-73.99254973599997, 40.62427426799996]]]}}, {\&quot;id\&quot;: \&quot;22\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 23, \&quot;Shape_Leng\&quot;: 0.290556028962, \&quot;Shape_Area\&quot;: 0.00219556576201, \&quot;zone\&quot;: \&quot;Bloomfield/Emerson Hill\&quot;, \&quot;LocationID\&quot;: 23, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.19568609223377, 40.63501686464005], [-74.1955768805797, 40.635004218570565], [-74.1955597527974, 40.635023986316575], [-74.19248359599999, 40.633405071999945], [-74.1921598649999, 40.633230970999946], [-74.18649341199989, 40.63021905099987], [-74.18368103499995, 40.62874067099991], [-74.18190235699991, 40.62775580699991], [-74.18033424799995, 40.626834629999905], [-74.17993706099998, 40.626601296999894], [-74.1795447069999, 40.62636235399988], [-74.17924623499991, 40.626180580999886], [-74.17918377399995, 40.626137884999906], [-74.17888390599995, 40.62593287099991], [-74.17828177399998, 40.62545136099991], [-74.1780882019999, 40.62526042699992], [-74.1778150209999, 40.62499096299995], [-74.17775298599997, 40.62493844999993], [-74.17610052899997, 40.623406241999895], [-74.17519625699995, 40.62270624399988], [-74.17490328599996, 40.622529106999885], [-74.17459706299995, 40.622364010999874], [-74.17427887999997, 40.62221179199985], [-74.17395016799996, 40.622073168999854], [-74.17361243999996, 40.621948740999855], [-74.1732673079999, 40.621838983999915], [-74.17270752199991, 40.62171153799988], [-74.17236260999994, 40.62163579899988], [-74.17207112899989, 40.62157862099991], [-74.17181177999997, 40.62154338399994], [-74.17095546499992, 40.621442180999935], [-74.16985740699987, 40.621312386999925], [-74.16953656499994, 40.621270499999916], [-74.16923624499995, 40.6212164329999], [-74.16888894299989, 40.62115114299992], [-74.16878471999995, 40.621124028999866], [-74.16847311299996, 40.62104581499989], [-74.16808086299993, 40.62093625599991], [-74.16769710399988, 40.62079027499995], [-74.16742666699999, 40.620677283999896], [-74.16603193299996, 40.62009453499998], [-74.16570682499993, 40.61995403599987], [-74.16484190399989, 40.61957240499988], [-74.16394094899994, 40.619143261999945], [-74.16337391799988, 40.61885458999991], [-74.1623545779999, 40.618335637999955], [-74.16163010299996, 40.61793493599989], [-74.16052177399989, 40.61722978899994], [-74.15986704899998, 40.61681322499988], [-74.15912798199999, 40.61629637499986], [-74.15861741699992, 40.61593931499988], [-74.15792673899992, 40.615457424999896], [-74.157373837, 40.615031910999924], [-74.15651187899992, 40.61435448199988], [-74.15479265199997, 40.61303223099987], [-74.15474080199988, 40.6129923179999], [-74.15386832299995, 40.612320627999964], [-74.15379116699992, 40.612255611999906], [-74.15371834199986, 40.612206280999864], [-74.15317275299992, 40.611761521999874], [-74.15120348199993, 40.61026499499993], [-74.15031900699995, 40.60959281499989], [-74.15018666499996, 40.60949781099991], [-74.14998477099994, 40.6095384179999], [-74.14954343599997, 40.60962717199986], [-74.148783295, 40.609199986999904], [-74.14852820199994, 40.60908079499994], [-74.14826911999995, 40.60896670999988], [-74.14800622599995, 40.608857807999875], [-74.14773969799992, 40.608754164999915], [-74.14746971699995, 40.60865584899989], [-74.14719646699989, 40.60856292999989], [-74.14690609299997, 40.60846833999988], [-74.14661053099996, 40.608382978999906], [-74.14631056999997, 40.60830708799991], [-74.14600697999994, 40.60824083499989], [-74.14575166799996, 40.60818646199988], [-74.14549412999996, 40.608138571999866], [-74.14523464999989, 40.608097218999895], [-74.14497351299995, 40.60806244799991], [-74.14471100599997, 40.60803429699994], [-74.14444741899989, 40.608012796999915], [-74.14418304099992, 40.60799797199993], [-74.14391816399994, 40.60798983699987], [-74.142832906, 40.60799259499987], [-74.14188196399996, 40.60804294099991], [-74.14092528299996, 40.60808963199984], [-74.13997406999988, 40.60814639199986], [-74.13903904999992, 40.608195812999924], [-74.13810528799995, 40.60824232499986], [-74.1371740599999, 40.60829269799993], [-74.1359058139999, 40.6083589069999], [-74.13497712799997, 40.60841117899987], [-74.13404435499996, 40.60845319899988], [-74.13311710799991, 40.608505831999864], [-74.13215051199998, 40.608551963999936], [-74.13211741399986, 40.60826434899993], [-74.13210459699991, 40.608152923999924], [-74.131568734, 40.60818117199994], [-74.13094002299995, 40.60821431199985], [-74.12983323699997, 40.60830394299994], [-74.12874897499987, 40.608391740999934], [-74.12784267099993, 40.60850028899994], [-74.12742960799994, 40.60854975999994], [-74.12674361599996, 40.60863191499992], [-74.12650911499996, 40.60866290799986], [-74.12630497799988, 40.608699642999966], [-74.12520040399997, 40.60889840499993], [-74.1251456319999, 40.608908470999914], [-74.12452618799996, 40.60902231899992], [-74.12398126100001, 40.60913521899988], [-74.12350639099996, 40.609233601999975], [-74.12326521999991, 40.60929134799988], [-74.12252324799988, 40.609468999999905], [-74.12247214699988, 40.609481234999905], [-74.12135179599994, 40.609765267999926], [-74.1213358189999, 40.609666497999875], [-74.12127253299997, 40.60936216999995], [-74.12116879899992, 40.60883437599989], [-74.12079903099993, 40.60887493299986], [-74.12066342799993, 40.60888980599989], [-74.1205232869999, 40.60890517599993], [-74.120254056, 40.6089347039999], [-74.11913216599991, 40.6090577409999], [-74.11897246899993, 40.60907525399993], [-74.11883362299994, 40.60909048099991], [-74.1186902039999, 40.60910620799989], [-74.11848942399992, 40.60912822499994], [-74.11839688799994, 40.60913837299989], [-74.11834442099989, 40.609144125999904], [-74.11742466500002, 40.609289008999916], [-74.11706965299993, 40.60820624999994], [-74.116493189, 40.60765675199984], [-74.1163204779999, 40.6075755289999], [-74.11625356799993, 40.60753644099988], [-74.11615857899993, 40.60748094799987], [-74.1160100819999, 40.6073743499999], [-74.11587716399993, 40.60725747099985], [-74.1158562429999, 40.60715118399992], [-74.11579141499993, 40.60686116499993], [-74.11567482099998, 40.60613313799993], [-74.11554728399992, 40.60539592799987], [-74.11544265199991, 40.60469494899995], [-74.11537754999995, 40.60398418699989], [-74.11530272499996, 40.603868255999906], [-74.11511342599988, 40.60253381699985], [-74.11487058499988, 40.602136659999864], [-74.11500030999999, 40.60207428599988], [-74.11684368799999, 40.60189480699987], [-74.11777623899994, 40.60186024799992], [-74.11790155199996, 40.601856453999865], [-74.11957594399998, 40.60181702899996], [-74.12059546299996, 40.601809757999874], [-74.12055576699996, 40.6010452919999], [-74.12056668799994, 40.60095567899986], [-74.12056671099998, 40.60095547199994], [-74.12056678099997, 40.60095524599989], [-74.12059572199999, 40.6008671179999], [-74.12059578099999, 40.600866936999886], [-74.12059587499996, 40.60086676699992], [-74.12064219099997, 40.600782950999914], [-74.1206422609999, 40.60078282499992], [-74.12064234399995, 40.60078271599989], [-74.12070424299995, 40.600705980999884], [-74.12229424999991, 40.59968717799989], [-74.12264348599997, 40.59941858499993], [-74.123185791, 40.59919511599987], [-74.12322499799997, 40.59909695299992], [-74.12399136699995, 40.598714810999894], [-74.12454297999987, 40.598395257999876], [-74.12462019999995, 40.59834793499992], [-74.12470164799997, 40.5983049259999], [-74.12478690899994, 40.59826644999988], [-74.12487554999991, 40.59823270299993], [-74.12496712099988, 40.5982038559999], [-74.12506115499997, 40.59818005599987], [-74.12515717499994, 40.5981614239999], [-74.12525469300002, 40.59814805499989], [-74.12535321299993, 40.598140016999864], [-74.12545223399988, 40.59813734999987], [-74.12714563699993, 40.59833036199988], [-74.12798105699996, 40.59842483599991], [-74.12888881199997, 40.59854783299993], [-74.12982988799996, 40.59867157699992], [-74.13080319499996, 40.5988420859999], [-74.13091909399999, 40.598855047999905], [-74.13095007699992, 40.59873715199991], [-74.13099847699996, 40.59862154199993], [-74.13106374499998, 40.598510423999905], [-74.13114463199999, 40.59840588899992], [-74.13123935899998, 40.598309748999924], [-74.13205430899994, 40.59781870599993], [-74.1328130649999, 40.59724097399986], [-74.13385485799996, 40.596357845999904], [-74.13510176799998, 40.594535032999936], [-74.13544074099998, 40.593816942999844], [-74.13549571999992, 40.59370046799996], [-74.13639761399997, 40.591973456999895], [-74.13659957099995, 40.59166794799989], [-74.13681568999996, 40.59136787899989], [-74.13704557999992, 40.591073817999856], [-74.13728879499998, 40.590786314999875], [-74.13849744199997, 40.58931370499991], [-74.13864458599996, 40.58906080499989], [-74.14168277499994, 40.58874118499995], [-74.14230337999994, 40.588725478999955], [-74.14387326699992, 40.588615298999926], [-74.14583447999993, 40.58856291899987], [-74.14636402099994, 40.58855786899987], [-74.14645464799997, 40.58855885299993], [-74.14684720299991, 40.58857108499991], [-74.1477604, 40.58855595599992], [-74.14790576499993, 40.58855634599993], [-74.14805282699994, 40.588570806999904], [-74.1481980769999, 40.588599680999934], [-74.14833787899993, 40.588642607999915], [-74.14846882599996, 40.588698540999886], [-74.14858798599987, 40.58876582799994], [-74.14869312199986, 40.5888423539999], [-74.14972777099995, 40.589492503999885], [-74.15096968899994, 40.59017657399992], [-74.152162103, 40.590836192999845], [-74.15235208199991, 40.59093696199996], [-74.15450856599989, 40.59213609399994], [-74.15537259699995, 40.59259733799994], [-74.1561030049999, 40.59304747599991], [-74.15636568699993, 40.5931951279999], [-74.15795821599993, 40.59408704499986], [-74.15800268899991, 40.59412020399985], [-74.1584322029999, 40.59435961999991], [-74.15891672599996, 40.59462968499985], [-74.15989227899996, 40.595170140999855], [-74.16025756099997, 40.59534393799988], [-74.16180204399988, 40.59530144799985], [-74.16189940599996, 40.59529877099993], [-74.16188699199998, 40.59500712699986], [-74.16188546199997, 40.5949903349999], [-74.16188841099995, 40.59483745799984], [-74.16190818299995, 40.59468531299989], [-74.16194448999997, 40.594535495999885], [-74.16200333499995, 40.59432685099992], [-74.16208738699994, 40.594083113999865], [-74.1621900049999, 40.5938431059999], [-74.1623107339999, 40.59360803399994], [-74.16244891299996, 40.59337908599984], [-74.16260370599998, 40.5931573659999], [-74.16279187799998, 40.59295768699991], [-74.16299668999994, 40.59276682799989], [-74.16321702299987, 40.59258595999989], [-74.16345157099991, 40.592416147999856], [-74.16369888199995, 40.59225833899993], [-74.16363304299993, 40.59240052699992], [-74.16362405299995, 40.59241993699985], [-74.16356570299993, 40.592586526999874], [-74.16352460800002, 40.59275663099986], [-74.16350123699995, 40.59292868299986], [-74.16349571699995, 40.59310106099989], [-74.163507855, 40.59327217899987], [-74.16360268199993, 40.593374198999854], [-74.16439050499997, 40.59348246099993], [-74.166390049, 40.59373792599991], [-74.167784501, 40.59418566599993], [-74.16886362399997, 40.59472808699995], [-74.16828458099997, 40.59643316499995], [-74.1679964909999, 40.597922359999885], [-74.16762086799996, 40.599849696999925], [-74.16719634899995, 40.602075311999926], [-74.16900518099992, 40.60227337499987], [-74.17062978699994, 40.60243131199995], [-74.1709288839999, 40.60245585699987], [-74.17122684699993, 40.60249861199986], [-74.17152081799995, 40.602559508999875], [-74.17180796899991, 40.60263814499992], [-74.1720855709999, 40.602733770999926], [-74.172351093, 40.60284533499991], [-74.17260229799992, 40.602971490999934], [-74.17488959499995, 40.60221657299994], [-74.17582749599997, 40.60152685299988], [-74.17822457299994, 40.5998280609999], [-74.17932277499995, 40.59676057899984], [-74.18183084799989, 40.59409424599988], [-74.18468224999998, 40.59147895099995], [-74.18683246699995, 40.5890713609999], [-74.18730248699987, 40.588488221999896], [-74.185371048, 40.58745101499987], [-74.18551828799991, 40.58743794299994], [-74.18566449699989, 40.58741932799991], [-74.18580931799991, 40.58739521799987], [-74.18595239599988, 40.587365671999876], [-74.18609337999993, 40.58733075999993], [-74.18623192299994, 40.5872905709999], [-74.18636768699997, 40.587245200999895], [-74.18650033699991, 40.58719476299993], [-74.18681414999996, 40.58710057399991], [-74.18705055599993, 40.587083020999955], [-74.18719250099991, 40.58704623999991], [-74.18733173099997, 40.587003856999935], [-74.18746786899996, 40.586955989999886], [-74.18760054199991, 40.58690276699988], [-74.18772938699996, 40.58684433499992], [-74.18785405399997, 40.58678085299987], [-74.18797420199998, 40.58671249399986], [-74.18808950399989, 40.586639443999914], [-74.18819964399991, 40.586561903999936], [-74.1883043219999, 40.586480084999884], [-74.18859601799987, 40.586106195999946], [-74.18877046599995, 40.586005800999864], [-74.18895013099997, 40.58591090399989], [-74.18913471499995, 40.58582166299985], [-74.18932391199996, 40.58573822599987], [-74.18951740799994, 40.58566073099988], [-74.18971488199998, 40.58558930699995], [-74.19078902199995, 40.58518836699991], [-74.19131783599987, 40.585704488999966], [-74.19226048499998, 40.5852069689999], [-74.1923211319999, 40.5849132419999], [-74.19251747899993, 40.585158981999875], [-74.193324197, 40.585038280999875], [-74.19423261399992, 40.58514680599991], [-74.19964981299998, 40.58226262599991], [-74.20048848899994, 40.5799497779999], [-74.20051512399985, 40.579960381999875], [-74.2005382919999, 40.579966845999884], [-74.20055646999992, 40.57996640299996], [-74.20058554299995, 40.579961575999945], [-74.20062395199992, 40.57994860899994], [-74.20065720799997, 40.57993400299995], [-74.20069287199986, 40.57991832299988], [-74.20073234099989, 40.5799105679999], [-74.200797772, 40.579904826999915], [-74.200851071, 40.57991170499991], [-74.20094091499986, 40.57991956299993], [-74.20103374199996, 40.57992585099987], [-74.20109537699989, 40.579927500999915], [-74.20115662599996, 40.57993156499993], [-74.20121027499995, 40.57993503899993], [-74.20125254599999, 40.57993721699993], [-74.20128744299997, 40.579941655999875], [-74.2013187079999, 40.57994725599987], [-74.20135420199988, 40.5799583649999], [-74.2013805979999, 40.57997327799995], [-74.20140358699999, 40.57999220499992], [-74.20143434499994, 40.58002080599988], [-74.2014525309999, 40.5800347179999], [-74.20148133499991, 40.58004855599993], [-74.20154141399996, 40.580082349999884], [-74.20158593699988, 40.580103048999874], [-74.201626822, 40.58011151499991], [-74.2016748199999, 40.58011480599988], [-74.20173840199996, 40.58011683599987], [-74.20176039899995, 40.58011715299987], [-74.20179998599995, 40.58012471499987], [-74.20184248899996, 40.58014407399991], [-74.20187663199988, 40.580161496999885], [-74.20191105199993, 40.58017458399995], [-74.20195345799995, 40.58018581899987], [-74.20200397499998, 40.58018899599993], [-74.20204828299998, 40.58018625699991], [-74.20210029899994, 40.58018503899992], [-74.20214420399996, 40.58019190599988], [-74.2021713749999, 40.58020105299987], [-74.20230969599996, 40.580239456999934], [-74.20240475199986, 40.580257130999875], [-74.20251156099994, 40.580279916999906], [-74.20254855399999, 40.58028665799987], [-74.20260239099991, 40.58029205299991], [-74.20264545999996, 40.58029656099989], [-74.20269703699992, 40.580304951999935], [-74.20276536999991, 40.58031819799994], [-74.20281236899989, 40.580324427999884], [-74.20285677399994, 40.58032983999995], [-74.20300418199997, 40.58035008299991], [-74.20309425099991, 40.58036082099994], [-74.20314675299993, 40.58036531099985], [-74.20319223099993, 40.58036874499986], [-74.20323381699988, 40.58037045599987], [-74.20327432799998, 40.580374143999904], [-74.20332116299994, 40.580385643999925], [-74.20337531899995, 40.580402016999905], [-74.20343081399989, 40.58041929399991], [-74.20346962599996, 40.58043264699992], [-74.20350663899988, 40.580436159999884], [-74.20354150699988, 40.580436097999936], [-74.20356291499995, 40.58043415399991], [-74.20366188299988, 40.580420565999894], [-74.2037591199999, 40.5804010189999], [-74.20385400899988, 40.58037563699988], [-74.20394595099991, 40.580344580999906], [-74.20403100999988, 40.580333158999906], [-74.20420118899996, 40.580322231999894], [-74.20437042899988, 40.5803047879999], [-74.20453830399995, 40.58028087099992], [-74.20456367299995, 40.58028061599988], [-74.2045886649999, 40.5802772819999], [-74.2046126399999, 40.580270952999875], [-74.20463498599996, 40.580261791999895], [-74.20465513199991, 40.58025003199989], [-74.20467256099992, 40.58023597499986], [-74.20468682999994, 40.58021997899994], [-74.20469757199993, 40.58020245399992], [-74.20470451399991, 40.580183847999876], [-74.20476467899992, 40.5801428909999], [-74.20482987599989, 40.580106686999926], [-74.20489946199996, 40.580075591999915], [-74.20497275099989, 40.580049913999886], [-74.20504901899987, 40.58002990699992], [-74.20512751399997, 40.580015766999956], [-74.20520746099992, 40.5800076339999], [-74.20523194099997, 40.580010506999926], [-74.20525670800001, 40.58001031599985], [-74.20528110699988, 40.58000706799989], [-74.20530449199997, 40.58000084699988], [-74.20532624599998, 40.579991818999915], [-74.20534579299994, 40.579980220999836], [-74.20536261699996, 40.579966361999915], [-74.2053762709999, 40.5799506069999], [-74.2053863959999, 40.57993337199984], [-74.20543842599989, 40.57990221299989], [-74.20549524799993, 40.5798763739999], [-74.20555593099994, 40.57985627799989], [-74.20561948299995, 40.57984225399984], [-74.20568486299997, 40.57983453099987], [-74.20575100199994, 40.57983323599993], [-74.20583829199992, 40.57984126099989], [-74.2059328709999, 40.5798924379999], [-74.205950418, 40.57995433999984], [-74.20596154297344, 40.580046993882775], [-74.20598641215831, 40.58007698896933], [-74.206003098644, 40.58020374451813], [-74.20601270293663, 40.58025256025641], [-74.20601164437174, 40.58027822941258], [-74.20599824576975, 40.58030169740582], [-74.20598907320168, 40.580318126254994], [-74.20598602922253, 40.580338538196315], [-74.20598768121006, 40.580366848459654], [-74.20599414424598, 40.58039520069104], [-74.20599255081491, 40.5804103839359], [-74.20598341988727, 40.5804239333732], [-74.20594660290547, 40.58045087268133], [-74.20592159850466, 40.580469002521866], [-74.20591861496264, 40.580485222586766], [-74.20591753329506, 40.58051246237593], [-74.2058970544074, 40.58053231652651], [-74.20589079815034, 40.580555207968146], [-74.205820692153, 40.58060282864582], [-74.2057755076905, 40.5806380821521], [-74.20576494221854, 40.58065581116426], [-74.20575982767907, 40.58067672805645], [-74.20575734259258, 40.58070605258599], [-74.2057549623511, 40.58072804280349], [-74.20575332946562, 40.58074584527761], [-74.20576270054559, 40.580763216256166], [-74.20577197243135, 40.58078740068532], [-74.20577441108945, 40.58080890464438], [-74.20576787123194, 40.5808334807646], [-74.20574692749514, 40.580855837444304], [-74.20574262948877, 40.58086785251191], [-74.20574379921223, 40.580882010882334], [-74.2057420614763, 40.58090714934314], [-74.20573808837854, 40.5809443222968], [-74.20572403289702, 40.58096568893218], [-74.20569702651666, 40.58097961010295], [-74.20565901048455, 40.58099448746782], [-74.20561757191867, 40.581008287361946], [-74.20557469907166, 40.58102626850585], [-74.20544302999238, 40.58105345690725], [-74.2054173705693, 40.581069486480324], [-74.20541159080935, 40.581091130787414], [-74.2054067987052, 40.58112048355695], [-74.20539291124268, 40.58113787151845], [-74.20537706597383, 40.58114039319174], [-74.20535699520654, 40.581146311210425], [-74.20532229370895, 40.58116907939564], [-74.20528796822211, 40.58120288159002], [-74.20527220884874, 40.58122913856347], [-74.20526958813123, 40.58125844908295], [-74.2052693620202, 40.58129433506051], [-74.20527202154237, 40.58135114237636], [-74.20526700378379, 40.58137387509614], [-74.20524920561914, 40.581404036139375], [-74.20521287714367, 40.58144284734671], [-74.20516545262045, 40.5814746998999], [-74.20513750637808, 40.5815045113187], [-74.20512521495195, 40.58152628417256], [-74.20512231077548, 40.581547318379506], [-74.20511158049024, 40.58157237186299], [-74.20508136987225, 40.58159946880262], [-74.20506947324093, 40.581632826307484], [-74.20506822436222, 40.581659900026324], [-74.20507853137714, 40.581686193370565], [-74.20508976059689, 40.58169151635698], [-74.2051080040074, 40.58169896450181], [-74.20512209441733, 40.58172298223061], [-74.20512367296969, 40.5817812193346], [-74.20511888390284, 40.581818629769494], [-74.20509095824308, 40.581853408567596], [-74.20507422735601, 40.581882290764085], [-74.20507012398778, 40.581914890524736], [-74.20510186514834, 40.58198215692221], [-74.20512510854586, 40.58202005089318], [-74.20513077033327, 40.582038205882334], [-74.20513225919491, 40.58206652147029], [-74.20512670482992, 40.582083628816626], [-74.20510505123276, 40.582106643192574], [-74.20509671037522, 40.58212909904501], [-74.20509542302041, 40.582165967465954], [-74.20509339544918, 40.58219054972914], [-74.20508854474977, 40.58220819107532], [-74.20506897543812, 40.582225322262474], [-74.20505645907878, 40.58225740345466], [-74.2050551441379, 40.58228572454965], [-74.20504263125663, 40.58231887289908], [-74.20503506784873, 40.58236590499715], [-74.20501903173691, 40.582393183520814], [-74.20500227903955, 40.58241458503253], [-74.20499119588473, 40.58245681563508], [-74.20498291791678, 40.58249957364146], [-74.20498022302412, 40.582534843320424], [-74.20496559453855, 40.58256372107799], [-74.20488662232019, 40.58263439150841], [-74.2048768754869, 40.58265578050752], [-74.20486430388429, 40.58266969383118], [-74.20483141014492, 40.582684178643454], [-74.20480198335079, 40.582685834194976], [-74.20477815309634, 40.58268480833289], [-74.20476976291052, 40.5826912351574], [-74.20476280082798, 40.58270620731277], [-74.20476216027058, 40.58272597764913], [-74.20476221924581, 40.582745213156144], [-74.20475597011422, 40.582764459402675], [-74.20473569721067, 40.582780524117794], [-74.20472240233877, 40.58278695967866], [-74.2047091190272, 40.58279766940677], [-74.20470286889555, 40.582816380896766], [-74.20470294422896, 40.58284095890195], [-74.2047163529982, 40.582871389763234], [-74.20472623268154, 40.5828938137903], [-74.20474594990972, 40.582924766989535], [-74.20475094130767, 40.58295254208531], [-74.20474959018405, 40.58296910783595], [-74.20473981443627, 40.58298088015733], [-74.20472511173142, 40.58298518171855], [-74.20471181593868, 40.58299161727955], [-74.20470483416038, 40.58300017809808], [-74.20470347483324, 40.583014071426284], [-74.20470352560267, 40.58303063518114], [-74.20471128061838, 40.58304558278611], [-74.20472604415846, 40.58306105047994], [-74.20473588871609, 40.583071719500325], [-74.20474573327542, 40.58308238801734], [-74.20475417505162, 40.58309305853082], [-74.20475561223768, 40.58310427678487], [-74.20474934341483, 40.58311711169745], [-74.2047445073956, 40.58314009485838], [-74.20474316697732, 40.58315986761382], [-74.20473901192635, 40.58317590193004], [-74.20472712204311, 40.5831839390858], [-74.20470539425226, 40.58318290895939], [-74.20466404415026, 40.58318191378417], [-74.20463814971185, 40.583193714808], [-74.2046241736578, 40.58320656293811], [-74.20461932144067, 40.583224203762704], [-74.20461938037161, 40.58324343809621], [-74.20461943766831, 40.58326213901755], [-74.20460617051465, 40.58327765697892], [-74.2045970827756, 40.58328515337046], [-74.20458940764408, 40.58329585309735], [-74.20458104289362, 40.583310829413534], [-74.20454341730591, 40.58338195838172], [-74.20453023988733, 40.583426862754415], [-74.20451503396664, 40.58349634887388], [-74.20451027225019, 40.58354284236165], [-74.20449984308463, 40.58357011082869], [-74.20447402884271, 40.58360809223264], [-74.20442721397755, 40.58365359003326], [-74.20440076433692, 40.58371294584188], [-74.20439877211804, 40.58374874716517], [-74.20439752718507, 40.583800043334854], [-74.20440188742126, 40.58385079477768], [-74.20441389194124, 40.58388015932912], [-74.2044470555811, 40.58395383355967], [-74.20445697556904, 40.58398961536097], [-74.20446835234766, 40.58404302457249], [-74.20448598348868, 40.58407932556044], [-74.20453808215798, 40.58415670784161], [-74.20461476082346, 40.58425167683368], [-74.20463030601356, 40.58429332454314], [-74.20463390208104, 40.5843232388013], [-74.20462977804404, 40.58434942720774], [-74.20460253447358, 40.584378328049965], [-74.20442145408362, 40.584519172555986], [-74.2043977140958, 40.58454806711535], [-74.20437680805169, 40.58458657384673], [-74.20436433899089, 40.584634149370665], [-74.20436167594352, 40.58468010435888], [-74.20436741459896, 40.584723372637235], [-74.20439629985479, 40.58477301110756], [-74.20441392548736, 40.58480717510365], [-74.204424569888, 40.584850434650846], [-74.20442328538282, 40.58488837239203], [-74.20441781684238, 40.58493379828689], [-74.20441939116981, 40.5849898977091], [-74.20444200119024, 40.585050232886786], [-74.20443857102863, 40.58507428404445], [-74.20442602919894, 40.585097815150746], [-74.20441210120488, 40.58512722633832], [-74.20441081363548, 40.58516409524352], [-74.2044221001769, 40.58519629868874], [-74.2044004957285, 40.585456911678804], [-74.20441040927199, 40.58549002072008], [-74.20441471663784, 40.585523675327394], [-74.20440428309311, 40.58554933968978], [-74.2043636722888, 40.585561701582], [-74.2043412730567, 40.585570289797026], [-74.20432588794984, 40.585581002712374], [-74.20431982332869, 40.58559826957136], [-74.2043189388622, 40.58560078425905], [-74.20431867099312, 40.58560760721997], [-74.20431828965745, 40.585617349254726], [-74.20431854925825, 40.58561845381977], [-74.20432254891573, 40.5856355079445], [-74.20434224520208, 40.58565898271225], [-74.20435071667102, 40.58567927159017], [-74.20435009526345, 40.58570491849559], [-74.20433621964578, 40.585751428174994], [-74.20430757734005, 40.585781399264775], [-74.20424528742339, 40.585808759236635], [-74.2041738351581, 40.58581957345847], [-74.20413954560352, 40.585836197053474], [-74.20411999295423, 40.58585920699764], [-74.20411940258332, 40.58589554107575], [-74.20414124971829, 40.58593504013657], [-74.20417076912078, 40.58596277116557], [-74.20420542329487, 40.5860135582314], [-74.20422356877546, 40.58604015115936], [-74.20425943665474, 40.58608122937394], [-74.2042749428259, 40.586110054126955], [-74.20427713544649, 40.586139436131056], [-74.20425570487673, 40.58623618316044], [-74.20425857092111, 40.58625648200864], [-74.20425865426664, 40.58628373175722], [-74.20425381709462, 40.586306180807014], [-74.20423984358409, 40.586320097721035], [-74.20422026477975, 40.58633509276627], [-74.20421541115921, 40.58635166523287], [-74.20420228531195, 40.586414202142414], [-74.20420240620957, 40.58645374030289], [-74.20421693369822, 40.58662068340185], [-74.20423545614075, 40.58671896233078], [-74.20423706725386, 40.58679107819999], [-74.20423708035298, 40.58679162499403], [-74.20424560837007, 40.58683007936899], [-74.2042457129535, 40.58686427469632], [-74.20424585675818, 40.58691129402538], [-74.20425040456472, 40.58702348818806], [-74.20425812875469, 40.587257499513534], [-74.20426533002895, 40.587320535042984], [-74.204292152031, 40.5873824661778], [-74.20435412247495, 40.58747960015626], [-74.20437820037156, 40.587560771251454], [-74.2043826647372, 40.58764518375068], [-74.20438579358988, 40.58775203789977], [-74.20438319127823, 40.58781722736447], [-74.20437917821558, 40.58788028165798], [-74.20438633322478, 40.58792835684866], [-74.20439762297147, 40.587952914893705], [-74.2044256759391, 40.587959275849784], [-74.2044901874033, 40.587969848118036], [-74.20454212228326, 40.58799326496621], [-74.2045646538937, 40.588027419694434], [-74.20457893934689, 40.58811502004493], [-74.20458065694802, 40.58821760368262], [-74.20455143291892, 40.588287115234415], [-74.20449833794214, 40.5883427761876], [-74.20443395174978, 40.58837281241694], [-74.20441023417295, 40.5884091871309], [-74.20440523678165, 40.588419602133186], [-74.20437829682214, 40.58842228554259], [-74.20435234806935, 40.588428423012125], [-74.20432814669547, 40.58843783568988], [-74.20430639795251, 40.58845024928142], [-74.20428773562212, 40.58846530204245], [-74.20427270354543, 40.588482555320375], [-74.20426173977556, 40.58850150633709], [-74.20425516381164, 40.58852160283994], [-74.20425316728853, 40.588542259195634], [-74.20425580839121, 40.588562873455004], [-74.20426123461236, 40.58859481624041], [-74.20426068074417, 40.58862702300179], [-74.2042439920589, 40.58864017779802], [-74.20422490770723, 40.58865127921354], [-74.20420385801572, 40.58866007692551], [-74.20418131762762, 40.58866637255661], [-74.20415692245034, 40.58872020425905], [-74.20413021376582, 40.588773393924285], [-74.20412195360132, 40.58882725073073], [-74.20412200974495, 40.58888147441249], [-74.20413038144704, 40.588935321209455], [-74.20414695389636, 40.58898805252939], [-74.20417149979477, 40.589038945078705], [-74.20420368247356, 40.58908730078406], [-74.20432302142383, 40.58913661747327], [-74.204574220731, 40.58871913982805], [-74.20470529848623, 40.58877237083056], [-74.20446810314508, 40.58918269561869], [-74.20443548401086, 40.58921839829688], [-74.204646089432, 40.589285745465865], [-74.20440892551585, 40.589706763811556], [-74.20420300609156, 40.58964297174176], [-74.2041007534238, 40.58984275741241], [-74.20385886609272, 40.590249525361656], [-74.20369974335807, 40.59019990647488], [-74.20394167611974, 40.589807396399316], [-74.20388550456514, 40.5897861107414], [-74.20265866972028, 40.59072214628492], [-74.20263401602924, 40.59069814942304], [-74.20260466555042, 40.59067745053108], [-74.20257136688997, 40.59066057754702], [-74.20253496935247, 40.5906479608263], [-74.20249640127933, 40.59063992216579], [-74.20245664637172, 40.59063666659586], [-74.20241671860074, 40.59063827715165], [-74.20237763634617, 40.590644712755164], [-74.20234039642337, 40.59065580926256], [-74.20230594865892, 40.59067128365125], [-74.20227517166538, 40.59069074123784], [-74.2022168883613, 40.590746953548624], [-74.20215374436117, 40.59080002731068], [-74.20208602968194, 40.59084971875003], [-74.20201405533584, 40.590895799627575], [-74.20246775956575, 40.59083882485734], [-74.2025862272926, 40.59087671114387], [-74.20305254911503, 40.59114054180979], [-74.20296340195651, 40.59123092277659], [-74.20245495063132, 40.59095112585197], [-74.202027339207, 40.59099907929197], [-74.20206727337371, 40.59114453377126], [-74.20208857970688, 40.59117859215291], [-74.20210693333235, 40.59121363537014], [-74.20211289703634, 40.591217990444136], [-74.20211784377658, 40.59122303174096], [-74.20212163976946, 40.59122862292027], [-74.20212418235339, 40.591234612770414], [-74.20212540276478, 40.59124083929775], [-74.20212526799746, 40.591247134107675], [-74.20212378169593, 40.591253326958885], [-74.20212098405622, 40.5912592503675], [-74.20211695073955, 40.59126474413673], [-74.20210582304722, 40.59128520454924], [-74.20209021838782, 40.5913038881921], [-74.20207060766732, 40.591320231239756], [-74.20202398004938, 40.591332929165844], [-74.20197947682976, 40.59134947438202], [-74.20193764229154, 40.5913696645379], [-74.20189898808032, 40.59139325270468], [-74.20187170905275, 40.59143112837132], [-74.20185112965837, 40.591471388735236], [-74.2018376001094, 40.59151334868536], [-74.2018282943085, 40.59154386227341], [-74.2018257314502, 40.591575128655975], [-74.20182998202394, 40.591606287991794], [-74.20184092914558, 40.591636483381876], [-74.2018582717722, 40.59166488443563], [-74.20188153297842, 40.5916907101064], [-74.20192266920789, 40.591715255029854], [-74.20195886491075, 40.59174396877873], [-74.2019893996557, 40.59177627984606], [-74.20200349813028, 40.591780764795], [-74.20230284591744, 40.5914693217743], [-74.20231743569836, 40.59147698486388], [-74.20228727877038, 40.59150864109828], [-74.2023164576832, 40.59152396510266], [-74.20230864003041, 40.59153252120722], [-74.20228057909593, 40.59151634116633], [-74.20210009097973, 40.59170390185628], [-74.20202032457773, 40.59178671501954], [-74.20205960871606, 40.59180885418954], [-74.20200944557338, 40.59186029996112], [-74.2019436762175, 40.59182367412003], [-74.20175478948575, 40.592017324818435], [-74.201824436096, 40.59205295636962], [-74.20178248226532, 40.59209513428535], [-74.20172160160581, 40.5920530216791], [-74.2013033939439, 40.59253148864053], [-74.20128925984358, 40.59252433525516], [-74.20092540496347, 40.59286637930488], [-74.200748808064, 40.59275033941975], [-74.20068976791988, 40.59274995343729], [-74.20063127854338, 40.59275609877191], [-74.20057457669009, 40.59276864548078], [-74.2005208613197, 40.59278732826419], [-74.2004712682456, 40.59281175207506], [-74.20042684611835, 40.59284140047192], [-74.20042886474769, 40.59288645457012], [-74.2004234595963, 40.59293134624284], [-74.20041071589982, 40.5929753674559], [-74.20039083463888, 40.5930178239023], [-74.20036412936977, 40.59305804595363], [-74.20033102128066, 40.59309539922136], [-74.20029203254796, 40.59312929456295], [-74.20022540741584, 40.59316618693115], [-74.20015656826536, 40.59320063639575], [-74.20004403597565, 40.59328578496619], [-74.19993703426019, 40.5933749804701], [-74.19983581328245, 40.59346801439222], [-74.19974060969567, 40.59356466924327], [-74.19965164608844, 40.59366471906851], [-74.19956913046464, 40.59376792997536], [-74.19949325575736, 40.59387406068025], [-74.19942419937705, 40.59398286307282], [-74.19936212279688, 40.59409408279548], [-74.19938898826084, 40.59413827009382], [-74.19942322768752, 40.59417938809712], [-74.19946424899246, 40.59421672575841], [-74.19947352134893, 40.59422115240753], [-74.19948165559656, 40.59422672975697], [-74.19948840886074, 40.594233291276836], [-74.19949357950024, 40.59424064105151], [-74.19949701312818, 40.59424855962953], [-74.19949860722171, 40.59425681057569], [-74.19949831418322, 40.59426514753086], [-74.19949736363506, 40.59428427800823], [-74.19949236458696, 40.594303039103316], [-74.19948344880574, 40.59432093629295], [-74.19947085129925, 40.594337497824924], [-74.19945632117715, 40.59435115761505], [-74.19943168321554, 40.59438458967391], [-74.19939999862336, 40.5944143735898], [-74.1993621758987, 40.594439655354826], [-74.19932799056618, 40.59445624324398], [-74.19929116182526, 40.59446913040079], [-74.1992108242351, 40.59454360947802], [-74.19902465726125, 40.59467644801813], [-74.19894864455006, 40.59478000776039], [-74.19889498982688, 40.59487881648165], [-74.19888888242043, 40.594904756789106], [-74.19887443541094, 40.594944927760366], [-74.19886101146594, 40.594952638759565], [-74.19879713413988, 40.59495018658111], [-74.1987714026433, 40.5949638974913], [-74.19876805458141, 40.59496817478595], [-74.1987323255373, 40.59501179831048], [-74.19869662340403, 40.59506396411391], [-74.19867324216078, 40.595114400808036], [-74.19865548667394, 40.59517251436708], [-74.19863211254362, 40.59522551307075], [-74.19862556263999, 40.59528360775762], [-74.19863022280653, 40.59534339203769], [-74.1986281079241, 40.59538610318732], [-74.19860922087038, 40.595440801926415], [-74.19858473171841, 40.59549551201839], [-74.19856137143587, 40.59555278101238], [-74.19852902294922, 40.595602378432076], [-74.19849556327543, 40.59565539452864], [-74.19845423987307, 40.595701590661854], [-74.19842750755885, 40.5957554493536], [-74.19840296649916, 40.59579307465476], [-74.19835042032791, 40.59583331199777], [-74.19830796614374, 40.595876092257], [-74.19825315828169, 40.595909501097005], [-74.19822305871897, 40.59596165540639], [-74.19819183483902, 40.59601295975829], [-74.19815500349986, 40.596062564800974], [-74.1981204131753, 40.596112165968044], [-74.19808246637238, 40.59616348187958], [-74.19804451037392, 40.59621223576351], [-74.19800880011675, 40.59626183715075], [-74.19800105800269, 40.59629601782259], [-74.19799668454347, 40.59633275472038], [-74.1979654616297, 40.59638405733148], [-74.1979622670406, 40.59644043839561], [-74.19795002851592, 40.59647035480373], [-74.19791431640616, 40.59651910477752], [-74.19788395473405, 40.596548332681856], [-74.19787729703556, 40.59655474226969], [-74.19787520651842, 40.596556754549454], [-74.1978729711544, 40.59655846619547], [-74.19783497175446, 40.59659269895008], [-74.19780037992399, 40.59664144528383], [-74.19776795444966, 40.59666541828954], [-74.19772992710946, 40.596690254488315], [-74.19768636210588, 40.59673645419567], [-74.19763717716219, 40.596776683749475], [-74.19760471617818, 40.59678869984606], [-74.1975935096188, 40.59678871911552], [-74.19755768499311, 40.596799882895525], [-74.1975487296359, 40.596803316062214], [-74.19751847587472, 40.59680336806573], [-74.19751357718701, 40.59679898603677], [-74.19751448668937, 40.59734918605724], [-74.19752237639196, 40.59736454836389], [-74.1975145700716, 40.59737737394275], [-74.19747652740341, 40.597396230279735], [-74.19745761291965, 40.59744238753408], [-74.19745442542755, 40.597501330595534], [-74.19745235168168, 40.597557709712724], [-74.197454761376, 40.59761493418693], [-74.19748291970386, 40.59766357375691], [-74.19748864223308, 40.59770370887348], [-74.19749654625022, 40.59772419571973], [-74.19748090154937, 40.597738742563074], [-74.19743279194556, 40.597764450720845], [-74.19738360796272, 40.59780553606761], [-74.19737584196214, 40.59783202796156], [-74.19736144895344, 40.59789099026308], [-74.19734368335155, 40.59794654041523], [-74.19731244404159, 40.597992719476686], [-74.19729907669395, 40.59802007571798], [-74.1973059170801, 40.59805935586228], [-74.1973340858026, 40.598111411544835], [-74.19737568141731, 40.598156610293344], [-74.19741728170408, 40.59820351882564], [-74.19743845280497, 40.59846063769394], [-74.19833088558589, 40.600656979597765], [-74.19875958205294, 40.60171197517623], [-74.19918333889221, 40.602358736987064], [-74.20014866759907, 40.603683350098635], [-74.20138527472514, 40.60463696620847], [-74.20221849851052, 40.605969679616436], [-74.20281628374593, 40.608270827967345], [-74.20273927047037, 40.60883221126093], [-74.20267299169078, 40.60982786123189], [-74.20230179014108, 40.61187564203906], [-74.20244374449518, 40.61328469393197], [-74.20064229730261, 40.61603323707614], [-74.2003834842897, 40.616428098243766], [-74.20058986446027, 40.617028927389455], [-74.20069001303489, 40.6170415714279], [-74.20076290801349, 40.617053401544396], [-74.20080892377666, 40.617072967329534], [-74.20082804386193, 40.617094288048285], [-74.2008304096492, 40.61713528402795], [-74.20083723821055, 40.61716943818839], [-74.20084742522633, 40.61720273241604], [-74.20084535241513, 40.61725911148558], [-74.20084328605802, 40.61731719833676], [-74.20084680818461, 40.617370150367776], [-74.20086267588432, 40.61742820588297], [-74.20087629624591, 40.61748455752935], [-74.20087646075417, 40.617539223219325], [-74.20087662783489, 40.617594743638776], [-74.20089136968642, 40.61765109282013], [-74.20089938404898, 40.61770659952501], [-74.20090739710211, 40.61776210505858], [-74.20091423238277, 40.61779882239855], [-74.20090986705057, 40.61783812184212], [-74.20087858490696, 40.61787234209637], [-74.20087301283809, 40.61788345734883], [-74.20089110022624, 40.617933820892574], [-74.20089346564374, 40.61797481737089], [-74.2009002735371, 40.61800213820937], [-74.20089138557003, 40.6180286322463], [-74.20087690516628, 40.61805940754891], [-74.20087478740122, 40.61810041085589], [-74.20084680817138, 40.61811498084624], [-74.20081543372865, 40.618119305979896], [-74.20078290449888, 40.618111675720286], [-74.2007637976405, 40.6180946254613], [-74.20074009349516, 40.618040000380496], [-74.20070855668939, 40.61798966046441], [-74.20069507526787, 40.61797943372331], [-74.20064125204006, 40.6179735500668], [-74.20058410068826, 40.617978774357205], [-74.20055275649818, 40.6179924942406], [-74.20054156331808, 40.61799763949357], [-74.20048674969225, 40.61803531795103], [-74.20043867109608, 40.61807554666407], [-74.20041529080609, 40.61812854728366], [-74.20038742362465, 40.618180698137294], [-74.20036292502164, 40.618234553753965], [-74.20034850652021, 40.61828582926975], [-74.20035203856249, 40.6183421985547], [-74.20036566101716, 40.61839940230609], [-74.20039607974422, 40.61845059899734], [-74.20042313487245, 40.61850094798325], [-74.20044231269767, 40.61854191414937], [-74.20048393619727, 40.61859138298328], [-74.20051657149038, 40.61863403463199], [-74.20056712603832, 40.61867152928309], [-74.20063669653429, 40.61869532553015], [-74.20070737819523, 40.61871655559208], [-74.20077247709379, 40.618744629382356], [-74.20080841793948, 40.61876762952103], [-74.20083991450633, 40.61880430260727], [-74.2008344149703, 40.61883933370438], [-74.20081542374747, 40.61886072032839], [-74.20075835642854, 40.618894132527224], [-74.20071136905621, 40.61892496457095], [-74.2006979927439, 40.61894975863334], [-74.20069592745396, 40.61900869919873], [-74.20069049525623, 40.619065938183596], [-74.20068053886425, 40.61911037192587], [-74.20068071349013, 40.61916845485066], [-74.20069092927473, 40.619210291352054], [-74.20070789218401, 40.61925980264958], [-74.20071472324886, 40.61929481103738], [-74.20073954753296, 40.61934943365837], [-74.20075311533593, 40.619387848713856], [-74.20075316068288, 40.61938801381847], [-74.20075764740828, 40.61940406969274], [-74.20077574921811, 40.61945955827678], [-74.20079832794164, 40.61951247751582], [-74.20082091698058, 40.619568813491085], [-74.20085806260202, 40.619619997298756], [-74.20089632653438, 40.61967032658365], [-74.20093569892526, 40.61971638192252], [-74.20096499633247, 40.61976758159085], [-74.2009729628065, 40.619806859469776], [-74.20097089773077, 40.61986579936476], [-74.20097552827605, 40.61991447794746], [-74.20099363018717, 40.61996996699726], [-74.20101618955653, 40.62001605287505], [-74.20102868350264, 40.620070697493205], [-74.20103548328741, 40.620095455805206], [-74.20102657539782, 40.620115117536365], [-74.20100533126885, 40.62013309136913], [-74.20099525859429, 40.62013823520794], [-74.20098303339508, 40.6201732768937], [-74.20098217389514, 40.62019625184807], [-74.20098095847078, 40.620228800715154], [-74.20098449202942, 40.62028516996776], [-74.2009868438432, 40.620321893960075], [-74.2010037523626, 40.62035346912193], [-74.20104077573244, 40.62036365348459], [-74.2010688259972, 40.62037214674219], [-74.2010699746938, 40.620381540777615], [-74.20105206983467, 40.62039182169896], [-74.20099715575674, 40.62039618804552], [-74.20092318554512, 40.620400588846124], [-74.20084920460141, 40.62040157235658], [-74.20077407925909, 40.6203948700693], [-74.20070002640486, 40.62037193646621], [-74.20064051727076, 40.620339582561094], [-74.20057989124972, 40.62030808480545], [-74.20053613507298, 40.62029534783707], [-74.20050588129898, 40.62029967210122], [-74.20046674061955, 40.62033049085503], [-74.20045783099043, 40.62035015204183], [-74.20046240094837, 40.620378331033535], [-74.2004905276734, 40.620412448564615], [-74.20050515347535, 40.620430359238036], [-74.20049514742536, 40.6204577110937], [-74.20047052940691, 40.62047227562743], [-74.20043245103147, 40.62048429891995], [-74.2004280019192, 40.62049541101681], [-74.2004370934674, 40.620536394761025], [-74.20045955296372, 40.620550021963794], [-74.20052688004162, 40.62057296745373], [-74.20056725122792, 40.62057802157745], [-74.2006412284865, 40.620576184693725], [-74.20071518908162, 40.62056836900845], [-74.20077347485226, 40.62056655943544], [-74.20084750825812, 40.6205826573301], [-74.2008733158235, 40.620591155726274], [-74.20087674494054, 40.62061335623617], [-74.20087689917773, 40.62066460634049], [-74.20089935755497, 40.62067737922776], [-74.20092966672648, 40.62069184735474], [-74.20092969500968, 40.620701242846934], [-74.20092192004205, 40.62072517341098], [-74.20093094529145, 40.620743949054905], [-74.2009826019348, 40.6207746087449], [-74.20099047807766, 40.62078399101907], [-74.200986158669, 40.62083866452976], [-74.20100089721804, 40.62089415945369], [-74.20102119611141, 40.62093426882064], [-74.20106836913772, 40.62096493681455], [-74.20108983459889, 40.6210204199609], [-74.20112138194689, 40.621073322938194], [-74.20112483433921, 40.621103212152576], [-74.2011271819975, 40.62113823002875], [-74.20113848207161, 40.621168105512524], [-74.20114977443346, 40.62119541848165], [-74.20117906131713, 40.62124234611224], [-74.20119716912669, 40.62129954340837], [-74.20121079614697, 40.621357602272916], [-74.2012311382086, 40.62141223329329], [-74.20123130559404, 40.62146775368989], [-74.20123366361715, 40.62150618662762], [-74.20125847310123, 40.62155483087214], [-74.20128883426491, 40.621586381431754], [-74.20133145358044, 40.62159399488333], [-74.20138303786867, 40.62159988381704], [-74.20143239998035, 40.62161260896536], [-74.20143578875664, 40.6216211448395], [-74.20142240959545, 40.62164508475218], [-74.20140225479616, 40.62165280831418], [-74.20132939502028, 40.621654643728235], [-74.20130810779165, 40.62165809826718], [-74.2013014781412, 40.62169056765575], [-74.20129941204375, 40.621748654488464], [-74.20129622163314, 40.62180588972821], [-74.20128966370712, 40.62186142022304], [-74.20128300465908, 40.621883640559446], [-74.20126628533909, 40.62191527404903], [-74.20126518935844, 40.6219238177795], [-74.20125970678117, 40.621963973909246], [-74.20124305586253, 40.62201866901081], [-74.20123089203481, 40.62207421098946], [-74.20122657597591, 40.62212973923008], [-74.20123122680886, 40.62218525177478], [-74.20124484631499, 40.62224074861939], [-74.20126182328333, 40.622294530618895], [-74.20127768566681, 40.62235002353239], [-74.2012946695401, 40.622406368711225], [-74.20131276554288, 40.62245929518175], [-74.20132414578988, 40.622515648995446], [-74.20132319150866, 40.6225711718526], [-74.20131102145736, 40.62262415132081], [-74.20128760353833, 40.622665191912695], [-74.20127534263133, 40.622688276286034], [-74.20128435897738, 40.622704488885454], [-74.20130229725306, 40.62270531271301], [-74.20137624811906, 40.62269322412822], [-74.20145020839274, 40.622684552739756], [-74.20152419915728, 40.62268613202665], [-74.20154553334775, 40.62269805202311], [-74.20156132642177, 40.62273048378607], [-74.2015670984474, 40.62278599434843], [-74.20157400062897, 40.6228440637799], [-74.20158537726877, 40.622899565183864], [-74.20160235599974, 40.62295334762954], [-74.20161933837996, 40.62300883852891], [-74.20162847442838, 40.62306434318696], [-74.20163201104123, 40.623121565457346], [-74.2016321787644, 40.62317708584358], [-74.20163346671013, 40.62323260493476], [-74.20163139695073, 40.623289836366894], [-74.20162484432517, 40.62334707750371], [-74.20161267733178, 40.623401764786756], [-74.20159939399505, 40.62345730875961], [-74.20158494435559, 40.62349833368137], [-74.20156258549943, 40.623518873765526], [-74.20151667919954, 40.62353689041871], [-74.20144495652622, 40.62354470486809], [-74.20137209129265, 40.623544832522406], [-74.20134408905345, 40.62355256864429], [-74.20133404548383, 40.62356796088904], [-74.20133748521867, 40.62359357979315], [-74.2013801947626, 40.62363023425228], [-74.20140831691215, 40.62366178852963], [-74.20141176249858, 40.62368911688868], [-74.20139733073569, 40.623736121038014], [-74.20136497069723, 40.62378571911503], [-74.20132924492235, 40.62383446834302], [-74.20127892559044, 40.62387641076836], [-74.20122634786158, 40.623913232071956], [-74.20117823304412, 40.62394321152425], [-74.20113576602957, 40.62398684793748], [-74.2010989240153, 40.624037308010244], [-74.20107662790329, 40.624078346589776], [-74.20108128389592, 40.62413556808517], [-74.20109042715195, 40.62419363529246], [-74.20108835947418, 40.62425172210849], [-74.20110421636812, 40.62430550557715], [-74.20113912157518, 40.62435584063679], [-74.2011448901549, 40.6244104964828], [-74.20114394150578, 40.62446772777967], [-74.20113962867144, 40.624524109558074], [-74.20113418927706, 40.62457963974589], [-74.20111978609876, 40.624636039845775], [-74.20110537966264, 40.62469158571791], [-74.20108872991594, 40.62474628077798], [-74.2010709587324, 40.62480183253036], [-74.20105655441857, 40.624857378391575], [-74.20104439249307, 40.62491377506318], [-74.20103671160895, 40.624969309163575], [-74.20103015573068, 40.62502569435437], [-74.20102247739634, 40.62508208318255], [-74.20101367409276, 40.62513676618451], [-74.20100853518737, 40.62517392375305], [-74.20100599469657, 40.625192300278854], [-74.20099607727869, 40.62524954440204], [-74.20098504239097, 40.625307648059035], [-74.20097848041523, 40.62536232596601], [-74.20098195802754, 40.62540075693589], [-74.2010100798537, 40.62543231080371], [-74.20103706793152, 40.625459598004554], [-74.20105176402082, 40.62550057188019], [-74.2010609057428, 40.62555778435066], [-74.20106108071656, 40.62561586723568], [-74.20106236889201, 40.62567138564773], [-74.20106365794909, 40.625726904058006], [-74.2010615850543, 40.62578328257846], [-74.20105950832702, 40.62583795214059], [-74.20106080033608, 40.62589518001203], [-74.20107666274832, 40.6259506729334], [-74.20109587274136, 40.626001033773036], [-74.20113189608449, 40.62605051331071], [-74.20117014779946, 40.62609571627478], [-74.20118252353812, 40.62611021570943], [-74.20120831355544, 40.626111878368796], [-74.2012161553177, 40.626053771572145], [-74.20141670667907, 40.62607051389567], [-74.20139260637572, 40.62624889054192], [-74.20139258099198, 40.62624907671134], [-74.20098625499442, 40.62934414810753], [-74.2008047968127, 40.62933257144424], [-74.20075483895435, 40.62959463411348], [-74.20062123354481, 40.62958763810686], [-74.20061121332972, 40.629610718480016], [-74.20057987864897, 40.62962956454984], [-74.20052497747263, 40.62964076464405], [-74.2004768171585, 40.629657077504966], [-74.20045119063903, 40.6297100803016], [-74.20043565877464, 40.62976477328592], [-74.20042573785118, 40.629821165953366], [-74.2004236656081, 40.629877543932885], [-74.2004249542151, 40.62993306232537], [-74.20042510042924, 40.62998174919864], [-74.20042414785866, 40.63003812623056], [-74.2004231933758, 40.63009364735962], [-74.20042223823503, 40.63014916966209], [-74.20041343977793, 40.63020555986685], [-74.20040812771613, 40.63025010069453], [-74.20043065947087, 40.63025148374015], [-74.20043452432516, 40.63025172075748], [-74.2004340873544, 40.63023625624201], [-74.20046414832258, 40.630237690989155], [-74.20046497314343, 40.630252262233434], [-74.20047491385961, 40.6302530304447], [-74.20052900571375, 40.630257206431644], [-74.20052899588633, 40.63025393577904], [-74.20061528535054, 40.6302606252933], [-74.20061725250865, 40.63026567721769], [-74.20072423728168, 40.63027500781987], [-74.2007261630681, 40.63026608219535], [-74.2007286257561, 40.630261691547645], [-74.20073195150815, 40.63025764457701], [-74.20073606002079, 40.63025403900084], [-74.20074085209063, 40.63025096187887], [-74.20074621200907, 40.63024848751069], [-74.20075201035624, 40.630246675642184], [-74.20075810712619, 40.63024557002223], [-74.20076435510724, 40.6302451973471], [-74.2007689976836, 40.630245305811385], [-74.20077355840719, 40.63024597590625], [-74.20077792098232, 40.63024719054442], [-74.20078197416555, 40.63024891875351], [-74.200785614603, 40.630251116464954], [-74.2007887494656, 40.63025372763847], [-74.20079129881583, 40.630256685690526], [-74.20079319764672, 40.63025991519234], [-74.20079439753887, 40.630263333793486], [-74.20079486789567, 40.63026685432143], [-74.20079407663107, 40.630275153752514], [-74.2007872998309, 40.63034627446781], [-74.20078612299848, 40.630350226878434], [-74.20078422588257, 40.630354013218], [-74.20078164644988, 40.63035755771076], [-74.20077843632254, 40.63036078942092], [-74.20077465974444, 40.630363643672105], [-74.20076973879723, 40.63036637465731], [-74.20076430389027, 40.63036846483531], [-74.20075849749085, 40.63036985941536], [-74.2007524718044, 40.630370521840916], [-74.20074638478476, 40.63037043474747], [-74.20073858608478, 40.630368794944104], [-74.20073124932135, 40.6303661974001], [-74.20072457555139, 40.63036271329854], [-74.20071874766295, 40.63035843811795], [-74.2007139253638, 40.63035348901557], [-74.20071024080411, 40.63034800161688], [-74.20070779495533, 40.63034212629854], [-74.2007066548433, 40.63033602406799], [-74.20070685171133, 40.630329862151], [-74.20070838016382, 40.63032380940878], [-74.20040311643059, 40.630292362267326], [-74.20038928301837, 40.63037472640552], [-74.20037487473546, 40.63043027215239], [-74.20036382796738, 40.63048495730575], [-74.20035614844026, 40.63054134555402], [-74.20034398232109, 40.63059688738853], [-74.20033518820867, 40.630654986373095], [-74.20032975474884, 40.630712223762785], [-74.20032768364649, 40.63076945747148], [-74.2003222411613, 40.63082413285406], [-74.2003067104728, 40.63087882631436], [-74.20028669542474, 40.63093438131187], [-74.20027229016036, 40.630990781769896], [-74.20025788164706, 40.63104632749833], [-74.20024347054529, 40.631101018495954], [-74.20023018131249, 40.6311557075376], [-74.20021577082558, 40.63121039903252], [-74.20020248154825, 40.631265088070386], [-74.20018694655916, 40.631318927958624], [-74.20018695424578, 40.6313214904694], [-74.20018462159042, 40.63132866946418], [-74.20035346710812, 40.63137723655127], [-74.20036347745564, 40.63135675727859], [-74.20036791091931, 40.63135283394711], [-74.20037313669167, 40.631349524804016], [-74.20037901017413, 40.631346921413794], [-74.20038536884705, 40.631345095812705], [-74.20039203676454, 40.63134409851535], [-74.2003988294248, 40.6313439571169], [-74.20040555887397, 40.631344675530165], [-74.20041203890698, 40.63134623387633], [-74.20041809022051, 40.631348589035866], [-74.20042354537391, 40.6313516758412], [-74.20042825342215, 40.631355408879855], [-74.20043208409267, 40.63135968485808], [-74.20043493139015, 40.631364385459094], [-74.20043671652917, 40.6313693806163], [-74.20043739011423, 40.63137453211302], [-74.20041405776921, 40.631430844447806], [-74.2004117785669, 40.63143625814105], [-74.20040832722417, 40.63144129890702], [-74.20040380373979, 40.63144582069401], [-74.20039833917748, 40.631449692487756], [-74.20039209186776, 40.63145280210655], [-74.20038524282045, 40.63145505945216], [-74.20037799048004, 40.631456399120054], [-74.20037054497672, 40.63145678229455], [-74.20036312203683, 40.63145619787362], [-74.20035593673342, 40.63145466279015], [-74.20034919725371, 40.63145222152195], [-74.200343098868, 40.63144894480252], [-74.2003378182712, 40.63144492757146], [-74.2003335084633, 40.63144028622456], [-74.2003302943169, 40.63143515524033], [-74.20032826895856, 40.631429683284225], [-74.2003274910707, 40.63142402890096], [-74.20032798319177, 40.63141835592081], [-74.20032973106245, 40.631412828712904], [-74.20033268403984, 40.631407607422595], [-74.20033675656403, 40.631402843331756], [-74.2001726540772, 40.631361080530986], [-74.20015700674327, 40.63142916660896], [-74.2001381058405, 40.63148215761576], [-74.20010798593165, 40.63153260612368], [-74.20006776011, 40.631577946658005], [-74.20002079954769, 40.63162073620256], [-74.19997047608236, 40.63166353224651], [-74.19991789471179, 40.63170120597339], [-74.19986082809585, 40.63173888914792], [-74.19980488565277, 40.63177742339801], [-74.19975342724327, 40.63181595033311], [-74.19969860102778, 40.63185277480094], [-74.19967512075753, 40.6318741689966], [-74.19958138195453, 40.631943687757676], [-74.19922396189709, 40.632250661395354], [-74.19888910947763, 40.6325143578124], [-74.19883067612237, 40.63256853505975], [-74.19869022038306, 40.632698760933735], [-74.19856881854885, 40.63276814773782], [-74.19852346205487, 40.632783049024674], [-74.19850080496614, 40.63279791127553], [-74.1984835284849, 40.632828118936764], [-74.1984749664375, 40.63283290963337], [-74.19842463212467, 40.63287314131435], [-74.19838103570827, 40.63291677977717], [-74.19834081295598, 40.63296382798489], [-74.198335259167, 40.6329809201619], [-74.19835215694141, 40.63300822353622], [-74.19839937094993, 40.633049997522555], [-74.19840057855035, 40.633079035920225], [-74.19838273313529, 40.63311067139133], [-74.19837490082801, 40.6331158099516], [-74.19837451123031, 40.63311612792367], [-74.19834358263705, 40.63314148770751], [-74.19828426341229, 40.633175756719254], [-74.1982249336577, 40.63320746369747], [-74.1981599865825, 40.63323490883927], [-74.19809389789796, 40.633255521398304], [-74.19803227375793, 40.633269295570585], [-74.19795938941562, 40.63326685738021], [-74.19791561643243, 40.6332507038661], [-74.19785945083686, 40.63321492603911], [-74.1978032825518, 40.633178294628884], [-74.19774935751734, 40.63314165816059], [-74.19770944064285, 40.63311727343526], [-74.19770892162028, 40.633116957027795], [-74.19768982830384, 40.633105885532935], [-74.19762359861335, 40.63307866501908], [-74.19759109214782, 40.633081284581166], [-74.19756087372008, 40.63309927316573], [-74.19754747163212, 40.6331172345268], [-74.19754725355178, 40.63311755220139], [-74.19752514502034, 40.633149730620595], [-74.19748941010829, 40.633198478608854], [-74.19746144974295, 40.633221589508004], [-74.19739537162705, 40.63324562007614], [-74.19732704477023, 40.63326794432946], [-74.19728675222868, 40.63329193108205], [-74.19727448930175, 40.63331501399527], [-74.19728474265855, 40.6333705170167], [-74.1972871082701, 40.633412366556634], [-74.19726255931032, 40.633451700421], [-74.19722682789016, 40.633501303052284], [-74.19722689857569, 40.63352522054139], [-74.19724948428885, 40.633579847175056], [-74.19726870369098, 40.63363362585192], [-74.19728567947706, 40.63368740954743], [-74.19728584361084, 40.633742929877464], [-74.19727252112973, 40.6337873690232], [-74.19723678514949, 40.63383526387301], [-74.19719319610093, 40.63388231744665], [-74.19714960710607, 40.63392851677314], [-74.19710932737318, 40.63395677325026], [-74.19707345771366, 40.63395939675497], [-74.1970341703711, 40.63394408877805], [-74.19701172021942, 40.63393558661944], [-74.19693997159443, 40.63393827205498], [-74.1968861882006, 40.63394946798221], [-74.19684924611059, 40.63396917735558], [-74.19680564860418, 40.634012814042094], [-74.19677318194454, 40.63402909847446], [-74.19670031696526, 40.63403349463375], [-74.19662858901309, 40.63404301217345], [-74.19658156160821, 40.63406444649691], [-74.19652335974168, 40.63409871268364], [-74.19646965159124, 40.63413553368534], [-74.19642830481342, 40.634182583134894], [-74.19640266897571, 40.63423387772307], [-74.19639381410525, 40.63427318291348], [-74.19639167415882, 40.63430820799612], [-74.19638286583896, 40.63436288891421], [-74.19636957213456, 40.634417577994135], [-74.19635291542002, 40.634472272312514], [-74.19633289229948, 40.63452611931889], [-74.19625489591704, 40.63456079627186], [-74.19618464614511, 40.634625724563676], [-74.19620359550302, 40.634686050233725], [-74.19619879725332, 40.63473021017521], [-74.19616074043309, 40.63477810529293], [-74.19614123036082, 40.63479275899455], [-74.19611983392684, 40.63480696358221], [-74.19609834576855, 40.63482774869209], [-74.19603303929244, 40.63487718727505], [-74.19602261159346, 40.634910511483554], [-74.19603260182834, 40.634973358518344], [-74.19602904691446, 40.63499584880699], [-74.19596386706435, 40.63503051962415], [-74.1958835533078, 40.63506696183833], [-74.19580605679684, 40.63505839723762], [-74.19568609223377, 40.63501686464005]]]}}, {\&quot;id\&quot;: \&quot;23\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 24, \&quot;Shape_Leng\&quot;: 0.0469999619287, \&quot;Shape_Area\&quot;: 6.07235737749e-05, \&quot;zone\&quot;: \&quot;Bloomingdale\&quot;, \&quot;LocationID\&quot;: 24, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95953658899998, 40.798718525999895], [-73.96004456499999, 40.79804123499991], [-73.96147779999993, 40.79865415599994], [-73.96286980099991, 40.79923967699995], [-73.96571144299992, 40.80043806999986], [-73.96775900399992, 40.80130351599994], [-73.96787379699998, 40.80135169799993], [-73.96798415999996, 40.80139826599985], [-73.96858360799983, 40.801635469999916], [-73.97004742199996, 40.80226500999989], [-73.9702159479999, 40.802335850999924], [-73.97027400499987, 40.80235903599987], [-73.97032589799987, 40.80238456099995], [-73.97150381000002, 40.80283773599995], [-73.97250022199995, 40.80321661299996], [-73.97257779799997, 40.80324718399991], [-73.9726574479999, 40.80327651399991], [-73.97279907800002, 40.803329158999894], [-73.97287179090726, 40.8033561875739], [-73.97255429829634, 40.803798634650114], [-73.97217237241792, 40.8043190769591], [-73.97205095521862, 40.80453037600999], [-73.9719529243853, 40.80461970905157], [-73.97181849483539, 40.80471754320449], [-73.97179980150743, 40.80478561548601], [-73.97171200727101, 40.804931691276515], [-73.9716204956932, 40.80504229439937], [-73.97161113391445, 40.80509618747434], [-73.97144210961531, 40.80533442683979], [-73.9712908330033, 40.80552870753318], [-73.97110765876137, 40.80579013958964], [-73.97098767999996, 40.80574290299997], [-73.97084148399995, 40.80568534399987], [-73.97076362299994, 40.80565737299987], [-73.97069326499995, 40.80563026799993], [-73.96978722000001, 40.80530049699996], [-73.96860707399988, 40.804870949999895], [-73.96855913399985, 40.80485358399993], [-73.96849506699984, 40.80483226999993], [-73.96804849299988, 40.804683699999906], [-73.96680327299997, 40.80420756099992], [-73.96670106899995, 40.804168475999916], [-73.96659731599986, 40.804122764999946], [-73.96386126299988, 40.80297203799993], [-73.96107793999975, 40.801800357999845], [-73.95964685399987, 40.80115642299993], [-73.95848111500001, 40.800670477999894], [-73.95817297099987, 40.800582540999876], [-73.95833304999988, 40.80036505399987], [-73.95861879299989, 40.79997702599994], [-73.95907669099992, 40.79935223299986], [-73.95953658899998, 40.798718525999895]]]}}, {\&quot;id\&quot;: \&quot;24\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 25, \&quot;Shape_Leng\&quot;: 0.0471458199319, \&quot;Shape_Area\&quot;: 0.000124168267356, \&quot;zone\&quot;: \&quot;Boerum Hill\&quot;, \&quot;LocationID\&quot;: 25, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98155298299992, 40.689146163999936], [-73.98101786899988, 40.68893792699991], [-73.98092822899991, 40.68890247699988], [-73.9808430809999, 40.688761361999916], [-73.980691182, 40.68851581099992], [-73.98064972099985, 40.688459476999874], [-73.98012756199996, 40.68775000899993], [-73.97984055799984, 40.687344331999896], [-73.97959037699985, 40.68700390199995], [-73.97936297699995, 40.686682000999916], [-73.97909065799995, 40.68629386599988], [-73.97899402899994, 40.686156131999894], [-73.97827416099987, 40.685195951999944], [-73.97804289599988, 40.68485661499987], [-73.97838862599984, 40.68442334199987], [-73.97842970699993, 40.684355612999866], [-73.97876022499986, 40.6837654439999], [-73.97918390599999, 40.68312883799991], [-73.97961592499983, 40.682493556999916], [-73.98003510099997, 40.68185262699988], [-73.98046155400003, 40.68122254699992], [-73.98088932299994, 40.6805933489999], [-73.98132413699994, 40.67995210099991], [-73.98175642299985, 40.67931462399987], [-73.98185715599982, 40.67935261499984], [-73.98413878099997, 40.68024537099991], [-73.98610388199985, 40.68100852199994], [-73.98653302999993, 40.680372638999884], [-73.98729306099992, 40.6806696979999], [-73.9876680399999, 40.68081780999993], [-73.98722413899985, 40.68144730199988], [-73.98827189199999, 40.68186309999987], [-73.99042374299992, 40.68269393299993], [-73.99262292599985, 40.68354371199993], [-73.99490113599977, 40.6844302379999], [-73.99457806799994, 40.68510014199988], [-73.99440802399982, 40.685452495999925], [-73.99425367999989, 40.685777996999924], [-73.99409147700004, 40.68611343899993], [-73.9939292959999, 40.686452870999865], [-73.99378736999994, 40.68675596699995], [-73.99360423199991, 40.6871272299999], [-73.99333822999985, 40.687678796999876], [-73.99326829999998, 40.68782445099991], [-73.99300451699985, 40.68836463599994], [-73.99293238499986, 40.68851457599991], [-73.99268552799995, 40.68903324699992], [-73.99262286099999, 40.68916054899988], [-73.99236366999985, 40.689690123999924], [-73.99070669599995, 40.68913674399992], [-73.99054474599986, 40.689168104999936], [-73.99016617899996, 40.689729533999916], [-73.98973690099999, 40.690359972999886], [-73.98930768499997, 40.690991687999926], [-73.98930270499983, 40.691060225999884], [-73.98902944799994, 40.69212386099992], [-73.98893356299986, 40.69208664099989], [-73.9882070139999, 40.69180695999995], [-73.98734787400004, 40.69145766799992], [-73.98646436299995, 40.69110361099993], [-73.98633134999982, 40.69105050999989], [-73.98536391899995, 40.69066661299989], [-73.98510411999996, 40.69056114499992], [-73.98443216299995, 40.690292171999936], [-73.9840703399998, 40.69014307899988], [-73.98372011099993, 40.69000671899992], [-73.98295657299988, 40.689699730999905], [-73.9820973789999, 40.68935800999991], [-73.98155298299992, 40.689146163999936]]]}}, {\&quot;id\&quot;: \&quot;25\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 26, \&quot;Shape_Leng\&quot;: 0.12354780707, \&quot;Shape_Area\&quot;: 0.000534039927626, \&quot;zone\&quot;: \&quot;Borough Park\&quot;, \&quot;LocationID\&quot;: 26, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98331628499983, 40.6414786819999], [-73.98299419199994, 40.64132499699987], [-73.98244454199998, 40.6415386259999], [-73.98204321799996, 40.64170758199988], [-73.98123240499983, 40.642044912999935], [-73.98042057899988, 40.64238522699991], [-73.98007428599995, 40.640539699999906], [-73.98000693099998, 40.64020883699988], [-73.9799098319998, 40.639686357999906], [-73.97987360300003, 40.63951820599989], [-73.9796770499999, 40.6384647999999], [-73.97955441199994, 40.63781925899984], [-73.9794759209999, 40.63743136399991], [-73.97938644699988, 40.636932162999855], [-73.97928591699991, 40.63641419399991], [-73.97911188699993, 40.63544038599991], [-73.97802159000001, 40.63555270299984], [-73.9768886119999, 40.6356748619999], [-73.97663655999995, 40.6343538209999], [-73.97655064099989, 40.633903508999886], [-73.97643342199997, 40.63328912299986], [-73.97604935699995, 40.63127590599986], [-73.97716511999984, 40.63074665399988], [-73.97699848899988, 40.62987149599992], [-73.97684964299987, 40.62908858099994], [-73.97669604399998, 40.62835456399994], [-73.97657775699989, 40.627573185999886], [-73.9765146209999, 40.62729448999989], [-73.97644970399986, 40.62700825499989], [-73.97623453700001, 40.625976349999895], [-73.9772614999999, 40.625852772999906], [-73.97719665599993, 40.62510197899993], [-73.97710959299997, 40.62494825999989], [-73.976943824, 40.624052749999855], [-73.97683465199992, 40.623481041999895], [-73.97675209599991, 40.623013311999884], [-73.97656583899989, 40.621994902999894], [-73.97695070799993, 40.62163000699997], [-73.97705352899999, 40.62153252199987], [-73.97539380499998, 40.62076998699995], [-73.97682433599995, 40.61867579999989], [-73.97752301899989, 40.61767654099989], [-73.97785009299986, 40.617287605999906], [-73.97562954199996, 40.61594539099984], [-73.97537335500002, 40.6157547219999], [-73.975442767, 40.616114089999925], [-73.97548096999985, 40.616311924999906], [-73.97444328399989, 40.61642164299991], [-73.97335879399992, 40.616541714999904], [-73.97290326899996, 40.61415296799988], [-73.97399319500002, 40.61402989399992], [-73.97517176999993, 40.61472418599991], [-73.97497264699994, 40.61366810999988], [-73.97489295799981, 40.61318636799989], [-73.97477658, 40.6126384749999], [-73.975208294, 40.612885257999906], [-73.977408165, 40.614218112999886], [-73.97963821799982, 40.61556454699991], [-73.98003930399985, 40.61580692999995], [-73.98087912799988, 40.61631443499988], [-73.98186818299985, 40.61691212699987], [-73.98406791799982, 40.61824073899987], [-73.98627524699981, 40.61956661699987], [-73.9856935779999, 40.6201315139999], [-73.98785095499996, 40.62143503199991], [-73.99009356099988, 40.62278895299992], [-73.99254973599997, 40.62427426799996], [-73.99398197100003, 40.62514139899989], [-73.99432497399985, 40.62534290799988], [-73.99489280599995, 40.625461793999925], [-73.99473485699997, 40.6256147409999], [-73.99464972999995, 40.62569717899992], [-73.99507814899985, 40.62580673699993], [-73.99678847599995, 40.626826050999895], [-73.99687778399999, 40.626530782999964], [-73.99701633599989, 40.62606161499991], [-73.99724067099987, 40.62528868699994], [-73.99811614300002, 40.625815706999944], [-74.00031369499995, 40.62714458299991], [-74.00251454799998, 40.62847420999986], [-74.00222793499994, 40.62875116999988], [-74.00193011399998, 40.629032766999885], [-74.00306153999993, 40.6297151749999], [-74.00368597199991, 40.63009178099986], [-74.00413727999998, 40.630363965999905], [-74.00633870699993, 40.63169362599995], [-74.00702302499997, 40.63210999499996], [-74.006806779, 40.63225039099994], [-74.00661914999998, 40.63237545799995], [-74.00630615499989, 40.632584087999916], [-74.00556490399993, 40.63308317599992], [-74.00735636699996, 40.6341636269999], [-74.00675122699992, 40.634744786999875], [-74.00641784699992, 40.635064849999885], [-74.00616926899994, 40.63530350099989], [-74.00558613, 40.63586622899986], [-74.00500346499996, 40.636425234999905], [-74.00442048399997, 40.63698498599989], [-74.00411104099993, 40.63728296099992], [-74.00383793099998, 40.63754593099991], [-74.00325273099993, 40.63810426199991], [-74.00267214299998, 40.63866700999992], [-74.00236943499988, 40.63895767799987], [-74.00209075399988, 40.63922525399994], [-74.00150771299988, 40.63978496199994], [-74.00092541799997, 40.64034590199991], [-74.00066078199991, 40.64059930899991], [-74.00034122099999, 40.6409053159999], [-73.99975690799992, 40.64146714999988], [-73.99917564799993, 40.642025441999856], [-73.99697357399992, 40.64069410499995], [-73.9955103369999, 40.63980966699993], [-73.99479539499987, 40.64028848699991], [-73.99433124099983, 40.64060028799991], [-73.99407691999981, 40.640770401999944], [-73.99336253699994, 40.641247798999885], [-73.99264456099989, 40.64172828999991], [-73.991928124, 40.6422049039999], [-73.99121277399998, 40.64268589099995], [-73.99049634100004, 40.64316444099995], [-73.98977890299996, 40.64364488699989], [-73.98905872499985, 40.64411924099995], [-73.98834986699991, 40.64456224399992], [-73.98749940600001, 40.64404550999989], [-73.98673080599988, 40.64357399299988], [-73.9858964449999, 40.643067594999906], [-73.985095196, 40.642573055999925], [-73.9845871949999, 40.64226200399988], [-73.98430293099989, 40.64208456299985], [-73.98331628499983, 40.6414786819999]]]}}, {\&quot;id\&quot;: \&quot;26\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 27, \&quot;Shape_Leng\&quot;: 0.202508808518, \&quot;Shape_Area\&quot;: 0.00134088762746, \&quot;zone\&quot;: \&quot;Breezy Point/Fort Tilden/Riis Beach\&quot;, \&quot;LocationID\&quot;: 27, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86522555399998, 40.57045847199989], [-73.86454176099993, 40.56924292199994], [-73.86410310099991, 40.569354609999934], [-73.86406802399988, 40.569297978999934], [-73.86316930199989, 40.56773927199992], [-73.86308767499982, 40.5675977289999], [-73.86286892288632, 40.56683057177312], [-73.86267372829568, 40.56651956610252], [-73.86267607982793, 40.5665130138054], [-73.86268391251235, 40.56650565604353], [-73.86269356691223, 40.56650219217743], [-73.86270424269793, 40.5665019973689], [-73.8627141083374, 40.56650509874633], [-73.86277353301229, 40.56657186205274], [-73.86295920590028, 40.566815983072175], [-73.86300482943778, 40.56687595773083], [-73.86319883665385, 40.56697222108389], [-73.86335482591628, 40.56701963007009], [-73.86342360986391, 40.56703174353393], [-73.86349306360215, 40.56703431173402], [-73.86355862677969, 40.567027194390754], [-73.8637303990016, 40.56697901282819], [-73.86387639829695, 40.5669342852578], [-73.86402791878817, 40.56688561150596], [-73.86449981054494, 40.5667240744525], [-73.86459949094905, 40.56669299776952], [-73.86475323748434, 40.566652574352474], [-73.86482648734001, 40.56664084586797], [-73.8648457640142, 40.566637761374906], [-73.8649546750932, 40.566631477600865], [-73.86508926857456, 40.56663218475607], [-73.86525534672059, 40.56662474418802], [-73.86537824806315, 40.56660813782069], [-73.86553757257411, 40.56657161043734], [-73.86557630398882, 40.56655997659382], [-73.86565210793115, 40.56653377766778], [-73.86572546406634, 40.56650378580237], [-73.86579602875463, 40.566470135127446], [-73.86586350645223, 40.5664329680382], [-73.86636470299644, 40.5661813321767], [-73.86644810921857, 40.56613891596792], [-73.86653974501574, 40.566107909500026], [-73.86661720554638, 40.566091942910326], [-73.86653832191413, 40.56595727655682], [-73.86630105072975, 40.565552214298094], [-73.86630941232445, 40.56554606412482], [-73.86654955895546, 40.565953525384245], [-73.86663005715053, 40.566090111654], [-73.86668580404546, 40.56608473784669], [-73.86674197887773, 40.566083433306375], [-73.86679216232595, 40.566084806288956], [-73.86686111965143, 40.566086471070065], [-73.86688401059845, 40.566083976276055], [-73.86696357079242, 40.56606874198119], [-73.86702972224312, 40.56605622921264], [-73.86709181078302, 40.56603859651582], [-73.8671429879069, 40.56602136563421], [-73.86732622021515, 40.56595559545229], [-73.86738139335078, 40.565935398105374], [-73.8674257709762, 40.56591687194776], [-73.86747429909371, 40.56589584615776], [-73.86765236683206, 40.56581373349282], [-73.86768770930918, 40.565796124603466], [-73.86770878117876, 40.56578742257893], [-73.86775063505787, 40.56577283704188], [-73.86785317398673, 40.5657399059368], [-73.86788155843954, 40.56572877272331], [-73.86792367047542, 40.56570957616081], [-73.86797245198414, 40.56568511944022], [-73.86807455478316, 40.56563374527903], [-73.86809782439515, 40.565623947214], [-73.86817969316189, 40.56559372097314], [-73.86823531210628, 40.56556896674802], [-73.86832677099366, 40.56553115811213], [-73.86836484239736, 40.565518909915205], [-73.86837690378205, 40.56551601491614], [-73.8683950442179, 40.5655143882133], [-73.86843272443515, 40.56551492592719], [-73.86845140122098, 40.56551692031767], [-73.86846705188553, 40.565520621216976], [-73.86848241215057, 40.565527663332496], [-73.8684869484588, 40.56552701030156], [-73.86848953699123, 40.565519385463155], [-73.86838610254688, 40.56534185454267], [-73.86823181879357, 40.56507704077842], [-73.8682511755017, 40.565069489459624], [-73.86840555232219, 40.56533537549579], [-73.86852753205115, 40.565545463433686], [-73.86854986356495, 40.565544696910926], [-73.868623218271, 40.56553800877494], [-73.8686901563823, 40.56552808931248], [-73.86893605282155, 40.56547413219297], [-73.86905175794233, 40.56544086306031], [-73.8691282463427, 40.565419625860656], [-73.86924996432192, 40.56538476045332], [-73.86948488954816, 40.56527065197848], [-73.86954872397517, 40.56524111509826], [-73.86968095022635, 40.565187927537636], [-73.86988639456341, 40.56511342587334], [-73.87003028797032, 40.56506022365147], [-73.87031973070592, 40.56493365714443], [-73.87039480972099, 40.56489591950433], [-73.8704872406497, 40.564855428594704], [-73.87062214815259, 40.56481330949413], [-73.87051611850829, 40.56463238223506], [-73.87025285397128, 40.56418310191552], [-73.87027588464693, 40.56417465359739], [-73.87053524869275, 40.564626011194136], [-73.87064094150604, 40.56480994521735], [-73.87064565391573, 40.564809409738025], [-73.87065866951325, 40.56481436836889], [-73.87066630743064, 40.56481525968412], [-73.87079074288935, 40.56479094187672], [-73.87091316206462, 40.56476458551071], [-73.87099970074952, 40.564736415587], [-73.87111211955774, 40.56469089341756], [-73.87116249832623, 40.5646762624261], [-73.87124151827355, 40.56464577884291], [-73.87128982771225, 40.564626210380986], [-73.87136289489302, 40.564596593376976], [-73.87144543470181, 40.56455926799005], [-73.87160225040432, 40.56450287240941], [-73.87170264487447, 40.56445901269151], [-73.87187304106037, 40.564376480329514], [-73.87232617089947, 40.56418954025002], [-73.87250831174484, 40.56412128483286], [-73.8725776351144, 40.56409750600724], [-73.87263971280453, 40.564084184026754], [-73.87264671264475, 40.564041795506355], [-73.87258749014757, 40.56393863747306], [-73.87237878047286, 40.56357511656151], [-73.87239869822375, 40.56357077001371], [-73.87256879318456, 40.56386147776902], [-73.87260883087148, 40.563931033341184], [-73.87266353398269, 40.56402605512359], [-73.87266787468027, 40.564034254826765], [-73.87268736318256, 40.56403769755697], [-73.87270809641154, 40.56405759510705], [-73.8727238972499, 40.56408745638789], [-73.87273512756167, 40.56409968929783], [-73.87274925481708, 40.56410955604112], [-73.8727606175667, 40.564113963607575], [-73.87277678060882, 40.56411502622753], [-73.87283461996127, 40.564113793595965], [-73.87288655736036, 40.56411048323227], [-73.87294196168004, 40.564104259482484], [-73.8729839745517, 40.564098479260004], [-73.87302519640879, 40.56409210308157], [-73.87307650520094, 40.564084334302365], [-73.87314057697263, 40.56407806625708], [-73.87321952830246, 40.56406390618561], [-73.87329889953693, 40.56404075184445], [-73.87333383849683, 40.56402856991333], [-73.87341959004098, 40.56399718206549], [-73.87344692115289, 40.56398714430683], [-73.87347711337766, 40.56397542585057], [-73.87352028757074, 40.563961037853815], [-73.87356559873494, 40.5639462921715], [-73.87361039032855, 40.56393225672879], [-73.87367333727143, 40.56391432438932], [-73.87375288230227, 40.56389248470005], [-73.87379999120962, 40.56387666871009], [-73.87384821426248, 40.563858414354414], [-73.87392010655763, 40.563830469396976], [-73.87398333570002, 40.563807476287614], [-73.87396234686531, 40.56376070639328], [-73.87397732709955, 40.563756544132715], [-73.87399917445005, 40.563805395016864], [-73.87402612883245, 40.56380039114732], [-73.8740716377515, 40.563787599215736], [-73.87412371693783, 40.56377252684616], [-73.8741500028522, 40.5637655322951], [-73.87419364441172, 40.56375361160226], [-73.87426973237943, 40.56373022733147], [-73.87431230105985, 40.56371723389802], [-73.87437714732536, 40.56369965456142], [-73.87443483573853, 40.56368431930004], [-73.87447106976656, 40.56367456058566], [-73.87452022105322, 40.563658170564594], [-73.87455252668062, 40.56364618474654], [-73.87459337507963, 40.56363116305626], [-73.87464053117007, 40.563609196751464], [-73.87465199208484, 40.56359853743912], [-73.8746666375388, 40.56357782411208], [-73.87466953104926, 40.56355873657037], [-73.8746506447683, 40.563511356438624], [-73.87464481920868, 40.56350146330547], [-73.87466540729139, 40.5634976665944], [-73.87468471054004, 40.56353074615861], [-73.87473658078231, 40.56353824072976], [-73.87477351950852, 40.56352994271122], [-73.87484278763579, 40.56351648246642], [-73.87489963722413, 40.563506935889876], [-73.8749561458776, 40.56350301691279], [-73.87500676147575, 40.56349906569543], [-73.87504255093543, 40.56349364684841], [-73.87508297419413, 40.56348490136332], [-73.87512975898886, 40.563471283137496], [-73.87517848346008, 40.5634561347724], [-73.87522720738546, 40.563441031451525], [-73.87524985801689, 40.56343364503572], [-73.8752717516301, 40.56342650925574], [-73.87529181474282, 40.56341936327524], [-73.87530945564228, 40.563412988649645], [-73.87534115876268, 40.56340130769767], [-73.87535587961015, 40.56339632592228], [-73.87538638520446, 40.563387164480275], [-73.87534551646789, 40.56329906659987], [-73.87536087323856, 40.5632958504412], [-73.87540121346792, 40.563382534125715], [-73.87541872053987, 40.56337805929456], [-73.87545505162277, 40.56336697672159], [-73.87547439144372, 40.5633611803831], [-73.87551004856199, 40.56335021450054], [-73.87552758218385, 40.56334468625361], [-73.87555952995204, 40.56333453538936], [-73.87559506972467, 40.56332275096978], [-73.8756290273301, 40.563311368740564], [-73.87565650831084, 40.56330286100388], [-73.87568355361338, 40.56329344377209], [-73.87571355454236, 40.56328274243264], [-73.8757454201404, 40.56327221331274], [-73.87577452358008, 40.56326145704173], [-73.87580575386734, 40.56324963103947], [-73.87583528292514, 40.56323797390256], [-73.8758855622984, 40.563218703170655], [-73.87590988032137, 40.56320917421155], [-73.87595295265639, 40.56319171487047], [-73.87597470538526, 40.56318430003461], [-73.87599724911752, 40.563176660720956], [-73.87603797533089, 40.56316358457966], [-73.87606765576666, 40.56315364740809], [-73.87603074813882, 40.56307447802597], [-73.8760461294172, 40.563070794058625], [-73.87608271947352, 40.563148512787194], [-73.87610050107055, 40.56314306597241], [-73.87612944192581, 40.5631367660658], [-73.87616566871453, 40.56313061825068], [-73.87619188002725, 40.56312557738809], [-73.87623177412057, 40.5631154343994], [-73.87625899418441, 40.563107169993465], [-73.87631318582261, 40.56309172129477], [-73.87633039968337, 40.56308655327291], [-73.87637686168809, 40.56306889923475], [-73.87639149048142, 40.563062655727485], [-73.87641778562529, 40.56305039218808], [-73.87642834027622, 40.56304529706564], [-73.87644818600278, 40.56303453083122], [-73.87646000618406, 40.56302776160095], [-73.87647953341072, 40.563016859989474], [-73.87650201161124, 40.56300598835245], [-73.87653101431876, 40.56299196109574], [-73.87654600306143, 40.56298325208348], [-73.87656188792157, 40.56297473166594], [-73.87657784435744, 40.562966347524736], [-73.8765944878989, 40.56295690131019], [-73.87660652200594, 40.56294942029262], [-73.87662032765036, 40.56294139352161], [-73.87663304695474, 40.56293423925047], [-73.8766627617093, 40.562917746350436], [-73.87667729045369, 40.5629091443813], [-73.87669317480369, 40.562901119665824], [-73.8767132289167, 40.5628921354571], [-73.87673545637608, 40.562883297987966], [-73.8767434906596, 40.562880615074945], [-73.87672645978108, 40.562844521751664], [-73.87674369135848, 40.56284208140833], [-73.8767592984439, 40.56287562490441], [-73.8767730849189, 40.56287213681385], [-73.87678968296791, 40.56286779582757], [-73.87680946313873, 40.562860594328605], [-73.87682916055601, 40.56285288059863], [-73.8768736030291, 40.562835249993334], [-73.87689802684656, 40.562825615059545], [-73.876924708713, 40.562815458171706], [-73.8769513298522, 40.56280511190377], [-73.87696544963367, 40.56280002222658], [-73.87699432547852, 40.56279096616609], [-73.8770082670926, 40.56278647856263], [-73.87704837900323, 40.562772986266374], [-73.87706415438072, 40.56276707762034], [-73.87711007301019, 40.56274879312667], [-73.87712614278729, 40.5627424961178], [-73.87714098654575, 40.56273586625367], [-73.87715607666624, 40.562729650617484], [-73.87717178189162, 40.562722698338064], [-73.87718888135463, 40.56271550328863], [-73.87720520197054, 40.56270777599936], [-73.87722076596584, 40.56270056992197], [-73.8772362246945, 40.562693147951535], [-73.87725221358004, 40.56268579037451], [-73.87726906383583, 40.562679000636635], [-73.87728427215485, 40.56267300139095], [-73.87729838041301, 40.56266793746007], [-73.87732946042871, 40.562660010140895], [-73.87735635919601, 40.56265320331182], [-73.87734281968088, 40.56263229637029], [-73.87736084534804, 40.562628263740656], [-73.87737403170412, 40.562649017013236], [-73.8773836474245, 40.56264675791915], [-73.87740724013115, 40.56264033554793], [-73.87752204544438, 40.562602824449314], [-73.87761725904532, 40.562566914051835], [-73.87769976955727, 40.56253606905333], [-73.87780227013106, 40.56249936530093], [-73.87789681427573, 40.562460598245124], [-73.87797558561535, 40.562427443359745], [-73.87805690415122, 40.56239632678013], [-73.87810489087754, 40.56237092892275], [-73.87819091216764, 40.56233136100081], [-73.87827637443897, 40.56230015802658], [-73.8783713531596, 40.56226309448449], [-73.87849030785846, 40.56221617598844], [-73.87863332705666, 40.56216225056558], [-73.87874838460596, 40.5621214530793], [-73.87886213323743, 40.56207351146075], [-73.87893541975764, 40.5620429796811], [-73.87903836918255, 40.56199864749559], [-73.87920381335462, 40.56191702682255], [-73.87937898313005, 40.561836929087455], [-73.87954024329774, 40.56179666565886], [-73.87954475732901, 40.56179488737246], [-73.87956142278068, 40.56179177907632], [-73.87957863349105, 40.561788032893034], [-73.87959637702109, 40.56178335948525], [-73.87961485607637, 40.56177717388321], [-73.87963567395806, 40.56177046987883], [-73.87965868676253, 40.561763991487865], [-73.87968186281925, 40.561758829210376], [-73.87970635043087, 40.561753091329045], [-73.87973011928683, 40.56174613726036], [-73.87974563530074, 40.56173931778465], [-73.87975883079315, 40.56172967869506], [-73.87977032503349, 40.56171939769128], [-73.87978478609632, 40.56170873279764], [-73.87980665020133, 40.56169739045226], [-73.87982058327975, 40.561691065700856], [-73.87983442103652, 40.56168448821299], [-73.87984807048495, 40.56167855065822], [-73.87986099695851, 40.5616731326935], [-73.87987504764712, 40.561666996864815], [-73.87989003151243, 40.56166059245462], [-73.8799052272357, 40.561654619150794], [-73.87991978375338, 40.561649367063076], [-73.87993381993422, 40.56164408645201], [-73.87994793990492, 40.56163899473306], [-73.87996253102727, 40.56163379595053], [-73.87998694116628, 40.561625168205296], [-73.87999703259649, 40.5616212344257], [-73.88001748502982, 40.561613951824725], [-73.88003818600468, 40.56160612115427], [-73.88005879307917, 40.56159810090572], [-73.8800820945289, 40.56158838119541], [-73.88010722783451, 40.561578249426354], [-73.88013158004648, 40.56156944149529], [-73.8801561087673, 40.56156007436105], [-73.88017659797245, 40.561551865162215], [-73.88019510089887, 40.561544796776765], [-73.88021646533025, 40.56153629095068], [-73.88024009597919, 40.561527202301704], [-73.88026267382189, 40.561519923548374], [-73.88028402529329, 40.56151140831457], [-73.88029663880127, 40.56150310142431], [-73.88029945871983, 40.56149839325516], [-73.88030219429331, 40.56149380394435], [-73.88030376241444, 40.56148194580274], [-73.88029971929609, 40.56147151352376], [-73.88029125467662, 40.5614573387097], [-73.88028328768723, 40.5614426247999], [-73.88028035877844, 40.56142982547907], [-73.88027612406724, 40.561400913782784], [-73.88027653869281, 40.56139974385115], [-73.88028171347875, 40.56138518804984], [-73.88029675110954, 40.561374955249434], [-73.88032213845268, 40.56136801195929], [-73.88033427510743, 40.56136861916831], [-73.88035535042575, 40.56136965886821], [-73.88037097709187, 40.5613797162167], [-73.88038652381759, 40.56140191269535], [-73.88039813555842, 40.561425544993895], [-73.88041490293793, 40.56147157034809], [-73.88044061582691, 40.56147372156319], [-73.88045748805685, 40.561474063630364], [-73.88047833156288, 40.561472581741526], [-73.88050508130863, 40.56146906162662], [-73.88052044713967, 40.56146716006488], [-73.880535067378, 40.56146577874338], [-73.88055180135724, 40.56146444568915], [-73.88056789802403, 40.56146290389764], [-73.88058466554952, 40.561462588114914], [-73.88059874050708, 40.56146210752924], [-73.88062471827277, 40.56146194572576], [-73.88065503286174, 40.561459204441675], [-73.88067122541169, 40.56145686127235], [-73.88068750016801, 40.56145473446717], [-73.88070388287355, 40.561451816193106], [-73.8807208433218, 40.56144900556832], [-73.88073916280933, 40.56144583733556], [-73.88075795457834, 40.56144254277009], [-73.8807759545183, 40.56143970624408], [-73.88079254859147, 40.56143724771121], [-73.88080875189407, 40.56143490503621], [-73.88082570091095, 40.56143209438401], [-73.88084176466914, 40.561429536451215], [-73.88085587891946, 40.56142721857465], [-73.88087985492963, 40.56142345224179], [-73.8809059096621, 40.56141966075196], [-73.88092118030214, 40.561417542756736], [-73.88093924873357, 40.56141583224443], [-73.88095900626, 40.56141431228607], [-73.88097801947205, 40.56141235078193], [-73.88099687882973, 40.56141105554915], [-73.88101282281468, 40.56140926274484], [-73.88104769888399, 40.56140443564484], [-73.88106581723754, 40.56140182485871], [-73.88108276623433, 40.56139901467111], [-73.881099358105, 40.56139741133172], [-73.88111436629285, 40.561396742340264], [-73.88112995376133, 40.561396181500584], [-73.88114925192757, 40.561393815678294], [-73.88116962349282, 40.56139150423785], [-73.88118575602273, 40.5613900354398], [-73.88120008258839, 40.56138813271206], [-73.88121897799168, 40.56138595476507], [-73.88123683590801, 40.56138291932948], [-73.88125385752036, 40.56137928963561], [-73.88126707541673, 40.561376286757216], [-73.88128249221315, 40.56137213387953], [-73.8813042410815, 40.56136548263687], [-73.88132655862354, 40.56135872542872], [-73.88134871078579, 40.56135157954342], [-73.88136894897035, 40.56134482889048], [-73.8813898367198, 40.56133831244134], [-73.8814120452841, 40.561332301617135], [-73.88143293141147, 40.5613266946783], [-73.88145183346806, 40.5613212481918], [-73.88147293606477, 40.56131322820112], [-73.88149581334554, 40.56130271618776], [-73.8815191542814, 40.56129124001096], [-73.88153201189785, 40.561284770034455], [-73.88155470392729, 40.56127305059788], [-73.88157549384806, 40.56126159875125], [-73.88159656803151, 40.5612497607023], [-73.88161925961303, 40.56123803304354], [-73.88164018844435, 40.561227761576404], [-73.8816634567856, 40.56121706045621], [-73.88168899263773, 40.56120577598256], [-73.88170253568676, 40.561199612435054], [-73.88171737737864, 40.5611929545025], [-73.88173260920927, 40.56118616143791], [-73.88174658812723, 40.561179837002754], [-73.8817586184783, 40.56117471543492], [-73.88178192122048, 40.56116404180099], [-73.88180537902329, 40.561152755162624], [-73.88182947646317, 40.5611407313759], [-73.88184233483787, 40.561134295876684], [-73.88185623325523, 40.56112690032671], [-73.88187025034674, 40.56111971950298], [-73.88188268294091, 40.56111344556264], [-73.88189455988073, 40.56110711777507], [-73.88190695714788, 40.561100819168836], [-73.88192107865262, 40.56109470946488], [-73.88193490525215, 40.561088167396484], [-73.88194830614006, 40.5610817512062], [-73.88196126979652, 40.56107551566507], [-73.88197456513642, 40.561068910054466], [-73.88198752963675, 40.56106269143171], [-73.88200050406658, 40.561056446180324], [-73.88203604916899, 40.56104105788076], [-73.88205880591771, 40.561032273702146], [-73.88208199965021, 40.561023319254794], [-73.88210707368597, 40.56101299700819], [-73.8821216897349, 40.56100694323953], [-73.88213620094551, 40.561000672577734], [-73.88214913940051, 40.56099525604307], [-73.8821604122492, 40.56099065634909], [-73.88218306409571, 40.56098167385033], [-73.88220615093074, 40.56097253096465], [-73.8822294874467, 40.56096380112383], [-73.88225563517344, 40.560953588672774], [-73.88228206413865, 40.56094482748039], [-73.88230928304074, 40.56093654354631], [-73.8823345270254, 40.560930338136416], [-73.88235267047222, 40.56092634873712], [-73.88237074147563, 40.56092320578925], [-73.8823851748646, 40.56092056471894], [-73.88241586728287, 40.56091089700157], [-73.8824162120251, 40.56091009589146], [-73.88241602369006, 40.56090951989842], [-73.88235271249685, 40.56078809926085], [-73.882356357125, 40.56077687346529], [-73.88235923039828, 40.56076796180767], [-73.88237441679736, 40.560760430809786], [-73.88238549043537, 40.56076102733196], [-73.88239808836536, 40.56076171554471], [-73.8824195896144, 40.560768401897214], [-73.88242584458052, 40.56077034444328], [-73.8824378051493, 40.560790950968475], [-73.88243908710649, 40.560793816204104], [-73.88245337703015, 40.56082575465579], [-73.88247328322596, 40.56087296216574], [-73.88248668159774, 40.56087529030036], [-73.88250750252948, 40.560879517774076], [-73.88252057000595, 40.5608813954134], [-73.88253888350766, 40.56088149422307], [-73.88255540237668, 40.56088121425246], [-73.88257394133495, 40.560880765966886], [-73.88259575058406, 40.56088059007429], [-73.88261752366901, 40.56088036857243], [-73.88263861248006, 40.56087978684802], [-73.88265599601887, 40.56087821039512], [-73.88267018015226, 40.56087652311708], [-73.88268796496037, 40.56087522650897], [-73.88270678652788, 40.560874831262495], [-73.88272323540367, 40.56087437981323], [-73.882741879012, 40.56087412828751], [-73.88276124168169, 40.56087519260241], [-73.88277761838575, 40.5608755618006], [-73.88280046617912, 40.560875395137984], [-73.88282652775801, 40.56087440398432], [-73.88284902255931, 40.56087360787722], [-73.88287626049771, 40.56087470667475], [-73.88289644771169, 40.56087631209161], [-73.88291645747425, 40.5608790257017], [-73.88293962972233, 40.56088223657724], [-73.88295837856984, 40.560883102212905], [-73.88297874541257, 40.56088411440746], [-73.88300900265625, 40.56088694549323], [-73.88302771502269, 40.560888198577054], [-73.8830503248985, 40.560889427649066], [-73.88307447541696, 40.56088693091244], [-73.88309826218214, 40.56088329912061], [-73.88310982640823, 40.56088034862673], [-73.88313764957451, 40.56087765675655], [-73.8831443819454, 40.560877060331165], [-73.8831633133852, 40.560874504991375], [-73.88318433715789, 40.5608710404139], [-73.88320353254964, 40.56086614293299], [-73.88321840479821, 40.56086286207248], [-73.88323280320117, 40.560859725641855], [-73.88324741562234, 40.56085592148518], [-73.88326552705627, 40.56085009611661], [-73.88328688961892, 40.56084155403374], [-73.8833094351043, 40.56083235542637], [-73.88333046640618, 40.560824190108676], [-73.8833522544527, 40.560815513416806], [-73.8833739347147, 40.56080754861338], [-73.88339201329119, 40.5608006499951], [-73.88340857891116, 40.560793832262824], [-73.88342590281917, 40.56078561927137], [-73.88343539982534, 40.560781003912375], [-73.88344315695069, 40.560777234320746], [-73.88345903958856, 40.56076918186295], [-73.88347557387985, 40.56076041906728], [-73.88349337258666, 40.56075112564446], [-73.88351285915205, 40.560742094104555], [-73.88353281763692, 40.56073288411802], [-73.88355510425974, 40.560722316648295], [-73.88357654153918, 40.56071207281864], [-73.88359905432155, 40.56070091988511], [-73.88362146087441, 40.56068958674489], [-73.8836406196835, 40.56067903367992], [-73.8836593548208, 40.56066768860375], [-73.88368014419221, 40.56065623637554], [-73.88370244284773, 40.56064566888932], [-73.8837275769731, 40.560634546059624], [-73.88374036229729, 40.56062890369553], [-73.8837524963408, 40.56062400869173], [-73.88377569269934, 40.56061408993795], [-73.88380001160759, 40.56060247925819], [-73.88382328178228, 40.56059077805145], [-73.88384669395788, 40.56057850939229], [-73.88386109809427, 40.56057202262581], [-73.88387561981135, 40.56056575125234], [-73.88389070942661, 40.56055956203819], [-73.8839075224937, 40.560552744484184], [-73.88392794090461, 40.560544633889954], [-73.88394940861666, 40.5605367845262], [-73.88396907019593, 40.56052897839929], [-73.88399082036796, 40.5605216432948], [-73.88401473247602, 40.56051327436476], [-73.88403597455215, 40.56050670435022], [-73.88405726297333, 40.56050013387597], [-73.88410568844773, 40.5604844868742], [-73.8841324117759, 40.560476228310336], [-73.8841587684461, 40.56046735788629], [-73.8841840883879, 40.560458189380356], [-73.8842050830714, 40.56045112403434], [-73.88422171797328, 40.56044491773886], [-73.88423691281278, 40.56043894386111], [-73.8842516820894, 40.56043314143822], [-73.88426677146676, 40.560426925369605], [-73.88428154007914, 40.5604211229422], [-73.88429717297159, 40.560414987496486], [-73.8843137017093, 40.5604085565906], [-73.8843310946317, 40.560401847112786], [-73.88434848693704, 40.560395111329605], [-73.88436422437736, 40.56038922861499], [-73.88437913564492, 40.56038361512484], [-73.88439325430404, 40.560378550333034], [-73.88440740771495, 40.56037345809958], [-73.88443206430397, 40.56036525233582], [-73.8844540744506, 40.56035791673506], [-73.88447607272956, 40.560350581788356], [-73.88449720857403, 40.56034352574498], [-73.88451499964208, 40.56033799638523], [-73.88453390201965, 40.56033167538847], [-73.88455439118883, 40.56032346540885], [-73.88457420687197, 40.56031500278364], [-73.88459797973535, 40.56030513822021], [-73.88461097723092, 40.560299937246], [-73.8846249896923, 40.560294656540464], [-73.88463856501663, 40.56028950941811], [-73.88465332350869, 40.56028367996053], [-73.88467004324299, 40.560276636538234], [-73.88468617287215, 40.56026952065097], [-73.88470191292048, 40.5602617104613], [-73.88471693288132, 40.56025443145421], [-73.88473148047956, 40.56024733206578], [-73.88474405393285, 40.56024128412235], [-73.88475532648981, 40.56023667596438], [-73.88477491440844, 40.560229698563596], [-73.88479112502597, 40.560223626789124], [-73.88480416654231, 40.56021287858729], [-73.8848168532933, 40.56020328280155], [-73.88483601878171, 40.56019503576012], [-73.88485800842345, 40.56019240195546], [-73.88488436886665, 40.560182368041204], [-73.88485674870846, 40.56013566602369], [-73.88482942339473, 40.56008946051857], [-73.88482639762242, 40.56008434162391], [-73.88482738580119, 40.56007304171813], [-73.88483809042465, 40.560054717142414], [-73.88485949479873, 40.56004280745799], [-73.88488243929883, 40.560041164372485], [-73.88489701008322, 40.560047599056425], [-73.88490715629744, 40.56006638597498], [-73.88492030518748, 40.56008942529685], [-73.8849443679716, 40.560144678817345], [-73.8849511180102, 40.560160174555385], [-73.88497701148718, 40.56016056939058], [-73.88499384958591, 40.56016039744602], [-73.8850127096114, 40.560157697319156], [-73.88502923309899, 40.56015551637084], [-73.88505227175698, 40.56015381018705], [-73.88508182676415, 40.56015342529315], [-73.88511277798887, 40.56015096173725], [-73.88513088351232, 40.56014836788791], [-73.88514881564575, 40.560145307794244], [-73.8851658160028, 40.56014249052201], [-73.88518128795546, 40.5601398072511], [-73.8851987482445, 40.5601368812044], [-73.8852174405887, 40.560133324463564], [-73.8852341912882, 40.56013006448527], [-73.88524858662313, 40.5601281832679], [-73.88527386894698, 40.560124769303464], [-73.88529648951729, 40.560122201381795], [-73.8853141363416, 40.560121035405395], [-73.88533015232493, 40.56011876829939], [-73.88534667832201, 40.56011562551876], [-73.8853632401859, 40.56011244541259], [-73.88538374267821, 40.560108918596406], [-73.88540837775066, 40.56010429388806], [-73.88543277625296, 40.56009928093931], [-73.88545309071588, 40.56009536575647], [-73.88547531123174, 40.560091153764645], [-73.88550302533781, 40.56008545790457], [-73.88551666325391, 40.560082304011516], [-73.88554427202199, 40.56007641805759], [-73.88555827758914, 40.560072911540416], [-73.88558241626406, 40.56006748332943], [-73.88559871654877, 40.56006478223174], [-73.88561210551558, 40.56006256507402], [-73.88563340220868, 40.56005804638965], [-73.8856508311303, 40.560053658879696], [-73.88567038650775, 40.560049309167745], [-73.8856904900261, 40.56004503354367], [-73.88570870779338, 40.56004202574859], [-73.88572526989816, 40.56003868425911], [-73.88574489795874, 40.56003382950418], [-73.88576087880901, 40.560031534325674], [-73.88577690695864, 40.56002855349206], [-73.88579419469708, 40.56002347961752], [-73.885808948384, 40.560018954394295], [-73.88582778528144, 40.56001342084513], [-73.88584691761402, 40.560008403746096], [-73.88586762480838, 40.56000344081322], [-73.88589285465979, 40.55999623545903], [-73.88590609226951, 40.559992339467115], [-73.88593359689607, 40.55998449522671], [-73.88594540242342, 40.55998079767123], [-73.88597470624889, 40.5599719357883], [-73.88598972144771, 40.559966941382854], [-73.88600862950243, 40.55996049667945], [-73.8860289513432, 40.55995272704177], [-73.88604894163463, 40.55994435982744], [-73.88607110952485, 40.559936177712395], [-73.88608492815555, 40.55993135332302], [-73.88611109684452, 40.5599219190292], [-73.88614853091195, 40.559906710922064], [-73.88616863902541, 40.55989853478779], [-73.88618585685326, 40.55989178213551], [-73.88620281397749, 40.559885524775694], [-73.88622110842529, 40.559878854939434], [-73.88623901467702, 40.5598714435634], [-73.8862589101418, 40.559862878700876], [-73.88628023867297, 40.55985404553071], [-73.88631124047652, 40.559842404749475], [-73.88633210557335, 40.55983469875457], [-73.88634885109194, 40.559828081142044], [-73.88636686065661, 40.55982086853882], [-73.88638642583061, 40.55981262816794], [-73.88640556342533, 40.559804586731325], [-73.8864200715227, 40.55979756013298], [-73.88643674773688, 40.55978970556589], [-73.88644624442207, 40.55978559003428], [-73.88646991785976, 40.55977579249977], [-73.88648678162845, 40.559769373171946], [-73.88650786008945, 40.55976107999615], [-73.88652795651807, 40.55975287748531], [-73.8865440262614, 40.559746945379146], [-73.88656470274908, 40.55973786675081], [-73.8865848474998, 40.55972875190983], [-73.88660159386502, 40.55972108736699], [-73.88661008661221, 40.559716889076086], [-73.88663477870321, 40.55970609939591], [-73.88664823292167, 40.55970005713933], [-73.88666264554954, 40.559693860359204], [-73.88667740176875, 40.559687375764824], [-73.88669180276406, 40.55968117025798], [-73.88671025250878, 40.55967327350798], [-73.88672558815315, 40.55966693271705], [-73.88674273568994, 40.55965998222653], [-73.88676002423266, 40.559653427075666], [-73.88677742056535, 40.55964703620761], [-73.88680568666378, 40.55963611448223], [-73.88682510812184, 40.55962862325619], [-73.88684618561702, 40.55962033052007], [-73.88686545531702, 40.559611521682534], [-73.88688214219336, 40.55960366823392], [-73.88689517092206, 40.559596829427264], [-73.88690777389455, 40.559590153876584], [-73.88692159769377, 40.55958180841585], [-73.88693506601751, 40.559573761309196], [-73.88694127351818, 40.55957027492404], [-73.88696170683093, 40.5595581541445], [-73.88697348578656, 40.55954931044137], [-73.8869831680338, 40.55954089891125], [-73.8869889206047, 40.559532745363036], [-73.88699238967502, 40.55952481456039], [-73.88699518208136, 40.559517732468485], [-73.88699547207565, 40.55951471838837], [-73.8869526003802, 40.559432161692335], [-73.88695038899543, 40.55942845241411], [-73.88694833771328, 40.55942501938266], [-73.88697510801153, 40.55940048299849], [-73.8870058914951, 40.55940590791807], [-73.88701103333392, 40.55941662869161], [-73.88701797484295, 40.55943110725562], [-73.88702989018371, 40.5594582420669], [-73.88706563479928, 40.559539603771576], [-73.88706621334039, 40.55954014562952], [-73.88707182997231, 40.559542104885786], [-73.88708924527616, 40.55954187004284], [-73.8871069574882, 40.559541806202056], [-73.88712214223418, 40.559541271628646], [-73.88714024448572, 40.55954047036431], [-73.88715841708209, 40.559539766836295], [-73.88718163115941, 40.55953938455414], [-73.88719563399836, 40.55953958778435], [-73.8872120089974, 40.55954039644993], [-73.88722917637295, 40.55954077299398], [-73.88724694515936, 40.55954128716527], [-73.8872650100889, 40.55954138447507], [-73.88729132758633, 40.559541987277065], [-73.88731003010243, 40.55954239262288], [-73.88733151943774, 40.55954213426556], [-73.88735455628775, 40.55954186050148], [-73.88737553751076, 40.559541627939694], [-73.88739594207813, 40.55954129713888], [-73.88741472854424, 40.55954076605785], [-73.88743154221267, 40.55954039554417], [-73.88744783717925, 40.559540078296685], [-73.88746871260936, 40.55953966618983], [-73.88750700361999, 40.55953950551237], [-73.88753042924644, 40.559540024175064], [-73.88755174014868, 40.559540459510615], [-73.88757175204198, 40.55954138929165], [-73.88759312195924, 40.55954239059326], [-73.88761179944223, 40.559543184032236], [-73.88762863594864, 40.559543470061634], [-73.88764645226922, 40.55954406446454], [-73.8876609625663, 40.55954423998936], [-73.8876688394054, 40.55954403141244], [-73.88769425074301, 40.55954285021504], [-73.88771534057113, 40.55954138484503], [-73.88773229808184, 40.55954024915129], [-73.8877467994364, 40.55953894855066], [-73.88776681567525, 40.55953729264541], [-73.88778395211988, 40.55953503064802], [-73.88780158577295, 40.559531779367056], [-73.88781954941862, 40.55952861786679], [-73.88783280130949, 40.55952629829073], [-73.88785342476315, 40.55952184270132], [-73.88787524355067, 40.55951557895216], [-73.88789256106391, 40.559510651379526], [-73.88791143846906, 40.559504744271536], [-73.88792461201481, 40.55950028156606], [-73.88794172129407, 40.55949286026788], [-73.88795601960904, 40.55948557142159], [-73.8879666430407, 40.559480646018855], [-73.88798040932177, 40.55947428493372], [-73.88799632718069, 40.55946606870868], [-73.88800753009538, 40.55946073057104], [-73.8880237288675, 40.55945410011914], [-73.88804760878529, 40.55944383086408], [-73.88806295796348, 40.55943651555387], [-73.88807775364894, 40.559429172227354], [-73.88809382369216, 40.55942122736799], [-73.88811183072283, 40.55941364458273], [-73.8881272377495, 40.5594074546186], [-73.88814416728067, 40.55940201449128], [-73.88816231056654, 40.559397665157825], [-73.8881751281128, 40.55939353462369], [-73.88818845551663, 40.55938833356594], [-73.88821164791288, 40.55937973806882], [-73.88823408223281, 40.55937221318295], [-73.88825247898284, 40.55936484703594], [-73.88826990484918, 40.55935866018959], [-73.88828704675458, 40.55935283208105], [-73.8883044874921, 40.559345103801405], [-73.88831780453516, 40.559338335978985], [-73.88833477455884, 40.55933020248467], [-73.88834640400576, 40.559323676774106], [-73.88835120127615, 40.559321465854765], [-73.88837425445327, 40.559310583071266], [-73.8883934805104, 40.55930182168098], [-73.88841196066112, 40.559293554111164], [-73.88843460892724, 40.55928547185446], [-73.88845783242984, 40.55927899190529], [-73.88847432349478, 40.55927392958595], [-73.88848599622588, 40.55927001468934], [-73.88850010155922, 40.55926484115546], [-73.88851497721903, 40.55925914584185], [-73.8885450129397, 40.55924633483122], [-73.88856043165234, 40.559239676071755], [-73.88857518948606, 40.559233764857495], [-73.88858819830041, 40.55922844650834], [-73.88860163108474, 40.55922297544663], [-73.8886153128972, 40.5592179360143], [-73.88864142483696, 40.559207506966594], [-73.88866346050536, 40.5591981893755], [-73.8886823662905, 40.55918978882082], [-73.88870563469126, 40.559177815392125], [-73.88872095207054, 40.559168411200375], [-73.8887338823092, 40.55916093095282], [-73.88874756681224, 40.55915386640597], [-73.88876356449067, 40.559147343879125], [-73.88877861484137, 40.559142504443344], [-73.88879445734517, 40.55913722449878], [-73.88881184628468, 40.559131910365224], [-73.88882876320554, 40.559126712708014], [-73.8888431745663, 40.55912266539673], [-73.88886870236347, 40.55911514354833], [-73.88888522950117, 40.55910961228872], [-73.88889898140337, 40.559104798553264], [-73.88891371347253, 40.55909981505114], [-73.88892976811798, 40.559094418357304], [-73.88894827995512, 40.55908881764011], [-73.88896538647242, 40.55908292623725], [-73.88898168957054, 40.559077511683064], [-73.88899879608117, 40.55907162077792], [-73.88901342180179, 40.55906598831686], [-73.88903236176469, 40.559058650044825], [-73.88904806278256, 40.55905256896803], [-73.88906459552393, 40.559044570642705], [-73.88907860002212, 40.559036703227164], [-73.88908973099831, 40.55903120408575], [-73.88910490444815, 40.55902350029977], [-73.88912460287192, 40.559013640749676], [-73.88914307298448, 40.55900443656022], [-73.88915842352391, 40.55899709430007], [-73.8891750585287, 40.558990329580226], [-73.88920044973277, 40.55897995331932], [-73.8892171555851, 40.55897337696537], [-73.88923433400562, 40.55896661276099], [-73.88924992947923, 40.558960838469666], [-73.88926519408469, 40.55895536792398], [-73.88928182463887, 40.558951673504886], [-73.88929867917054, 40.558948286214004], [-73.88931527232135, 40.55894555521843], [-73.8893351879128, 40.55894061284399], [-73.88933571933883, 40.55894043275875], [-73.88934793480718, 40.55893633887288], [-73.88936900021129, 40.55892812858948], [-73.88938592166666, 40.558920400147834], [-73.88939953358431, 40.55891372194484], [-73.88941636213822, 40.55890478685904], [-73.8894280985923, 40.558897467720286], [-73.8894400605295, 40.558889545689766], [-73.88945256487835, 40.55888223616687], [-73.88946571895634, 40.55887466659123], [-73.88947903966285, 40.55886595478817], [-73.88949428876107, 40.55885589102979], [-73.8895032919375, 40.55885181212977], [-73.8895241314313, 40.55884470009413], [-73.88953821130872, 40.55884100318434], [-73.88955600226384, 40.55883544556875], [-73.88957202650458, 40.55882750984012], [-73.8895834926073, 40.55881961362015], [-73.88959408512527, 40.55881106051208], [-73.88960513997493, 40.55880239861796], [-73.88961883994106, 40.5587923889739], [-73.88959262563444, 40.558698140938716], [-73.88963947542904, 40.55866435179396], [-73.88966114737742, 40.558694192269215], [-73.88971251660583, 40.5587723978264], [-73.88973183055423, 40.558773532957865], [-73.88974665924717, 40.55877433877252], [-73.88976684651834, 40.55877655563952], [-73.8897884365622, 40.55877953912548], [-73.88981016755976, 40.55878282965744], [-73.88982638760736, 40.55878493398074], [-73.88984272640757, 40.55878615570057], [-73.88986547856697, 40.55878639380159], [-73.88988292695555, 40.55878781594024], [-73.88990545270576, 40.55878962055579], [-73.88992527143604, 40.55879315181626], [-73.88994362517927, 40.55879634845245], [-73.88996071980075, 40.5587975807641], [-73.88997827768068, 40.55879720941802], [-73.88999497422743, 40.5587971441591], [-73.89001495135712, 40.558797460321856], [-73.89003085569685, 40.55879734052204], [-73.89004747960237, 40.55879763638038], [-73.89006522538631, 40.55879813920445], [-73.89008167051098, 40.55879909143648], [-73.89010045639388, 40.55879864116776], [-73.89011859438818, 40.55879786593821], [-73.89013605771044, 40.5587967571785], [-73.89015182107171, 40.55879687981027], [-73.8901698816206, 40.558798987018065], [-73.89017732999744, 40.558800138202194], [-73.89018413011773, 40.55880118824803], [-73.89019106912332, 40.558803536783074], [-73.89019916422593, 40.55880625532376], [-73.89020264144463, 40.55880928390291], [-73.89021653553505, 40.55881154962421], [-73.89023464758462, 40.55880464124942], [-73.89025218137611, 40.55879713825806], [-73.89026622960283, 40.55879155065402], [-73.8902820358403, 40.55878616241276], [-73.8902961529898, 40.55878153816775], [-73.89031160456129, 40.558776501396466], [-73.89032621782147, 40.55877179586696], [-73.89034504805443, 40.55876626659655], [-73.89037454574526, 40.55875691190846], [-73.89039100139331, 40.558751848107434], [-73.89040687782477, 40.55874757750802], [-73.89042333184365, 40.55874350397011], [-73.89044251425915, 40.55873872270572], [-73.8904563463809, 40.55873497166995], [-73.89047102896177, 40.55873097936286], [-73.8904887144675, 40.558725231523454], [-73.89050235858414, 40.558720661249225], [-73.89051863774655, 40.558715246454135], [-73.8905491641333, 40.55870489305075], [-73.89057314703759, 40.55869638779369], [-73.89059425787754, 40.55868926644073], [-73.89061099796507, 40.558683653883655], [-73.89062392295904, 40.55867919046423], [-73.89063850105025, 40.55867393653616], [-73.89065244339335, 40.5586679167243], [-73.8906680755495, 40.55866068258737], [-73.89068514879413, 40.55865375556194], [-73.89070326159215, 40.558646333802265], [-73.89071751952281, 40.55864195289293], [-73.89073738740578, 40.55863651517912], [-73.89075892304187, 40.558630187454135], [-73.89077963004345, 40.55862485691262], [-73.89079589630344, 40.558619378907174], [-73.890810771714, 40.558613224934135], [-73.89082208107335, 40.55860758088106], [-73.89083940306162, 40.55859963682764], [-73.89085496498267, 40.55859221261952], [-73.89087643516281, 40.5585822375168], [-73.89089516097698, 40.558574546251144], [-73.89091301383365, 40.55856715218892], [-73.8909297671219, 40.55856054932864], [-73.89094582323652, 40.55855461156789], [-73.89096025963967, 40.55854960122033], [-73.89097938744426, 40.558542153576006], [-73.89099331738521, 40.558536160515736], [-73.89101216480755, 40.55852755965913], [-73.89102836401084, 40.55851993901709], [-73.89104144405664, 40.55851424167256], [-73.89105494917361, 40.55850838390105], [-73.89106808825646, 40.55850284911347], [-73.89108116693396, 40.55849717856786], [-73.89109520382699, 40.55849132079333], [-73.89111285503942, 40.55848403523582], [-73.89112776621204, 40.55847787019866], [-73.89114339681828, 40.558471663121374], [-73.89115908759332, 40.55846505972316], [-73.8911772826573, 40.55845777299581], [-73.89118391048598, 40.5584550860648], [-73.89120803770966, 40.5584448532435], [-73.89122525414977, 40.55843665539153], [-73.89124131255271, 40.55842873755561], [-73.8912568743287, 40.558421890265954], [-73.89127004696967, 40.55841636486876], [-73.89128423749976, 40.558410830549214], [-73.89130299743927, 40.55840370734326], [-73.89131718794901, 40.55839818223389], [-73.89133357396578, 40.558391940161634], [-73.89134873135693, 40.55838629852463], [-73.89137023241307, 40.558379403061025], [-73.89138923834852, 40.558373765058555], [-73.89140483105456, 40.55836949355042], [-73.8914188761831, 40.55836569753456], [-73.89143378338977, 40.558361128343805], [-73.89145192790853, 40.558356254793445], [-73.89146564052045, 40.55835283674026], [-73.89148184843577, 40.55834777305136], [-73.89149498721612, 40.55834224809906], [-73.89150868211286, 40.558335668567075], [-73.89151945556257, 40.558325466958095], [-73.89152846414585, 40.55831834338345], [-73.8915482632456, 40.558311742639354], [-73.89156731550995, 40.5583071773453], [-73.89158297770366, 40.558303518535425], [-73.89159799271951, 40.55829814678933], [-73.89161127463389, 40.558291846797864], [-73.89162655615469, 40.558282369644104], [-73.89164055934089, 40.558275026283454], [-73.89165446820805, 40.55826787046567], [-73.8916682591017, 40.55826058938992], [-73.89168619603952, 40.55825176424637], [-73.89170233654164, 40.55824395230224], [-73.8917141761112, 40.55823892131808], [-73.8917278339071, 40.558233386944096], [-73.89174360874942, 40.558225937016665], [-73.89175592486993, 40.558217708163916], [-73.89176760137714, 40.55821028017018], [-73.89178229273934, 40.55820115374988], [-73.89179238639566, 40.55819468940188], [-73.89180333059387, 40.55818833223582], [-73.8918173438662, 40.55818192535524], [-73.89182486838432, 40.55817957244886], [-73.89185168389997, 40.558178607433305], [-73.89186809765137, 40.558177965165406], [-73.89188170127139, 40.55817643870762], [-73.89189898298577, 40.55817192496629], [-73.89191180091986, 40.55816672299687], [-73.89192354828387, 40.55816042152499], [-73.89193651477026, 40.55815150924031], [-73.89194793452896, 40.55814255160612], [-73.8919576292185, 40.55813476103659], [-73.89197200524211, 40.55812351923029], [-73.89198479627267, 40.558113210748324], [-73.89199719571869, 40.55810463114042], [-73.89200886207534, 40.55809720311257], [-73.8920211869688, 40.558090578338486], [-73.8920300739883, 40.558085228249276], [-73.8920445263986, 40.55807821847862], [-73.89206134338015, 40.558068211305454], [-73.89207391762217, 40.55806100978695], [-73.89208699685538, 40.55804822513736], [-73.89211373696473, 40.55791654611905], [-73.89213864396103, 40.55787154199658], [-73.89216471320687, 40.55786825290236], [-73.8921993963761, 40.557911357569026], [-73.89220367738248, 40.55795112129285], [-73.89226637138374, 40.55802542116516], [-73.89227848852535, 40.55803087222673], [-73.89229729856612, 40.55803709366762], [-73.8923172563169, 40.55804193942072], [-73.89233895484402, 40.5580436347269], [-73.8923581722535, 40.55804650778437], [-73.89237238317288, 40.55804961889782], [-73.8923883154821, 40.5580537037986], [-73.89240443414792, 40.55805977946199], [-73.89240849233514, 40.558061899501595], [-73.89242549285805, 40.558077693727896], [-73.89243810858285, 40.558088907095694], [-73.8924492860879, 40.5580985798506], [-73.89246225917607, 40.55810789526906], [-73.89247739622482, 40.55811424827028], [-73.89249384089474, 40.558116218570916], [-73.89250945943235, 40.55811779054769], [-73.89252745099384, 40.55811929354253], [-73.89254519501212, 40.55812024713994], [-73.89255904386211, 40.55812069215576], [-73.89256782772809, 40.558121276172855], [-73.89259676604209, 40.558121475123855], [-73.89261533023675, 40.558119565051186], [-73.89263311420149, 40.55811807809675], [-73.89265316574712, 40.55811598009951], [-73.89266882387994, 40.55811437354665], [-73.89268761034235, 40.55811384160342], [-73.89270938425692, 40.55811265589837], [-73.89272522039116, 40.55811086019516], [-73.89274005394665, 40.55810870453696], [-73.89275822850786, 40.55810649654415], [-73.8927839978274, 40.558102486315704], [-73.89280034483944, 40.55809865609336], [-73.8928155345823, 40.5580946364851], [-73.89283174003617, 40.55809100431415], [-73.89284949188885, 40.55808748180786], [-73.89286694672911, 40.55808480588546], [-73.89288343253995, 40.55808235371434], [-73.89290109973307, 40.558080119426094], [-73.8929185314161, 40.55807791071519], [-73.89293684750216, 40.558075514019976], [-73.8929565712635, 40.558071795649965], [-73.89297166705921, 40.55806800042365], [-73.89298807345267, 40.558063837013016], [-73.89300506972839, 40.55806028680634], [-73.8930230319097, 40.55805763830519], [-73.89304052257285, 40.55805507832052], [-73.89305931230533, 40.55805207927418], [-73.89307393396348, 40.55804945462687], [-73.89308984296201, 40.55804630848276], [-73.89310568151681, 40.55804298334897], [-73.89312594855188, 40.55803879603688], [-73.89315180317428, 40.55803292153244], [-73.89316803285013, 40.55802895611955], [-73.89318481921103, 40.55802342498507], [-73.89319530403395, 40.558016193925795], [-73.89320861760801, 40.55801153238895], [-73.8932276638708, 40.558011009980724], [-73.893248790743, 40.55800852588513], [-73.89326280142214, 40.55800363162097], [-73.89327827868684, 40.557997107981656], [-73.8932950656039, 40.55799163060862], [-73.89331270247462, 40.55798580271254], [-73.89332746870785, 40.557981484607396], [-73.89334402797203, 40.55797757375552], [-73.89335990249572, 40.55797385174166], [-73.89337632196165, 40.55796917497612], [-73.89339216208175, 40.557964848477944], [-73.89340847281092, 40.55796100054482], [-73.89342424263211, 40.55795654012065], [-73.8934359490259, 40.55795322752472], [-73.89345614580793, 40.557949400781055], [-73.89347065050556, 40.55794557863864], [-73.89348635361986, 40.557937902239985], [-73.89349979678227, 40.5579268838673], [-73.89351478690286, 40.55791479373087], [-73.89353242776691, 40.55790643509797], [-73.8935451768539, 40.55790063010987], [-73.89354955190153, 40.557896762381354], [-73.89355458792144, 40.55789231879493], [-73.8935595172113, 40.5578893781875], [-73.89356665523418, 40.55788511547052], [-73.89358631459312, 40.55787667862058], [-73.89360532636421, 40.55786799623861], [-73.89361865369972, 40.55786279455059], [-73.8936355454664, 40.557857506701225], [-73.89365297118835, 40.557851263585704], [-73.8936676264106, 40.557842136890784], [-73.89367995542506, 40.55783292745856], [-73.89369137329186, 40.55782497750927], [-73.89370398329113, 40.55781738935402], [-73.8937191808256, 40.55780922561365], [-73.89373488375027, 40.55780163043292], [-73.89374749199403, 40.557795554563654], [-73.8937616438375, 40.557790930594926], [-73.89378003300159, 40.55778767792253], [-73.89379029427897, 40.55778656261638], [-73.89381008575477, 40.557784518456536], [-73.8938275574881, 40.55777929310122], [-73.89384242170522, 40.55777214845591], [-73.89386234461092, 40.55776217019205], [-73.89387427890601, 40.55775625635762], [-73.89387797702273, 40.55775442230676], [-73.8938941053769, 40.55774710693721], [-73.89391154277077, 40.557740396049745], [-73.89392471499531, 40.5577358782076], [-73.89394099359602, 40.55773049090422], [-73.89395525321527, 40.55772506554817], [-73.8939708512668, 40.55771722648225], [-73.89398576390695, 40.55770958547193], [-73.89399779211266, 40.55770386051754], [-73.8940138143366, 40.55769586100857], [-73.8940258456031, 40.55768917258961], [-73.89404137259272, 40.55768070269839], [-73.8940541575225, 40.55767440196597], [-73.89407049888413, 40.55766709665221], [-73.8940831766383, 40.557661614871385], [-73.89409993015835, 40.55765452453946], [-73.89411487596625, 40.55764797382773], [-73.89412708245119, 40.557641590799165], [-73.89414340108867, 40.55763364532236], [-73.89415434322012, 40.557627838601135], [-73.89416716493481, 40.55762062770001], [-73.89418431266425, 40.557610792406386], [-73.89419667280882, 40.5576041845194], [-73.89421276567148, 40.55759690458869], [-73.89422328361127, 40.55759098003173], [-73.89423647214896, 40.557582924104615], [-73.89425270890521, 40.55757437526173], [-73.89426830527626, 40.5575675538981], [-73.89427586644453, 40.5575647063165], [-73.8943040279781, 40.557555790160436], [-73.8943238969548, 40.55754927142693], [-73.8943430567223, 40.55754341679638], [-73.89436062314624, 40.55753741745889], [-73.8943777294342, 40.55753153396132], [-73.89439432946315, 40.55752493045477], [-73.8944106466766, 40.557517291853465], [-73.894428581734, 40.557509022814216], [-73.89444046916708, 40.55750351396518], [-73.89445645580385, 40.55749600890995], [-73.89447226487341, 40.55748855813667], [-73.89449181506372, 40.55748247985239], [-73.89450707869523, 40.557477000400205], [-73.89452105398466, 40.55747213241962], [-73.89453427277226, 40.557467695802316], [-73.8945501135457, 40.557462415062396], [-73.89456551849206, 40.557457296926685], [-73.89457849050979, 40.557452364356614], [-73.89459382460936, 40.557446065903875], [-73.89460757906444, 40.55743971222238], [-73.89463210764855, 40.55742818019064], [-73.89464726684704, 40.55742149457613], [-73.89466465983715, 40.557413171225676], [-73.89467979669054, 40.55740546834485], [-73.89469513329593, 40.55739812466174], [-73.89471090600708, 40.55739169156647], [-73.89472783505299, 40.55738547580988], [-73.89474633523552, 40.55737829752368], [-73.8947661476704, 40.55737066039972], [-73.89477504316352, 40.55736740004149], [-73.8948011434219, 40.55735592486592], [-73.89481652964469, 40.557347185185385], [-73.89482859594897, 40.55734005477039], [-73.89484124113268, 40.55733244022019], [-73.89485719504914, 40.55732334036199], [-73.8948763610934, 40.55731342556071], [-73.89489400002807, 40.557306083958345], [-73.89490822437855, 40.55730063097663], [-73.89492507893114, 40.55729678332568], [-73.89494140837533, 40.55729651832173], [-73.89494848366209, 40.5572950393059], [-73.89495142499406, 40.5572939254094], [-73.89495276013942, 40.55729301694315], [-73.89495419117144, 40.5572918929536], [-73.89495517340907, 40.557289822009714], [-73.8949559942491, 40.55728646479082], [-73.89495649475008, 40.55728302435171], [-73.89495626172017, 40.557281475492154], [-73.89489756403287, 40.55714972853696], [-73.8948819661663, 40.5571053905375], [-73.89489010400668, 40.55708833355588], [-73.89489014015683, 40.55708825233697], [-73.8949181726631, 40.5570787962983], [-73.89494218163914, 40.55709000172235], [-73.89495564136901, 40.55710520598147], [-73.89496631694892, 40.557133464806725], [-73.89501734885607, 40.5572601081249], [-73.895017937896, 40.55726084646501], [-73.89501879965948, 40.55726121782891], [-73.89502000255709, 40.55726157794511], [-73.8950457120951, 40.55726554626917], [-73.8950640624076, 40.55727179431212], [-73.89507707602817, 40.55727794801569], [-73.89509113472049, 40.55728677661734], [-73.89510797247821, 40.55729417721755], [-73.89512221087577, 40.55730215124209], [-73.89513439494031, 40.557309951000626], [-73.89514345051357, 40.55731747901628], [-73.89514753304947, 40.55732706428157], [-73.89514852671894, 40.5573405191808], [-73.89514692835664, 40.557351414034585], [-73.89515159156545, 40.55735923439968], [-73.89516164657343, 40.55736885208905], [-73.89517340416194, 40.55737814799899], [-73.89518458696945, 40.557385037150844], [-73.89519982761882, 40.557393318492444], [-73.89521720563008, 40.55740234008633], [-73.89523064412063, 40.55740819712954], [-73.89524370640552, 40.55741317932196], [-73.89526805469517, 40.55741962160901], [-73.89528651630843, 40.55742202540892], [-73.89530166347386, 40.55742297571036], [-73.89531893658403, 40.55742354095342], [-73.89533908996137, 40.5574236943498], [-73.89535719235813, 40.5574223697679], [-73.89537230601208, 40.557421717103324], [-73.89538789129564, 40.55742146006947], [-73.89540595765068, 40.557420567506725], [-73.89542036374307, 40.55741953590894], [-73.89543626972052, 40.55741843380473], [-73.89544354339156, 40.557418053432635], [-73.89547081878321, 40.557416484045575], [-73.89549445853949, 40.55741546033939], [-73.89551188771064, 40.557414270149664], [-73.8955279008104, 40.557412366667016], [-73.89554482506938, 40.55740916732931], [-73.89556565952896, 40.557404575518156], [-73.89558391866811, 40.557401052380484], [-73.89560237805892, 40.55739785392745], [-73.89561699906224, 40.557395211365225], [-73.89563232828618, 40.55739294705717], [-73.89565436553595, 40.55738920285144], [-73.89567357950362, 40.55738595079279], [-73.89569085963721, 40.55738201328512], [-73.89570692406242, 40.55737761530376], [-73.89572107424323, 40.557374053399265], [-73.89573877925031, 40.5573699269612], [-73.89575393356245, 40.557366293423726], [-73.895766501129, 40.557363171350985], [-73.89578748916927, 40.5573583908326], [-73.8958042376851, 40.557354344266095], [-73.89582644044448, 40.557350653954664], [-73.89583376321649, 40.55734103399283], [-73.89583913360062, 40.55733530280698], [-73.89585185203113, 40.557326138392895], [-73.8958669424309, 40.55731784024725], [-73.89587965836685, 40.557310412777895], [-73.89589515186488, 40.55730109775243], [-73.895905849487, 40.55729278640562], [-73.89591892385134, 40.557282559496855], [-73.89593506810212, 40.55727173108796], [-73.89594551358121, 40.557267211548584], [-73.89596128166882, 40.557262803881514], [-73.89598835415671, 40.55725635454412], [-73.89600401650891, 40.55725227948989], [-73.89602108451805, 40.55724784668942], [-73.89604177905677, 40.557242074416926], [-73.8960648951546, 40.557235647782555], [-73.89608718331206, 40.55722941037322], [-73.89610882361058, 40.55722366524659], [-73.89612955327631, 40.557217894162804], [-73.89617571486743, 40.55720522021451], [-73.896193716343, 40.55719967114288], [-73.89621316114835, 40.55719312422436], [-73.89623375248901, 40.55718532621989], [-73.89625477931412, 40.55717828500269], [-73.89627753339919, 40.55716944473003], [-73.8963028574274, 40.55715491460955], [-73.89633257498987, 40.557140172670785], [-73.89635374860089, 40.55712996190202], [-73.89636887458332, 40.55712173676558], [-73.89638072903632, 40.55711411848442], [-73.89639189314381, 40.55710946402104], [-73.89640888902028, 40.55710547253934], [-73.89642634856298, 40.55710035550458], [-73.89644593365945, 40.55709438397091], [-73.89647070447474, 40.557086419481834], [-73.89649489769143, 40.55707839951718], [-73.89652079133806, 40.55706958782534], [-73.8965351208921, 40.55706487304129], [-73.89654869476571, 40.55705964493324], [-73.89657303082267, 40.557050859301526], [-73.89659881984007, 40.557040805766256], [-73.89662413630357, 40.557031939754296], [-73.8966502984294, 40.557025759499666], [-73.89667381225632, 40.55702141315194], [-73.89669126886511, 40.55701731381856], [-73.89670686171098, 40.55701252710642], [-73.89672018771319, 40.5570073525323], [-73.8967319909397, 40.55700228414152], [-73.89674603923494, 40.556995488021734], [-73.89676232388463, 40.55698592162546], [-73.89677993051063, 40.55697655460287], [-73.89679286790525, 40.556970549560404], [-73.89680827343786, 40.55696444035251], [-73.89682509817398, 40.55695701697257], [-73.89684263133437, 40.556949981890874], [-73.89684674230215, 40.55694826622373], [-73.89686257314483, 40.55694167859004], [-73.89688782001124, 40.556931606409684], [-73.89690139405178, 40.556926377087386], [-73.89691461391158, 40.55692149992849], [-73.89694316598658, 40.55691189073978], [-73.89695825050372, 40.55690668856569], [-73.89697236759687, 40.55690154264956], [-73.89699522942668, 40.55689179163874], [-73.8970085611632, 40.5568825820784], [-73.89701959656192, 40.55687031772734], [-73.89702194052781, 40.5568662679505], [-73.8970272086246, 40.55685712319525], [-73.89703572008942, 40.55684239774318], [-73.89704812159891, 40.5568323321039], [-73.89706181021296, 40.55682171811885], [-73.89707345559772, 40.55681113798495], [-73.89708358566833, 40.556795964999594], [-73.89708396311498, 40.55678079148345], [-73.8970794853591, 40.55676738725561], [-73.89707637644929, 40.55675498457543], [-73.89707449198416, 40.55674435612907], [-73.89706961439545, 40.556729718522305], [-73.89706825020895, 40.55671828019991], [-73.89706586648651, 40.55670237578893], [-73.89706380003445, 40.55669496241343], [-73.89706459160598, 40.55666362447431], [-73.89707956116763, 40.55665743308464], [-73.89709684679295, 40.55665631372607], [-73.89711859133806, 40.55665886341114], [-73.89712552628787, 40.5566638591667], [-73.89712899705194, 40.5566722097887], [-73.89712965360629, 40.55667490358769], [-73.89713317547921, 40.55668786501365], [-73.89713692363696, 40.55669965560804], [-73.89713909670532, 40.55671457944371], [-73.8971421344785, 40.5567273971977], [-73.89714624648263, 40.55674125996009], [-73.89715174000722, 40.55675416987645], [-73.89715560272309, 40.556768311855095], [-73.89715972516333, 40.55678239040479], [-73.89716376799583, 40.556794533744885], [-73.8971685651108, 40.55680724317386], [-73.89717146548982, 40.55681814325643], [-73.8971742583602, 40.55682868087554], [-73.89717686335517, 40.556839696456755], [-73.89718544253134, 40.55684974521011], [-73.89718596194871, 40.55685035012306], [-73.89719491170374, 40.556857525399444], [-73.89720641046021, 40.55686628829197], [-73.89722312098311, 40.556879235718824], [-73.89723833191195, 40.55689164872123], [-73.89725586404428, 40.556907667199134], [-73.89726846764735, 40.556919718848434], [-73.89727249952617, 40.5569235761454], [-73.89728569121945, 40.55693657369006], [-73.89729639319526, 40.55694871309642], [-73.89730646248513, 40.556957916644514], [-73.89731702574228, 40.55696813787503], [-73.89733107996251, 40.55698088422068], [-73.89734247111011, 40.556990088947224], [-73.89735688619311, 40.55699842304187], [-73.89738317571349, 40.557008351405194], [-73.89739670068455, 40.557012317697264], [-73.89741076797287, 40.55701628329958], [-73.89742494255967, 40.5570204647744], [-73.8974521682449, 40.5570286757713], [-73.89747886443095, 40.55703569665914], [-73.8974949749068, 40.55703966357232], [-73.89751083763664, 40.557043189993635], [-73.89753033601893, 40.55704771109849], [-73.89754969422717, 40.55705096940199], [-73.89757027835604, 40.55705562482243], [-73.89759035599648, 40.55705926371858], [-73.89760880582952, 40.557061747214036], [-73.89762902628063, 40.55706464675381], [-73.89764889366454, 40.557066889425606], [-73.8976674504286, 40.55706954422247], [-73.89768375286748, 40.557071809511456], [-73.89769954625487, 40.55707415609912], [-73.89771646166686, 40.557076611405705], [-73.89773246916396, 40.55707827365239], [-73.8977478752496, 40.557079800164864], [-73.89776467433823, 40.557081049815494], [-73.89778000860085, 40.5570824320163], [-73.897807315341, 40.557084653806896], [-73.8978294010433, 40.557087716302256], [-73.8978403770865, 40.55709063505544], [-73.89789049233032, 40.55710114337298], [-73.89790819996253, 40.55710321336677], [-73.89792895544443, 40.55710414032963], [-73.89795109363448, 40.55710390854008], [-73.89797204009112, 40.557103188845744], [-73.89799514796813, 40.55710213718018], [-73.89801627293306, 40.55710002160966], [-73.89803275813097, 40.55709855075931], [-73.89804859220533, 40.557097852814124], [-73.8980659371215, 40.557097094724284], [-73.8980844780186, 40.55709461615587], [-73.89810877058365, 40.55709060392503], [-73.89813040714631, 40.557086588830586], [-73.89814966647052, 40.5570845697532], [-73.89817420196248, 40.55708459150909], [-73.89819087384122, 40.55708428295651], [-73.89820767867585, 40.55708191155608], [-73.89823432134004, 40.55707770269115], [-73.89824828256276, 40.557074337825625], [-73.89826081312597, 40.557071169878974], [-73.89828608894082, 40.557065204747936], [-73.89831103530717, 40.557058642578106], [-73.89833278263819, 40.55705182728118], [-73.89833569993478, 40.55705087527831], [-73.89835175395899, 40.55704563910081], [-73.89837620677743, 40.55703704316941], [-73.89839853425389, 40.557029318686105], [-73.89842095425452, 40.55702184574273], [-73.89844375413135, 40.557014013109054], [-73.8984653939166, 40.557006980740866], [-73.89848519167198, 40.55700142401907], [-73.89850283567749, 40.55699765796057], [-73.89850415960983, 40.556997443854726], [-73.89851450413911, 40.556995759436205], [-73.89851946372956, 40.55699495247123], [-73.89854145485809, 40.556990721834175], [-73.89856820836926, 40.55698363147538], [-73.89858221850213, 40.55697927684581], [-73.89859642933534, 40.55697438110259], [-73.89861242394521, 40.55696890175033], [-73.89863179528275, 40.55696323657013], [-73.89865213659446, 40.55695669823901], [-73.89866213109286, 40.55695321020645], [-73.89867377844706, 40.55694914498283], [-73.89869631793299, 40.55694163640726], [-73.89872169283505, 40.55693255370361], [-73.89874579035636, 40.55692456065547], [-73.8987674201223, 40.556916997486745], [-73.89879060968802, 40.55690894867906], [-73.89881272425498, 40.55690063003408], [-73.89883436626594, 40.55689309316581], [-73.89885272293415, 40.556887183801], [-73.89887292268962, 40.55688039334118], [-73.89889380717528, 40.556873108932294], [-73.89891429061703, 40.55686681443596], [-73.89893448970109, 40.55686002396461], [-73.89895716970719, 40.5568528031103], [-73.89898051279202, 40.556845025127714], [-73.899001751476, 40.55683851499893], [-73.89901964668839, 40.55683271392858], [-73.89903742560581, 40.55682668658794], [-73.89905510745946, 40.55682151557216], [-73.89907191645871, 40.556816613844624], [-73.89908534721569, 40.5568121762199], [-73.8990952588455, 40.55680884454961], [-73.89911718426394, 40.55680035379417], [-73.8991319889622, 40.55679355854963], [-73.89913667895024, 40.556785232746535], [-73.8991361980517, 40.55677539714582], [-73.8991316409269, 40.55676089778553], [-73.89912776302342, 40.556747954871945], [-73.899127252222, 40.556744978422046], [-73.89912496638853, 40.55673156195941], [-73.89912301755608, 40.556719997500714], [-73.89912014069037, 40.55670713655059], [-73.899116482255, 40.55669140730439], [-73.89911530531842, 40.556678064858666], [-73.8991148690234, 40.556664876185685], [-73.89911559256481, 40.55666282642276], [-73.89911845657572, 40.55665466872397], [-73.89912302657942, 40.55665146671824], [-73.89912765821087, 40.55665152674128], [-73.89914364231204, 40.55665525676008], [-73.89915940253864, 40.55665960526806], [-73.89916984107614, 40.55666573530582], [-73.89917752317201, 40.55667933978263], [-73.89918229566776, 40.55669318328314], [-73.89918743781125, 40.55670500368147], [-73.89919277230247, 40.556715557722384], [-73.8991936285606, 40.55671725923757], [-73.89919887524741, 40.556729816356224], [-73.89920303747549, 40.556742264968655], [-73.89920745561433, 40.556755866076216], [-73.89921440127033, 40.55676770732204], [-73.89921479106768, 40.556767905349396], [-73.89922957396107, 40.55677540992367], [-73.89924945831343, 40.55677934204017], [-73.89926717190949, 40.55678034131357], [-73.89928589176947, 40.556779848272605], [-73.89930741712652, 40.55677882192768], [-73.89933282135017, 40.556777297226695], [-73.8993620690193, 40.556775311997626], [-73.89937802152436, 40.556773943685776], [-73.89939368875535, 40.55677297970663], [-73.89940979201283, 40.55677185360319], [-73.89942671038659, 40.55677028911546], [-73.89947468412873, 40.55676557209403], [-73.89949229981046, 40.55676332636019], [-73.8995088666736, 40.556761077528186], [-73.89952643464986, 40.55675885804957], [-73.8995428953049, 40.55675639384371], [-73.89955889586747, 40.556754027573284], [-73.89957409399733, 40.556752136551225], [-73.89959008378196, 40.55674977897862], [-73.89960629673782, 40.55674785365834], [-73.8996219310278, 40.55674585595963], [-73.89963666996877, 40.556744044607434], [-73.89965186792827, 40.556742117891204], [-73.89966750247613, 40.556740092711735], [-73.89968428255023, 40.55673729605025], [-73.89969927029304, 40.55673493708442], [-73.89971092077198, 40.556733112638575], [-73.89973007219342, 40.556729420583395], [-73.8997504281423, 40.556725011543264], [-73.899776266027, 40.556720341581084], [-73.89980106402501, 40.556716595135896], [-73.89981738310247, 40.55671434654569], [-73.89983703692896, 40.5567126520351], [-73.8998392362297, 40.556709454634365], [-73.89983906428724, 40.55670796129038], [-73.89983798033158, 40.55669887117745], [-73.89983344253606, 40.55668573873839], [-73.89982902357353, 40.556672165631724], [-73.89982422386589, 40.55665558067514], [-73.89981878639196, 40.556635273652574], [-73.89981540903364, 40.556620218144076], [-73.89981014077418, 40.556602787254555], [-73.89980740755739, 40.556589109738674], [-73.89980742054901, 40.5565842547332], [-73.89980743284025, 40.55657942720206], [-73.89980743937654, 40.55657697272702], [-73.89980794971703, 40.55656255303516], [-73.89980821300148, 40.55655688974863], [-73.89980874945697, 40.55654570776259], [-73.8998153126919, 40.55653798633839], [-73.89982713792294, 40.55653238624398], [-73.89983435952055, 40.55653354749377], [-73.89984389934072, 40.556540530418864], [-73.89985134924063, 40.556549253329294], [-73.89985460397277, 40.55655307032085], [-73.89986043658175, 40.556562689948166], [-73.89986280526094, 40.55656708917102], [-73.89986697964667, 40.556574872229575], [-73.89987355930764, 40.5565874063553], [-73.89987775633037, 40.55659987256426], [-73.89988092664278, 40.55661341610056], [-73.89988436306146, 40.556628058194896], [-73.89989007266728, 40.55664398856507], [-73.89989330450702, 40.556656345205184], [-73.89989600818473, 40.55666805471938], [-73.89990042650166, 40.556681627822904], [-73.89990114258784, 40.55669568018572], [-73.89990465549945, 40.55670002830306], [-73.89990511327498, 40.55670059579077], [-73.89990525489465, 40.5567006315981], [-73.89991054300054, 40.55670205032669], [-73.89992717337739, 40.55670254462433], [-73.89994434628511, 40.55670303939224], [-73.89996296313342, 40.55670076581088], [-73.89998081022584, 40.55669959071996], [-73.89999989596794, 40.5566988201166], [-73.90002112804261, 40.556697216409624], [-73.9000445342698, 40.55669380141463], [-73.9000681069652, 40.556689667353886], [-73.90009143132299, 40.556686062299214], [-73.90012215906638, 40.55668192188677], [-73.9001399862018, 40.55668013292412], [-73.90015874425124, 40.556678166348476], [-73.90017786507306, 40.556676992334125], [-73.90019780082703, 40.55667535178384], [-73.90021788945259, 40.55667400722068], [-73.90023732798454, 40.55667335382035], [-73.90025486708208, 40.55667308525868], [-73.90027092129414, 40.55667285879508], [-73.90028590299302, 40.55667261263472], [-73.90029725478689, 40.55667221740271], [-73.90032064342567, 40.55667085926856], [-73.90034986166143, 40.55666676137776], [-73.9003679049026, 40.55666336411251], [-73.90038436789672, 40.55665988371926], [-73.90039911024817, 40.556657084180756], [-73.90041463921894, 40.556654833647784], [-73.90042800925514, 40.55665332741929], [-73.90044816625621, 40.556650899794256], [-73.90046042736351, 40.55664742563202], [-73.90047944554115, 40.55664038960705], [-73.90049893890898, 40.556632257172254], [-73.90051229863236, 40.556626461824145], [-73.90051999127944, 40.55662312911406], [-73.90054055315451, 40.5566171099823], [-73.90055342537856, 40.556612115167844], [-73.90056152745782, 40.55660626584008], [-73.90056171599474, 40.556601933009674], [-73.90056532353363, 40.556584048797234], [-73.90056628452307, 40.556572812393014], [-73.90056822671836, 40.556560516709055], [-73.90056916442192, 40.556545001738314], [-73.90056656114633, 40.556535414595814], [-73.90056204279021, 40.55651931508015], [-73.90055881847431, 40.556504628626946], [-73.90055216760874, 40.556492482645645], [-73.90054602978998, 40.55647786336152], [-73.90054673933396, 40.55646865954759], [-73.90055243595958, 40.55645858169286], [-73.90055529740901, 40.55645497256074], [-73.90056044243232, 40.55644848003805], [-73.90056883774035, 40.55643863235962], [-73.90058060462704, 40.556432922907675], [-73.90059328462958, 40.55643367989423], [-73.90060403979463, 40.55643994460217], [-73.90061118090355, 40.55644973771218], [-73.90061192070245, 40.5564507539187], [-73.90061827579478, 40.556462990274376], [-73.9006253594575, 40.55647655795008], [-73.90063179349308, 40.55648991866656], [-73.90063752822185, 40.55650546202725], [-73.90063922086148, 40.556520208636705], [-73.90063905316975, 40.556539033492555], [-73.90064338752742, 40.55655731710083], [-73.90064734466947, 40.55657181588195], [-73.90065294273536, 40.5565850309605], [-73.90065660661142, 40.55659881748549], [-73.90065887908541, 40.55660871829085], [-73.90068163438659, 40.556627201777715], [-73.90075764067583, 40.55665491762217], [-73.90087569826764, 40.55668952438501], [-73.90099617912736, 40.556718873414695], [-73.9011186811175, 40.55674286675045], [-73.90124279535341, 40.55676142430721], [-73.90129932513871, 40.55676801494544], [-73.9013790712455, 40.556773489641394], [-73.9015975687611, 40.55678467017266], [-73.90181646619372, 40.55678949224021], [-73.90203544556263, 40.556787948839165], [-73.90211475525074, 40.556785818469656], [-73.90234210194804, 40.55677506579338], [-73.90256871118143, 40.55675744877271], [-73.90279422679731, 40.55673299509556], [-73.90301829436225, 40.556701743194935], [-73.90324056171957, 40.55666374218826], [-73.90346067954327, 40.55661905180018], [-73.90367830188872, 40.556567742268676], [-73.9040586929248, 40.556471486868126], [-73.90443651253365, 40.55636951103587], [-73.90481161283611, 40.55626185468858], [-73.90518384701974, 40.55614855996597], [-73.90555306939628, 40.55602967121492], [-73.90591913545822, 40.55590523497158], [-73.9062540843815, 40.555811201833535], [-73.90658574923901, 40.555710625377294], [-73.90691391033238, 40.55560357223045], [-73.90723835028673, 40.55549011331065], [-73.90755885419611, 40.555370323778796], [-73.90787520976478, 40.555244282989], [-73.90818720744909, 40.55511207443619], [-73.90849464059502, 40.55497378570035], [-73.90879730557717, 40.55482950838891], [-73.91173957602177, 40.553708247752844], [-73.91625684813306, 40.55197106561608], [-73.91701439187267, 40.55162381230808], [-73.91780653110628, 40.55127929509524], [-73.91866643765113, 40.55100383757692], [-73.91948122277843, 40.55062481534694], [-73.9264190939679, 40.54815578031995], [-73.92774080155928, 40.547628052975284], [-73.92887232480227, 40.547093874203505], [-73.93054682243256, 40.54642198013397], [-73.93256825181622, 40.54568875406016], [-73.93408287789984, 40.545164662494585], [-73.93443022334034, 40.54506977725986], [-73.93477468405521, 40.54496895875239], [-73.93511608589348, 40.544862257947116], [-73.9354542562537, 40.54474972879316], [-73.93578902417048, 40.544631428186165], [-73.93612022040107, 40.54450741593956], [-73.9364476775119, 40.5443777547543], [-73.93677122996246, 40.54424251018703], [-73.93709071418934, 40.54410175061698], [-73.93740596868945, 40.54395554721121], [-73.93771683410068, 40.543803973888956], [-73.93802315328331, 40.543647107283576], [-73.93818951458262, 40.54355291606897], [-73.93836059279961, 40.54346377778862], [-73.93853612436767, 40.543379829761406], [-73.93871583886235, 40.543301201310186], [-73.93889945941925, 40.543228013562256], [-73.93908670315919, 40.54316037926307], [-73.93927728162387, 40.543098402602986], [-73.93947090122087, 40.54304217905631], [-73.93966726367522, 40.54299179523458], [-73.93986606648828, 40.54294732875307], [-73.9400670034048, 40.542908848111445], [-73.94026976488325, 40.542876412588114], [-73.9404740385729, 40.542850072149186], [-73.94055905861713, 40.541846776959794], [-73.94073681682697, 40.54182008707755], [-73.94012975795786, 40.54800256129352], [-73.94012808934745, 40.549516289012324], [-73.94034460376172, 40.55046637784821], [-73.94055533794308, 40.55141722291513], [-73.94059494966203, 40.55159562112637], [-73.94062525857242, 40.55177507691533], [-73.94064621694748, 40.551955308142034], [-73.94065779176053, 40.55213603144505], [-73.94065996473707, 40.552316962686625], [-73.94065273238446, 40.55249781740061], [-73.94063610599748, 40.552678311238054], [-73.94061011164119, 40.55285816041557], [-73.94057479011045, 40.553037082161026], [-73.94053019686582, 40.55321479515807], [-73.940476401948, 40.55339101998872], [-73.9404134898667, 40.55356547957265], [-73.94034155946935, 40.55373789960272], [-73.94026072378509, 40.553908008976954], [-73.94017110984856, 40.55407554022405], [-73.9400728584997, 40.55424022992465], [-73.93996612416265, 40.55440181912532], [-73.93985107460422, 40.55456005374592], [-73.93972789066935, 40.55471468497929], [-73.93959676599718, 40.55486546968239], [-73.93945790671738, 40.555012170759014], [-73.93931153112626, 40.55515455753251], [-73.9391578693425, 40.55529240610875], [-73.93899716294716, 40.55542549972815], [-73.93882966460265, 40.555553629107], [-73.93865563765661, 40.55567659276616], [-73.93848163371267, 40.55579451747538], [-73.93830493156165, 40.555910084758686], [-73.93803483987291, 40.55607899748846], [-73.93775898559808, 40.55624240343239], [-73.93747756165946, 40.55640018828606], [-73.9371907648797, 40.556552241676094], [-73.93689879584473, 40.556698457237594], [-73.93665081196751, 40.55681617433575], [-73.93639947503256, 40.55692967968965], [-73.93614490798154, 40.55703891777046], [-73.93588723533774, 40.557143835137], [-73.93579840968133, 40.557186447726444], [-73.9357061256084, 40.55722454588334], [-73.93561077696388, 40.55725796701257], [-73.93551277067246, 40.557286568478986], [-73.93543377715005, 40.55730566730419], [-73.93535359729825, 40.55732163345488], [-73.93524319778129, 40.55733822480907], [-73.93513154622016, 40.55734888056493], [-73.93501919051636, 40.557353548432175], [-73.93490668202666, 40.55735220550456], [-73.93479457285805, 40.55734485837184], [-73.93468341315717, 40.55733154308852], [-73.93457374841152, 40.55731232499572], [-73.9344748677788, 40.557317243925105], [-73.93429592181836, 40.55730697346468], [-73.93411654199369, 40.5573030953179], [-73.9339371206029, 40.55730561796605], [-73.9337580500351, 40.557314535892296], [-73.93357972191251, 40.55732982959333], [-73.93340252623442, 40.55735146562236], [-73.93322685052414, 40.55737939666181], [-73.9330530789821, 40.557413561627094], [-73.93288159164659, 40.55745388580027], [-73.93271276356151, 40.55750028099284], [-73.93254696395779, 40.55755264573926], [-73.93238455544527, 40.5576108655181], [-73.93222589322, 40.557674813002755], [-73.93207132428788, 40.557744348339995], [-73.93192118670595, 40.55781931945503], [-73.93177580884338, 40.557899562384875], [-73.93136701204324, 40.558176479673165], [-73.9287848892434, 40.55992550746975], [-73.92855349315126, 40.560032481434305], [-73.92832629158498, 40.56014456377511], [-73.92810347836831, 40.56026165888648], [-73.92788524358414, 40.56038366688605], [-73.92767177341338, 40.560510483700384], [-73.92746324997567, 40.560642001153326], [-73.92725985117427, 40.56077810705851], [-73.92707319791555, 40.56091033406395], [-73.92689138187725, 40.561046425217704], [-73.9261572327542, 40.56155260972308], [-73.92586523769828, 40.5616517403206], [-73.92568426673157, 40.56170057590932], [-73.92558721708254, 40.56172522840918], [-73.92545002935539, 40.561760074936544], [-73.92529896869686, 40.561807155522494], [-73.92510052720942, 40.56182927793012], [-73.92466271025597, 40.56192245780033], [-73.92421461302578, 40.5620013188248], [-73.92329484208311, 40.562090580451525], [-73.92278702954434, 40.562067196476264], [-73.92208248861199, 40.56207444733086], [-73.92107822881388, 40.56207985288483], [-73.92036810280447, 40.56221883246758], [-73.92020148738833, 40.56253196151498], [-73.92020596714332, 40.56253281768893], [-73.92019698482662, 40.562550749365116], [-73.92024067296587, 40.56254394617107], [-73.9202596317294, 40.56261229356109], [-73.92011735879362, 40.56263952634707], [-73.92009840148403, 40.562571180609986], [-73.92014433287757, 40.56256181714762], [-73.92016901882614, 40.56252254237469], [-73.92017573888783, 40.56252254704519], [-73.92033120142663, 40.562226054886615], [-73.92017877193038, 40.56225588612691], [-73.91962397269194, 40.56236584322539], [-73.91909761878105, 40.562470161207905], [-73.91766081900093, 40.56282614968639], [-73.9172257695885, 40.56298655266716], [-73.91680098049571, 40.563185496799974], [-73.91649706637092, 40.56333720248186], [-73.91610489437377, 40.56355858188918], [-73.91567986551492, 40.56381664714167], [-73.9155244036197, 40.56390384306317], [-73.91519131236099, 40.56409066671078], [-73.91483386530379, 40.56424205554105], [-73.91455336961286, 40.56435343243379], [-73.913867496264, 40.56460809614183], [-73.91324388491566, 40.564656158348534], [-73.9131318012801, 40.56463824394596], [-73.91220200769317, 40.56505456984988], [-73.91215942953983, 40.56497148274081], [-73.91188319663009, 40.564990405238674], [-73.91190258835852, 40.565044479622856], [-73.91192112783689, 40.565096175264955], [-73.9119269207045, 40.56511232806831], [-73.91194211877026, 40.565479631631625], [-73.91195522606857, 40.565731620504174], [-73.91195464366191, 40.56581132267282], [-73.9119815270415, 40.56580963497534], [-73.91214509452946, 40.56577900893883], [-73.91216181893262, 40.56583625156802], [-73.91197024752503, 40.56586941753247], [-73.9117361534006, 40.56587265348571], [-73.91173511047309, 40.565813716219964], [-73.91192551909776, 40.565813862377226], [-73.91192497868256, 40.56573672188277], [-73.91191299706968, 40.56547960930241], [-73.91189556223307, 40.565111450287745], [-73.91189239498307, 40.56510159409269], [-73.91187518743409, 40.565048055970266], [-73.91185809029383, 40.56499543800322], [-73.91148922796503, 40.565114763239244], [-73.91133796691499, 40.56506812591156], [-73.91117000937784, 40.56505851395878], [-73.91107382373276, 40.56505300922295], [-73.91079817683058, 40.5651109958315], [-73.91079826749402, 40.56504309759574], [-73.91056088690934, 40.5650073501188], [-73.91033193473851, 40.56501687075075], [-73.91030675154268, 40.56500493637165], [-73.91031901407925, 40.56496564748373], [-73.91017496486596, 40.56492272352996], [-73.9101477299426, 40.5649431450485], [-73.91011762673844, 40.56495586347528], [-73.91010084549161, 40.56495620165245], [-73.91008149893018, 40.56494246247026], [-73.91007760883511, 40.56491967587889], [-73.91009279361162, 40.564867818035935], [-73.91009922829879, 40.56482442599316], [-73.91003762905791, 40.56479371060192], [-73.91000297018701, 40.56484481755809], [-73.90998387183201, 40.56487988232135], [-73.90976838764617, 40.565275507349334], [-73.90978518025257, 40.56528064510755], [-73.90977170611873, 40.56530540530752], [-73.90971684925964, 40.56528742546118], [-73.909730321818, 40.56526351832803], [-73.90974823471095, 40.5652695117089], [-73.90995051522059, 40.56489994433498], [-73.90996837315812, 40.56487069925949], [-73.91002307642118, 40.56478020953845], [-73.90997230349046, 40.56474460368657], [-73.90987714566829, 40.56448583578525], [-73.9098755490021, 40.564453409409445], [-73.90987653834947, 40.56442096895194], [-73.90981103571444, 40.56432715547762], [-73.90976258436969, 40.56428483692814], [-73.90969073362554, 40.564257701782516], [-73.90966823860984, 40.56424051095107], [-73.90965355123693, 40.564212754457415], [-73.90953155346381, 40.564122832315], [-73.90939134156689, 40.56404609551438], [-73.9092770814906, 40.56399712415304], [-73.90918356455255, 40.563977896402974], [-73.90904934105347, 40.563961275280484], [-73.9089211721263, 40.563947304767474], [-73.9087254513683, 40.56393129153756], [-73.90851583574546, 40.56393904843132], [-73.90838328120986, 40.56396272597695], [-73.90821195105768, 40.56399332454081], [-73.9080904469524, 40.56402656413226], [-73.90807304358626, 40.56408533741216], [-73.90799528456878, 40.56416473737818], [-73.90797175520909, 40.56416153010163], [-73.9079482148663, 40.564158323984365], [-73.90792916599447, 40.56411667823528], [-73.90791411765858, 40.564068937270996], [-73.907951975564, 40.56400805646608], [-73.90797306965376, 40.56397596846283], [-73.90799426100763, 40.563917174658165], [-73.90800859982762, 40.56385718868023], [-73.90801597532176, 40.563796474103945], [-73.90801633051083, 40.56373550013356], [-73.9080096626694, 40.56367473797643], [-73.9079960233449, 40.563614657202166], [-73.90797551796078, 40.56355572211305], [-73.90789096153294, 40.56346261855917], [-73.9077988185825, 40.563373800900266], [-73.90769946157138, 40.563289628128935], [-73.90759329211629, 40.5632104404623], [-73.90748073936408, 40.56313655796707], [-73.9073622582579, 40.56306827926591], [-73.90723832769757, 40.563005880331254], [-73.9071094486046, 40.56294961336929], [-73.90697614189747, 40.56289970580127], [-73.90683894638656, 40.562856359344565], [-73.90669841659687, 40.562819749197196], [-73.90655512052625, 40.562790023330066], [-73.90640963735129, 40.56276730188913], [-73.90626255508623, 40.56275167670948], [-73.90611446820678, 40.56274321094494], [-73.90596597524814, 40.5627419388123], [-73.90581767638682, 40.56274786545329], [-73.90567017101444, 40.56276096691355], [-73.90549533617256, 40.56276575778522], [-73.90512293458974, 40.562828001714436], [-73.9046569315492, 40.56290588894741], [-73.90422374876526, 40.562995158675484], [-73.90391390139247, 40.56308296210139], [-73.9036677346663, 40.56316093955492], [-73.90310623198005, 40.563389272260586], [-73.90298894820239, 40.56344464589919], [-73.90297920728172, 40.563454601328374], [-73.90296735489308, 40.563463121444855], [-73.90295374846806, 40.56346994930782], [-73.90293879833516, 40.5634748790093], [-73.90292295534515, 40.56347776188435], [-73.90290669727534, 40.56347851099414], [-73.90289051442042, 40.56347710374773], [-73.90287489480674, 40.563473582583406], [-73.90286030947519, 40.56346805368901], [-73.9028471982753, 40.563460683799356], [-73.90283595660054, 40.56345169516812], [-73.90282692346567, 40.56344135886543], [-73.90282037128124, 40.56342998660262], [-73.90279436846555, 40.56337471712264], [-73.9027530963235, 40.56331393135542], [-73.90270432981026, 40.563255349841505], [-73.90264896763175, 40.563200283224], [-73.90258744277786, 40.563149162164855], [-73.90252023643049, 40.56310238646769], [-73.90244787420198, 40.563060321951475], [-73.90237092202435, 40.56302329758997], [-73.9022899817226, 40.56299160293852], [-73.90220568630893, 40.56296548587067], [-73.902118695032, 40.562945150638875], [-73.90202968822216, 40.562930756277765], [-73.9019393619705, 40.56292241536045], [-73.9018484226863, 40.56292019311837], [-73.90175758157231, 40.56292410693085], [-73.90166123516516, 40.56293506352471], [-73.90151119979181, 40.56295471672573], [-73.90136239001558, 40.562979197063], [-73.90121507272005, 40.563008460632346], [-73.90108692673103, 40.56303811545822], [-73.90096031793567, 40.563071389888286], [-73.90083542204312, 40.563108237744586], [-73.90067042372952, 40.56316335028136], [-73.90050925255056, 40.56322469732531], [-73.90045365151107, 40.56323897596529], [-73.90006663126383, 40.56338268738672], [-73.89964523066722, 40.56356206489001], [-73.89905579734292, 40.56381294864294], [-73.89863709831356, 40.564013477970896], [-73.89832919744433, 40.56417158181876], [-73.89801645708715, 40.56435914551782], [-73.89796716368488, 40.56437825559053], [-73.89791693883869, 40.564373789015235], [-73.89726738376439, 40.56467302206039], [-73.89718037015771, 40.564726723781384], [-73.89712237369706, 40.5647531921531], [-73.89706323189466, 40.56478017278063], [-73.89704215194091, 40.56478184744614], [-73.89659163481625, 40.565040001527414], [-73.89628126208979, 40.56523272170739], [-73.89621164762941, 40.56528127932281], [-73.89614780767694, 40.56533720689433], [-73.896132624453, 40.56535842756677], [-73.89581663166554, 40.56562431858591], [-73.89566630776342, 40.56583063730831], [-73.89543332392897, 40.56615043598428], [-73.89533725027061, 40.56633210037087], [-73.89533259419743, 40.56634090417397], [-73.89536175546587, 40.56640510268941], [-73.89539935314917, 40.566487840856276], [-73.89542366693382, 40.56658650687262], [-73.89557697279913, 40.566815433211566], [-73.89561861973425, 40.566877634494226], [-73.89564653277833, 40.56693948102173], [-73.89565586855373, 40.567010820495575], [-73.89565980661514, 40.56705946098028], [-73.8955701567844, 40.5670634313859], [-73.89549129592831, 40.5670578919942], [-73.89545231761565, 40.567031818712245], [-73.89543399793207, 40.56701956515993], [-73.89538025688381, 40.566997645046385], [-73.89531210417964, 40.56702218855294], [-73.89522927220416, 40.567074772663595], [-73.89504632135142, 40.567190914696674], [-73.89485403769469, 40.567327029002755], [-73.89479571968951, 40.567368310224516], [-73.8945970952024, 40.56748211622697], [-73.89438257495341, 40.56764180741036], [-73.89436419907221, 40.56764996730549], [-73.89413028093446, 40.567820149652825], [-73.89396328755053, 40.56792814814184], [-73.8936594633678, 40.56810371337828], [-73.89345467847606, 40.56823501855795], [-73.89326255071325, 40.568333312338574], [-73.89314119161189, 40.568395398445716], [-73.89280581743805, 40.56851491061991], [-73.89261013445609, 40.56858724728667], [-73.8925692981124, 40.56855880577257], [-73.89249413164768, 40.56853081091947], [-73.89235367291086, 40.568526113690076], [-73.89228381010733, 40.56851183832509], [-73.89214468849696, 40.56850560986675], [-73.89194768419188, 40.568489179864414], [-73.89184594142127, 40.56847298969817], [-73.89173272278907, 40.568454974278715], [-73.89146452569115, 40.568415124016106], [-73.89120836350693, 40.56834482979347], [-73.8910600526066, 40.568304129775505], [-73.89075729057016, 40.568221047859915], [-73.89050235300425, 40.56818323540314], [-73.89028537165312, 40.56817237514442], [-73.8901649592118, 40.568228524775265], [-73.89008675199516, 40.56816950194033], [-73.89006074216768, 40.568145261794754], [-73.8900201856573, 40.56809098386936], [-73.88993395087572, 40.5680729541433], [-73.88962915033767, 40.56798259952053], [-73.88959492449194, 40.567941890234074], [-73.88944124174323, 40.56793689729114], [-73.88940823061598, 40.567926212965666], [-73.88911103072223, 40.56791623669089], [-73.88891124690583, 40.567925634565825], [-73.88879000780409, 40.567931334052886], [-73.88866128999209, 40.56796810394101], [-73.88840180766067, 40.56807906694457], [-73.88839935499476, 40.56809082598919], [-73.88839431564136, 40.568103436754974], [-73.8883907733278, 40.56812453318512], [-73.88838304501148, 40.56814122068749], [-73.88836803030965, 40.56814492542518], [-73.88835950704319, 40.568143674741066], [-73.88834735692743, 40.568135621167684], [-73.88834467829327, 40.568120507881446], [-73.88834377442494, 40.56809571544478], [-73.88834311927033, 40.568077740036244], [-73.88834097846592, 40.56806602259852], [-73.88818867528397, 40.568033518084455], [-73.8880566098331, 40.568016918935626], [-73.88796642336445, 40.56801876782179], [-73.88786222508219, 40.568038044986416], [-73.88747378409192, 40.56813023872385], [-73.88687638253386, 40.56834983984713], [-73.88686105741907, 40.5683832977044], [-73.88654683936447, 40.568470978109445], [-73.88644241994884, 40.56844599324056], [-73.88629569651762, 40.568465965910924], [-73.88601332217256, 40.56848022914432], [-73.88592976749554, 40.56848445171615], [-73.88572202722436, 40.56852446159176], [-73.88552537443559, 40.56857979268739], [-73.88542104730786, 40.56859090948013], [-73.88534183019685, 40.568599348654644], [-73.88528929704948, 40.568569111026925], [-73.8851467629828, 40.568549031385515], [-73.88506218994054, 40.568527063551635], [-73.88502840887722, 40.568531127188635], [-73.88500002540947, 40.56852173302438], [-73.88489678220195, 40.568499584876896], [-73.88430973105297, 40.56869611953866], [-73.88430466693922, 40.568663571947575], [-73.8848870712472, 40.56847020566865], [-73.88475594832832, 40.56828913918742], [-73.88463979353489, 40.56833718522715], [-73.88470791077437, 40.56842967359395], [-73.88467738972528, 40.56844134290074], [-73.88462764522968, 40.568372968610774], [-73.88433684774819, 40.56848793447798], [-73.88429876082941, 40.56843680205306], [-73.88458722633577, 40.568319457529036], [-73.88459734214325, 40.56832600252621], [-73.88473689799127, 40.568268513240625], [-73.88471750208527, 40.56824534953776], [-73.88445665776179, 40.56789576340595], [-73.88416646626057, 40.568001951564035], [-73.88418090236974, 40.568027725164654], [-73.88418572568219, 40.56802639263762], [-73.88425563707202, 40.56814510250077], [-73.8842560545, 40.56815713340231], [-73.88422623813494, 40.56816646039563], [-73.8841423383738, 40.56802768627495], [-73.88415611937222, 40.56802242566621], [-73.88414806727037, 40.568008977301226], [-73.8839890745021, 40.56806016069418], [-73.88399610047865, 40.568072945956445], [-73.884007526758, 40.56807295749512], [-73.88407171935152, 40.568195014133465], [-73.88403638323946, 40.56820527702404], [-73.88397010168924, 40.56808955490235], [-73.88398465406, 40.56808402453267], [-73.88397412531297, 40.56806497313347], [-73.88379103703075, 40.568123911324484], [-73.88380690303865, 40.56815355417869], [-73.88381937098082, 40.56815198246059], [-73.88402340092412, 40.56850311561082], [-73.88399326079195, 40.56851179890226], [-73.88378819346467, 40.56815987256843], [-73.88379651062661, 40.56815592007595], [-73.88378086756107, 40.568127185959874], [-73.8837601597834, 40.568133851287904], [-73.8837694847298, 40.56814752545786], [-73.88357670672721, 40.56820976975422], [-73.8836919497781, 40.568395359722665], [-73.88347850081561, 40.568473114104954], [-73.88369768110292, 40.56883628546312], [-73.88390845170261, 40.568895911091715], [-73.88390427884407, 40.56890620425921], [-73.88368728096324, 40.56884340483232], [-73.88346534749647, 40.568478019938446], [-73.88336927316276, 40.56833185924823], [-73.88313094774313, 40.568380626014125], [-73.88311385647962, 40.5683831750126], [-73.88311091520163, 40.568383865927984], [-73.88309129854181, 40.568385213510275], [-73.88307333791968, 40.56838478176575], [-73.88305202325523, 40.568384021260954], [-73.88302891606186, 40.56838281849107], [-73.88300768867661, 40.56838026616839], [-73.88299287240591, 40.56837734209021], [-73.88298955629156, 40.568376681660475], [-73.88297087726367, 40.56837501464125], [-73.88296051092841, 40.568374247012414], [-73.88295399278807, 40.568373763916256], [-73.88293863229666, 40.5683723785401], [-73.88292327300584, 40.56837005784429], [-73.88290250762795, 40.56836600289595], [-73.88288811811933, 40.56836313418894], [-73.88287307747646, 40.5683605068968], [-73.88285619540405, 40.568358264718604], [-73.88283837926991, 40.568356247247834], [-73.88282147024864, 40.56835584350892], [-73.88279997403697, 40.56835801856397], [-73.88278550605777, 40.56835918404874], [-73.88276408427694, 40.56835962993066], [-73.88274616121862, 40.5683578281149], [-73.88273126157868, 40.568355975940776], [-73.88271489474496, 40.56835557223702], [-73.88269533764742, 40.568357029544515], [-73.882678706603, 40.568359461509914], [-73.882662866301, 40.56836196665356], [-73.882647356467, 40.56836456276622], [-73.88262970640685, 40.56836892982512], [-73.88261213622364, 40.568374846278374], [-73.88259408211263, 40.56838086191465], [-73.88257939340104, 40.568386366671646], [-73.88256242076477, 40.56839477807907], [-73.88254516419559, 40.56840411697355], [-73.88252920720879, 40.568412502609746], [-73.88251696222004, 40.56841866741233], [-73.88250322795516, 40.568425840392266], [-73.88248871352695, 40.568433542301584], [-73.88247982463253, 40.5684379913428], [-73.88247156263513, 40.56844211601707], [-73.8824508571579, 40.56845183836232], [-73.88243093138236, 40.5684610399817], [-73.8824097890766, 40.56846993343765], [-73.88239008898215, 40.56847859399228], [-73.88237283472289, 40.5684860960667], [-73.88235766000328, 40.568492609329695], [-73.8823432548687, 40.568498610067664], [-73.88232964100602, 40.568504133986934], [-73.8823125284216, 40.56851139244162], [-73.88229819339269, 40.56851799769323], [-73.88228637429398, 40.56852393741253], [-73.8822686225277, 40.56853237545287], [-73.8822549694179, 40.5685397180264], [-73.88224221751369, 40.56854590992248], [-73.88222246686078, 40.568555435017636], [-73.88220943230279, 40.568561077625255], [-73.88219685896784, 40.568566413789725], [-73.88218129409158, 40.568573151119175], [-73.88216455412915, 40.56857725886628], [-73.88214925446407, 40.56858072795744], [-73.88213139393241, 40.56858430314576], [-73.88210953872509, 40.568589052803596], [-73.88209772151953, 40.56859390339428], [-73.88208660430972, 40.5685980904468], [-73.88207621474676, 40.568602004333975], [-73.88209692581147, 40.56862950114764], [-73.88212127827947, 40.5686618181755], [-73.88206955861435, 40.56868029807086], [-73.8820178499041, 40.56869877845679], [-73.88197021885632, 40.568715109414015], [-73.88192258910136, 40.56873144152552], [-73.88192260012147, 40.56873129712619], [-73.88190727884263, 40.56870769636655], [-73.88189261684596, 40.56868509643526], [-73.88187437767158, 40.5686887162597], [-73.8818434971748, 40.568694843229444], [-73.88182559907011, 40.56869926485947], [-73.88180828198186, 40.56870284876547], [-73.88178841023914, 40.5687074945242], [-73.88177058314976, 40.568712004506885], [-73.8817545281002, 40.56871599596354], [-73.88174004464445, 40.568719024064336], [-73.88173357116696, 40.568720350769084], [-73.88172553821391, 40.56872199920032], [-73.88170633904176, 40.56872695087653], [-73.88168919765202, 40.568731300724224], [-73.88167033049703, 40.56873534254707], [-73.88165489126098, 40.56873856767288], [-73.88163393421279, 40.56874310355983], [-73.88161264711533, 40.56874706213031], [-73.88159429211795, 40.568749699061236], [-73.88157319628651, 40.568752090580524], [-73.88155040199122, 40.568754264566195], [-73.88152923752182, 40.56875559319763], [-73.88150835802925, 40.56875652641385], [-73.88148845626256, 40.56875826192994], [-73.8814673627757, 40.56875969985271], [-73.88144694240088, 40.568761515575716], [-73.88142484385884, 40.56876393233508], [-73.88140223669863, 40.56876649465097], [-73.88138189843421, 40.56876833792217], [-73.88135827609673, 40.568770897505814], [-73.88133487873345, 40.56877295389002], [-73.88131201515033, 40.56877405506357], [-73.8812899899062, 40.568774779989496], [-73.88126673733879, 40.56877521549129], [-73.88124592849768, 40.568775698412836], [-73.8812440990778, 40.56877574158702], [-73.88121987918441, 40.56877558101358], [-73.88119962399897, 40.568770481569416], [-73.88118565632857, 40.568768819132416], [-73.88117165492478, 40.56876710170908], [-73.8811485478543, 40.568765403510795], [-73.88113397769796, 40.568764046185976], [-73.88111785003272, 40.568762273951585], [-73.88110252501521, 40.56876006060211], [-73.8810843924999, 40.56875741228492], [-73.8810605336752, 40.56875299260694], [-73.881047513156, 40.568750674584706], [-73.88103254369172, 40.568747668843116], [-73.88101724521775, 40.56874498726411], [-73.88100249970928, 40.56874242369414], [-73.88097532354678, 40.56873766734514], [-73.88095258591643, 40.56873429402476], [-73.8809338020415, 40.56873238398265], [-73.88091670520443, 40.56873069079461], [-73.8808963389228, 40.56872877860321], [-73.88087474315614, 40.56872655972642], [-73.8808512493675, 40.568723679647164], [-73.88083009243813, 40.5687212719085], [-73.88080802486357, 40.5687191327765], [-73.88080640764103, 40.56871894229229], [-73.88078794238275, 40.568716751944535], [-73.88076279486117, 40.56871370930234], [-73.88073904289372, 40.56870950645204], [-73.88071911660474, 40.56870553272956], [-73.88070327264789, 40.56870335447165], [-73.88068567967169, 40.568701715683744], [-73.88066886553068, 40.56870054594793], [-73.8806537174327, 40.56869953876916], [-73.880636017406, 40.56869867385001], [-73.88061442403838, 40.56869549163035], [-73.88059214722345, 40.568692063767905], [-73.88057433278905, 40.56868908365676], [-73.88055347316788, 40.56868529656852], [-73.88054326066376, 40.56868399814717], [-73.88053267017403, 40.5686826455547], [-73.88051295386188, 40.568680427559386], [-73.88049261225292, 40.56867763294268], [-73.8804710279827, 40.56867588124252], [-73.8804558326657, 40.56867437994323], [-73.88043366851842, 40.568673924312975], [-73.88041688627574, 40.56867470009683], [-73.88040176869173, 40.56867567412387], [-73.88038118428805, 40.568677076190674], [-73.88036700049197, 40.56867786288211], [-73.88034903808415, 40.56867839367099], [-73.88032884427633, 40.568678695967364], [-73.88032117991807, 40.56867863420526], [-73.88030893446707, 40.568678540194504], [-73.88028914295056, 40.5686785733476], [-73.88027003542994, 40.56867891412479], [-73.88025376300214, 40.568678752751914], [-73.88023367653386, 40.568678245974596], [-73.88021503170239, 40.56867710173838], [-73.88019740435365, 40.56867540738741], [-73.88017818326908, 40.56867365809682], [-73.88016450973765, 40.568673013585915], [-73.88014654883912, 40.568672580378426], [-73.88012555136847, 40.56867315303115], [-73.88012340249263, 40.56867321394736], [-73.88009809627134, 40.568672692317186], [-73.88007402062833, 40.56867162196599], [-73.8800491891564, 40.56867011993373], [-73.8800250074982, 40.56866789719161], [-73.88000225656683, 40.56866548646285], [-73.87997972913301, 40.56866340164108], [-73.87995753008515, 40.568661954943785], [-73.87993758735001, 40.568660809306266], [-73.87992664178228, 40.56866035592181], [-73.87989303466885, 40.568659465547746], [-73.87987189778727, 40.5686590113857], [-73.87985268664356, 40.568658216133144], [-73.87983861024595, 40.5686577963222], [-73.87982198486952, 40.568656977969745], [-73.87980312654076, 40.56865679573436], [-73.8797862389313, 40.56865691309131], [-73.87976961248047, 40.56865705819396], [-73.87975818201656, 40.568656875014064], [-73.87975305662172, 40.5686567971084], [-73.87973365556653, 40.5686566692434], [-73.87971548137098, 40.56865683901985], [-73.87969751808572, 40.56865736920342], [-73.87968131494341, 40.56865826242203], [-73.87966465098816, 40.56865922652345], [-73.87964545944028, 40.568660359189444], [-73.87962638719442, 40.568660753673534], [-73.87960709085901, 40.568660786725424], [-73.87958856272876, 40.568661209248425], [-73.87956929987946, 40.56866228704478], [-73.87954539852859, 40.56866239751532], [-73.87951793036875, 40.56866272822726], [-73.87949270626528, 40.5686633325175], [-73.87946829663208, 40.568663522685604], [-73.8794413026328, 40.56866283780857], [-73.87941448510396, 40.56866248465178], [-73.87938896798258, 40.56866160312508], [-73.87936348238726, 40.56866272863265], [-73.87933579846116, 40.56866453635203], [-73.87931514238035, 40.56866583880744], [-73.87930192895583, 40.56866551968504], [-73.87928170142983, 40.5686650290109], [-73.8792590306537, 40.568663744354296], [-73.87923833181624, 40.568662327072566], [-73.87921878815278, 40.568662215891074], [-73.87919931538988, 40.568662258573106], [-73.87917440931017, 40.56866266494019], [-73.87915586741869, 40.56866352764723], [-73.87913428067395, 40.568663893604835], [-73.87911696789516, 40.56866417124446], [-73.87909806245413, 40.56866428637676], [-73.87908341950936, 40.56866421718678], [-73.87906848035361, 40.568664066431296], [-73.87905289440748, 40.56866368933004], [-73.87903572381265, 40.56866369872449], [-73.87903327914871, 40.56866368676848], [-73.87901906194138, 40.568663627400305], [-73.87900319058451, 40.56866375559676], [-73.87898677609904, 40.56866367464419], [-73.87896619312761, 40.568663544231505], [-73.87894689779121, 40.5686633888701], [-73.87892860441201, 40.568664224830016], [-73.87890849091838, 40.56866554587747], [-73.87888771809112, 40.56866604600033], [-73.8788706904323, 40.56866585733321], [-73.87885136038072, 40.5686650986443], [-73.87883510134056, 40.56866434252133], [-73.87882058842108, 40.56866404777254], [-73.87880406603716, 40.568664831971326], [-73.87878564227971, 40.56866596580633], [-73.87877015942387, 40.56866676852045], [-73.87875475975711, 40.5686672479876], [-73.87873193236219, 40.568667773388576], [-73.87871454945252, 40.56866783528281], [-73.87869687415929, 40.568666312871535], [-73.878687266263, 40.56866344818506], [-73.87868134846241, 40.568658164746836], [-73.87867973907235, 40.56864652894116], [-73.8786746736171, 40.56863993983796], [-73.87851699995322, 40.568659783454656], [-73.87830322053703, 40.56869386726816], [-73.87819124545663, 40.56871491982494], [-73.87797254160711, 40.568761631557585], [-73.87788701981546, 40.5687822173686], [-73.87780808995733, 40.56880063006316], [-73.8776378530969, 40.5688518421286], [-73.87760577562246, 40.56886089493745], [-73.87745281794943, 40.56891025148544], [-73.87740017966792, 40.56892617883126], [-73.87731299401725, 40.56895836086122], [-73.8770689967848, 40.5690484404372], [-73.87685485878126, 40.56913462528098], [-73.87662125007236, 40.56923183891122], [-73.87656038791111, 40.569257159145344], [-73.87643370124523, 40.56931436855044], [-73.87634075072575, 40.56935313560295], [-73.87611451688053, 40.56945944144884], [-73.87608408414432, 40.569472889410235], [-73.87598454034396, 40.56951979017155], [-73.8758586734124, 40.569580448427644], [-73.87543006202922, 40.569789960054095], [-73.87518736027619, 40.569910348535146], [-73.87510590878087, 40.56995068544372], [-73.87484758565488, 40.57007545069467], [-73.87443047584183, 40.570281828763505], [-73.87392287385016, 40.57052948404442], [-73.87316515806762, 40.570901899886], [-73.87260077649111, 40.57117643076299], [-73.86718075481033, 40.57383579492641], [-73.86663956227181, 40.57409921893446], [-73.86554317468638, 40.57464212861246], [-73.86464221607892, 40.575119214346415], [-73.86348661935081, 40.57574031588714], [-73.86288301945429, 40.576059761127304], [-73.86280361999994, 40.57593303499988], [-73.86278001199997, 40.57589856099986], [-73.86275061599991, 40.575857984999864], [-73.86333068899997, 40.57538325299991], [-73.86341227899989, 40.5753164769999], [-73.86396642099993, 40.57502678699988], [-73.86394267899998, 40.5749881079999], [-73.86340629400003, 40.574114330999855], [-73.86361132999998, 40.573823056999835], [-73.86449302899979, 40.5735427759999], [-73.86662812000002, 40.573057648999914], [-73.86633836399983, 40.572381674999846], [-73.86522555399998, 40.57045847199989]]]}}, {\&quot;id\&quot;: \&quot;27\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 28, \&quot;Shape_Leng\&quot;: 0.097960782214, \&quot;Shape_Area\&quot;: 0.000291203927662, \&quot;zone\&quot;: \&quot;Briarwood/Jamaica Hills\&quot;, \&quot;LocationID\&quot;: 28, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79240413399991, 40.716193040999926], [-73.79268721599992, 40.71568003299994], [-73.79314903799985, 40.714933429999846], [-73.79346012399989, 40.714419191999895], [-73.7935315959999, 40.71427734599991], [-73.7935316439998, 40.71427725599991], [-73.7935316789999, 40.714277165999924], [-73.79358570299998, 40.714128677999874], [-73.79362091299997, 40.71397534699987], [-73.79363634199994, 40.71381958599994], [-73.79363636699993, 40.7138193969999], [-73.79363635499982, 40.71381920899989], [-73.79363166700001, 40.71366304199988], [-73.79360706699994, 40.713508577999924], [-73.79360705599986, 40.713508522999916], [-73.79360704399981, 40.713508469999894], [-73.79356328499998, 40.71335799599989], [-73.79350163599989, 40.71321339799988], [-73.79321635699988, 40.71261327999988], [-73.79313224999994, 40.71240723599992], [-73.79306872799985, 40.71219599599993], [-73.79302654199988, 40.711981363999875], [-73.79300604199986, 40.711765221999904], [-73.79300721999992, 40.7115494699999], [-73.79303800099989, 40.71071107499988], [-73.79389609999994, 40.71035232899985], [-73.79473052399995, 40.71001246199995], [-73.79561668999996, 40.709753078999874], [-73.79639418099987, 40.70953157899987], [-73.79731400799989, 40.70927019899988], [-73.79776810199988, 40.7091431879999], [-73.79807226500003, 40.70963987799992], [-73.79870150699992, 40.71066337699988], [-73.79985783199996, 40.710252562999905], [-73.80106920299994, 40.709818210999856], [-73.80118994599997, 40.70978629699991], [-73.80119015899984, 40.70978624399993], [-73.80119037199992, 40.70978616299991], [-73.80130606099976, 40.709742228999914], [-73.80130615599984, 40.709742192999926], [-73.80130625, 40.709742148999965], [-73.80141399799987, 40.70968695199988], [-73.8014141629999, 40.7096868729999], [-73.80141430599987, 40.7096867729999], [-73.80151137199988, 40.7096217159999], [-73.80151145499995, 40.70962166199995], [-73.80151152599983, 40.70962160799997], [-73.80159590599997, 40.70954842499991], [-73.80193297099994, 40.70891159599995], [-73.80212493399993, 40.7087376039999], [-73.80233119999987, 40.708572470999904], [-73.80255069099992, 40.70841720299988], [-73.80278213499996, 40.70827267099985], [-73.80302414799988, 40.70813965699997], [-73.80278721399985, 40.707715802999864], [-73.80222783399978, 40.70674931299991], [-73.80165725599993, 40.705761474999846], [-73.80265548599988, 40.70548042999997], [-73.80357251599989, 40.705233230999966], [-73.8056477309999, 40.70467172799994], [-73.80613695999992, 40.70569149199989], [-73.80658872800001, 40.70663390999988], [-73.80694856299993, 40.70736709999989], [-73.80934800399993, 40.70668543899991], [-73.81201248599983, 40.70594494499993], [-73.81190436299998, 40.705123939999886], [-73.81180202699996, 40.70436635199991], [-73.81177296699997, 40.7041809509999], [-73.81171288899998, 40.70366220199985], [-73.81163157099994, 40.70305215999991], [-73.81152856899989, 40.70227287499991], [-73.81193002199988, 40.70234083599996], [-73.81301882900003, 40.70249515699991], [-73.81314101299999, 40.702499551999914], [-73.81356470599994, 40.70252849799989], [-73.81398666699995, 40.70254206699991], [-73.81429413399998, 40.70253110799994], [-73.81496204599993, 40.70249848699989], [-73.815315933, 40.702487330999915], [-73.8159402059999, 40.70245890199989], [-73.81628916400003, 40.7024540649999], [-73.81637824499992, 40.70245196399987], [-73.81658976900003, 40.70291543599995], [-73.81669961199981, 40.70315609299994], [-73.8169748309999, 40.70374317299995], [-73.81709738799995, 40.704029800999876], [-73.81735529099986, 40.70455013999986], [-73.81738330599997, 40.70460389799992], [-73.81809905199994, 40.70597371499988], [-73.81822457299995, 40.706177661999895], [-73.81828566399994, 40.706302849999865], [-73.81861275299995, 40.706853399999915], [-73.81892102499985, 40.70734990599987], [-73.81899305699982, 40.70747190299995], [-73.81905016999981, 40.70757022099986], [-73.81910729599991, 40.707668538999904], [-73.81916136299994, 40.70776033199991], [-73.81921543099992, 40.70785211599987], [-73.81955363300001, 40.7084252289999], [-73.81994399099985, 40.70901972299991], [-73.82023145199997, 40.70945750299994], [-73.82045236499991, 40.709774548999896], [-73.82065280899985, 40.70998970699988], [-73.82081877299993, 40.710172776999855], [-73.82098519099998, 40.710323844999934], [-73.82176010399989, 40.710992930999936], [-73.822526781, 40.711654884999845], [-73.82288529599995, 40.71192805799993], [-73.82320247499996, 40.712205947999976], [-73.8234526099998, 40.71245950199993], [-73.82363860699985, 40.71266664399989], [-73.82385072099994, 40.71293320599995], [-73.82398559799991, 40.71321593899988], [-73.82428940599979, 40.71387006599987], [-73.82467827499991, 40.7144485109999], [-73.82471749499993, 40.71450684999993], [-73.82497234899996, 40.71480260499994], [-73.8251664649999, 40.71502786599996], [-73.82537094099992, 40.71526515499991], [-73.82559716399989, 40.715514336999924], [-73.82567283299986, 40.71561510999986], [-73.82570967299992, 40.71566664699994], [-73.82573653299988, 40.715704221999914], [-73.8258906989998, 40.715938525999924], [-73.82591945199992, 40.71598987599992], [-73.82566233799984, 40.716152637999926], [-73.82561290699984, 40.7162098979999], [-73.82524731699984, 40.71645544499987], [-73.825090876, 40.71645279299986], [-73.82346833799978, 40.71673105099993], [-73.82187417699991, 40.716917117999856], [-73.82100705300005, 40.71687995099992], [-73.82051599199986, 40.71681199099988], [-73.82018883899984, 40.71673522399984], [-73.81948747199984, 40.71647859799984], [-73.81931944099983, 40.71640861399995], [-73.81875295799986, 40.71617287499986], [-73.81852868899989, 40.71608211599988], [-73.81828452900005, 40.71600371399992], [-73.81789512299986, 40.715918370999894], [-73.817780212, 40.715901047999864], [-73.81767650099987, 40.71588471999992], [-73.81743591099992, 40.71585731399992], [-73.81720417899986, 40.715840727999925], [-73.81680638099989, 40.71582792999987], [-73.81643940199992, 40.7158318299999], [-73.81636080399981, 40.71583237099993], [-73.8162894489999, 40.71583316699988], [-73.81595932699985, 40.71584062699988], [-73.81524262499985, 40.71585683199992], [-73.81364203999982, 40.71589299199993], [-73.81291344199987, 40.715896708999885], [-73.81151841199983, 40.71590499699989], [-73.81114665699984, 40.71590720599987], [-73.81022434999987, 40.715912667999866], [-73.80780927699995, 40.715853895999906], [-73.80670677799996, 40.71588523999989], [-73.80579237899985, 40.71594264899989], [-73.80494148499987, 40.715996230999956], [-73.80464476399993, 40.716034396999866], [-73.80394838899987, 40.716102911999926], [-73.80319837999987, 40.7162025249999], [-73.80313952600001, 40.71621390699995], [-73.803084842, 40.716220161999935], [-73.80188321, 40.716408810999916], [-73.80092734399994, 40.71660393299992], [-73.8002167269999, 40.71673785899987], [-73.80004693799998, 40.716781906999906], [-73.79959535799996, 40.71689904299997], [-73.79912568499999, 40.717034345999885], [-73.79802996199992, 40.71735242599987], [-73.79741025099996, 40.717532907999946], [-73.79653978199998, 40.717786748999885], [-73.79563775099989, 40.71807616099995], [-73.79480794899995, 40.71837515899988], [-73.7944373599998, 40.7185008579999], [-73.79399335100001, 40.71864514099988], [-73.79315493500002, 40.718917578999864], [-73.79309042899989, 40.71893343799996], [-73.79261566399995, 40.71904520999994], [-73.79249599699979, 40.719067435999904], [-73.79211141299997, 40.7191388639999], [-73.79176986799989, 40.719178606999876], [-73.79155692199994, 40.71920099499993], [-73.791417731, 40.71920231099991], [-73.79073248899982, 40.71920875699987], [-73.79076914099981, 40.71913418899989], [-73.79089607099996, 40.7188759379999], [-73.79123627699988, 40.71868931099988], [-73.79137357500004, 40.71860799199986], [-73.79150283700001, 40.71851882299991], [-73.79162293699987, 40.71842251499991], [-73.79173290199986, 40.7183199289999], [-73.7919010649999, 40.718136366999936], [-73.79201376599997, 40.71796768699994], [-73.79210870199984, 40.71779218799989], [-73.79210873799991, 40.71779211499996], [-73.7921849289999, 40.71761139399988], [-73.79224175599992, 40.71742717899984], [-73.79226766099997, 40.717283926999876], [-73.79234087599984, 40.71646287399992], [-73.79240413399991, 40.716193040999926]]]}}, {\&quot;id\&quot;: \&quot;28\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 29, \&quot;Shape_Leng\&quot;: 0.0714083127733, \&quot;Shape_Area\&quot;: 0.000201673837402, \&quot;zone\&quot;: \&quot;Brighton Beach\&quot;, \&quot;LocationID\&quot;: 29, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96004798699995, 40.58326987199995], [-73.95900739999992, 40.58283812799991], [-73.95733608399979, 40.58302513399989], [-73.95723610100002, 40.5830422709999], [-73.9571329139998, 40.58304572599995], [-73.95703134199992, 40.58303533199994], [-73.95695595999992, 40.5829822629999], [-73.95689047299997, 40.582933978999925], [-73.95682583599991, 40.5828863089999], [-73.95675618299992, 40.58283496999994], [-73.95645729099982, 40.582658850999906], [-73.95604146799998, 40.58273625399989], [-73.95571160099988, 40.58280458499993], [-73.95517441499999, 40.582915870999955], [-73.95436572700001, 40.583081076999875], [-73.95414287899986, 40.58310613999989], [-73.95412132099985, 40.58298298499989], [-73.95411176199985, 40.58291991799995], [-73.95407172899988, 40.58270239799989], [-73.95403970599988, 40.58251639099995], [-73.95392000699991, 40.58186979399993], [-73.9538380169999, 40.581745551999916], [-73.9537406319999, 40.58135589199988], [-73.95334153899987, 40.57926712799989], [-73.95309963899994, 40.577994155999896], [-73.95303970899995, 40.577679586999885], [-73.95300123199996, 40.57747651199985], [-73.95287451099996, 40.57688215899993], [-73.95242628499996, 40.57455910699991], [-73.95235846771321, 40.574274685845246], [-73.95254341027386, 40.57422397950429], [-73.95275899192154, 40.5742136309318], [-73.95295058831675, 40.57425023854544], [-73.95311788871602, 40.57428779386081], [-73.95328291809346, 40.574291889841746], [-73.95340408353178, 40.574294195339526], [-73.95352660081426, 40.57429652370537], [-73.95374257958343, 40.57429723224191], [-73.95377968074372, 40.57428764371035], [-73.9538505137372, 40.5742714772718], [-73.95393490539726, 40.57424290865264], [-73.95399423405075, 40.57426631704181], [-73.95401136297524, 40.57423762256748], [-73.95403199797872, 40.574086297180465], [-73.95408333385912, 40.57407327218331], [-73.95410726751373, 40.57410198308006], [-73.95410029594862, 40.57428723314875], [-73.95413360803454, 40.5743332674952], [-73.954397938218, 40.57437084590723], [-73.95511114426007, 40.57437112680509], [-73.95513705246907, 40.57437113692578], [-73.95569484044366, 40.57432699626322], [-73.95620816595128, 40.574265470675115], [-73.95634506681625, 40.574207221989525], [-73.95636904107674, 40.57417331306188], [-73.95629561203627, 40.573834984654354], [-73.95631111453274, 40.57380017438839], [-73.95634533454607, 40.57379757829185], [-73.95638980040823, 40.57382368774354], [-73.95647169447582, 40.574139487242576], [-73.9565675090591, 40.574170778492906], [-73.95720053498161, 40.574186671380815], [-73.9579441385944, 40.574144812662254], [-73.95843476359003, 40.57408881554891], [-73.95865147139088, 40.57405152377117], [-73.95888419181568, 40.57399159603121], [-73.9589663415273, 40.57394726876846], [-73.95897543388922, 40.57390455247927], [-73.95894268461842, 40.573467167647344], [-73.9589871897255, 40.57343065573189], [-73.9590260777376, 40.573451995118354], [-73.9590724802758, 40.57384554800023], [-73.95909642194573, 40.57386382043326], [-73.95939182223685, 40.57391210937612], [-73.95941778299985, 40.57517798299994], [-73.96103342799984, 40.57507632399994], [-73.96286117999982, 40.57498014099989], [-73.96471128899991, 40.57478261799983], [-73.96675354099992, 40.574832917999906], [-73.96756707299996, 40.574881526999896], [-73.96765743500002, 40.575043681999915], [-73.96780353599996, 40.57502045399985], [-73.96795533399992, 40.57501255399993], [-73.96810857699987, 40.57502089899985], [-73.96825878799997, 40.575045488999905], [-73.96840165999983, 40.57508536799986], [-73.96853345900001, 40.57513875999993], [-73.96883249999995, 40.57524150099993], [-73.9688899589999, 40.57526123899986], [-73.96883335399993, 40.575335858999864], [-73.96880187100001, 40.57537736399989], [-73.96873173299986, 40.57550140999995], [-73.96868119500002, 40.57563088299987], [-73.96866614099994, 40.57569696799986], [-73.96865108899983, 40.57576305399993], [-73.968546354, 40.576242670999875], [-73.96853234199989, 40.57630503099992], [-73.96852475500002, 40.57634038099996], [-73.96834802499988, 40.57711322399996], [-73.96804495099995, 40.578438532999854], [-73.96761555699982, 40.58030516299993], [-73.96759867799993, 40.58037847099992], [-73.9675871379998, 40.58042905899994], [-73.96733403999997, 40.58151752199991], [-73.96708956100004, 40.58259579399989], [-73.96707277600002, 40.582669811999864], [-73.96701115999986, 40.58294762399991], [-73.96691975199984, 40.58335247299993], [-73.96685766099992, 40.58358661799986], [-73.96683458399988, 40.583676861999926], [-73.966813755, 40.58375771499986], [-73.96677678399986, 40.58391498999987], [-73.96676128900002, 40.5839843919999], [-73.96674664199992, 40.584055351999886], [-73.96673011799997, 40.584135972999874], [-73.96670866299985, 40.58423930199995], [-73.96661531499983, 40.58457103699992], [-73.96660079799997, 40.58464174199989], [-73.96653588899984, 40.584957806999974], [-73.96649796199982, 40.58514249299987], [-73.96643740799989, 40.58541469399988], [-73.96636486799986, 40.585751243999916], [-73.96633012800002, 40.58589875099992], [-73.96615022799989, 40.58666882399992], [-73.96597498399979, 40.58743213599996], [-73.96581402699984, 40.58813321799995], [-73.9656408479998, 40.58888742799993], [-73.96546500699992, 40.589643336999856], [-73.96530164399988, 40.59035822999992], [-73.96514385199995, 40.5911019159999], [-73.96483485600002, 40.59113696899989], [-73.96377366299998, 40.59125722899988], [-73.96283785899992, 40.59136011199992], [-73.9606798409999, 40.591597582999945], [-73.9606241039998, 40.59086268099987], [-73.96057230499996, 40.590181426999905], [-73.96051667199988, 40.589452911999885], [-73.96045968399986, 40.58872381999986], [-73.96040710199983, 40.58803435199996], [-73.9603495359999, 40.58730628599994], [-73.96031712099983, 40.58651472399986], [-73.96031766399983, 40.5864364679999], [-73.9603380369999, 40.58628108999996], [-73.96034614999985, 40.586124769999905], [-73.96034190799985, 40.585968365999854], [-73.9603253929998, 40.585812722999954], [-73.96025825899996, 40.58502930799994], [-73.96024315399984, 40.58482708099993], [-73.9602394339998, 40.584791873999954], [-73.96023555999999, 40.584746675999895], [-73.96023124399987, 40.584676004999906], [-73.96022753900004, 40.584608958999915], [-73.96021792199998, 40.584514661999904], [-73.96014924099997, 40.58357589699987], [-73.96010509500002, 40.58340835699995], [-73.96004798699995, 40.58326987199995]]]}}, {\&quot;id\&quot;: \&quot;29\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 30, \&quot;Shape_Leng\&quot;: 0.0945097669793, \&quot;Shape_Area\&quot;: 0.000145862107626, \&quot;zone\&quot;: \&quot;Broad Channel\&quot;, \&quot;LocationID\&quot;: 30, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82075892499992, 40.61523267899991], [-73.81768666599999, 40.61493299799986], [-73.81652681189118, 40.61494701007998], [-73.81655519586245, 40.614881068359615], [-73.81657527753201, 40.61481337831561], [-73.81658687658151, 40.614744545249984], [-73.8165898896374, 40.61467518507705], [-73.81658428973421, 40.61460591806852], [-73.8165701269355, 40.61453736407743], [-73.8165475286072, 40.614470136266654], [-73.81651669585267, 40.614404836864594], [-73.81647790560582, 40.61434204897533], [-73.8164315038978, 40.614282334964926], [-73.81615626616234, 40.61294211575487], [-73.81604375315976, 40.61275962622099], [-73.81602636695548, 40.61236542423196], [-73.81595301908956, 40.61216821893675], [-73.81586106373182, 40.61202025698769], [-73.81588914214508, 40.61188656365408], [-73.81585258478174, 40.61174572809621], [-73.81581602898463, 40.61160489311676], [-73.81573329159819, 40.611463984117556], [-73.81563522523048, 40.61119560007353], [-73.81559405486736, 40.61086335714751], [-73.81559858789666, 40.61067251616471], [-73.81520720849484, 40.60981673379666], [-73.81502615390193, 40.609352013155714], [-73.81491794505943, 40.60905539220143], [-73.81477073796229, 40.60885102889005], [-73.81475287105245, 40.6086327967523], [-73.81476257619768, 40.608463880026925], [-73.81482785097941, 40.60823874224766], [-73.8148653991121, 40.608020598741525], [-73.8149997124251, 40.607825413169444], [-73.81496328852214, 40.60764059421228], [-73.81506129889364, 40.607317030139924], [-73.81520607102756, 40.607092544035126], [-73.81526535891507, 40.60700061106351], [-73.81554657007985, 40.60677293900015], [-73.81568836082222, 40.60661289096192], [-73.81574174081905, 40.60646524511771], [-73.81576751589343, 40.60637159210934], [-73.81580703895482, 40.60636640618301], [-73.81585416784488, 40.60634155617887], [-73.81595962051259, 40.606262483176735], [-73.81600764380624, 40.606194852030484], [-73.81600875994269, 40.606144258981395], [-73.81596093586549, 40.606139717032654], [-73.81597032024116, 40.60607436222665], [-73.8159435787941, 40.60606156480641], [-73.8159191720938, 40.60606152576282], [-73.8159191392178, 40.60602294080149], [-73.81589026342208, 40.606025339220764], [-73.8158882978922, 40.6059290341796], [-73.8159419971478, 40.60592688893786], [-73.81598548513719, 40.60573350521615], [-73.81609284277334, 40.605744093120286], [-73.81642529961537, 40.605224123786925], [-73.81739192103247, 40.60515812414338], [-73.81730244874, 40.60420592104616], [-73.81725370596759, 40.60394032459458], [-73.81755792378435, 40.60278576000433], [-73.8177203266933, 40.60222499987045], [-73.81831121077079, 40.601339712357415], [-73.81842675420909, 40.60008406892017], [-73.81849066110368, 40.59938955923962], [-73.81899346411964, 40.598262463121856], [-73.8192814220081, 40.597529610938246], [-73.81973591782804, 40.59751684313405], [-73.82015695397838, 40.596873907202536], [-73.82022310416497, 40.59680187575785], [-73.82028316165791, 40.59672680602921], [-73.82033688583628, 40.59664899805184], [-73.82038406369512, 40.5965687618151], [-73.82042450677176, 40.596486416145474], [-73.82045805451784, 40.59640229006972], [-73.82048457262269, 40.59631671816084], [-73.82050913385626, 40.59625816595299], [-73.82052562152057, 40.59619799173205], [-73.820533857754, 40.59613684003583], [-73.82053375492012, 40.596075367637795], [-73.8205253145804, 40.59601423203291], [-73.82050862648865, 40.595954089906186], [-73.82048386960406, 40.595895585619374], [-73.82045130963279, 40.59583934575525], [-73.8204507978603, 40.595838573953884], [-73.8204424431122, 40.59580887598263], [-73.82044084709868, 40.5957785271302], [-73.82044605664017, 40.595748414924365], [-73.82045791860484, 40.59571941893889], [-73.8204760866339, 40.595692386931226], [-73.82050002971006, 40.595668108956055], [-73.82059544842939, 40.5956026301113], [-73.82061381211892, 40.59550607512599], [-73.82065843490554, 40.595271452032726], [-73.82071206789055, 40.59517051496212], [-73.82079778694794, 40.59515300679664], [-73.8209309528666, 40.59510806180529], [-73.82108400042337, 40.594928368859804], [-73.82120137599598, 40.594779935044805], [-73.82135758260135, 40.594691009121114], [-73.82166936203787, 40.594750939180386], [-73.82223447124294, 40.59485584588739], [-73.82264377296077, 40.59490106309344], [-73.82301423918268, 40.59488677298898], [-73.82367706984253, 40.59490265315221], [-73.82394993688561, 40.59493279504595], [-73.82480251246255, 40.59508316117646], [-73.82565454783656, 40.594964406762166], [-73.82589974767566, 40.59486145713528], [-73.82625044687596, 40.59495115875487], [-73.8270499051601, 40.59490777901203], [-73.82798591286824, 40.594834876017856], [-73.82835645403685, 40.59479084506242], [-73.82876587213534, 40.59479145596427], [-73.82913626075876, 40.594806869147725], [-73.82937044176717, 40.59471804715625], [-73.82972156186142, 40.59464426120583], [-73.83048206013673, 40.59458593813551], [-73.83135504801284, 40.59463006988999], [-73.8324120968248, 40.594618492810554], [-73.83305498409688, 40.59481262907002], [-73.83381500012786, 40.5949474849947], [-73.83465599507487, 40.59516845882606], [-73.83484682806589, 40.59554343605339], [-73.83468997415088, 40.595899888214426], [-73.83461984485115, 40.59599745410395], [-73.83445520590696, 40.59622650519835], [-73.83439612701622, 40.59646420572123], [-73.83420068078192, 40.59665712408205], [-73.83386890489668, 40.59679039969174], [-73.83351748173193, 40.596983091173726], [-73.83336087711082, 40.59723551119928], [-73.83291189123968, 40.59745778303809], [-73.83273627105066, 40.59751697454668], [-73.832385102244, 40.5976056318385], [-73.83215095202706, 40.597679598145966], [-73.83239364476839, 40.59780335319121], [-73.83154105970068, 40.5979510260275], [-73.83126070906049, 40.5978920460556], [-73.83108000652722, 40.597791464827154], [-73.83095699282347, 40.59764708004299], [-73.8307600942432, 40.59744615815484], [-73.83062852189495, 40.59743342586203], [-73.83049675901624, 40.59749592809601], [-73.83050466559352, 40.59762133483558], [-73.83038922491133, 40.597734019792114], [-73.83026568620224, 40.597796535048566], [-73.8300517969121, 40.597808757865735], [-73.82985422922734, 40.59787116315062], [-73.82975522196986, 40.59799014184838], [-73.82961515193035, 40.598083979149216], [-73.82948341811623, 40.59813394195126], [-73.8293519571253, 40.59807731982705], [-73.82926994412304, 40.59798315098793], [-73.82921276789511, 40.597826322957275], [-73.82909777411142, 40.5977634551103], [-73.82891681736452, 40.5977631859847], [-73.82874408619575, 40.59776292884545], [-73.82857156476862, 40.59768116475648], [-73.82832490242488, 40.59764317810819], [-73.82806159687702, 40.59768040282441], [-73.82794610384788, 40.59781189487175], [-73.82784710901738, 40.597924601112986], [-73.82784691502562, 40.597999838383004], [-73.82763273197193, 40.598124911932295], [-73.8274268880001, 40.59820610885799], [-73.82722092999175, 40.59833119503657], [-73.8271301911274, 40.598431372963816], [-73.82709706289336, 40.598519099830945], [-73.82717084795338, 40.59861325700666], [-73.82710314546546, 40.598688685754354], [-73.82707810089018, 40.59867906322921], [-73.82705133886849, 40.59867267001917], [-73.82702356982604, 40.59866967503489], [-73.82699553156307, 40.59867015805246], [-73.82696796795742, 40.598674106156544], [-73.8269416120754, 40.59868141441143], [-73.82691716394703, 40.59869188925293], [-73.82689527276902, 40.598705252067255], [-73.82687651978097, 40.59872114738559], [-73.82686140304179, 40.5987391540985], [-73.82685032481477, 40.59875879306266], [-73.82684357823473, 40.59877954295343], [-73.82684134389942, 40.59880085219284], [-73.82676287102854, 40.59887852396063], [-73.8266785731343, 40.59895256423353], [-73.82658873898603, 40.59902272078796], [-73.82649367583141, 40.599088752048715], [-73.82639370886822, 40.59915043299935], [-73.8262891801897, 40.59920755206958], [-73.82627138518978, 40.59925406192512], [-73.82624639580337, 40.59929860721097], [-73.82621457216418, 40.59934054492623], [-73.82617637580326, 40.59937926742232], [-73.82613235782433, 40.59941421628603], [-73.82610801087331, 40.599433473202446], [-73.82607971900187, 40.59944929027962], [-73.82604830803486, 40.59946120621747], [-73.82601469481251, 40.59946887314232], [-73.8259798598142, 40.599472067181495], [-73.82594481984405, 40.5994706952275], [-73.8259105971973, 40.599464797799115], [-73.825878191737, 40.59945454595633], [-73.82584854782284, 40.59944023978944], [-73.82587723990645, 40.599388191110776], [-73.82589853794282, 40.59933411909544], [-73.82591220213257, 40.59927863191616], [-73.82591807911876, 40.599222353706445], [-73.82591610285142, 40.59916591704907], [-73.82590629495935, 40.59910995791428], [-73.82588876662335, 40.59905510558804], [-73.82586371395628, 40.59900197663026], [-73.8258314198925, 40.59895116890409], [-73.82579224760113, 40.59890325471297], [-73.82576186668572, 40.598827425613045], [-73.82572400162758, 40.598753578859636], [-73.82567887179285, 40.59868214369582], [-73.82562673962269, 40.59861353386852], [-73.82556790737216, 40.59854814792653], [-73.82550271573429, 40.59848636506479], [-73.82543154384716, 40.59842854402503], [-73.82535480469845, 40.59837502005476], [-73.82527294342637, 40.59832610393457], [-73.82518643452747, 40.59828207907724], [-73.82513360448421, 40.598246143814805], [-73.82507610784262, 40.59821464379464], [-73.82501458361149, 40.5981879287877], [-73.82494971364855, 40.59816629501651], [-73.82488221787078, 40.59814998301003], [-73.82481284576305, 40.59813917377149], [-73.82474236672088, 40.598133986774954], [-73.82465420648664, 40.5981492468515], [-73.8245680498839, 40.598170124067785], [-73.8244845128283, 40.598196469931], [-73.82442324545605, 40.59823055798339], [-73.82436729168752, 40.598269595793205], [-73.8243173368626, 40.59831310502026], [-73.82427399262099, 40.59836055396409], [-73.8242377886617, 40.5984113618214], [-73.82420916849752, 40.59846490623819], [-73.82418848174414, 40.59852053311304], [-73.82403414202359, 40.59875797949145], [-73.82395871079126, 40.59887689683851], [-73.82395853199995, 40.59888785399994], [-73.82406984190722, 40.598922481127985], [-73.82410854765287, 40.59899472680749], [-73.82421870388679, 40.599074487959136], [-73.8241859569957, 40.59921342515717], [-73.8241656989433, 40.59929937983351], [-73.82411388280298, 40.59928535009736], [-73.824071162039, 40.599292259946935], [-73.82401358185359, 40.59942972124062], [-73.8237932359679, 40.599851224209225], [-73.82376612290614, 40.60004007091038], [-73.8236175937432, 40.60003570131408], [-73.82317356168161, 40.59997800515576], [-73.82315293179705, 40.599976662824794], [-73.82303195183424, 40.59993051694214], [-73.82300436542411, 40.59992561919807], [-73.82257638978241, 40.599887738969485], [-73.82255813223716, 40.59994156021139], [-73.82235892273734, 40.59992192205628], [-73.82228834165707, 40.59989695916107], [-73.82215981277453, 40.59986500305416], [-73.82214174920362, 40.59984564479891], [-73.82212726983464, 40.599834563199416], [-73.8221128246864, 40.59982350877661], [-73.82194441779896, 40.59980115598919], [-73.82190636783253, 40.59981162996677], [-73.82180296187538, 40.599861689810076], [-73.82171949113493, 40.599915408915074], [-73.82168859290637, 40.599954022003764], [-73.82158890006589, 40.59997733908516], [-73.82146929866913, 40.59999372263383], [-73.82146921755755, 40.600024098877554], [-73.8214763933384, 40.60005034409147], [-73.82159001545337, 40.60006242989868], [-73.82173154776704, 40.60007648099816], [-73.82172074219885, 40.600125283165575], [-73.82234555578552, 40.60018010003154], [-73.82234362290922, 40.60022566120388], [-73.82248489186438, 40.600235544823065], [-73.82249404104252, 40.60020104008347], [-73.82260631900901, 40.60021364018273], [-73.82261001509886, 40.600186031842206], [-73.82314788294842, 40.60023932910236], [-73.82315326995335, 40.6002572872199], [-73.82330902392228, 40.600269952836015], [-73.82331920489146, 40.600234088936006], [-73.82443643781227, 40.60034498367475], [-73.82440706593387, 40.60059112485041], [-73.82445218054455, 40.60079696284418], [-73.82430388510507, 40.600785199829204], [-73.8242976550786, 40.60085210111633], [-73.82413862984455, 40.60089146682628], [-73.82398900112113, 40.601001986812236], [-73.8239241478234, 40.601106483981475], [-73.82388150021876, 40.60124921618406], [-73.82379033117405, 40.6013431590753], [-73.82370544281271, 40.60139225097998], [-73.82360431215257, 40.60147823411712], [-73.8235113029713, 40.60154577108027], [-73.82346666942101, 40.601634916949756], [-73.82345423589811, 40.6017579531873], [-73.82351857017017, 40.601850342157256], [-73.82358498378176, 40.601940032997845], [-73.8236230300988, 40.602032008883064], [-73.82357799780264, 40.60227189587525], [-73.82323485805279, 40.602295980038114], [-73.82304906345898, 40.602344916077236], [-73.8229963972268, 40.602418667228356], [-73.82294484720244, 40.60258290923388], [-73.82292481177993, 40.60279805612647], [-73.82289824010462, 40.602904582144866], [-73.8228859758601, 40.60296301503914], [-73.82290201513365, 40.60300303204292], [-73.82287967385791, 40.60328278301239], [-73.82280627719284, 40.60397517902289], [-73.82276563488945, 40.60420260478325], [-73.82278089795393, 40.60453487647327], [-73.82281306524087, 40.60458107100474], [-73.82290283001802, 40.60468726877069], [-73.82284474420824, 40.604811847183406], [-73.8228161467707, 40.60494101100073], [-73.82276978379645, 40.60494517875667], [-73.8227152139639, 40.60495008393984], [-73.82267071602584, 40.60498693242402], [-73.82259374778921, 40.605091409601755], [-73.82254505876273, 40.605186701243284], [-73.82253280983204, 40.605238981531194], [-73.82255472623692, 40.60536206595556], [-73.82253633123983, 40.60543279720047], [-73.82246746751217, 40.60552498291131], [-73.82248345709922, 40.605583458011004], [-73.82260024311239, 40.60568515806692], [-73.82269456760869, 40.605738103125375], [-73.82278161094604, 40.6057869581131], [-73.8229046338875, 40.605851277214725], [-73.82266727165995, 40.60611873206085], [-73.82236000888112, 40.606469260830025], [-73.82224712010017, 40.606419864076926], [-73.82223894478628, 40.606423057759585], [-73.82211377790149, 40.606471956085066], [-73.82173772462286, 40.606720559117484], [-73.82167691598228, 40.60681890892526], [-73.82151924671516, 40.6069109548534], [-73.82126470321427, 40.607002850205184], [-73.82119987284851, 40.60709504008171], [-73.8212602880639, 40.60714435605202], [-73.82117120508813, 40.6072488144145], [-73.82119130511715, 40.607279608840344], [-73.82107550220364, 40.60738272511419], [-73.82089163199677, 40.607642153792106], [-73.82088742209929, 40.60770675093409], [-73.82090456163026, 40.607781246109084], [-73.82085990045205, 40.60783996985354], [-73.82029978490344, 40.608576445236174], [-73.82003243531851, 40.608923655879124], [-73.8200281252041, 40.60902516988982], [-73.81998318384011, 40.60922506304476], [-73.81994251894176, 40.609335748089634], [-73.81997458784697, 40.60941885997912], [-73.81998084881896, 40.609534058788874], [-73.81998227923674, 40.60956038585391], [-73.81980831751702, 40.60983495886035], [-73.81961795381072, 40.610479041032136], [-73.81995150270963, 40.61100586586921], [-73.82045405309891, 40.611854557163014], [-73.82051887888557, 40.61194994886219], [-73.82043202517556, 40.611987108137896], [-73.82043403607466, 40.61206678725429], [-73.82050281586973, 40.612133008178944], [-73.82057595418243, 40.61223314094054], [-73.8206893336656, 40.61225874578369], [-73.82076043881737, 40.61228767567876], [-73.82082274277886, 40.61228099237594], [-73.82087841795061, 40.61225734590997], [-73.82095222030904, 40.61210997603296], [-73.82098143849393, 40.611998135984095], [-73.82104384524081, 40.6119524624867], [-73.82108403602687, 40.61189658282583], [-73.82102865614056, 40.61181003904737], [-73.82101391261239, 40.6117666052224], [-73.82098893002488, 40.6116930062198], [-73.82110627924509, 40.611432068048714], [-73.82114995198185, 40.61139335100863], [-73.82120960284034, 40.61136249138747], [-73.82126119794827, 40.61130685698375], [-73.82128305878275, 40.611232605059136], [-73.82128421076361, 40.611096929142995], [-73.82120543662198, 40.61089613499369], [-73.8210622848369, 40.61076384818487], [-73.82078645512787, 40.61063341786839], [-73.82062698209096, 40.61052999510846], [-73.82054872655173, 40.610430824104476], [-73.82048700610763, 40.61022437914668], [-73.82052525668642, 40.610096502374056], [-73.82055813686831, 40.60995210898184], [-73.82063420416088, 40.60985730620809], [-73.82075127944346, 40.60961605984777], [-73.82079777394569, 40.60944279907322], [-73.82085878502924, 40.60923105813554], [-73.82114637042204, 40.6090624110356], [-73.82119903005622, 40.60889339821898], [-73.82133010279306, 40.608684718236645], [-73.82138268112817, 40.608545544973374], [-73.82161460094558, 40.60848031911391], [-73.82176098510635, 40.60861575979552], [-73.82175280507491, 40.60862610303351], [-73.82168241117662, 40.608715106793525], [-73.82177339909592, 40.608854501974754], [-73.82182531319947, 40.60896399709298], [-73.8216943464972, 40.609132890162414], [-73.82166797819498, 40.609232316803684], [-73.82179804199976, 40.6094016131943], [-73.82184945090272, 40.609700096907744], [-73.82186205220738, 40.609869212532935], [-73.8220962121063, 40.61015803186759], [-73.82233079790585, 40.61028770312733], [-73.82253978465067, 40.61022834489589], [-73.82273529622739, 40.610328114080026], [-73.8228923332429, 40.61033702209704], [-73.82319489759729, 40.610937836059286], [-73.82334654206795, 40.61115463895985], [-73.82342464290727, 40.61123433349867], [-73.82352882101249, 40.611324013967064], [-73.8238246859766, 40.61149866495507], [-73.82379847999995, 40.61212942099992], [-73.82234961099986, 40.61426002599995], [-73.82176857999997, 40.61476625499992], [-73.82170208100001, 40.61482419099985], [-73.82163921899993, 40.614870614999845], [-73.82157060299986, 40.614908690999904], [-73.82141601599977, 40.61505476399991], [-73.82075892499992, 40.61523267899991]]]}}, {\&quot;id\&quot;: \&quot;30\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 31, \&quot;Shape_Leng\&quot;: 0.0964245666516, \&quot;Shape_Area\&quot;: 0.000333975927329, \&quot;zone\&quot;: \&quot;Bronx Park\&quot;, \&quot;LocationID\&quot;: 31, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87094462199981, 40.85726608099992], [-73.87094413599989, 40.85726598899989], [-73.87094366199995, 40.85726605199995], [-73.87089011199996, 40.85727278099992], [-73.87088983900003, 40.85727281799995], [-73.87088962499988, 40.85727291599993], [-73.87087754099998, 40.85727822399984], [-73.87084887399999, 40.85729081699992], [-73.86954868099988, 40.85772602999987], [-73.86889622799993, 40.85777277299997], [-73.86841539699994, 40.85778035799994], [-73.86876752999989, 40.85734077999995], [-73.86887858999994, 40.85720213799993], [-73.86907624599999, 40.85694556099986], [-73.86927391299994, 40.856688982999884], [-73.86988842299996, 40.85597106699987], [-73.86990379599995, 40.85587302199991], [-73.86990421600002, 40.85577329299987], [-73.86988939599996, 40.855673861999925], [-73.86985960399987, 40.855576727999924], [-73.86981576299978, 40.855483773999914], [-73.86937675499983, 40.854265722999855], [-73.86916668699996, 40.85368604599991], [-73.86872263199984, 40.85242385199994], [-73.86860515599989, 40.85206864599991], [-73.868530913, 40.8517767559999], [-73.86844433299986, 40.85148667199995], [-73.86834552299989, 40.85119885199987], [-73.86823466099995, 40.85091373699986], [-73.86920944599997, 40.84923837199993], [-73.86941402799984, 40.84878802499991], [-73.86889243299996, 40.848112321999906], [-73.86944230499982, 40.84724417999993], [-73.87109207899995, 40.84432478099992], [-73.87179038499981, 40.8438028139999], [-73.87184610299998, 40.84376077799993], [-73.87190185099998, 40.84372143299993], [-73.87280708199992, 40.843424263999964], [-73.87399295499982, 40.842561505999925], [-73.87456845, 40.84164271999992], [-73.87459175399982, 40.841520647999914], [-73.8760850519999, 40.84206482699989], [-73.876798721, 40.84229978699994], [-73.87686858299995, 40.84231710599993], [-73.87694201699995, 40.84233562799991], [-73.878171756, 40.84262443699987], [-73.8773292409999, 40.84398312499995], [-73.87800756899993, 40.844484295999926], [-73.87919408799995, 40.84532173399988], [-73.88048011699989, 40.84619371599996], [-73.88106059899991, 40.84659008499992], [-73.88199829499979, 40.847235311999874], [-73.88284445599996, 40.847817225999954], [-73.88276104799992, 40.848057845999904], [-73.88278133699995, 40.84807038999989], [-73.88311982600001, 40.848221091999925], [-73.88288269199988, 40.84907404699991], [-73.88284931500006, 40.84919252699994], [-73.88255596199991, 40.85022427099987], [-73.88232256599994, 40.851060791999906], [-73.88200299099991, 40.85218935799987], [-73.8816727419998, 40.8533496789999], [-73.88103358999996, 40.85559995199987], [-73.88073042799992, 40.85667660499989], [-73.88072954099984, 40.856807273999955], [-73.88077132199986, 40.8570397609999], [-73.88079155299991, 40.85712750799994], [-73.88080810099991, 40.857198447999885], [-73.88088225100002, 40.85750954499986], [-73.88094184999994, 40.85769449599996], [-73.88094193200001, 40.85769473899994], [-73.88094199099993, 40.857694990999974], [-73.88098293799995, 40.85788399199989], [-73.88100464399997, 40.85807565699992], [-73.88100678999979, 40.85826802299992], [-73.88098942799995, 40.85845935899989], [-73.880965862, 40.85854520499987], [-73.88075871500001, 40.85949442499993], [-73.88060896899991, 40.860357092999884], [-73.88061726900006, 40.860497010999936], [-73.8806437029999, 40.86063731599991], [-73.88068839499986, 40.86077599299989], [-73.88075099099991, 40.86091098799991], [-73.88083055899997, 40.86104034399993], [-73.88092572600007, 40.86116228799991], [-73.88103469099984, 40.861275294999885], [-73.88200794099986, 40.862046852999946], [-73.8837937109999, 40.86417157099987], [-73.88379386499992, 40.86417182299991], [-73.88386792099986, 40.8642908889999], [-73.88392395799984, 40.86441776099988], [-73.88396002399999, 40.864549718999896], [-73.88397514999986, 40.86468399799992], [-73.88396922299982, 40.864817740999825], [-73.88394303099996, 40.86494818699985], [-73.88390334899988, 40.86507380199995], [-73.88384464399992, 40.86519681299989], [-73.88376749199992, 40.86531475299994], [-73.88367321300004, 40.86542528299993], [-73.883563778, 40.86552635199991], [-73.88344168299979, 40.86561633199988], [-73.88319816099992, 40.86576631399988], [-73.88273658899989, 40.86604857299993], [-73.88267624699999, 40.86608914099984], [-73.88271794699989, 40.86613296599992], [-73.88297537099986, 40.86644973199989], [-73.8830900319999, 40.86659150899993], [-73.88135802599994, 40.86757898699991], [-73.87991019699996, 40.86836304099992], [-73.87981206299987, 40.86841664799988], [-73.87772752999979, 40.86955533799994], [-73.87694351999987, 40.86995468199993], [-73.87619224900003, 40.87047671099988], [-73.87518802799978, 40.87157682799994], [-73.87436750799998, 40.872701008999876], [-73.87255250899983, 40.8751751829999], [-73.87160577400002, 40.87692192799989], [-73.87094367500002, 40.87851076699998], [-73.87033725199989, 40.87835140299995], [-73.8701497639999, 40.87831012099989], [-73.87005983899994, 40.878290316999916], [-73.86996807499997, 40.87826435199985], [-73.86978338299986, 40.87821297799992], [-73.86950315999994, 40.87814566499988], [-73.86943471300005, 40.87812919899994], [-73.86948896199988, 40.87798946799993], [-73.87004672699982, 40.876670530999945], [-73.8701541849999, 40.876416957999886], [-73.8701809419998, 40.87635452999992], [-73.87019944899986, 40.87631135499987], [-73.87023414999992, 40.876217573999924], [-73.87026287199994, 40.87612263599991], [-73.87028554799987, 40.876026758999956], [-73.87030212599987, 40.87593016499994], [-73.87031256699991, 40.87583307799986], [-73.8703168469999, 40.87573572299987], [-73.87031508399987, 40.87561752299991], [-73.8703131089999, 40.87534062099997], [-73.87037667199995, 40.8732843719999], [-73.87056192499989, 40.87151077799995], [-73.87053738699991, 40.8696740309999], [-73.87053494699997, 40.869581702999895], [-73.87053320099994, 40.86951557999986], [-73.87052897299995, 40.86935553299992], [-73.870526217, 40.869251176999924], [-73.87051629799993, 40.868875664999926], [-73.87051473299981, 40.86881643199997], [-73.87049958099983, 40.86824277599994], [-73.87049783499994, 40.86817665499995], [-73.87049187, 40.86795082999989], [-73.87045509099993, 40.866632868999886], [-73.87041916899989, 40.86536282199993], [-73.87046131799995, 40.86327149799997], [-73.87057937699994, 40.86140455299988], [-73.87088409199991, 40.85889518099991], [-73.87097845199983, 40.85819941499993], [-73.87103268899989, 40.857807796999936], [-73.87108262599999, 40.857377039999946], [-73.8710759809998, 40.85734166099993], [-73.87107594599998, 40.85734146299997], [-73.87107580399994, 40.85734126499989], [-73.87104967499978, 40.857305152999885], [-73.87104944999982, 40.857304836999965], [-73.87104905899983, 40.857304602999946], [-73.87100272699996, 40.857277112999924], [-73.87100227699989, 40.857276842999966], [-73.87100173199987, 40.85727674299992], [-73.87094462199981, 40.85726608099992]]]}}, {\&quot;id\&quot;: \&quot;31\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 32, \&quot;Shape_Leng\&quot;: 0.05426721601, \&quot;Shape_Area\&quot;: 0.000150879171971, \&quot;zone\&quot;: \&quot;Bronxdale\&quot;, \&quot;LocationID\&quot;: 32, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85882515999995, 40.85806135699987], [-73.8617906939999, 40.85798290399992], [-73.86287784399997, 40.85795359099992], [-73.8629585349999, 40.857951413999956], [-73.86318907699996, 40.85794519699991], [-73.86326398600002, 40.85794317599989], [-73.86387047899979, 40.85792681599985], [-73.86395713499984, 40.857924478999955], [-73.86455073499997, 40.857908462999944], [-73.86467028199996, 40.85790523699997], [-73.86564157999992, 40.857881545999916], [-73.8665833139999, 40.85785535399993], [-73.86758752499986, 40.85783008999988], [-73.86802029299992, 40.85783059499988], [-73.86807772399996, 40.85784684199991], [-73.86813140299985, 40.857876592999915], [-73.86817334099987, 40.85791854899991], [-73.86819723700003, 40.857967986999896], [-73.86820126399982, 40.85801835599993], [-73.8681883059999, 40.858063833999964], [-73.86841539699994, 40.85778035799994], [-73.86889622699992, 40.85777277299994], [-73.86954868099988, 40.85772602999987], [-73.87084887399999, 40.85729081699992], [-73.87087754099998, 40.85727822399984], [-73.87088962499988, 40.85727291599993], [-73.87088983900003, 40.85727281799995], [-73.87089011199996, 40.85727278099992], [-73.87094366199995, 40.85726605199995], [-73.87094413599989, 40.85726598899989], [-73.87094462199981, 40.85726608099992], [-73.87100173199987, 40.85727674299992], [-73.87100227699989, 40.857276842999966], [-73.87100272699996, 40.857277112999924], [-73.87104905899983, 40.857304602999946], [-73.87104944999982, 40.857304836999965], [-73.87104967499978, 40.857305152999885], [-73.87107580399994, 40.85734126499989], [-73.87107594599998, 40.85734146299997], [-73.8710759809998, 40.85734166099993], [-73.87108262599999, 40.857377039999946], [-73.87103268899989, 40.857807796999936], [-73.87097845199983, 40.85819941499993], [-73.87088409199991, 40.85889518099991], [-73.87057937699994, 40.86140455299988], [-73.87046131799995, 40.86327149799997], [-73.87041916899989, 40.86536282199993], [-73.87045509099993, 40.866632868999886], [-73.87049187, 40.86795082999989], [-73.87049783499994, 40.86817665499995], [-73.87049958099983, 40.86824277599994], [-73.87051057099994, 40.86865883499998], [-73.87051473299981, 40.86881643199997], [-73.87051629799993, 40.868875664999926], [-73.870526217, 40.869251176999924], [-73.87052897299995, 40.86935553299992], [-73.87053320099994, 40.86951557999986], [-73.87053494699997, 40.869581702999895], [-73.87053738699991, 40.8696740309999], [-73.87056192499989, 40.87151077799995], [-73.86935122399996, 40.871483353999906], [-73.86825887799992, 40.87146232799988], [-73.8671586419999, 40.871441912999934], [-73.86614489499986, 40.871422984999924], [-73.865208901, 40.87140764999989], [-73.86426604399986, 40.87138964999989], [-73.86333198300004, 40.8713751569999], [-73.86239212899996, 40.8713567339999], [-73.86137924099984, 40.8713365119999], [-73.8614338389999, 40.869603467999866], [-73.86149826099988, 40.86778221599998], [-73.86150246499992, 40.86755143299991], [-73.86154239799991, 40.86615362299991], [-73.86156274099987, 40.86554946399989], [-73.86055100799992, 40.8655296959999], [-73.85961281199982, 40.865512717999856], [-73.85890956799982, 40.864636925999875], [-73.85871220299993, 40.86425255299985], [-73.85844789699989, 40.86376138999988], [-73.85806098599983, 40.86304235999992], [-73.85780378799993, 40.86303621699989], [-73.85771028399981, 40.862278229999895], [-73.85770552799988, 40.862241284999925], [-73.85769842199993, 40.86218608099991], [-73.85769181699992, 40.8621347729999], [-73.85767885599986, 40.86203407799992], [-73.85767084800001, 40.86197187299994], [-73.8576092669999, 40.861493440999894], [-73.85759960699981, 40.86141838899994], [-73.85756682699994, 40.8611637229999], [-73.85752991799988, 40.86090316799989], [-73.85752224299985, 40.86084898099988], [-73.85747885699989, 40.8605427009999], [-73.85747219599985, 40.860495676999925], [-73.85746244199993, 40.860426811999915], [-73.85739481999993, 40.859984102999896], [-73.85735319699984, 40.859711605999934], [-73.8566377469999, 40.8581191719999], [-73.85882515999995, 40.85806135699987]]]}}, {\&quot;id\&quot;: \&quot;32\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 33, \&quot;Shape_Leng\&quot;: 0.0532702931967, \&quot;Shape_Area\&quot;: 0.000147416802448, \&quot;zone\&quot;: \&quot;Brooklyn Heights\&quot;, \&quot;LocationID\&quot;: 33, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99619227264343, 40.70337714093203], [-73.99513826820316, 40.702974114861405], [-73.99506438495756, 40.70310031332674], [-73.99504592724139, 40.70313183989976], [-73.99490815999987, 40.7030473409999], [-73.99470923399984, 40.702993885999895], [-73.99444009399991, 40.702909269999964], [-73.99417681200005, 40.702824653999855], [-73.99380996599997, 40.70267441199997], [-73.99325388199995, 40.702411970999876], [-73.99286016299997, 40.702202766999896], [-73.99261204999985, 40.702061128999915], [-73.99232767899991, 40.70185536999985], [-73.99221871100002, 40.70177257799986], [-73.9921106779999, 40.701693442999925], [-73.99206681900003, 40.70165885999988], [-73.99202772899994, 40.70162814199991], [-73.99193644899997, 40.701556408999856], [-73.99126294499995, 40.701027101999905], [-73.99093201799984, 40.7007662159999], [-73.99087453800003, 40.70067311699993], [-73.99083516199983, 40.7005697619999], [-73.99081766499997, 40.70046229299989], [-73.99082272099989, 40.7003547539999], [-73.99084157899988, 40.700281256999844], [-73.9910295809998, 40.699847169999956], [-73.99124033199993, 40.69936760199986], [-73.99128347399984, 40.699234293999915], [-73.99132124499982, 40.69910004499998], [-73.99135360999992, 40.698964980999925], [-73.99138053899995, 40.6988292269999], [-73.991402007, 40.698692910999945], [-73.99141799499986, 40.69855615899995], [-73.99142848599986, 40.6984190989999], [-73.99143347099985, 40.69828185899997], [-73.99142289799994, 40.69778099299988], [-73.99136812199991, 40.69701375299993], [-73.99128413699994, 40.69658820999993], [-73.99120620999996, 40.69635779799992], [-73.99118780399986, 40.696287414999894], [-73.99115539099992, 40.696196475999926], [-73.99080803800004, 40.69502713399987], [-73.99066605599978, 40.69456882399993], [-73.99044474099998, 40.69382825099991], [-73.99045286599994, 40.693720583999934], [-73.9905879449999, 40.693391378999905], [-73.99072895999997, 40.693047700999905], [-73.99085041499994, 40.6927982509999], [-73.99097187, 40.692548799999926], [-73.99066626299994, 40.69249717699989], [-73.98947238599989, 40.69229549399994], [-73.98910541699992, 40.69215331399992], [-73.98902944799994, 40.69212386099992], [-73.98930270499983, 40.691060225999884], [-73.98930768499997, 40.690991687999926], [-73.98973690099999, 40.690359972999886], [-73.99016617899996, 40.689729533999916], [-73.99054474599986, 40.689168104999936], [-73.99070669599995, 40.68913674399992], [-73.99236366999985, 40.689690123999924], [-73.99436092799984, 40.69023947999991], [-73.99623278099983, 40.69075777399991], [-73.99776924399993, 40.691194697999954], [-73.99803048599995, 40.69125372299988], [-73.9984330559999, 40.691364914999895], [-73.99910057299985, 40.69153697399986], [-73.99920161899989, 40.69157183399992], [-73.99928819599991, 40.691593959999935], [-73.99936540199982, 40.69161307799989], [-73.99951274099993, 40.6916514499999], [-73.99991517399985, 40.69176722999993], [-74.00021419499998, 40.69185176099989], [-74.00031547799995, 40.69187465199993], [-74.00110519399988, 40.692056594999954], [-74.0016998939999, 40.692382766999906], [-74.00174362072502, 40.69240674985266], [-74.0015417289999, 40.69278596299994], [-74.00127014951309, 40.69329606183691], [-74.0009586845849, 40.694069083791064], [-74.00301393814541, 40.69477784423956], [-74.0026355689508, 40.69536203701875], [-74.00239802583795, 40.695711654864475], [-74.00026872377784, 40.69496580257801], [-73.99988214960374, 40.695605199245655], [-73.9994614344863, 40.69628002660429], [-73.9994197190206, 40.69634693781851], [-73.99941302433201, 40.69635767645331], [-73.99952373903493, 40.69657482604084], [-74.00048933405957, 40.696926195088054], [-74.00043147340423, 40.69705246617853], [-73.99959333515216, 40.69678226147438], [-73.99953135202674, 40.69687661261934], [-73.99958770006698, 40.6968980571681], [-73.99955389083655, 40.69694523239685], [-73.99940738376904, 40.69688518944602], [-73.99950317795836, 40.696726507193716], [-73.99947406820583, 40.69670413446199], [-73.99929468836199, 40.696795125794004], [-73.99918198950836, 40.69688518856733], [-73.99899604139205, 40.696812278373024], [-73.99893968968644, 40.69694094051582], [-73.99887207210413, 40.69692378457409], [-73.99876458027717, 40.697120733093975], [-73.99887117097644, 40.69715757729577], [-74.0010490305752, 40.697908236697415], [-74.00048768562507, 40.69875777763452], [-73.9983776068576, 40.698063296146074], [-73.99802102725101, 40.69876173657377], [-74.00001840433616, 40.699466048073575], [-73.99947463838932, 40.70032277801827], [-73.9974989831, 40.699638869321234], [-73.99736745811681, 40.69963423442719], [-73.99716054243916, 40.69979281264407], [-73.99718148446391, 40.69999448496808], [-73.9971758435588, 40.70010599146384], [-73.99724462871697, 40.70014140989715], [-73.99669768997464, 40.70087697691713], [-73.9968218908586, 40.70099078282786], [-73.99752763273973, 40.701228816958704], [-73.99776011033609, 40.70135941487678], [-73.99780162786318, 40.70131939476617], [-73.99813879899439, 40.701518788248414], [-73.99619227264343, 40.70337714093203]]]}}, {\&quot;id\&quot;: \&quot;33\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 34, \&quot;Shape_Leng\&quot;: 0.0657059323545, \&quot;Shape_Area\&quot;: 0.000173946146651, \&quot;zone\&quot;: \&quot;Brooklyn Navy Yard\&quot;, \&quot;LocationID\&quot;: 34, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.97232032119902, 40.70908288315216], [-73.97066975742996, 40.70725970882147], [-73.97054062182238, 40.707316076353834], [-73.9702621853228, 40.706887504284005], [-73.97048881848585, 40.70540066562183], [-73.97016894509909, 40.70536185340732], [-73.97018075572805, 40.70492927056683], [-73.96762114779945, 40.70334850519434], [-73.96751516691087, 40.703437356878126], [-73.96747674493034, 40.703949870956215], [-73.9683326374704, 40.70448338458415], [-73.96929693837701, 40.705088331229625], [-73.96923632685235, 40.70599431249845], [-73.96929296374243, 40.70709333104775], [-73.96838933699995, 40.70682918699989], [-73.96795139100001, 40.705731216999894], [-73.96761547799979, 40.70496163499988], [-73.96720961999985, 40.70425570899993], [-73.96653747199996, 40.70369661299984], [-73.96607413599993, 40.703320152999936], [-73.96587418600001, 40.70315769499991], [-73.96520438999994, 40.70262274499987], [-73.96451844799995, 40.702074977999864], [-73.96386889399994, 40.70154188899993], [-73.96318252099994, 40.70100009499989], [-73.9625725539999, 40.70051219899991], [-73.96217978199998, 40.70022070999989], [-73.9623657999999, 40.69960558599991], [-73.96283963699993, 40.698038667999946], [-73.96288219599991, 40.69782702599988], [-73.96295416199992, 40.69760374899989], [-73.96305480199987, 40.69739287199992], [-73.96317583599986, 40.69718762099991], [-73.96331636199999, 40.69698969799986], [-73.96347515199992, 40.69680066799991], [-73.96365073599986, 40.69662194399993], [-73.963803372, 40.69649503799992], [-73.963971858, 40.69637865499991], [-73.96415417899982, 40.69627444999987], [-73.96434801500007, 40.69618376599989], [-73.9645507049999, 40.696107591999855], [-73.96546721499983, 40.695932161999956], [-73.96641979599997, 40.69596410599996], [-73.96741363299996, 40.69599862899988], [-73.96840655900004, 40.6960364839999], [-73.9693945009999, 40.696080388999846], [-73.9697278989999, 40.69780401399986], [-73.97076190899998, 40.69783928399989], [-73.97120281199977, 40.69785798999991], [-73.97178445299986, 40.697882663999955], [-73.97279477799988, 40.69792083799993], [-73.97332378599988, 40.697939650999906], [-73.97377513399991, 40.697959390999884], [-73.97478615599996, 40.69800455299992], [-73.97519315199986, 40.69802218699994], [-73.97578275800007, 40.698047729999864], [-73.97678642599985, 40.69808694699989], [-73.97753101699993, 40.69811581199988], [-73.97808892799996, 40.69813832499989], [-73.98054419199988, 40.69824651199988], [-73.98048604199988, 40.69927922799994], [-73.98048077899998, 40.6993727139999], [-73.98046217299986, 40.69970315799986], [-73.98044078599999, 40.7001836299999], [-73.98041744299996, 40.700518152999926], [-73.98040482499992, 40.700699006999855], [-73.98074079499993, 40.70127730999996], [-73.9806490779999, 40.70156087299994], [-73.98022432, 40.703063323999885], [-73.97998854099983, 40.70354105799989], [-73.97960292799985, 40.704176399999916], [-73.9793276249999, 40.70474627599989], [-73.97912179285028, 40.70552703403614], [-73.97896355081058, 40.70550219650426], [-73.97886517755374, 40.7058679562003], [-73.97881909040038, 40.70586246808449], [-73.97892765823725, 40.70549619916906], [-73.9788031024613, 40.70547222712397], [-73.97873829486646, 40.7054630646721], [-73.97863906658567, 40.705830648221756], [-73.97860162154001, 40.70582296852473], [-73.9786969819047, 40.70545626045808], [-73.97868440584477, 40.70545417710785], [-73.97864529228849, 40.705591021595616], [-73.97846557848955, 40.705562221864405], [-73.97843202250104, 40.70567863587691], [-73.97845692665027, 40.70568467134955], [-73.97844899155665, 40.705716545920126], [-73.97842182374887, 40.705713093959766], [-73.97838895552232, 40.705830254587326], [-73.97842178331251, 40.70583801473865], [-73.97841271462556, 40.70587075035045], [-73.97838101898172, 40.70586643677709], [-73.97839230543774, 40.7059706823108], [-73.97840136144173, 40.705972407194324], [-73.97839909439138, 40.70598274520238], [-73.9788564309653, 40.706059505100065], [-73.97885303360711, 40.7060655352846], [-73.97839229957326, 40.70598877473573], [-73.9783877652644, 40.70600600388105], [-73.97834474852871, 40.70599996498762], [-73.97835155258468, 40.705965506274495], [-73.97837419227056, 40.70596809446831], [-73.97836290650389, 40.70586384893295], [-73.97834139805158, 40.70585953726306], [-73.97834706969712, 40.70582507783397], [-73.97837423698817, 40.70583025182303], [-73.97840597500222, 40.70571050704935], [-73.97838559905202, 40.70570533367302], [-73.97839127010316, 40.70567259692237], [-73.97841617508323, 40.705676048465634], [-73.97845405328272, 40.705560375234064], [-73.97842683362268, 40.7055568085091], [-73.97859313620125, 40.70497858414276], [-73.97853198820685, 40.704876523429625], [-73.97844190715928, 40.70487139584311], [-73.97828301996252, 40.7046665516455], [-73.9781619969167, 40.70452842757676], [-73.97817256987123, 40.704485841835506], [-73.97817688845535, 40.70446844361957], [-73.97802067326661, 40.70429096645618], [-73.97735570894386, 40.70417808977397], [-73.97733878404608, 40.7042295507855], [-73.97726204580005, 40.70422009633448], [-73.9772119633924, 40.70421392662421], [-73.97751215494964, 40.70319675266348], [-73.97736083833689, 40.70313952051067], [-73.97729538355674, 40.70318930808753], [-73.97713562625376, 40.703005581402515], [-73.9770551895912, 40.70317876839772], [-73.97683246363418, 40.70361574187124], [-73.97623864768494, 40.70477564419063], [-73.97596096344841, 40.704715506440465], [-73.9769274918834, 40.70279782040038], [-73.97664059239023, 40.702496766094974], [-73.97634835593101, 40.70229910574264], [-73.97615937292022, 40.70217128035684], [-73.9755345648972, 40.703042808805726], [-73.97532987393977, 40.70295192433834], [-73.97594762102841, 40.702011996502776], [-73.97594746888169, 40.70201149422442], [-73.97598092723497, 40.70197503589959], [-73.97600587845436, 40.7019461337818], [-73.97589598081227, 40.7019004713829], [-73.9758141788267, 40.7018951826446], [-73.97581234475751, 40.70189450427652], [-73.97559301790525, 40.70181378876836], [-73.97560071840401, 40.70180646678156], [-73.97561086931884, 40.70179681450733], [-73.97550083176418, 40.70175830896567], [-73.97540348224568, 40.701911147567515], [-73.97455023388345, 40.70159034430477], [-73.97561192264291, 40.70003731645754], [-73.97581713783005, 40.699737121272676], [-73.97581945748546, 40.699706298712556], [-73.97581506305184, 40.69967560732393], [-73.97580407500232, 40.6996458884458], [-73.97578679455877, 40.699617956756555], [-73.9757636954341, 40.69959257794206], [-73.97573541084542, 40.69957044770558], [-73.97570271615527, 40.699552172697445], [-73.97566650761654, 40.69953825388533], [-73.9756277778049, 40.699529072821], [-73.97558758840917, 40.69952488118219], [-73.97554704112723, 40.6995257938729], [-73.97550724746861, 40.699531785873795], [-73.97546929828381, 40.69954269292822], [-73.97543423386269, 40.69955821604439], [-73.97540301541854, 40.69957792969204], [-73.97537649873668, 40.699601293466394], [-73.97535541071757, 40.69962766690227], [-73.9751895311087, 40.69987852225742], [-73.97431887009537, 40.70119515534329], [-73.97411513926478, 40.70130527141927], [-73.973888788485, 40.70108519489564], [-73.97385488106505, 40.70108398602825], [-73.973762109366, 40.70108068054629], [-73.97354417557611, 40.70089229252952], [-73.97355597076056, 40.70086763188122], [-73.97328853602355, 40.700624184552254], [-73.97292642848619, 40.70029455342767], [-73.97257311967198, 40.7000820561209], [-73.97239201397464, 40.700166322752274], [-73.97262103106195, 40.70046599557619], [-73.97298290412095, 40.70080626574634], [-73.973757007132, 40.701534138881854], [-73.97318676670886, 40.70166980367368], [-73.9728840477196, 40.701416795976], [-73.97284574196057, 40.7014347234145], [-73.97156913894533, 40.70030067964449], [-73.97113824583214, 40.69991789325807], [-73.97097896857517, 40.69985645765218], [-73.97078200587988, 40.69997866301123], [-73.97080524432837, 40.70009750034227], [-73.97254221267232, 40.70163644279681], [-73.97250810272976, 40.70166238646294], [-73.9733245610394, 40.70241265601073], [-73.97283512788735, 40.70272874074404], [-73.96982556559514, 40.70024507036794], [-73.96948655218084, 40.70051906125818], [-73.97283889974949, 40.70334642860182], [-73.97266938433755, 40.70350138043111], [-73.97183169654913, 40.702978669579736], [-73.96924539207352, 40.70136474188357], [-73.96893474818414, 40.70161586820729], [-73.96898517428966, 40.70174708878653], [-73.97147483845808, 40.7033165413165], [-73.97231246276117, 40.703844539538565], [-73.97215798824955, 40.70397020812867], [-73.97145657354827, 40.703508715924514], [-73.97110342298826, 40.70345973583976], [-73.97093307886338, 40.703624772048734], [-73.97101963118519, 40.70381561368637], [-73.97340440827125, 40.705304335604026], [-73.97465569608048, 40.70607426299424], [-73.97439083502317, 40.70632577414475], [-73.97347629598461, 40.70568628339133], [-73.97254880057814, 40.70620449000379], [-73.97329876359842, 40.70669771377458], [-73.97462966604417, 40.70768106076819], [-73.9742361696854, 40.70802438612241], [-73.97310627091164, 40.70713556922055], [-73.9722179484904, 40.70650549303291], [-73.97170524941599, 40.70613603268091], [-73.9712249291223, 40.70578990041363], [-73.97109655489108, 40.705850056558255], [-73.97100438685837, 40.70682824094664], [-73.97105692306172, 40.70694643381669], [-73.97275756998387, 40.70883127854767], [-73.97232032119902, 40.70908288315216]]], [[[-73.97892920137538, 40.705931589879214], [-73.97893110285521, 40.70592490623034], [-73.97906084872884, 40.705946028470365], [-73.97905767006142, 40.705952889050316], [-73.97892920137538, 40.705931589879214]]], [[[-73.98237340600002, 40.70554334999991], [-73.98245898620758, 40.705542414486125], [-73.98242287179853, 40.70582205595453], [-73.98102390618274, 40.705898913893535], [-73.98101733900947, 40.70579750646778], [-73.98230205183869, 40.705736979399674], [-73.98232944175258, 40.705552033831964], [-73.98237340600002, 40.70554334999991]]]]}}, {\&quot;id\&quot;: \&quot;34\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 35, \&quot;Shape_Leng\&quot;: 0.085787918592, \&quot;Shape_Area\&quot;: 0.000323825195932, \&quot;zone\&quot;: \&quot;Brownsville\&quot;, \&quot;LocationID\&quot;: 35, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.90105329800004, 40.66212482099994], [-73.90066118699986, 40.66058615799992], [-73.900146584, 40.66065327699988], [-73.89988908799995, 40.66063980699986], [-73.89972880499995, 40.66070453499989], [-73.89965233299985, 40.66073541599994], [-73.89921760899985, 40.65911140399994], [-73.89883571499976, 40.657525941999936], [-73.89881834799998, 40.65745381299991], [-73.89880698499995, 40.65740666199988], [-73.89891727499989, 40.65739022499992], [-73.899041804, 40.657371657999846], [-73.89948109299996, 40.65732134299993], [-73.89968548099989, 40.65729793699992], [-73.89988986899985, 40.6572745209999], [-73.90002679299982, 40.65725384799987], [-73.9002942619999, 40.657208882999925], [-73.9003948669999, 40.657184204999936], [-73.90048767199994, 40.65714867899987], [-73.900574915, 40.657099946999885], [-73.90064904799996, 40.65704155799989], [-73.901185599, 40.6565145509999], [-73.90230238299979, 40.65578061099992], [-73.9024538329999, 40.65566436599985], [-73.90261911399998, 40.6555581099999], [-73.90279641599983, 40.655463210999876], [-73.90298366699997, 40.655380780999906], [-73.90317858399993, 40.655311633999915], [-73.90414221299994, 40.655146420999905], [-73.90446144000003, 40.655099535999895], [-73.90489261799986, 40.65503619899993], [-73.90507059799985, 40.655010060999935], [-73.90556272799998, 40.654937909999866], [-73.906067832, 40.6548638509999], [-73.90692334299995, 40.65473841999989], [-73.90784346399994, 40.65459152999988], [-73.90782538299986, 40.65453360399992], [-73.90780156999993, 40.654438948999925], [-73.90740035699999, 40.6528439899999], [-73.90821606899983, 40.65231208699988], [-73.90855790499995, 40.65209593799989], [-73.90933499299997, 40.65280859199989], [-73.9097001379998, 40.65415294699991], [-73.90972827499986, 40.65425186399989], [-73.90974279799993, 40.65431111199997], [-73.90975756199991, 40.654367116999865], [-73.90977962099994, 40.654466254999925], [-73.91012255699995, 40.655851770999945], [-73.91108323599995, 40.65570239299992], [-73.91199538399984, 40.65556155999991], [-73.91236458899995, 40.65551356499985], [-73.91314356299998, 40.65622086399992], [-73.91377943699983, 40.65678367899993], [-73.91402878099997, 40.65700370899984], [-73.91441247700004, 40.65736241899984], [-73.91556629599982, 40.65839257199986], [-73.91572803800001, 40.658550127999874], [-73.91707363499995, 40.65974535399988], [-73.91741819199994, 40.66005119199989], [-73.91818493100003, 40.660726208999954], [-73.91829936299985, 40.66116125699987], [-73.91860168199995, 40.661118048999846], [-73.91893607399996, 40.6614160109999], [-73.91920450999993, 40.661655199999835], [-73.91945727799987, 40.66188078499988], [-73.9195947979998, 40.66199567899985], [-73.9196271919999, 40.661708058999885], [-73.91966280899982, 40.66140503299994], [-73.91974399499986, 40.660770973999895], [-73.91990440499988, 40.66033711699987], [-73.919986348, 40.660115465999894], [-73.92008167099986, 40.659857632999866], [-73.92021313099984, 40.65997544099987], [-73.9209090419998, 40.66059911499987], [-73.92272843000003, 40.66223123199989], [-73.9245494589998, 40.66386259199993], [-73.92637970499992, 40.6655148919999], [-73.92592201499984, 40.66571503599991], [-73.92546270199979, 40.66591675199991], [-73.92439099400002, 40.66638142299991], [-73.92424467299992, 40.66644499999986], [-73.92331039799996, 40.66685345999985], [-73.92323224599997, 40.66688762799987], [-73.92311978499988, 40.666936793999945], [-73.92303439399991, 40.66697412599995], [-73.922811066, 40.66707176099994], [-73.92275257199998, 40.667097332999894], [-73.92221564099988, 40.6673334459999], [-73.92187171199997, 40.667480689999906], [-73.9210198879999, 40.667852697999905], [-73.92014864299998, 40.66822948399992], [-73.92011464299999, 40.668376001999924], [-73.91999873699986, 40.6684094839999], [-73.91923062999997, 40.66863136499991], [-73.91838191199984, 40.66900224699985], [-73.91748266100001, 40.66939223099988], [-73.9171358899999, 40.66954376399992], [-73.91658459999987, 40.6697875489999], [-73.91652296199993, 40.66981426399983], [-73.9164716349998, 40.669836508999886], [-73.91586213199994, 40.670100668999964], [-73.91580361899986, 40.670126027999906], [-73.9157287449999, 40.67015847799994], [-73.91558467299987, 40.67022136299989], [-73.91553422600005, 40.67024338399992], [-73.91487246299994, 40.6705322279999], [-73.91461857800005, 40.67064323799989], [-73.9145448559999, 40.67067547299995], [-73.91403857199998, 40.67089683999989], [-73.91308574699985, 40.67131022599989], [-73.91221776899997, 40.67168716299988], [-73.91133533699998, 40.672076452999896], [-73.9111599549999, 40.67215535099993], [-73.91109867399982, 40.67218291999989], [-73.91104631099985, 40.672204641999954], [-73.910463053, 40.672446601999866], [-73.91037473899996, 40.672483237999884], [-73.91019287099996, 40.67255868499989], [-73.91014265099993, 40.6725795189999], [-73.90995832899995, 40.672655980999906], [-73.90989833499988, 40.67268086899986], [-73.90954171999984, 40.67282880299995], [-73.90925438099987, 40.672947997999856], [-73.90841931599986, 40.673313332999925], [-73.9083295419999, 40.673355302999894], [-73.90827800999982, 40.67337939399993], [-73.90787711599997, 40.6735668089999], [-73.90746843099997, 40.67376161399989], [-73.90695655499991, 40.67398525899991], [-73.90629662099994, 40.6742653329999], [-73.90609438799999, 40.674352931999906], [-73.90582626799984, 40.674469653999886], [-73.90524012899992, 40.674724945999856], [-73.90450912299991, 40.67505211099989], [-73.90438792800002, 40.67520674699993], [-73.90428786799986, 40.67522935599987], [-73.90374374599986, 40.67540683399991], [-73.90347422300006, 40.67550668299985], [-73.90346228899996, 40.675457918999896], [-73.90344272399983, 40.67537791899986], [-73.9032213189999, 40.67447291399992], [-73.90296768999997, 40.67343939499992], [-73.90266008399996, 40.67219717899991], [-73.90228822599984, 40.67093600699995], [-73.90198218099997, 40.669670070999906], [-73.90166767899989, 40.668413528999885], [-73.90126570400001, 40.66688064999991], [-73.9008513569999, 40.665345894999895], [-73.90041654099997, 40.663806526999934], [-73.90050930099981, 40.663793574999914], [-73.90071711999985, 40.66376455299993], [-73.90145114700002, 40.66365836499993], [-73.90105329800004, 40.66212482099994]]]}}, {\&quot;id\&quot;: \&quot;35\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 36, \&quot;Shape_Leng\&quot;: 0.0870507867063, \&quot;Shape_Area\&quot;: 0.000247666139269, \&quot;zone\&quot;: \&quot;Bushwick North\&quot;, \&quot;LocationID\&quot;: 36, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91254913799993, 40.70387341999989], [-73.91180710099985, 40.70343495199993], [-73.912904041, 40.7023618909999], [-73.91216169799988, 40.701923163999915], [-73.91142242699996, 40.70148658799996], [-73.91067882699998, 40.701045968999914], [-73.91180820099989, 40.69993800299986], [-73.91103489599992, 40.6995321139999], [-73.90953273199997, 40.69867510499995], [-73.90877366099991, 40.69825522699988], [-73.9080224919999, 40.69782540899991], [-73.90756985199991, 40.69757174999993], [-73.90727452399994, 40.69739918999991], [-73.9068458349999, 40.69716354899987], [-73.90652350699987, 40.69697614399997], [-73.906116261, 40.6967505569999], [-73.90576535999985, 40.6965485549999], [-73.9054012769999, 40.69635030599995], [-73.90500484799992, 40.696118745999904], [-73.90466384799993, 40.69593224699988], [-73.9042601839999, 40.69570037099989], [-73.90480435399992, 40.695148168999914], [-73.90491424299982, 40.69507357099997], [-73.90579597099993, 40.69412715499987], [-73.90504295399994, 40.69370400599987], [-73.90428792799995, 40.6932780679999], [-73.90386600499991, 40.693035711999904], [-73.90354057099982, 40.69284878199992], [-73.9027906169999, 40.69242104699992], [-73.90207277399993, 40.691999230999905], [-73.90170525399989, 40.69166024399989], [-73.90148893599996, 40.6915568839999], [-73.90123290699994, 40.69144227899997], [-73.90180467199995, 40.6907662979999], [-73.904055772, 40.68854627799986], [-73.90419686399987, 40.68858474399986], [-73.9044739719999, 40.68866816099992], [-73.90482499699988, 40.688808569999956], [-73.90504399299995, 40.688932240999875], [-73.9057928679998, 40.68936474999989], [-73.90654394399994, 40.68979093699993], [-73.90729183099991, 40.690219069999905], [-73.9080425449999, 40.690647001999885], [-73.90879653399988, 40.691074750999896], [-73.90955061499984, 40.69150297299994], [-73.91029860299984, 40.69192995199991], [-73.91105301, 40.692357245999894], [-73.911805654, 40.6927850819999], [-73.91255469999996, 40.69321201999987], [-73.91331306200004, 40.69363224199988], [-73.91405670900002, 40.694068467999884], [-73.914808253, 40.69449685199993], [-73.91502132199989, 40.69461706699989], [-73.91506798799989, 40.694643395999954], [-73.91556201299993, 40.69492212499987], [-73.916313257, 40.69535124599984], [-73.91655004899992, 40.6954859149999], [-73.91661144299985, 40.6955208309999], [-73.91670957700003, 40.695576641999864], [-73.91677235199991, 40.69561234299993], [-73.91686074399993, 40.69566261299991], [-73.91691887399988, 40.69569567199989], [-73.91707162999998, 40.69578254599988], [-73.91728545099988, 40.695904352999946], [-73.917361666, 40.695947768999844], [-73.91743326099993, 40.695988553999875], [-73.91750809599985, 40.6960311839999], [-73.91760570499984, 40.69608678699994], [-73.917698671, 40.69613974499987], [-73.91781824899988, 40.69620786299991], [-73.91800959500003, 40.69631614199996], [-73.91812143899979, 40.69637943199995], [-73.91824631899986, 40.69645009899988], [-73.91835160499986, 40.69650967699986], [-73.91842289799999, 40.69655001999995], [-73.91848765699991, 40.69658666399988], [-73.91856440699996, 40.69663009399993], [-73.91932072899982, 40.69706039699991], [-73.91956944199978, 40.69720230699989], [-73.91960508499987, 40.697222642999876], [-73.92007372399986, 40.69749003399989], [-73.92043053999987, 40.69769341199991], [-73.9204962049999, 40.69773083899991], [-73.92082397399983, 40.697917657999916], [-73.92157402199999, 40.698345508999914], [-73.92175647299993, 40.69845331699989], [-73.92232801999992, 40.69877209799994], [-73.92268944899993, 40.69897762199984], [-73.92308169399985, 40.69920067199989], [-73.92383267099994, 40.6996277979999], [-73.92458241299997, 40.700055251999906], [-73.92532959999984, 40.70048119499994], [-73.92608301599982, 40.70091014499993], [-73.92683805799987, 40.70133420999986], [-73.92758774299998, 40.701762580999855], [-73.92833850299998, 40.70219163999995], [-73.92909071699984, 40.70261967799991], [-73.92984252699986, 40.703046809999876], [-73.93059386199991, 40.70347330799992], [-73.93115533899987, 40.70377233499987], [-73.93172871799996, 40.703545990999906], [-73.93269784899994, 40.70317039099989], [-73.93281494999994, 40.70357711199993], [-73.93293503499983, 40.70399456099992], [-73.93301076499982, 40.70427708599988], [-73.93312548700004, 40.70470086199992], [-73.93320124199991, 40.70497168999993], [-73.93331989699992, 40.70539302699994], [-73.93340041899982, 40.7056682879999], [-73.93351245499996, 40.70609483499993], [-73.93359321499992, 40.70637065399992], [-73.93371088099994, 40.70679153099994], [-73.93379054199995, 40.70706657499993], [-73.93391870799988, 40.70748702599992], [-73.93229708600003, 40.70774944699988], [-73.9320728499999, 40.70778578599989], [-73.92902566099997, 40.70827681499986], [-73.92740683799988, 40.70854132199989], [-73.92576502499996, 40.7088037639999], [-73.92418647499989, 40.70906472899986], [-73.92248241799982, 40.709332487999895], [-73.92189184700005, 40.709396096999896], [-73.92143475999988, 40.7091287659999], [-73.92070065899999, 40.708694629999876], [-73.91995952899983, 40.708257287999885], [-73.91956473400002, 40.708023977999915], [-73.91922162699984, 40.707815133999844], [-73.91884342599998, 40.70759799799987], [-73.91847670899989, 40.70738156299989], [-73.918102996, 40.707159968999896], [-73.91808167700003, 40.70714732999993], [-73.91773662899993, 40.70694273899988], [-73.91736520300005, 40.7067224689999], [-73.9169950679999, 40.706502964999885], [-73.91664948199995, 40.706299387999955], [-73.91660892400002, 40.70627549499992], [-73.91625251999979, 40.70606554299993], [-73.91589738599998, 40.705854816999846], [-73.91551250499982, 40.705626444999965], [-73.91477063799996, 40.70518943699992], [-73.91403097499997, 40.704749112999885], [-73.91329162399998, 40.70431263899994], [-73.91254913799993, 40.70387341999989]]]}}, {\&quot;id\&quot;: \&quot;36\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 37, \&quot;Shape_Leng\&quot;: 0.142810040466, \&quot;Shape_Area\&quot;: 0.000452062644782, \&quot;zone\&quot;: \&quot;Bushwick South\&quot;, \&quot;LocationID\&quot;: 37, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93312548700004, 40.70470086199992], [-73.93301076599988, 40.70427708599989], [-73.93293503499983, 40.70399456099992], [-73.93281494999994, 40.70357711199993], [-73.93269784899994, 40.70317039099989], [-73.93172871799996, 40.703545990999906], [-73.93115533899987, 40.70377233499987], [-73.93059386199991, 40.70347330799992], [-73.92984252699986, 40.703046809999876], [-73.92909071699984, 40.70261967799991], [-73.92833850299998, 40.70219163999995], [-73.92758774299998, 40.701762580999855], [-73.92683805799987, 40.70133420999986], [-73.92608301599982, 40.70091014499993], [-73.92532959999984, 40.70048119499994], [-73.92458241299997, 40.700055251999906], [-73.92383267099994, 40.6996277979999], [-73.92308169399985, 40.69920067199989], [-73.92268944899993, 40.69897762199984], [-73.92232801999992, 40.69877209799994], [-73.92175647299993, 40.69845331699989], [-73.92157402199999, 40.698345508999914], [-73.92082397399983, 40.697917657999916], [-73.9204962049999, 40.69773083899991], [-73.92043053999987, 40.69769341199991], [-73.92007372399986, 40.69749003399989], [-73.91960508499987, 40.697222642999876], [-73.91956944199978, 40.69720230699989], [-73.91932072899982, 40.69706039699991], [-73.91856440699996, 40.69663009399993], [-73.91848765699991, 40.69658666399988], [-73.91842289799999, 40.69655001999995], [-73.91835160499986, 40.69650967699986], [-73.91824631899986, 40.69645009899988], [-73.91812143899979, 40.69637943199995], [-73.91800959500003, 40.69631614199996], [-73.91781824899988, 40.69620786299991], [-73.917698671, 40.69613974499987], [-73.91760570499984, 40.69608678699994], [-73.91750809599985, 40.6960311839999], [-73.91743326099993, 40.695988553999875], [-73.917361666, 40.695947768999844], [-73.91728545099988, 40.695904352999946], [-73.91707162999998, 40.69578254599988], [-73.91691887399988, 40.69569567199989], [-73.91686074399993, 40.69566261299991], [-73.91677235199991, 40.69561234299993], [-73.91670957700003, 40.695576641999864], [-73.91661144299985, 40.6955208309999], [-73.91655004899992, 40.6954859149999], [-73.916313257, 40.69535124599984], [-73.91556201299993, 40.69492212499987], [-73.91506798799989, 40.694643395999954], [-73.91502132199989, 40.69461706699989], [-73.914808253, 40.69449685199993], [-73.91405670900002, 40.694068467999884], [-73.91331306200004, 40.69363224199988], [-73.91255469999996, 40.69321201999987], [-73.911805654, 40.6927850819999], [-73.91105301, 40.692357245999894], [-73.91029860299984, 40.69192995199991], [-73.90955061499984, 40.69150297299994], [-73.90879653399988, 40.691074750999896], [-73.9080425449999, 40.690647001999885], [-73.90729183099991, 40.690219069999905], [-73.90654394399994, 40.68979093699993], [-73.9057928679998, 40.68936474999989], [-73.90504399299995, 40.688932240999875], [-73.90482499699988, 40.688808569999956], [-73.9044739719999, 40.68866816099992], [-73.90419686399987, 40.68858474399986], [-73.904055772, 40.68854627799986], [-73.90180467199995, 40.6907662979999], [-73.90042465099988, 40.688183897999856], [-73.90116154999988, 40.68787793499991], [-73.8965264419999, 40.682403298999894], [-73.89646625099995, 40.68233642199988], [-73.89652633199988, 40.68200291799991], [-73.89658158699996, 40.6815747179999], [-73.89663536799999, 40.68155649499991], [-73.89674965999993, 40.68149202599986], [-73.89687298299991, 40.680895284999934], [-73.89692154999993, 40.680781612999915], [-73.89697886299997, 40.68067032699991], [-73.89704472199993, 40.68056181599996], [-73.89711889399996, 40.68045646099994], [-73.8972011219999, 40.680354629999904], [-73.89729111699982, 40.68025667899985], [-73.89738856299982, 40.68016295199989], [-73.89749312100001, 40.680073775999915], [-73.89767194200002, 40.6799688539999], [-73.89786299899986, 40.67987501099987], [-73.89806444599996, 40.67979343099991], [-73.89827418999997, 40.67972504299988], [-73.89848997800001, 40.67967050899991], [-73.89870944799999, 40.67963016999989], [-73.89889928299989, 40.67956093399993], [-73.89969830299987, 40.67954409199993], [-73.90047001100004, 40.679535243999936], [-73.90075235999984, 40.67967664399992], [-73.90262262299991, 40.6806645029999], [-73.90358874799992, 40.67967480399991], [-73.9040463979999, 40.67922059799985], [-73.90456891299982, 40.67951553699991], [-73.90479113399992, 40.67964096499992], [-73.9054141659999, 40.67999264299987], [-73.90549303499998, 40.68003715799995], [-73.905548368, 40.6800716019999], [-73.90565934199981, 40.68014069099989], [-73.90628287099989, 40.68050675599993], [-73.90671941199996, 40.68076742199985], [-73.90701820299995, 40.68094827999989], [-73.90777158799989, 40.68137784699997], [-73.90851642300002, 40.681803942999906], [-73.90886025599995, 40.681994035999914], [-73.90905526999994, 40.682105574999895], [-73.90927462899988, 40.68223432399993], [-73.91002460999994, 40.68265737099986], [-73.91076954399978, 40.68309270099994], [-73.911511929, 40.683504989999896], [-73.91227301199991, 40.68393496499991], [-73.91303721399989, 40.684367809999884], [-73.91330728099987, 40.6845208579999], [-73.91379700199988, 40.68479987199986], [-73.91453972399987, 40.68522691799994], [-73.91470083399992, 40.68531694499989], [-73.91528963499992, 40.685645535999875], [-73.91550033999997, 40.68576152399992], [-73.91604599299995, 40.68607206899985], [-73.9166103199999, 40.68639135299993], [-73.916798329, 40.68649719899987], [-73.91755226099991, 40.68693022299989], [-73.91768113899987, 40.68700409499997], [-73.91804607, 40.68721324799989], [-73.91829345799984, 40.68735666799993], [-73.91878323299994, 40.687626087999924], [-73.91906109199992, 40.687784368999864], [-73.91980961899992, 40.68821124099985], [-73.92055013100003, 40.68864092199994], [-73.920961039, 40.6888720519999], [-73.92121369999991, 40.68901947699986], [-73.92130587799981, 40.68907164399991], [-73.92207133799985, 40.68948984099992], [-73.922807024, 40.68992392499993], [-73.9231696669999, 40.690123405999884], [-73.9236437979999, 40.690398837999915], [-73.92429213299995, 40.690773356999905], [-73.92439183300002, 40.690831748999926], [-73.92536488899991, 40.69136634399996], [-73.92556064099996, 40.69149083999987], [-73.92631612499989, 40.691928452999896], [-73.92644992099981, 40.692001768999944], [-73.92707069499987, 40.692346223999955], [-73.92750685299994, 40.69260381099993], [-73.92781120699986, 40.692774208999936], [-73.92804330699994, 40.692904171999906], [-73.92850659699988, 40.693165725999904], [-73.92864268999999, 40.6932410129999], [-73.9288283419999, 40.693350098999936], [-73.92882897899982, 40.69335047399987], [-73.9297019239999, 40.69386339699991], [-73.93051146699992, 40.69431652299989], [-73.93114516499988, 40.69467397499987], [-73.93145784300005, 40.6948554709999], [-73.93177404599997, 40.69502821499992], [-73.93192890099984, 40.69511465699991], [-73.93236605699987, 40.69535837699995], [-73.93311862899988, 40.69579115399997], [-73.93382817199998, 40.69618427699988], [-73.93413397299992, 40.69635843099992], [-73.93448784799989, 40.696560267999914], [-73.93457999399985, 40.696612823999956], [-73.93460675199995, 40.69662808499985], [-73.93468892700004, 40.69667495399994], [-73.93479699699994, 40.6967365919999], [-73.93522264399988, 40.69698654499993], [-73.93600679799988, 40.697405748999905], [-73.93638762599981, 40.69761530199985], [-73.93675978999995, 40.69783118899988], [-73.93739064799986, 40.69818579499985], [-73.93777354599992, 40.69840469299989], [-73.93817718599986, 40.69864022299987], [-73.93856854799981, 40.698848135999874], [-73.93896470899988, 40.698801031999935], [-73.93906425899979, 40.69878919499992], [-73.93952025999982, 40.69873497499989], [-73.93960973999992, 40.69872433499995], [-73.94002089599995, 40.69867544399993], [-73.94011148799991, 40.69866467199989], [-73.94051277999984, 40.69861695199994], [-73.9405942079999, 40.69860726799988], [-73.94072013299996, 40.698592293999916], [-73.94081408799997, 40.69858111999986], [-73.94115035299997, 40.69854113199994], [-73.94176673799987, 40.69847070399985], [-73.94185058700003, 40.69846112399994], [-73.94247471499993, 40.698389807999945], [-73.94253735900001, 40.69838264999989], [-73.9429206409998, 40.69833885099996], [-73.94299724499987, 40.69833009799986], [-73.94394947299996, 40.698221278999924], [-73.94409591299996, 40.698972954999924], [-73.94424286099989, 40.69969927999991], [-73.94438788599984, 40.70042452299993], [-73.94193078899983, 40.70072523399989], [-73.94042057899993, 40.701076597999865], [-73.9405445659999, 40.701798044999855], [-73.94060119499999, 40.70214158099988], [-73.9406199669999, 40.702255449999896], [-73.94067555399978, 40.70259265099991], [-73.94076481199986, 40.703134032999884], [-73.94077939399978, 40.70322246899988], [-73.9408928719998, 40.70391415699989], [-73.94103009699987, 40.7046361769999], [-73.94168041699996, 40.70457403599987], [-73.9417696579999, 40.70456550799983], [-73.9421432489999, 40.7045298069999], [-73.9422114949999, 40.7045232859999], [-73.94273448399997, 40.70447330599988], [-73.94285013599988, 40.70518202999993], [-73.94296619399988, 40.70588843999991], [-73.94308587399995, 40.70659666199991], [-73.94320222899984, 40.7073347509999], [-73.94332294399995, 40.708070194999934], [-73.94344009799994, 40.70878089099988], [-73.94354434699991, 40.70941603099986], [-73.94355745099986, 40.709495864999965], [-73.94357094699997, 40.70957809399996], [-73.94358512999999, 40.70966450499993], [-73.94367685499988, 40.71022334799989], [-73.94368828299991, 40.71029296399993], [-73.94378799599994, 40.710900378999945], [-73.94357731299993, 40.710920286999894], [-73.94326978899984, 40.710949344999925], [-73.94283637099988, 40.7109902979999], [-73.94245994699992, 40.7110258639999], [-73.94210580699989, 40.71105932199989], [-73.94196964799987, 40.7110721309999], [-73.94159179599998, 40.711107670999915], [-73.94116852899995, 40.71114748299993], [-73.94075355899997, 40.711186512999916], [-73.94042251999994, 40.711217647999945], [-73.9404771349999, 40.711562642999866], [-73.94068803099992, 40.71196204799987], [-73.93846617699984, 40.71248925599995], [-73.93832001399986, 40.71252368499994], [-73.93724803599986, 40.712782740999884], [-73.93480281900003, 40.713372495999884], [-73.9345332899999, 40.712753303999925], [-73.93425709399997, 40.712123023999936], [-73.93389272699982, 40.711335677999905], [-73.933601465, 40.7106691059999], [-73.93329596399984, 40.709987710999926], [-73.93299690799995, 40.709317159999884], [-73.9326921559999, 40.70863203599986], [-73.93252310799994, 40.70823818799991], [-73.93229708600003, 40.70774944699988], [-73.93391870799988, 40.70748702599992], [-73.93379054199995, 40.70706657499993], [-73.93371087999985, 40.70679153099996], [-73.93359321499992, 40.70637065399992], [-73.93351245499996, 40.70609483499993], [-73.93340041899982, 40.7056682879999], [-73.93331989699992, 40.70539302699994], [-73.93320124099985, 40.704971689999915], [-73.93312548700004, 40.70470086199992]]]}}, {\&quot;id\&quot;: \&quot;37\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 38, \&quot;Shape_Leng\&quot;: 0.0832175685234, \&quot;Shape_Area\&quot;: 0.000327392684821, \&quot;zone\&quot;: \&quot;Cambria Heights\&quot;, \&quot;LocationID\&quot;: 38, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.73624941199995, 40.702536977999884], [-73.73430403699984, 40.702478130999936], [-73.73426739299985, 40.70316624699992], [-73.73426455399982, 40.703219541999935], [-73.7333187329999, 40.70319051999997], [-73.73245633499985, 40.70316405099986], [-73.732314832, 40.70315970599992], [-73.73036969899985, 40.70309853299995], [-73.7277679189999, 40.70302063799987], [-73.7273634669998, 40.70303714099988], [-73.72725657600003, 40.703041498999916], [-73.72713924599991, 40.70304627199988], [-73.72677759516957, 40.7030592911994], [-73.72672841210559, 40.7021457358777], [-73.72678346816939, 40.70198712397415], [-73.72673796384797, 40.7015879518937], [-73.72665409175167, 40.70111265819504], [-73.72654435079282, 40.69898264008306], [-73.72652452210123, 40.698258092187295], [-73.72651147511033, 40.69778119231719], [-73.72650934112171, 40.69751670520512], [-73.72650630194262, 40.697138805009], [-73.72650617482721, 40.69712356793277], [-73.72650576920826, 40.69707238185047], [-73.72650566904106, 40.69705938782327], [-73.72650562109436, 40.69705367791967], [-73.72650548804287, 40.697037243007145], [-73.72650547377476, 40.69703499178466], [-73.72650545484571, 40.697033793849265], [-73.72650544889288, 40.69703238923185], [-73.72650541791589, 40.69702834513061], [-73.72650538383098, 40.69702492404414], [-73.72650531499247, 40.697015963925466], [-73.72650318512274, 40.696880358755614], [-73.72626254324406, 40.69077325308489], [-73.7262583130798, 40.6906108621615], [-73.7262588651076, 40.69026892794887], [-73.72620259721364, 40.68898434090529], [-73.72617495100188, 40.68865003005495], [-73.72616338309388, 40.68845361784905], [-73.72599616320741, 40.686932054144755], [-73.72594098579772, 40.68639910518071], [-73.72593196221484, 40.686311940908524], [-73.725926356196, 40.68622520812825], [-73.72579787921153, 40.68435384991247], [-73.72580147979704, 40.68428378038721], [-73.72586264191175, 40.683241080973865], [-73.72658306499989, 40.68341482999993], [-73.72666460799998, 40.68343688899992], [-73.72675245899993, 40.68346409399994], [-73.72718272499995, 40.68359732999987], [-73.72785251200004, 40.68380044199992], [-73.72872058399992, 40.68406239099987], [-73.72959149799996, 40.68432533799995], [-73.73045844999993, 40.68458679499984], [-73.73132732799995, 40.68485054399987], [-73.73222005799998, 40.68512109599991], [-73.73308454599989, 40.6853825349999], [-73.73350033600005, 40.685500584999865], [-73.73355835299988, 40.68551705299989], [-73.73361575199982, 40.68553440399995], [-73.73396025399995, 40.68563856299993], [-73.73451246099985, 40.685808342999955], [-73.73483039799987, 40.68590609699992], [-73.73569987899988, 40.68617269699991], [-73.73657845699985, 40.68643801399987], [-73.737321908, 40.686664320999924], [-73.73744163699996, 40.68670076699988], [-73.7375999409999, 40.686362011999904], [-73.74125253099989, 40.68745783899989], [-73.74746788899986, 40.68932218099992], [-73.7475517539999, 40.68934733599984], [-73.74728617699986, 40.689737172999834], [-73.74624345599987, 40.6912794439999], [-73.74510485099985, 40.69278293499986], [-73.74487951500002, 40.69309307799993], [-73.74484610600003, 40.69313905699987], [-73.74479652999989, 40.693220371999864], [-73.74467955599985, 40.693412262999885], [-73.7445271819999, 40.69369059899986], [-73.74438939, 40.69397343399991], [-73.74426648799988, 40.69426010099992], [-73.74415874099992, 40.69454989999984], [-73.74386913499988, 40.695400117999945], [-73.7435928609999, 40.69621532499986], [-73.74365178399992, 40.69622415699989], [-73.74458386999987, 40.69636378199985], [-73.74474545399995, 40.69638546499987], [-73.7449099489999, 40.69639459999991], [-73.74507479999994, 40.69639094899984], [-73.74523747599996, 40.696374658999936], [-73.74612956299988, 40.69613573299988], [-73.74618157999997, 40.696121925999904], [-73.74649367299993, 40.696799873999936], [-73.74681909299984, 40.697525451999844], [-73.74712436899999, 40.698198034999926], [-73.74741867999983, 40.69885902799989], [-73.74773012199991, 40.69955313699991], [-73.74767063100002, 40.699568575999876], [-73.74677542799994, 40.69980088799986], [-73.74588751799996, 40.70003041699988], [-73.74500119100004, 40.70026221299988], [-73.74590871000004, 40.70228727399988], [-73.74502395299994, 40.70251829799986], [-73.7441343549998, 40.7027421119999], [-73.74386175999997, 40.70281109599994], [-73.74330723899996, 40.70295979699989], [-73.74287389299987, 40.703074942999876], [-73.74167563399995, 40.70338409999992], [-73.74148805299996, 40.70343161199993], [-73.74129277999985, 40.70346424899991], [-73.74109293999989, 40.7034810629999], [-73.74089188600004, 40.70348164599992], [-73.74069300199989, 40.70346611399988], [-73.74055102499982, 40.70344338099995], [-73.74050336499984, 40.70343355599992], [-73.74051703299997, 40.70338761599989], [-73.74077675800001, 40.702679837999916], [-73.74072128199992, 40.70267801899989], [-73.73819579999989, 40.70259533599989], [-73.73624941199995, 40.702536977999884]]]}}, {\&quot;id\&quot;: \&quot;38\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 39, \&quot;Shape_Leng\&quot;: 0.132369620757, \&quot;Shape_Area\&quot;: 0.00090028293862, \&quot;zone\&quot;: \&quot;Canarsie\&quot;, \&quot;LocationID\&quot;: 39, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.89121853499988, 40.64998769899987], [-73.89056792961276, 40.64920863296715], [-73.89058122439945, 40.64921017109779], [-73.89058918285595, 40.649211440157856], [-73.89059695454304, 40.64921326406146], [-73.8906044702013, 40.649215626827385], [-73.89060767237343, 40.64921690945508], [-73.89061166783519, 40.64921850963346], [-73.89061848326281, 40.64922188561435], [-73.89063192466081, 40.649226539268916], [-73.89064497244473, 40.64923180302112], [-73.89065757649318, 40.64923765973553], [-73.89069206343918, 40.64925829432288], [-73.8907082114337, 40.649268550512616], [-73.89072347249865, 40.649284766350156], [-73.89073969963145, 40.64930042925473], [-73.89075685659586, 40.649315505182834], [-73.89076294103755, 40.649323105694315], [-73.89076981092721, 40.64933030739637], [-73.89077742674992, 40.64933706351059], [-73.89078573315822, 40.649343324563745], [-73.89079467610247, 40.649349054820526], [-73.89080352489603, 40.64935465816821], [-73.89081292865663, 40.64935970986859], [-73.8908228295893, 40.64936417736595], [-73.89083316373392, 40.64936803262233], [-73.89084386800218, 40.6493712519563], [-73.89085292300992, 40.64937409864865], [-73.89086225721337, 40.64937636210385], [-73.89087180795605, 40.64937802400179], [-73.89088150684604, 40.64937907573349], [-73.89089128812886, 40.64937950986542], [-73.8909010812095, 40.6493793204669], [-73.89091635502108, 40.64937809809264], [-73.8909315102687, 40.649376208170885], [-73.89094649855325, 40.64937365601642], [-73.89096126839027, 40.649370450962365], [-73.89097577159515, 40.64936660167447], [-73.89098074859662, 40.64936383966098], [-73.89098963485273, 40.64935891018467], [-73.89100298051534, 40.64935070556575], [-73.89101577841615, 40.64934200789259], [-73.89102799486605, 40.64933283924741], [-73.89103960167664, 40.64932322104731], [-73.89105056977336, 40.649313177891514], [-73.89105967199393, 40.64930394866298], [-73.89106087184408, 40.649302733208444], [-73.89107048189092, 40.64929191361045], [-73.89107937963642, 40.649280744710374], [-73.89108753996057, 40.649269254629544], [-73.89109494390252, 40.64925747099225], [-73.89110204108817, 40.649246311442404], [-73.89110986320975, 40.64923543804672], [-73.89111839306874, 40.649224876420924], [-73.89112760862514, 40.64921465368332], [-73.89113748520066, 40.649204796615074], [-73.8911479974592, 40.64919533048879], [-73.89115673657176, 40.64918821930543], [-73.89115912248874, 40.64918627773139], [-73.89117082990147, 40.64917765975775], [-73.89118308930125, 40.649169502337934], [-73.89118832602998, 40.649162972512464], [-73.89119290665816, 40.64915616095332], [-73.89119680582479, 40.64914910834607], [-73.89119999971275, 40.649141853032205], [-73.89120247461622, 40.6491344373835], [-73.89120421309674, 40.64912689957999], [-73.89120520716251, 40.64911928484688], [-73.89120545080615, 40.649111635395634], [-73.89120504911666, 40.64910559980511], [-73.89120494088279, 40.649103991765074], [-73.89120368479722, 40.6490963990275], [-73.89120168467845, 40.649088900574554], [-73.89119895343714, 40.64908153763062], [-73.89119550640645, 40.64907434907656], [-73.8911913641941, 40.64906737664634], [-73.89118768684253, 40.64904537266772], [-73.89118321862813, 40.64902345237476], [-73.89117796546067, 40.64900163403383], [-73.89117192863348, 40.64897993423124], [-73.8911651109834, 40.64895836737716], [-73.89115752325999, 40.64893695090433], [-73.89114916653827, 40.64891570056145], [-73.89114005025007, 40.64889463277507], [-73.8911301778888, 40.6488737636309], [-73.8911195591107, 40.64885310687541], [-73.89110820334591, 40.648832679772546], [-73.891096114747, 40.648812499079], [-73.89108330605376, 40.648792575696], [-73.8910405899315, 40.648743675910005], [-73.89100218065924, 40.64869899771737], [-73.89099834122673, 40.64869453229449], [-73.89099527837928, 40.64869091329086], [-73.89095656520465, 40.64864515289616], [-73.89091526317843, 40.64859554123491], [-73.8909130586134, 40.6485928488051], [-73.89087444305495, 40.64854570385239], [-73.89085215944324, 40.64852483882152], [-73.89084612619742, 40.648519190906214], [-73.89081721708632, 40.648493050141354], [-73.89078772428525, 40.64846729027708], [-73.89078630206957, 40.64846609059574], [-73.89075765503694, 40.648441921371536], [-73.89072701791493, 40.648416945945236], [-73.8907149265673, 40.64840742219289], [-73.89069582367858, 40.64839237523247], [-73.89066408045666, 40.64836821510403], [-73.8906317979142, 40.64834447327475], [-73.89059898527796, 40.648321156454294], [-73.89056565441582, 40.648298270517], [-73.89054523278674, 40.64828093534612], [-73.89052543387196, 40.64826318244592], [-73.89050627633812, 40.64824502942478], [-73.89048777028857, 40.648226485004336], [-73.89046993285152, 40.64820756578645], [-73.89045277522081, 40.648188286022055], [-73.89043630991277, 40.648168658287844], [-73.89042055075868, 40.64814869801016], [-73.89040550565592, 40.648128417258675], [-73.89039118974873, 40.64810783581657], [-73.89034023735852, 40.648040539493664], [-73.8903212633527, 40.648016379884695], [-73.8903015330314, 40.64799257588406], [-73.89028105671677, 40.647969137217814], [-73.89025984603798, 40.64794608115222], [-73.89023791549239, 40.64792341959505], [-73.89021527583874, 40.64790116411588], [-73.89019194002863, 40.647879330641544], [-73.89016792256294, 40.64785792856739], [-73.89012821103123, 40.64782523431973], [-73.89012215504692, 40.647820247243764], [-73.89011209963773, 40.647811717810754], [-73.89009165255432, 40.64779437482743], [-73.89007712569526, 40.64778205229508], [-73.89003284746892, 40.647743353451155], [-73.88999979852272, 40.64771359091057], [-73.88999517921636, 40.64770942977685], [-73.88998932760883, 40.6477041607715], [-73.88997515369725, 40.6476937708365], [-73.8899614891695, 40.647682992721336], [-73.88994835071871, 40.647671840681795], [-73.88993575921668, 40.64766032864306], [-73.88992372739101, 40.64764847437541], [-73.88991227369016, 40.64763629414708], [-73.88990141283169, 40.64762379936412], [-73.88989115995334, 40.647611013662654], [-73.88988152889169, 40.64759794861563], [-73.88987253171003, 40.647584625008356], [-73.88986418069726, 40.64757105943797], [-73.88985648814152, 40.64755726933937], [-73.88983615944981, 40.64753358329439], [-73.88981510829579, 40.64751026645636], [-73.8897933478588, 40.6474873293918], [-73.8897708897705, 40.647464788026625], [-73.88975468482053, 40.64744928583018], [-73.889747746555, 40.64744265007878], [-73.88972392940431, 40.64742093130631], [-73.88969945435694, 40.647399642278245], [-73.88967433195238, 40.64737879406147], [-73.88964452230006, 40.647348223687004], [-73.88961398550197, 40.64731806975257], [-73.88958273010996, 40.64728834834853], [-73.88955076776878, 40.647259067024244], [-73.88951810770412, 40.647230233494334], [-73.88948476309218, 40.647201860000415], [-73.88945074227674, 40.647173955596465], [-73.88943238166773, 40.64715148611932], [-73.88941469484384, 40.64712870434404], [-73.88939768948204, 40.6471056225077], [-73.88938137787974, 40.64708225251715], [-73.88936576749315, 40.64705860711186], [-73.88935086599885, 40.64703469886416], [-73.88947349934483, 40.646956672140014], [-73.88948944517219, 40.64693396725611], [-73.88948152576064, 40.64691275506822], [-73.88941012796785, 40.646797572277706], [-73.88919383109035, 40.64652321265187], [-73.88908093175131, 40.64638868736344], [-73.88879690848673, 40.64605025805637], [-73.88877900211294, 40.64605604593656], [-73.8887610824867, 40.64606991286121], [-73.88899920564424, 40.64637155947531], [-73.8893087980161, 40.64674597772105], [-73.88941394816807, 40.646893000153845], [-73.88942186350398, 40.64691572797252], [-73.88941387285446, 40.64693843999413], [-73.8893760297505, 40.646974754423105], [-73.88931122378477, 40.647014584778205], [-73.88918799274475, 40.64707951539002], [-73.8891871147141, 40.64707965174989], [-73.88913234608853, 40.64708818630504], [-73.88909473960057, 40.64707132449388], [-73.88906042485348, 40.64704387318984], [-73.8890448745862, 40.64704697354717], [-73.88904239022582, 40.6470656653142], [-73.88904890280085, 40.647084989972164], [-73.88898577577875, 40.64716344527782], [-73.88889569015308, 40.64721881890855], [-73.88886541778209, 40.647220035735565], [-73.88884580264049, 40.64720755383576], [-73.88880164237945, 40.64719691731742], [-73.88878146049778, 40.64719443798171], [-73.88878119331632, 40.64719440589297], [-73.88876076273776, 40.64718067644327], [-73.8887338175948, 40.64714886905943], [-73.88872914685678, 40.647138426680804], [-73.88872322160665, 40.64712517949972], [-73.88871260669775, 40.64711270628508], [-73.88869054474083, 40.64709585938264], [-73.88866601496176, 40.6470877358058], [-73.88864137670687, 40.647079553157944], [-73.88853549296564, 40.646968149350386], [-73.8885490830469, 40.64696755239828], [-73.88855801324306, 40.646965860973445], [-73.88856693949997, 40.64696586962281], [-73.88857944085456, 40.64696384123874], [-73.88859507057262, 40.646958077486524], [-73.88861562143931, 40.64694619935449], [-73.88864048640656, 40.64691067406533], [-73.88865398562774, 40.64688506181712], [-73.88865453631006, 40.64685992504181], [-73.88865520043964, 40.64682954255804], [-73.88864625621946, 40.6467998495324], [-73.88864181592984, 40.646785113451344], [-73.88861498719626, 40.64673469206464], [-73.88859943567105, 40.646712625399175], [-73.88859932552029, 40.646712468820894], [-73.88856459699522, 40.64669108132899], [-73.88849960118229, 40.64666368405489], [-73.88843010109082, 40.646647388505315], [-73.88835945887128, 40.646643048980756], [-73.8883550364737, 40.646643953194506], [-73.88828878739722, 40.6466575013859], [-73.88822784503809, 40.64665321797129], [-73.88818911398977, 40.64664978240827], [-73.88816089191931, 40.6466466088439], [-73.88813886515429, 40.64664448906955], [-73.88810266265712, 40.64664023644676], [-73.88808138892033, 40.646620569814324], [-73.88806574107578, 40.64658895091362], [-73.88806004381225, 40.64655386984077], [-73.88806001214776, 40.646553665216935], [-73.88805686200648, 40.6465342762387], [-73.88805695783927, 40.64653402012595], [-73.88806361998368, 40.6465163451405], [-73.88806627051336, 40.64648805482483], [-73.88806734519848, 40.6463003913232], [-73.88807349504613, 40.646282684692224], [-73.88809065494014, 40.646267785662786], [-73.8880882339975, 40.646251934947095], [-73.88809441935717, 40.6462127865493], [-73.88813708213601, 40.646176461311576], [-73.88814269992719, 40.646169634462595], [-73.88816403043424, 40.64615598790062], [-73.88821007899956, 40.646113324808276], [-73.88821447213182, 40.64611135827374], [-73.88827292415569, 40.646085198546324], [-73.88828977845561, 40.6460655693589], [-73.88828978925125, 40.646059121366456], [-73.8882898142075, 40.64604421554559], [-73.8882894131325, 40.64604441836802], [-73.88827491322176, 40.646051761294835], [-73.88826961075077, 40.64605444547779], [-73.88826877077499, 40.64605511108998], [-73.88826293740479, 40.646059739762364], [-73.88823030919363, 40.646031085985754], [-73.88822400304596, 40.646025545888975], [-73.88822322295583, 40.646024862117216], [-73.88825311510513, 40.64601528273937], [-73.88825622169888, 40.646014287790784], [-73.88825611006853, 40.646014227874694], [-73.8882483105607, 40.646009971439106], [-73.88824053610163, 40.646005730272364], [-73.88822564997575, 40.64600440757536], [-73.88821138355613, 40.6460031399256], [-73.88819178134528, 40.646006853236365], [-73.88817997592882, 40.64600908865002], [-73.88812836780345, 40.64602270476086], [-73.88810538611928, 40.646028151034415], [-73.88807452031926, 40.646035464441496], [-73.88803619812846, 40.64603969911446], [-73.88802853501163, 40.64604054470852], [-73.8880055972574, 40.64603003123822], [-73.88800052027007, 40.646027705354655], [-73.8879817286607, 40.64600448368981], [-73.8879624724094, 40.64598068862193], [-73.88792888504189, 40.64594819926588], [-73.88792863149855, 40.64594803869414], [-73.88787175450808, 40.64591226869686], [-73.88783954471293, 40.645873239341114], [-73.88783930019137, 40.64587294542517], [-73.88783648597834, 40.645868922667376], [-73.88780461952585, 40.645823369910225], [-73.88777108781663, 40.64578495072397], [-73.88776432752009, 40.64577720598652], [-73.88774083832425, 40.64574130817862], [-73.88774534679695, 40.645727646276875], [-73.88774684228964, 40.64572339720428], [-73.88774985339084, 40.64571483860078], [-73.88773925530427, 40.645714047070626], [-73.88771509535594, 40.64571224098125], [-73.88767480358253, 40.64566693024832], [-73.88762889453581, 40.64562503343595], [-73.88760719154664, 40.64559243598081], [-73.88759645566897, 40.645576315279996], [-73.88758479056699, 40.64556083480118], [-73.8875847646705, 40.64556080127017], [-73.88757519707431, 40.64554810716395], [-73.88755462162912, 40.64551611691883], [-73.88754276182515, 40.64549767953528], [-73.88751249922825, 40.64546745510859], [-73.88749910233261, 40.64545407373407], [-73.88749551943745, 40.64545006730356], [-73.88746776206911, 40.64541902291841], [-73.88746169123525, 40.64541317659998], [-73.88744201213828, 40.64539422712546], [-73.88742568126139, 40.645375243566384], [-73.88741627153311, 40.645364306807366], [-73.88741147970725, 40.6453391428567], [-73.88740960156503, 40.64532928012421], [-73.88743649431201, 40.64531702460201], [-73.8874544917705, 40.645308823771735], [-73.88748017095864, 40.64530629844598], [-73.88748028754614, 40.64530628700059], [-73.88748504890106, 40.64530871093783], [-73.8874937323772, 40.64531313364104], [-73.88749425824821, 40.64531326750825], [-73.88750718407012, 40.645316564045956], [-73.88750167617394, 40.64527921806782], [-73.88750164051392, 40.64527897478158], [-73.88751736108665, 40.64526532335296], [-73.88751760842835, 40.64526524669931], [-73.88754765490864, 40.645255956976804], [-73.88760152266909, 40.64523123904407], [-73.88764385071785, 40.64521114683328], [-73.88766437100682, 40.64520140482757], [-73.8876713055163, 40.64519799100466], [-73.88772497502667, 40.64517156888821], [-73.88775225382686, 40.64516012115623], [-73.88776761931854, 40.64515367273634], [-73.88780902508144, 40.64513553060128], [-73.88782597401105, 40.64512810434692], [-73.88784752127042, 40.64511658683801], [-73.88788658219785, 40.645095705810505], [-73.88790367351744, 40.645079836750575], [-73.88791690723532, 40.645067549205415], [-73.88792588075614, 40.64506584899275], [-73.88793370047152, 40.645083793217644], [-73.88795587366926, 40.645114042656836], [-73.88796502879283, 40.645126532113], [-73.88796518926894, 40.645126579512315], [-73.88798856532566, 40.64513338902931], [-73.88800647124246, 40.64515475981581], [-73.88802537505066, 40.64515816799487], [-73.88802553006325, 40.64515819461526], [-73.88802684907814, 40.64515856580252], [-73.88806812125227, 40.645170195600556], [-73.88807196882098, 40.645168524395565], [-73.88807596671336, 40.645166790346074], [-73.88807830661167, 40.64516602735333], [-73.88808383164817, 40.64516423163145], [-73.88808383875663, 40.64515999367044], [-73.88808385457098, 40.64515056535043], [-73.88805587182881, 40.64511978725729], [-73.88804571571661, 40.645110329266984], [-73.88800996589524, 40.645077034694374], [-73.88796406442864, 40.64503257382938], [-73.88794876930156, 40.645021248242095], [-73.88792710474918, 40.645005204707154], [-73.88791252941961, 40.64500348154403], [-73.88788110148197, 40.6450213886855], [-73.88788096371262, 40.64502144065254], [-73.88786807651202, 40.64502633365665], [-73.88784519285471, 40.64503501997499], [-73.88778239005063, 40.64503922968088], [-73.88773528615363, 40.645042600283524], [-73.88767244806121, 40.64506645646278], [-73.88761184035705, 40.64509800015654], [-73.88754899585209, 40.64512612606049], [-73.88749665617937, 40.645152870548], [-73.88748726875768, 40.64515767244712], [-73.88742554053763, 40.64518750498301], [-73.88742502464652, 40.645187844225774], [-73.88736940895883, 40.645224179134345], [-73.88734361665684, 40.645224153871006], [-73.88731487147737, 40.64520457345941], [-73.88730217444433, 40.645195925929514], [-73.88729121814026, 40.64518616402934], [-73.88726858280884, 40.645165996208135], [-73.8872529307313, 40.64513779469932], [-73.88724513428929, 40.64510618297466], [-73.88720940903949, 40.645084221478875], [-73.88719920587415, 40.64507795176963], [-73.88719205915753, 40.64506663842955], [-73.88718354961118, 40.645053165817714], [-73.88718697934982, 40.64501387755388], [-73.88718097101543, 40.64499855034211], [-73.88717357973094, 40.644979697308905], [-73.88716449216427, 40.64497639025955], [-73.88715004600363, 40.64497113294555], [-73.88711196189598, 40.64494547024285], [-73.88709182294312, 40.644918971087044], [-73.8870911770819, 40.6448870693432], [-73.88709078754081, 40.64486772092812], [-73.88707517897967, 40.644813892939005], [-73.88706756030193, 40.644787129314935], [-73.88706180246118, 40.64476690230169], [-73.8870344533698, 40.64474402673167], [-73.88701477169916, 40.64472756447533], [-73.88698457931622, 40.64467713938985], [-73.88695887549864, 40.644625010420356], [-73.88694102650793, 40.64457032547864], [-73.8869365699227, 40.64455409395216], [-73.88692500573482, 40.6445374036129], [-73.88691643330115, 40.644525032083266], [-73.88691203454515, 40.644473777607885], [-73.88688964143898, 40.64445325696575], [-73.88687171566681, 40.64444469705514], [-73.88680331813799, 40.644440358276775], [-73.88678424430306, 40.64444631876019], [-73.88678415535188, 40.64444650529931], [-73.88677895080598, 40.644457363560946], [-73.8867752427269, 40.644465102407096], [-73.88678391809634, 40.644474210426], [-73.88678419647526, 40.644474506052795], [-73.88679424990453, 40.64449843349059], [-73.88679645571422, 40.64451978951413], [-73.88678605503482, 40.64452215466205], [-73.88678523743152, 40.644522340483874], [-73.8867482931071, 40.644487282777895], [-73.88671024836563, 40.644438558843824], [-73.88668366556917, 40.644421641257594], [-73.88668336392223, 40.64442144880515], [-73.88667745680381, 40.64441564817367], [-73.88665201863772, 40.64439066805883], [-73.88663887364095, 40.64438239276388], [-73.88663077735512, 40.644352210219644], [-73.8866304837735, 40.64435206066235], [-73.8866173330251, 40.64434536414791], [-73.88658356007102, 40.64433144708819], [-73.88658091508064, 40.64432978226192], [-73.88657950376457, 40.64433067681233], [-73.88654888955993, 40.6443124903785], [-73.88655111189425, 40.644311013126675], [-73.88657616109464, 40.64429436104308], [-73.88654221594709, 40.64423207966326], [-73.88643332005316, 40.64419306703229], [-73.8864325000971, 40.64419244033611], [-73.88642580656825, 40.64418687445985], [-73.88641689065331, 40.644179458548955], [-73.88640742962818, 40.644170427626754], [-73.8863721085287, 40.64413670710629], [-73.88636185865222, 40.64411318468771], [-73.88635758725518, 40.6441033803843], [-73.88634638759265, 40.64407385514963], [-73.88633749308138, 40.64405040258741], [-73.88630504007673, 40.644005949988816], [-73.88628516767372, 40.64399336251911], [-73.88622602727345, 40.64394905538979], [-73.88623633525125, 40.643894599053915], [-73.88624664233414, 40.643840141710726], [-73.88623646791807, 40.64381678772094], [-73.88616522744307, 40.64380167199119], [-73.88613720679389, 40.64379395720526], [-73.88612910452176, 40.643786530517694], [-73.8861204115461, 40.643778564808024], [-73.88609803773574, 40.64374779279166], [-73.88607233562739, 40.64369566412182], [-73.8860721076197, 40.64369549754005], [-73.88602529679075, 40.6436614504065], [-73.8859908619233, 40.64366101336716], [-73.88595241003655, 40.6436605250908], [-73.88591017758976, 40.6436604832001], [-73.88587952270532, 40.64366045278355], [-73.88587918263688, 40.64366035310168], [-73.88586685006611, 40.64365672542978], [-73.88585038128603, 40.6436518820848], [-73.8858279911263, 40.64363050550078], [-73.88580110949894, 40.64361168680073], [-73.8857885828904, 40.643604758616], [-73.885768621624, 40.64359371675363], [-73.8857275231896, 40.64358289445717], [-73.8857002497673, 40.64357571220986], [-73.8856886383046, 40.64356969343094], [-73.88566888045216, 40.64355945220465], [-73.88564648781826, 40.6435389296429], [-73.88562236163982, 40.64352766632895], [-73.88560615138455, 40.64352009818708], [-73.88558493934023, 40.64351307187971], [-73.88553890885684, 40.64349782319592], [-73.88551316184969, 40.64347217290688], [-73.8854849551704, 40.64346302490487], [-73.88547617787049, 40.64346017806352], [-73.88543581637987, 40.64345586806235], [-73.88537977613835, 40.643439581722255], [-73.8853521641245, 40.64341933719122], [-73.88535177774826, 40.64341905351529], [-73.88532376006884, 40.64340963074776], [-73.88525314667166, 40.64339076796654], [-73.88519039515114, 40.64336508101046], [-73.88512764875115, 40.64333683100629], [-73.88509819735403, 40.64332027740767], [-73.88506827422987, 40.64330345930517], [-73.88502120740556, 40.64328632920507], [-73.8849550854284, 40.643264054489244], [-73.88493829484842, 40.643246955812266], [-73.88492244965363, 40.64322597141716], [-73.88492151268089, 40.64322472926059], [-73.88491396903088, 40.643220741233776], [-73.88491387257027, 40.643220689035786], [-73.88486325515501, 40.64319392276234], [-73.88483222472678, 40.64318019573087], [-73.88479938783794, 40.643165671455975], [-73.88475150350376, 40.643149539566245], [-73.884733266714, 40.64314339661295], [-73.88469181436612, 40.64312114697229], [-73.88468354514835, 40.64311628805958], [-73.88463356426678, 40.64308692194502], [-73.88461734294579, 40.64307417869585], [-73.88438270996289, 40.6429106699506], [-73.88373578781892, 40.642450349094226], [-73.88311261912273, 40.64187446548803], [-73.88251634823919, 40.641350710775676], [-73.8819016777496, 40.640834939061385], [-73.88126533390094, 40.64021877263545], [-73.88078889712776, 40.639757433320376], [-73.88076685499172, 40.63958164757543], [-73.88055123891112, 40.63915881986856], [-73.8797498301519, 40.638422235815135], [-73.8795388800853, 40.63821783916026], [-73.87945522184175, 40.63819224570853], [-73.87935480009125, 40.638179387910526], [-73.87911787849026, 40.638266587220265], [-73.87907715621357, 40.63830298104855], [-73.87905060875187, 40.638435948562076], [-73.87896686085557, 40.63845954384779], [-73.87887362624322, 40.6384394051234], [-73.87876518091636, 40.63836855709631], [-73.87870039087672, 40.63833772487285], [-73.87863863904012, 40.63829360613005], [-73.87859391192085, 40.638217012182864], [-73.87843722479572, 40.637948690637224], [-73.8786115360817, 40.63764882997628], [-73.87863488118161, 40.63755178164712], [-73.87846702122842, 40.637489830663995], [-73.87783675028, 40.63690231029442], [-73.87714434884276, 40.63597649800373], [-73.877493816927, 40.63539042397704], [-73.87793889634258, 40.63501957113924], [-73.8781371779872, 40.63469473189087], [-73.87820590489773, 40.63457294366254], [-73.87833349586315, 40.63448041794522], [-73.87856542917646, 40.63433946507626], [-73.8787277618307, 40.63425138864696], [-73.87890455278942, 40.63411588241607], [-73.87918335624656, 40.63401482552619], [-73.87936895387004, 40.633908015784016], [-73.87971206395956, 40.63369008532766], [-73.87998767503844, 40.63351488348096], [-73.88018468342864, 40.63330963859056], [-73.8802328219404, 40.63322689052148], [-73.88037629489094, 40.63298026236323], [-73.88093320122287, 40.63258706179293], [-73.88127068104548, 40.63236911916103], [-73.88144495909098, 40.63230509611649], [-73.88162197738069, 40.63229710561399], [-73.88163037328907, 40.63229672726628], [-73.88178214769638, 40.63224980097282], [-73.88197891997052, 40.63217295899949], [-73.88208583089636, 40.63207890480774], [-73.88215899502384, 40.63200621538491], [-73.88256945182803, 40.63181830588501], [-73.88272684944738, 40.631767104900234], [-73.88301362103512, 40.6316261495354], [-73.88322181279625, 40.63144231258993], [-73.88345265635674, 40.63115577211293], [-73.88364451728226, 40.630943312138584], [-73.88375501660256, 40.63055643801253], [-73.88376932796366, 40.63022176134234], [-73.88345412923461, 40.62990766993492], [-73.88404726149369, 40.6295601185465], [-73.88263248433404, 40.62827427312689], [-73.88300026358979, 40.62802619438618], [-73.88369231571497, 40.62755937391403], [-73.88512954023768, 40.62882725867137], [-73.88572166971262, 40.62844671572562], [-73.88604117197292, 40.628697246481536], [-73.88621452593078, 40.62868061400437], [-73.88638667007316, 40.62865782666461], [-73.8865572281382, 40.628628934269535], [-73.88672582733146, 40.62859399997052], [-73.8868920991431, 40.62855310012493], [-73.88705568015072, 40.628506324128594], [-73.88721621281638, 40.62845377422153], [-73.887373346267, 40.62839556526336], [-73.88752673706196, 40.628331824482444], [-73.88766290771191, 40.62826907222885], [-73.88779544838252, 40.62820196007808], [-73.88792411875025, 40.628130609723776], [-73.8880486855124, 40.6280551505441], [-73.88816892280943, 40.62797571936736], [-73.8882846126343, 40.62789246022348], [-73.89042299743556, 40.62627859879778], [-73.89048710394742, 40.62622477905808], [-73.89054423031342, 40.626166574144925], [-73.89059386270354, 40.62610450760886], [-73.89063555469917, 40.62603913773376], [-73.89066893130891, 40.62597105251558], [-73.89069369233994, 40.62590086437204], [-73.8907096150978, 40.62582920463516], [-73.89071655638924, 40.62575671787127], [-73.89071445380763, 40.62568405608367], [-73.89070332629487, 40.62561187284788], [-73.8906832739687, 40.62554081743287], [-73.89069934320733, 40.6254490977382], [-73.89072395717571, 40.62535848486902], [-73.89075699047119, 40.62526944034894], [-73.89079827481083, 40.625182417711706], [-73.89084759988879, 40.62509786019118], [-73.89090471444746, 40.62501619846384], [-73.89096932755896, 40.624937848455794], [-73.89104111010586, 40.6248632092237], [-73.89111969645955, 40.62479266092348], [-73.89120468634033, 40.62472656287357], [-73.89129564685899, 40.62466525172516], [-73.89139211472015, 40.62460903974802], [-73.89149359858217, 40.6245582132401], [-73.89160061453713, 40.624429266771706], [-73.89171432619564, 40.62430369149586], [-73.89183455084178, 40.624181689150284], [-73.89196109529959, 40.62406345573154], [-73.8920937562442, 40.62394918118082], [-73.89223232052697, 40.62383904907804], [-73.89237656551936, 40.62373323634773], [-73.8925262594703, 40.623631912974545], [-73.89268116187884, 40.62353524173015], [-73.89284102387963, 40.623443377912686], [-73.8930055886431, 40.623356469095974], [-73.89308340975172, 40.62336167592056], [-73.89313041733622, 40.623409553641906], [-73.89320886543258, 40.62342557109937], [-73.89329777596994, 40.62344159921929], [-73.89351237165282, 40.623378019117084], [-73.89359082527815, 40.62339005080736], [-73.89456448045492, 40.62302023013246], [-73.89480003637225, 40.622932749253586], [-73.89492365447543, 40.62288643173478], [-73.89504313667864, 40.62283419154178], [-73.89515799486826, 40.62277624209296], [-73.89526775982362, 40.62271282013041], [-73.89537198313622, 40.62264418475256], [-73.89547023904039, 40.62257061635524], [-73.8956010701693, 40.62254283280268], [-73.89577374598754, 40.62251907138477], [-73.89594111031164, 40.62254712710863], [-73.89599336881395, 40.62258304936637], [-73.8960194773396, 40.622614963109555], [-73.89597194082525, 40.62265438253494], [-73.89596185641412, 40.62266274499435], [-73.89596702487455, 40.622702612328396], [-73.89602450367005, 40.6227465118264], [-73.89607154396428, 40.622774457969435], [-73.89612385854737, 40.62277450525077], [-73.89619315402952, 40.62277172420758], [-73.89626176678121, 40.62276896998145], [-73.89632454431379, 40.62279224427039], [-73.8963900618076, 40.6228173934646], [-73.89826103011846, 40.622989159921765], [-73.90114685492415, 40.625685387598025], [-73.90192494672036, 40.62584743465486], [-73.90279518238806, 40.62602866456063], [-73.90370369782693, 40.62621785795743], [-73.90412793207628, 40.626306200134245], [-73.9044869797309, 40.626475292106406], [-73.90454477156379, 40.62650251846565], [-73.90460520923169, 40.62653098000287], [-73.90483487851195, 40.62663913392717], [-73.90489270645807, 40.62666636784695], [-73.9049063484711, 40.626672790960335], [-73.9049352622391, 40.62668641368551], [-73.90501149169361, 40.62672230556913], [-73.90504862589897, 40.62673978989416], [-73.90505511040648, 40.62674283907976], [-73.90506354457798, 40.626746817816894], [-73.90529160821045, 40.62685422131578], [-73.90579604091182, 40.62709176652205], [-73.90594908886753, 40.62716383772389], [-73.90663673204166, 40.627487654991654], [-73.90746333160071, 40.62787689951586], [-73.90825201141737, 40.628248276562815], [-73.90826288994353, 40.628253400398386], [-73.9082831586814, 40.62826295364552], [-73.90908063035498, 40.628638461247135], [-73.9099107442635, 40.62902932898019], [-73.91071335177085, 40.629407235283516], [-73.91122829462807, 40.62964968889373], [-73.9115321792163, 40.62979195228684], [-73.91236461548841, 40.63018164237542], [-73.91316650880005, 40.630557023372226], [-73.9139951001166, 40.6309448920763], [-73.91633195427576, 40.63203873255834], [-73.91642761952173, 40.63203648851158], [-73.91652258371712, 40.63202739990856], [-73.9166160050226, 40.63201154731792], [-73.91670705527757, 40.63198907126988], [-73.91679492734241, 40.63196017101], [-73.91687884225443, 40.6319251027331], [-73.91695805613352, 40.63188417731136], [-73.91703186677645, 40.63183775753898], [-73.91709961988298, 40.63178625491546], [-73.91716071492723, 40.63173012599842], [-73.91860649599992, 40.632090414999894], [-73.9186298239999, 40.63234687299989], [-73.91876282599999, 40.6336375289999], [-73.91885164499996, 40.634482718999955], [-73.91886199299982, 40.634577127999876], [-73.91886934499978, 40.63464421599988], [-73.91888284299993, 40.634767351999905], [-73.91889071099986, 40.6348391329999], [-73.91891212099982, 40.63503445999987], [-73.91892161299991, 40.635121060999914], [-73.91893983700002, 40.63528732099991], [-73.91895156599989, 40.63539431799991], [-73.91899154599992, 40.63575906299996], [-73.919006295, 40.63589361799995], [-73.9190277079998, 40.63609754399988], [-73.91905790399989, 40.63638510999988], [-73.91916482699992, 40.63740334199989], [-73.91917180399989, 40.63746984099993], [-73.91928984599986, 40.638596032999914], [-73.91941447399985, 40.63977466499991], [-73.91945472999996, 40.6401731369999], [-73.91946141199999, 40.64023929299983], [-73.91946588499995, 40.64028418699997], [-73.91953493999996, 40.640857740999884], [-73.919555766, 40.641184957999876], [-73.91958298599987, 40.64139576199993], [-73.91965951399997, 40.642078236999915], [-73.91973736999988, 40.64277814799987], [-73.91990782599999, 40.64432958099992], [-73.91995062999999, 40.64470762999989], [-73.91982077699998, 40.644783831999874], [-73.91943014999988, 40.64506079199986], [-73.91925419699997, 40.64517776399986], [-73.91892329099996, 40.64539775299986], [-73.91861676799982, 40.64560209799988], [-73.91830152299998, 40.645812262999925], [-73.91798513199991, 40.646010879999906], [-73.91764732399982, 40.646222935999916], [-73.91730801300002, 40.64644290499994], [-73.91693683599993, 40.64668353499992], [-73.91620934099993, 40.64715114199988], [-73.91550029699984, 40.647604853999916], [-73.91473216799982, 40.64810117499995], [-73.91396129299983, 40.64860065799996], [-73.91325294199991, 40.649061424999935], [-73.91253589199988, 40.64952147899985], [-73.91182280200003, 40.64998342299986], [-73.91110070199989, 40.65044791299992], [-73.91022992899991, 40.65101403099988], [-73.90944846399994, 40.65152159899992], [-73.90868769500001, 40.65072148099995], [-73.90849084299998, 40.650586417999875], [-73.90827570700003, 40.65049857299989], [-73.90761503399983, 40.649895893999876], [-73.907546414, 40.64983425299993], [-73.90637218799996, 40.6487793819999], [-73.90588893999983, 40.64834514399994], [-73.90579983699993, 40.64826507899992], [-73.90509580299975, 40.64760685099991], [-73.90398200599991, 40.64662856799988], [-73.903099438, 40.64719961099992], [-73.90235538599994, 40.64768960199993], [-73.90165833699982, 40.64814221199989], [-73.90089120800002, 40.648641709999886], [-73.90074707899997, 40.6487354449999], [-73.90056999899996, 40.64884760699989], [-73.90027087999994, 40.649037770999946], [-73.90019369799995, 40.64908881799994], [-73.89946894299986, 40.649541768999924], [-73.89872808799994, 40.650024606999885], [-73.89797649399998, 40.65049403099989], [-73.89779457099989, 40.65061310899988], [-73.89771516099994, 40.65066508899988], [-73.89757174800003, 40.65075888699994], [-73.89742477799994, 40.650855011999944], [-73.89736587999998, 40.65089370699995], [-73.89727504499993, 40.650953162999876], [-73.89721054799986, 40.65099537899994], [-73.89680700299976, 40.65126016999992], [-73.89675272299999, 40.6512957869999], [-73.89661390699996, 40.65138687099991], [-73.89655685900003, 40.65142430299988], [-73.89627957599997, 40.65160624199991], [-73.89621590699987, 40.65164801899989], [-73.89586154900002, 40.65188052699987], [-73.89610981499999, 40.65210391199988], [-73.89619634399993, 40.652181767999906], [-73.89654981299998, 40.652499805999916], [-73.896634179, 40.65257571499996], [-73.89676845099996, 40.65269652599995], [-73.89684143499989, 40.65276219199989], [-73.89746257699998, 40.65332105699985], [-73.89761013299987, 40.65345381599992], [-73.89741344699993, 40.653538320999914], [-73.89678213299993, 40.65380955599988], [-73.89667745499989, 40.65385495699997], [-73.8959444279999, 40.654172887999934], [-73.89558884499993, 40.65432447199986], [-73.89546427299999, 40.65437757699991], [-73.89520540399988, 40.654487929999895], [-73.89441113999996, 40.6548329489999], [-73.89354677099988, 40.65520271399988], [-73.89245737399976, 40.653710938999886], [-73.89136543599977, 40.65236471899988], [-73.8900378249999, 40.6511781769999], [-73.89000589199988, 40.651148696999925], [-73.89004263999982, 40.65111858599992], [-73.89125147199995, 40.65002559699993], [-73.89121853499988, 40.64998769899987]]], [[[-73.88833929256269, 40.64671022891759], [-73.88835262237468, 40.64670795760858], [-73.88837395798683, 40.64671039927301], [-73.88840531896192, 40.6467139885153], [-73.88845015102363, 40.646728552537816], [-73.88849720193863, 40.64675678600008], [-73.888536179038, 40.64678824826763], [-73.88853640000424, 40.64678842689961], [-73.88853772941454, 40.646802871820846], [-73.88853970368733, 40.646824304978544], [-73.88853297695874, 40.646861519426885], [-73.88853291212868, 40.646861882230674], [-73.88850950500931, 40.64688116417922], [-73.88846787961647, 40.646899734025276], [-73.88829183121516, 40.64671871903564], [-73.88830775448939, 40.646715602760004], [-73.88833929256269, 40.64671022891759]]]]}}, {\&quot;id\&quot;: \&quot;39\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 40, \&quot;Shape_Leng\&quot;: 0.0518506648762, \&quot;Shape_Area\&quot;: 0.000108949211644, \&quot;zone\&quot;: \&quot;Carroll Gardens\&quot;, \&quot;LocationID\&quot;: 40, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.998192111, 40.68228732999989], [-73.99620846299992, 40.681723424999916], [-73.99588110299992, 40.68239495399995], [-73.99555742799987, 40.683068534999954], [-73.99523240699986, 40.68374079099993], [-73.99490113599977, 40.6844302379999], [-73.99262292599985, 40.68354371199993], [-73.99042374299992, 40.68269393299993], [-73.98827189199999, 40.68186309999987], [-73.98722413899985, 40.68144730199988], [-73.9876680399999, 40.68081780999993], [-73.98808029299991, 40.68017216599984], [-73.98850509899982, 40.6795371569999], [-73.98897369299988, 40.67884987699992], [-73.98931813699981, 40.67834938899991], [-73.98931805499996, 40.67825393999993], [-73.98940896399986, 40.67745451699993], [-73.98986566199996, 40.676826601999934], [-73.99036651399997, 40.67621832099995], [-73.99069861899994, 40.67580741899994], [-73.99256575599999, 40.6761058199999], [-73.99279927099997, 40.67613190599994], [-73.99280910199987, 40.67614874999984], [-73.9931237449998, 40.67617871399997], [-73.99317836299984, 40.676161657999906], [-73.9933342719999, 40.676176012999846], [-73.993491024, 40.67618330199986], [-73.99364806799993, 40.67618349899993], [-73.99380485099994, 40.67617660299988], [-73.99396082100002, 40.67616263899984], [-73.9940579759999, 40.676182783999884], [-73.99420802699994, 40.67615242699986], [-73.99435579199994, 40.67611614799993], [-73.99450491199987, 40.67607277499994], [-73.99465075899997, 40.67602336999993], [-73.99479291199987, 40.67596807599986], [-73.99493096199983, 40.67590705299988], [-73.99506451099984, 40.67584047499984], [-73.99520266299999, 40.67572952499992], [-73.99540989400003, 40.67556309699996], [-73.99572187999998, 40.675222292999905], [-73.9959621319999, 40.67496822399994], [-73.99666043499988, 40.67414278099988], [-73.99696673299994, 40.673784159999876], [-73.99717696100001, 40.67352829399992], [-73.99745115699996, 40.67319456799988], [-73.99805741699998, 40.67246954499988], [-73.99812844699997, 40.672440749999964], [-73.99847134099994, 40.67205910099987], [-73.99855090599986, 40.67192594199986], [-73.9986188799999, 40.67183017199989], [-73.99898242799983, 40.67241358399986], [-73.99903998999996, 40.67250767899989], [-73.99934534299987, 40.67300654899992], [-73.99983349199978, 40.673756049999945], [-73.99991051299993, 40.673872729999836], [-73.99994578200001, 40.67392615699986], [-74.00045011499991, 40.674769424999916], [-74.00077979399994, 40.67529390099993], [-74.00105973699986, 40.675555677999945], [-74.00112481699996, 40.67569755399992], [-74.00090355299992, 40.67563696899988], [-74.00083254999997, 40.67561225999985], [-74.0006740919999, 40.67555578899988], [-74.00102822999993, 40.67641403999991], [-74.00153194399996, 40.67727039699989], [-74.00215698499991, 40.67818268099997], [-74.00221991299993, 40.678260321999836], [-74.00255365299991, 40.678658684999945], [-74.00310560799991, 40.67933188599993], [-74.00329231299999, 40.67964328799992], [-74.00289363599995, 40.680559409999894], [-74.00256464499995, 40.681228463999936], [-74.00225221999996, 40.68189321199991], [-74.002204589, 40.68199132399995], [-74.00193169899997, 40.68256321799992], [-74.00160876999993, 40.683235204999924], [-74.00128182399995, 40.6839096399999], [-74.00095809999992, 40.684579318999916], [-74.00064737999996, 40.685253946999914], [-73.99986579399993, 40.685036468999954], [-73.99908066099994, 40.68481599199985], [-73.99940054699985, 40.684144561999844], [-73.9997255609999, 40.68347314899994], [-74.00004865199998, 40.682803355999965], [-73.998192111, 40.68228732999989]]]}}, {\&quot;id\&quot;: \&quot;40\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 41, \&quot;Shape_Leng\&quot;: 0.052793109453, \&quot;Shape_Area\&quot;: 0.000143093037737, \&quot;zone\&quot;: \&quot;Central Harlem\&quot;, \&quot;LocationID\&quot;: 41, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94773985499985, 40.809599720999884], [-73.94506102999992, 40.80847449999987], [-73.94499360699993, 40.80844618399995], [-73.94491601899982, 40.80841350399989], [-73.94177140199992, 40.807088999999955], [-73.9422631119999, 40.80641573799991], [-73.94275367199994, 40.80574401299988], [-73.94430194599991, 40.806390824999916], [-73.94478208199993, 40.805761255999904], [-73.94523965199991, 40.80513601399989], [-73.9456926129999, 40.804514948999895], [-73.94613131, 40.80387735799992], [-73.94459751299998, 40.803228144999906], [-73.94475976499989, 40.803003040999975], [-73.94505128000004, 40.80259859899995], [-73.94550863900001, 40.8019702309999], [-73.9459678969998, 40.801342394999935], [-73.94646133899998, 40.800665304999875], [-73.94697366799987, 40.79996170299987], [-73.94728018299999, 40.79954178899988], [-73.94732771499984, 40.79947667099991], [-73.94737599799991, 40.799410523999896], [-73.94741996199991, 40.79935029499992], [-73.94771056, 40.79895218099991], [-73.94775716499986, 40.798888331999855], [-73.94781663099997, 40.79880686299992], [-73.94784679099992, 40.798765542999945], [-73.94805130199998, 40.79848535999987], [-73.94810108999994, 40.798417147999885], [-73.94815384299984, 40.79834487599987], [-73.9482064149998, 40.79827285099987], [-73.94831125500004, 40.79812921799992], [-73.94879165299983, 40.797477127999905], [-73.94909695599983, 40.79705785599992], [-73.94922045699984, 40.796909858999896], [-73.94960357199982, 40.79705027099992], [-73.95237419099993, 40.79820977099995], [-73.95245200999996, 40.798240230999944], [-73.95253597599994, 40.798274645999896], [-73.95516503099994, 40.79938223299988], [-73.95521824499984, 40.79940465799989], [-73.95528884999997, 40.79943440199992], [-73.95536651699993, 40.79946642599985], [-73.95786499299992, 40.800515271999885], [-73.95817297099987, 40.800582540999876], [-73.95848111500001, 40.800670477999894], [-73.95964685399987, 40.80115642299993], [-73.95914741099993, 40.80184375999991], [-73.95868839399998, 40.802469793999855], [-73.95824878299989, 40.80310648599987], [-73.958203008, 40.803894270999905], [-73.95825482599987, 40.804713877999916], [-73.95818167299996, 40.80559679099989], [-73.95772176, 40.8062909889999], [-73.95726581599985, 40.806916170999976], [-73.95680543899995, 40.80754570899993], [-73.95634493700001, 40.808173353999905], [-73.95588417599987, 40.80880224899986], [-73.95542974899983, 40.80942915299993], [-73.954966572, 40.81006455499988], [-73.9535757779999, 40.8094766979999], [-73.95327654899991, 40.809879603999875], [-73.95307869999975, 40.81009408499988], [-73.9525912579999, 40.810765332999935], [-73.95210125199992, 40.811442853999935], [-73.95067975599989, 40.81084296399989], [-73.94792306799984, 40.80967692199992], [-73.94783875999985, 40.8096412609999], [-73.94773985499985, 40.809599720999884]]]}}, {\&quot;id\&quot;: \&quot;41\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 42, \&quot;Shape_Leng\&quot;: 0.0927092274616, \&quot;Shape_Area\&quot;: 0.000263896952605, \&quot;zone\&quot;: \&quot;Central Harlem North\&quot;, \&quot;LocationID\&quot;: 42, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93436121591056, 40.83620061961779], [-73.93445239398683, 40.83598096007491], [-73.93456051826952, 40.83586608172801], [-73.934754664506, 40.835589300341795], [-73.93475368707831, 40.83556982111418], [-73.93480514039254, 40.835427472645925], [-73.93481898168233, 40.83539825039474], [-73.93483181137556, 40.83538552549233], [-73.93484813571942, 40.835351432207396], [-73.934869850678, 40.835332715131045], [-73.9348946004199, 40.8352540431223], [-73.93491533578629, 40.835230821938744], [-73.93493620828455, 40.83508021765153], [-73.9349422585534, 40.835026875417256], [-73.93495859566912, 40.8348827790447], [-73.9349794120861, 40.83478912145354], [-73.9349883314069, 40.83474865789361], [-73.9349508717845, 40.83470667336768], [-73.93495775984093, 40.83468276036335], [-73.93496523015544, 40.83465684795365], [-73.93496624164149, 40.83462912364824], [-73.93497316061179, 40.83462163504156], [-73.93497219073525, 40.834608144797535], [-73.93499389736655, 40.834597666183], [-73.93503060323975, 40.834392365341266], [-73.93503612427708, 40.83429832034335], [-73.93503124118601, 40.83424886284948], [-73.93504212490862, 40.8342113992345], [-73.93507644502887, 40.83392404328713], [-73.93506958098223, 40.833887317502175], [-73.93508341363356, 40.833865596929606], [-73.93509687471914, 40.83371535679221], [-73.93509690469148, 40.83368463190985], [-73.9351038425559, 40.83365765691791], [-73.9351124510007, 40.83342573907346], [-73.93511743048032, 40.83337703478394], [-73.93512041704221, 40.83335380357006], [-73.9351322584875, 40.833344822904984], [-73.93512636041858, 40.83332608035632], [-73.93512935500891, 40.833294609479935], [-73.93512443552818, 40.83328111868773], [-73.93513826819033, 40.83326014425817], [-73.93513729127831, 40.833241413188574], [-73.93513040300608, 40.83322866727349], [-73.93512154973675, 40.833201692776605], [-73.93512352949845, 40.833189699006276], [-73.93511565892264, 40.83317620588328], [-73.93513243602646, 40.833162725620355], [-73.93513935847737, 40.83315149100027], [-73.93512752379401, 40.8331424888091], [-73.93512465984584, 40.83305106902925], [-73.93512171853354, 40.833028590347574], [-73.93511580946044, 40.833021842172855], [-73.93511187882297, 40.833003100729265], [-73.93511979365512, 40.83298362817418], [-73.93511783020558, 40.83296713902451], [-73.93512376770067, 40.83294541299675], [-73.93512085547357, 40.83290419576851], [-73.93513170518379, 40.832902697673646], [-73.93514455114395, 40.83288472203645], [-73.93516725294582, 40.83287499277842], [-73.93516480840947, 40.83285288326428], [-73.93515659173339, 40.83268240673981], [-73.93512878131628, 40.83236353447691], [-73.93511398341515, 40.83236577683715], [-73.93507789246162, 40.83194162361134], [-73.93509565184875, 40.8319423812671], [-73.93508783728583, 40.83185919835002], [-73.93506824974095, 40.831704067625786], [-73.93502275465511, 40.83131999954982], [-73.9349850562146, 40.83102735335789], [-73.93493515655027, 40.83060244471324], [-73.9348935333237, 40.83028656383779], [-73.93483087208487, 40.82980843705176], [-73.9347988190574, 40.82979230914965], [-73.93480080676927, 40.829772833254935], [-73.934789962788, 40.82976832407678], [-73.93479293827892, 40.82975634075214], [-73.9347811108578, 40.8297405936699], [-73.93477028229687, 40.82972036169422], [-73.93475944294418, 40.82970012100011], [-73.93476343288322, 40.82965740394861], [-73.93474372591271, 40.82963716812018], [-73.93473930830932, 40.82960906144654], [-73.93474919492763, 40.8295970813634], [-73.9347373734992, 40.8295745894252], [-73.93472260127821, 40.82955060049558], [-73.93472557699917, 40.82952736927088], [-73.9347147602574, 40.829495144079715], [-73.93470100252401, 40.82944043080001], [-73.93469412707354, 40.82941645571865], [-73.93471288560669, 40.829400725944666], [-73.93470504902284, 40.82934077469046], [-73.93469321669625, 40.82932877360132], [-73.93467597101821, 40.82931340221053], [-73.93466228987826, 40.82918075994596], [-73.93468302702506, 40.82916578733352], [-73.93470769402485, 40.82915830979219], [-73.93470080780729, 40.82913207413399], [-73.9346810792479, 40.829133558281335], [-73.93467714880197, 40.829116328547876], [-73.93467025222023, 40.82911257042637], [-73.93465447618146, 40.829097576961054], [-73.93464959243231, 40.82904811940697], [-73.9346619319834, 40.829038760294466], [-73.93466295225556, 40.829014033814005], [-73.93466495971363, 40.828973566826434], [-73.93465611022576, 40.82894283638618], [-73.93465515536495, 40.828912858581106], [-73.93463641852115, 40.828906860149054], [-73.93461640343897, 40.82869365579324], [-73.93461171264791, 40.82868983525945], [-73.93460260323826, 40.82868240123771], [-73.93460883576694, 40.82866118868205], [-73.93461052506869, 40.82865543619221], [-73.93460804993313, 40.82865336301813], [-73.93460065845267, 40.82864718271558], [-73.93459873640637, 40.82860072400894], [-73.93460192118351, 40.8285925492986], [-73.9346115955321, 40.8285677551862], [-73.9346091744548, 40.82852167496818], [-73.93461017716503, 40.82850293629024], [-73.93461219000994, 40.8284572291491], [-73.93460433489878, 40.8284280027947], [-73.93460731363069, 40.82840102556364], [-73.93460043185567, 40.828382282414296], [-73.93460834555331, 40.82836355753902], [-73.93459750565471, 40.82834482035352], [-73.93460048488097, 40.82832833398501], [-73.93459360040826, 40.82830135116009], [-73.9345867414778, 40.828259384992435], [-73.93459562914452, 40.82825114985732], [-73.93458676210527, 40.82823840277648], [-73.9345917047489, 40.82822716755991], [-73.93459763971536, 40.82820843167856], [-73.93458877267241, 40.828195693979055], [-73.93458684240736, 40.828156719571446], [-73.93456513010244, 40.82816270444937], [-73.93455810179871, 40.82811740277773], [-73.93454586266024, 40.82804816146415], [-73.9345423063815, 40.828026870313025], [-73.93453258880513, 40.82796855886424], [-73.93452175638055, 40.827907800091346], [-73.9345389813406, 40.82790347267067], [-73.93453183092761, 40.8278494020435], [-73.934520765281, 40.82776568965099], [-73.93451590672413, 40.82772893075848], [-73.93442396339046, 40.8270428939722], [-73.93448291058755, 40.8270370927787], [-73.93446426549498, 40.826842205193536], [-73.93442844400506, 40.82646785059143], [-73.93436717955333, 40.82582759866107], [-73.93435643452145, 40.82582093714441], [-73.93432574289118, 40.82523259029445], [-73.93429530732783, 40.82464923122279], [-73.9342937167057, 40.824496386917176], [-73.93427285440853, 40.82443895275126], [-73.9342464289508, 40.82416688303727], [-73.9342183480328, 40.823799045790075], [-73.93416594530665, 40.82307858087102], [-73.93414657666992, 40.82302903205036], [-73.93414604382117, 40.823020619180404], [-73.93413373625334, 40.82280065597675], [-73.9341212616508, 40.822647252741746], [-73.93411752612668, 40.82252433268852], [-73.9341023336634, 40.8222012169168], [-73.93409986738209, 40.82213991284362], [-73.93409843799957, 40.82210422734389], [-73.93409112517362, 40.82199603799018], [-73.93407944723481, 40.82180557579632], [-73.9340743435484, 40.82171709911022], [-73.93407734095152, 40.821694561770016], [-73.93407005522698, 40.821559320934185], [-73.93404447476462, 40.82117670357437], [-73.93404599779073, 40.821133876520214], [-73.93403560443168, 40.82095254728241], [-73.93402662334591, 40.82081680975282], [-73.93400389615688, 40.82039784018414], [-73.93400066445355, 40.82033825378207], [-73.9339827694626, 40.82000029618647], [-73.93398644004239, 40.81996843867569], [-73.93397209670252, 40.81973020313448], [-73.93382990021335, 40.81972042397129], [-73.93383051181283, 40.819597453238174], [-73.93383064085586, 40.81957146408635], [-73.93383089287109, 40.819521063761556], [-73.9341167129999, 40.819547052999965], [-73.93431276899999, 40.81962986599991], [-73.93440039999986, 40.81966778299989], [-73.93439036800001, 40.819587434999924], [-73.934381129, 40.819328075999906], [-73.93429487799989, 40.81890498699991], [-73.934235761, 40.81864931899987], [-73.93408481999982, 40.8179308619999], [-73.93407463999996, 40.81782651399992], [-73.93412816799999, 40.81773396299989], [-73.934235195, 40.81755488099992], [-73.93445400100002, 40.81718852899994], [-73.93463790299994, 40.81690804799997], [-73.93487343800004, 40.81652784699992], [-73.93575548199986, 40.81532558399993], [-73.93613554399998, 40.814788126999915], [-73.936209578, 40.81467384999995], [-73.9366881329999, 40.81404324299994], [-73.93714398399993, 40.81342104099985], [-73.93763499299979, 40.81274779999994], [-73.9381355239999, 40.81206561899994], [-73.93820642699986, 40.81196760499992], [-73.93830924999986, 40.81182546399991], [-73.93838748499988, 40.811718443999894], [-73.93863753299986, 40.81137638799993], [-73.93874394499981, 40.8112308209999], [-73.93901753299998, 40.81085655699991], [-73.93740733700004, 40.810175610999856], [-73.93580780199986, 40.80949763799987], [-73.93586263399992, 40.80943020299987], [-73.93625935999997, 40.80885560799991], [-73.93671827500005, 40.80822047899987], [-73.93718011799989, 40.807598999999904], [-73.937634394, 40.8069746069999], [-73.9380866689998, 40.80635301199987], [-73.93854407899988, 40.80572965299991], [-73.93869430499996, 40.80579102899988], [-73.94015793699995, 40.8064090899999], [-73.94177140199992, 40.807088999999955], [-73.94491601899982, 40.80841350399989], [-73.94499360699993, 40.80844618399995], [-73.94506102999992, 40.80847449999987], [-73.94773985499985, 40.809599720999884], [-73.94783875999985, 40.8096412609999], [-73.94792306799984, 40.80967692199992], [-73.95067975599989, 40.81084296399989], [-73.95210125199992, 40.811442853999935], [-73.95150537299989, 40.812007684999905], [-73.95098203399995, 40.812521629999885], [-73.95092724899993, 40.8125754289999], [-73.95035019299995, 40.8131593889999], [-73.94986218999995, 40.81379997999992], [-73.94962668099991, 40.81410004999989], [-73.94962653799999, 40.81410023899991], [-73.94962639600001, 40.81410043599992], [-73.949405505, 40.81440740899996], [-73.94919960099985, 40.81472085399986], [-73.94900927799986, 40.81503994299992], [-73.94883491299987, 40.815363980999955], [-73.94867681799998, 40.8156922859999], [-73.94835601499989, 40.81637430599994], [-73.94800732899995, 40.81711650899995], [-73.94766641299987, 40.817855508999905], [-73.94734953999985, 40.81853499799996], [-73.94703623199985, 40.81920837199988], [-73.94671831999985, 40.81989426799994], [-73.94640289799987, 40.82057204199995], [-73.94607828700005, 40.821263215999906], [-73.94515456999994, 40.82087626499993], [-73.94460364599989, 40.82146198099991], [-73.94404986399995, 40.82205159199989], [-73.9435059449999, 40.82262775299988], [-73.94292366900005, 40.8232605869999], [-73.94242953999998, 40.823909156999896], [-73.94195569699997, 40.82455443999991], [-73.94150312699996, 40.82517136699994], [-73.94104840899992, 40.82579262999989], [-73.94059472699999, 40.826413603999875], [-73.94013953799991, 40.827038689999874], [-73.93968952899993, 40.827656573999896], [-73.93924885599988, 40.82829635099989], [-73.93896034899993, 40.828986329999914], [-73.93864026699997, 40.82973887399988], [-73.93899743399992, 40.82988885299995], [-73.93962569899988, 40.830155836999936], [-73.9401708989999, 40.83038439099996], [-73.94007905799988, 40.8304639579999], [-73.93998939900004, 40.830730965999855], [-73.93996368699995, 40.83082053399987], [-73.93996366299984, 40.8308206059999], [-73.93992395099987, 40.83090805999994], [-73.93992389199987, 40.83090817699982], [-73.93992383299992, 40.830908276999914], [-73.93987063299991, 40.830991796999896], [-73.9398705739998, 40.83099188599994], [-73.93987049099984, 40.83099197699987], [-73.93980498999994, 40.83106978999994], [-73.93980484699993, 40.83106996099988], [-73.9398046819999, 40.8310701129999], [-73.93972831499984, 40.83114089899994], [-73.93960982599997, 40.83125089499988], [-73.93960970799996, 40.83125100199988], [-73.93960960099984, 40.83125111899991], [-73.93950338699985, 40.83136945999995], [-73.939410835, 40.8314949949999], [-73.93941078799995, 40.83149507599993], [-73.93933313199983, 40.83162629999987], [-73.9392711939998, 40.83176165699991], [-73.93927116899984, 40.83176171999991], [-73.93927114599992, 40.831761792999906], [-73.93922536500003, 40.83189966099992], [-73.93913480799989, 40.832097594999915], [-73.93902897299998, 40.832291497999925], [-73.93894859799995, 40.832417335999914], [-73.93890834499989, 40.832480356999945], [-73.9387736029999, 40.83266321199991], [-73.93868316299985, 40.832800788999904], [-73.93862894999997, 40.83285794199987], [-73.93857474799998, 40.832915085999936], [-73.93838508999997, 40.833113502999936], [-73.93795718299988, 40.83345441799985], [-73.93729666499993, 40.833977743999945], [-73.93705905900006, 40.834165988999885], [-73.93700641599989, 40.83419310999991], [-73.93649557199993, 40.83456879599989], [-73.93572624299988, 40.835156346999966], [-73.93530788100004, 40.835477723999915], [-73.93506336299993, 40.83567765899992], [-73.93496274099988, 40.83575993399989], [-73.93485740300004, 40.83598502599991], [-73.9347988639999, 40.83611011599993], [-73.93474569399996, 40.836092093999916], [-73.93467393099985, 40.836064902999915], [-73.93460027799988, 40.83609686799992], [-73.93436121591056, 40.83620061961779]]]}}, {\&quot;id\&quot;: \&quot;42\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 43, \&quot;Shape_Leng\&quot;: 0.0997386183576, \&quot;Shape_Area\&quot;: 0.000379662912054, \&quot;zone\&quot;: \&quot;Central Park\&quot;, \&quot;LocationID\&quot;: 43, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97255352299985, 40.76489773199991], [-73.97301487199995, 40.76427887899991], [-73.9736358469999, 40.7645699129999], [-73.9741922899999, 40.76480652799991], [-73.97623388799995, 40.76567463099986], [-73.97836113000002, 40.766573710999886], [-73.97907658799991, 40.76687608599991], [-73.98136213699995, 40.767836738999904], [-73.98131853299991, 40.76789900199987], [-73.9812909039998, 40.76796936299995], [-73.98129086899992, 40.767969452999914], [-73.98129085699999, 40.76796955199995], [-73.98128253299978, 40.76804427399991], [-73.98129467599998, 40.7681188019999], [-73.98132588999984, 40.76818837999983], [-73.98137263399991, 40.76824931599992], [-73.98145320300002, 40.76832036999991], [-73.98145334499989, 40.768320494999934], [-73.98145349899993, 40.76832060299992], [-73.98154591499996, 40.76838333899988], [-73.98154597399994, 40.768383374999864], [-73.98164804599995, 40.76843632199994], [-73.9810229009999, 40.76927283399994], [-73.980563707, 40.76990532499988], [-73.98011181599992, 40.770528368999884], [-73.97965233399994, 40.771155326999896], [-73.97919214499984, 40.77178126499996], [-73.97872246800002, 40.772418897999934], [-73.97828220099997, 40.773031878999866], [-73.97782639399986, 40.77365619199991], [-73.97737084999984, 40.77428100699992], [-73.97691168299995, 40.774909123999905], [-73.97645763799986, 40.77553235199982], [-73.97595517399989, 40.7762197549999], [-73.97546067199991, 40.77689850299986], [-73.97499744000007, 40.77753254599988], [-73.97453231499993, 40.77816778499994], [-73.97406668299993, 40.778805416999866], [-73.97357117499989, 40.77947786199996], [-73.97172305599986, 40.78202147599997], [-73.97122292299984, 40.782706255999884], [-73.97076013099995, 40.783340137999865], [-73.97030068199992, 40.783975413999904], [-73.96983225599998, 40.784610910999916], [-73.96933573299991, 40.78529327999992], [-73.96884378999985, 40.78596738899994], [-73.96838479399985, 40.78659569699989], [-73.96792696399991, 40.78722157099988], [-73.96744908399992, 40.78786072099995], [-73.96700977099991, 40.78847678999989], [-73.96655226699977, 40.789107152999904], [-73.96609500599993, 40.7897343889999], [-73.96563269799995, 40.790365403999886], [-73.96517705600003, 40.79099034099996], [-73.96468540699995, 40.791664026999904], [-73.96417598599989, 40.79236204499989], [-73.96371096499993, 40.7930129339999], [-73.96280590599986, 40.79423581299993], [-73.96235980199994, 40.79485206099987], [-73.96189985499994, 40.7954792699999], [-73.96144060699996, 40.796110826999964], [-73.96097971799988, 40.796738643999916], [-73.96052271699993, 40.79736846899988], [-73.96004456499999, 40.79804123499991], [-73.95953658899998, 40.798718525999895], [-73.95907669099992, 40.79935223299986], [-73.95861879299989, 40.79997702599994], [-73.95833304999988, 40.80036505399987], [-73.95817297099987, 40.800582540999876], [-73.95786499299992, 40.800515271999885], [-73.95536651699993, 40.79946642599985], [-73.95528884999997, 40.79943440199992], [-73.95521824499984, 40.79940465799989], [-73.95516503099994, 40.79938223299988], [-73.95253597599994, 40.798274645999896], [-73.95245200999996, 40.798240230999944], [-73.95237419099993, 40.79820977099995], [-73.94960357199982, 40.79705027099992], [-73.94922045699984, 40.796909858999896], [-73.94940516399991, 40.79663170399987], [-73.94969538299988, 40.79621687199992], [-73.95015821299991, 40.795587731999895], [-73.95061371799994, 40.7949655739999], [-73.95111102399997, 40.794285034999874], [-73.95160265399991, 40.79360780499995], [-73.95207222299993, 40.792966160999896], [-73.95252222700002, 40.792347621999966], [-73.95298394599986, 40.791721432999964], [-73.95343832999994, 40.791085367999926], [-73.95388917099996, 40.790470498999866], [-73.95439919199988, 40.78977490899994], [-73.95481723799992, 40.789204743999974], [-73.95527481200001, 40.78858337899986], [-73.9557773589999, 40.78791392399995], [-73.95626130899994, 40.78722287599986], [-73.9567186309999, 40.78660079299993], [-73.957168537, 40.785982893999865], [-73.95763599400006, 40.78534345799992], [-73.9580956379999, 40.784717461999946], [-73.9585581369999, 40.78409759899993], [-73.95900363199988, 40.783467289999855], [-73.95946905999989, 40.78283332099994], [-73.95992094300001, 40.782212943999895], [-73.96041638899996, 40.78153163299989], [-73.96091849500006, 40.78085062899991], [-73.961368727, 40.78022974899988], [-73.96183836899999, 40.779584191999874], [-73.96230361500002, 40.77894704099985], [-73.9627671559999, 40.77831304099987], [-73.96322991899993, 40.77767704699989], [-73.96372602699994, 40.77700571799989], [-73.9637612389999, 40.77695096899986], [-73.96422820200003, 40.77631030899995], [-73.96468735799992, 40.77567708199994], [-73.96514745399985, 40.77504423199984], [-73.96560968599992, 40.77440720099987], [-73.96607448999993, 40.77377298899989], [-73.96653616999981, 40.77314036899988], [-73.96703947599987, 40.772461218999844], [-73.96753398399983, 40.77177618399991], [-73.96799327799992, 40.77114722999992], [-73.96844155899997, 40.77051632699994], [-73.96890454699995, 40.769900831999905], [-73.96936484599995, 40.769270656999915], [-73.96982455299987, 40.76864600899992], [-73.97028165499981, 40.768025031999905], [-73.97072777399985, 40.76739372199987], [-73.97118812999996, 40.766766592999915], [-73.97164774299996, 40.76614246799992], [-73.97209852400005, 40.76551725099991], [-73.97255352299985, 40.76489773199991]]]}}, {\&quot;id\&quot;: \&quot;43\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 44, \&quot;Shape_Leng\&quot;: 0.235688967594, \&quot;Shape_Area\&quot;: 0.00194465649192, \&quot;zone\&quot;: \&quot;Charleston/Tottenville\&quot;, \&quot;LocationID\&quot;: 44, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.21220034099994, 40.556443429999874], [-74.213501756, 40.55566761799985], [-74.2143713889999, 40.555588065999885], [-74.21455413999996, 40.55559031799993], [-74.21455422199988, 40.55559031799987], [-74.21455430499994, 40.5555903089999], [-74.21473791099994, 40.55557614399984], [-74.21473802999996, 40.55557613299985], [-74.21473815899992, 40.555576114999965], [-74.21491900899998, 40.555545456999916], [-74.21509339699995, 40.55549893299997], [-74.21525777199992, 40.555437837999925], [-74.21721338099994, 40.55471485899989], [-74.21784397899994, 40.554432717999894], [-74.21787855399997, 40.55423566199991], [-74.21789469299988, 40.554036199999906], [-74.21789204399995, 40.55383585499985], [-74.2178705549999, 40.55363617699989], [-74.21783047799995, 40.553438685999886], [-74.21777232699998, 40.55324488499989], [-74.21778377699997, 40.55304918799994], [-74.21877630399993, 40.552473628999955], [-74.219115764, 40.55223231399988], [-74.21931406599998, 40.55205513499987], [-74.22106803199998, 40.550554733999945], [-74.2211486979999, 40.55048965799989], [-74.22121805099987, 40.55041641999991], [-74.2212741239999, 40.550336848999926], [-74.22131562699998, 40.55025307399992], [-74.22109340299987, 40.54977355599989], [-74.22087752099993, 40.54920399899989], [-74.22083496899992, 40.54909173999988], [-74.22064536199997, 40.54859150899989], [-74.22060624599999, 40.54848651999988], [-74.2205699459999, 40.54839063799991], [-74.22036701999993, 40.54783386999984], [-74.22008210999998, 40.547138270999874], [-74.21997344699999, 40.54683441599984], [-74.21987141799997, 40.54657677199991], [-74.21981449699993, 40.546438396999925], [-74.21954309299988, 40.545699383999846], [-74.21929684599996, 40.54505270699986], [-74.21899304699997, 40.544309916999936], [-74.21888584299994, 40.544070039999895], [-74.21873688699995, 40.54366800399986], [-74.21844432399992, 40.54296409499994], [-74.21817195699992, 40.54225028499995], [-74.21803946399996, 40.54191335999994], [-74.21800676099997, 40.54182852099993], [-74.21776941599994, 40.54112662999992], [-74.21775655499992, 40.54098679299991], [-74.21767785799992, 40.54013154699988], [-74.21770976099997, 40.5383119929999], [-74.21773895399996, 40.53803020699992], [-74.21779984299988, 40.53774949499994], [-74.21781643899992, 40.537655948999934], [-74.21786779799996, 40.53736657899988], [-74.21791053499996, 40.53702886099995], [-74.21806225299997, 40.53649651299984], [-74.21819886099995, 40.53585901999993], [-74.21828207299988, 40.53548704299991], [-74.2183151519999, 40.535312078999915], [-74.21829305299998, 40.53476500299996], [-74.2182685219999, 40.534525247999966], [-74.21800676499996, 40.53229858999995], [-74.21775551799993, 40.531448847999904], [-74.21752355299995, 40.53064379899991], [-74.21728324499995, 40.52987328299983], [-74.21701386699988, 40.5291220849999], [-74.21684516999989, 40.528642086999895], [-74.21672062699999, 40.5284057529999], [-74.21666369900001, 40.52828331599991], [-74.21661081199987, 40.52817658599992], [-74.21648646999992, 40.527925626999924], [-74.2161939549999, 40.52735009899994], [-74.21586638599997, 40.526647941999926], [-74.21574341099993, 40.52646400499992], [-74.21564470499992, 40.525981847999894], [-74.21560783599998, 40.52549473899995], [-74.21559935899988, 40.524373901999894], [-74.215596992, 40.524061069999945], [-74.2156723039999, 40.52395762799989], [-74.21409806799986, 40.52409719599991], [-74.21398779899988, 40.52345242299989], [-74.21390912599999, 40.523014630999945], [-74.21381535699993, 40.52249465099986], [-74.21361475699992, 40.52153163599994], [-74.21354593399995, 40.521235715999886], [-74.21450845999989, 40.52115497999993], [-74.21735501099992, 40.520930048999915], [-74.21760570099997, 40.52087168699991], [-74.21802828299994, 40.520663726999935], [-74.22013810199992, 40.5196218829999], [-74.22269085399991, 40.518512303999934], [-74.22281984999995, 40.518456466999915], [-74.22295200699995, 40.51840511399991], [-74.22308705699992, 40.518358350999904], [-74.22322472599994, 40.51831627099988], [-74.2233647369999, 40.518278959999904], [-74.22350680499993, 40.518246492999864], [-74.22365064300001, 40.51821893699983], [-74.22379595899992, 40.518196345999876], [-74.22398999699992, 40.518212367999894], [-74.22418327999995, 40.51823302699989], [-74.22437561999999, 40.518258301999914], [-74.22456682599996, 40.51828816899989], [-74.22475670999995, 40.51832259699992], [-74.22494508699998, 40.51836155399993], [-74.22513176899994, 40.51840500099992], [-74.22531657499994, 40.51845289399988], [-74.22549932099996, 40.518505187999935], [-74.22567982799994, 40.51856182999992], [-74.22582224199994, 40.51868027699985], [-74.22597849399989, 40.518790184999894], [-74.226147208, 40.51889020799993], [-74.22632671899993, 40.51897915999993], [-74.22651508599992, 40.5190560909999], [-74.226710219, 40.51912029999991], [-74.22690993299994, 40.5191713979999], [-74.22663407199991, 40.51725100999996], [-74.22290251399997, 40.5089365389999], [-74.22321582499997, 40.508658610999866], [-74.22188242299993, 40.502674840999866], [-74.22159300278173, 40.50250043822093], [-74.22193907695905, 40.50257361983842], [-74.22199500258405, 40.50258924110122], [-74.22205322906996, 40.5025987795954], [-74.22211262695768, 40.502602050296346], [-74.22217204406495, 40.50259898975985], [-74.2222303278366, 40.50258965735334], [-74.22228634770266, 40.50257423410402], [-74.22233901700922, 40.50255301918697], [-74.22236766251469, 40.50253421998262], [-74.22239987668148, 40.50251915820311], [-74.22243483089085, 40.50250822126949], [-74.22247162604596, 40.50250169050246], [-74.22250931569815, 40.50249973388721], [-74.2225469303907, 40.50250240175186], [-74.22257824500184, 40.50251123682858], [-74.22261036634667, 40.50251818226514], [-74.2226481858538, 40.50252379471867], [-74.22268651324718, 40.50252678885857], [-74.2227210401853, 40.50252722753436], [-74.22275550111316, 40.50252554054765], [-74.2228336895983, 40.50251862120146], [-74.22291062035362, 40.50250591066576], [-74.2229855590458, 40.50248753026787], [-74.22304657854346, 40.502478179056766], [-74.2231050708459, 40.502461948414016], [-74.2231597130021, 40.5024392054374], [-74.22320926914568, 40.502410464516764], [-74.22325261844665, 40.50237637570049], [-74.22327434185924, 40.5023556759657], [-74.22330007253782, 40.5023378525658], [-74.22332916560721, 40.502323352197806], [-74.22336089192405, 40.50231253827547], [-74.22339445635099, 40.50230568182112], [-74.22342901768424, 40.50230295467355], [-74.22351209883621, 40.50230698498269], [-74.22359532981133, 40.50230567183279], [-74.22367812184865, 40.50229902451277], [-74.22375988929225, 40.50228709004475], [-74.22384005373509, 40.502269952850824], [-74.2239180481101, 40.502247734156306], [-74.22399332070259, 40.50222059113186], [-74.22410098578254, 40.50215106386502], [-74.22421217259708, 40.50208484512531], [-74.22432670677236, 40.502022038757524], [-74.22444440868638, 40.50196274325467], [-74.22475631505407, 40.50185823555003], [-74.2248115505849, 40.501827108477364], [-74.2248716718487, 40.50180180074029], [-74.22493563313823, 40.50178275252197], [-74.22500232195851, 40.501770295132], [-74.22507057837701, 40.50176464524428], [-74.22513921519668, 40.50176590112838], [-74.22520703860451, 40.50177404094029], [-74.22527286893484, 40.50178892310292], [-74.22548789675064, 40.50184439266374], [-74.22570064658579, 40.501904764360354], [-74.22591092670548, 40.501969983786225], [-74.22611854759943, 40.502039992166104], [-74.22623690028469, 40.50209386762523], [-74.226359560403, 40.502141801478466], [-74.22648601674535, 40.502183593949056], [-74.22661574227789, 40.50221907085599], [-74.2267481963388, 40.50224808433943], [-74.2268828268918, 40.502270513477725], [-74.22701907282793, 40.50228626479096], [-74.22715636630399, 40.502295272631336], [-74.22729413510996, 40.50229749945575], [-74.227431805054, 40.5022929359835], [-74.22756880235707, 40.50228160123398], [-74.22769425171127, 40.50226247625823], [-74.22782110258426, 40.50224983829663], [-74.22794877997727, 40.50224374463544], [-74.22807670514588, 40.502244222896394], [-74.22820429822289, 40.50225127091177], [-74.22822138349655, 40.50224965259281], [-74.22823668093693, 40.50224802576499], [-74.22825206733614, 40.50224699935704], [-74.22826750275328, 40.50224657395113], [-74.22828294593444, 40.502246751304384], [-74.22829835803543, 40.502247531996694], [-74.228313695154, 40.50224891343501], [-74.22832892150001, 40.50225089066462], [-74.22834434243411, 40.50225342203293], [-74.2283599010297, 40.502255390388335], [-74.22837556698457, 40.50225679143534], [-74.22839130144582, 40.50225762324074], [-74.22840707060399, 40.50225788268887], [-74.22842283627269, 40.50225757035817], [-74.22843856574725, 40.502256685308716], [-74.2284938457047, 40.50224519955647], [-74.22854942780755, 40.502234599247785], [-74.22860528683556, 40.502224889290545], [-74.22873640620917, 40.50221079463369], [-74.22877770924977, 40.502208772288284], [-74.22881893708691, 40.502206002889466], [-74.22886006514686, 40.502202488831685], [-74.22890106798002, 40.502198233181424], [-74.22895205756527, 40.502189553870046], [-74.2290032537432, 40.50218160422415], [-74.22905463305725, 40.50217439149411], [-74.22907591039723, 40.50217316105877], [-74.22909711797962, 40.50217136416866], [-74.2291182279392, 40.502169003225], [-74.22913921811273, 40.502166079277], [-74.22916006173955, 40.5021625967343], [-74.22918073095957, 40.50215855950567], [-74.22920120186964, 40.50215397316742], [-74.22922144946841, 40.50214884329823], [-74.22924144633903, 40.50214317481132], [-74.2292703849778, 40.50213741759058], [-74.22929952338401, 40.50213225235332], [-74.22932883346786, 40.50212767965797], [-74.22935829308656, 40.50212370608246], [-74.22938787284336, 40.50212033503606], [-74.22941755167608, 40.502117568236], [-74.22942138198772, 40.50211722132797], [-74.2294384115576, 40.50211505779295], [-74.22945528716919, 40.502112286928174], [-74.2294974050212, 40.50210738769351], [-74.22953936378703, 40.502101795518115], [-74.22958114326791, 40.50209550859965], [-74.22961022163645, 40.50209313212578], [-74.22963939213257, 40.50209150867983], [-74.22966861789233, 40.502090640010884], [-74.229684458175, 40.50208957229493], [-74.22970021195388, 40.50208792023397], [-74.22971584237062, 40.50208568758758], [-74.22973131345135, 40.50208287995638], [-74.22974658812029, 40.50207950177041], [-74.229795465952, 40.50206238157272], [-74.22984406719716, 40.50204480572096], [-74.22989238527848, 40.50202677640676], [-74.22991536204442, 40.5020183729186], [-74.22993870875453, 40.50201058570158], [-74.22996239099062, 40.50200342588136], [-74.22998637564558, 40.50199690273843], [-74.23016029131371, 40.50192391709752], [-74.23017873406381, 40.501919548757144], [-74.23019694119272, 40.50191463305972], [-74.2302148848441, 40.50190917491978], [-74.23023253608234, 40.50190318427988], [-74.23024986904592, 40.5018966717464], [-74.23026685720335, 40.501889644409026], [-74.23028347096967, 40.501882114892126], [-74.2302996869051, 40.50187409597532], [-74.23030686452938, 40.50187062423134], [-74.23031441673122, 40.50186764628693], [-74.23032228170659, 40.501865187060595], [-74.23033039937631, 40.50186326258836], [-74.23033265625148, 40.50186016292162], [-74.23033663156602, 40.50185470549131], [-74.23033607342072, 40.50185131829552], [-74.23033285397625, 40.50183180571128], [-74.23032743945022, 40.50181173211535], [-74.23032989415533, 40.501808276383215], [-74.23033358226388, 40.50180481767264], [-74.23033892500186, 40.50180417837197], [-74.23034304643087, 40.501807307956355], [-74.23034718449796, 40.50181545841368], [-74.23035422834207, 40.501831447680786], [-74.2303628392935, 40.501849376157026], [-74.23036582286555, 40.50185558825123], [-74.2303805628857, 40.501878153577], [-74.23038426772325, 40.50188286230653], [-74.2303894844148, 40.50189079984279], [-74.23039390320254, 40.501899016579706], [-74.23040176854838, 40.50190545442037], [-74.23041024635407, 40.501911423283836], [-74.2304192906361, 40.501916889923855], [-74.23042885080227, 40.501921821270706], [-74.23043886991823, 40.501926190633455], [-74.23044929215258, 40.50192997299455], [-74.23046005729444, 40.50193314636069], [-74.23047527187609, 40.501936933837634], [-74.23049071815454, 40.50194012962992], [-74.23050635571904, 40.501942725609766], [-74.23052214460141, 40.501944714653426], [-74.23053804483887, 40.501946091312604], [-74.23055401780135, 40.50194685465975], [-74.2305700202341, 40.50194699925312], [-74.23058600979103, 40.5019465285285], [-74.23061606414724, 40.50194431066832], [-74.23064604933, 40.50194157258755], [-74.23067594493172, 40.501938315332694], [-74.23070573318452, 40.501934541787655], [-74.23073539346244, 40.501930253333974], [-74.23076490778703, 40.50192545536911], [-74.23079425749847, 40.50192014659036], [-74.23082342089151, 40.501914333742846], [-74.23084851211847, 40.50190886380689], [-74.2308523804173, 40.50190801937487], [-74.23088112029114, 40.501901208711786], [-74.23095331081439, 40.5018869544787], [-74.23114494958575, 40.50185121588201], [-74.2311805719308, 40.50183722714865], [-74.23120353968633, 40.501822855627815], [-74.2312232711201, 40.50181685411036], [-74.23122469229227, 40.50181644230333], [-74.23123357692766, 40.50181755087981], [-74.23124443244176, 40.5018268603189], [-74.2315487998192, 40.5017245374848], [-74.23184935718473, 40.50161585082739], [-74.23214587623688, 40.50150088291111], [-74.23243813174554, 40.501379721071565], [-74.2327259017227, 40.5012524573491], [-74.23300896759186, 40.501119188418826], [-74.23304744169111, 40.50110177283039], [-74.23314424618417, 40.50107932001994], [-74.23321049636206, 40.5010956471732], [-74.23359904119728, 40.50091253160122], [-74.23441378278534, 40.50077409423288], [-74.23494577701936, 40.50065915779635], [-74.23501360836578, 40.50065361509914], [-74.23508091792974, 40.50064514096061], [-74.23517395943664, 40.500628383527115], [-74.23526495949417, 40.50060602857461], [-74.23535334118338, 40.50057821782871], [-74.23543854418718, 40.50054512760354], [-74.23552002834258, 40.500506967683684], [-74.2355972770665, 40.500463979993775], [-74.23566269106378, 40.500430831843914], [-74.23573157542359, 40.50040207058007], [-74.23580342653713, 40.500377906471954], [-74.23587771910799, 40.50035851618022], [-74.23595390999242, 40.50034404146448], [-74.23610536564176, 40.500266216723205], [-74.23625245135797, 40.500183652267225], [-74.23635177807365, 40.500123671949574], [-74.2364287410083, 40.500076510868816], [-74.23647263236712, 40.5001123997492], [-74.23652981831931, 40.50009943174849], [-74.23661963667443, 40.50007228189297], [-74.23670606284715, 40.50003933498759], [-74.23678845619574, 40.500000835256294], [-74.2368662059753, 40.499957068083674], [-74.23693873586555, 40.49990835789935], [-74.23700550824262, 40.49985506577299], [-74.23706602816398, 40.49979758673748], [-74.23718407596924, 40.49970224271456], [-74.23729667529008, 40.499603132808204], [-74.23740362019552, 40.499500438300515], [-74.23750471509992, 40.49939434702925], [-74.23759977511978, 40.49928505304476], [-74.23768862641342, 40.49917275625363], [-74.23766770359761, 40.49912325493375], [-74.23774805247368, 40.49910084537648], [-74.23777146009982, 40.49918035138809], [-74.23781982777892, 40.499183845546135], [-74.23786840947196, 40.49918350191914], [-74.23792863579281, 40.49917768581353], [-74.23798737378735, 40.49916598084102], [-74.23804363965198, 40.49914858304881], [-74.23809649099027, 40.49912578383293], [-74.23844104903398, 40.49893585618119], [-74.238513216357, 40.49889607636883], [-74.23895150706927, 40.498443384066505], [-74.23944024302581, 40.49793857961804], [-74.2396684504129, 40.497702924941784], [-74.23971237574322, 40.49766233705473], [-74.23976289569347, 40.49762649844568], [-74.23981913721121, 40.49759602844686], [-74.23984851243979, 40.497583013207], [-74.23988017293566, 40.49757362656005], [-74.23991335528727, 40.4975680948406], [-74.23994725938827, 40.49756655143169], [-74.23998106772962, 40.497569033548785], [-74.24001396511112, 40.49757548134175], [-74.2400451582977, 40.4975857393391], [-74.24007389514547, 40.49759956019564], [-74.24013023081554, 40.49761940728271], [-74.24018972118647, 40.4976328595752], [-74.24025112808033, 40.49763963708909], [-74.24031317342877, 40.49763959876344], [-74.24037456587457, 40.49763274539565], [-74.24046072278645, 40.4976189903655], [-74.24054814968598, 40.49761119759537], [-74.24063614005212, 40.49760943006092], [-74.24072398281064, 40.49761370204587], [-74.24081096808003, 40.4976239790273], [-74.24085905484203, 40.497635316542414], [-74.24090866403729, 40.49764178650346], [-74.24095895398746, 40.497643279140284], [-74.24100907146406, 40.497639769128426], [-74.24105816616476, 40.49763131601914], [-74.24110540514047, 40.497618063229794], [-74.24123510821227, 40.49762608502554], [-74.24136522975829, 40.49762707777318], [-74.24149511694067, 40.49762103649198], [-74.24162411809742, 40.49760799149185], [-74.24175158601285, 40.49758800822129], [-74.24187688116483, 40.49756118693905], [-74.24199937493485, 40.497527662210985], [-74.2420393884239, 40.497512515625424], [-74.24208206686333, 40.49750246612824], [-74.24212630449081, 40.4974977740931], [-74.2421709551481, 40.49749856108657], [-74.24221486197615, 40.49750480671827], [-74.24225688738737, 40.49751634916922], [-74.2422959425381, 40.49753288938479], [-74.24233101554053, 40.497553998821914], [-74.24241668300726, 40.49758356032845], [-74.24250563456835, 40.497606791449726], [-74.24259706962503, 40.49762348309601], [-74.24269016522429, 40.49763348503525], [-74.24278408346595, 40.4976367072458], [-74.24287797904488, 40.49763312072612], [-74.24297100685976, 40.497622757756695], [-74.24311685537805, 40.497602449569634], [-74.24326378176856, 40.49758733310723], [-74.24341146909926, 40.49757744097689], [-74.24355959879793, 40.49757279451684], [-74.24370785133766, 40.49757340374976], [-74.2438559069274, 40.49757926736137], [-74.24397481574329, 40.49758175036924], [-74.24409361501311, 40.49757713079004], [-74.24421157785997, 40.49756543688878], [-74.24432798252589, 40.49754674021474], [-74.2444421167878, 40.49752115516415], [-74.24455328231618, 40.497488838279466], [-74.2446607989485, 40.49744998729183], [-74.24476400885132, 40.4974048399108], [-74.24495162973764, 40.497322388839386], [-74.24513522575204, 40.49723481681643], [-74.24531455716688, 40.49714223819553], [-74.24548938982635, 40.49704477386729], [-74.24565949545183, 40.49694255110184], [-74.2458246519406, 40.49683570338224], [-74.24590703235593, 40.49678525694412], [-74.24603300798422, 40.49666493479786], [-74.24616589257572, 40.4965490249669], [-74.24630542124939, 40.49643775846518], [-74.24645131588674, 40.496331357051396], [-74.24660328568625, 40.49623003278634], [-74.2467610277419, 40.49613398761176], [-74.24694239086584, 40.49612122798881], [-74.24712436215972, 40.49611539517035], [-74.24730648798806, 40.496116503696946], [-74.24748831433008, 40.49612455080525], [-74.24766938791153, 40.49613951643462], [-74.24784925733391, 40.496161363277274], [-74.24802747419955, 40.49619003687112], [-74.24820359422863, 40.49622546573579], [-74.24837717836708, 40.49626756155029], [-74.24854779387996, 40.49631621937367], [-74.24871501543038, 40.49637131790576], [-74.24887842613946, 40.496432719790434], [-74.24903761862493, 40.49650027195716], [-74.24917156868965, 40.49656729705339], [-74.2495597836633, 40.49685685437291], [-74.24968820467004, 40.496990212153534], [-74.2499336255057, 40.49720897724609], [-74.250100267188, 40.49735424453503], [-74.2503270675016, 40.49753852654371], [-74.25050715142565, 40.4976916622374], [-74.25068311794705, 40.49784756275831], [-74.25085489422248, 40.49800616359511], [-74.25086108509564, 40.498029214923285], [-74.25090066516684, 40.49809160134346], [-74.25093333881192, 40.4981562764991], [-74.25095888137142, 40.49822279573272], [-74.25097711721169, 40.49829070170703], [-74.25098792093398, 40.4983595275491], [-74.25099121823624, 40.498428800060296], [-74.25098698642542, 40.49849804296943], [-74.2509881338781, 40.49851023840833], [-74.25100346233354, 40.49861817111827], [-74.2510279779697, 40.49872511105251], [-74.25106157647166, 40.49883060298568], [-74.251104114858, 40.49893419785412], [-74.25116773245702, 40.49899309065367], [-74.25123652201721, 40.49904849188248], [-74.25131015560194, 40.49910013741949], [-74.25138828217872, 40.499147781048116], [-74.25147052929267, 40.49919119562997], [-74.25155650484207, 40.49923017418809], [-74.25172949863416, 40.49929161551243], [-74.25191210542215, 40.49936321333001], [-74.25200034554481, 40.49940041958595], [-74.252074841391, 40.499433209856335], [-74.25208380907416, 40.49943724424436], [-74.25225360988088, 40.499509044716525], [-74.25242564997141, 40.499577668819654], [-74.25259982739979, 40.4996430758863], [-74.2527076122783, 40.49971306866778], [-74.25281011834669, 40.499787539414406], [-74.25290702679237, 40.49986625652177], [-74.25299803620874, 40.499948975178405], [-74.25308286353142, 40.50003543812712], [-74.25316124492005, 40.5001253764648], [-74.25323293657812, 40.50021851047876], [-74.25329771551169, 40.50031455051638], [-74.25335538022304, 40.50041319788582], [-74.25340575133804, 40.50051414578479], [-74.25344867216407, 40.50061708025489], [-74.25357745759506, 40.50095885796737], [-74.25370341736796, 40.50130124889621], [-74.25374291422749, 40.50141464717274], [-74.25379045770413, 40.50152623147129], [-74.25384590619183, 40.50163566934946], [-74.2539090945309, 40.501742634758166], [-74.25397983449942, 40.50184680901308], [-74.25405791537396, 40.501947881744094], [-74.25414310455724, 40.50204555182022], [-74.25423514827004, 40.50213952824683], [-74.25427407656716, 40.50216118050971], [-74.25472027611785, 40.50296520166217], [-74.25523408934775, 40.50393456923247], [-74.25527565808395, 40.50403466831163], [-74.25530969765195, 40.50413641072463], [-74.25533609771456, 40.504239466782785], [-74.25535477268829, 40.504343502538745], [-74.25536566202192, 40.50444818086976], [-74.25536873039188, 40.50455316256854], [-74.25535850504895, 40.50517012777074], [-74.25533004608194, 40.50596510120405], [-74.2553071037761, 40.50653645411903], [-74.25532532868485, 40.506700187309534], [-74.25535252614577, 40.50686319378521], [-74.25538521003818, 40.5070113739394], [-74.2554253090784, 40.50715848929814], [-74.25547276441225, 40.50730432375963], [-74.25552750637893, 40.507448663101925], [-74.25555705464842, 40.507512444405016], [-74.2555776815809, 40.507578238363024], [-74.25558915990914, 40.50764532014473], [-74.25559136315209, 40.50771295072906], [-74.25554269163935, 40.50783774249614], [-74.25553185854751, 40.50786122885186], [-74.25552913160817, 40.50786714123413], [-74.25545272937914, 40.508032776305576], [-74.2552481775318, 40.50824323071299], [-74.25504293715964, 40.50839740737782], [-74.25489888207028, 40.508433685802416], [-74.25462856709899, 40.508674825727006], [-74.25470272483841, 40.508716063138706], [-74.25473104757664, 40.50872401077879], [-74.25490187176642, 40.50876438344174], [-74.25490412260378, 40.5087563679414], [-74.2549813000948, 40.508771172775724], [-74.2549729037097, 40.50880566213322], [-74.25489648202563, 40.50878703523463], [-74.25489963820436, 40.50877727590247], [-74.25471558491711, 40.50873762919246], [-74.25468450878448, 40.50872585538434], [-74.25461876022267, 40.50868612216256], [-74.25455923943342, 40.50874601472694], [-74.25450422784878, 40.50880836852237], [-74.25434064057384, 40.508770803134546], [-74.25412213945084, 40.508984766883515], [-74.25410113834869, 40.508977337855086], [-74.2540475777605, 40.508948357247185], [-74.25403489413355, 40.50894453995541], [-74.25402490190875, 40.50894473413955], [-74.25401623457128, 40.50894787669566], [-74.25400832609722, 40.50895281683775], [-74.25399478574111, 40.508968089878174], [-74.25398428084348, 40.50899055325591], [-74.25397681140788, 40.50902020696289], [-74.25411121318568, 40.509167047180746], [-74.25403804567854, 40.509252671645676], [-74.25430713012449, 40.50937626384592], [-74.25434874440127, 40.50932901714464], [-74.2543887773701, 40.50934418413455], [-74.25431454169312, 40.50941369464892], [-74.25428177080046, 40.509397124218005], [-74.25429083557015, 40.5093915568429], [-74.25402069505334, 40.50927297578743], [-74.25389169939274, 40.509423932519965], [-74.25373355115248, 40.50937689274578], [-74.25368911881061, 40.509425596439094], [-74.25370535508549, 40.50943441372992], [-74.25367604695235, 40.509467390170705], [-74.25369339837492, 40.50947698837386], [-74.25413324931496, 40.50968292755783], [-74.25433256547628, 40.50977376100487], [-74.25434937126049, 40.50978095473888], [-74.25456815512877, 40.509880110297466], [-74.25462336202806, 40.509814602108904], [-74.25464651262905, 40.50982624592433], [-74.25452621732619, 40.50997301588608], [-74.25450038789252, 40.50996319670469], [-74.25455333637498, 40.50989597368409], [-74.25412462467563, 40.50969365976767], [-74.25366810379255, 40.50947991476315], [-74.25366393827429, 40.50947795815997], [-74.25364812518256, 40.509470530436246], [-74.25360711255456, 40.50948090044583], [-74.25350297868137, 40.50960201174755], [-74.25347835886951, 40.50967270210219], [-74.25331579805132, 40.50986150454089], [-74.25328327353373, 40.51000017430845], [-74.25319261503304, 40.51024176573132], [-74.25314984243136, 40.510388496541744], [-74.25312730843176, 40.51071258104537], [-74.25306394553081, 40.51105525736969], [-74.25326008268306, 40.511078643793255], [-74.2532580688566, 40.51108868938079], [-74.25306274811025, 40.51106765345778], [-74.2530377993434, 40.51113607723536], [-74.25300847277559, 40.511193989705326], [-74.25302037923967, 40.51128514610703], [-74.25308195034367, 40.511392839392975], [-74.25318020396979, 40.51145816973165], [-74.25343350448411, 40.511636688346], [-74.2534860296364, 40.51159519786609], [-74.25349300571601, 40.51159899228274], [-74.25345907659539, 40.51163043841861], [-74.25348740701011, 40.51164944524402], [-74.2535239695038, 40.51161898908778], [-74.25353195022859, 40.511622721474204], [-74.25349517785072, 40.51165588724196], [-74.2535268507671, 40.511677766031795], [-74.25350211252186, 40.51170091785187], [-74.25317151924685, 40.51146606218066], [-74.25309286964242, 40.51141076593543], [-74.2530619950522, 40.51141937810189], [-74.25303635381549, 40.511433160458736], [-74.25303207962352, 40.51146822794039], [-74.25300008721311, 40.51183226997468], [-74.25299713902285, 40.51185914541614], [-74.25299940823137, 40.51188605922221], [-74.253006845369, 40.51191242458865], [-74.2530192882889, 40.51193766666826], [-74.25303646570178, 40.51196123510421], [-74.25305800309056, 40.51198261603], [-74.25307641613708, 40.511997777367725], [-74.25309036761324, 40.51201668511298], [-74.25309984531484, 40.51203714387679], [-74.25310456615327, 40.512058542588186], [-74.25310438912015, 40.51208024210097], [-74.25309931949845, 40.51210159428354], [-74.25308950870547, 40.51212196137835], [-74.25307524977121, 40.51214073504986], [-74.25243270667266, 40.51259432885166], [-74.25216570187291, 40.51278281361988], [-74.25195197488479, 40.51299700254723], [-74.2519293126925, 40.51320944549542], [-74.251994679988, 40.5133474300147], [-74.25208955294612, 40.51346052979929], [-74.25214378894988, 40.5135534708155], [-74.2521259139705, 40.51371037979995], [-74.25179186478277, 40.51400480544838], [-74.2517859200255, 40.5140100462964], [-74.25175583198892, 40.51403693838163], [-74.25172346740699, 40.51406224389354], [-74.25168048931724, 40.51409118993782], [-74.2516345376261, 40.51411734028925], [-74.25158592366496, 40.51414051777254], [-74.25153546924818, 40.51417472458121], [-74.25148978164565, 40.514212633084355], [-74.2514493247853, 40.514253858352234], [-74.25141450948402, 40.514297981775876], [-74.25138568927517, 40.51434455531663], [-74.25138383883895, 40.5143556560311], [-74.25137951255292, 40.51436634799982], [-74.25137283954724, 40.514376312087855], [-74.25136401899758, 40.514385250886605], [-74.25135331417916, 40.514392897589765], [-74.25134104461047, 40.51439902395792], [-74.25132757651421, 40.5144034471305], [-74.25131331188783, 40.51440603508408], [-74.25129867650337, 40.51440671057315], [-74.25128410719968, 40.51440545343558], [-74.25127003884319, 40.51440230119468], [-74.25118528349849, 40.51442604654969], [-74.25110334075717, 40.51445497653476], [-74.2510247540467, 40.51448889929356], [-74.25095004454057, 40.51452758985852], [-74.25087970770177, 40.514570791642846], [-74.25075668084278, 40.51462320285307], [-74.25068266586877, 40.514649708649145], [-74.25061193066762, 40.514680999046774], [-74.25054500497247, 40.51471683971555], [-74.25048238999003, 40.51475696224807], [-74.25042455464683, 40.51480106616999], [-74.25037193207766, 40.51484882119001], [-74.25036757485495, 40.51486210326496], [-74.25036065006782, 40.51487473421425], [-74.25035131521172, 40.51488642676049], [-74.25033978259643, 40.51489691496934], [-74.2503263145185, 40.514905960297504], [-74.25031121729425, 40.514913357018564], [-74.25029483429408, 40.514918936901836], [-74.25025503032282, 40.51494653038555], [-74.25022073120984, 40.51497813745146], [-74.25019262447161, 40.51501312455233], [-74.25011262464746, 40.51503074559172], [-74.2500458775657, 40.51510851049426], [-74.25004011503235, 40.51518249067772], [-74.25018131058542, 40.51532776528284], [-74.25017086663703, 40.51533399691467], [-74.25028083612378, 40.51544116717457], [-74.25027416157674, 40.51544556031963], [-74.25028567520496, 40.51545720726751], [-74.25029330638937, 40.51545281320833], [-74.25055526413547, 40.51571634242889], [-74.25045509923827, 40.51577200710897], [-74.25019601571454, 40.51550993109391], [-74.25027518309636, 40.51546306675979], [-74.250261753469, 40.515450693385766], [-74.2502522096781, 40.515455092115594], [-74.25015626516773, 40.51536118819946], [-74.24988824874988, 40.51552154519294], [-74.25047627306125, 40.51611729929947], [-74.25053507045652, 40.51608604354204], [-74.25056007272197, 40.516106741535], [-74.25041535921383, 40.5161883350259], [-74.25039487478166, 40.51616416863538], [-74.25045139325624, 40.51612945938236], [-74.24984374594052, 40.51551805020887], [-74.24935660923894, 40.51500592819369], [-74.24927734323958, 40.51505009620043], [-74.2493572627287, 40.51512887092506], [-74.24933775243697, 40.51514081437928], [-74.2492561503189, 40.515061195085735], [-74.24921528676096, 40.51508486129925], [-74.24952480927368, 40.51540995825117], [-74.24963220109247, 40.515545377951014], [-74.24962270300641, 40.515574730442026], [-74.24950047123725, 40.51564648856688], [-74.24953303060417, 40.515682164214226], [-74.24951393678684, 40.51569398097641], [-74.24994158808036, 40.516137488190985], [-74.24989861903732, 40.516160062404325], [-74.24948229759761, 40.515716531577304], [-74.2494642033825, 40.515725217684285], [-74.24943096899091, 40.51568788559742], [-74.24905586508787, 40.51590409611533], [-74.24903055962491, 40.515881236130525], [-74.24864764632096, 40.51611262849677], [-74.24871583641298, 40.51616954901984], [-74.24870679818525, 40.516176485625], [-74.24884323664601, 40.516305889562055], [-74.24882966609398, 40.516312836002854], [-74.24868189274336, 40.51618172785625], [-74.24862466940564, 40.516215751555514], [-74.2487595831514, 40.51635622113422], [-74.24873695634659, 40.51636491694885], [-74.24854589291671, 40.51616991714839], [-74.24855013363099, 40.51619574727786], [-74.24851245601478, 40.51622571840381], [-74.2485749638381, 40.51628869599919], [-74.24860080823046, 40.5163133319178], [-74.24828422083891, 40.51648694955366], [-74.24894624665603, 40.517194539786644], [-74.24937814038087, 40.51695149632221], [-74.24940770789283, 40.516980831423645], [-74.24851449056031, 40.517475626265046], [-74.24848720326882, 40.51744974618362], [-74.24891910653055, 40.51720843369238], [-74.24822171694589, 40.5164860197475], [-74.24751811835522, 40.51573586477858], [-74.24693048008466, 40.51606645441775], [-74.24687147835442, 40.516036881776515], [-74.24664175789378, 40.516121936076665], [-74.24644039651318, 40.515965028508525], [-74.24612560876693, 40.516116596447006], [-74.24612462197246, 40.516127369298324], [-74.24612857679293, 40.5161373925737], [-74.24613667051254, 40.51614674003258], [-74.24614748095286, 40.51615375951751], [-74.24615993200383, 40.516157604791324], [-74.2461746405067, 40.51615923046234], [-74.24618298246288, 40.51615926634782], [-74.24623549606487, 40.516154056571175], [-74.24625286283556, 40.51615339844281], [-74.24630085106863, 40.51614061103397], [-74.24652992417231, 40.51637770064297], [-74.24659873437136, 40.516358202326835], [-74.24674997194062, 40.516495613240494], [-74.24659339236202, 40.51658682659807], [-74.24651040267673, 40.516669855305985], [-74.24669769426788, 40.51687938448535], [-74.2466932357773, 40.5168818628046], [-74.24670706721054, 40.51689543206918], [-74.24671033904563, 40.51689398125468], [-74.246995569966, 40.51718208519555], [-74.24696892776889, 40.51719824208417], [-74.2466825860256, 40.51690695637092], [-74.24669527621076, 40.51690149656922], [-74.24668162673821, 40.516885006511984], [-74.24666521689264, 40.51689161720225], [-74.24647899705323, 40.51668732721085], [-74.24644391386606, 40.51670254516729], [-74.24642373950073, 40.51671516201796], [-74.24637736435443, 40.51673909335886], [-74.24656439920257, 40.516945792199216], [-74.24653682834258, 40.51695996037955], [-74.24634969801767, 40.51675337193499], [-74.24598176886698, 40.51694324236162], [-74.24595276991943, 40.51693199314788], [-74.24520861528356, 40.517289743624104], [-74.24566989001377, 40.51778970805126], [-74.24559938749574, 40.5178572955057], [-74.24571276694213, 40.517984421621456], [-74.24566427146003, 40.518049469141076], [-74.2456347316994, 40.518075580745766], [-74.24556879842257, 40.51808986210907], [-74.24556587385842, 40.51809049526678], [-74.24552667154194, 40.51808086300408], [-74.24549055670978, 40.518060023004196], [-74.24537078493631, 40.518039913035246], [-74.2453056843134, 40.51802937476492], [-74.24524560494235, 40.51803406401096], [-74.24519792215143, 40.518037784047856], [-74.24508804460535, 40.51806683940414], [-74.24492775667768, 40.51812002114928], [-74.24486088052586, 40.518155324562485], [-74.24477399945269, 40.518208320321065], [-74.24469200084191, 40.51825867000793], [-74.24460054529645, 40.51833956292471], [-74.24451292617638, 40.51841704504164], [-74.24440812395468, 40.51847737885722], [-74.24431751097607, 40.518513227043705], [-74.24429835217606, 40.518515003107694], [-74.2441931864379, 40.518507646784464], [-74.2439995737616, 40.518441159390015], [-74.24382126609419, 40.51832938469257], [-74.24365228511596, 40.51829461462316], [-74.24301946478842, 40.51830792476936], [-74.24282337422682, 40.51830818329581], [-74.24263711942852, 40.518242768834334], [-74.24232477833276, 40.51832652502174], [-74.24209123122782, 40.51848531749823], [-74.24186964584052, 40.51874212138676], [-74.2412596867521, 40.519180469822984], [-74.24109075921592, 40.51934560382892], [-74.24103122918532, 40.519542512687934], [-74.2408696197996, 40.5194940796585], [-74.24075928637673, 40.51931965712868], [-74.24059645807856, 40.51920981244947], [-74.24049069687692, 40.5191916289701], [-74.24039560067511, 40.51927909989127], [-74.24024433791301, 40.51951749846853], [-74.24018802896548, 40.51966380798033], [-74.2400965083332, 40.519868231034316], [-74.23991937852388, 40.52004699652993], [-74.23992701129993, 40.52018125023725], [-74.24003142061724, 40.520313119018425], [-74.24033380813592, 40.52040852891315], [-74.24055584307511, 40.520447528900064], [-74.2407328454876, 40.520569151653746], [-74.2408465963753, 40.520653519664386], [-74.24093977908043, 40.5207536737846], [-74.24092192194361, 40.520806836825486], [-74.24097377890219, 40.52088739946692], [-74.24117293552197, 40.52106013143197], [-74.24121924614649, 40.521032488187025], [-74.2412395676565, 40.520947837847686], [-74.24133219575513, 40.52089451758021], [-74.2413837903956, 40.52090227902593], [-74.2415721732834, 40.52094713835036], [-74.24189065727207, 40.520977549491654], [-74.24293235036517, 40.52122716113276], [-74.2429043393599, 40.52142442574137], [-74.24281484743372, 40.521631214872606], [-74.24259440562305, 40.52205564138241], [-74.24258375639438, 40.52219864900052], [-74.24259082520992, 40.522251637320856], [-74.24264266046022, 40.52241135944537], [-74.24270806228716, 40.5225727261596], [-74.24271469863487, 40.52265675986605], [-74.24273215954128, 40.52270077737195], [-74.24276246783717, 40.52272678912752], [-74.24274849039318, 40.52280007810463], [-74.24269227372879, 40.522840930770386], [-74.24265487812147, 40.52288393777585], [-74.24262345539675, 40.52294713519763], [-74.2426212927105, 40.523025339336115], [-74.24261397838424, 40.523080937524476], [-74.24261666939863, 40.523098937889515], [-74.2426579383821, 40.52313222884206], [-74.24269383331624, 40.52315161267547], [-74.24271065391652, 40.52317754423211], [-74.24272886354078, 40.523229409311334], [-74.24273957613275, 40.52326748653359], [-74.24275355918745, 40.52336703698905], [-74.24275122404825, 40.52351227512357], [-74.24274023652956, 40.52356385012519], [-74.242744234157, 40.52358271771152], [-74.24275345819947, 40.5236062500324], [-74.24276237450053, 40.52362610804578], [-74.24276575861535, 40.52363762634376], [-74.24276517879032, 40.523649952984734], [-74.2427575681127, 40.52368414487768], [-74.24275890301233, 40.52370006921579], [-74.24276471147398, 40.52372130788956], [-74.24279784366254, 40.52376089237593], [-74.24281673693896, 40.52380362991615], [-74.2428183465929, 40.52383245271266], [-74.24281641236698, 40.5238479661431], [-74.24281449076011, 40.52386338790745], [-74.24280882716648, 40.52389195100273], [-74.24280678281418, 40.52392525778574], [-74.24280658251452, 40.52395170899014], [-74.24280252193645, 40.523980193472944], [-74.24280157009575, 40.52400729628661], [-74.24281304883496, 40.52402887377362], [-74.24286227003466, 40.5240873508412], [-74.24290564933676, 40.524133814045314], [-74.24294001416733, 40.52418809487348], [-74.24298985090236, 40.52425392066565], [-74.24302432341914, 40.524338328485776], [-74.24303990307527, 40.524379998795084], [-74.24308072550264, 40.52445364269708], [-74.24311293970743, 40.524511104412284], [-74.24317524593046, 40.52459107967431], [-74.24326436709377, 40.52471217700171], [-74.24330095332317, 40.52477372904665], [-74.24332687887491, 40.524794601716884], [-74.24335792685855, 40.524818913820425], [-74.24338504510442, 40.52483480761203], [-74.24340768923547, 40.524845387088135], [-74.24348882392479, 40.52486125895079], [-74.24360793545556, 40.52484483934403], [-74.24396500758859, 40.52490536633781], [-74.24396761706937, 40.5249509544872], [-74.24396835839076, 40.524998933586524], [-74.24333883883845, 40.52585380517989], [-74.24307389513913, 40.52669417771936], [-74.2430510131873, 40.52681228984682], [-74.2430599177623, 40.526876313027714], [-74.24306019367343, 40.52694069541478], [-74.24305183800163, 40.5270047616636], [-74.24303493837023, 40.52706783974403], [-74.24300967202623, 40.5271292679895], [-74.24297630398283, 40.52718840203788], [-74.24293518423968, 40.527244621590626], [-74.24288674411305, 40.52729733692015], [-74.24285888589208, 40.527335291356586], [-74.2428393395779, 40.52737615650703], [-74.2428286081863, 40.52741888075689], [-74.24282696789425, 40.527462364647704], [-74.24283446093035, 40.5275054891709], [-74.24285089448672, 40.52754714456317], [-74.24287584567887, 40.52758625886605], [-74.24287940175411, 40.527609452185295], [-74.242895150673, 40.52763389612434], [-74.24292862564661, 40.527667928706], [-74.24294563760438, 40.52769784587819], [-74.24294799832856, 40.52772601705562], [-74.24293971177053, 40.527800214062225], [-74.24290983683017, 40.52786685302814], [-74.2428726178986, 40.527922782869666], [-74.2428574567956, 40.527943815603905], [-74.24285076542613, 40.527960130174236], [-74.24284226646175, 40.52800297456181], [-74.24285856207011, 40.528031988594954], [-74.24288723774357, 40.52804910117791], [-74.2428867138121, 40.52820013082601], [-74.24276120556748, 40.52830572728832], [-74.24275675859762, 40.528309693100056], [-74.24270218581978, 40.52834125871439], [-74.24266345955331, 40.528369588623164], [-74.2426421851727, 40.52839460992399], [-74.24262640726322, 40.528408292677646], [-74.2426125770179, 40.52841634680075], [-74.24261267872569, 40.52841757123613], [-74.24259362148119, 40.52842096128823], [-74.24256732309529, 40.5284148646243], [-74.24255062166955, 40.528417523947894], [-74.2425102899773, 40.528445935768495], [-74.24250919866977, 40.52845213755197], [-74.24252416256847, 40.528486458470624], [-74.24253509556485, 40.52851113662018], [-74.24253332154946, 40.52852844211372], [-74.24249931304354, 40.52858421577741], [-74.24249023516836, 40.52863938559633], [-74.24248405744738, 40.52866182499104], [-74.24245926425822, 40.52868332817097], [-74.24242781388115, 40.5287119188902], [-74.24242002837842, 40.52873443622753], [-74.24241293926971, 40.52883255556881], [-74.24241987628413, 40.528867269053514], [-74.24243402108462, 40.52889179048973], [-74.24244956541193, 40.528913784949204], [-74.24245581741143, 40.52893069738365], [-74.24245684392416, 40.52894294590663], [-74.24245541025238, 40.52895469954592], [-74.24244489204953, 40.52896382253608], [-74.24242054279586, 40.52898099845359], [-74.24239489550051, 40.529001927451404], [-74.24237543220742, 40.5290293196263], [-74.24236464310113, 40.529054442708826], [-74.24236058312694, 40.529082928335306], [-74.24233695655916, 40.52913757935194], [-74.24230892358077, 40.52919736476676], [-74.24228365805864, 40.529261320374324], [-74.24225490734621, 40.52931253256033], [-74.2422111306362, 40.529376777503245], [-74.24219764536582, 40.529408180956324], [-74.2421880176231, 40.52943755166016], [-74.24218040993692, 40.529500646074055], [-74.24217260166839, 40.52959019151156], [-74.24217254400455, 40.52966644612745], [-74.24216656926593, 40.52969133454261], [-74.24216769875875, 40.52970480817036], [-74.24217641185439, 40.52972221667961], [-74.24218939305197, 40.5297424900076], [-74.24220131578326, 40.529759741301056], [-74.24222830140566, 40.52978363741721], [-74.2422381043392, 40.529794842469535], [-74.24224565508311, 40.52980800283456], [-74.24224637250255, 40.52981657621738], [-74.24224528137324, 40.52982277950494], [-74.24223421655796, 40.529835003115764], [-74.24202464913051, 40.530062218660646], [-74.24199108185135, 40.53011059776529], [-74.2419404209108, 40.53018728571755], [-74.24190634667363, 40.530244559070034], [-74.24186713793071, 40.530314882318656], [-74.2418432069506, 40.53036233473484], [-74.24182920013061, 40.53039788227688], [-74.24181772165427, 40.530417312887415], [-74.24180708875609, 40.53043141624709], [-74.24178702312778, 40.530453142689694], [-74.2417670305463, 40.530475582488684], [-74.2417475434774, 40.530498351255375], [-74.24172854514237, 40.5305168095949], [-74.24171160461849, 40.530537292564176], [-74.24168936071905, 40.53057403818787], [-74.24168110124019, 40.53059755126657], [-74.24167218669888, 40.530619336638445], [-74.24165729913027, 40.53065101571626], [-74.24164097038334, 40.53068173720384], [-74.24162417534374, 40.53071284398607], [-74.24160715747745, 40.530741837666255], [-74.24159605351099, 40.53076480722383], [-74.24158841240589, 40.53078082617963], [-74.24156916008901, 40.53082873643653], [-74.24154928903585, 40.530874891263835], [-74.24153508696172, 40.53092671714012], [-74.24152427275666, 40.53098012558668], [-74.24150733322897, 40.531041342795135], [-74.24150247553192, 40.531080220323275], [-74.24150032655452, 40.531122852046515], [-74.24149964476034, 40.53114343966333], [-74.24150339439726, 40.53117543685631], [-74.24150594015053, 40.53122310858367], [-74.24150791783289, 40.53124281224186], [-74.24150791145638, 40.531273252933325], [-74.24153092332183, 40.53147007429744], [-74.24171924066692, 40.53160972765347], [-74.24166784213212, 40.53192331944759], [-74.24181061621529, 40.532562675421495], [-74.24217799663231, 40.53257613847663], [-74.2422820033816, 40.53338749651771], [-74.24226378911352, 40.53340449794598], [-74.24224602776077, 40.533417243972124], [-74.24222972576077, 40.53342565004783], [-74.24220533806516, 40.53343668079572], [-74.24218127234485, 40.53344658505237], [-74.24215971270046, 40.53345354737153], [-74.24213691846245, 40.5334577406616], [-74.24211947619509, 40.53345947872177], [-74.24209589720769, 40.533465128998316], [-74.24207044355147, 40.533479400837194], [-74.24205252795593, 40.53349922767831], [-74.24202074376123, 40.533533688413996], [-74.24202006073193, 40.53353443318785], [-74.24199777336811, 40.53355879708958], [-74.24198757151014, 40.53357248725974], [-74.24197674772847, 40.53359367322798], [-74.2419705278025, 40.5336145755794], [-74.24196458870446, 40.53363371843315], [-74.24196285953305, 40.53365293584444], [-74.24196506450933, 40.53366555681744], [-74.24197061665066, 40.53367902330007], [-74.24198641905005, 40.53371102153858], [-74.24199835147876, 40.533728041133706], [-74.24201329191379, 40.53376078284408], [-74.24201538293059, 40.533772005341945], [-74.24201178363337, 40.53379133659616], [-74.24200867165067, 40.53380638523953], [-74.24200316414962, 40.533825142367135], [-74.24200254007258, 40.53384180528584], [-74.24200030699468, 40.533860722371756], [-74.24199689844578, 40.53387294405587], [-74.24198920997155, 40.5339159161509], [-74.24199085844428, 40.53396361772721], [-74.24199307588103, 40.533990045719776], [-74.2419915502286, 40.53401598755378], [-74.24198995216875, 40.53404121636184], [-74.24198749133386, 40.53406721561944], [-74.24199017398918, 40.53410248038075], [-74.24199354944761, 40.53413096455008], [-74.24199960338497, 40.53416317549091], [-74.24201801113493, 40.53422972664229], [-74.24202357895064, 40.53425702543217], [-74.24202759488945, 40.534273431461195], [-74.24203508673898, 40.534305913281365], [-74.24204056270793, 40.53432791577956], [-74.24204570286014, 40.53434637705037], [-74.24205318205567, 40.534365053525036], [-74.2420650025183, 40.53438064665695], [-74.24208466577947, 40.53439611452342], [-74.24209753548908, 40.534403855283955], [-74.24211323214699, 40.53441672238595], [-74.24212310699538, 40.534431716169024], [-74.2421333557727, 40.53445022161224], [-74.24214184326114, 40.53446955468544], [-74.24214917360845, 40.534486832753515], [-74.24215801441201, 40.53451428864594], [-74.2421726750232, 40.53454881562928], [-74.24219707950309, 40.53459235196281], [-74.24220899621434, 40.534604733982555], [-74.2422268606484, 40.534620340649326], [-74.24224858034931, 40.53463780681127], [-74.24226480041055, 40.53464639187509], [-74.24228246325006, 40.534655988960736], [-74.24230272455779, 40.534667885615065], [-74.24232111615434, 40.53467989711757], [-74.2423293469989, 40.53468789408062], [-74.2423437314585, 40.53470581497255], [-74.2423552326689, 40.53472319278325], [-74.24236610201426, 40.53473423256332], [-74.24238253031106, 40.534740345757385], [-74.24240487331872, 40.53474112149672], [-74.24243453514485, 40.53473617417267], [-74.24246309099699, 40.534733779664535], [-74.2424874171602, 40.5347358698341], [-74.24251134992089, 40.53473834447487], [-74.24253258828735, 40.534741675188435], [-74.24254166365212, 40.5347443460579], [-74.24254649044343, 40.53474617534856], [-74.24256127113148, 40.53475448782329], [-74.2425802425302, 40.53476754110567], [-74.24258552957421, 40.5347874024312], [-74.24258647897008, 40.53480117999623], [-74.24258604604269, 40.53481075981608], [-74.24258473066882, 40.53482500723167], [-74.24258240637627, 40.534838600058514], [-74.24257987310271, 40.53485468903216], [-74.24257702716523, 40.53486334113914], [-74.24257356089763, 40.53487948854179], [-74.24257151644906, 40.53489129573698], [-74.24257216705958, 40.53490224668443], [-74.242577236085, 40.53491079880568], [-74.24258619672483, 40.53492123764424], [-74.24259345306332, 40.53492860689938], [-74.24260331267001, 40.534938988384425], [-74.24261556299494, 40.5349541962356], [-74.2426264124883, 40.53496984631141], [-74.24263737229158, 40.53498618286158], [-74.24267503288957, 40.53501404554913], [-74.24268242294441, 40.5350182026167], [-74.24269465731116, 40.5350288255119], [-74.24270423424771, 40.53504099229081], [-74.24271165713903, 40.53505437135167], [-74.24271970002911, 40.5350694783535], [-74.2427319143922, 40.535084685765604], [-74.24274328722593, 40.535096053810946], [-74.24275634772646, 40.53510590648935], [-74.24276764529407, 40.53511656050795], [-74.24278130109536, 40.535132039282225], [-74.24278977364749, 40.5351467622278], [-74.24279405511268, 40.53515677067429], [-74.24279612716543, 40.53517257700573], [-74.24280270365348, 40.53520053285709], [-74.24280937879699, 40.535216054535645], [-74.24282052968051, 40.53522530947483], [-74.24283261641799, 40.53523450597588], [-74.24284499756185, 40.535246528431365], [-74.24285891554203, 40.53526483556585], [-74.24286242837516, 40.53528091276108], [-74.24286096382339, 40.535293733635676], [-74.24285585200917, 40.53530291273569], [-74.24284899763335, 40.53531747476564], [-74.24284699248214, 40.53532999539569], [-74.24284936584534, 40.53533940459772], [-74.24285776172391, 40.5353534403217], [-74.24287082219774, 40.53536326718737], [-74.24288545359322, 40.53537020752436], [-74.24290036605781, 40.53537533676008], [-74.24293260577885, 40.53538652175481], [-74.2429642070392, 40.53540056331801], [-74.24298366574534, 40.53540933358431], [-74.24299170999932, 40.53541524480202], [-74.24299898376137, 40.535427197970556], [-74.24299991637959, 40.53543633513325], [-74.24300083073786, 40.53545011276851], [-74.24300563383345, 40.5354650344494], [-74.24301549236591, 40.535475443376235], [-74.24303042250862, 40.535485183338615], [-74.24305122739914, 40.53549809495174], [-74.24306922463569, 40.53551049081463], [-74.24309258925146, 40.53553495260091], [-74.24310053967928, 40.53554476278485], [-74.24311505623017, 40.53555947123331], [-74.2431294223359, 40.535572780614245], [-74.24314182828353, 40.535580905885354], [-74.24316470983092, 40.53559123344184], [-74.24318048317238, 40.53559559285711], [-74.24319384356232, 40.535599049364784], [-74.24321874959297, 40.535602181198016], [-74.24323948336036, 40.53560518398754], [-74.24324891409962, 40.53560675487901], [-74.24325746299479, 40.53561296756952], [-74.24326300040917, 40.53562184970851], [-74.24326514821085, 40.535629174292325], [-74.24326671547483, 40.53564465131399], [-74.24326787177671, 40.535655930551044], [-74.24327127497509, 40.53567129378235], [-74.24329169749858, 40.53570761941968], [-74.24330785790092, 40.5357293236269], [-74.24332702417657, 40.53575670494126], [-74.24334122131087, 40.5357825035674], [-74.24335015493348, 40.535795769651926], [-74.24336545657813, 40.53580866472732], [-74.24337631463281, 40.535816931634365], [-74.24339700266204, 40.53582707113402], [-74.24342147422972, 40.535839123348126], [-74.24343986400719, 40.535850612146916], [-74.24345994865153, 40.535863223657884], [-74.24347756002385, 40.53587874941399], [-74.24349756433074, 40.535898717363125], [-74.243509230276, 40.53591090762173], [-74.24352601537694, 40.53592649007294], [-74.2435434797697, 40.53594077992129], [-74.24356451801341, 40.53595854917024], [-74.24358815483109, 40.53597861913009], [-74.2435977918341, 40.535986640493775], [-74.24361438955523, 40.53600038367467], [-74.24362902598611, 40.53601852450827], [-74.24363519206028, 40.53603226251381], [-74.24364417849382, 40.536050111601604], [-74.24365012038768, 40.536061381851795], [-74.2436634809121, 40.53607472027231], [-74.24368184908076, 40.53609019011083], [-74.24370362672205, 40.536103318001324], [-74.2437529283142, 40.536127120647656], [-74.24378788666591, 40.53614376297539], [-74.24382561145472, 40.53615995964942], [-74.24384799441027, 40.53617124824739], [-74.24386744479503, 40.53617716315568], [-74.24389476550634, 40.536181414514985], [-74.24395963908158, 40.536184102762945], [-74.24399257458947, 40.53618861775649], [-74.24401106699915, 40.53618877061383], [-74.2440318597577, 40.53618820489821], [-74.24405365117141, 40.53618541375559], [-74.24407177057256, 40.5361819157287], [-74.24409007631027, 40.53618025779554], [-74.24410512126268, 40.53618214772186], [-74.24410657006209, 40.53618280890089], [-74.24411643737697, 40.53618731041337], [-74.24412495988494, 40.53619629572903], [-74.24412917042217, 40.53620647063417], [-74.24412742566432, 40.536221268982885], [-74.24412154393605, 40.536226496050546], [-74.24410856024129, 40.53623736574279], [-74.24405447420418, 40.53628271653438], [-74.24403478981334, 40.536310809887986], [-74.24401667277039, 40.53633481014676], [-74.24399742170681, 40.53636317765834], [-74.24398566896939, 40.536386204268005], [-74.2439810016812, 40.53640820075141], [-74.2439781094152, 40.53644388960205], [-74.24397655106576, 40.53646049855919], [-74.24397853958942, 40.53649255385095], [-74.24397902720065, 40.53651791445383], [-74.24398467190872, 40.53654669629945], [-74.24399781122841, 40.53657807016859], [-74.24401049848484, 40.53660458509813], [-74.24402676361241, 40.536635182181925], [-74.24404541744622, 40.53666964548594], [-74.24406472844545, 40.53670679625804], [-74.24408173920085, 40.53674469357534], [-74.24408936949494, 40.53676507137154], [-74.24410176970596, 40.536801112027725], [-74.2441114292604, 40.53682565819567], [-74.2441234626623, 40.53685006210767], [-74.2441304943149, 40.53686434657369], [-74.24414782538688, 40.53688140991704], [-74.24416391650671, 40.53689367312391], [-74.24420135328856, 40.5369193679386], [-74.24422130941736, 40.536926187550065], [-74.24425651926259, 40.5369333298733], [-74.24428706720578, 40.53693400653993], [-74.24432494105498, 40.53693153796755], [-74.24434400016689, 40.53692921982802], [-74.2443854947254, 40.53692284576036], [-74.24442018769184, 40.53691654060487], [-74.24445168170107, 40.53691046188257], [-74.24448207754243, 40.5369092991662], [-74.24450047479363, 40.53691285687483], [-74.24451809478832, 40.536920394587796], [-74.24455422515392, 40.53693269614596], [-74.24456599437316, 40.53693418237163], [-74.2445875391072, 40.53693292707279], [-74.24467423232045, 40.536900380951046], [-74.2447035632394, 40.53689287991006], [-74.24472875618339, 40.536875809447686], [-74.24475018625944, 40.53685284506122], [-74.24475859495932, 40.53684072136587], [-74.24477092868717, 40.53681917675573], [-74.24478134347447, 40.53679469707654], [-74.24478634953924, 40.53677635100323], [-74.24479242459034, 40.536764974441624], [-74.2448009435216, 40.53675345546139], [-74.24481636013888, 40.53673909519447], [-74.2448285534017, 40.5367283088631], [-74.24483927779454, 40.536719420770524], [-74.24485718066998, 40.53670552126647], [-74.2448864243409, 40.53668484524545], [-74.24490555051072, 40.53667118956239], [-74.24491981038628, 40.53666517544923], [-74.24493693114462, 40.53666387691708], [-74.24495564760973, 40.53666647140767], [-74.24498370121022, 40.536674041738905], [-74.24500424061648, 40.536682973369906], [-74.24506311067748, 40.53670620670757], [-74.24508662785047, 40.53671249704461], [-74.2451085251395, 40.53671890123793], [-74.24513716051963, 40.536728584192375], [-74.2451678287269, 40.53674243397901], [-74.2451719678184, 40.5367446928365], [-74.24518862824804, 40.53675378215509], [-74.24521393085166, 40.53676640751344], [-74.24523301385155, 40.53678061407116], [-74.24524710649037, 40.536797243895386], [-74.24525506330733, 40.536808727716135], [-74.24529835540645, 40.53686103448748], [-74.24532046399311, 40.53688580056195], [-74.24533651176053, 40.53690599443462], [-74.24534237855728, 40.53691668778189], [-74.24534807468928, 40.536929520860824], [-74.24535239770356, 40.53694090203701], [-74.24535342151941, 40.536955228417256], [-74.24535885752975, 40.536985548238725], [-74.24536014307084, 40.5370029190981], [-74.24535957048438, 40.537013350617215], [-74.2453529824317, 40.537031810498874], [-74.24534240123023, 40.53705948171078], [-74.24529455875826, 40.537118337963975], [-74.24526133913146, 40.53715221311302], [-74.24524202938359, 40.537163910477545], [-74.24522190891928, 40.53717249534176], [-74.24520736973874, 40.53717679792458], [-74.24517157497509, 40.53718541625423], [-74.24508434623642, 40.53721208121983], [-74.24499824648248, 40.537241307432495], [-74.24497924473512, 40.53724988819152], [-74.24496024612203, 40.53725932535773], [-74.24494125711304, 40.53727132454766], [-74.24492227413629, 40.53728503152971], [-74.2449044145952, 40.53729958968117], [-74.2448854472566, 40.53731756865711], [-74.24484083543769, 40.53736378835734], [-74.24480069599326, 40.537409145437984], [-74.24478733358518, 40.53742882025493], [-74.24477620246829, 40.537446780327286], [-74.24468497417264, 40.53760414338847], [-74.2445981785753, 40.53774953657848], [-74.24459372136184, 40.53775552541253], [-74.24458926480835, 40.53776151474761], [-74.24457587413374, 40.537773501949964], [-74.24452673493828, 40.53780691892311], [-74.24451222079375, 40.53781805427171], [-74.24450106630034, 40.537829182463874], [-74.24449660594615, 40.53783431655903], [-74.24449326969713, 40.53784030182943], [-74.2444754911651, 40.53787707096217], [-74.24446107385107, 40.53791468432656], [-74.24445001843112, 40.53795314527303], [-74.24444344211138, 40.537991596682474], [-74.2444413433647, 40.538030039061326], [-74.24444259671773, 40.538066765992895], [-74.24444832584695, 40.53810262865369], [-74.24445852742087, 40.53813677448637], [-74.24447097502853, 40.53817262166843], [-74.24448112799658, 40.538193954854066], [-74.24449238967784, 40.538211868218845], [-74.24449913627772, 40.53821954217152], [-74.24450588133934, 40.53822721545689], [-74.24456877240652, 40.53828004014483], [-74.24459346801181, 40.53829792438101], [-74.24465294390939, 40.538335382005464], [-74.24467763731083, 40.538352412659194], [-74.24470122267977, 40.53837286178785], [-74.24470909749752, 40.53838309537064], [-74.24471697231894, 40.538393329288], [-74.24471810829422, 40.53839759839728], [-74.24471924206769, 40.53840186583577], [-74.24472038116701, 40.53840698800471], [-74.24472039993405, 40.53841211306407], [-74.2447170786649, 40.5384223715143], [-74.2447104398981, 40.53844373929485], [-74.24469936577053, 40.538477075707036], [-74.24469938140453, 40.53848134552875], [-74.2446982773697, 40.538485619914695], [-74.24469942831634, 40.53849415767438], [-74.24470736323296, 40.5385206206661], [-74.24471526089539, 40.53853768760958], [-74.24472651957181, 40.538554747388716], [-74.244742256741, 40.53857179594525], [-74.24476246594462, 40.53858712883374], [-74.244781548778, 40.53860075463676], [-74.24480511077407, 40.538614370886506], [-74.24483866257475, 40.53864321162583], [-74.2449002703978, 40.53869616786689], [-74.24494469027066, 40.53874185506519], [-74.24497182440861, 40.538773199632864], [-74.24500274436116, 40.53881641839824], [-74.24504955187172, 40.53887560728864], [-74.24514012678458, 40.53897886632851], [-74.24518150342622, 40.5390579380785], [-74.24523157838199, 40.53914448521872], [-74.24527100769255, 40.53924187018983], [-74.24533131467827, 40.53940088562488], [-74.24530650812298, 40.539444829489995], [-74.24530622799543, 40.53945693367854], [-74.2453161460591, 40.53947349115843], [-74.24533072729713, 40.53948589463464], [-74.24535392271066, 40.539502423238325], [-74.24537245551109, 40.539523134488796], [-74.24538824752979, 40.53954209603954], [-74.2453961907736, 40.53955953559392], [-74.24539945360863, 40.5395761347652], [-74.24540210010908, 40.53959155449746], [-74.24538703564416, 40.539604185504395], [-74.24536803597358, 40.539622891372765], [-74.24536604154534, 40.53963823926825], [-74.245380975995, 40.539658792853935], [-74.24540252861892, 40.539688693405225], [-74.24541723984652, 40.539717042833814], [-74.2454232990036, 40.53975062598475], [-74.24542947177184, 40.53977561925901], [-74.24543254761085, 40.53980001302665], [-74.24542908073475, 40.53984547469635], [-74.24542566851939, 40.53989601527693], [-74.24542188311162, 40.539972301430694], [-74.24541276701893, 40.54021356393066], [-74.2454296977673, 40.54038576486477], [-74.24545378722227, 40.54051850790558], [-74.24547647854257, 40.540633000791615], [-74.24551910321269, 40.54075760692807], [-74.24559250992388, 40.54092675074652], [-74.24560205698324, 40.54094959457726], [-74.2456077070552, 40.540959766346376], [-74.24562047939826, 40.540969538061745], [-74.24563856476077, 40.54097622371919], [-74.24568077627616, 40.540988485109445], [-74.24570589382073, 40.540999053143075], [-74.2457307294372, 40.5410115993066], [-74.24575714989656, 40.54102444346048], [-74.24578384879587, 40.54103531182544], [-74.24580741667182, 40.541045580761235], [-74.24582363793573, 40.54105394518426], [-74.24583169314688, 40.54106282063416], [-74.24584508121524, 40.54108307675139], [-74.24599284790568, 40.54127893215782], [-74.24604749879236, 40.54136651267769], [-74.24606137187132, 40.54140156236368], [-74.24608152745897, 40.54146237133473], [-74.24610313832198, 40.54153712143066], [-74.24614764964227, 40.54168464315558], [-74.24619797483028, 40.54180914959795], [-74.24621414027527, 40.54184134029696], [-74.24626027017561, 40.54193061177822], [-74.24632094551905, 40.542022103147715], [-74.24635676349392, 40.54206635625875], [-74.24640677149628, 40.54212419161222], [-74.24646660694735, 40.5421927392043], [-74.24648614815786, 40.54221339265563], [-74.2465138936479, 40.542234331050516], [-74.24653391966409, 40.54224013504272], [-74.24657486530842, 40.54225014754582], [-74.24659287581972, 40.54226243527179], [-74.24662220136648, 40.54227783118101], [-74.24664837060041, 40.54229751360104], [-74.24676193481058, 40.542366799685], [-74.24677815425639, 40.54242325599929], [-74.2468625313222, 40.54251010144365], [-74.247677780396, 40.54312540330281], [-74.24792244709678, 40.54304911927136], [-74.24803463735688, 40.54309324044144], [-74.24770573967564, 40.54352432645975], [-74.24761962158414, 40.543509361402414], [-74.24618422383882, 40.54563362585427], [-74.24363807144752, 40.547666195235365], [-74.24360202725677, 40.54763781110733], [-74.24336648769979, 40.547808507519036], [-74.2434020856379, 40.54783551137688], [-74.24336346552776, 40.54786513523582], [-74.2432987867762, 40.5478283445317], [-74.24334063308854, 40.547798715030595], [-74.24335033310243, 40.547803617528395], [-74.24358447651343, 40.547623990878584], [-74.24293585929026, 40.547113219245205], [-74.24266546073754, 40.54701079971151], [-74.24231726803761, 40.54696401276844], [-74.24229800775315, 40.54696132400164], [-74.24222961262026, 40.54695380913411], [-74.2422031846343, 40.54694867830012], [-74.24211830776133, 40.546949845386756], [-74.24204967635752, 40.54695597326009], [-74.24196459767579, 40.54697152299089], [-74.24190290276809, 40.54697568895227], [-74.24185443321967, 40.54698495832039], [-74.24179850544289, 40.54700162778557], [-74.24172117606939, 40.54705051065865], [-74.24169335448103, 40.54706835560555], [-74.24160691885201, 40.54709601318317], [-74.24150964965952, 40.54713321742604], [-74.24145107546943, 40.54716476933668], [-74.24140253504106, 40.5471841400858], [-74.24133944836846, 40.54721128113128], [-74.24128029509164, 40.54723163475298], [-74.24122936796708, 40.54725812060806], [-74.24117275175594, 40.547283738350906], [-74.24112113404507, 40.5473083306699], [-74.24107266988072, 40.54733933846189], [-74.24101667065474, 40.54736610928511], [-74.24097422534163, 40.547380086647735], [-74.24093642651823, 40.54739498856361], [-74.24086739059267, 40.5474290593352], [-74.24082703907891, 40.54745456103449], [-74.24076977132052, 40.54748918353885], [-74.24072363579138, 40.54750723132931], [-74.24063341370834, 40.54754326727555], [-74.24057633072829, 40.54756929849615], [-74.24045847559482, 40.5476254843001], [-74.24039182810051, 40.547663310173775], [-74.24035341572257, 40.547687956758296], [-74.2403130059051, 40.54771774081376], [-74.24027644117172, 40.54774575907879], [-74.24023730218572, 40.54777858665622], [-74.2402039240967, 40.547802152137876], [-74.24012539879432, 40.54785965621242], [-74.24003491309954, 40.547909039731046], [-74.23998281879149, 40.54794023641819], [-74.23996167162653, 40.54795780799162], [-74.23994072994779, 40.54797731796285], [-74.23991253323271, 40.54800475706341], [-74.23987753787303, 40.54802838999228], [-74.23984372828757, 40.54804316962737], [-74.23981864192723, 40.54805578178583], [-74.23979131363885, 40.54807536219499], [-74.23975764471815, 40.54810346588541], [-74.23970065441213, 40.54814472315815], [-74.23962496620842, 40.54821055309667], [-74.23959313085258, 40.54823984422175], [-74.2395420884618, 40.54827292758687], [-74.23949951309932, 40.548293453106666], [-74.23945746357062, 40.548314921883666], [-74.2394274566754, 40.54833336824826], [-74.23939195750437, 40.548360284839184], [-74.23934085340967, 40.54841678532668], [-74.23931414637477, 40.5484542133651], [-74.23930273251601, 40.54848711518694], [-74.23928907288798, 40.54851495422356], [-74.23926751220235, 40.54852864853235], [-74.23924448067316, 40.54852454745696], [-74.23922270854456, 40.54852427333402], [-74.23918633439715, 40.54853498193105], [-74.23915003219383, 40.54855837041808], [-74.23912563695845, 40.54858947669096], [-74.23910193115216, 40.54862704334345], [-74.23906950439633, 40.548678810109344], [-74.23902299983374, 40.548730473317214], [-74.2388802047475, 40.5488586741483], [-74.23876882860974, 40.548941675243746], [-74.23870672648498, 40.54896698971901], [-74.23865414487864, 40.54898163177885], [-74.23858723148467, 40.54899781203674], [-74.23852526847641, 40.54902441728221], [-74.23847241578378, 40.54906054025084], [-74.23841922458453, 40.549105462600856], [-74.23837191304226, 40.549141566814335], [-74.2383301218049, 40.5491854570921], [-74.238281079861, 40.54924931059415], [-74.23822562357557, 40.54930900687669], [-74.23814886177914, 40.54939278761239], [-74.23810087098671, 40.54945852675722], [-74.23801045315936, 40.54959421002949], [-74.2379484587301, 40.54968455469139], [-74.23790310005221, 40.54974297609282], [-74.23781194433836, 40.54989605190748], [-74.23780980173328, 40.549899651549325], [-74.23776472013473, 40.54997268902288], [-74.23771157820656, 40.550038095562854], [-74.23766529763601, 40.550083889823725], [-74.23761963467327, 40.55012346857852], [-74.2375608091404, 40.55016353676152], [-74.23751715838253, 40.550189981109085], [-74.2374649628325, 40.55020427319092], [-74.23740672481237, 40.55020983549643], [-74.23736517465862, 40.55021598850419], [-74.23731918162642, 40.55022046599173], [-74.23726283898992, 40.550215828903355], [-74.23722616127561, 40.550207696016955], [-74.23719811959242, 40.55021658899718], [-74.23717117913401, 40.550235820516654], [-74.23713313596454, 40.55026289226511], [-74.23708755767899, 40.55027124596175], [-74.2370364339829, 40.55026758507707], [-74.23698467413543, 40.550277948790786], [-74.23693199895314, 40.55028771863119], [-74.23688278114177, 40.55029792275851], [-74.2368179273547, 40.55032145500105], [-74.23675493076693, 40.55035039947159], [-74.23669255497087, 40.5503851599568], [-74.23662978347146, 40.55039620493579], [-74.2366031550018, 40.55040096003787], [-74.2365461090008, 40.55041114664288], [-74.23650170138596, 40.550430484847816], [-74.2364594704942, 40.55046627256133], [-74.23641623448965, 40.55050862684339], [-74.2363957993608, 40.55054891677277], [-74.23638071914459, 40.55057944389345], [-74.23635240725108, 40.55060981479951], [-74.2363223550692, 40.55064387176757], [-74.23629187216656, 40.550693890746544], [-74.23628213170987, 40.55074652574997], [-74.23628500667785, 40.5508055334556], [-74.23628945987022, 40.550855337809296], [-74.23626812002584, 40.5509493896076], [-74.23624608904953, 40.55105278884636], [-74.23624167918048, 40.55107244438619], [-74.23622070827703, 40.55115875818671], [-74.2362096640445, 40.551202344526395], [-74.23619753075485, 40.55125447330632], [-74.2361865266174, 40.55130916281124], [-74.23617995866755, 40.55135188520049], [-74.2361767365552, 40.55139118392412], [-74.23617462444652, 40.55142706190519], [-74.23617582954002, 40.55145097725124], [-74.2361803753202, 40.55146975946146], [-74.23618942977693, 40.551497073772744], [-74.23622267338287, 40.55158194053545], [-74.23626103691412, 40.55166554111604], [-74.23630443796945, 40.551747695907174], [-74.2363527833242, 40.55182822840692], [-74.23640007645811, 40.55185870042274], [-74.23644130027343, 40.551893929995714], [-74.23647564009453, 40.551933220918755], [-74.23650241728404, 40.551975796723184], [-74.23652110265431, 40.55202081602275], [-74.23653132692615, 40.55206738914062], [-74.23653288802811, 40.55211459569195], [-74.23652575509128, 40.5521615027716], [-74.23651006906039, 40.55220718339062], [-74.23648613990993, 40.55225073479604], [-74.23645444051985, 40.552291296311246], [-74.23641559733107, 40.55232806634515], [-74.236370377967, 40.552360318234236], [-74.23489865800803, 40.55300521667134], [-74.23488455116241, 40.55300565178594], [-74.23486887015231, 40.55300482961923], [-74.23483637407898, 40.55299891624189], [-74.2347870569584, 40.55298620535422], [-74.23477472348716, 40.55298195904458], [-74.23476014439508, 40.55297600901609], [-74.2347107919558, 40.55295304731452], [-74.23469060684636, 40.55294540260436], [-74.23466818577356, 40.55293861435205], [-74.2346581018197, 40.552936927151684], [-74.23464802086423, 40.55293609351202], [-74.23460434130727, 40.55293447394033], [-74.2345685074059, 40.55293454713789], [-74.23456067074976, 40.5529354172145], [-74.23453828333646, 40.55293802548362], [-74.23453044368168, 40.55293804149403], [-74.23452708414345, 40.552938048354854], [-74.23452372226804, 40.552937201652725], [-74.23452035973143, 40.55293635428167], [-74.23451699485459, 40.55293465234248], [-74.23451362931992, 40.5529329507396], [-74.23451026378798, 40.5529312498067], [-74.2344911722997, 40.55291591334802], [-74.23448443889805, 40.55291165674524], [-74.23442608142095, 40.55287590057867], [-74.23437110451499, 40.55284611731526], [-74.23435091567323, 40.55283676189962], [-74.23432737110322, 40.55282912280845], [-74.23430159423013, 40.55282319607221], [-74.23422650945938, 40.55280711922143], [-74.23420521117521, 40.552801183831754], [-74.23418615061145, 40.55279438913461], [-74.2341502629073, 40.55277908804181], [-74.23413904045152, 40.55277227685298], [-74.23413454837392, 40.55276886939518], [-74.23413117753192, 40.55276545998652], [-74.23412668245935, 40.552761197626616], [-74.23412330862575, 40.55275693415352], [-74.23411203164893, 40.552734748803395], [-74.23410865482435, 40.55272963109826], [-74.23410528033038, 40.55272536645317], [-74.23407943768392, 40.552700648245334], [-74.23402778170795, 40.55265975362766], [-74.23398398867991, 40.55262567536108], [-74.23394020898154, 40.55259501500707], [-74.23389532026982, 40.55256777284106], [-74.23384932109046, 40.55254309563204], [-74.23382688696724, 40.55253289163134], [-74.23380333579374, 40.55252268990046], [-74.23377755011934, 40.552514200518914], [-74.23374952550594, 40.55250571568869], [-74.23368676337617, 40.55249132221388], [-74.23360048067302, 40.552475268745255], [-74.23356462611525, 40.55246936234264], [-74.23353549801199, 40.55246600479625], [-74.23350973947808, 40.552465202434355], [-74.23348622564309, 40.55246610498369], [-74.23345711931373, 40.5524687262001], [-74.23342913886752, 40.55247305510378], [-74.23340452091124, 40.552478229729395], [-74.23338102628746, 40.55248425680714], [-74.23335977547116, 40.55249198712617], [-74.23334188482498, 40.55249971061369], [-74.23332400080318, 40.55250914356582], [-74.2333094786134, 40.55251942275053], [-74.23318551828129, 40.55261704975135], [-74.23299007634827, 40.55276863545614], [-74.23295545476876, 40.552795184380805], [-74.23291523611293, 40.552822598884404], [-74.23281579691063, 40.552887718230636], [-74.23281020734505, 40.55289029210781], [-74.23280350017373, 40.55289372131527], [-74.2327889597488, 40.552898876551694], [-74.23273637215114, 40.5529117953626], [-74.23271847305598, 40.55291695672651], [-74.23270282250361, 40.5529246767473], [-74.23269611466445, 40.552928105949704], [-74.23269165371474, 40.55293324007988], [-74.23264143423904, 40.55298288476353], [-74.23255553103091, 40.55307616295529], [-74.23239598706299, 40.55324646599035], [-74.23229112933166, 40.55336369797566], [-74.2322665927849, 40.55339279000899], [-74.23224430607304, 40.553424438860034], [-74.23222314817686, 40.55345864863974], [-74.23220311678335, 40.553494564445494], [-74.23218421497464, 40.55353389474701], [-74.23216532632797, 40.553576640126565], [-74.23214645415379, 40.55362451273828], [-74.23212315508638, 40.55368691449199], [-74.2320998330062, 40.55374333628832], [-74.2320603723538, 40.55380877735871], [-74.23200263530478, 40.553896012849336], [-74.23196648230734, 40.55396419202273], [-74.2319554487189, 40.55402152010054], [-74.23195537304143, 40.554078235835654], [-74.23193331444939, 40.55414983011715], [-74.23188707136137, 40.55421332002535], [-74.2318159763953, 40.554276094802326], [-74.2316830032468, 40.55441163222109], [-74.23156232580645, 40.55453177913723], [-74.23150063118818, 40.554588938073046], [-74.23135620243775, 40.55474173339223], [-74.23121793211067, 40.55486078404755], [-74.23114456149608, 40.554945800970614], [-74.23106943792601, 40.55504383345953], [-74.23098961854346, 40.55514725306872], [-74.23087472791508, 40.55535130375602], [-74.23084007911194, 40.55544809858915], [-74.23078781040344, 40.55550824217585], [-74.23075511246024, 40.55553665854542], [-74.2307103619811, 40.55555759425892], [-74.23065576101537, 40.55557521420864], [-74.23060876282467, 40.55557864294688], [-74.23055514386452, 40.555563741384155], [-74.23050804631487, 40.55553798799348], [-74.23045979656835, 40.55549555823949], [-74.23042469847942, 40.55546227587576], [-74.23034473534743, 40.55541657366522], [-74.23024952153503, 40.55538674616261], [-74.23017519392035, 40.555390231187246], [-74.23004306465734, 40.55543468860076], [-74.2299262674491, 40.55548620505377], [-74.22978862412833, 40.555516498968814], [-74.22968040863911, 40.55552088426538], [-74.22960496893391, 40.555518532877954], [-74.22947149429736, 40.55548961568595], [-74.22937963425443, 40.55548145986459], [-74.22931954185714, 40.55549158696269], [-74.2292737490792, 40.55552753391468], [-74.22924873918484, 40.555566774391956], [-74.22924779391403, 40.555610136159096], [-74.22925226143867, 40.55563764343743], [-74.22926986460222, 40.555670128961175], [-74.22928356407323, 40.55567348226014], [-74.22929656579723, 40.5556781815328], [-74.229308643603, 40.555684145033204], [-74.22931958739098, 40.55569126902325], [-74.22933099923318, 40.55570121788776], [-74.22934020126353, 40.555712419699404], [-74.2293469612076, 40.55572459170768], [-74.22935110843282, 40.555737426672664], [-74.22935253825536, 40.55575060062033], [-74.22933656131292, 40.55578528386582], [-74.22931328089027, 40.555817472830036], [-74.22928333871313, 40.55584628020908], [-74.22924756014524, 40.55587091191282], [-74.22923558767849, 40.55587679894113], [-74.22922255551687, 40.55588118553646], [-74.22920878432424, 40.55588396376424], [-74.2291946129487, 40.55588506526435], [-74.22918039008535, 40.55588446293385], [-74.22916646569585, 40.55588217159345], [-74.22915318239791, 40.55587824762296], [-74.22914086703469, 40.55587278757387], [-74.22910541631074, 40.55591556547958], [-74.22909039712206, 40.55593690078144], [-74.2290729956406, 40.55596361839081], [-74.22907639765481, 40.555999466625074], [-74.2290830609419, 40.55602947176305], [-74.22907443408064, 40.55606451002411], [-74.22905162187638, 40.55610708210507], [-74.22899926815344, 40.5561422082308], [-74.22894905874807, 40.556165655703246], [-74.22890104752673, 40.55619243379969], [-74.2288159888303, 40.5562551428902], [-74.2287242997478, 40.5562970171392], [-74.22862814038024, 40.55631055005351], [-74.22854505831708, 40.55631154871156], [-74.22848274556276, 40.55631250716475], [-74.22846525096287, 40.556311707499106], [-74.2284412209779, 40.55631759239245], [-74.22841287834882, 40.55634183009893], [-74.22839545566364, 40.55636187675416], [-74.22836927678098, 40.55637944009232], [-74.22833214371997, 40.55639035431146], [-74.228267637297, 40.556388814775374], [-74.22821296402216, 40.55638558739673], [-74.22816154992299, 40.55637651692663], [-74.22810792998999, 40.55636161422416], [-74.22807285538782, 40.55633500148823], [-74.22804538468095, 40.55629419722321], [-74.22801360696909, 40.55627258121726], [-74.22797312564695, 40.556263488956944], [-74.2278330723504, 40.55622874465361], [-74.22770173052456, 40.55618397916714], [-74.227632728344, 40.556146591495], [-74.22755928210492, 40.55608836862556], [-74.2274368273054, 40.55603853351635], [-74.22724124339234, 40.5560354117492], [-74.22708256217496, 40.55605853939567], [-74.22692497792441, 40.556101244097164], [-74.2269023090303, 40.556107386824], [-74.22687006826537, 40.55611078705189], [-74.2268383534228, 40.55610709751937], [-74.2267957140918, 40.55610634675829], [-74.22676949190152, 40.556110985686836], [-74.22673731479559, 40.55613314664004], [-74.2266734121504, 40.55614828082246], [-74.2266100107086, 40.556150073704586], [-74.22657942850441, 40.55615847286758], [-74.22657299342214, 40.556195174378374], [-74.22653700730443, 40.5562306798821], [-74.22647661167676, 40.556253862064366], [-74.22640494542956, 40.556255712845854], [-74.22637020813472, 40.5562498014911], [-74.22633201675346, 40.55621570978148], [-74.22618692147473, 40.55622908896703], [-74.22611420492586, 40.55625236709394], [-74.22606854510708, 40.55621187928375], [-74.2239033413449, 40.55589706554456], [-74.22386421498082, 40.55609769408288], [-74.22344265106311, 40.556046569903536], [-74.22347210933358, 40.55594586956392], [-74.22371910444984, 40.55598110029811], [-74.22375741210328, 40.555981025669496], [-74.22377438375146, 40.555964760418526], [-74.22378606709124, 40.555880268009716], [-74.2231947052717, 40.55579556099059], [-74.2231612894273, 40.555787142691706], [-74.22312986736561, 40.55576755796203], [-74.2231129667092, 40.55573684009674], [-74.22310353721308, 40.55568306927582], [-74.22309672573029, 40.55563694213429], [-74.22304228365793, 40.555595792857716], [-74.2230015599747, 40.55557561902706], [-74.22297119575062, 40.55553724065462], [-74.22297219698756, 40.55550337362143], [-74.22288310030724, 40.55547286003058], [-74.22281876589037, 40.55545396330237], [-74.22273960124298, 40.55543418896245], [-74.22265568834065, 40.555415330615595], [-74.22257486801371, 40.555406209779626], [-74.22251833048998, 40.55542682203717], [-74.22247482113684, 40.55545705660065], [-74.22242225993624, 40.555479367739565], [-74.22237077098863, 40.555487154576824], [-74.22232036636152, 40.555483835379874], [-74.22224752905595, 40.555470309396846], [-74.22222452335853, 40.555466121930344], [-74.22221727566942, 40.55546524335242], [-74.22219699760915, 40.55544589044549], [-74.2221224448784, 40.55541688471408], [-74.22201112709658, 40.55540271596946], [-74.22190184151718, 40.55539337577119], [-74.22179863887058, 40.555417070759], [-74.22174872671057, 40.55543934531281], [-74.22169675758535, 40.55550307048973], [-74.22166724221147, 40.55555519773824], [-74.22165396875167, 40.55558920370556], [-74.22160298618641, 40.55563621042137], [-74.22158844541158, 40.555646202680364], [-74.22157006613187, 40.55564898295767], [-74.22154450180608, 40.555634209189904], [-74.22149876696065, 40.555592055800304], [-74.22149377308864, 40.555562037124], [-74.22147280956294, 40.5555418487652], [-74.22145260819535, 40.55552907550155], [-74.22145469372055, 40.5554820906086], [-74.22146243021916, 40.5554513271694], [-74.22145446439751, 40.555412903527994], [-74.2214319532539, 40.555378779452894], [-74.22140054953707, 40.55536432047673], [-74.22134677624109, 40.55535844480241], [-74.22129864604456, 40.555366224685564], [-74.22125504247906, 40.55538766395928], [-74.22121375057472, 40.55543130541423], [-74.22120713936611, 40.55546377614885], [-74.22120284421428, 40.55551930599033], [-74.22119742494193, 40.55557398275408], [-74.22119312650432, 40.55562865735847], [-74.2211832282346, 40.55568334392007], [-74.22115976704038, 40.555700472841316], [-74.22109369280587, 40.55569974582382], [-74.22105338275364, 40.55570153122284], [-74.2210399857696, 40.555714369896684], [-74.22102448950054, 40.55576906654784], [-74.22101010859353, 40.555822907483076], [-74.22099013412594, 40.555878466984055], [-74.22097904527034, 40.55591180005441], [-74.2209432973211, 40.55593834800795], [-74.22086715093401, 40.55594020227767], [-74.22082231656412, 40.555928331013625], [-74.22076962266105, 40.55591049434238], [-74.22069567868726, 40.555901241526286], [-74.22062175949124, 40.55589882100512], [-74.2205534015105, 40.555885284170316], [-74.22052870386395, 40.55586739479367], [-74.22049941794982, 40.55581620030979], [-74.22046901559654, 40.55576586387414], [-74.22045714043932, 40.555748289115115], [-74.22044538227212, 40.555730887524305], [-74.22042290601576, 40.5557070145355], [-74.22041823823064, 40.555649794625886], [-74.22040587158548, 40.55563529615935], [-74.22033301478737, 40.555615790679816], [-74.22029711808946, 40.55559792106273], [-74.22028585305702, 40.55557744382515], [-74.22027782854286, 40.55552108391514], [-74.2202665585134, 40.55549975144269], [-74.22026655569555, 40.55549889670825], [-74.22021943697257, 40.55547336145939], [-74.22018456182457, 40.55542559489575], [-74.22017880896205, 40.55537862790275], [-74.2201831028014, 40.55532224436833], [-74.22018179076905, 40.55526416277169], [-74.22017936854516, 40.555208646349904], [-74.22016238732648, 40.55515315834145], [-74.22014316776007, 40.555097674118095], [-74.22013522631465, 40.555066939144595], [-74.22014369883041, 40.555060135076836], [-74.22014474318152, 40.55500592293347], [-74.22010627165115, 40.55492881342842], [-74.22005143156746, 40.554841907273676], [-74.21999334606815, 40.554764503767444], [-74.21992072431505, 40.55469843787539], [-74.21986518402704, 40.55465078550191], [-74.21980229197143, 40.55462156378432], [-74.21974356930723, 40.55461267207239], [-74.21967214720144, 40.55462683585811], [-74.21960026741088, 40.5546547233884], [-74.21956112618452, 40.5547021463243], [-74.21952987169979, 40.554718646998836], [-74.21948446867218, 40.55472216480092], [-74.21940883619042, 40.55472532972463], [-74.21932321285607, 40.55475453231532], [-74.21925552903423, 40.55474546698497], [-74.21917586317076, 40.55475879414019], [-74.21911014911431, 40.5548012990159], [-74.21908060899351, 40.55484700219797], [-74.21909005126736, 40.55492806552364], [-74.21912835054238, 40.55497470979937], [-74.21917339795966, 40.55507143309305], [-74.2192345849937, 40.555118169685926], [-74.21925824504427, 40.555156195118755], [-74.21923330127086, 40.55526452631137], [-74.21919554653131, 40.555394647826155], [-74.21920978196957, 40.5554555836068], [-74.2192522371676, 40.55547460705378], [-74.21929510878144, 40.555489263849346], [-74.21931015500938, 40.55551218225154], [-74.21932052662625, 40.55561374815316], [-74.21933701278975, 40.55569136698107], [-74.21930539588978, 40.55575085204573], [-74.21928639639636, 40.55579538237191], [-74.21921716370927, 40.55579696987855], [-74.21919443458171, 40.555779445862484], [-74.21918232634566, 40.55575265322801], [-74.2191796802851, 40.55570297648615], [-74.21918136219827, 40.555656201653825], [-74.21918905441791, 40.55556555305959], [-74.21917849469084, 40.55552810538726], [-74.21916939228603, 40.55551736362476], [-74.21913632951241, 40.55553148016613], [-74.21909202087238, 40.55552871065521], [-74.21907546885762, 40.55550714053318], [-74.21907068516887, 40.555442015704514], [-74.21906787202626, 40.55535253892671], [-74.21904407246122, 40.55522799703139], [-74.21899014747787, 40.55504707931044], [-74.2189583263338, 40.55485758391833], [-74.21891390920673, 40.55477765609848], [-74.21886973476656, 40.55473879183282], [-74.21878077485502, 40.55467228928319], [-74.21859325782798, 40.55467421024778], [-74.2185398175649, 40.55470738813924], [-74.21853272333956, 40.55473888410936], [-74.21856501731422, 40.55482004237239], [-74.21855087085385, 40.55487364750933], [-74.21853638146906, 40.55493288147892], [-74.2185676824065, 40.55504025342726], [-74.21863889566342, 40.555270078066606], [-74.21870070984441, 40.55547612471538], [-74.21875918633687, 40.5556624132944], [-74.2187974474673, 40.55581298368631], [-74.21881905965172, 40.555874718986104], [-74.21875399923744, 40.55589346978803], [-74.2188020251887, 40.55595546554497], [-74.2187503688055, 40.556027740537246], [-74.21870767560165, 40.55604101620115], [-74.21867044328168, 40.55605041233876], [-74.21865679372745, 40.55603315036935], [-74.21841519874965, 40.555727626154116], [-74.21826999195912, 40.55569054965283], [-74.21817360193401, 40.55560052324848], [-74.2181215645945, 40.55551041370758], [-74.21812855546021, 40.5554652717783], [-74.21807146383063, 40.555292928825175], [-74.2179149889178, 40.55509504347546], [-74.21775342391726, 40.55500528477618], [-74.21741272772677, 40.55509386541668], [-74.21719072566007, 40.55515908944039], [-74.21697226575563, 40.55523093577839], [-74.2167576874083, 40.55530929281532], [-74.2165473239861, 40.555394038821106], [-74.21624183551103, 40.55548031523552], [-74.21604246060625, 40.55554411878309], [-74.21585156387714, 40.55565864897368], [-74.21556824641291, 40.555813098924425], [-74.21474053198814, 40.556242389132144], [-74.21491217588893, 40.556523927255625], [-74.21497052999892, 40.55665149155003], [-74.21501817201802, 40.55675563837995], [-74.21499256964766, 40.5567949327959], [-74.21462340478293, 40.55691336222088], [-74.21458359755573, 40.5568991652], [-74.21449357509393, 40.55672429854295], [-74.21447533239655, 40.55668886410159], [-74.21443562607354, 40.556700305678405], [-74.21434447631304, 40.55672657135454], [-74.21428212817725, 40.556636752072876], [-74.21422698854253, 40.556557317917004], [-74.21416613986864, 40.55658872941318], [-74.21412277605752, 40.55661973284424], [-74.21405771378673, 40.55663223210392], [-74.21401027808201, 40.55663081139325], [-74.21396934069192, 40.5566583358338], [-74.21395537449884, 40.55665715529948], [-74.21386874413025, 40.55658729585716], [-74.21386359366392, 40.55657448653227], [-74.2139008816071, 40.55654216549755], [-74.2138875548331, 40.55651381386743], [-74.21386858605855, 40.5564961264968], [-74.21384686609589, 40.556487670642085], [-74.2138369925384, 40.556471221300185], [-74.21381634554184, 40.556429263412554], [-74.21379034458955, 40.556401288352674], [-74.21377719790834, 40.556399062054915], [-74.2137646731758, 40.5563969433253], [-74.21373503614481, 40.55641330320351], [-74.213711569401, 40.55643500351552], [-74.21366207475845, 40.55648719216827], [-74.2136290446141, 40.556511819753105], [-74.21359594595765, 40.55652587997942], [-74.21356439624225, 40.55652928774992], [-74.21352072182457, 40.55653389796987], [-74.21347392300072, 40.55653991369645], [-74.21339560620757, 40.55655990370746], [-74.21333332352269, 40.556585957964494], [-74.21327457291389, 40.556624934276535], [-74.21324031404319, 40.55667262386913], [-74.2056960519999, 40.55851600599987], [-74.20699885299997, 40.55756748899989], [-74.20880330699998, 40.557308688999896], [-74.21050789400002, 40.557064181999934], [-74.21220034099994, 40.556443429999874]]]}}, {\&quot;id\&quot;: \&quot;44\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 45, \&quot;Shape_Leng\&quot;: 0.0459068626235, \&quot;Shape_Area\&quot;: 9.13594688556e-05, \&quot;zone\&quot;: \&quot;Chinatown\&quot;, \&quot;LocationID\&quot;: 45, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99750445299988, 40.71406913199995], [-73.99744448599988, 40.71406687299986], [-73.99647830999992, 40.71410726399991], [-73.99484048899991, 40.71420935199992], [-73.99472479499984, 40.71421571299987], [-73.99465684999993, 40.71421944699987], [-73.99450033499993, 40.71423116399996], [-73.99434786700003, 40.71424791599985], [-73.99431855699987, 40.71425088499997], [-73.99414039099992, 40.714268931999854], [-73.99395033499991, 40.71429083199993], [-73.99301588399996, 40.714355624999875], [-73.99282173499992, 40.71436522999989], [-73.99256242199989, 40.71438807699996], [-73.99246827699984, 40.71385682499988], [-73.9924556359999, 40.713762881999834], [-73.99239157000001, 40.71319080999998], [-73.99226747499985, 40.712467556999904], [-73.99225369399991, 40.712354325999854], [-73.99224319399995, 40.71226805499987], [-73.99221855999997, 40.71206565499991], [-73.99220577900002, 40.71196063499989], [-73.99218322399993, 40.71177531099993], [-73.99216806999992, 40.71171189899992], [-73.99215484499997, 40.71165655599985], [-73.99213550299994, 40.71157561499989], [-73.99202215999982, 40.71110129999989], [-73.99200166199995, 40.711015522999894], [-73.99197674899987, 40.71091126599985], [-73.99191690599989, 40.71059750599987], [-73.99177662699996, 40.7098190399999], [-73.99183817499984, 40.709810551999965], [-73.9919070979999, 40.70980199399986], [-73.99204746299989, 40.70977574499992], [-73.99200595899987, 40.70969647899992], [-73.99197509100001, 40.70964553499987], [-73.9919434659999, 40.70958905299992], [-73.99192047499996, 40.70955429399988], [-73.99190824271031, 40.70953292664334], [-73.99203926968342, 40.70951691916274], [-73.99209131635959, 40.70950822240118], [-73.9921486897014, 40.70949860910412], [-73.99236116139895, 40.70946436881142], [-73.99284846748641, 40.70938187763877], [-73.99374012862212, 40.709246120435395], [-73.99400820164024, 40.709237479918954], [-73.99414063200335, 40.709233267399895], [-73.9943782354393, 40.709192639198946], [-73.9945789996373, 40.709130972909996], [-73.99517577369818, 40.70903429381024], [-73.99580385653569, 40.70894601390752], [-73.99601898395763, 40.70891622384743], [-73.99666400996595, 40.70882690451765], [-73.99728287195568, 40.70873161984285], [-73.99808351186982, 40.70850961536707], [-73.99828602320575, 40.70842993146761], [-73.9985275858529, 40.708331527908335], [-73.9985611462062, 40.70831528323353], [-73.99872197955054, 40.708237452896164], [-73.99875396570859, 40.708223651529806], [-73.99880846276638, 40.70820013499265], [-73.99882158420985, 40.70817548117483], [-73.99888130863876, 40.70813663391978], [-73.99898340963244, 40.708092653316136], [-73.99905276738558, 40.70803254536376], [-73.99913434918955, 40.70798239744848], [-73.99919451154429, 40.70794737667571], [-73.99928731099999, 40.708016602999926], [-73.99936195599989, 40.70807228699991], [-73.99939955100004, 40.70810033799996], [-73.99944281399992, 40.70813655699987], [-73.99956273399984, 40.70823648299992], [-73.99981193899987, 40.70844261499991], [-73.9999293639999, 40.70853681799988], [-74.00000765599991, 40.70859961999991], [-74.000123591, 40.708684518999924], [-74.00019103100001, 40.708733912999875], [-74.00026566699995, 40.708792948999864], [-74.00055004999997, 40.70901791699988], [-74.00134439899988, 40.70964629299989], [-74.00147140299997, 40.709746553999864], [-74.00155908199999, 40.70981710799992], [-74.00173688999998, 40.70996016999991], [-74.00223869799997, 40.71036393199988], [-74.0025796699999, 40.71063789699985], [-74.0033244169999, 40.711237482999884], [-74.00336407499992, 40.71126941399996], [-74.00366118299998, 40.71148728299994], [-74.00382358799995, 40.71155186199991], [-74.00418143899992, 40.7116871419999], [-74.00442860399994, 40.7117862259999], [-74.00490674599992, 40.711972278999944], [-74.00499805099996, 40.71201189699987], [-74.00510989999995, 40.71205559399987], [-74.00518548699988, 40.71207123299992], [-74.00522812799994, 40.71207345199985], [-74.00538198399992, 40.712076742999876], [-74.00543986599993, 40.71207853299993], [-74.00573499299995, 40.71197868799989], [-74.0058917509999, 40.71200715999989], [-74.00574044699991, 40.71208875699989], [-74.00558932999998, 40.7121700539999], [-74.00543047899994, 40.712203694999914], [-74.00527561999998, 40.71224943999993], [-74.00512712599996, 40.712306772999966], [-74.00498716699994, 40.712374856999894], [-74.00485768099996, 40.7124525409999], [-74.00470652299995, 40.712574014999866], [-74.00429113899997, 40.71290782599993], [-74.00421405399993, 40.712980742999896], [-74.00405900799997, 40.713134789999884], [-74.00360280399998, 40.71364542999988], [-74.00321983099997, 40.71403623699988], [-74.00272286199994, 40.71438970899991], [-74.002453932, 40.71478981999997], [-74.00211455799992, 40.715158909999936], [-74.00168306199991, 40.71574412299987], [-74.00081842499998, 40.71692970799994], [-74.00027443699997, 40.71761940199987], [-73.99995620900002, 40.71801709499987], [-73.99931241699989, 40.71755024199989], [-73.99858925599978, 40.7170995119999], [-73.99776285999997, 40.71681392799996], [-73.99698375299992, 40.716540542999866], [-73.99605872699998, 40.7162316399999], [-73.99614929199988, 40.716084840999955], [-73.99622493199993, 40.71599579099993], [-73.99653128199989, 40.71549139099988], [-73.99680607099994, 40.7150369559999], [-73.99709223399998, 40.71461839799991], [-73.99750445299988, 40.71406913199995]]]}}, {\&quot;id\&quot;: \&quot;45\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 46, \&quot;Shape_Leng\&quot;: 0.134475429879, \&quot;Shape_Area\&quot;: 0.000926391677672, \&quot;zone\&quot;: \&quot;City Island\&quot;, \&quot;LocationID\&quot;: 46, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.78452431937963, 40.86047706314786], [-73.7844902538973, 40.86041295004045], [-73.78448776047776, 40.860368910954875], [-73.7844800977429, 40.860292836382015], [-73.78447503221116, 40.86022877642979], [-73.78446994161976, 40.86017272439544], [-73.78446215634142, 40.86013467913451], [-73.78442797497668, 40.86010659359294], [-73.78437534588969, 40.86007647132326], [-73.78435963136363, 40.86004441729388], [-73.78436247019211, 40.859982373511805], [-73.78436267137351, 40.859920325971984], [-73.78436807918104, 40.859878303052135], [-73.78438676719428, 40.859806281694055], [-73.78440007895897, 40.859766274445036], [-73.78442391602212, 40.85973229342179], [-73.78449516071953, 40.85971241045506], [-73.7845715637229, 40.85971548228985], [-73.78456904816244, 40.85969053097361], [-73.78455594466404, 40.85966648813517], [-73.78454815872834, 40.859628444550694], [-73.78455623644251, 40.85957641773658], [-73.78456430743651, 40.85952639348691], [-73.78460404682814, 40.85946642116824], [-73.78462528561683, 40.85942042497647], [-73.78460172751247, 40.85936834077295], [-73.78461240880978, 40.85932632718043], [-73.78464412229502, 40.859302366834974], [-73.7846758996747, 40.85925839170871], [-73.78469969172261, 40.85923842071494], [-73.78470241202126, 40.85921240584557], [-73.7847051705325, 40.85917438144233], [-73.78472896902186, 40.85915240837877], [-73.78476590334343, 40.859144471496926], [-73.78480288859096, 40.859120520439255], [-73.78483197791422, 40.85909255283886], [-73.78487654337043, 40.85905832709181], [-73.7849032932319, 40.8590506527833], [-73.78492443458967, 40.85903467961179], [-73.78494557725956, 40.85901870694156], [-73.78497195857572, 40.85901275122567], [-73.78500630915828, 40.858988796867486], [-73.785045897498, 40.85897485945254], [-73.78510392836098, 40.85896496035969], [-73.78513035557019, 40.858944993514605], [-73.78515408763242, 40.85894303630437], [-73.78517519142918, 40.858939072119874], [-73.78518844391954, 40.85891707932429], [-73.78518853442692, 40.858889057638116], [-73.78519126744986, 40.85885903946629], [-73.78519664387113, 40.85882702363741], [-73.78523623919948, 40.858811084764405], [-73.78527841239523, 40.85881316583793], [-73.78529680189469, 40.8588332149537], [-73.78530197795772, 40.858863247846145], [-73.7852676088167, 40.85889320831733], [-73.78525697970875, 40.85891920831323], [-73.78525422152342, 40.858957232731484], [-73.78525939602868, 40.858987266795005], [-73.78527521479502, 40.85898729623645], [-73.78529633019848, 40.858979328737995], [-73.78530432970666, 40.85895132227248], [-73.78533335414066, 40.85894336998699], [-73.78534653595938, 40.858943394512316], [-73.78537016554837, 40.85897346173218], [-73.78535426993068, 40.85899745053398], [-73.78535158219417, 40.85901345811734], [-73.78535416011117, 40.859031477572664], [-73.78538834843641, 40.85905756095048], [-73.7854147107948, 40.85905760998464], [-73.78543056633485, 40.859045630873105], [-73.78545964311272, 40.85902166539953], [-73.78548075336799, 40.859015700938436], [-73.78549921267165, 40.859013732680594], [-73.78552292047279, 40.85901978164125], [-73.78553605067312, 40.85903581812991], [-73.78555172614126, 40.85907988170428], [-73.78555685070432, 40.85912592824412], [-73.78556732396562, 40.85914796467686], [-73.78558046666774, 40.859159997702506], [-73.78559628481331, 40.859160027098696], [-73.78562002983944, 40.859154067508435], [-73.78564115948065, 40.859142096995235], [-73.78566224996798, 40.85914213617787], [-73.78568065813838, 40.85915618155187], [-73.78569113232625, 40.85917821847748], [-73.78569372346445, 40.859192233965686], [-73.78572792401741, 40.85921431495624], [-73.7857726886443, 40.859230410163605], [-73.78582168503188, 40.859254132521045], [-73.78588066129579, 40.85926663873898], [-73.78594123750362, 40.859284765801405], [-73.78601763836582, 40.85930092010696], [-73.78608881774542, 40.8593010520985], [-73.78616528302004, 40.85929718985976], [-73.78622853422603, 40.85930331195699], [-73.78629177967478, 40.859311435413964], [-73.78636034162425, 40.85930555750373], [-73.78642632600138, 40.8592816612963], [-73.78646327947388, 40.859267718518424], [-73.78650814623157, 40.85925178946896], [-73.78657148225405, 40.859231890585875], [-73.78662961453665, 40.85918996507849], [-73.78666931246264, 40.859142000739304], [-73.7867301085431, 40.859092074819856], [-73.78680410917073, 40.85903416597232], [-73.78683848410708, 40.85900220365069], [-73.78687017009233, 40.85898625010733], [-73.7868993290349, 40.85893626464586], [-73.78695485110823, 40.85888632786039], [-73.78700771825798, 40.858842391033136], [-73.78705987145723, 40.85882528948738], [-73.78706841636694, 40.85882248700689], [-73.78710536878255, 40.85880854569622], [-73.78716072383345, 40.858810648729474], [-73.78722398107531, 40.85881476771513], [-73.78726083742153, 40.85883084826379], [-73.78727504379454, 40.858854636519254], [-73.78729498157858, 40.85887094284297], [-73.78733185055222, 40.85888302058116], [-73.78736608944581, 40.85889309138494], [-73.78740560244165, 40.858903172064394], [-73.78743186194176, 40.858935245614425], [-73.7874158916261, 40.85898325360335], [-73.78736038283725, 40.8590291876556], [-73.78732864420107, 40.85906115381899], [-73.78732060778712, 40.85910117062934], [-73.7872941173816, 40.859141152748556], [-73.78726224420458, 40.85921515284668], [-73.78723311169144, 40.85925713098204], [-73.78718675246938, 40.85931159051636], [-73.7871854793933, 40.85931308733737], [-73.78713520321362, 40.85937104019999], [-73.78707963601639, 40.859434987659185], [-73.7870320483265, 40.85947693335828], [-73.78697913779823, 40.859534880786455], [-73.78698691781936, 40.85957492610177], [-73.78702108009922, 40.8596090159042], [-73.78706307596636, 40.85966713902589], [-73.78708149186802, 40.8596791827834], [-73.78710521132136, 40.85968122795866], [-73.78711182162283, 40.85969939972018], [-73.787107726334, 40.85971926164171], [-73.78709446746645, 40.859743257219804], [-73.78707858510543, 40.85976324229673], [-73.78705743121485, 40.859783219317336], [-73.7870415879457, 40.85979119636581], [-73.78702051604037, 40.859785152584585], [-73.78700212067199, 40.85976710514278], [-73.78698106160043, 40.859757058065334], [-73.78694940091926, 40.859765006399016], [-73.78692554523269, 40.85980499329491], [-73.78692012622042, 40.85985101979181], [-73.78691471140883, 40.85989504422061], [-73.7868987212506, 40.859949056309404], [-73.78689858015443, 40.8599930904772], [-73.78685886773299, 40.86004505783956], [-73.78679816291358, 40.86006696264338], [-73.78672426294726, 40.86009284700723], [-73.78663190867239, 40.86011869602478], [-73.7864973984128, 40.86013646185003], [-73.78640247859543, 40.8601402896442], [-73.78627850088282, 40.86016207752269], [-73.7861808787995, 40.860185915016395], [-73.78610698578403, 40.8602097964202], [-73.78604370086556, 40.86021368306415], [-73.78595670855401, 40.8602115203072], [-73.78586179482426, 40.86021334559278], [-73.78576157641793, 40.860225169315676], [-73.78567185124342, 40.860253023349415], [-73.78558478790842, 40.86027287764533], [-73.7854818874012, 40.860298706813445], [-73.78538694703576, 40.860308537949194], [-73.78530786449265, 40.860306389415996], [-73.78522080164107, 40.860326243438216], [-73.7851521214915, 40.86036814741715], [-73.78512562839124, 40.8604081302005], [-73.78510175844113, 40.86045212017063], [-73.78503841008691, 40.86047602052986], [-73.78499095625652, 40.86047593210825], [-73.78494355332282, 40.860459831182176], [-73.78491727455626, 40.86043376292765], [-73.78489093019402, 40.86042770842686], [-73.78483815862118, 40.86044162120279], [-73.7847879909767, 40.86046554650663], [-73.78473518651981, 40.86048946636658], [-73.7846771354921, 40.86050537012106], [-73.78463757790949, 40.860509299770094], [-73.7845914939652, 40.8605097253584], [-73.78455587045978, 40.86050314234216], [-73.78452431937963, 40.86047706314786]]], [[[-73.76783205637173, 40.854442205742075], [-73.7682312652444, 40.85388788880734], [-73.7685566032706, 40.85323832295944], [-73.7690443898714, 40.85329092469354], [-73.76938529139694, 40.85253613399675], [-73.76860817687106, 40.85078839537812], [-73.76959674311465, 40.84759451909819], [-73.76950321562752, 40.8472178342351], [-73.76805636086223, 40.84559821813746], [-73.76789492672636, 40.84528943351961], [-73.76901389181107, 40.84509734272193], [-73.76998042657765, 40.84595141286952], [-73.77118378010564, 40.84694451331219], [-73.77157218833237, 40.8475000585803], [-73.77130772937919, 40.84802877432174], [-73.7708892022117, 40.84975177133807], [-73.7720496366846, 40.85161828975743], [-73.77246892938182, 40.8517091473893], [-73.77246651950136, 40.85180956889385], [-73.7727111749615, 40.85182658093368], [-73.77270912061607, 40.851847663461555], [-73.77246594126663, 40.85183368399969], [-73.77246052295433, 40.8520595421737], [-73.77264417003487, 40.852138980076155], [-73.77267130532901, 40.852098888782244], [-73.77272072829567, 40.85211948523007], [-73.77271845211186, 40.85212716875465], [-73.77291739323162, 40.85217453792541], [-73.77292081162744, 40.85216173175276], [-73.77296356611284, 40.8521592539586], [-73.77296793744162, 40.8521968453855], [-73.772945391628, 40.85221046694682], [-73.77287681617626, 40.85219837376392], [-73.77287683950732, 40.85219154117822], [-73.77270601491698, 40.85214593507688], [-73.77264837746922, 40.85222440262956], [-73.772904294762, 40.852387192161146], [-73.77289075731291, 40.85239826899822], [-73.7726393580297, 40.852230362275975], [-73.77263258309878, 40.85223803743507], [-73.77258429583127, 40.852214025867795], [-73.77261479509698, 40.85217650433531], [-73.77245940163019, 40.85210626708215], [-73.77245149415468, 40.85243589689344], [-73.77173060411904, 40.852476831319095], [-73.7717171593653, 40.853004539281784], [-73.77229680531372, 40.85308637825238], [-73.77227577057599, 40.85331813153632], [-73.77227536313346, 40.853437135363876], [-73.77229293607876, 40.85347977623898], [-73.77231266873179, 40.853527653312796], [-73.77233735401518, 40.85364194680004], [-73.7723620067985, 40.85376576110119], [-73.77234917454822, 40.853851420736646], [-73.77280751808897, 40.85385063127562], [-73.77281122687663, 40.85379708655028], [-73.77296285334867, 40.853800062246464], [-73.77295817517044, 40.854137432923366], [-73.77279597721957, 40.85413175870194], [-73.77280008065789, 40.853963076256626], [-73.77269430639828, 40.85395751299703], [-73.77269448026055, 40.85390663901333], [-73.77233272219733, 40.85390084467517], [-73.77231116956706, 40.853965589494386], [-73.7722877176082, 40.85401044932687], [-73.77222913187389, 40.854122515546315], [-73.77219724701617, 40.85427953840102], [-73.77214036841814, 40.85441271260061], [-73.77212722589735, 40.85458881421388], [-73.77214547937614, 40.85475069709279], [-73.77218226378271, 40.85499353996747], [-73.77220024034331, 40.85523634635437], [-73.77220606901119, 40.85536488384107], [-73.77218644562852, 40.85560285594477], [-73.77217269968631, 40.855955082859246], [-73.77214690490916, 40.85616448177462], [-73.77213970639943, 40.856435799199566], [-73.77216934064688, 40.856935678765595], [-73.77216818289573, 40.85727365139707], [-73.77215380205806, 40.85781152614167], [-73.77216585105373, 40.85795435608545], [-73.77216552491815, 40.858049559538976], [-73.77219618881766, 40.858249549157016], [-73.77220802669532, 40.85845426144408], [-73.77220755388522, 40.85859230561815], [-73.77218824023912, 40.858739834638655], [-73.77218152925143, 40.858868346783424], [-73.77219364526376, 40.85899213574529], [-73.7722368970485, 40.8591778687732], [-73.77235432710658, 40.85967316198051], [-73.77219223055407, 40.85998663859697], [-73.77084562380267, 40.86010101292837], [-73.76947305423998, 40.85933013666858], [-73.76836277290795, 40.858358288851804], [-73.768360859188, 40.857655363705895], [-73.76533243995276, 40.85504359512487], [-73.76783205637173, 40.854442205742075]]], [[[-73.79018745194999, 40.8586099173861], [-73.79013351158892, 40.85856248730968], [-73.79012065319685, 40.85857012058902], [-73.79009141537634, 40.8585387453293], [-73.79009877156537, 40.858531798103954], [-73.7900459983775, 40.85847540491209], [-73.7899222929631, 40.858532289389935], [-73.78972202672374, 40.85856245340872], [-73.78934280432145, 40.85856093104265], [-73.78898385013113, 40.8584708437399], [-73.78897652126375, 40.85844842253513], [-73.7889780616097, 40.85843756780748], [-73.78897964442007, 40.858426403071135], [-73.78897973637031, 40.85839742298204], [-73.78897067954541, 40.858364948535126], [-73.7889661727637, 40.85834175635383], [-73.78895591927375, 40.8583102937374], [-73.78894954009625, 40.85829072099737], [-73.7889328557321, 40.85825591389827], [-73.78892076275636, 40.85821763824252], [-73.78891167199001, 40.85819559643317], [-73.78890874036226, 40.85815733753702], [-73.78891041371965, 40.858110972050746], [-73.78890751432796, 40.858062280004816], [-73.78890090345358, 40.85799406515931], [-73.78887898065909, 40.85791268944159], [-73.78886684361834, 40.85788832386005], [-73.78884710614867, 40.85785351233132], [-73.78882587932831, 40.85780710493002], [-73.78881535014905, 40.85775723897932], [-73.78879564521492, 40.857711994291584], [-73.78879886108632, 40.85766099473813], [-73.78879449753784, 40.85759259352103], [-73.78879167253787, 40.85752071816484], [-73.78878275515255, 40.85744419476535], [-73.78878402854569, 40.857420690336546], [-73.78826498050694, 40.857507000860615], [-73.78826195310619, 40.85749888196358], [-73.78817640998422, 40.857512635102445], [-73.788182450876, 40.85753351143941], [-73.788043429758, 40.85755991768708], [-73.78802830701825, 40.85751468128371], [-73.78816580032998, 40.85748827224901], [-73.7881718624852, 40.85750219354376], [-73.7882558718205, 40.857490755786465], [-73.78825436690734, 40.85748379794236], [-73.78877898544017, 40.85740092519962], [-73.78876389073886, 40.85732121926358], [-73.78875047058206, 40.85727379569839], [-73.78873164778054, 40.85721811889827], [-73.78872093476754, 40.85717276216798], [-73.78870485884443, 40.85710678617594], [-73.78871047688176, 40.85704703271107], [-73.78871879678134, 40.856991406114574], [-73.78875148515341, 40.856954371696006], [-73.78876247260872, 40.85691317561573], [-73.78877463362326, 40.85688983820476], [-73.78879251250657, 40.85685552689661], [-73.7888062667889, 40.8567978495311], [-73.7887955603384, 40.85675043160425], [-73.7887794059048, 40.856709185830454], [-73.78880667250745, 40.85667008025646], [-73.78883933406082, 40.85664128876774], [-73.78886926255444, 40.85661867439667], [-73.78888830770909, 40.85660428310894], [-73.78889654957185, 40.856573386709805], [-73.78888312226606, 40.856528024520195], [-73.78885616237595, 40.85647027146297], [-73.78881837966713, 40.856402195543055], [-73.788782472715, 40.856362941986546], [-73.78877003064156, 40.85634934056999], [-73.78875894260247, 40.856315532906635], [-73.78873183366792, 40.856305178546684], [-73.78872519415646, 40.856304851275965], [-73.78868841289075, 40.85630303881861], [-73.78865312839909, 40.85630297418632], [-73.78862333817503, 40.85628231184338], [-73.78860444893704, 40.856247242657005], [-73.78859643189443, 40.85620807247319], [-73.78858212373594, 40.856162888216524], [-73.78853687735143, 40.85615850479053], [-73.78850992512635, 40.856098690952145], [-73.78852086082745, 40.85607398231431], [-73.78846710159921, 40.855909017262086], [-73.78847402223268, 40.85587324721077], [-73.7884376714846, 40.85577501062688], [-73.78840780812261, 40.855777017072455], [-73.7883594322236, 40.85562648914821], [-73.78842551577243, 40.855329852881944], [-73.7884151118428, 40.855187637104514], [-73.78853250003307, 40.855154676929416], [-73.7885536572479, 40.85514873611422], [-73.78853679526938, 40.85510189085478], [-73.78849696186786, 40.85505383483559], [-73.78844808747019, 40.85505992685202], [-73.78843187532392, 40.85503722914398], [-73.78839114316482, 40.85504333657033], [-73.78835855433422, 40.855049459591385], [-73.78833961444349, 40.855030877113705], [-73.78833159638137, 40.854991706398195], [-73.7883209428071, 40.854927802659496], [-73.78831293199039, 40.85488657074242], [-73.78830763495627, 40.85484534480935], [-73.7882941364666, 40.85482265139003], [-73.78829419550173, 40.8548041044367], [-73.78832138879896, 40.85478766848557], [-73.78835401751454, 40.854769180114204], [-73.78839751595056, 40.854746591925725], [-73.78842472253515, 40.854726032878965], [-73.78842760041378, 40.854674517218335], [-73.78841692123977, 40.85461885577657], [-73.78841706546328, 40.854573518907685], [-73.78842728684886, 40.85455467815888], [-73.78844163730808, 40.85452822516081], [-73.78845805973428, 40.854484978348566], [-73.78848260375628, 40.85444792872273], [-73.7884826692924, 40.85442732090218], [-73.7884773265335, 40.8544005205322], [-73.78843136980228, 40.85434273369264], [-73.78840976856601, 40.854307659487745], [-73.78839632893784, 40.854266418620135], [-73.78834700683626, 40.854153518949865], [-73.78786849474662, 40.85427324147085], [-73.78787151151583, 40.85428484016822], [-73.78765149076932, 40.85434007726066], [-73.78764693594798, 40.85433195385581], [-73.7875567694506, 40.85436076813225], [-73.78756282815222, 40.85437584889325], [-73.787362690749, 40.85441953057157], [-73.78734753146404, 40.85438588545951], [-73.78754919139483, 40.85434336587592], [-73.78755374968587, 40.85435033052877], [-73.78764390876884, 40.854323834435505], [-73.78763935178883, 40.85431687146393], [-73.78834514784103, 40.854132012350114], [-73.7883239944991, 40.85410251564968], [-73.78827221224095, 40.85411296306839], [-73.78819872490023, 40.854127789058104], [-73.78816813692173, 40.85408577890348], [-73.78777873831645, 40.85417338531972], [-73.78769014281566, 40.85418829124551], [-73.78765807500652, 40.85419055109111], [-73.78762757097078, 40.85418122099095], [-73.78756345016592, 40.854181102936444], [-73.787430572486, 40.8541982464804], [-73.78731450066233, 40.854211942725605], [-73.78726555834814, 40.85420762787154], [-73.78722448578456, 40.85419322967826], [-73.7871970601854, 40.85417579079074], [-73.78717271889465, 40.854149084305526], [-73.78714539852163, 40.85409918836224], [-73.7871254596767, 40.854044378654386], [-73.78691339069742, 40.85408369046205], [-73.78690734702697, 40.854063972299144], [-73.7871328723601, 40.854024270878305], [-73.7871545889612, 40.85397968963615], [-73.7872084560664, 40.85395440428848], [-73.78729251210585, 40.85392673777914], [-73.78732350665298, 40.853917164311945], [-73.78741935244048, 40.853887558074995], [-73.78762411569168, 40.85382881638005], [-73.78781206717181, 40.85377583738079], [-73.78787778457543, 40.85375393421109], [-73.78792821707314, 40.85373779738912], [-73.7879679994746, 40.853710050165546], [-73.78799403046978, 40.85368575461534], [-73.78800508108596, 40.8536648684512], [-73.78801104438836, 40.85361623383958], [-73.78801424958195, 40.853568711208176], [-73.78800064949668, 40.853524636327975], [-73.78796264288079, 40.8534747209355], [-73.78760502319017, 40.85311470853485], [-73.78716496421869, 40.85275741228193], [-73.78712672030899, 40.85277997402518], [-73.78712215823363, 40.85277417045418], [-73.78707627655098, 40.85279958743541], [-73.78706106581926, 40.85278217272936], [-73.78710999004264, 40.852760237823894], [-73.78710390562176, 40.85275327033489], [-73.78713667028038, 40.85273387524412], [-73.78693805735816, 40.85257908292886], [-73.78691672214161, 40.85256745204469], [-73.78688470337548, 40.85255464098319], [-73.78684958987257, 40.85255457611149], [-73.78678232558099, 40.85255570723554], [-73.78675959223264, 40.85253122633288], [-73.7867657472106, 40.85251616759754], [-73.78677648933812, 40.852498799145046], [-73.7867765376467, 40.852483729624616], [-73.7867689971708, 40.85245473539846], [-73.78659390163132, 40.8523083524231], [-73.78641733510773, 40.8521445764697], [-73.78637622032105, 40.85211204192054], [-73.7863244234208, 40.852078329311354], [-73.78624762093361, 40.85202281469252], [-73.78588186506632, 40.851788672440925], [-73.78566404122395, 40.8517959958209], [-73.78545277174172, 40.851664225836416], [-73.7854019443249, 40.85164558422445], [-73.78529210719023, 40.85162064997351], [-73.78521881434392, 40.85162515043416], [-73.78510066461135, 40.851652751934395], [-73.78503542905987, 40.8516835424064], [-73.78495591460657, 40.851723580683434], [-73.78489888572953, 40.85173429288914], [-73.78480722795186, 40.85175266902376], [-73.78468307195402, 40.85174934687985], [-73.78433474208568, 40.85177615757233], [-73.78427457330046, 40.85179199351651], [-73.78427798468039, 40.851799172934044], [-73.78413189167978, 40.85183280615726], [-73.78412338226599, 40.85180866377685], [-73.78426432858558, 40.851773717101274], [-73.78426688465254, 40.85177959007606], [-73.78431415165997, 40.85176754570688], [-73.78402637080502, 40.851609931862825], [-73.7839793289859, 40.851532617440434], [-73.78387115358153, 40.85155896167003], [-73.78386093355508, 40.8515328612276], [-73.78397173451735, 40.85150768135716], [-73.78396112488305, 40.851486933922956], [-73.78381306352932, 40.85151888329484], [-73.78357767103407, 40.85156967744472], [-73.78356242001054, 40.85156501244066], [-73.78354267337754, 40.85153797070415], [-73.78347956766932, 40.851560183887145], [-73.78347528477201, 40.85155691566572], [-73.78341001772101, 40.851579018711305], [-73.78338158610377, 40.85158673391434], [-73.78337646578845, 40.85157694324869], [-73.7834133904305, 40.85156341968858], [-73.78353416916762, 40.85152078053071], [-73.78344495936106, 40.85140090922443], [-73.78349609889963, 40.85136877997576], [-73.78360210541598, 40.85131951978262], [-73.78379501276285, 40.85125393535625], [-73.78398791994971, 40.85118835060683], [-73.78414275091885, 40.85114742417621], [-73.78435188706086, 40.85109835504541], [-73.78447953199854, 40.85107180299238], [-73.78460077697598, 40.851095692195194], [-73.78451936300075, 40.850892735021304], [-73.78444750529484, 40.85090481745937], [-73.784434075491, 40.85086151490386], [-73.78450494990614, 40.8508535004636], [-73.78448807935747, 40.850815826824025], [-73.78447441853888, 40.85079145789808], [-73.78445463288537, 40.85077287385447], [-73.78442108103592, 40.85076237961208], [-73.78439207608706, 40.85076232540572], [-73.78434575107664, 40.85077005079134], [-73.78433708793975, 40.85077149590738], [-73.78431265352698, 40.85077376842167], [-73.78426993630782, 40.85076557351952], [-73.78422574727558, 40.8507399892099], [-73.78416329499161, 40.85069698072504], [-73.78411913614823, 40.850662121467856], [-73.78407975214625, 40.850630614908575], [-73.78404133663162, 40.85064458870901], [-73.78404741235457, 40.850653873370376], [-73.78402142627083, 40.850664257945056], [-73.78401687236345, 40.85065613489466], [-73.78385181911865, 40.85071146765854], [-73.78384119307984, 40.850692899498306], [-73.78395428629146, 40.850654857765434], [-73.78395883886576, 40.850662981318294], [-73.78401079664636, 40.85064684972925], [-73.78400319779757, 40.85063640227853], [-73.78403070700506, 40.85062718049514], [-73.78403526024866, 40.85063530404628], [-73.78406580837313, 40.850625233236386], [-73.78401710573823, 40.850584263374934], [-73.78400879049795, 40.8505259320535], [-73.78400362316144, 40.85050541275762], [-73.78401288041832, 40.85047528985302], [-73.78401421301417, 40.85047391345848], [-73.78404198397534, 40.85044520577757], [-73.78412613427056, 40.85038740267569], [-73.78420112637873, 40.85032958288327], [-73.78423943051327, 40.8502867628729], [-73.78425785826201, 40.85025318064228], [-73.78425338375496, 40.850220713839434], [-73.78421247052576, 40.850126741818116], [-73.78420494271475, 40.85009427047384], [-73.78420047134377, 40.8500606442406], [-73.78415333900804, 40.85000143719395], [-73.78409701801216, 40.849951485046276], [-73.78407378345817, 40.849902425389395], [-73.78357825260379, 40.849266386802185], [-73.78353497808732, 40.849220967420266], [-73.78349977784661, 40.84919617197559], [-73.7834536807776, 40.84918372050767], [-73.78339395583185, 40.84918979001323], [-73.78333693054938, 40.84919998765853], [-73.78329074622592, 40.84921432656418], [-73.78323644139, 40.84922246805528], [-73.78322357300496, 40.84922244387418], [-73.78317944898282, 40.84922236094945], [-73.78314691693552, 40.849211995566776], [-73.78311715803491, 40.84918308830608], [-73.78303535537907, 40.84907190812784], [-73.78244952709214, 40.849341154015676], [-73.78221806474305, 40.849166804596116], [-73.78209456304481, 40.849247300009694], [-73.78207020661583, 40.84922638871912], [-73.78219328627868, 40.84914279099544], [-73.78215814152048, 40.849116173923825], [-73.78203367458848, 40.84919386175839], [-73.78201995532704, 40.84918803900289], [-73.78196338004864, 40.849215753630496], [-73.78197402498779, 40.849228525675706], [-73.78179206236673, 40.849319758945455], [-73.7817829373723, 40.849309307955735], [-73.78174317784173, 40.84933009868773], [-73.78175535569149, 40.84934055428367], [-73.7815749238, 40.84943063184538], [-73.78154449088599, 40.84940043464333], [-73.78171883268593, 40.84930570921137], [-73.78173101140975, 40.84931616481152], [-73.78176924362299, 40.84929537236711], [-73.78176163701295, 40.84928724294747], [-73.78193902433554, 40.849194841810736], [-73.78194967598762, 40.84920529450143], [-73.78201082139036, 40.84917990738358], [-73.78214108697831, 40.84910066266766], [-73.78193782713453, 40.8489339814074], [-73.78186608494606, 40.84894484103933], [-73.78184847915905, 40.84894750521786], [-73.7818286909823, 40.84895920536359], [-73.78169581560914, 40.84884836234784], [-73.78161594069067, 40.848896204611144], [-73.7816073854627, 40.84888640853134], [-73.78168604284517, 40.84883788315214], [-73.78161367535198, 40.84877238634991], [-73.78153019763666, 40.8488575718796], [-73.78150620325309, 40.84884252817913], [-73.78159491975414, 40.848752947876605], [-73.78157440440629, 40.84873180821234], [-73.78153956955133, 40.84872637528167], [-73.78145563649926, 40.848813090897714], [-73.78143249522284, 40.84880000581332], [-73.78150756375803, 40.848719289881394], [-73.78149337883968, 40.84871530676672], [-73.78149386587489, 40.84858047582576], [-73.78178514040063, 40.8485098018392], [-73.78203616713365, 40.84843804928343], [-73.78200212772737, 40.84834408892634], [-73.78202189306344, 40.848339562922654], [-73.78206189132574, 40.848449183284664], [-73.78178920235626, 40.848527207728736], [-73.7817970940135, 40.84854714327129], [-73.78207041238296, 40.84846941249452], [-73.78207657695803, 40.8484224763746], [-73.78209640639666, 40.8483983878631], [-73.78220384181529, 40.848367943911796], [-73.78251408510305, 40.8482896312975], [-73.78255877758846, 40.848277325976234], [-73.78261900912084, 40.84823961994345], [-73.78261910501016, 40.84821027812582], [-73.78267467078706, 40.84813967294664], [-73.78189457733075, 40.84832716154012], [-73.78176219386184, 40.84835164156259], [-73.78155442120504, 40.8484007075863], [-73.78152611318389, 40.8483434661371], [-73.78138148782878, 40.848377195829165], [-73.78139151751019, 40.84842203823172], [-73.78133652580439, 40.84843275253867], [-73.78112258967961, 40.84849880844866], [-73.78110827162968, 40.84852042002227], [-73.78108791694191, 40.84852038139701], [-73.78107575079667, 40.848506446947276], [-73.78107580166363, 40.84849099161343], [-73.78109415548866, 40.84848020673815], [-73.78130194972267, 40.84842495894283], [-73.78131826349642, 40.848415716075756], [-73.78131833463324, 40.84839407797139], [-73.78106574674733, 40.848453877688705], [-73.78101890213868, 40.84846306206486], [-73.78099244183939, 40.84846301183228], [-73.78097820938946, 40.8484583479135], [-73.78098438117183, 40.84843826780632], [-73.78101090695077, 40.848418224664776], [-73.78109036010902, 40.84839673722948], [-73.78114129062631, 40.84838292367897], [-73.78130627517389, 40.84834768647257], [-73.78130228002807, 40.84832449541754], [-73.78114557934342, 40.8483164696778], [-73.78112520061113, 40.84832415956639], [-73.78110078567305, 40.84832102158365], [-73.78109878127883, 40.84831174448807], [-73.78110697775321, 40.84829475819656], [-73.78112733303398, 40.84829479681971], [-73.781153783098, 40.84829793765262], [-73.7811538186934, 40.84828711851653], [-73.7812942097643, 40.84830284137517], [-73.78135124158366, 40.84829058454093], [-73.7813714588191, 40.84833235459947], [-73.78172594274021, 40.848234105806], [-73.781831743682, 40.84824667089895], [-73.78263740397888, 40.848072649245836], [-73.78250408633544, 40.84791327376318], [-73.78158418081362, 40.84803705254238], [-73.78148431950568, 40.8478821938486], [-73.78150307163138, 40.847681642963124], [-73.78142920347912, 40.84745634535726], [-73.78152237195346, 40.847313479941405], [-73.781844099006, 40.84713610793703], [-73.78182523912372, 40.84706551767205], [-73.78205261928964, 40.846990837927684], [-73.78209539971068, 40.84691339096235], [-73.78221497817432, 40.846861409589465], [-73.78218546562235, 40.846719715627714], [-73.78216393435586, 40.84663633778076], [-73.78112548290936, 40.846829466907394], [-73.78113626322276, 40.846852155377384], [-73.7810683698102, 40.846866452205624], [-73.7810575836192, 40.84684582392917], [-73.78063668411163, 40.84692333475236], [-73.78067693704058, 40.84706148579347], [-73.7804624159846, 40.84710023328956], [-73.780403269586, 40.846931134166056], [-73.78106043973004, 40.84680255185432], [-73.78115182578563, 40.846246304627094], [-73.78118979824524, 40.84625255880356], [-73.78110675760784, 40.846746997141146], [-73.78168786937833, 40.84663887521194], [-73.78171847815004, 40.84640812132608], [-73.78174288903251, 40.84641229011591], [-73.78171494622761, 40.84665747421467], [-73.78109853456938, 40.846771711438976], [-73.78109301885183, 40.84679849158743], [-73.78215667396833, 40.846607578113655], [-73.78214232783147, 40.84657770660868], [-73.78232827748431, 40.8465486112713], [-73.78229152990997, 40.84645779011659], [-73.7825134511685, 40.846408771551154], [-73.78235702810511, 40.84598158833272], [-73.78257932865696, 40.845935893027736], [-73.78251990755469, 40.84575819426209], [-73.78249597258944, 40.84566156194901], [-73.78309442048638, 40.845518285564644], [-73.78309556892438, 40.84551369086318], [-73.78314644227363, 40.845309942026006], [-73.78311070737087, 40.845308129742314], [-73.78307455830657, 40.84550976429195], [-73.78257509379014, 40.845601850566055], [-73.78257849117324, 40.84561315914988], [-73.7825383977149, 40.84562003866996], [-73.78254177869914, 40.84563656442654], [-73.78242148841352, 40.84566068102307], [-73.78242487155511, 40.845676336667], [-73.78182047648926, 40.845781987498064], [-73.78181646104291, 40.845764978051015], [-73.78238057457457, 40.84566557830359], [-73.78237655393292, 40.845650115280975], [-73.78250690114285, 40.8456240848009], [-73.78250088102259, 40.84559779830172], [-73.78305074940779, 40.845496823175814], [-73.78308181330725, 40.84533304738968], [-73.7830594398957, 40.84532836841475], [-73.78309455887226, 40.84516923547115], [-73.78306023126578, 40.84508570856704], [-73.78190735927909, 40.84535556174675], [-73.78183975772673, 40.84548835758404], [-73.7818153590045, 40.84548058288038], [-73.78188707672663, 40.845333885649346], [-73.78307457446681, 40.845056368733935], [-73.78313318952935, 40.84518167305947], [-73.78310841324824, 40.84528981990339], [-73.78315245505728, 40.84529598332778], [-73.78322207613923, 40.84506344465817], [-73.78309714310711, 40.844991674332086], [-73.78297579244337, 40.84468094802046], [-73.7833653613534, 40.84444472298169], [-73.78335700996655, 40.844402846537584], [-73.7833354347671, 40.84436158971978], [-73.78332100656189, 40.844347824802384], [-73.78328485082511, 40.84433951285005], [-73.7832381891779, 40.844347014854286], [-73.78323416798308, 40.84434766164698], [-73.78315451147776, 40.84436399780923], [-73.78310017474654, 40.844383130600946], [-73.78306040951676, 40.84437206489805], [-73.78304608891058, 40.84432532503511], [-73.78301129829549, 40.844172690347165], [-73.78326987138819, 40.84406939209163], [-73.78309494705954, 40.84386609490481], [-73.78349593173812, 40.84373234293595], [-73.78348428748797, 40.84367854599843], [-73.78298567054594, 40.84379407880406], [-73.78289307603839, 40.8438948842585], [-73.78290650949755, 40.84393612584013], [-73.78057367810457, 40.844469585986374], [-73.78054653995335, 40.844469534359], [-73.78057628971331, 40.84450050300951], [-73.78052736048552, 40.84452514033816], [-73.7799270374445, 40.843883081355834], [-73.77997868590161, 40.84385638925434], [-73.78053302714567, 40.84445302176267], [-73.78056017668013, 40.844448951818684], [-73.78036906217557, 40.8439766611937], [-73.78039623282005, 40.84396640817976], [-73.78058464728879, 40.8444345726982], [-73.78106261364299, 40.844328317876695], [-73.78087690198716, 40.843862220487786], [-73.7809122002328, 40.84385610539353], [-73.78108977797854, 40.84432012707755], [-73.78154602523335, 40.844215889747694], [-73.78135229180006, 40.84371268255372], [-73.78137674098357, 40.84370448654003], [-73.78157590302521, 40.844207703973034], [-73.78200770536681, 40.84410960066972], [-73.78180047475469, 40.843583700688804], [-73.78183306599355, 40.84357551830497], [-73.78203757586272, 40.84410347497348], [-73.78243679895445, 40.844009431099934], [-73.78221611882311, 40.84344641111838], [-73.78224871668732, 40.843436168417554], [-73.78246939706244, 40.84399918783504], [-73.78282243971395, 40.843919481199485], [-73.78257210723775, 40.84329458244578], [-73.78260741176439, 40.84328640495761], [-73.78278498635665, 40.84375454548095], [-73.7830918611237, 40.84368505481119], [-73.78287388243167, 40.843124102362346], [-73.78290103888799, 40.84311797133362], [-73.78313252568665, 40.84369749673174], [-73.78280661506554, 40.84377931612205], [-73.78284151617696, 40.84389478720195], [-73.78286866600375, 40.84389071688291], [-73.78294225812178, 40.84379193640604], [-73.7829830443998, 40.84376728323528], [-73.78347481249244, 40.843654738109784], [-73.7831919451847, 40.842867864988975], [-73.78304539815447, 40.842896332066644], [-73.78324501260472, 40.84347167587895], [-73.78321038850866, 40.84347933886645], [-73.78300874308394, 40.84290244643356], [-73.78291098678886, 40.84292235500552], [-73.78289487635368, 40.842869773693224], [-73.78313925968678, 40.84282231949004], [-73.78311703961026, 40.842771272634415], [-73.78291747085107, 40.8428064456791], [-73.78289925507742, 40.84277549983599], [-73.78312383020314, 40.84273620299365], [-73.78301653344668, 40.842605387297304], [-73.78288778301486, 40.84249482884962], [-73.78273319376788, 40.842521705498456], [-73.78281584526042, 40.842764522596624], [-73.78277919046207, 40.84277063689116], [-73.78270669982565, 40.842532475810295], [-73.78229941270918, 40.84260589641337], [-73.78244452404584, 40.84304203441674], [-73.78240786884528, 40.84304814691726], [-73.78226682874738, 40.84261201822825], [-73.78180048362434, 40.84269614579364], [-73.78196972502653, 40.84322042881595], [-73.7819330659365, 40.843228088076515], [-73.78177196927737, 40.84270227349191], [-73.78124656634495, 40.84279710728944], [-73.78142785188439, 40.84337087428157], [-73.78138916319325, 40.84337698260531], [-73.7812160111927, 40.84280477739565], [-73.78067429925017, 40.84290730453772], [-73.78085958503786, 40.843501171869235], [-73.7808290368131, 40.84350729714562], [-73.78064375993134, 40.842910338123474], [-73.78029552532065, 40.842973044893895], [-73.78029286577419, 40.843778305365376], [-73.78022773872677, 40.84377818129771], [-73.78022662418076, 40.842883268935495], [-73.78029175678296, 40.842881846600335], [-73.78029152196487, 40.84295294475395], [-73.78286499304913, 40.84247810188268], [-73.78271552022753, 40.84244650059041], [-73.78230783665785, 40.84251935826533], [-73.78229572698898, 40.8424884238486], [-73.7824348109359, 40.842466121435066], [-73.78241082488181, 40.84245005032449], [-73.78059735822595, 40.84278659994098], [-73.78058525374094, 40.842754119441445], [-73.78236855953504, 40.84242849314965], [-73.78234000558811, 40.84234092564359], [-73.78215975190268, 40.8423706998425], [-73.78215166139216, 40.84235522911647], [-73.78233051660672, 40.84232245176547], [-73.78231110910542, 40.842224178957146], [-73.78221716280949, 40.84224097717735], [-73.78222115152285, 40.84226571462883], [-73.78216005558019, 40.84227796304772], [-73.78215604531863, 40.842259408368676], [-73.7816286101587, 40.84235424006778], [-73.78162055021907, 40.84232949488805], [-73.78224574731087, 40.84221320956452], [-73.78224979212551, 40.84222094525863], [-73.78230643317583, 40.84221111631256], [-73.78232118543184, 40.84217162017212], [-73.78232536834764, 40.842137624341056], [-73.7823316099391, 40.84209590550887], [-73.78237240991096, 40.84206661567217], [-73.78237057744752, 40.84200478690896], [-73.78233257215871, 40.84192284411137], [-73.78229348197962, 40.8419304528299], [-73.78231163148793, 40.84198149217097], [-73.78227701311965, 40.84198760897666], [-73.78226695851775, 40.84195049461237], [-73.78145418008431, 40.84217152712605], [-73.78144003107849, 40.8421421334934], [-73.7823235128594, 40.84189833045455], [-73.78226771471576, 40.84178617540726], [-73.78207533518163, 40.84183242503751], [-73.78208103076508, 40.84184112996917], [-73.78206499291741, 40.84184457780548], [-73.78206158354132, 40.84183674614081], [-73.78203752533935, 40.84184191671499], [-73.78203410829995, 40.84183669422445], [-73.78226345326249, 40.84177811598246], [-73.78224024540253, 40.8417358661234], [-73.78201593435602, 40.841793189025154], [-73.78201252301916, 40.8417862274759], [-73.78203658908592, 40.84177844890506], [-73.78203546964845, 40.841770621566745], [-73.78205150835818, 40.84176717490872], [-73.78205377835471, 40.8417732641795], [-73.78223592679213, 40.84172788348313], [-73.78221542233346, 40.841704017300245], [-73.78216624418964, 40.84168914411004], [-73.78207235608491, 40.84169331384538], [-73.78202093113624, 40.841704333914905], [-73.78188333127875, 40.84173381939348], [-73.78186601221255, 40.84168736467965], [-73.78140696595466, 40.841772040201484], [-73.7814183019977, 40.84180596942078], [-73.7813667641349, 40.84181282684591], [-73.78135197332533, 40.84178497722712], [-73.7812992811557, 40.84179444162352], [-73.78132082303267, 40.84185794850812], [-73.7812749882927, 40.84187090285884], [-73.78133868571547, 40.8419962184842], [-73.78130775340559, 40.84200311544593], [-73.78124863502482, 40.84187780798532], [-73.78113290101273, 40.84191062605361], [-73.78119772238901, 40.842042029373], [-73.78117137190374, 40.842048065538975], [-73.78109967064516, 40.84192012611332], [-73.78097935660904, 40.84195293533548], [-73.78105448455362, 40.842083489356845], [-73.78102354424689, 40.84209299541667], [-73.7809552932145, 40.8419598454131], [-73.78084643996941, 40.841989198625804], [-73.78092499038787, 40.84212323619836], [-73.78088717448651, 40.84213446705864], [-73.7808143539402, 40.84199870077753], [-73.78069632802139, 40.842032383000685], [-73.78076452835761, 40.842180312882476], [-73.78072098830445, 40.8421915323058], [-73.78065508284249, 40.84204186886624], [-73.78060581105882, 40.84205568586571], [-73.78058402738796, 40.842065207046154], [-73.7805313141506, 40.84208075603331], [-73.7805915762219, 40.84220606653751], [-73.78056292706687, 40.842214706208765], [-73.78050381144551, 40.842089398373815], [-73.78043963564978, 40.84210927259141], [-73.78045552576683, 40.84215103462286], [-73.78039480479654, 40.84216482923703], [-73.78037662608997, 40.84212306401238], [-73.78036980593724, 40.84210827070108], [-73.78034805158231, 40.84210909822444], [-73.7804257718152, 40.842494394206874], [-73.78029863976153, 40.84251154046733], [-73.78019599955293, 40.84204621097616], [-73.78033227924816, 40.842031690267376], [-73.78034466049567, 40.8420960516831], [-73.78037786810293, 40.84209350522443], [-73.78037675812158, 40.842083071546455], [-73.78126135401865, 40.841839578457], [-73.78123754712247, 40.841768242042036], [-73.78185048197766, 40.841653946394324], [-73.78183863598309, 40.8415347846261], [-73.78183884886525, 40.84146986973238], [-73.78183909216312, 40.841395679917284], [-73.78182300321745, 40.84133691700386], [-73.7818048644, 40.841282785939924], [-73.78176234410533, 40.84121624495401], [-73.7817176560301, 40.84118988354887], [-73.78168516996307, 40.84116663855672], [-73.78166051213424, 40.84112417558818], [-73.78084223802306, 40.84127632402818], [-73.78092886504994, 40.84154542526756], [-73.78089220610157, 40.84155308419829], [-73.7807975292347, 40.84125614604844], [-73.7816485529559, 40.84109776352879], [-73.78161356543811, 40.841007272069724], [-73.78139590619043, 40.841047865834945], [-73.78139143568951, 40.84103660961823], [-73.78161069651507, 40.84099624002564], [-73.78159702603972, 40.840948669593274], [-73.78137871885639, 40.8409871920024], [-73.78137488194949, 40.84097887100505], [-73.78159396937245, 40.84093979674803], [-73.78156821700871, 40.84083516109827], [-73.78154308949141, 40.84078478253003], [-73.78151345014929, 40.84077268257038], [-73.7814808892744, 40.840764371324674], [-73.78144833514813, 40.84075441114133], [-73.78142666976504, 40.84073622034478], [-73.78141805071888, 40.84071475571612], [-73.78142028765106, 40.840694961773686], [-73.78144207161212, 40.840676853309866], [-73.7814660242275, 40.840660399064646], [-73.78147694069271, 40.84064392129004], [-73.78148570562806, 40.84062083948602], [-73.78148577066192, 40.84060104025461], [-73.78147718457494, 40.840569675512484], [-73.78146203707614, 40.84055149874544], [-73.78145342800167, 40.84052673391017], [-73.78145349846588, 40.840505284574995], [-73.78146442574841, 40.840485507096744], [-73.78148837696587, 40.8404690528438], [-73.78151347737062, 40.840451271290306], [-73.78152321749889, 40.84044437031867], [-73.7815428414098, 40.84042295969416], [-73.78154296060534, 40.8403866616044], [-73.78153441046068, 40.84034374764454], [-73.78151504322612, 40.84028761446136], [-73.78149172006931, 40.84020622452522], [-73.78125361834401, 40.84025550094135], [-73.78124907233904, 40.840244354805236], [-73.78148878089243, 40.84019732392208], [-73.78146559787315, 40.840175159763376], [-73.78145366531946, 40.84013628677303], [-73.78136267245321, 40.83973018981636], [-73.78118431444939, 40.83976164869876], [-73.78117947802396, 40.839745862255796], [-73.78135932010679, 40.83971170821572], [-73.78134125145772, 40.839478563442896], [-73.78113994352726, 40.839505416893545], [-73.78113875725964, 40.83949427880171], [-73.78133988849423, 40.839469699830296], [-73.78132522577029, 40.83929178135658], [-73.78134240000931, 40.839238374844435], [-73.78156780983515, 40.83853740573627], [-73.78159698419161, 40.83847785014295], [-73.78172154866671, 40.838223566109775], [-73.78200420989037, 40.838015572307114], [-73.7818845572027, 40.83765027660479], [-73.78238142556087, 40.837324106167365], [-73.78272760738487, 40.83748796035137], [-73.78274559046729, 40.83747439359701], [-73.78281452652847, 40.83742239136637], [-73.7829062919088, 40.83732000607281], [-73.7828873348317, 40.837164735646695], [-73.78279680443434, 40.83692052345197], [-73.78270364583639, 40.83684280196558], [-73.78268131435576, 40.83648367715349], [-73.78282260139727, 40.836338155887844], [-73.7830292186274, 40.83634585234474], [-73.78338168059321, 40.83690927168068], [-73.78366393608437, 40.83681161024659], [-73.78410164591317, 40.83672552935798], [-73.78421807493936, 40.83675490217379], [-73.78431347112955, 40.83681282675119], [-73.78448456140005, 40.837024222538496], [-73.78491512256413, 40.836841998575245], [-73.78488487052007, 40.83679244441207], [-73.78498060328094, 40.83674642608051], [-73.78508226642613, 40.83688190821304], [-73.78498435600915, 40.83692957218049], [-73.78494325733283, 40.83687504914361], [-73.7845033396534, 40.83705776517111], [-73.78485009222643, 40.83747048917844], [-73.78512582175478, 40.837446041569414], [-73.78563997845448, 40.83706443458537], [-73.78583067964128, 40.83720998000451], [-73.78579367439913, 40.8372330098709], [-73.78565279572325, 40.83713210472607], [-73.78516584428648, 40.83747133406176], [-73.7852771294841, 40.83775671808692], [-73.78557796850949, 40.8379271132254], [-73.7854986418295, 40.83848036679504], [-73.78554772810212, 40.838725713947404], [-73.78553011511531, 40.83879827733832], [-73.7855603115974, 40.83886597978357], [-73.78568113678003, 40.839101104369114], [-73.7857350929868, 40.83923423177581], [-73.78592998544981, 40.83942928196881], [-73.78607898490304, 40.83953813339062], [-73.78614637767016, 40.839587366253056], [-73.78627272274821, 40.83958830856518], [-73.78652598496416, 40.83972311560703], [-73.78690015821412, 40.83971486189476], [-73.78730353132528, 40.839674724501016], [-73.78732985698998, 40.839703100722524], [-73.78740758745991, 40.839677623196984], [-73.78741374512595, 40.83968663880644], [-73.78733627876298, 40.839710022100135], [-73.78738854482546, 40.83976635600593], [-73.7874710857183, 40.83994515630109], [-73.78749162161397, 40.839989639321495], [-73.78749095280199, 40.8400490260975], [-73.78748134063115, 40.840054545565664], [-73.78745014326732, 40.840072461586495], [-73.78747062422686, 40.840122203428805], [-73.78763931218995, 40.8405318952366], [-73.78739774725157, 40.84058231694795], [-73.7873572424447, 40.84059077177667], [-73.78738672135641, 40.840651925716585], [-73.78749166412584, 40.840842341674076], [-73.78771665246705, 40.8408042706383], [-73.78771346922073, 40.84078075409792], [-73.78791889178505, 40.84074277179641], [-73.78792536909036, 40.84075515855147], [-73.78818132144568, 40.840711080501336], [-73.78816355627822, 40.840661551844406], [-73.78813910778516, 40.840663981607676], [-73.78809400249324, 40.84050179629599], [-73.78815921166512, 40.84049077856704], [-73.78821083495573, 40.84065297632424], [-73.78818800455072, 40.84065912157288], [-73.78820578964854, 40.84070246476651], [-73.78824000945202, 40.84070128975995], [-73.78825453283457, 40.840745863118485], [-73.78796596546518, 40.840798542045825], [-73.78795786196089, 40.84078491614255], [-73.78777526956972, 40.840816753350566], [-73.78778496347275, 40.840842757037976], [-73.78752379733702, 40.84087961218515], [-73.78757937523613, 40.840932710498684], [-73.78778656795107, 40.840892222012805], [-73.78786404049687, 40.84108172583491], [-73.78760640589596, 40.84114188575643], [-73.78761237782592, 40.84119800529587], [-73.78780098073766, 40.84144046390852], [-73.78784487499479, 40.841471479333244], [-73.78789698683862, 40.841480236842195], [-73.78795239075858, 40.841479101375796], [-73.78804369145313, 40.84146194567765], [-73.78812190151476, 40.84146208936972], [-73.78812391608882, 40.84146252561776], [-73.78819680117678, 40.84147831310449], [-73.7882390823508, 40.84150437775736], [-73.78825197587602, 40.84152874537163], [-73.78836617474826, 40.84150461101653], [-73.78837101202566, 40.84152070556352], [-73.7882606446571, 40.841541962860816], [-73.78826006848325, 40.84156628715141], [-73.78826000546677, 40.84158608571318], [-73.78825337746484, 40.84162072123125], [-73.78823370218421, 40.841659045801194], [-73.7882042790782, 40.841688689626494], [-73.78816020303344, 40.841714594533144], [-73.78811941308066, 40.841731843119284], [-73.78805250551622, 40.84176389321272], [-73.78802003550352, 40.84178384145876], [-73.7880484708972, 40.84185072312646], [-73.78829358843848, 40.84178537313663], [-73.78830167638179, 40.841803948821735], [-73.78805599070779, 40.84186703017751], [-73.78823199262384, 40.842196084772084], [-73.78838456613674, 40.842381978370604], [-73.7884390903701, 40.842402498578], [-73.78850993801106, 40.8423910353269], [-73.78852027082415, 40.842411765450514], [-73.78883864895133, 40.84235039596113], [-73.78884273257208, 40.84236345457356], [-73.7885278086737, 40.84242557689478], [-73.78871619613662, 40.842656753314145], [-73.78876384724369, 40.84265962584494], [-73.7887905351074, 40.842721855154856], [-73.78876233407976, 40.84275150135509], [-73.78884308883718, 40.84300024632511], [-73.7888908617258, 40.843070064349575], [-73.78905825501361, 40.84323533177004], [-73.78961660328446, 40.84311265436494], [-73.78965755656859, 40.84323135456166], [-73.78978620461135, 40.843208126160725], [-73.78977897832563, 40.84317470164448], [-73.78983522236199, 40.84316552413694], [-73.78985456556266, 40.843232380061444], [-73.7899242492441, 40.84322415424067], [-73.78991705673337, 40.843179593293684], [-73.78992928728755, 40.843176831317706], [-73.78991962151179, 40.8431415480429], [-73.78990617379498, 40.843143379047184], [-73.78988202767482, 40.84304960029012], [-73.78993093388229, 40.84304226436364], [-73.78995751500784, 40.843138832800726], [-73.78994406956207, 40.84313973556226], [-73.78995006820057, 40.84317501332979], [-73.7899659607601, 40.843173186772184], [-73.78999975309046, 40.843307817243556], [-73.78995207552958, 40.843313298934326], [-73.78993152902541, 40.84324087250168], [-73.78986183858275, 40.843250954146654], [-73.78988953603827, 40.84338093446732], [-73.78973469326743, 40.84341324747867], [-73.78974579972716, 40.843447822588665], [-73.78989919889905, 40.84341714665903], [-73.78990645143352, 40.84344221745637], [-73.78975626839882, 40.84347034066179], [-73.78977421223745, 40.843513574653066], [-73.78980449502046, 40.843586656282376], [-73.78974084707778, 40.84359957047397], [-73.78933708725715, 40.843681498055474], [-73.78931949144742, 40.84374911114966], [-73.78933021337059, 40.84379367790621], [-73.78936047257154, 40.84384323084519], [-73.78942132625365, 40.84383674251027], [-73.78946443345122, 40.843945715050005], [-73.7893470202629, 40.84397519852208], [-73.7893404709631, 40.84398508505802], [-73.78934690531925, 40.844011496597254], [-73.78947033356705, 40.844289624818295], [-73.78947182214094, 40.84429297835204], [-73.78959737629596, 40.84450197311118], [-73.78990804558647, 40.844897610903416], [-73.78992895494343, 40.844924237568044], [-73.79001969152111, 40.84492841715729], [-73.79019920190943, 40.845187777884306], [-73.7904964276791, 40.84549275521502], [-73.79066589001, 40.84574155883438], [-73.79085156066733, 40.84569878164127], [-73.79098858375902, 40.84565283206255], [-73.79101885992935, 40.84569743474458], [-73.79069785364858, 40.84578601255083], [-73.79096069596163, 40.846230246274516], [-73.79090848534602, 40.8462516010898], [-73.790940734436, 40.84630082064029], [-73.79094673676796, 40.84630998184841], [-73.79097333310666, 40.846357311524955], [-73.79106349089012, 40.846346166654506], [-73.7910642712526, 40.84634607040144], [-73.79149076513553, 40.84625100496525], [-73.79149937351545, 40.84627741912916], [-73.79112759246645, 40.84635759094952], [-73.79114478824971, 40.84641701940378], [-73.79112476570172, 40.84642747233158], [-73.79118128785346, 40.84655567592981], [-73.79126057441357, 40.846549170067966], [-73.79131170561902, 40.84653776390074], [-73.79132901030732, 40.84656254319429], [-73.79141379114441, 40.84654784703281], [-73.7914310833159, 40.84657592768415], [-73.79132451946978, 40.846608733001716], [-73.79138070403269, 40.84670617747228], [-73.79141982667437, 40.84670129956033], [-73.7914803472568, 40.846802052713656], [-73.79179343625451, 40.846731672329284], [-73.79180418591311, 40.84676798999678], [-73.79143363007184, 40.846864797968834], [-73.79136709858446, 40.84688764268581], [-73.79137658530533, 40.84692782104442], [-73.79138428282982, 40.846950369625105], [-73.79148637416937, 40.84695880326024], [-73.7914404968833, 40.84730604348358], [-73.79169837795163, 40.84725286942954], [-73.79169408366229, 40.84723636206886], [-73.79177232700852, 40.847228253279155], [-73.79192007100076, 40.84722851987908], [-73.79191997810095, 40.84725821803076], [-73.79174613599426, 40.84726615386965], [-73.79171569758651, 40.847272698856905], [-73.79171562526108, 40.847295797102596], [-73.79142962756488, 40.84735998917434], [-73.79141738478454, 40.8474800465621], [-73.79151739185973, 40.8474604291968], [-73.79154104882262, 40.84753801729824], [-73.79130570048282, 40.84759286747169], [-73.7912670856737, 40.84760186735403], [-73.79127720066779, 40.8476464250921], [-73.79127932953888, 40.84766309155011], [-73.79132975970043, 40.84805792306421], [-73.79160687331743, 40.848026505666404], [-73.79161765431445, 40.84805292440784], [-73.79133588063237, 40.848086238652414], [-73.79136288106794, 40.84823230239035], [-73.79131020699877, 40.84840049699906], [-73.79123086312458, 40.84850103935591], [-73.7912447526424, 40.84855222044715], [-73.79106000608506, 40.84872508882858], [-73.79111195407879, 40.848808127034175], [-73.7910972646854, 40.84881552492793], [-73.79104432321175, 40.84874079644996], [-73.79101783522134, 40.848811669064396], [-73.79091971727904, 40.84886687301587], [-73.7910136233899, 40.84898520971688], [-73.79098057835537, 40.848999999169436], [-73.7908871020705, 40.84888656430166], [-73.79024725580997, 40.849178846989886], [-73.7897571107061, 40.84953146928762], [-73.78983383329343, 40.84985897364479], [-73.78985836952175, 40.84997255936185], [-73.79016063798868, 40.849922539976426], [-73.79015633936459, 40.84990768266867], [-73.79022591071276, 40.849894609320785], [-73.79022586388017, 40.84990945922681], [-73.79064976493049, 40.849844233237555], [-73.79064762821827, 40.849832679590186], [-73.79092590534461, 40.84978203770634], [-73.79091297721088, 40.84974736613829], [-73.7909477685762, 40.84973917964379], [-73.79098877124653, 40.84982834953221], [-73.79067569819729, 40.84988882759024], [-73.79066056595522, 40.84986405098365], [-73.79044102699248, 40.84989170175116], [-73.79044531982218, 40.84990820797589], [-73.79036705822561, 40.84992126516153], [-73.79036275955572, 40.8499064078614], [-73.79023451253238, 40.84992267433129], [-73.79024098424524, 40.849937534414885], [-73.7901714089767, 40.84995225687013], [-73.79016710514148, 40.84993905016657], [-73.78986630313652, 40.84998939070316], [-73.79001758788853, 40.850316332465056], [-73.79016816439426, 40.85029213020269], [-73.7902008337725, 40.850267441648136], [-73.79020729510404, 40.850285601432425], [-73.79024642580437, 40.85027907315151], [-73.790237870093, 40.8502361610853], [-73.79028137292694, 40.850221390189404], [-73.79025767031703, 40.85015865126974], [-73.79035766981725, 40.850142334615924], [-73.7904050605431, 40.85027276271398], [-73.79014198665578, 40.85032508060762], [-73.79015490797059, 40.85036140235727], [-73.79022013429515, 40.85034832110921], [-73.79022659043213, 40.85036813216589], [-73.7900548453779, 40.85039751803697], [-73.79005271916627, 40.85038266468011], [-73.7901244688738, 40.850367946420214], [-73.79011588587774, 40.850333283173384], [-73.7900241182947, 40.85034781958286], [-73.79003888486419, 40.85045128862397], [-73.78991872482864, 40.85061172713771], [-73.79101737069524, 40.85040751477935], [-73.79102381130417, 40.85043227542412], [-73.78992953626674, 40.85062612255504], [-73.79003174223271, 40.8507685478139], [-73.79007093170758, 40.85093202010673], [-73.79024764837524, 40.850903510522876], [-73.79025006400954, 40.8509127959065], [-73.79007405920494, 40.850939715312535], [-73.790086400219, 40.85098447385347], [-73.7902646047139, 40.8509527298865], [-73.79026824507254, 40.85096108807381], [-73.79009094385734, 40.85099476440282], [-73.79012439171836, 40.851189912194556], [-73.78951371516173, 40.85130077171307], [-73.78956272464195, 40.851487336822075], [-73.78966051794421, 40.85147686132127], [-73.78966276217217, 40.851488703320925], [-73.78978510702639, 40.8514622938807], [-73.78977663032417, 40.851437219708586], [-73.78971059211985, 40.85144916458632], [-73.78970213099691, 40.851419451365594], [-73.78968379674485, 40.851419417941834], [-73.78966571913696, 40.85133864383001], [-73.78976843228764, 40.85132398106947], [-73.78977935323188, 40.85134905852415], [-73.7897952542796, 40.85134537500231], [-73.78980855115411, 40.85139180351458], [-73.78979509883112, 40.8513945632504], [-73.78981080478471, 40.85145213196693], [-73.7900578142692, 40.851414530211144], [-73.79001797053547, 40.8512594709595], [-73.79004975343726, 40.851257672809496], [-73.79008961569983, 40.85140716358974], [-73.7903451879796, 40.85136679305499], [-73.79030285187709, 40.851226578857236], [-73.7903370951807, 40.85122014385105], [-73.79037943653302, 40.851358503723944], [-73.79082454198961, 40.8512897063184], [-73.79078463524452, 40.85115413577379], [-73.79081765352956, 40.851148627155794], [-73.79085756325748, 40.85128326944465], [-73.79098717984283, 40.85126401529905], [-73.79099076649098, 40.85128907934996], [-73.7908660390277, 40.85130834236286], [-73.79089018435498, 40.8514039784428], [-73.7908596129088, 40.851408562094896], [-73.79083302265286, 40.851313850998054], [-73.79038545954286, 40.851386356467565], [-73.7904108048791, 40.851488489896646], [-73.79038756834426, 40.85149308842482], [-73.79035488894863, 40.85139094116019], [-73.79009442491898, 40.85143222989302], [-73.79011618216886, 40.851509299305945], [-73.79007338074102, 40.85151664642066], [-73.79005162420025, 40.851439577001], [-73.78966490344513, 40.851500382132095], [-73.78972573712088, 40.85169267056497], [-73.79014778434487, 40.85160740718401], [-73.79017310700394, 40.85166257915488], [-73.79089217930076, 40.85154690354888], [-73.79091633421972, 40.85163882596731], [-73.79019588667279, 40.85175290456291], [-73.79021640272948, 40.85183982678925], [-73.79024838262285, 40.85183343543782], [-73.79023273612084, 40.8517563771663], [-73.79045528741521, 40.85172337250565], [-73.790463705281, 40.85176700615398], [-73.79038421946557, 40.85177985423558], [-73.79038660320028, 40.851799348126626], [-73.79026555282694, 40.85181490584794], [-73.79026673300343, 40.851827900307505], [-73.7902948451226, 40.85182795141295], [-73.79030685108064, 40.85189665031758], [-73.79027873037282, 40.85189938394876], [-73.79029928958964, 40.851969026149405], [-73.79025566394581, 40.85197606492971], [-73.79008396904106, 40.85203452738219], [-73.79015509260996, 40.8522512852358], [-73.79024346325298, 40.852230639986765], [-73.79016095149859, 40.85204023643091], [-73.79019520313294, 40.85203101773807], [-73.79027404235792, 40.85222327109256], [-73.79053212420823, 40.85216341464512], [-73.79045200336085, 40.85198972095023], [-73.7905070423804, 40.851977756847845], [-73.79057493410312, 40.85215328413443], [-73.79080610587764, 40.85209987596774], [-73.79074309499363, 40.85192621249439], [-73.79058037559301, 40.851977889994], [-73.79056092524321, 40.85194444389136], [-73.79079463354844, 40.85186134138583], [-73.79081896780879, 40.851896652302045], [-73.79076267521064, 40.8519188235191], [-73.79079446716632, 40.85191424043077], [-73.79085380717721, 40.85208882496842], [-73.79099692237003, 40.85205288980362], [-73.79098719999038, 40.85203523963261], [-73.79111196150562, 40.85200576731114], [-73.79106594789536, 40.851868329827596], [-73.79102069040403, 40.85187938483921], [-73.79101097118439, 40.85186080525286], [-73.79117366731116, 40.851816553269394], [-73.79118338365927, 40.851836059914085], [-73.79110265321683, 40.85185633106272], [-73.7911669291687, 40.85201607489478], [-73.79118770764545, 40.8520161125067], [-73.79146293338718, 40.85194515019928], [-73.79139621768194, 40.85178354562009], [-73.79132894174195, 40.85180012825631], [-73.7913204511751, 40.85177969609417], [-73.79151738677945, 40.85172993589083], [-73.79152343356945, 40.85175036429258], [-73.79142679645518, 40.85177617591716], [-73.79149596814213, 40.85193407242131], [-73.79176994883002, 40.851870530951366], [-73.79172750188745, 40.851764653959144], [-73.79227187668211, 40.851610648258074], [-73.79226217075832, 40.8515874297298], [-73.79248359357182, 40.851523791406876], [-73.79249450978077, 40.85155072509265], [-73.79229143993996, 40.8516078992365], [-73.79229872412927, 40.85162369008448], [-73.79176780605944, 40.851774007706055], [-73.79180175231375, 40.851862235109934], [-73.79204882760328, 40.85180328466126], [-73.79205731457873, 40.8518255732624], [-73.79016350155166, 40.85227183108285], [-73.79017007126295, 40.852280661153415], [-73.79113795170926, 40.85205585257368], [-73.79120559068458, 40.85219774978446], [-73.79133456753253, 40.85216606767367], [-73.7913418457985, 40.85218348288131], [-73.79121251169283, 40.85221517641534], [-73.79122653385119, 40.8522580105032], [-73.79136187979904, 40.85222597753384], [-73.7913646086994, 40.852232943085355], [-73.79123084007696, 40.85226480653024], [-73.79123655971756, 40.852280289886465], [-73.79318284075846, 40.85180857187128], [-73.79308901965723, 40.851584429758056], [-73.79311837183832, 40.851578295240834], [-73.79322026048357, 40.85182843708702], [-73.79315339612619, 40.85184440453376], [-73.7932525807951, 40.851916352733845], [-73.7932378678764, 40.85193117467445], [-73.7931435368942, 40.8518703721512], [-73.79312894073925, 40.851848072675836], [-73.79124556783773, 40.85230468141072], [-73.79138052695514, 40.8526020383047], [-73.79340960300236, 40.85210987866148], [-73.793383767393, 40.85203283608551], [-73.7934098763117, 40.852021883730366], [-73.79350762831913, 40.852264043924805], [-73.793478629143, 40.85227279103696], [-73.79342400669049, 40.85213630252753], [-73.79139106468679, 40.85262807498589], [-73.79144640027788, 40.85277157192412], [-73.79042053780161, 40.85302297821258], [-73.79049879362735, 40.853188722518674], [-73.79077127595484, 40.853118526990635], [-73.79079150757708, 40.853163399592205], [-73.79100586740225, 40.85311769126193], [-73.79098982724433, 40.853035992826676], [-73.79100777755542, 40.85302860035525], [-73.79103033114585, 40.853111549592796], [-73.7914543630373, 40.853010847713506], [-73.79138972495281, 40.85283625393709], [-73.79143702716479, 40.85282272848614], [-73.79150327251574, 40.85300474895965], [-73.79170223896095, 40.85295808594555], [-73.79163107691939, 40.852784718525385], [-73.79165554436234, 40.8527773382265], [-73.79172995524623, 40.85295442349012], [-73.79196318311136, 40.85289544822876], [-73.7918936538656, 40.852720846583026], [-73.79191649946218, 40.85271098813851], [-73.79198928164561, 40.852888070297965], [-73.79222413063728, 40.852831572094274], [-73.79215297057404, 40.85265696816939], [-73.79217580837809, 40.852649584321576], [-73.79225186097551, 40.85282296038217], [-73.79248669881495, 40.85277017395219], [-73.79241717582832, 40.852593097969546], [-73.79243675473344, 40.85258570820603], [-73.79250954048048, 40.852761552714384], [-73.79283083884894, 40.852680460767814], [-73.79276455802382, 40.85250833946967], [-73.79281511966936, 40.852494819308916], [-73.79290086687061, 40.85269543598237], [-73.79283890218414, 40.85270769837338], [-73.79080758729923, 40.85319906006435], [-73.79086201986841, 40.85331978110344], [-73.7911143142938, 40.85326445192463], [-73.79126573165874, 40.853706864233104], [-73.79252408728894, 40.85340992070495], [-73.79238610589364, 40.85306209388165], [-73.79240931036925, 40.85305333611478], [-73.79255598392581, 40.85340117854083], [-73.79297928311027, 40.85330294490942], [-73.79284710092516, 40.852952929956025], [-73.79287610048584, 40.8529441813284], [-73.7930399117026, 40.85337124928513], [-73.79301381632482, 40.853377802403955], [-73.792999480554, 40.85332937972204], [-73.79127368128135, 40.85373220788165], [-73.79129041006203, 40.85384457425317], [-73.79105721254825, 40.85391841242664], [-73.79128417842017, 40.85386107898408], [-73.79129023495192, 40.853878722994494], [-73.79245816844812, 40.85360070875487], [-73.79248836752521, 40.853671708909346], [-73.79246226638655, 40.853679911499874], [-73.79244069248779, 40.85363037509783], [-73.79107002765942, 40.85394495666465], [-73.79108281745684, 40.853963197035256], [-73.79138477253804, 40.853895478673856], [-73.7915836098969, 40.85389088823204], [-73.79171835293754, 40.85391732878054], [-73.7917861117569, 40.853993539900856], [-73.7918178199531, 40.853989436670055], [-73.79181716188373, 40.85398003873739], [-73.79251418368892, 40.853896308270706], [-73.79250616578281, 40.85385422192266], [-73.79253714604873, 40.85384932781285], [-73.79256758944628, 40.854016434943034], [-73.79253009854688, 40.8540188426912], [-73.79251736175938, 40.85392229994337], [-73.7918261216321, 40.85400148723032], [-73.79182140042258, 40.85399695489827], [-73.79179366809406, 40.85400482990041], [-73.7919181173638, 40.854222354742845], [-73.79133811791583, 40.85443901153831], [-73.79129282160633, 40.854584025976855], [-73.79186843464552, 40.85541675186694], [-73.79207675667554, 40.8556451677071], [-73.79250306685435, 40.855788666137045], [-73.79249297838457, 40.85589406348061], [-73.7924879115736, 40.85594699320981], [-73.79241821541393, 40.855995344340634], [-73.79230720796731, 40.856072355408216], [-73.79211616948511, 40.85601261529166], [-73.79203322933732, 40.85614052347183], [-73.79201712228527, 40.85617694860626], [-73.79257074199624, 40.85620600721377], [-73.79256944485117, 40.85623013583762], [-73.79263787674974, 40.85623582617103], [-73.7926453206665, 40.85620057278915], [-73.79270523985137, 40.85619232890572], [-73.79268768222656, 40.856335218720375], [-73.79311537800541, 40.85637218147505], [-73.79311911983078, 40.85634805890509], [-73.79315700296156, 40.85635091107476], [-73.7931468608596, 40.856467828471146], [-73.79310775533048, 40.8564649741061], [-73.79311527696748, 40.85640466330657], [-73.79261793796836, 40.856358294907594], [-73.79263294381181, 40.856249739029394], [-73.79256817599392, 40.85624498185471], [-73.7925681412599, 40.85625611876997], [-73.79201050009051, 40.85622512771836], [-73.79198719874023, 40.85636551214246], [-73.79193700279743, 40.85640515792216], [-73.79207000927919, 40.85641496516156], [-73.79205892560435, 40.85644139483644], [-73.7920974020609, 40.85644981691218], [-73.79208814819948, 40.85647764200938], [-73.79206981995775, 40.85647552247019], [-73.79205778470703, 40.85651308623457], [-73.79201746383625, 40.85650814112617], [-73.79200911229961, 40.856540144209966], [-73.79190832251761, 40.85652395422946], [-73.7919018334025, 40.85654691136797], [-73.7930513380812, 40.8567259611496], [-73.79306886680175, 40.85667979474308], [-73.79309492152382, 40.85668644140406], [-73.79305685295346, 40.85681616547445], [-73.7930307836123, 40.856813917951534], [-73.7930483589582, 40.856752353857736], [-73.79189422958875, 40.85656888932964], [-73.79185937713562, 40.85666592438058], [-73.7918421311268, 40.85666118333631], [-73.7918284550686, 40.8566681433947], [-73.79196180591408, 40.856716856585116], [-73.79195628211025, 40.85672450329606], [-73.79182299976162, 40.85667610751278], [-73.79179264535283, 40.85671985281914], [-73.79192955714267, 40.85676900166847], [-73.79192219262924, 40.85677873324112], [-73.79178502817685, 40.8567308579451], [-73.79170704257359, 40.85685184285503], [-73.79186032552957, 40.85679280353208], [-73.7918822302671, 40.85682416512516], [-73.79183633462834, 40.85684287530318], [-73.79183269744581, 40.85683312505861], [-73.79173546476552, 40.856866429528196], [-73.79182143771003, 40.85690024255173], [-73.79187172581227, 40.85698428896384], [-73.79220265950248, 40.857146000410324], [-73.79222842636995, 40.857114724238784], [-73.79221469914035, 40.857107042845776], [-73.79237484012394, 40.85690617253139], [-73.7924279413047, 40.856928542536735], [-73.79226687280277, 40.85713289038608], [-73.79224490126386, 40.85712310596905], [-73.79222189186365, 40.85715229842467], [-73.79273719867784, 40.85739366621669], [-73.79282713237977, 40.857435789917886], [-73.79289753888773, 40.85718939649052], [-73.79295400784763, 40.85699178335115], [-73.79301264383005, 40.857003026043145], [-73.792996284781, 40.85706359655042], [-73.79288403888904, 40.85747920249362], [-73.79281074586505, 40.85746422142733], [-73.79271730383812, 40.85741901131974], [-73.79185978715205, 40.857004107259364], [-73.79185432641995, 40.85701379719813], [-73.79268338575463, 40.85742039359269], [-73.79260923020631, 40.857507704502304], [-73.7925766962139, 40.85748784672487], [-73.7926355732806, 40.85742195660253], [-73.79211266783624, 40.85716693187042], [-73.79189451913076, 40.85743712186523], [-73.792465160653, 40.857715331784], [-73.79254150089487, 40.85762472518378], [-73.79255162803088, 40.85763007584013], [-73.79256970440578, 40.857639625362246], [-73.79239521723282, 40.8578455477522], [-73.79238725639992, 40.857839475267994], [-73.79237353813318, 40.85782901033757], [-73.79244336403542, 40.85773674197192], [-73.79174254082349, 40.85739395000424], [-73.7917578139993, 40.85737417945399], [-73.7918728196394, 40.85742718307675], [-73.79209332504095, 40.857157989947204], [-73.79184303217382, 40.85702870201135], [-73.7917397997259, 40.8571783542773], [-73.79160393461318, 40.85737531299246], [-73.79129378852147, 40.85726323869815], [-73.79094202260367, 40.857552748188766], [-73.79123307405831, 40.85768657030246], [-73.79124452095031, 40.857674217379795], [-73.79131613460314, 40.85770528253102], [-73.79130630096441, 40.85772258820141], [-73.7916366458796, 40.85788281257089], [-73.79175600351645, 40.85776052352311], [-73.7917852942325, 40.857775425855564], [-73.79159890915145, 40.85796317755999], [-73.79143695908105, 40.85815468512309], [-73.79140929150854, 40.85814226029774], [-73.79161866075827, 40.8579013420481], [-73.79129321642519, 40.857737414000304], [-73.79127850954808, 40.85774976102998], [-73.79121179649877, 40.85771499223178], [-73.79122161784531, 40.857701399039705], [-73.79093222800743, 40.857567787470536], [-73.79079067047185, 40.85775035081783], [-73.79068061700995, 40.8578027903298], [-73.7904419014552, 40.85791653409865], [-73.79023592738741, 40.85815408481125], [-73.79006133563223, 40.858459548561314], [-73.79012538798082, 40.858522102342256], [-73.79013640468453, 40.85851724995587], [-73.79016016469429, 40.85854165463286], [-73.79014637788677, 40.858552767033466], [-73.79020122975753, 40.858601589710446], [-73.79018745194999, 40.8586099173861]]], [[[-73.78283291447852, 40.85587030844573], [-73.78302371522504, 40.85509276666495], [-73.78367819665118, 40.85517343750966], [-73.78394699722007, 40.85563043752662], [-73.78343487501385, 40.856362865958886], [-73.78283291447852, 40.85587030844573]]], [[[-73.78061730829718, 40.855735175810025], [-73.78090476851291, 40.8549681331623], [-73.7815638969994, 40.855001286433904], [-73.78156303268149, 40.85574479600088], [-73.78122782332017, 40.856087789162764], [-73.78061730829718, 40.855735175810025]]], [[[-73.78833349834521, 40.834667129759346], [-73.78931223606624, 40.83446488655343], [-73.78951019872322, 40.835364042525754], [-73.78845700015209, 40.835309914315395], [-73.78833349834521, 40.834667129759346]]]]}}, {\&quot;id\&quot;: \&quot;46\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 47, \&quot;Shape_Leng\&quot;: 0.0898275563294, \&quot;Shape_Area\&quot;: 0.000163198117339, \&quot;zone\&quot;: \&quot;Claremont/Bathgate\&quot;, \&quot;LocationID\&quot;: 47, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89090203399996, 40.854116885999865], [-73.89216687399981, 40.85276946199989], [-73.89307140900002, 40.85324998699989], [-73.89431774099977, 40.851891310999854], [-73.89478764999994, 40.85108166699989], [-73.89407258999991, 40.85071318999995], [-73.89494627999981, 40.849104852999865], [-73.89557755999984, 40.847854641999895], [-73.89611702199987, 40.846778518999926], [-73.89617712999998, 40.8466583209999], [-73.89535848999982, 40.84651803199993], [-73.89433599299984, 40.846486680999874], [-73.8940930149999, 40.84648822299994], [-73.89384985999999, 40.84647439399987], [-73.89360906599997, 40.84644525599987], [-73.89337309899989, 40.84640119399996], [-73.89290102299996, 40.84626832999992], [-73.89398467599997, 40.84470395899989], [-73.89464252699996, 40.84390413999996], [-73.89479022099985, 40.8437203219999], [-73.89481942600001, 40.84368377099985], [-73.894847588, 40.84364636299994], [-73.89537836199995, 40.842938778999965], [-73.89564979700005, 40.843035539999896], [-73.89591487099987, 40.843142918999895], [-73.8961725309998, 40.8432605479999], [-73.89642177099996, 40.84338795899991], [-73.89666161699988, 40.84352460699992], [-73.89749111599987, 40.84206708899992], [-73.89826966299981, 40.84067994699995], [-73.89903034699984, 40.839330476999876], [-73.89996792899998, 40.8376547629999], [-73.90004236899989, 40.837522574999895], [-73.90014268099992, 40.8373444399999], [-73.90019045299977, 40.837259606999964], [-73.90022284799984, 40.83720207899991], [-73.9002588729999, 40.83713810599989], [-73.90030702699993, 40.837052593999914], [-73.90035730100003, 40.83696331799991], [-73.90038944699995, 40.83690623099993], [-73.90056610899994, 40.83659250799993], [-73.90122534999992, 40.83549991099991], [-73.90134101199988, 40.83544132399986], [-73.90185605899981, 40.83462212499988], [-73.90343501499996, 40.83221638099998], [-73.90367608499999, 40.83185824799992], [-73.90397692599986, 40.83141130499991], [-73.90450621899981, 40.8306249629999], [-73.90553116799988, 40.82910413299989], [-73.90657083599997, 40.829452219999936], [-73.90747341000004, 40.829743308999916], [-73.907527588, 40.82976078199988], [-73.90772165099985, 40.829823367999914], [-73.908959903, 40.83022623299989], [-73.909144659, 40.83028572999996], [-73.90971373799982, 40.83047001399989], [-73.91049010699992, 40.830737372999884], [-73.90962130699984, 40.832281421999895], [-73.9095189569999, 40.83246377699987], [-73.90946039499991, 40.83256811599989], [-73.90942257599983, 40.83263549599993], [-73.9093741529999, 40.832721771999914], [-73.90928354899982, 40.83288319599993], [-73.90923681499991, 40.83296646099988], [-73.909177781, 40.83307163899986], [-73.90910597799993, 40.833199565999905], [-73.90889804099996, 40.833570034999894], [-73.90882575999996, 40.8336988109999], [-73.90869131200002, 40.83393834699988], [-73.90857547999998, 40.834144441999904], [-73.90852151699984, 40.834240455999904], [-73.90837656, 40.83449837099991], [-73.90823980199985, 40.83474169399996], [-73.90810870199985, 40.83497494999988], [-73.90799132699986, 40.8351837829999], [-73.90797135199996, 40.83521932399989], [-73.90783293099987, 40.83546559899987], [-73.9077182169999, 40.835669695999854], [-73.90762665999985, 40.835832588999935], [-73.90757269399987, 40.83592860399989], [-73.90740200499981, 40.836232282999966], [-73.90733306999991, 40.83634242699987], [-73.90727112599996, 40.83644139899997], [-73.90721294199983, 40.83653436399994], [-73.90713954499994, 40.83665163499991], [-73.906975505, 40.836913727999885], [-73.90688497199997, 40.83705837699988], [-73.90679878899991, 40.837196073999976], [-73.90652354, 40.83763584299988], [-73.90646169600002, 40.83773464999995], [-73.90635674699993, 40.837902326999924], [-73.90625475300006, 40.83806527999994], [-73.90597940399996, 40.83850519599985], [-73.90538357999992, 40.839768982999885], [-73.90560739499988, 40.8398436189999], [-73.90548026199987, 40.840052591999935], [-73.90536832399985, 40.84026688999992], [-73.905272123, 40.8404855589999], [-73.90519207999992, 40.840707581999915], [-73.90515655599995, 40.84104021299991], [-73.90503176699985, 40.8422629449999], [-73.9050151499998, 40.842404697999875], [-73.90493735799986, 40.84337489399996], [-73.90484645099987, 40.84458935999987], [-73.90484219199982, 40.844665447999944], [-73.90483494099993, 40.844752618999976], [-73.90483121999989, 40.84480034199987], [-73.9041010739999, 40.8447308219999], [-73.90338651199983, 40.844655295999914], [-73.9026881009999, 40.84458147199991], [-73.901344046, 40.84442875099994], [-73.9013172989999, 40.844473940999926], [-73.90126635699991, 40.844562217999915], [-73.90088731499989, 40.84524135999991], [-73.90020067899994, 40.84647356099991], [-73.89967790699988, 40.84742465799992], [-73.89887482599984, 40.84881118399988], [-73.89808598699996, 40.850213123999914], [-73.89708706499987, 40.85196827699985], [-73.89662446799987, 40.8527875899999], [-73.89560883299981, 40.85457036999986], [-73.89549889799987, 40.85474976599994], [-73.89477596099992, 40.85592952599996], [-73.89441355099994, 40.85643377599997], [-73.8929935429999, 40.85838611999985], [-73.89225707599982, 40.85940997599994], [-73.89174394999986, 40.860177146999945], [-73.89115375599981, 40.86091361599996], [-73.89106059999996, 40.861471814999945], [-73.89106280699994, 40.8615294119999], [-73.89082169799998, 40.86139939599989], [-73.89067455199995, 40.86132004099988], [-73.89036823899993, 40.86115807599985], [-73.89027555599993, 40.86110907299996], [-73.89059489199987, 40.86071569999991], [-73.89112568799987, 40.860061824999924], [-73.89112461399988, 40.8588700059999], [-73.89111943300001, 40.85865896199989], [-73.89111115400003, 40.85838432199987], [-73.89111318899985, 40.857850998999865], [-73.8911055689998, 40.85742738299995], [-73.89109710400002, 40.856779813999886], [-73.89108676599993, 40.85659725699984], [-73.8907742849999, 40.85581193999993], [-73.89044259299995, 40.85504635099993], [-73.89038953999983, 40.85468905799996], [-73.8906903199999, 40.854353261999954], [-73.89090203399996, 40.854116885999865]]]}}, {\&quot;id\&quot;: \&quot;47\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 48, \&quot;Shape_Leng\&quot;: 0.0437467441431, \&quot;Shape_Area\&quot;: 9.42538425377e-05, \&quot;zone\&quot;: \&quot;Clinton East\&quot;, \&quot;LocationID\&quot;: 48, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99117738199989, 40.75532984899992], [-73.99163271299996, 40.75470680499996], [-73.99446824699999, 40.75590886199991], [-73.99500601599988, 40.756136713999865], [-73.99511286399995, 40.75617577399984], [-73.99577488199998, 40.75645451499985], [-73.99730671499998, 40.757110506999894], [-73.997233738, 40.7572095429999], [-73.99692177899989, 40.75763758199988], [-73.99685244899985, 40.75773270899988], [-73.996800897, 40.757789159999945], [-73.99663529299985, 40.75801292199992], [-73.99640941599995, 40.75833915899993], [-73.9959423659999, 40.758980978999965], [-73.99547450199992, 40.759626856999894], [-73.99498358099996, 40.76030016199997], [-73.9945259329999, 40.7609270449999], [-73.99406959, 40.76155258499991], [-73.99360930599991, 40.76218343599989], [-73.99315623899986, 40.7628063609999], [-73.9927014349998, 40.76343080599987], [-73.99224402800002, 40.764056778999894], [-73.99178834099983, 40.76468386799991], [-73.99133264599988, 40.765309269999904], [-73.99087599499987, 40.7659342209999], [-73.99042167999981, 40.76656125799984], [-73.98996382699985, 40.767187474999886], [-73.98950498200003, 40.767815381999874], [-73.98905077199991, 40.768440091999906], [-73.98855898599986, 40.7691158169999], [-73.98806289599996, 40.769790799999925], [-73.98521720299992, 40.76859462999991], [-73.98236545099999, 40.7673921529999], [-73.9828771349999, 40.766715594999866], [-73.98336657899995, 40.766045241999926], [-73.98382185700001, 40.7654184749999], [-73.98428230099987, 40.76479181499994], [-73.98473393799985, 40.76416910499991], [-73.98519152199998, 40.76354367499993], [-73.98564677799999, 40.76291487399988], [-73.98610406199981, 40.762289952999865], [-73.98656138499996, 40.7616601219999], [-73.98701514599995, 40.76103736699989], [-73.987475247, 40.76040478699991], [-73.98792640699999, 40.759790276999865], [-73.98839044599993, 40.75916418599996], [-73.98884253899993, 40.75853349899991], [-73.98929727499991, 40.7579066369999], [-73.98979085399996, 40.7572331319999], [-73.99027621399986, 40.756567564999926], [-73.99072636299992, 40.75595040599995], [-73.99117738199989, 40.75532984899992]]]}}, {\&quot;id\&quot;: \&quot;48\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 49, \&quot;Shape_Leng\&quot;: 0.0752900183427, \&quot;Shape_Area\&quot;: 0.000203185525471, \&quot;zone\&quot;: \&quot;Clinton Hill\&quot;, \&quot;LocationID\&quot;: 49, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.96062056499981, 40.69632013999993], [-73.96015854699988, 40.69411730899989], [-73.95931047999983, 40.69421508699989], [-73.95799732999993, 40.694365838999914], [-73.95708701900001, 40.69447043999992], [-73.95614239299985, 40.694579018999896], [-73.95582662799985, 40.692992382999925], [-73.95541057999996, 40.69090829199994], [-73.95635602999991, 40.69079978199989], [-73.95727249099987, 40.69069347799987], [-73.95808563499989, 40.690601463999876], [-73.95818048699985, 40.690590729999876], [-73.95857844799987, 40.69054569399986], [-73.95886713600001, 40.69051224799996], [-73.9589933049999, 40.69049762899987], [-73.95928133699987, 40.69046425699991], [-73.959348624, 40.69045646099992], [-73.95942791399997, 40.69044727499993], [-73.95957591899987, 40.69042998799992], [-73.96008336799996, 40.69037071599989], [-73.96013760799985, 40.69036437999989], [-73.96029281699998, 40.69034624999995], [-73.96023740299987, 40.690062221999874], [-73.96022304499992, 40.6899886269999], [-73.96018691899992, 40.6898034559999], [-73.96017256100002, 40.68972986199988], [-73.96012172900004, 40.689469306999825], [-73.96009714599994, 40.68934520999991], [-73.96000519799986, 40.688881033999955], [-73.959859395, 40.6881474509999], [-73.95971374799981, 40.687415633999926], [-73.95956770199984, 40.686682554999955], [-73.95684165199995, 40.68699607899989], [-73.95468418899998, 40.68724485399985], [-73.95453798699995, 40.686511174999936], [-73.95439296899998, 40.68577971999988], [-73.95424647699987, 40.685046247999914], [-73.95410042600001, 40.68431310799984], [-73.953954531, 40.683580778999946], [-73.95380893500004, 40.68284800799992], [-73.95366256199999, 40.68211490399989], [-73.95351616899988, 40.6813825999999], [-73.9533701749999, 40.680640507999904], [-73.95328187399996, 40.68020003099985], [-73.95436836300001, 40.680075106999915], [-73.95543681599986, 40.67995785499992], [-73.95530907499989, 40.67927313499995], [-73.95529361599996, 40.679203150999825], [-73.9559586239999, 40.679346246999906], [-73.95829216799997, 40.67983113299993], [-73.96134655899995, 40.6804635239999], [-73.96329205499984, 40.680881585999884], [-73.96442184899986, 40.681119287999934], [-73.96447930699999, 40.681131147999956], [-73.965510434, 40.6813440199999], [-73.96657247099982, 40.68156481399995], [-73.96753196799997, 40.68176878399992], [-73.96868961400001, 40.68200525799988], [-73.96867398499984, 40.68208599399989], [-73.96906202000002, 40.68415736099991], [-73.96948939899981, 40.68628830699986], [-73.9697831419999, 40.68775161199994], [-73.97013154199992, 40.68950630799986], [-73.96910362499993, 40.68946752199986], [-73.96952115199994, 40.69156355899989], [-73.96983118499983, 40.69313424399997], [-73.96880989600005, 40.69312038199996], [-73.9693409769999, 40.69576842999993], [-73.96935567900005, 40.69585472899994], [-73.9693719569999, 40.695937759999936], [-73.96937861700003, 40.695991333999906], [-73.9693945009999, 40.696080388999846], [-73.96840655900004, 40.6960364839999], [-73.96741363299996, 40.69599862899988], [-73.96641979599997, 40.69596410599996], [-73.96546721499983, 40.695932161999956], [-73.9645507049999, 40.696107591999855], [-73.96434801500007, 40.69618376599989], [-73.96415417899982, 40.69627444999987], [-73.963971858, 40.69637865499991], [-73.963803372, 40.69649503799992], [-73.96365073599986, 40.69662194399993], [-73.96347515199992, 40.69680066799991], [-73.96331636199999, 40.69698969799986], [-73.96317583599986, 40.69718762099991], [-73.96305480199987, 40.69739287199992], [-73.96295416199992, 40.69760374899989], [-73.96288219599991, 40.69782702599988], [-73.96283963699993, 40.698038667999946], [-73.96248295899996, 40.698095383999956], [-73.9623976909999, 40.69810894499991], [-73.96235903300003, 40.69811509199996], [-73.96233072899996, 40.698119593999884], [-73.96214289299981, 40.69814945699991], [-73.96189837799996, 40.69818833299994], [-73.96105100699992, 40.69832607899989], [-73.96092543799982, 40.697736506999895], [-73.96062056499981, 40.69632013999993]]]}}, {\&quot;id\&quot;: \&quot;49\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 50, \&quot;Shape_Leng\&quot;: 0.0557479867536, \&quot;Shape_Area\&quot;: 0.000173249283326, \&quot;zone\&quot;: \&quot;Clinton West\&quot;, \&quot;LocationID\&quot;: 50, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99667705784736, 40.77351005394221], [-73.99434191991617, 40.77252478194338], [-73.9942497922864, 40.7725264851381], [-73.99416328456307, 40.77248719152385], [-73.99383108201548, 40.77293178742534], [-73.9937873699999, 40.77290384599992], [-73.99372534699988, 40.772864197999915], [-73.9935908639999, 40.77279007999994], [-73.99350262199991, 40.772751632999885], [-73.99387445099994, 40.77223816799994], [-73.99378189799992, 40.77219909099988], [-73.99365606199987, 40.772145961999854], [-73.990913076, 40.770987758999894], [-73.99059644699987, 40.77085480999995], [-73.98806289599996, 40.769790799999925], [-73.98855898599986, 40.7691158169999], [-73.98905077199991, 40.768440091999906], [-73.98950498199986, 40.76781538299985], [-73.98996382699985, 40.767187474999886], [-73.99042167999981, 40.76656125799984], [-73.99087599499987, 40.7659342209999], [-73.99133264599988, 40.765309269999904], [-73.9917883399999, 40.76468386799991], [-73.99224402800002, 40.764056778999894], [-73.9927014349998, 40.76343080599987], [-73.99315623899986, 40.7628063609999], [-73.99360930599991, 40.76218343599989], [-73.99406959, 40.76155258499991], [-73.9945259329999, 40.7609270449999], [-73.99498358099996, 40.76030016199997], [-73.99547450199992, 40.759626856999894], [-73.99623223099987, 40.759946031999924], [-73.99831474500002, 40.76082320899991], [-74.00103587499999, 40.76196835199993], [-74.00115054199988, 40.762025811999884], [-74.00127796299991, 40.76207582499987], [-74.00133748499992, 40.76220852199988], [-74.00153309083484, 40.762644598063744], [-74.00375735018837, 40.763582241820224], [-74.00361214797076, 40.76377704395487], [-74.00138603698596, 40.76285009500187], [-74.0009730802201, 40.763420271725614], [-74.00314976988997, 40.764332888184576], [-74.00294809515721, 40.76461683643388], [-74.00306161234062, 40.764665782653374], [-74.00313458336218, 40.76464959820679], [-74.00316194577034, 40.76461261045457], [-74.00322275585351, 40.7646380376702], [-74.00315587058185, 40.76473050988001], [-74.00314652967363, 40.76473628139182], [-74.00313606019984, 40.76474079644633], [-74.00312475155106, 40.76474393024101], [-74.00311291631381, 40.76474559615368], [-74.00310088163067, 40.7647457481358], [-74.0030889801568, 40.764744381986716], [-74.00106364220507, 40.763888208262884], [-74.00073105253733, 40.76375528636147], [-73.99992712367724, 40.76340652847929], [-73.99963853555366, 40.76356907099078], [-73.99962263458193, 40.76355908121048], [-73.99951767096813, 40.76370627918037], [-73.99944642217294, 40.76380619457846], [-73.99943330724624, 40.76382391019702], [-73.99915098087908, 40.76420525958265], [-74.00227436642368, 40.76552518109951], [-74.00228802371483, 40.76556154429785], [-74.00205713831559, 40.76587739041855], [-74.0020245433034, 40.76589326657037], [-73.99919997246725, 40.764701914982496], [-73.9991083256454, 40.76466249985751], [-73.99888473174974, 40.76456937704858], [-73.99857638530527, 40.76499860727083], [-73.99859978707626, 40.76507334028592], [-73.99863487876338, 40.765085794737736], [-73.99866530473436, 40.7651044807472], [-73.99868637477196, 40.76513739426769], [-73.99869573037279, 40.76517476567959], [-73.99868870694561, 40.765208570449786], [-73.99866764711366, 40.765237035342864], [-73.99863371556073, 40.76526016874122], [-73.99858924105148, 40.765276178806765], [-73.99848276468678, 40.76529753698438], [-73.9984383037147, 40.765316213833856], [-73.99840202518257, 40.7653509090876], [-73.99827090308345, 40.76555223341328], [-73.99828160709528, 40.765567775437326], [-74.00154217871193, 40.76694470253266], [-74.00157335385273, 40.766977192210646], [-74.0015618057547, 40.766996499368275], [-74.00139437159504, 40.76723004773297], [-74.0013643461298, 40.76724936447367], [-74.00131469635994, 40.76725112004992], [-74.00129391014984, 40.76724145824158], [-73.99815678438965, 40.76589403537412], [-73.99814818647361, 40.76590560707495], [-73.9980667590535, 40.76587188113572], [-73.99772134825699, 40.76634912055583], [-73.99737808447954, 40.76682338637958], [-74.00062837395299, 40.76820311105873], [-74.00065016786208, 40.768220374289214], [-74.00064950530414, 40.76824523610559], [-74.00045489336712, 40.76850419517739], [-74.000417653932, 40.768512479964485], [-74.00038586489072, 40.76850419542923], [-73.99715588949206, 40.76712869617278], [-73.99681598463503, 40.76760062185919], [-73.9964571540504, 40.76809881579563], [-73.999728191901, 40.769473506633716], [-73.99973590247859, 40.76950617733152], [-73.99955518930786, 40.769750807740046], [-73.99951552161599, 40.7697675658378], [-73.99947253734007, 40.76976421496914], [-73.99707176039315, 40.768732643576804], [-73.99702628821062, 40.76879551562384], [-73.99715035477142, 40.76884738771338], [-73.99701071413831, 40.76902879065363], [-73.99689311312365, 40.76897962881938], [-73.9965712643956, 40.76942456827389], [-73.9990268283291, 40.7704632729821], [-73.9987620691431, 40.7708250567092], [-73.99631327022087, 40.76979883633644], [-73.99588004351683, 40.77040057901223], [-73.99601693196188, 40.77045484888618], [-73.99590077425023, 40.77061312350089], [-73.99576733283615, 40.77055459645645], [-73.99542474436292, 40.77103161516795], [-73.99575648212907, 40.77116066846575], [-73.99570859069954, 40.77122581253298], [-73.99579774020465, 40.77128256276402], [-73.99581687579034, 40.77125651641553], [-73.9959128360384, 40.771297855623835], [-73.99592803670667, 40.771275102837656], [-73.99600175749052, 40.77130746533058], [-73.99589990100937, 40.77145029858209], [-73.99589260894868, 40.771447087527264], [-73.99585437252816, 40.77149918074849], [-73.99579117748759, 40.77147551882039], [-73.99582805886249, 40.771421667222434], [-73.99572993314403, 40.77137881879378], [-73.99575123412814, 40.77135428277978], [-73.99562982240303, 40.77132529262805], [-73.99562306904355, 40.77133695751285], [-73.99530566365368, 40.77119600490955], [-73.99512395556876, 40.77145073826708], [-73.99499014482059, 40.77144070980647], [-73.99495733353699, 40.771449190697716], [-73.99493501658995, 40.77146814657798], [-73.99492385794417, 40.77148560593743], [-73.99492582120644, 40.771516042405466], [-73.99500915438713, 40.771607339944175], [-73.99497830771192, 40.771645249473266], [-73.99497688494725, 40.77165877492327], [-73.99711218538603, 40.77255323669952], [-73.99690946902788, 40.77283294565996], [-73.99477407930827, 40.77192954753019], [-73.99444501293378, 40.77237712658826], [-73.99545514995584, 40.772802675029084], [-73.9955449252083, 40.77267481382616], [-73.99644894667618, 40.77305684199676], [-73.99635558854986, 40.77317889215508], [-73.9962297200193, 40.77312897504538], [-73.99614329133088, 40.77324754156344], [-73.99656159477641, 40.773410941950964], [-73.99668544431172, 40.77350368804627], [-73.99667705784736, 40.77351005394221]]]}}, {\&quot;id\&quot;: \&quot;50\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 51, \&quot;Shape_Leng\&quot;: 0.0953613442277, \&quot;Shape_Area\&quot;: 0.000395756553505, \&quot;zone\&quot;: \&quot;Co-Op City\&quot;, \&quot;LocationID\&quot;: 51, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82091617199997, 40.86891693399989], [-73.81940759199996, 40.867999270999874], [-73.81938761399987, 40.867986901999856], [-73.81578764099999, 40.8657580609999], [-73.81641455899984, 40.8651514979999], [-73.81699760299986, 40.864459030999946], [-73.8168449589999, 40.864306792999926], [-73.8176165129999, 40.86362634299998], [-73.81884300999991, 40.862568209999885], [-73.82037552999996, 40.86103300499993], [-73.8245057509999, 40.85976402099993], [-73.82444012099991, 40.85950138399989], [-73.82632571099997, 40.85929799699995], [-73.82699653199998, 40.85908778599986], [-73.82714556299992, 40.85923239499992], [-73.82720794099991, 40.85941373899988], [-73.82732348799999, 40.859686886999896], [-73.82741458099993, 40.85995987299994], [-73.82759107999998, 40.86007855099994], [-73.82787032399982, 40.860678212999915], [-73.82799444999982, 40.860840185999905], [-73.82826796599981, 40.860837332999935], [-73.82834347399992, 40.86089202599988], [-73.82840758999997, 40.860948300999894], [-73.82954731199996, 40.862164086999925], [-73.83022388499991, 40.863429527999884], [-73.83054182799988, 40.86373143499994], [-73.83175316499981, 40.8659067679999], [-73.83255828799996, 40.86728777299991], [-73.83312947400005, 40.86826747399991], [-73.83315960399985, 40.86831975599994], [-73.8334796669999, 40.86821612199987], [-73.83354911599997, 40.868193637999916], [-73.83391246099991, 40.868075988999884], [-73.8348179389999, 40.86778172199993], [-73.83565766499987, 40.86751275599992], [-73.83655628099997, 40.86935217599989], [-73.83740181399989, 40.87110892899994], [-73.83829221499984, 40.87295133899995], [-73.83746027699993, 40.87322264999988], [-73.8383540939998, 40.87492195799993], [-73.83924788999988, 40.876618737999905], [-73.83841016399981, 40.87686761499991], [-73.8381484219999, 40.876953298999915], [-73.83855197999986, 40.87711952799991], [-73.83925549199988, 40.87741982299989], [-73.8395648579999, 40.87754981599993], [-73.839711891, 40.8776115949999], [-73.8401480179999, 40.8777884259999], [-73.84114053199991, 40.878215735999945], [-73.84228241899993, 40.878701972999906], [-73.84239559299994, 40.87875039299991], [-73.84324113799987, 40.879108912999904], [-73.8427378519999, 40.87942490299989], [-73.84201454899988, 40.87987225999992], [-73.84127784699999, 40.8803175479999], [-73.84046213299987, 40.880622867999875], [-73.83965170899998, 40.88092595799992], [-73.83874273699996, 40.881265967999916], [-73.83782792499997, 40.88160813999987], [-73.8369874379998, 40.88193908299993], [-73.83664134299984, 40.88212002499992], [-73.83621837399996, 40.8823930119999], [-73.83560954999997, 40.88294527899995], [-73.83475583399996, 40.8835562939999], [-73.83434542099987, 40.88385001999993], [-73.83404698799987, 40.883990319999945], [-73.83361799799997, 40.88418563099992], [-73.8334224639999, 40.88427528899988], [-73.83342222600004, 40.8842753959999], [-73.8334219759999, 40.88427549499986], [-73.83321720299985, 40.88435431699989], [-73.83321711999992, 40.88435435299993], [-73.83321703599982, 40.88435437999986], [-73.83300454299992, 40.884421634999974], [-73.83300425899994, 40.88442172499991], [-73.83300396199995, 40.88442179699992], [-73.83278561399996, 40.88447683399994], [-73.83278538799992, 40.8844768879999], [-73.83278516199996, 40.88447693199989], [-73.83256256300001, 40.884519400999864], [-73.83256233799996, 40.884519444999945], [-73.83256211199998, 40.88451947199998], [-73.83233699299986, 40.88454919399987], [-73.83130254299985, 40.884711422999956], [-73.83065359099987, 40.88485293899989], [-73.83033698199986, 40.88496949199991], [-73.82953327299994, 40.885303333999936], [-73.82791367899995, 40.88599054299988], [-73.82777310699997, 40.886047017999886], [-73.82700490399988, 40.88634614699992], [-73.82672826599993, 40.88644534299988], [-73.82611278899988, 40.886666035999895], [-73.82529579999982, 40.88697637999996], [-73.82448935999992, 40.88742251999991], [-73.82403093399992, 40.88769579499991], [-73.82387140599998, 40.88778362799996], [-73.82385099099994, 40.88776831599994], [-73.82382288900006, 40.8877472369999], [-73.82077408699998, 40.886710602999884], [-73.82031167699992, 40.8856097399999], [-73.82027432999985, 40.885550699999925], [-73.82023958299997, 40.88549105099987], [-73.81992586499996, 40.88211933299987], [-73.82110268599995, 40.878969244999915], [-73.82329599399986, 40.87309741799988], [-73.821266938, 40.869071605999885], [-73.82111615299983, 40.869008136999895], [-73.82103881099985, 40.868976079999875], [-73.82097601199978, 40.868949786999956], [-73.82091617199997, 40.86891693399989]]]}}, {\&quot;id\&quot;: \&quot;51\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 52, \&quot;Shape_Leng\&quot;: 0.0289076710093, \&quot;Shape_Area\&quot;: 4.52027509603e-05, \&quot;zone\&quot;: \&quot;Cobble Hill\&quot;, \&quot;LocationID\&quot;: 52, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.99588110299992, 40.68239495399995], [-73.99620846299992, 40.681723424999916], [-73.998192111, 40.68228732999989], [-74.00004865199998, 40.682803355999965], [-73.9997255609999, 40.68347314899994], [-73.99940054699985, 40.684144561999844], [-73.99908066099994, 40.68481599199985], [-73.99986579399993, 40.685036468999954], [-74.00064737999996, 40.685253946999914], [-73.99969626699995, 40.68719803399989], [-73.99963768399985, 40.68731476799996], [-73.99937882999994, 40.68785319299995], [-73.99906961899994, 40.68849807499985], [-73.99874207699997, 40.689177013999924], [-73.99841229299983, 40.68985608799994], [-73.99808645299991, 40.69053507799987], [-73.99776924399993, 40.691194697999954], [-73.99623278099983, 40.69075777399991], [-73.99436092799984, 40.69023947999991], [-73.99236366999985, 40.689690123999924], [-73.99262286099999, 40.68916054899988], [-73.99268552799995, 40.68903324699992], [-73.99293238499986, 40.68851457599991], [-73.99300451699985, 40.68836463599994], [-73.99326829999998, 40.68782445099991], [-73.99333822999985, 40.687678796999876], [-73.99360423199991, 40.6871272299999], [-73.99378736999994, 40.68675596699995], [-73.9939292959999, 40.686452870999865], [-73.99409147700004, 40.68611343899993], [-73.99425367999989, 40.685777996999924], [-73.99440802399982, 40.685452495999925], [-73.99457806799994, 40.68510014199988], [-73.99490113599977, 40.6844302379999], [-73.99523240699986, 40.68374079099993], [-73.99555742799987, 40.683068534999954], [-73.99588110299992, 40.68239495399995]]]}}, {\&quot;id\&quot;: \&quot;52\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 53, \&quot;Shape_Leng\&quot;: 0.161500913385, \&quot;Shape_Area\&quot;: 0.000947530980821, \&quot;zone\&quot;: \&quot;College Point\&quot;, \&quot;LocationID\&quot;: 53, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.83839013354552, 40.798304872075995], [-73.83919004727183, 40.7977772664477], [-73.84022425799824, 40.79761115131156], [-73.84025860809128, 40.79758885843212], [-73.83997099590027, 40.796905641892224], [-73.83903676806118, 40.79705247704045], [-73.83843368293606, 40.796786758946396], [-73.83840083088981, 40.79675525865344], [-73.83736225294896, 40.79426352412381], [-73.83730248787447, 40.79421958581836], [-73.83722791411225, 40.79411138424652], [-73.83717497419711, 40.794023700013284], [-73.8370840678496, 40.79390346198528], [-73.83706498890116, 40.793851098213075], [-73.83707146788825, 40.7937989222257], [-73.83712604698766, 40.79369555002053], [-73.83686308614463, 40.793066798056], [-73.83663288911686, 40.79251637576927], [-73.83818069199988, 40.792748501999945], [-73.83887362400004, 40.792949805999854], [-73.83905064799991, 40.79298782099989], [-73.83905076599997, 40.79298784899991], [-73.83905088399997, 40.79298788499988], [-73.83922303099997, 40.79304304599991], [-73.83938616999993, 40.79311469299992], [-73.83953619099991, 40.79320127799991], [-73.83953626099989, 40.79320132299989], [-73.83966981899991, 40.793300636999966], [-73.83966987799987, 40.793300689999946], [-73.83978455899992, 40.79341008099993], [-73.83990622699986, 40.793516588999935], [-73.84004094899993, 40.793615254999885], [-73.84018725699998, 40.79370467999992], [-73.84018731600003, 40.7937047159999], [-73.84018738599987, 40.793704751999925], [-73.84034364899992, 40.79378386199987], [-73.84050794799997, 40.793851761999875], [-73.84050805399978, 40.79385179899986], [-73.84067828300006, 40.79390789199993], [-73.84076080099992, 40.79250035099991], [-73.84081532599994, 40.7915048849999], [-73.83987372999988, 40.7914705419999], [-73.83895676099984, 40.79143843099996], [-73.83900524099994, 40.79061732199994], [-73.83992306199995, 40.790649901999906], [-73.83999984499997, 40.789251996999916], [-73.84008157499997, 40.78785153099992], [-73.83916328899986, 40.78782010599988], [-73.83824429099994, 40.78778591599995], [-73.83834963799995, 40.78585030599993], [-73.83845605499975, 40.78582446799988], [-73.83853062500003, 40.78470030299992], [-73.83862028899992, 40.7832271429999], [-73.83869921299997, 40.781676956999874], [-73.83777640299981, 40.78165237399991], [-73.83669385900005, 40.78164957499991], [-73.83218249399988, 40.78165887099986], [-73.82770726099993, 40.781667916999865], [-73.82678476000001, 40.78166766899994], [-73.82569679399981, 40.78169053099991], [-73.82528484199993, 40.78169729199987], [-73.82513740299993, 40.78169970599994], [-73.82557907999986, 40.78083309199997], [-73.82576928399986, 40.78046316399985], [-73.82616437200001, 40.77968464499987], [-73.82642473899999, 40.779228734999954], [-73.82665895999983, 40.778818600999884], [-73.82789985099988, 40.7766822329999], [-73.82830621299996, 40.776000787999905], [-73.828793895, 40.77524292899992], [-73.82908256199991, 40.7747943209999], [-73.83000011099983, 40.77373240699996], [-73.83090463599999, 40.7729830689999], [-73.83150226899997, 40.77248795599991], [-73.83161455499989, 40.77241020899988], [-73.83209910199999, 40.77210429399989], [-73.83338983199998, 40.77134538399988], [-73.83433960199982, 40.77078781999989], [-73.83511636199991, 40.77028363399989], [-73.83536623599981, 40.77012144099994], [-73.83614052499993, 40.76952737399995], [-73.83678033699985, 40.76896614799991], [-73.83711212099999, 40.76864287199989], [-73.83746794599992, 40.76830671799994], [-73.83805766700006, 40.76759634399986], [-73.83866554599997, 40.76674036599996], [-73.83871102200001, 40.76666838599987], [-73.83913189281712, 40.765991105784146], [-73.83925621702686, 40.76603420963875], [-73.8395267864783, 40.76613954972556], [-73.8395437155588, 40.766211721721604], [-73.83969772549081, 40.76639267704533], [-73.83973778802071, 40.76665087171896], [-73.83973386806854, 40.76673441465323], [-73.83969375990986, 40.76682480595994], [-73.8395605054185, 40.76691684117707], [-73.83951000594936, 40.766974160215085], [-73.83949805795821, 40.76701701698471], [-73.83959072609817, 40.76711082471904], [-73.83968175000263, 40.76710489116111], [-73.83975387982034, 40.767120445440874], [-73.83978750472959, 40.767051485410185], [-73.83986957818284, 40.76708653570916], [-73.83993922177474, 40.76706427714744], [-73.8399402231328, 40.76700188164961], [-73.8398843082266, 40.766952204208515], [-73.83990190913454, 40.76682415841403], [-73.84000758970934, 40.76662342046593], [-73.840113137722, 40.76656666461221], [-73.84022374446803, 40.7665292403013], [-73.84027020920483, 40.76646466650519], [-73.84027438049095, 40.76637967295619], [-73.84031170315292, 40.76629479789843], [-73.84057222218038, 40.76627040438149], [-73.84086515071182, 40.76621486974827], [-73.84084759497334, 40.766162020200035], [-73.8408401364553, 40.76616295457574], [-73.84083644357402, 40.76614783092416], [-73.84086007103146, 40.76614219398064], [-73.84087122017897, 40.766157327427656], [-73.84086500211306, 40.766159208867364], [-73.84088883538395, 40.7662103792582], [-73.84102191922433, 40.766185149281355], [-73.84100802893788, 40.76611688421589], [-73.8410788870798, 40.76611036771657], [-73.84108497073595, 40.766165182066395], [-73.84105761922727, 40.766168924392886], [-73.84105643008813, 40.766178605084185], [-73.84120530561162, 40.76615038087748], [-73.84120337400219, 40.766097476524635], [-73.84119574495959, 40.76609729965605], [-73.84120075497815, 40.76608124266235], [-73.84123679749322, 40.766081292334725], [-73.84123676821112, 40.76609357613729], [-73.84122309104404, 40.76609544731743], [-73.84122723929276, 40.76614622161617], [-73.84144364387917, 40.766105192987204], [-73.84172286075056, 40.7660432805295], [-73.84170125822992, 40.765988326283264], [-73.84167323806332, 40.76599495749284], [-73.84166211638194, 40.76596848399208], [-73.8417130964574, 40.765958160228685], [-73.84174481256957, 40.76603841406753], [-73.84196444921889, 40.76598971084912], [-73.84198401916458, 40.76596514588186], [-73.84196546583135, 40.76592732305348], [-73.8419157397382, 40.7659329244163], [-73.84191572852082, 40.76593765030904], [-73.84187344475318, 40.76594893027433], [-73.84186231494718, 40.76592529148888], [-73.8419033560003, 40.76591400814698], [-73.84190583063506, 40.76591873694828], [-73.84231868231662, 40.76582102929955], [-73.842317444969, 40.76581913757782], [-73.8423572306718, 40.765812576589134], [-73.84236463453715, 40.765835266052655], [-73.84232856912517, 40.765844665167286], [-73.84232609735666, 40.76583899337525], [-73.84227261595433, 40.76585592824656], [-73.84228991176651, 40.76589941989143], [-73.84231828009945, 40.76591125238223], [-73.84251347571919, 40.7658679674676], [-73.84249272360755, 40.765802367584925], [-73.84248152879428, 40.76580613233626], [-73.84247287859779, 40.76578533237701], [-73.84252261658963, 40.76577500488192], [-73.84252754583214, 40.765792965547035], [-73.84251137775344, 40.76579766885277], [-73.84253623494851, 40.765862920695355], [-73.8426819600242, 40.765830607164354], [-73.84295915637364, 40.7658547224249], [-73.84336969753039, 40.76572529284769], [-73.84346820695714, 40.76565307141732], [-73.84359974376382, 40.7656434804411], [-73.8437063352798, 40.76567996834533], [-73.84394748335806, 40.765494881485765], [-73.84407906365587, 40.76549676136358], [-73.84426568006505, 40.76546921500887], [-73.84448895884195, 40.765459602583896], [-73.84491332846012, 40.76552838817853], [-73.84528163541583, 40.76566611948253], [-73.84593023292821, 40.76601257632095], [-73.84602715981245, 40.76604487155383], [-73.84614072149937, 40.76611570431363], [-73.84620024037936, 40.76619634316636], [-73.84652170418624, 40.76629580063177], [-73.84666768544619, 40.76628375673098], [-73.84684964636887, 40.76626203475838], [-73.84701309197986, 40.76626796152773], [-73.84712188593454, 40.766290563967594], [-73.84723067976141, 40.76631315809567], [-73.84738263097066, 40.76641941262396], [-73.8476935357496, 40.76670591213375], [-73.84780575104425, 40.76677294817163], [-73.84786167715994, 40.76685023340278], [-73.84792234568383, 40.767012496032976], [-73.84799048271634, 40.767117161337204], [-73.84804248817566, 40.76723778076487], [-73.84809411442576, 40.76737876897698], [-73.84821324018463, 40.767634597847994], [-73.84828222856984, 40.76774537878623], [-73.8483741186844, 40.76786934596774], [-73.84842038279727, 40.76791076681383], [-73.84849386891709, 40.767976573164425], [-73.84850405385016, 40.76799249900586], [-73.8485178978279, 40.76801414798668], [-73.84856697139021, 40.7680909071991], [-73.84852060615141, 40.768135412162714], [-73.84848118613256, 40.76817324547555], [-73.84842604843061, 40.768223374851715], [-73.84837586137671, 40.7682764253777], [-73.84833089177016, 40.76833211504436], [-73.84829137867685, 40.76839014781252], [-73.84829430420871, 40.76841059214461], [-73.8483013819906, 40.7684304406085], [-73.84831243929806, 40.768449208817756], [-73.84832720628944, 40.76846643874888], [-73.8483453225899, 40.76848170991812], [-73.84841573602714, 40.76850098668506], [-73.84848358226597, 40.76852500253367], [-73.8485483108146, 40.7685535626044], [-73.84860939647602, 40.76858643516744], [-73.84866634360749, 40.768623353501596], [-73.84883522381716, 40.76875230209401], [-73.84901287079057, 40.76921530435127], [-73.8489225578029, 40.769324534965435], [-73.84892276167722, 40.76940717390534], [-73.84884133186712, 40.76946410514129], [-73.8487178873391, 40.76954777089411], [-73.84865863960181, 40.76961433219833], [-73.84860729245335, 40.76970346891756], [-73.84860101425126, 40.76981782588793], [-73.84872999189092, 40.76998954177914], [-73.84892724343374, 40.76991478836153], [-73.848817810295, 40.76973805463504], [-73.84950427178478, 40.76951022388226], [-73.84953434085783, 40.76951712501355], [-73.84955532911304, 40.76954917482335], [-73.84955529811104, 40.76956289850219], [-73.84949207284846, 40.7695834015085], [-73.84955506042947, 40.769668112981556], [-73.84960321683452, 40.76965902709566], [-73.84963028831295, 40.769661349325055], [-73.84970521295284, 40.76978953551773], [-73.84969012358812, 40.76981010191443], [-73.84964193972178, 40.7698306246238], [-73.84969586733, 40.769931335979635], [-73.84975004147579, 40.769922257882556], [-73.84977407793218, 40.769936012942956], [-73.8497619875757, 40.769961156547325], [-73.84907551195148, 40.77019356377016], [-73.84899274432657, 40.770028680072755], [-73.84872671824314, 40.77010618908874], [-73.8486255096204, 40.770387757427166], [-73.84861273687663, 40.77042603035469], [-73.84858664304565, 40.77050424990497], [-73.84858418501082, 40.770543302646296], [-73.84858696848256, 40.770605638316596], [-73.84859368539874, 40.77062392002509], [-73.8485979041902, 40.7706354051098], [-73.84861027612754, 40.77065908656987], [-73.84862191287661, 40.77068804462914], [-73.84864527048879, 40.7707192413199], [-73.8486715286884, 40.770761572902536], [-73.84874746796304, 40.77084403300933], [-73.84882636338835, 40.770913141615985], [-73.84890527065537, 40.770982250685776], [-73.84912991114923, 40.771063788377575], [-73.84933814775343, 40.771187619866005], [-73.84949402711861, 40.77132861681541], [-73.8495760947736, 40.771438916609654], [-73.84960979016878, 40.771484204461004], [-73.84973230426058, 40.77173009452529], [-73.84973804497628, 40.77174241985013], [-73.8497730365678, 40.77180479915258], [-73.84980501475297, 40.771842589265155], [-73.84982268798642, 40.77185829087455], [-73.84993252885828, 40.77189377858084], [-73.84994046677184, 40.77192059790689], [-73.84994241882967, 40.77192719325984], [-73.85020188336162, 40.771937392784736], [-73.85020240095857, 40.7719455348769], [-73.85030397450447, 40.77193819958954], [-73.85031075024499, 40.77192028681626], [-73.85028379823378, 40.771925372392815], [-73.8502906085098, 40.771892099056686], [-73.85031415825226, 40.77190237084045], [-73.85033808818525, 40.771743668538754], [-73.8503784815698, 40.77175140188951], [-73.85036823526043, 40.77181539433311], [-73.85126052461455, 40.771872872816765], [-73.85126742588308, 40.77179863646516], [-73.85130108374476, 40.77180636079771], [-73.85127037620717, 40.771985534743514], [-73.85124007806625, 40.771980375036954], [-73.85125374913325, 40.77189078614855], [-73.85036146530206, 40.77183074564787], [-73.85033410569142, 40.772017606260675], [-73.85029707789941, 40.77200987726779], [-73.85029717573791, 40.77196635402256], [-73.85019734544956, 40.771961326490576], [-73.85019486668942, 40.77197227426243], [-73.84995162517303, 40.77195829887714], [-73.849962928372, 40.77199648468658], [-73.84994620808664, 40.772057372616196], [-73.84986902411926, 40.77218306200828], [-73.85003738572694, 40.772181073933574], [-73.85004065546363, 40.772224600554914], [-73.84983958377667, 40.77223100286741], [-73.84972769544879, 40.77241320129405], [-73.84957160955894, 40.772561103830746], [-73.84918580437129, 40.77310472058777], [-73.84897619867189, 40.77356166795698], [-73.84896112400045, 40.7737426847533], [-73.84912365290268, 40.77426022845488], [-73.84921197208924, 40.77454763447593], [-73.84921678107065, 40.77463958212611], [-73.8492142740838, 40.77473158268647], [-73.8492044602571, 40.77482330005166], [-73.84918737541369, 40.77491439914948], [-73.84916308193993, 40.77500454716513], [-73.84913166855965, 40.775093414757016], [-73.84909325000882, 40.775180677260124], [-73.84906220320683, 40.77524019861195], [-73.84903349588859, 40.77530039479502], [-73.84901442828632, 40.77534379717124], [-73.8489728769192, 40.77545132951898], [-73.84893873474758, 40.77556035848066], [-73.84900348408753, 40.77568014817956], [-73.84911614425796, 40.77578626632446], [-73.84911636597812, 40.77578751886946], [-73.84903813840937, 40.777004753468105], [-73.84903491312333, 40.777288443429185], [-73.84901842052128, 40.77740463203713], [-73.84899941431672, 40.77752205117339], [-73.84897771676305, 40.77763491828796], [-73.8489740492564, 40.777674654087846], [-73.84897165987938, 40.77777261678307], [-73.84895680884702, 40.77789056185411], [-73.84895450913376, 40.77792770447221], [-73.84895559325399, 40.77796167373135], [-73.84896008358999, 40.777993097546876], [-73.84896802544691, 40.77802221269157], [-73.84897383480374, 40.778035349458925], [-73.84898207469953, 40.77804830060991], [-73.84899254202304, 40.77806074087802], [-73.84899380740195, 40.77806192275443], [-73.84900491920531, 40.778072283364835], [-73.84901882664829, 40.77808258615508], [-73.84903388635963, 40.778091376356365], [-73.84904969603315, 40.7780984127068], [-73.8490659137323, 40.77810355721967], [-73.84911406661877, 40.778114696407165], [-73.84917605388847, 40.7781268708982], [-73.84920561102659, 40.778131385698444], [-73.84923662799216, 40.778135009824275], [-73.84928764656799, 40.778140966261525], [-73.8493120634367, 40.77814545571613], [-73.84933338575311, 40.77815101361854], [-73.84934534071354, 40.77815546800863], [-73.84935671111596, 40.778161336890044], [-73.84936761626928, 40.778168680728115], [-73.84937825751246, 40.77817763581692], [-73.84939585408341, 40.77819636205012], [-73.84943535665232, 40.77824556318454], [-73.84947844499678, 40.77829606613999], [-73.84949436325334, 40.77831779842351], [-73.84950757331885, 40.7783385362538], [-73.84951731632304, 40.778357153370855], [-73.84952520807873, 40.77837657889388], [-73.84953114505714, 40.77839659523964], [-73.84953505641919, 40.77841695203263], [-73.8495358659634, 40.778425885557084], [-73.8496919692504, 40.77842802269303], [-73.84969626130186, 40.778415067669734], [-73.84974741420471, 40.778414054006106], [-73.84974445808719, 40.77846481410773], [-73.84953664690558, 40.778457620289885], [-73.8495343034803, 40.77847747370973], [-73.84952990130999, 40.77849672067872], [-73.84952858977923, 40.77849996041985], [-73.84952657007254, 40.77850304678793], [-73.84952383818543, 40.778505996530164], [-73.84952033715504, 40.7785088558093], [-73.84951133367666, 40.77851424792634], [-73.84948131861695, 40.77852894025979], [-73.84947722420407, 40.77853175319544], [-73.84947388931542, 40.77853462207157], [-73.84947124090881, 40.77853758951187], [-73.84946927977728, 40.778540694550685], [-73.84945846130667, 40.778562822784885], [-73.84945106324766, 40.77858090421403], [-73.8494461945274, 40.778597215353415], [-73.8494438267176, 40.778611854335985], [-73.84944397412765, 40.778625218719164], [-73.84944670731139, 40.77863709985818], [-73.84944905360408, 40.77864250512285], [-73.84945203895039, 40.7786475428336], [-73.84945566507523, 40.778652230080084], [-73.84945995577684, 40.77865656806611], [-73.84946904846156, 40.778663783211684], [-73.84947957696491, 40.77867039747487], [-73.84950513864881, 40.77868183198594], [-73.8495368533371, 40.778691039733545], [-73.84957720816625, 40.77869873929359], [-73.84960429240051, 40.7787021144363], [-73.849686879789, 40.77870938977827], [-73.84969513318684, 40.778710697192274], [-73.84973917397001, 40.778717689519304], [-73.84975786860362, 40.77872230577249], [-73.84977311348453, 40.77872756702233], [-73.84978540855205, 40.778733714823765], [-73.84979030575784, 40.77873708076647], [-73.84979436044361, 40.77874064379382], [-73.84979758647495, 40.77874441213234], [-73.84979999376891, 40.778748385795204], [-73.84980157152407, 40.7787525659411], [-73.84980132097789, 40.77876730703297], [-73.84993353296176, 40.778769123381046], [-73.84993080856658, 40.77879720785134], [-73.84980088112201, 40.778793284827636], [-73.84979610479625, 40.77907534402301], [-73.8497922389795, 40.779092971223974], [-73.84979044990959, 40.77909795713514], [-73.8497879996364, 40.779102772648265], [-73.84978489696313, 40.779107423135834], [-73.84978114316354, 40.779111930042795], [-73.84977161159078, 40.779120544852006], [-73.84975923714768, 40.779128740992924], [-73.84973108396828, 40.779142220586884], [-73.84966179483854, 40.779168695923204], [-73.84965811870529, 40.77917013100993], [-73.84965398205614, 40.77917143164276], [-73.84964409727885, 40.7791736610763], [-73.84960160472559, 40.77917910716696], [-73.84959577388824, 40.779180162339316], [-73.84959302348445, 40.77918066383929], [-73.84958612583421, 40.77918247349432], [-73.84958246208258, 40.77918379216453], [-73.84957931896626, 40.77918526530271], [-73.8495766621079, 40.779186891691445], [-73.84957448948224, 40.77918868992333], [-73.84957279225395, 40.779190668865944], [-73.84957155453695, 40.77919283670706], [-73.84957754850187, 40.7793974127518], [-73.84957921443754, 40.77941026414162], [-73.8495828564969, 40.779423236718856], [-73.84958833734376, 40.77943585972485], [-73.84959547717891, 40.779447728517624], [-73.84960400544777, 40.7794584194067], [-73.84961378096662, 40.77946779835428], [-73.84962460342139, 40.77947566406813], [-73.84963631633588, 40.77948192035157], [-73.8496396893305, 40.779483275176695], [-73.84964324176299, 40.77948441446292], [-73.84965096095709, 40.77948605439123], [-73.84965952458613, 40.77948684891368], [-73.84966912057455, 40.77948682574971], [-73.84968773448676, 40.77948502148875], [-73.84973187730172, 40.77947808268722], [-73.84974262512041, 40.779477132759546], [-73.84974869047639, 40.77947705120936], [-73.849751900693, 40.77947700161922], [-73.8497540443524, 40.779477201424385], [-73.8497385127623, 40.77940144669318], [-73.85007007124759, 40.77934793010841], [-73.85009114089188, 40.77935138794181], [-73.85009398131915, 40.779373355585975], [-73.85012866957865, 40.779366811085104], [-73.8501114812998, 40.7793008963792], [-73.85067227797757, 40.77919399711241], [-73.85065788414983, 40.77916981875145], [-73.85096718956476, 40.77911091411253], [-73.85094705724252, 40.77906915543026], [-73.85118700387086, 40.77901455483171], [-73.85119275794374, 40.77902554507494], [-73.85147606060222, 40.77896440973063], [-73.85148755480326, 40.77899297861757], [-73.85120426185316, 40.779049719637875], [-73.85120998157538, 40.779076085337444], [-73.85101339619412, 40.77912195667439], [-73.8510276713222, 40.779198850460226], [-73.8510507916471, 40.77919668391865], [-73.85107946016522, 40.779297758688315], [-73.85105055581148, 40.779302114020446], [-73.85103904766675, 40.77928013352065], [-73.85094655574714, 40.77929319249282], [-73.85094937054778, 40.77932614289468], [-73.85074415423085, 40.77935443134818], [-73.85073555596264, 40.779323670381125], [-73.85015741651672, 40.77943274199089], [-73.85014017315828, 40.7793909869257], [-73.85011125881357, 40.779399735201125], [-73.85012275250426, 40.77942830422235], [-73.85003696878474, 40.77944943201958], [-73.84979304347623, 40.77949768469487], [-73.84981720066014, 40.77963034805418], [-73.8498785983377, 40.779625736165144], [-73.84987537319611, 40.77961461194829], [-73.84998643275294, 40.77960582076213], [-73.85000542456552, 40.779603661787675], [-73.85000701949747, 40.77961725471423], [-73.852352678813, 40.779480672833344], [-73.85232086242219, 40.77916928470371], [-73.85235661936242, 40.77916933052226], [-73.85238832778414, 40.7795289023869], [-73.85236232095829, 40.77953010473945], [-73.85235751917273, 40.779496739045214], [-73.84997493056258, 40.779641290896265], [-73.84982102259761, 40.779651339303875], [-73.84984362844325, 40.77977547491927], [-73.8498424903832, 40.779776059105814], [-73.84984112663376, 40.779776552534464], [-73.84984040336778, 40.77977673218471], [-73.84983952619352, 40.7797769473172], [-73.8498363029474, 40.77977739325839], [-73.84983225116706, 40.779777594370024], [-73.84981375969693, 40.7797772551562], [-73.84980586942713, 40.77977757808099], [-73.84980207764751, 40.77977809581887], [-73.84979887674888, 40.779778893089244], [-73.84979622113285, 40.77977996061912], [-73.84979509438978, 40.779780607977145], [-73.84979408627251, 40.779781326855726], [-73.84977014020235, 40.779804078118424], [-73.84975449350075, 40.779818952421415], [-73.8497381878465, 40.77983187150904], [-73.8497217813201, 40.77984202528526], [-73.84970553216176, 40.77985031570939], [-73.84968940703446, 40.77985676954223], [-73.8496734158966, 40.77986136920672], [-73.84966424252009, 40.77986296833341], [-73.84965393555235, 40.779863756496745], [-73.84961851526822, 40.77986309814073], [-73.84961020050447, 40.77986294288282], [-73.84960016522162, 40.77986336233683], [-73.84959129058164, 40.779864421745124], [-73.84958633626894, 40.77986552362804], [-73.84958143974038, 40.77986719148755], [-73.84957661227024, 40.77986941009375], [-73.84957193877196, 40.779872150408075], [-73.84956744174248, 40.77987540475347], [-73.8495632520746, 40.77987908216709], [-73.84955945235377, 40.77988311139089], [-73.84955614907031, 40.77988737512835], [-73.84955259386662, 40.77989340341914], [-73.84955001985372, 40.779899902397595], [-73.84954767585884, 40.77991462266048], [-73.84954849514146, 40.7799297889858], [-73.84954857704788, 40.77993031060005], [-73.84955331323854, 40.77996244668725], [-73.84955456302885, 40.77997084118439], [-73.84955451960579, 40.779979232987905], [-73.84955450077001, 40.77998279003447], [-73.84955315550077, 40.779990415384006], [-73.84973465207516, 40.77999639195549], [-73.84974018040859, 40.78004045002199], [-73.85031476156011, 40.780031757060556], [-73.85031473957734, 40.78004153600408], [-73.85037426478351, 40.780035150505384], [-73.85037642446964, 40.78000959208551], [-73.85041635235571, 40.78001124077503], [-73.85041840010895, 40.78003520780309], [-73.85044992795434, 40.780033650696375], [-73.85045656031697, 40.7798882799137], [-73.85048178019531, 40.77988831263897], [-73.85048371588393, 40.77996180377535], [-73.85162286781565, 40.779939312964586], [-73.85163563328629, 40.77986903549033], [-73.85169028085423, 40.779867508478176], [-73.85167099162219, 40.780035228878106], [-73.85162266134178, 40.78003197177817], [-73.85162492646164, 40.77995848657489], [-73.85048578225796, 40.77997778253564], [-73.85047510549936, 40.78005285432789], [-73.85042045570427, 40.78005597878778], [-73.85041830321092, 40.78007834233692], [-73.85036786060351, 40.780079873703535], [-73.85036580861214, 40.780057505868655], [-73.84999800412726, 40.78006341795454], [-73.8497371105003, 40.78006376491308], [-73.84949381208321, 40.780065828114246], [-73.84948977929692, 40.78007331542979], [-73.8494874774256, 40.7800805064753], [-73.84948686941622, 40.78008751126687], [-73.84948719303776, 40.78009097879954], [-73.84948794336292, 40.78009442996937], [-73.84949102749154, 40.78010288834467], [-73.84949574651277, 40.78011190001433], [-73.84951236065773, 40.7801355242267], [-73.84952637351847, 40.780152066412974], [-73.8495653283726, 40.78019228873934], [-73.84957495568457, 40.78020439464494], [-73.8495821916791, 40.78021587708098], [-73.84958596479899, 40.780224021907294], [-73.84958872905418, 40.780232725119845], [-73.84959131415296, 40.78025225075464], [-73.8495907270451, 40.78027117820336], [-73.84958612528546, 40.78031502771827], [-73.84958618687178, 40.780335081952984], [-73.84959129206666, 40.780388083496284], [-73.84959707959024, 40.780448108602435], [-73.8496031561403, 40.780490530998115], [-73.84961037731607, 40.780529082030384], [-73.8496130358922, 40.780537549730376], [-73.84961740029898, 40.780546002066416], [-73.84962343481696, 40.78055434903004], [-73.84963103378945, 40.78056243619226], [-73.84964012579178, 40.78057017450349], [-73.84965044093985, 40.78057732924293], [-73.84966171544059, 40.78058370071067], [-73.84967357421606, 40.780589084370966], [-73.84967914925255, 40.780590981667125], [-73.84968532984298, 40.78059242190543], [-73.8496921628949, 40.78059342055946], [-73.84969977836884, 40.78059400745033], [-73.84970842754518, 40.78059377498105], [-73.84975146751532, 40.78059264267863], [-73.84976094548882, 40.78059283562826], [-73.84976904639166, 40.78059355767057], [-73.84977733487823, 40.78059514388641], [-73.8497810051181, 40.78059625702005], [-73.849784389933, 40.78059757617311], [-73.84978747936445, 40.78059911942538], [-73.84979031790787, 40.780600896886384], [-73.84979287208388, 40.78060289996859], [-73.84979518947944, 40.78060513610534], [-73.84980162766686, 40.78061304215576], [-73.84980707998362, 40.78062176545094], [-73.8498082942797, 40.78062481097365], [-73.84981503152129, 40.78064171303461], [-73.84981746562705, 40.780655619993134], [-73.84981911467304, 40.780665050314816], [-73.84981943123964, 40.78069217479532], [-73.84981943042993, 40.78069253380164], [-73.84981214796522, 40.78077040025503], [-73.84981067388031, 40.780798305751105], [-73.84981008898778, 40.78085272165433], [-73.84981173168418, 40.780870733633066], [-73.8498148830908, 40.78088682136889], [-73.84982676964914, 40.78092633202067], [-73.84984980805791, 40.780990486812705], [-73.84985673695408, 40.7810069582442], [-73.84988263236191, 40.78105985182873], [-73.84988560815704, 40.78106957972739], [-73.84988800830871, 40.78107744549927], [-73.84988932081794, 40.78108913479838], [-73.84991219996311, 40.78108750458773], [-73.85093970945037, 40.78108116289207], [-73.85093646396534, 40.781119575156005], [-73.84991855289967, 40.781120744575325], [-73.84988728063747, 40.781121511316904], [-73.84984470805739, 40.78159250358273], [-73.84984092044256, 40.781596308346295], [-73.84983660014267, 40.78159962491627], [-73.84983172551624, 40.781602472529784], [-73.84982629433667, 40.7816048610679], [-73.84981313500577, 40.78160927446724], [-73.84979896935607, 40.781612912585345], [-73.84976687720906, 40.781618083645604], [-73.84973620036537, 40.781620440270125], [-73.84965318361573, 40.78162387984903], [-73.8495843534843, 40.781629426594684], [-73.8495464630235, 40.781631393972475], [-73.84949053395457, 40.78163144675125], [-73.84945107629284, 40.7816301974027], [-73.84936169911538, 40.78162737087983], [-73.84928815389694, 40.781628156909555], [-73.84920125952722, 40.781632293191265], [-73.84919977948272, 40.781632444372924], [-73.84919835691278, 40.78163271373529], [-73.84919696998568, 40.781633107113116], [-73.84919562929343, 40.781633618656954], [-73.84919434894228, 40.78163424771528], [-73.84919312672957, 40.781634993782426], [-73.84919084924894, 40.781636827049724], [-73.84918882990345, 40.781639121182664], [-73.84918709418461, 40.78164181154949], [-73.84918567739616, 40.781644879936366], [-73.84918460308101, 40.78164824629691], [-73.84918361402742, 40.78165580961947], [-73.84918433205542, 40.78166340130996], [-73.84918531851869, 40.78166690656572], [-73.84918667463242, 40.78167009551429], [-73.8491883858092, 40.78167288923217], [-73.84919040545033, 40.781675233044986], [-73.8492029285044, 40.78168554220345], [-73.84921772841386, 40.78169429651935], [-73.84923492578879, 40.78170156835328], [-73.84925485088841, 40.781707502208036], [-73.84927462461532, 40.78171166930421], [-73.84928876450584, 40.781713786390114], [-73.8492976002965, 40.78171510447715], [-73.84938705771674, 40.781723721340434], [-73.84942345201131, 40.781728766522896], [-73.84944211373582, 40.781732608813165], [-73.84945880658724, 40.78173718798607], [-73.8494738402559, 40.78174258351931], [-73.84948737902812, 40.78174885091145], [-73.84950124349734, 40.78175747765476], [-73.8495137890027, 40.78176812001698], [-73.84952476609249, 40.78178056960574], [-73.84953389183205, 40.781794512779435], [-73.84954094279978, 40.781809632288464], [-73.84954561024456, 40.781825335024706], [-73.84954774265991, 40.781841078342794], [-73.84954725821561, 40.78185630494597], [-73.84954069379472, 40.781888227584595], [-73.84952913459368, 40.78191821799483], [-73.84952161585517, 40.7819321025794], [-73.84951298514834, 40.78194514908879], [-73.84950332753195, 40.781957265494775], [-73.84949266315807, 40.7819684089368], [-73.84947294903945, 40.78198472698115], [-73.84945388296065, 40.78199710281962], [-73.84944812889454, 40.78200084134151], [-73.8494227221584, 40.78201476570605], [-73.84936186667622, 40.782045555102805], [-73.84933420378349, 40.78206141376419], [-73.84931176686678, 40.782077151262975], [-73.84929392410037, 40.78209333669785], [-73.84926950224772, 40.782121661807885], [-73.84925186203198, 40.78214824899512], [-73.84924064542695, 40.78217363739409], [-73.84923742986847, 40.782185916998515], [-73.84923580368731, 40.782197945048345], [-73.84923644337586, 40.78222417737107], [-73.84923866768678, 40.78223600406681], [-73.84924212637716, 40.78224677780399], [-73.84924675980236, 40.78225636532168], [-73.8492525818285, 40.782264775014035], [-73.84925954248891, 40.782271979173956], [-73.84926345684903, 40.78227510948317], [-73.8492676449515, 40.78227794145226], [-73.84929600721517, 40.78229326072907], [-73.84932904044368, 40.782307045206025], [-73.84936730007063, 40.782319567834136], [-73.84941366539037, 40.78233176733061], [-73.84947755621798, 40.78234686175886], [-73.84952319204757, 40.78235653832871], [-73.84956490053888, 40.782363850994194], [-73.84960336728695, 40.782368818244514], [-73.84964463464058, 40.78237219479521], [-73.84974246546523, 40.7823772129673], [-73.84978655217171, 40.782380556957676], [-73.84982764974079, 40.78238524745948], [-73.84993441724671, 40.78239948850579], [-73.84999442110552, 40.78240473663232], [-73.85017560390794, 40.78241117596823], [-73.85020961297208, 40.78241285003427], [-73.8502303385557, 40.782415578320965], [-73.85023230404349, 40.7824160584907], [-73.85023422072196, 40.782416682333846], [-73.85023606851233, 40.782417459875795], [-73.8502378544331, 40.782418406370724], [-73.85024128462477, 40.782420761379306], [-73.8502445600841, 40.78242380957484], [-73.85024983944788, 40.78243044391331], [-73.85026066567171, 40.78244717133412], [-73.85026365512806, 40.78245087669524], [-73.85026662248302, 40.782453825649796], [-73.85026987468241, 40.78245624190818], [-73.85027156691282, 40.78245719933736], [-73.85027330557236, 40.782457993657154], [-73.85027510454267, 40.782458626225456], [-73.85027696382406, 40.782459096875044], [-73.85027889487543, 40.782459406290684], [-73.85028089657797, 40.782459562009656], [-73.85028520882398, 40.78245945017648], [-73.85028961793519, 40.782458798199265], [-73.85029412126644, 40.7824576062418], [-73.85029868703998, 40.782455892355834], [-73.85030798571955, 40.782450862920975], [-73.85031711167846, 40.782443939887486], [-73.85032112499816, 40.78244003656178], [-73.85032509149033, 40.78243539489009], [-73.85034040945192, 40.78241432532851], [-73.85034477980167, 40.782409639116274], [-73.85034933834744, 40.78240574587901], [-73.85035396591742, 40.78240261849052], [-73.85035918415372, 40.7823997795102], [-73.85037136170378, 40.782394995882846], [-73.85038574038333, 40.78239145798388], [-73.85040198724082, 40.7823892365787], [-73.85044211739618, 40.78236554175274], [-73.85046237692144, 40.78235969761345], [-73.85048366289533, 40.78235568166829], [-73.85050121243168, 40.78235387589481], [-73.85051869908605, 40.78235337707155], [-73.85052785662293, 40.78235357775081], [-73.85057294395939, 40.78235455459715], [-73.85064452756707, 40.78235741190032], [-73.85080255677516, 40.78236568563748], [-73.85085191062834, 40.78236610903307], [-73.85095974363315, 40.78236442938333], [-73.85105865211817, 40.782364882258165], [-73.85115888224064, 40.7823669396393], [-73.85116661764656, 40.78236750732233], [-73.85117451639574, 40.78236875101386], [-73.8511824502199, 40.78237067054823], [-73.85119028608574, 40.78237322839524], [-73.85120513920205, 40.782380055476935], [-73.85121184750511, 40.78238420654224], [-73.85121791474403, 40.78238872617335], [-73.85122501973319, 40.7823954522826], [-73.85123047734257, 40.782402547333724], [-73.85168735535527, 40.78236274850467], [-73.85192054727274, 40.78234735174143], [-73.85201582564918, 40.78234443136425], [-73.8520964483179, 40.78234201293649], [-73.85216039867626, 40.78234159057518], [-73.85228097618968, 40.782346302562715], [-73.85234426450937, 40.78234537466375], [-73.85238157190422, 40.78234440474127], [-73.8525345815865, 40.78233528001999], [-73.8526005387797, 40.78233259168669], [-73.85277635625364, 40.78233360799108], [-73.85285529539563, 40.782331943929556], [-73.85297395843433, 40.782329447809246], [-73.85314993069179, 40.782323936276164], [-73.85322330950031, 40.782060533865014], [-73.85324407205734, 40.78205239243221], [-73.85326692782857, 40.78204537960012], [-73.85329196150529, 40.78203946800102], [-73.85331933850043, 40.78203460406847], [-73.85346812122447, 40.78201330752581], [-73.85364506982407, 40.78198934521578], [-73.8536797409504, 40.781985742044256], [-73.85371711005834, 40.781983465738875], [-73.85375796075665, 40.78198246418576], [-73.85380512238734, 40.781982659050755], [-73.85395650777669, 40.781989847872026], [-73.85405570899185, 40.781991036328684], [-73.85413969536411, 40.7819891532955], [-73.85417157081446, 40.78198584295777], [-73.8542402730513, 40.78197377388685], [-73.85426817724941, 40.781971169812834], [-73.85429401467086, 40.781971157586874], [-73.85435233041154, 40.78197423068179], [-73.85437833322167, 40.78197457865837], [-73.85449826596835, 40.78197074035898], [-73.85459641854935, 40.78196425435653], [-73.85463146933225, 40.781960354355036], [-73.85470961107612, 40.781949485505095], [-73.85474428264793, 40.78194594517099], [-73.8548062259648, 40.781941772103394], [-73.8548542920655, 40.78194004146991], [-73.8549001856964, 40.78194016242124], [-73.85496441517024, 40.7819419356182], [-73.85505842171236, 40.78194635879554], [-73.85516739460483, 40.781954131617], [-73.85519577265883, 40.78195717553486], [-73.85522450332166, 40.78196174922935], [-73.85525344295303, 40.78196782839602], [-73.85528242786589, 40.78197538434999], [-73.85530228006235, 40.78198218987457], [-73.85532050466512, 40.781990722048356], [-73.85533642950311, 40.782000665917934], [-73.85534961480477, 40.78201175858745], [-73.85536631186146, 40.78203115839585], [-73.8553794260627, 40.78205276939831], [-73.8553884517444, 40.78207571631062], [-73.85545062834929, 40.783143079138306], [-73.85561617015411, 40.78314629374278], [-73.85573475263911, 40.78315657201521], [-73.85573467582252, 40.78319202567684], [-73.8558186269766, 40.783194156960796], [-73.85587567996764, 40.78330970432567], [-73.85587458930368, 40.78319827873433], [-73.85592656549973, 40.783196317504526], [-73.85593296680116, 40.78331787949883], [-73.8561272379995, 40.78334818699362], [-73.85613060095005, 40.78334903769837], [-73.85614261963912, 40.78335207787735], [-73.85621394085632, 40.78337804706227], [-73.85623171362438, 40.783382941714855], [-73.8562481864888, 40.78338579863812], [-73.85626839522845, 40.783386949783264], [-73.85628930749792, 40.78338574120036], [-73.85631107802644, 40.78338216671607], [-73.85633400316311, 40.78337616186691], [-73.85635641010697, 40.783368437555716], [-73.85638100310933, 40.783358282489075], [-73.85641761444457, 40.78334009262385], [-73.85643317343843, 40.78333236797427], [-73.85645206661752, 40.783322990816075], [-73.85643993662929, 40.78315751797215], [-73.85667690893332, 40.78315008816212], [-73.85667159264416, 40.78309526904827], [-73.8566533206465, 40.78297943929009], [-73.85662133635174, 40.78297939950117], [-73.85661875947618, 40.78293887790554], [-73.85660942954789, 40.78293987965894], [-73.85660286912328, 40.782892261248804], [-73.85664951090587, 40.78289231927643], [-73.85665341005878, 40.782937907649995], [-73.8566813904766, 40.78293996917436], [-73.85670256831024, 40.78309712187021], [-73.85670377431897, 40.78314924541216], [-73.85671074167976, 40.78318160961588], [-73.8567166980192, 40.78319946435095], [-73.85671872229025, 40.783205536651764], [-73.85672676824508, 40.78322101763507], [-73.85674405554418, 40.783247802497335], [-73.856783191625, 40.78330561795276], [-73.85680365242803, 40.78333241445574], [-73.85682476802232, 40.78335788881941], [-73.85683209884915, 40.783364957953886], [-73.85684129014666, 40.78337136348521], [-73.85685209384219, 40.78337695969253], [-73.85686419228801, 40.78338156776652], [-73.85687720455233, 40.78338502305834], [-73.85689057554147, 40.78338718331959], [-73.85690380601619, 40.783387965005055], [-73.85690977849755, 40.78338767539815], [-73.85691574879351, 40.783387377076934], [-73.856916424825, 40.7833873417309], [-73.85693056185812, 40.783385630084105], [-73.85698714612556, 40.78337878469752], [-73.8570807328061, 40.783369842024115], [-73.8571287329935, 40.783366002386124], [-73.85717784525652, 40.783363208125216], [-73.85727946259598, 40.78336078528364], [-73.85729827323259, 40.78336189883376], [-73.85731850031053, 40.78336539919497], [-73.85734052316816, 40.78337127058618], [-73.85736824871026, 40.78338057174476], [-73.85739520262219, 40.78339091596058], [-73.85741998550928, 40.78340204083335], [-73.85744261237805, 40.78341393716906], [-73.85746304507938, 40.78342661447072], [-73.85749351368149, 40.783449524574486], [-73.8575173357796, 40.78347265210974], [-73.8575267060602, 40.783484235517875], [-73.85753435811877, 40.783495825009766], [-73.85757561010641, 40.78355295044696], [-73.85761223352816, 40.78361187050412], [-73.85769080619146, 40.78363660261761], [-73.85777187429395, 40.78365613500528], [-73.8578548434883, 40.783670324466094], [-73.85791465221827, 40.78367601652251], [-73.85797317515247, 40.78368698496617], [-73.85802960947828, 40.78370307933287], [-73.85808318103317, 40.783724078841665], [-73.85809293159618, 40.78373619674262], [-73.8580938512611, 40.783737359496776], [-73.85810281002682, 40.783753056106434], [-73.8581093889967, 40.78376903809657], [-73.85811509504617, 40.78378777899396], [-73.85813601750543, 40.78385775769632], [-73.85815907631199, 40.78393343388455], [-73.85816966828361, 40.78399506346119], [-73.85817248535963, 40.784006781482184], [-73.858173788655, 40.78401740135328], [-73.85817325802043, 40.784032261215046], [-73.85817002215366, 40.78404870153351], [-73.85814972842107, 40.78410864682302], [-73.85813635063349, 40.784155208635866], [-73.85813380512944, 40.78416260811786], [-73.85812502709221, 40.78418815181475], [-73.85812230968615, 40.78419420116462], [-73.85811884686251, 40.78420016013823], [-73.85810975652801, 40.784211732830144], [-73.85809779066977, 40.78422277611823], [-73.8580831293917, 40.78423316826499], [-73.85806577086481, 40.78424283639321], [-73.85804623764804, 40.784251473568894], [-73.85802503979681, 40.78425884889897], [-73.8580030190051, 40.78426465768563], [-73.85799502501645, 40.78426594883851], [-73.85798583738342, 40.784266498559816], [-73.85795493700509, 40.78426555248949], [-73.8579439287294, 40.78426575687127], [-73.85793355654516, 40.78426708847736], [-73.857928959443, 40.784268231699905], [-73.85792468298948, 40.784269699814395], [-73.85790564851207, 40.7842775098377], [-73.85789394771578, 40.784283714960836], [-73.8578892976976, 40.78428703527752], [-73.85788555791413, 40.784290465440584], [-73.85788269478857, 40.78429404109152], [-73.857880693497, 40.78429778901622], [-73.857856785958, 40.784362595740525], [-73.85785479002129, 40.7843685828167], [-73.85784993964482, 40.78438315908842], [-73.85783635535137, 40.78442391535011], [-73.85783272297559, 40.784434841570814], [-73.8578319424332, 40.78443819463532], [-73.85783105450373, 40.78444208833942], [-73.85783033335551, 40.78444972661102], [-73.85783174883879, 40.784466309860214], [-73.85783684133779, 40.784484815644426], [-73.8578466600017, 40.7845090440646], [-73.85793550046684, 40.78450208755773], [-73.85793785344377, 40.784507155590646], [-73.85794201573734, 40.784516124506425], [-73.85800470789609, 40.78465118792153], [-73.85799433965465, 40.784650953342414], [-73.85798864693247, 40.78465074546464], [-73.85798309391498, 40.784651067976895], [-73.85797817966105, 40.78465188698374], [-73.85797615343813, 40.78465244167644], [-73.85797435379807, 40.78465309431558], [-73.8579728131553, 40.78465383790521], [-73.85797153240988, 40.784654663567544], [-73.85797051068255, 40.784655570296344], [-73.85797010587352, 40.7846560556213], [-73.85796977329701, 40.78465656850943], [-73.85796951145142, 40.78465708969348], [-73.85796930885482, 40.78465762904325], [-73.85796917696919, 40.78465818607045], [-73.85796911579062, 40.78465876245011], [-73.85796943206935, 40.7846635133594], [-73.85797081502555, 40.78466829305747], [-73.85797327315859, 40.784673146618985], [-73.85797685542525, 40.78467816456815], [-73.85798576369062, 40.78468741105699], [-73.85800821599177, 40.78470690216521], [-73.85804860814078, 40.78474288931853], [-73.85813170195247, 40.78481040622703], [-73.85816525317925, 40.784839057018765], [-73.85827576991517, 40.78493830103915], [-73.85831062791249, 40.784972703035855], [-73.85834010817545, 40.78500481152161], [-73.85841272034449, 40.78508992460954], [-73.85846495883229, 40.78514968445889], [-73.85847639475126, 40.78516071698645], [-73.8585039039529, 40.78518305124955], [-73.85851353347384, 40.785192524741674], [-73.85851907436073, 40.78519990165849], [-73.85852327431452, 40.785208007674804], [-73.85852665393895, 40.7852176661474], [-73.85852698593592, 40.78522893917458], [-73.85899156050911, 40.7852041691424], [-73.85905644466132, 40.78543181356221], [-73.85909453895707, 40.78543918586412], [-73.85909193046099, 40.78542107669319], [-73.8590811990642, 40.78542106357173], [-73.8589906592535, 40.785104901340546], [-73.85903628973827, 40.785092722779524], [-73.85912145674305, 40.78541295765197], [-73.85910536075212, 40.7854129379749], [-73.8591104979856, 40.785442585200954], [-73.85921738129012, 40.78546535001113], [-73.85921602303392, 40.785477503662385], [-73.85923734418844, 40.785478543067555], [-73.85924002857145, 40.78546942944455], [-73.85952909197228, 40.78553056053404], [-73.8595236950597, 40.785561954252664], [-73.85941579536208, 40.7855395376104], [-73.85941715122297, 40.78552839731539], [-73.85939317223568, 40.785524316794614], [-73.85939048227354, 40.7855354549592], [-73.85906638595809, 40.785466688265586], [-73.85908214610843, 40.785521985402546], [-73.85899048805017, 40.7854915994347], [-73.85894034299622, 40.785567647386635], [-73.85895721464995, 40.78557826770512], [-73.85896755907882, 40.78558367485105], [-73.85897274386161, 40.785585751810096], [-73.85897777442442, 40.785587279096866], [-73.85898271378166, 40.7855882666723], [-73.85898760509338, 40.78558873268225], [-73.8589912421843, 40.78558873713243], [-73.85899522435685, 40.785588462572214], [-73.85901335620464, 40.78558580150029], [-73.85901770625782, 40.78558540995414], [-73.85902162583585, 40.78558534338306], [-73.85903817556573, 40.78558635386962], [-73.8590444406207, 40.78558745999671], [-73.85904993483408, 40.785589025205574], [-73.85905354569631, 40.785590487595506], [-73.85905705909373, 40.785592284246945], [-73.85906403880534, 40.785596984164904], [-73.8590848266754, 40.78561632526704], [-73.8591048538104, 40.78563645883563], [-73.85912438142353, 40.78566226403373], [-73.85912918731835, 40.785670707159134], [-73.8591326727759, 40.78567987891349], [-73.85913472666259, 40.785689490180026], [-73.85913527518866, 40.78569920665536], [-73.85913505673093, 40.78570141202809], [-73.85913431982947, 40.785708643032685], [-73.85913188308693, 40.78571758122148], [-73.85912804012771, 40.785725808053535], [-73.85912285858095, 40.78573313179497], [-73.85911539050561, 40.785740794157654], [-73.85910597960674, 40.78574843722465], [-73.85907851498793, 40.78576585577383], [-73.859073094663, 40.785768631743245], [-73.85906659710821, 40.7857712532768], [-73.85904595729141, 40.78577773857549], [-73.85904279128076, 40.785778734327444], [-73.85903403038795, 40.78578198265143], [-73.85902600066773, 40.78578612410957], [-73.85902273779875, 40.78578841622181], [-73.85901993539109, 40.78579089903854], [-73.85901500687321, 40.7857967552268], [-73.859012474675, 40.785801218356866], [-73.85912461223712, 40.78585015966324], [-73.85910322798064, 40.78587950876995], [-73.8590075486969, 40.785833144017104], [-73.85900765755157, 40.78583794358627], [-73.85901262561131, 40.78586400104041], [-73.85901586237468, 40.785873623137356], [-73.85902672912445, 40.78589531103742], [-73.85903045064073, 40.785905311999144], [-73.85903169431462, 40.7859113826315], [-73.85903226093974, 40.78591774945819], [-73.85903137893663, 40.78593146385327], [-73.85902784022804, 40.785946714222355], [-73.85902122503792, 40.785965328088835], [-73.8590158599168, 40.785975749313124], [-73.85900818594033, 40.78598580703045], [-73.85899816623991, 40.785995529841884], [-73.85898579987948, 40.78600494287451], [-73.85897116148841, 40.78601398322948], [-73.8589540346854, 40.786022832070934], [-73.8589107413936, 40.78604072691422], [-73.85885571609528, 40.78606040676397], [-73.8588048897857, 40.786077345990286], [-73.85875663984856, 40.78609206512187], [-73.85871030047439, 40.78610475868033], [-73.85865102736396, 40.78611605142519], [-73.8586507788746, 40.786116095012126], [-73.85863807102099, 40.786119285861986], [-73.85862705727051, 40.786122963439624], [-73.85861177077352, 40.786130050277556], [-73.85859860229465, 40.786138625159964], [-73.85859310695238, 40.78614328282774], [-73.85858840508548, 40.786148140153834], [-73.85858453141702, 40.78615314122782], [-73.85858152390757, 40.786158261972375], [-73.8585764279673, 40.78617016895421], [-73.85857233568788, 40.786183455064155], [-73.85856623298426, 40.7862177485718], [-73.85856492361425, 40.78624832822732], [-73.85856645703221, 40.786262620864846], [-73.85856942617816, 40.78627618569098], [-73.85857844553281, 40.7863022756081], [-73.85859127699717, 40.7863296299931], [-73.8586081570016, 40.786358800963264], [-73.85863031307774, 40.78639192965726], [-73.8586413032543, 40.78640518987496], [-73.85866900182882, 40.786433274970705], [-73.85867919947988, 40.78644630788587], [-73.85868879765647, 40.78646233960763], [-73.85869445579392, 40.786475593784566], [-73.8586968468518, 40.786487599409384], [-73.85869681117975, 40.78649319153127], [-73.85869595921667, 40.786498531196784], [-73.85869073576778, 40.786514642914504], [-73.85868283350074, 40.78653116647522], [-73.85867223053742, 40.78654812798552], [-73.85865887626714, 40.786565591209666], [-73.8586094910695, 40.786623693779205], [-73.8585672513092, 40.78666969367949], [-73.85854493188523, 40.78669090901091], [-73.85848303366855, 40.78674469176868], [-73.85847124228764, 40.78675704183654], [-73.85844506383575, 40.78678813992626], [-73.85842953643257, 40.786802816684634], [-73.85842561959295, 40.78680560385147], [-73.85842092224304, 40.78680830931207], [-73.85839718127706, 40.78681907631928], [-73.8583918434028, 40.78682199726703], [-73.85838745384751, 40.786824962769], [-73.85832309838246, 40.78687465396305], [-73.85826743102713, 40.78691671061672], [-73.85826152049127, 40.786922025964856], [-73.85825574781519, 40.786928430564906], [-73.85823412406135, 40.786957292885525], [-73.85820537379047, 40.786988657304825], [-73.85816956419355, 40.78702511987387], [-73.85815754110043, 40.78703537974478], [-73.85814354176146, 40.7870443229452], [-73.85812817158494, 40.78705156105829], [-73.85811203509817, 40.787056809029245], [-73.85809131675386, 40.78706102459309], [-73.8580690623594, 40.78706349214436], [-73.85804551953424, 40.7870641652476], [-73.8580358282388, 40.78706372075975], [-73.85802109164295, 40.787063036692686], [-73.85799961604485, 40.7870607052523], [-73.85797998052438, 40.787057394041554], [-73.85796202844763, 40.787053067520425], [-73.85794568998246, 40.78704770834859], [-73.85792172009276, 40.78703739424951], [-73.85786314840233, 40.78700855171836], [-73.85780599688668, 40.78698547261065], [-73.85772986169724, 40.78695886725275], [-73.85770909350568, 40.786953304396256], [-73.85768482601809, 40.78694943843553], [-73.85760255605203, 40.786943869791116], [-73.85757378493405, 40.78694053834411], [-73.85754734103337, 40.78693456336776], [-73.8575358112561, 40.78693055112214], [-73.85752521760811, 40.78692579236686], [-73.85750542076829, 40.78691415988882], [-73.85746576865716, 40.786885870763506], [-73.85744739357587, 40.786874394827315], [-73.85737743400954, 40.786840601825745], [-73.85736136582724, 40.78683114439631], [-73.85734834299558, 40.78682149372409], [-73.85729374398954, 40.78677411293459], [-73.85728559591055, 40.78676704282163], [-73.85724349816154, 40.78672979066156], [-73.85723836454146, 40.78672603943953], [-73.85723247119613, 40.78672269067732], [-73.85721807696163, 40.78671708017688], [-73.8572031450027, 40.78671328816679], [-73.85716818589594, 40.786706338610955], [-73.85715356205525, 40.78670234879371], [-73.85712345763554, 40.78669109213223], [-73.85705112356236, 40.786660367900836], [-73.85703042955764, 40.78665296658985], [-73.85701118969901, 40.786647358763524], [-73.85700889280255, 40.786646861378806], [-73.8570065822965, 40.78664654339674], [-73.85700423681998, 40.78664639607964], [-73.85700184401013, 40.786646428793645], [-73.85699693804672, 40.786647007872645], [-73.85699174536678, 40.78664828986718], [-73.85698165442462, 40.7866523115247], [-73.8569625005109, 40.78666189600631], [-73.8569521826025, 40.7866669170036], [-73.85694857751135, 40.786668199794114], [-73.85694418001007, 40.786669401523774], [-73.85693993619978, 40.786670161512006], [-73.85693580067614, 40.78667048020512], [-73.85691545961245, 40.786670230468765], [-73.85686648756545, 40.786667458929365], [-73.85684155844486, 40.78666805819638], [-73.85681133765485, 40.78667261369714], [-73.8567614699094, 40.78668437433237], [-73.85670911174445, 40.78669716832916], [-73.85667405292824, 40.786708715817774], [-73.85665906408536, 40.7867152877934], [-73.85664594534656, 40.7867223946566], [-73.85663891840045, 40.78672716776114], [-73.85663457884486, 40.78673011516583], [-73.85662488072505, 40.78673849595679], [-73.85660829894911, 40.7867579799755], [-73.85659430490371, 40.78678148497367], [-73.85658367206896, 40.78680570446048], [-73.85656012485876, 40.78686911535254], [-73.85655178203112, 40.78688678978821], [-73.8565428156595, 40.78690211407084], [-73.85652107510892, 40.7869405473222], [-73.85651686958872, 40.78694562095422], [-73.85651235931141, 40.786949947043226], [-73.85650746918343, 40.78695359753186], [-73.85650214336668, 40.786956607363194], [-73.85650037645205, 40.786957380303186], [-73.85649853926243, 40.78695803454765], [-73.8564946154943, 40.78695898371911], [-73.8564903374551, 40.7869594565097], [-73.85648559735232, 40.786959458815865], [-73.85647634701824, 40.786958447672376], [-73.8564516069265, 40.786954023171276], [-73.85644453537552, 40.78695350106511], [-73.85644134734402, 40.78695352339555], [-73.85643833805504, 40.786953754182555], [-73.85640981200986, 40.78695812221798], [-73.8563852262836, 40.78696449390209], [-73.85636465148082, 40.786972834815174], [-73.85635589754584, 40.78697773038881], [-73.85634817318284, 40.78698311524666], [-73.85633435604609, 40.78699556074094], [-73.85632138571486, 40.7870107630821], [-73.85628495146457, 40.787066558227224], [-73.85626918661896, 40.78708693478534], [-73.85625338291675, 40.78710253866144], [-73.85621071201784, 40.78713918136811], [-73.85620020315073, 40.78715009995904], [-73.8561920416777, 40.78716059010005], [-73.85617856602606, 40.78718439975185], [-73.85616904420905, 40.787210385465734], [-73.85616371236826, 40.787237898041326], [-73.85616275026324, 40.78726606556619], [-73.85617045836483, 40.787356485124846], [-73.8561760427645, 40.78743673608788], [-73.85617604394368, 40.787463228890125], [-73.85617436960048, 40.787487053267014], [-73.8561737828743, 40.78749021390658], [-73.85617275786664, 40.787493219875685], [-73.85617128128915, 40.78749610047487], [-73.85616935713371, 40.78749884448483], [-73.85616696948826, 40.787501471486266], [-73.85616413290576, 40.78750397881662], [-73.85615699040497, 40.78750872544567], [-73.85614910324811, 40.78751260487092], [-73.85613932084577, 40.78751645613109], [-73.85609772992429, 40.787529507038656], [-73.85608104623329, 40.78753581665557], [-73.85607509299993, 40.78753875381504], [-73.8560664806232, 40.787543885586466], [-73.8560569353297, 40.78755305807727], [-73.85603321264523, 40.78758738271038], [-73.85601603404221, 40.78760921644483], [-73.85597608420362, 40.78766353806566], [-73.85597404083201, 40.787665958599305], [-73.85597165404891, 40.78766818052124], [-73.85596893750498, 40.787670211052124], [-73.85596586474206, 40.787672054346814], [-73.8559586891305, 40.78767517877375], [-73.85595002350544, 40.78767760744772], [-73.85592982941742, 40.78768039227652], [-73.85589212531865, 40.787682128110426], [-73.85580406250807, 40.78768710554236], [-73.85573914362435, 40.78768956432036], [-73.85560310030938, 40.78769279689538], [-73.85556149088127, 40.78769294344053], [-73.85542196652793, 40.78768971584818], [-73.85539747579985, 40.787690540339725], [-73.85537111936169, 40.78769366813679], [-73.85534234055956, 40.78769915164486], [-73.85530780984412, 40.78770760987653], [-73.85529901270421, 40.787710399018664], [-73.8552896094324, 40.78771430445829], [-73.85525882990035, 40.78773015073166], [-73.85524681590036, 40.78773555760208], [-73.855234071033, 40.78773963892992], [-73.8552279423134, 40.78774084545549], [-73.85522186387641, 40.78774153171004], [-73.85512749399335, 40.78774797743824], [-73.8549497141386, 40.78776024401784], [-73.85491542031168, 40.78776363177171], [-73.85483685607232, 40.787774707791776], [-73.85480173164524, 40.78777853589499], [-73.85476457332538, 40.78778001121077], [-73.85473138125592, 40.787777970130236], [-73.8547070531812, 40.78777443717722], [-73.85468022861875, 40.7877693420801], [-73.85457032389033, 40.787744394278064], [-73.85453886969691, 40.787738357341624], [-73.85451097917964, 40.78773329704505], [-73.85449877839754, 40.787732263925705], [-73.8544845470797, 40.78773329935781], [-73.8544674801146, 40.78773617850981], [-73.85444998385327, 40.78774013681833], [-73.85442754479743, 40.78774524112081], [-73.85441587100252, 40.78774703682185], [-73.85440532437036, 40.78774783264652], [-73.85439211484702, 40.787747770894], [-73.85437741367019, 40.78774676257946], [-73.85431409235855, 40.78773918177169], [-73.85429883286434, 40.78773858552389], [-73.85428498197076, 40.7877391174959], [-73.85416877913472, 40.787749622955054], [-73.85401805617188, 40.78776425411682], [-73.85393152201209, 40.78777359140016], [-73.85371524447409, 40.78779889084302], [-73.85354068080385, 40.78781480652712], [-73.8534518446134, 40.78782611229885], [-73.85336457538442, 40.78784148047623], [-73.85332033752428, 40.78785160001044], [-73.85328433106342, 40.78786264787821], [-73.85325391367482, 40.78787544243505], [-73.85322865679291, 40.7878902230359], [-73.85313945328275, 40.787955269406766], [-73.85304318488666, 40.78802164841081], [-73.85301986377856, 40.788040223035985], [-73.85299455222662, 40.78806364011936], [-73.85293742640218, 40.78812567459657], [-73.85287292575686, 40.78817980298654], [-73.85285256044187, 40.78820079505672], [-73.85284230133867, 40.78821137173992], [-73.85284201138356, 40.788342555973536], [-73.8528617928357, 40.788344319807976], [-73.85288990261189, 40.788346670054686], [-73.85297296851711, 40.788351837329195], [-73.85306663884121, 40.78835654815511], [-73.8531259333357, 40.78835847974775], [-73.8531642037784, 40.788358203513255], [-73.8532509376304, 40.78835436105497], [-73.85328967042591, 40.78835371647664], [-73.85346961745066, 40.78835850276173], [-73.85353771951809, 40.78835829180134], [-73.85359051889232, 40.78835591820986], [-73.85361442297669, 40.78835306713739], [-73.85367261904089, 40.78834211887525], [-73.85369958159862, 40.78833865014911], [-73.85386496770758, 40.78832686549008], [-73.85401770764051, 40.78831756723785], [-73.85415345566268, 40.78831452445786], [-73.85424119113252, 40.7883134195514], [-73.85432601017287, 40.78831359045082], [-73.85435363507843, 40.7883153364687], [-73.85438364788577, 40.78832012876301], [-73.85441611713868, 40.788327770073565], [-73.85446440284554, 40.78834142892451], [-73.85450027715643, 40.78835285606134], [-73.85453503358329, 40.78836618285395], [-73.85456828189716, 40.788381253347474], [-73.85459973691678, 40.78839795242853], [-73.85463110180122, 40.78841798363433], [-73.85466212641388, 40.78844194035955], [-73.85469341458857, 40.7884702736738], [-73.85472744729312, 40.78850521093849], [-73.85476549772548, 40.788545807907276], [-73.85478518134681, 40.788571254517144], [-73.85479249924812, 40.78858380770184], [-73.85479768615775, 40.788595871875124], [-73.85480083624125, 40.78860762657569], [-73.85480194733185, 40.788619154725914], [-73.85480065341628, 40.788642440126985], [-73.85479536031538, 40.78867916507016], [-73.8547935555014, 40.7886916255108], [-73.85479289872487, 40.788699684328606], [-73.85479170822225, 40.788713045824494], [-73.85479015014025, 40.78880257276635], [-73.85478828752537, 40.788841633480914], [-73.85477488753459, 40.788955872242866], [-73.85477486760239, 40.78901401842672], [-73.8547725437133, 40.789036374605345], [-73.85476700102882, 40.789056944927935], [-73.85475092459623, 40.78910019378737], [-73.85474513677647, 40.78911925858459], [-73.8547271694004, 40.78919784905344], [-73.8547134155788, 40.78925082651861], [-73.8547006703475, 40.78929330543442], [-73.85469330882114, 40.789311216005146], [-73.8546740230833, 40.78934767083617], [-73.85466678497424, 40.78936366406562], [-73.85464575832671, 40.78943264241254], [-73.85463754730239, 40.78944903077786], [-73.85461486312076, 40.789484472306896], [-73.85460743543419, 40.7895006629729], [-73.85459364262289, 40.78954447405569], [-73.8545792407035, 40.78959649495239], [-73.85456120188782, 40.78966970120305], [-73.85454851361663, 40.789761392247286], [-73.85453150689433, 40.789839561726886], [-73.8545254129648, 40.789863084644026], [-73.8545234573319, 40.7898742202651], [-73.85452124363728, 40.789905609038165], [-73.85451938179, 40.789971568112975], [-73.8545147646747, 40.79006760170975], [-73.85450773724963, 40.79014387398984], [-73.85450297303252, 40.79018264389067], [-73.85449618458735, 40.790209263136454], [-73.85448648377765, 40.790235058500784], [-73.8544773471365, 40.79025192329882], [-73.8544719407123, 40.79025897531954], [-73.85446599251512, 40.79026501061485], [-73.85445942840997, 40.79027006309863], [-73.85445222779767, 40.790274178814265], [-73.85444728241936, 40.79027652261423], [-73.85443480521755, 40.79028244093846], [-73.85442371474154, 40.790287722071255], [-73.85415926148362, 40.790412719467504], [-73.8540697206796, 40.790452327389076], [-73.85389890575122, 40.790521431455424], [-73.85383120135553, 40.790550035830094], [-73.85362955320053, 40.790642954822104], [-73.85355197936214, 40.79067681416448], [-73.85347749436237, 40.79070629240607], [-73.85340954040993, 40.79073004233696], [-73.85337851301512, 40.79073919665927], [-73.8533068131879, 40.79075803360744], [-73.85327445626994, 40.79076805080772], [-73.85316791455793, 40.790806232186505], [-73.85312868602469, 40.790822120897474], [-73.85309376971468, 40.79083784371317], [-73.85300596376405, 40.7908801362715], [-73.85283622037684, 40.79096246926646], [-73.85279912994584, 40.79098046739349], [-73.8527712656627, 40.790994984391645], [-73.85274514158607, 40.791010602069825], [-73.85273595696937, 40.791016920781324], [-73.852720981704, 40.79102720261027], [-73.85269895180701, 40.79104467163848], [-73.85268853906085, 40.79105464484897], [-73.8526792733986, 40.79106580778186], [-73.85267114137163, 40.79107816192768], [-73.85266414518988, 40.79109170477684], [-73.85265830693045, 40.79110642061034], [-73.85265359064718, 40.79112231759108], [-73.85264759969778, 40.791157717578535], [-73.85264742419872, 40.79118940644141], [-73.85265299090051, 40.79122229927846], [-73.85266418431857, 40.791255795028036], [-73.85268071109523, 40.79128899001694], [-73.85270703591517, 40.791332437174276], [-73.85273431336955, 40.79137402132106], [-73.85276257920901, 40.79141382308164], [-73.85279187961731, 40.7914518894217], [-73.85283502179291, 40.79150469555183], [-73.852858796491, 40.791533785514275], [-73.85288469081824, 40.79156296763563], [-73.85290948021424, 40.79158884423955], [-73.85297910559555, 40.79165682135949], [-73.85306080953109, 40.79173345914617], [-73.85314657162884, 40.791813010953646], [-73.85317478813853, 40.79183739653493], [-73.85320119873275, 40.79185858275661], [-73.85335450891063, 40.79197048428281], [-73.85342445523895, 40.79202232566936], [-73.85346170233008, 40.79205180973618], [-73.85357001852789, 40.79214460965114], [-73.8536655370685, 40.79222770321815], [-73.85371695117264, 40.79226911070586], [-73.85374337894176, 40.79229377280514], [-73.85375336392234, 40.79230565363566], [-73.85376137210825, 40.7923174426662], [-73.85376299952767, 40.792320948019615], [-73.853769898906, 40.79233577890684], [-73.85377222418454, 40.792345210011746], [-73.8537752195276, 40.79235706387968], [-73.85377760787473, 40.79238053384989], [-73.85377854910695, 40.79242127400702], [-73.8537779734007, 40.79246239989308], [-73.85377595819327, 40.79247919124222], [-73.8537726775182, 40.79249457678897], [-73.85373126537303, 40.79264103597808], [-73.85369739407176, 40.792752095911716], [-73.85369038565968, 40.79277081768012], [-73.85367235728862, 40.792811759410796], [-73.85366602731114, 40.79282949112686], [-73.85365784517334, 40.79286462703543], [-73.85364967670063, 40.79292081669766], [-73.85363607087064, 40.793024249617865], [-73.85363080166015, 40.79309818271064], [-73.8536315280857, 40.793145252533556], [-73.8536365935801, 40.7932072949071], [-73.85365042177162, 40.793335930646315], [-73.85368396814027, 40.793453722878766], [-73.85371089772221, 40.79359540618731], [-73.85372635874646, 40.79371998350508], [-73.85374051410696, 40.793840496841945], [-73.85373351593732, 40.793935375091095], [-73.85371825553295, 40.793962036128015], [-73.85368561848587, 40.79401839408178], [-73.85358451638858, 40.79410782853745], [-73.85353237176378, 40.794138856811834], [-73.85351764622185, 40.794143377362026], [-73.85338820350945, 40.79418311461311], [-73.85321701027608, 40.79422058136176], [-73.85304034260227, 40.794263553963894], [-73.85290227105678, 40.79431522857123], [-73.85282872033454, 40.79435526049111], [-73.852766271984, 40.794389247829294], [-73.85268508272915, 40.79447497027753], [-73.85263725293453, 40.79454229280629], [-73.85262416811536, 40.7946134426322], [-73.85262310783055, 40.79475015592458], [-73.85265711034053, 40.794875089776454], [-73.85265879996285, 40.794919712443615], [-73.8526309825624, 40.79494485424474], [-73.85259261251832, 40.79493563836851], [-73.85258042693633, 40.79492158400388], [-73.85255611510601, 40.794893564972604], [-73.85253153207259, 40.794790057555886], [-73.85249076582929, 40.794674974705615], [-73.85242651222973, 40.79460975882105], [-73.85233601016024, 40.7945453656644], [-73.85225478631885, 40.79451254658353], [-73.85214062585973, 40.79444649258847], [-73.85200288947318, 40.79436318108858], [-73.85193160677206, 40.794309789545224], [-73.85189730713526, 40.794286656815935], [-73.85181651299672, 40.79423690787666], [-73.85168072178335, 40.79414255807322], [-73.85159077157229, 40.79408653158045], [-73.85143723745655, 40.79402591832599], [-73.8512917816512, 40.79398321871114], [-73.85112011660962, 40.7939241220335], [-73.85097034152753, 40.793857948323975], [-73.85079807258425, 40.79380961136817], [-73.85062808294123, 40.79377521705116], [-73.85049082789963, 40.79373727270515], [-73.8503263813649, 40.79367766269842], [-73.85016769642245, 40.79364306610521], [-73.85000721695765, 40.79360091123408], [-73.8498408564086, 40.79354448520947], [-73.84973467938572, 40.79349569482057], [-73.84962251839083, 40.79346569570807], [-73.8494823389847, 40.793418600803406], [-73.8493365487603, 40.79337149956624], [-73.8492203438544, 40.79336616002198], [-73.84913455725516, 40.79336270580534], [-73.84906160835088, 40.79336261029852], [-73.84898342755147, 40.79339361180352], [-73.84893051832798, 40.79341069705515], [-73.84890131445043, 40.793435387178214], [-73.84886198397842, 40.793468635780464], [-73.84884894723092, 40.79350168565831], [-73.84885848370783, 40.793591099022926], [-73.84887965495557, 40.79365488253947], [-73.84890147425774, 40.79366828351349], [-73.84896194839715, 40.7938049149536], [-73.849017211755, 40.79392484379938], [-73.84907814795721, 40.79414538448089], [-73.84903163032307, 40.79433808463523], [-73.84896271217512, 40.794408477406584], [-73.84878370153791, 40.794542102225336], [-73.84877745470259, 40.79457974348267], [-73.84877122000401, 40.79461737604402], [-73.84878457368544, 40.794700915276955], [-73.84884690961489, 40.79490523039205], [-73.84887162206815, 40.795027488024886], [-73.8488765456334, 40.79513404169125], [-73.84884566489967, 40.795229166577556], [-73.84881376432953, 40.79528731529211], [-73.84870999361335, 40.795416481289855], [-73.84855988738983, 40.79549506021838], [-73.84840067725122, 40.79556462149242], [-73.84823442276506, 40.79563184132044], [-73.84808903411276, 40.79568851740229], [-73.84792364797373, 40.795753514196456], [-73.84781967180619, 40.79578469546817], [-73.84763762072186, 40.79582581476201], [-73.84745840378464, 40.79586126478076], [-73.84729839674371, 40.795900350307335], [-73.84712646747435, 40.795935061799575], [-73.84685831176914, 40.79597954211446], [-73.84677146173631, 40.795992890189915], [-73.84673086658063, 40.796001479344746], [-73.84660914258137, 40.79602723440848], [-73.84651631916125, 40.79606183379271], [-73.84644727612637, 40.79610167934103], [-73.84637823258807, 40.79614151613582], [-73.84632264317928, 40.79616408876088], [-73.84624528406336, 40.796161950667056], [-73.84620432632532, 40.79613943809977], [-73.84612011376143, 40.79609316530997], [-73.84604010531895, 40.79603792173839], [-73.84597412890419, 40.79601730187317], [-73.84588460454623, 40.79601358879331], [-73.84570427007124, 40.79602888164454], [-73.84567461137927, 40.79602909389694], [-73.8456210638299, 40.79602948171253], [-73.84559167122411, 40.79601181902573], [-73.84559498485325, 40.79598311567544], [-73.84562722402833, 40.795891811886165], [-73.84561606324512, 40.795845718962255], [-73.84557627918223, 40.79580748365859], [-73.84551678745504, 40.79576485622225], [-73.8454367018999, 40.79564636850851], [-73.84537463759747, 40.7955483553866], [-73.84528519601372, 40.79544339037916], [-73.84520216815449, 40.795398019954966], [-73.84506393886154, 40.79532545177626], [-73.84498447620877, 40.7952652094112], [-73.84495114910605, 40.79520249792143], [-73.84488892176357, 40.79510909661496], [-73.8448730254321, 40.79509683700132], [-73.84480116912152, 40.7950576760676], [-73.84466734418736, 40.79495665817199], [-73.8445991504444, 40.79491154987514], [-73.84451391906175, 40.79488179016884], [-73.84438471988366, 40.794870341529595], [-73.84422311865038, 40.794876985073586], [-73.84407887373855, 40.794875060841726], [-73.84390523936045, 40.794869306206444], [-73.84382499651181, 40.79487536227074], [-73.84379857938126, 40.79487735637718], [-73.84373233041337, 40.79488235365055], [-73.84354668938991, 40.79491394401049], [-73.8434326202129, 40.79494844908789], [-73.84338511407093, 40.79498491861969], [-73.84333760876113, 40.79502138696035], [-73.84332414153785, 40.79506905019075], [-73.84335588803987, 40.795234353799444], [-73.84336415641455, 40.79534609866879], [-73.84335118053633, 40.79547252924368], [-73.8433063238691, 40.79550093348892], [-73.84323462158838, 40.79547660430573], [-73.84317961314706, 40.795433873032174], [-73.84314830001613, 40.79538678733097], [-73.84311059001811, 40.79526369123992], [-73.84304363919044, 40.795214740016874], [-73.84293426865992, 40.795191149897065], [-73.84289545847199, 40.79518278540822], [-73.84286053658465, 40.79519887517494], [-73.84284865322397, 40.795213401671674], [-73.84289254581853, 40.79539277833716], [-73.8432849719419, 40.79617439268503], [-73.84320653636648, 40.796192903595745], [-73.8428087524122, 40.79541822241309], [-73.84225959368331, 40.79558496893736], [-73.84292069025288, 40.796903686184], [-73.8428667525936, 40.79692222907191], [-73.8421674734115, 40.7956129401636], [-73.84208804901434, 40.7956370563647], [-73.84203334901652, 40.79563868313395], [-73.84197864967462, 40.79564031105082], [-73.84190480251937, 40.7956217942407], [-73.84183741226606, 40.79558859863672], [-73.8417820928015, 40.79553692460987], [-73.8416869879848, 40.79540867089491], [-73.84165397120607, 40.79539590970684], [-73.84158721174394, 40.795401069221235], [-73.84153823334024, 40.79541881301255], [-73.84148925424489, 40.795436558457354], [-73.8414273671699, 40.795490430363095], [-73.84136287271946, 40.795619950695176], [-73.84135034620307, 40.79573990748322], [-73.84136133643683, 40.795856600577515], [-73.84149409342267, 40.79598188920635], [-73.84148780606058, 40.79601448800372], [-73.84144315649658, 40.79604513413277], [-73.84134129989056, 40.796095358756304], [-73.84130710746976, 40.796138076853374], [-73.8412920482614, 40.79616745712962], [-73.8413057246617, 40.79620095620876], [-73.84129943545976, 40.79621966932996], [-73.84059982294626, 40.796806803210494], [-73.84013930364449, 40.796879187836076], [-73.84043977575945, 40.79763751324531], [-73.84040055225613, 40.79764862952207], [-73.84041517975831, 40.7976784372587], [-73.8392338815539, 40.79788530644824], [-73.83920948324085, 40.79784431435393], [-73.83841944083812, 40.798342147138], [-73.8384291582917, 40.79837567115333], [-73.83789967503593, 40.79850897118662], [-73.83787044050948, 40.79844190861319], [-73.83839013354552, 40.798304872075995]]], [[[-73.8678840747076, 40.78736103669457], [-73.86803304873462, 40.7871820299527], [-73.86813032000018, 40.78723277784419], [-73.86918113468879, 40.78594348978492], [-73.8692349173292, 40.78596991495815], [-73.86817127125168, 40.78725619565448], [-73.86823784768373, 40.787279643084794], [-73.8680991225789, 40.78745866181839], [-73.8678840747076, 40.78736103669457]]]]}}, {\&quot;id\&quot;: \&quot;53\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 54, \&quot;Shape_Leng\&quot;: 0.0762192448554, \&quot;Shape_Area\&quot;: 0.000132452130536, \&quot;zone\&quot;: \&quot;Columbia Street\&quot;, \&quot;LocationID\&quot;: 54, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-74.00174362072502, 40.69240674985266], [-74.00400795971088, 40.693208199632345], [-74.00374561906423, 40.69361620298103], [-74.0034621809253, 40.69405701507471], [-74.00127014951309, 40.69329606183691], [-74.0015417289999, 40.69278596299994], [-74.00174362072502, 40.69240674985266]]], [[[-74.00174362072502, 40.69240674985266], [-74.0016998939999, 40.692382766999906], [-74.00110519399988, 40.692056594999954], [-74.00031547799995, 40.69187465199993], [-74.00021419499998, 40.69185176099989], [-73.99991517399985, 40.69176722999993], [-73.99951274099993, 40.6916514499999], [-73.99936540199982, 40.69161307799989], [-73.99928819599991, 40.691593959999935], [-73.99920161899989, 40.69157183399992], [-73.99910057299985, 40.69153697399986], [-73.9984330559999, 40.691364914999895], [-73.99803048599995, 40.69125372299988], [-73.99776924399993, 40.691194697999954], [-73.99808645399993, 40.690535077999876], [-73.99841229299983, 40.68985608799994], [-73.99874207699997, 40.689177013999924], [-73.99906961899994, 40.68849807499985], [-73.99937882999994, 40.68785319299995], [-73.99963768500004, 40.68731476799996], [-73.99969626699995, 40.68719803399989], [-74.0006473809999, 40.68525394699991], [-74.0009581009999, 40.68457931899991], [-74.00128182399995, 40.6839096399999], [-74.00160876999993, 40.683235204999924], [-74.00193169899997, 40.68256321799992], [-74.002204589, 40.68199132399995], [-74.00225222099995, 40.681893211999906], [-74.00256464499995, 40.681228463999936], [-74.00289363599995, 40.680559409999894], [-74.00329231299999, 40.67964328799992], [-74.0033891689999, 40.679721305999905], [-74.00345372099991, 40.679789886999885], [-74.00371762999994, 40.68002103199993], [-74.00378241799994, 40.6800860019999], [-74.00447389899988, 40.680993011999846], [-74.00456896599997, 40.68114997599986], [-74.00503641499995, 40.681910287999884], [-74.00560068499993, 40.68281599899994], [-74.00567492299993, 40.68292992799995], [-74.00596041099988, 40.683362870999936], [-74.00581925399995, 40.683656554999914], [-74.0054980969999, 40.68432595799987], [-74.0051790759999, 40.68499722499988], [-74.00485241699997, 40.68566813099993], [-74.00549714699999, 40.68584772699993], [-74.0071710969999, 40.68635700999991], [-74.00753083199993, 40.68607448699991], [-74.00771707547891, 40.68626442900919], [-74.00754474403942, 40.686318244593565], [-74.00701988682644, 40.686526417194024], [-74.0064414683233, 40.68628849023208], [-74.00588224183223, 40.6861957688936], [-74.00566680246698, 40.68669807883377], [-74.00562986330395, 40.686784206043626], [-74.00783293766679, 40.68738505516274], [-74.00742012154092, 40.68820629043599], [-74.00500373315064, 40.687605985400886], [-74.00459270521766, 40.688215222986614], [-74.00678438439806, 40.68882687995826], [-74.00636461225261, 40.68966966863697], [-74.00382038919723, 40.688929644699236], [-74.00340921624516, 40.689613261160105], [-74.00575900670344, 40.69023640001614], [-74.0053420962491, 40.6910916029778], [-74.00297565436571, 40.69042657592073], [-74.00196321992853, 40.69013637946073], [-74.00185304524615, 40.69038798674182], [-74.0009615685494, 40.69012876835003], [-74.00069905841875, 40.690611858419075], [-74.00479415294552, 40.69176162037443], [-74.00440941259976, 40.692528800389354], [-74.00196938526075, 40.69184320831752], [-74.00181765040728, 40.692221962481405], [-74.00174362072502, 40.69240674985266]]], [[[-74.01092841300002, 40.684491472999824], [-74.01193259955522, 40.683887749077535], [-74.01217596614636, 40.68409518562848], [-74.00878590130924, 40.686146602298834], [-74.00869559889543, 40.6861933180126], [-74.00859803329703, 40.686252564084974], [-74.00835328548824, 40.6864001294722], [-74.00816320571415, 40.68617364485845], [-74.00842516199995, 40.68601553199992], [-74.00851294299997, 40.68596254899994], [-74.0086007239999, 40.68590956499989], [-74.01092841300002, 40.684491472999824]]]]}}, {\&quot;id\&quot;: \&quot;54\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 55, \&quot;Shape_Leng\&quot;: 0.149956807524, \&quot;Shape_Area\&quot;: 0.000736274713586, \&quot;zone\&quot;: \&quot;Coney Island\&quot;, \&quot;LocationID\&quot;: 55, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98671582299981, 40.58456849999991], [-73.98627573699999, 40.584479980999895], [-73.9858605929999, 40.5845257129999], [-73.98548157999991, 40.58451967699994], [-73.98492730999999, 40.5845959529999], [-73.98482192899988, 40.584168522999924], [-73.983875933, 40.58397574499992], [-73.98281157699994, 40.58379238799989], [-73.98175452099981, 40.58358376399984], [-73.98044790899985, 40.58341064299993], [-73.98006567999988, 40.583317863999845], [-73.97742525299988, 40.58290659299994], [-73.97468194399984, 40.58312411799988], [-73.97461091899993, 40.5831298759999], [-73.97449712999993, 40.583153389999886], [-73.97308506499995, 40.5834298259999], [-73.97174499599997, 40.58366274899991], [-73.970846422, 40.58382021499993], [-73.97045373499985, 40.583892278999876], [-73.970055463, 40.58394772999985], [-73.9698544559998, 40.58396698199992], [-73.96899979299997, 40.584063502999896], [-73.96781584999998, 40.5845390509999], [-73.9668442979999, 40.584569328999876], [-73.96670868800001, 40.584569082999906], [-73.96661531499983, 40.58457103699992], [-73.96670866299985, 40.58423930199995], [-73.96673011799997, 40.584135972999874], [-73.96674664199992, 40.584055351999886], [-73.96676128900002, 40.5839843919999], [-73.96677678399986, 40.58391498999987], [-73.966813755, 40.58375771499986], [-73.96683458399988, 40.583676861999926], [-73.96685766099992, 40.58358661799986], [-73.96691975199984, 40.58335247299993], [-73.96701115999986, 40.58294762399991], [-73.96707277600002, 40.582669811999864], [-73.96708956100004, 40.58259579399989], [-73.96733403999997, 40.58151752199991], [-73.9675871379998, 40.58042905899994], [-73.96759867799989, 40.58037846999991], [-73.96761555699982, 40.58030516299993], [-73.96804495099995, 40.578438532999854], [-73.96834802499998, 40.577113222999856], [-73.96852475500002, 40.57634038099996], [-73.96853234099981, 40.57630503099995], [-73.96854635499986, 40.57624267099993], [-73.96865108899983, 40.57576305399993], [-73.96866614199996, 40.57569696799993], [-73.96868119599986, 40.57563088299987], [-73.96873173200001, 40.57550140999989], [-73.96880187199986, 40.57537736399993], [-73.96883335399993, 40.575335858999864], [-73.9688899589999, 40.57526123899986], [-73.96883249999995, 40.57524150099993], [-73.96853345900001, 40.57513875999993], [-73.96840165999983, 40.57508536799986], [-73.9682587889998, 40.575045488999876], [-73.96810857699987, 40.57502089899985], [-73.96795533399992, 40.57501255399993], [-73.96780353599996, 40.57502045399985], [-73.96765743500002, 40.575043681999915], [-73.96756707299996, 40.574881526999896], [-73.96675354099992, 40.574832917999906], [-73.96471128899991, 40.57478261799983], [-73.96286117999982, 40.57498014099989], [-73.96103342799984, 40.57507632399994], [-73.95941778299985, 40.57517798299994], [-73.95939182223685, 40.57391210937612], [-73.95982864911235, 40.573929309635766], [-73.96021532299316, 40.573911179120955], [-73.9604890840351, 40.57388518154406], [-73.96068755363642, 40.57387742198219], [-73.96081416941384, 40.57386180993874], [-73.96090885893602, 40.57386502894637], [-73.96210769550765, 40.57371352001862], [-73.96267607127344, 40.57366693903902], [-73.96305899786316, 40.573635553517924], [-73.96398292380015, 40.57355757223531], [-73.96453618454449, 40.57351319942493], [-73.96508478576706, 40.5734691986379], [-73.96602239542973, 40.57338859483251], [-73.96720294103956, 40.573326317397424], [-73.96738975478867, 40.573258999904446], [-73.96743567793125, 40.57320896967127], [-73.96736390080565, 40.57304456895217], [-73.96739472238792, 40.5729950026884], [-73.96742628474536, 40.57298510896918], [-73.96744946374342, 40.573008064912955], [-73.96753149753678, 40.573190732887284], [-73.96762388104095, 40.57319858543997], [-73.96779155223932, 40.57318819631816], [-73.96818506098592, 40.573177868546125], [-73.96839037828869, 40.57315444294007], [-73.96856335985457, 40.57312594655183], [-73.96884893944646, 40.573058027445015], [-73.96897214113847, 40.57302153230467], [-73.96906454391251, 40.57298763701027], [-73.96920229198774, 40.572957418516594], [-73.96945126202378, 40.57285728036321], [-73.96946838633161, 40.5728233657055], [-73.96921197952125, 40.57233537642345], [-73.96924621215574, 40.572304075654515], [-73.96928385228033, 40.57230147645185], [-73.96955895151744, 40.57280858046076], [-73.96975580336873, 40.572846924690374], [-73.96996110201732, 40.57286002458749], [-73.97021089387842, 40.57285226198176], [-73.97085363074368, 40.57277051527984], [-73.97108691689401, 40.57272724421559], [-73.9713298962632, 40.572643810384115], [-73.97135044587482, 40.572599460045254], [-73.97137785791334, 40.572510753098854], [-73.97114248794517, 40.57205063151452], [-73.97113515153814, 40.571960152135816], [-73.97118306355702, 40.571941899084166], [-73.97122069416346, 40.57196278220161], [-73.97145657076729, 40.572479462745875], [-73.9715179092025, 40.57258168240442], [-73.97160706452378, 40.572628223919835], [-73.97183632056803, 40.57262828035426], [-73.97249673747078, 40.5725762567474], [-73.97293476162697, 40.57247460264789], [-73.97314693344347, 40.57241463999529], [-73.9733450222981, 40.57232121400607], [-73.97336256224074, 40.57226335704354], [-73.97323268078627, 40.571905865967], [-73.97321224564611, 40.57166842470265], [-73.97324990115135, 40.57162668661163], [-73.97329095478177, 40.57164235029656], [-73.97332515756229, 40.571676279132454], [-73.97334306976626, 40.57174057042443], [-73.97334904033113, 40.571851099622315], [-73.97336611476469, 40.57193720809319], [-73.97339000577036, 40.57208854678842], [-73.97342758666748, 40.57223467076782], [-73.97344805325683, 40.5722721069693], [-73.9737320997119, 40.57228692509402], [-73.97400678258738, 40.57227436254645], [-73.97440961940833, 40.57223750300214], [-73.97484762696547, 40.57216454176584], [-73.97528564967088, 40.572049832668604], [-73.9754708190279, 40.57196900381691], [-73.97540561019994, 40.57150453486901], [-73.97540564094209, 40.57142104064054], [-73.97545696559193, 40.5714210516176], [-73.97548432668431, 40.571454978349074], [-73.9755088303412, 40.57152449244048], [-73.97551718820384, 40.57169431528035], [-73.97560269948812, 40.57185928310358], [-73.97567918029272, 40.57195598449735], [-73.97592552091535, 40.57201865743752], [-73.97621978857089, 40.57201611012744], [-73.97684256247973, 40.571948398935305], [-73.97730110158642, 40.571862385946396], [-73.97766384588132, 40.571729387799046], [-73.97756820091203, 40.57124666665904], [-73.97759877204504, 40.57119103051838], [-73.97767087523813, 40.57117102007902], [-73.978047249339, 40.57119979395958], [-73.97807599798215, 40.571229570128686], [-73.97771533072489, 40.571251913842254], [-73.97769819728057, 40.5713249683295], [-73.97770502384324, 40.5713771534471], [-73.97773918874084, 40.57153371211849], [-73.97775127949755, 40.57168028978257], [-73.97776503791167, 40.57170769410005], [-73.9777840795185, 40.57173319377245], [-73.97780796518646, 40.571756200726284], [-73.97783614406792, 40.57177618437464], [-73.97788258903813, 40.57179554497028], [-73.97793080193595, 40.57181220403646], [-73.97799924492543, 40.571830476810476], [-73.97806978098814, 40.57184331224861], [-73.97819660524176, 40.57186619222339], [-73.97832516078613, 40.57188251422633], [-73.97845486511183, 40.5718922042992], [-73.97858513050289, 40.571895218534415], [-73.9787153667011, 40.57189154327378], [-73.97884498357945, 40.57188119517073], [-73.97897339381907, 40.57186422111464], [-73.97910001556873, 40.57184069801798], [-73.97945681046644, 40.571742768460936], [-73.9795218304509, 40.57171407873419], [-73.97976481057256, 40.57158627158868], [-73.97984694469402, 40.571539319610174], [-73.97986064824686, 40.5714819205131], [-73.97980592543583, 40.57140363454865], [-73.97972382225471, 40.57134621741238], [-73.97966565809048, 40.5713331610994], [-73.9794672106511, 40.57129920658622], [-73.97945877680687, 40.57130181734474], [-73.97944987919773, 40.571303280990314], [-73.97944078394436, 40.57130355374672], [-73.97943176307878, 40.571302627455914], [-73.97942308640852, 40.5713005298225], [-73.97941501344556, 40.571297323585156], [-73.97940778564593, 40.57129310463992], [-73.97940161918756, 40.57128799917216], [-73.97939669850376, 40.571282159882365], [-73.97939317076805, 40.57127576141902], [-73.97939114149196, 40.57126899515512], [-73.97939067136882, 40.57126206346414], [-73.97944328367615, 40.57122092594798], [-73.9795835711477, 40.57122616884359], [-73.97975464745674, 40.57124968258197], [-73.97995988926644, 40.57144019050048], [-73.97998743713075, 40.57158360582356], [-73.98000771572241, 40.571698509185964], [-73.98010351551893, 40.57172722648448], [-73.9803259222601, 40.57173770221856], [-73.9806489086185, 40.571737732454054], [-73.9810444940945, 40.57168042036584], [-73.98133877923644, 40.57161002034813], [-73.98163648890623, 40.57152657358946], [-73.98184180651329, 40.57146920355463], [-73.9820407585251, 40.57148037052242], [-73.98203685076774, 40.5714379242801], [-73.98201633411738, 40.57138834604919], [-73.9819923913309, 40.5713518133093], [-73.98192054501716, 40.57132049258673], [-73.98169656909477, 40.571311371820634], [-73.98159891057547, 40.571307395484105], [-73.98155785470236, 40.571294342868484], [-73.98154417427375, 40.57127346698696], [-73.98157155423429, 40.5712499884248], [-73.9819479404238, 40.57123700215743], [-73.98202662918752, 40.57127615208919], [-73.98209504346248, 40.5713466114785], [-73.98214632133059, 40.57152143608206], [-73.98217710691104, 40.57156057845449], [-73.98225580253015, 40.57156841828967], [-73.98249190051142, 40.57156584591296], [-73.98282723201832, 40.57154241357462], [-73.98308044496548, 40.571508531433324], [-73.98367270153267, 40.57140705768737], [-73.98340440737672, 40.57016554451071], [-73.98305809245075, 40.57020965626845], [-73.98304328883707, 40.570145860988035], [-73.98339168436635, 40.57009468501941], [-73.98326996675307, 40.569541894356284], [-73.98336058039273, 40.56952999448666], [-73.98348521866141, 40.57008901506274], [-73.98382125394879, 40.57004578998432], [-73.9838394948926, 40.570112467157976], [-73.98348842146662, 40.57015603054908], [-73.98375790448641, 40.571396227250865], [-73.98572931754806, 40.571195889981496], [-73.98593538175733, 40.57117818892235], [-73.9864508758885, 40.57114890891035], [-73.98646799852705, 40.571078462725126], [-73.98650905821334, 40.57108107733054], [-73.98654668594091, 40.57113326486579], [-73.98686148425026, 40.5711072087355], [-73.98726866835315, 40.57107594447696], [-73.98752187630423, 40.571047270923586], [-73.98777508425758, 40.5710185968119], [-73.98803716678532, 40.57098510876868], [-73.9886202548146, 40.570896051314094], [-73.98857772038879, 40.57069790950493], [-73.9886339755543, 40.57069514448042], [-73.98866476412249, 40.570729067240016], [-73.98869554520905, 40.57081517428702], [-73.98872145848834, 40.57088369208261], [-73.98883582208126, 40.570877808557896], [-73.98892820617891, 40.5708752082258], [-73.98914719716011, 40.570843919183126], [-73.98935934175859, 40.57083089249508], [-73.9896465753043, 40.57079215540961], [-73.98993761163376, 40.570757887126035], [-73.99014629531219, 40.5707260797864], [-73.99026267527424, 40.57070834011726], [-73.99052614849931, 40.57065878712539], [-73.9907731032393, 40.570599421837834], [-73.99074174672937, 40.570403103606914], [-73.99071781592744, 40.57025959565118], [-73.99079264766938, 40.57024864875552], [-73.99082728598098, 40.57042137437878], [-73.99086374684879, 40.570602016242326], [-73.99119337523612, 40.5706118749683], [-73.99156291512742, 40.57057798348913], [-73.99189139756308, 40.57053364999877], [-73.9922061931928, 40.57049975207031], [-73.99229545219589, 40.57049106967158], [-73.99252782858784, 40.57046846400287], [-73.9927285489706, 40.5704337880374], [-73.99296923014857, 40.57036673204229], [-73.99294529319609, 40.57023627108529], [-73.99298098072161, 40.57019677330923], [-73.99301372686757, 40.570212792475736], [-73.99302740713195, 40.57027802296811], [-73.99305289944259, 40.57033902555883], [-73.99315741886727, 40.570379789438825], [-73.9932977052498, 40.57038240748573], [-73.99362618034408, 40.570392863610316], [-73.9936750974706, 40.570395135670054], [-73.99401966538295, 40.570411148678886], [-73.99440631046578, 40.57039029447153], [-73.99468360322813, 40.57036133741584], [-73.99480664237873, 40.57036422070033], [-73.99493763229952, 40.570354674512366], [-73.99513854436809, 40.57031466120666], [-73.99515224064955, 40.570178982743485], [-73.9951351400427, 40.570066787611914], [-73.99518726085735, 40.570021877633096], [-73.99524805213261, 40.57009810177863], [-73.9952617292692, 40.570228562336936], [-73.99529301203255, 40.57032128271386], [-73.99551492045956, 40.57035381411382], [-73.99576469677095, 40.570392962362455], [-73.99600078794127, 40.57039297082444], [-73.99640796358749, 40.570374718693564], [-73.99665089870697, 40.57037211675966], [-73.99684901717619, 40.570366965468814], [-73.99699640776534, 40.57036269138141], [-73.99704438661118, 40.57035647342443], [-73.99719493825835, 40.570348649043794], [-73.997318117723, 40.57032256042304], [-73.99735575750893, 40.570278204147925], [-73.99735576071078, 40.57019731968318], [-73.99736944882595, 40.57013730754285], [-73.99741966158959, 40.570140854445846], [-73.99744814048576, 40.57028603439299], [-73.99751999355462, 40.57032517356224], [-73.9976671213519, 40.57037475116615], [-73.99784504412378, 40.57041389391206], [-73.997995595213, 40.570447815853086], [-73.99818720620968, 40.57046086506931], [-73.99829669781617, 40.57047391227484], [-73.99846777900149, 40.570497396973], [-73.9986324281592, 40.570508006690254], [-73.99899128811825, 40.57048957527737], [-73.99922738028934, 40.57048957710792], [-73.9996140257524, 40.57046609660146], [-73.9996413990163, 40.570445223004704], [-73.99965850686432, 40.570382602502804], [-73.99970321419985, 40.5703864975226], [-73.9997329117931, 40.57041151211029], [-73.99972950792677, 40.57045044112285], [-73.99971929823451, 40.570473797740014], [-73.9997485215654, 40.57049579695692], [-73.99995444080645, 40.57049153081292], [-74.00015998281083, 40.57048111670441], [-74.00036483202332, 40.57046457061954], [-74.00056867395234, 40.57044191796051], [-74.00077119565373, 40.57041319350455], [-74.00091800593184, 40.57041051221619], [-74.0010643863451, 40.57040154143544], [-74.00120987388024, 40.57038630953778], [-74.00135400834894, 40.57036486470276], [-74.0016656216866, 40.57030728168833], [-74.0018778651766, 40.57024746431582], [-74.002011670539, 40.570208758524196], [-74.00205780931616, 40.570152462901795], [-74.00198396888365, 40.5695965418238], [-74.00208547639728, 40.569585983985014], [-74.00220084969976, 40.570303754391674], [-74.00222854320391, 40.57060986276879], [-74.00234852717965, 40.57110596794083], [-74.00248707737698, 40.57173838887243], [-74.00254067002723, 40.57179380137707], [-74.00259949630396, 40.57184603577699], [-74.00266323324675, 40.571894805291336], [-74.00273153093207, 40.57193984216144], [-74.00277776235734, 40.571997860624464], [-74.00283150615377, 40.57205198482916], [-74.0028922028448, 40.57210165132107], [-74.00295922056691, 40.57214634305124], [-74.00303186164808, 40.57218559475904], [-74.00310936987007, 40.57221899781597], [-74.00319093834194, 40.57224620448044], [-74.00327571790024, 40.57226693151758], [-74.00336282594905, 40.572280963148565], [-74.00345135565061, 40.5722881532969], [-74.00348277706472, 40.57227667938334], [-74.00351575170326, 40.572268106676184], [-74.00354982074944, 40.572262554458256], [-74.00359727599627, 40.572259984064814], [-74.00364465678643, 40.57226325710292], [-74.00369073370504, 40.5722722886454], [-74.0037343111684, 40.572286844345854], [-74.00377425844584, 40.572306546519286], [-74.00380953899872, 40.57233088394228], [-74.00383923737562, 40.57235922511667], [-74.00386258296655, 40.57239083465626], [-74.00387896999834, 40.57242489236713], [-74.00388734496535, 40.57245649855172], [-74.00388971484409, 40.57248869279238], [-74.00396101384514, 40.57255240674605], [-74.00403859723095, 40.57261169787529], [-74.00412199472655, 40.572666206772126], [-74.0042107008097, 40.57271560301656], [-74.0043041777745, 40.5727595871793], [-74.00440185899215, 40.57279789263783], [-74.00450315234521, 40.57283028719197], [-74.00460744381672, 40.57285657447203], [-74.0047141012138, 40.572876595129344], [-74.0048224779998, 40.57289022780212], [-74.00666915632603, 40.57339364837534], [-74.00870865730187, 40.57375981858765], [-74.00942893690326, 40.57379726841015], [-74.01007410785421, 40.57383080951765], [-74.01071306846103, 40.57402909731149], [-74.01115668729254, 40.57416676185885], [-74.01190196490126, 40.574790166507505], [-74.01201540191126, 40.57488505247416], [-74.01232183520665, 40.57565268236508], [-74.01236788614587, 40.57585681441278], [-74.01240471798019, 40.57606203174], [-74.01243228719036, 40.57626809234315], [-74.01245056117921, 40.576474753222335], [-74.01245951831018, 40.57668177066747], [-74.01279721934527, 40.577489237133136], [-74.01286422267526, 40.57756332933402], [-74.0129242497425, 40.57764082044216], [-74.0129770052135, 40.57772132923269], [-74.01302222952468, 40.577804459633505], [-74.01303113457197, 40.57785701811856], [-74.0130314800179, 40.57791001271724], [-74.0129633543014, 40.57803631343701], [-74.01290105351399, 40.5781643507723], [-74.01284465365903, 40.578293968594366], [-74.01279422354547, 40.57842500884618], [-74.01274982470373, 40.57855731173525], [-74.01235035929233, 40.57922182165903], [-74.0122466287476, 40.57935557381623], [-74.01213565146023, 40.57948590084882], [-74.01201762162991, 40.57961257464747], [-74.01189274580409, 40.57973537349643], [-74.01176124251562, 40.57985408246062], [-74.01162334190214, 40.5799684937623], [-74.0114792853013, 40.58007840714522], [-74.01132932483026, 40.58018363022479], [-74.0111737229432, 40.58028397882522], [-74.01101275197246, 40.58037927730177], [-74.01086035571247, 40.58046224526471], [-74.01070388953003, 40.580540686107405], [-74.01054358463756, 40.58061448390999], [-74.01037871958451, 40.58063917725279], [-74.01021580270462, 40.580670498035765], [-74.01005529194393, 40.58070835821916], [-74.00989763848804, 40.58075265138161], [-74.00974328549282, 40.58080325301871], [-74.00959266683995, 40.58086002089339], [-74.00944620591711, 40.5809227954353], [-74.00930431442846, 40.58099140018941], [-74.00919506149998, 40.58104995924493], [-74.00908914150955, 40.58111197592423], [-74.00898674257299, 40.58117734009006], [-74.00888804655423, 40.58124593565999], [-74.00886572727528, 40.581260159293336], [-74.0087265097835, 40.581343762669775], [-74.00858199198898, 40.58142196326759], [-74.00843253422542, 40.5814945660956], [-74.00827850914793, 40.58156139011996], [-74.00812030080365, 40.581622268715506], [-74.00795830367427, 40.58167705008141], [-74.00779292169176, 40.581725597620476], [-74.00762456723098, 40.58176779027861], [-74.00745366008165, 40.58180352284798], [-74.00647984834727, 40.58192825746383], [-74.00604734235807, 40.58198365303581], [-74.0048362757677, 40.58185484358028], [-74.0039802361642, 40.58172129566388], [-74.00294374157795, 40.581432835521014], [-74.00220582876804, 40.581365886020336], [-74.0018599131742, 40.58138751901811], [-74.0012403263368, 40.58142626537587], [-74.00083687503617, 40.58134456441586], [-74.00073378767112, 40.58131818388558], [-74.00062901792148, 40.58129598823696], [-74.00050742414106, 40.58127580080334], [-74.00038445327529, 40.5812612491398], [-74.00026055424323, 40.58125238636873], [-74.00013617935197, 40.581249244844756], [-74.00001178264505, 40.581251836036216], [-73.99988781824608, 40.58126015048382], [-73.99976473870005, 40.58127415783461], [-73.99964299332305, 40.581293806953454], [-73.99952302656166, 40.58131902610889], [-73.99936820504236, 40.581352942365946], [-73.99918928335447, 40.58139024745273], [-73.99900970569459, 40.58142567324118], [-73.99891497675803, 40.58145143567648], [-73.99881798626606, 40.58147172512276], [-73.99871927734135, 40.58148642796408], [-73.99861940273051, 40.58149546186772], [-73.99851892170828, 40.58149877624593], [-73.9984183969461, 40.58149635253897], [-73.99831839136024, 40.58148820431907], [-73.9982194649592, 40.58147437721429], [-73.99812217170776, 40.58145494865329], [-73.99807180872422, 40.58141850756346], [-73.99802693464608, 40.58137811167257], [-73.99798808035105, 40.58133423888848], [-73.99795570549585, 40.5812874082524], [-73.99793019307933, 40.5812381737973], [-73.9979118449124, 40.581187117993416], [-73.99790087804635, 40.58113484485748], [-73.99789742220709, 40.581081972806], [-73.9979196930635, 40.5810072072905], [-73.99794615384133, 40.580933239811536], [-73.99797675572093, 40.580860206799585], [-73.99798815806982, 40.58082943193382], [-73.99799310469567, 40.58079767587739], [-73.99799147376537, 40.58076572082806], [-73.99798330546042, 40.58073435388409], [-73.99796880098621, 40.58070434765646], [-73.99794831761601, 40.58067644123903], [-73.99792055699606, 40.58064984875662], [-73.99788738519247, 40.580627144377196], [-73.99784972512147, 40.58060895978559], [-73.99780862456939, 40.58059580091587], [-73.99776522704225, 40.580588033875834], [-73.9921546480924, 40.579320625935416], [-73.9918291279026, 40.57924708092878], [-73.99174714246814, 40.579235614184704], [-73.9916642362242, 40.579229040197816], [-73.9915809106584, 40.579227398733515], [-73.99149224635235, 40.57923108680759], [-73.99140428678798, 40.57924035855055], [-73.99131763577279, 40.57925515031558], [-73.99123288813318, 40.579275360563095], [-73.99115062563098, 40.57930085055747], [-73.99107141296983, 40.57933144531963], [-73.99069770945255, 40.579373051599745], [-73.99036206466565, 40.579424580120424], [-73.98969501304418, 40.57921326907598], [-73.98957956138615, 40.57919294169361], [-73.98944797186188, 40.579055815691504], [-73.98899093556328, 40.57883509996882], [-73.9884283376944, 40.57881584261956], [-73.98814208290418, 40.57886596371379], [-73.98798324056253, 40.57894533574087], [-73.98760837934643, 40.57903313614564], [-73.98761631521326, 40.57906416865276], [-73.98785456901827, 40.5790036437428], [-73.98786647687928, 40.579026351107814], [-73.9875128581447, 40.57911569169754], [-73.9874515182491, 40.579131513198426], [-73.98744159488433, 40.579107291373404], [-73.98746186967524, 40.57910287834868], [-73.98759745387363, 40.57906643764763], [-73.98758653958217, 40.57904070176424], [-73.98748785269989, 40.57906401752726], [-73.98739064388411, 40.57908698306361], [-73.98738302206559, 40.5791375607141], [-73.98669539997061, 40.5798149081325], [-73.9867512931689, 40.57986429349332], [-73.98681225500573, 40.57991006023784], [-73.98687788391226, 40.57995190688341], [-73.98694774757386, 40.57998955776978], [-73.987021385777, 40.580022764875224], [-73.98678109583868, 40.58029393767769], [-73.98616526744581, 40.58095022879234], [-73.98588567394853, 40.581144424564776], [-73.98591295341917, 40.58122700200037], [-73.98592418776619, 40.58126743761216], [-73.98604509916208, 40.58172068515157], [-73.98684478996456, 40.58123210200515], [-73.98694506928851, 40.581136421805546], [-73.98703902188056, 40.581037078806155], [-73.98712641800256, 40.58093431595641], [-73.98720704395298, 40.58082838456841], [-73.98728070259058, 40.580719543701626], [-73.98734721381531, 40.580608059529524], [-73.98740641500886, 40.58049420468864], [-73.98745816143226, 40.58037825761143], [-73.98757400228179, 40.58003145122741], [-73.98774679739302, 40.57985965559591], [-73.98800973376738, 40.579670687155776], [-73.98811730541621, 40.57967968595251], [-73.98890353923805, 40.58000867868471], [-73.9891363620069, 40.580214877714866], [-73.98954195208073, 40.58041536536176], [-73.9896996939193, 40.580421107402984], [-73.98995504960881, 40.58066166976562], [-73.98971762499994, 40.5808382269999], [-73.98928724999996, 40.58195758299993], [-73.98888884999998, 40.58256733499994], [-73.98874850099989, 40.58282032299996], [-73.98852399299994, 40.58314353499986], [-73.98829948299982, 40.58346674699986], [-73.98730893199986, 40.58359445299993], [-73.98662350499995, 40.58367393699996], [-73.98654457099988, 40.583658590999946], [-73.98660338299986, 40.58376512099988], [-73.98679577199978, 40.58411362799992], [-73.98683590499999, 40.58418633099989], [-73.98687540199994, 40.58425158799985], [-73.98710120299997, 40.58464459199988], [-73.98701022999991, 40.58462626699987], [-73.98671582299981, 40.58456849999991]]]}}, {\&quot;id\&quot;: \&quot;55\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 56, \&quot;Shape_Leng\&quot;: 0.0568478126677, \&quot;Shape_Area\&quot;: 0.000180907844436, \&quot;zone\&quot;: \&quot;Corona\&quot;, \&quot;LocationID\&quot;: 56, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85360568399982, 40.74749682799991], [-73.853254932, 40.74682354999987], [-73.8529235349999, 40.74618194799996], [-73.85257733899984, 40.7455056469999], [-73.85224097499999, 40.74484096599985], [-73.85189537499991, 40.74417973899993], [-73.85155107299987, 40.74350722699996], [-73.85135102799988, 40.743119056999895], [-73.85120929199985, 40.74284402099991], [-73.85086917500001, 40.742180411999875], [-73.85051160899988, 40.741518856999946], [-73.85020444599994, 40.74090203399989], [-73.85011556599989, 40.74072356299995], [-73.84996425999991, 40.74070177199997], [-73.84984431299986, 40.740665549999896], [-73.84965207399982, 40.740614663999935], [-73.8493530509999, 40.74052324999996], [-73.84892344899993, 40.740391914999854], [-73.84795885999989, 40.74009701599994], [-73.84780164699998, 40.740049676999874], [-73.84794174099986, 40.73981640499991], [-73.84823627999982, 40.739290400999955], [-73.84777844199982, 40.7393448349999], [-73.84775740199994, 40.739299088999864], [-73.84767033700003, 40.7391952349999], [-73.8475557979999, 40.7390639149999], [-73.84750820299992, 40.73900780699995], [-73.84801295299997, 40.73876334399993], [-73.84859447999989, 40.73850117099989], [-73.84956453799992, 40.738106091999875], [-73.8499544029998, 40.737960303999884], [-73.85079216499992, 40.73768175599991], [-73.8508760629999, 40.73765385999991], [-73.85130352699998, 40.73751172799992], [-73.85187067499986, 40.73734292899995], [-73.85244443499992, 40.737202311999916], [-73.85340136499995, 40.73700275799991], [-73.85415418099988, 40.73687781299987], [-73.85505083399991, 40.736720220999885], [-73.85567427699986, 40.73658665799995], [-73.85628567699989, 40.73642604299987], [-73.8566154109999, 40.73633083699988], [-73.85801767699988, 40.73590708399994], [-73.85862016399997, 40.73573990699991], [-73.85872465799989, 40.73570864399988], [-73.85877141199997, 40.7357852899999], [-73.85886555799988, 40.73593913899987], [-73.85942834899984, 40.73578873199989], [-73.86106394499986, 40.73531449099991], [-73.862840003, 40.73479949499992], [-73.86462193299997, 40.73428275699993], [-73.86481505400003, 40.73466021599994], [-73.86515865399998, 40.73532501399992], [-73.86550061599992, 40.73598933199985], [-73.86582955999995, 40.73664322399992], [-73.86609463699996, 40.73725142999991], [-73.8664801159999, 40.73821096399996], [-73.86676012199987, 40.73889036999984], [-73.86703973799995, 40.73957218999992], [-73.867146698, 40.73983722399991], [-73.86731779499996, 40.740261344999915], [-73.86756253399983, 40.740941888999956], [-73.8675572959999, 40.74167769699988], [-73.86747169199991, 40.74209572299991], [-73.86749135099993, 40.74330204699993], [-73.86768504899995, 40.744071717999915], [-73.86782691099991, 40.74462945699988], [-73.86785097499994, 40.74471654499991], [-73.86787595099985, 40.74481530599989], [-73.86790963899986, 40.74493371599989], [-73.8660885059999, 40.745473952999944], [-73.86407236699985, 40.7460736519999], [-73.86253100999993, 40.74653380199991], [-73.86032027699984, 40.747195698999896], [-73.86027336099988, 40.74710172799993], [-73.85734765199993, 40.74797143499989], [-73.85442575299999, 40.748851725999884], [-73.85436928099995, 40.748738929999874], [-73.85405453299994, 40.748158316999906], [-73.85382450799997, 40.74785403999988], [-73.8537828699998, 40.74780299099994], [-73.85360568399982, 40.74749682799991]]]}}, {\&quot;id\&quot;: \&quot;56\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 57, \&quot;Shape_Leng\&quot;: 0.0192705048557, \&quot;Shape_Area\&quot;: 1.80259807917e-05, \&quot;zone\&quot;: \&quot;Corona\&quot;, \&quot;LocationID\&quot;: 56, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8513110499998, 40.74984337599988], [-73.85442575299999, 40.748851725999884], [-73.8544701179998, 40.748939347999936], [-73.85479286699997, 40.74956323099989], [-73.85513928899988, 40.75022639499993], [-73.85547890700003, 40.75089123399986], [-73.855834956, 40.7515772719999], [-73.85455552299993, 40.7519619189999], [-73.85497762399996, 40.75278221699993], [-73.85538540499991, 40.75357105999993], [-73.85579909099987, 40.75440952799994], [-73.85478630699988, 40.75470744899992], [-73.85383081399983, 40.75495833699992], [-73.85323754899999, 40.75509560099989], [-73.85312635499996, 40.75510934299989], [-73.85302119999993, 40.754618001999866], [-73.85300762299991, 40.75455456499989], [-73.8526172539999, 40.75340506499992], [-73.85246329699996, 40.75312740899989], [-73.85220450599998, 40.752660681999934], [-73.85185614699996, 40.75196793299992], [-73.85171508699987, 40.751687413999875], [-73.85151883499987, 40.751297136999916], [-73.85118150899994, 40.75062629599989], [-73.85098691399993, 40.75023929799988], [-73.85086439699992, 40.74999564199986], [-73.8513110499998, 40.74984337599988]]]}}, {\&quot;id\&quot;: \&quot;57\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 58, \&quot;Shape_Leng\&quot;: 0.0598554094851, \&quot;Shape_Area\&quot;: 0.000204980931361, \&quot;zone\&quot;: \&quot;Country Club\&quot;, \&quot;LocationID\&quot;: 58, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.81561382067721, 40.84818955758243], [-73.81568607715445, 40.84816530989142], [-73.81575017833134, 40.848189775457044], [-73.81579073434887, 40.84816422113697], [-73.8157983885727, 40.84815939778304], [-73.81586274203565, 40.84809250102881], [-73.81590281420543, 40.848013121984266], [-73.81589711649299, 40.84789897954558], [-73.81589732510677, 40.8478236051903], [-73.81586136315966, 40.847775581851245], [-73.81577576231183, 40.84773090610563], [-73.8156945975249, 40.847713645630954], [-73.81563145161934, 40.847706692829895], [-73.81560442844047, 40.84768951881167], [-73.81560451391982, 40.84765868316219], [-73.81564516681594, 40.84764161781635], [-73.81569476839677, 40.84765197550431], [-73.81575340325438, 40.84765892106598], [-73.81580298434562, 40.84767613107147], [-73.81587968574792, 40.8476762535213], [-73.81595734753985, 40.84765673360196], [-73.81597449927862, 40.84765242209665], [-73.8160558923281, 40.8475874556508], [-73.81609670609068, 40.847512146535394], [-73.81612862993478, 40.84738885611984], [-73.81614705574096, 40.84725184039079], [-73.81617026811975, 40.84701547486435], [-73.81616622859919, 40.84684416216906], [-73.81614872235644, 40.84664884528276], [-73.81613006048687, 40.84652798288451], [-73.81611797359875, 40.84648732650394], [-73.81610537477145, 40.8464545444374], [-73.81607246774338, 40.846423657352936], [-73.81602685114903, 40.846400458770034], [-73.81584432887755, 40.8463269331039], [-73.81577586619423, 40.84630562530891], [-73.81571903834562, 40.8462934434988], [-73.81568488630352, 40.84634080490548], [-73.81568770320885, 40.846341840348664], [-73.81545867615472, 40.84660302877153], [-73.81533644376374, 40.84669088909078], [-73.81503963145569, 40.84687195469736], [-73.8149346545324, 40.84693500918082], [-73.81486160038685, 40.84698411349446], [-73.8146272778874, 40.84714279476088], [-73.81462363819276, 40.84716768999988], [-73.81466741414532, 40.84720400648179], [-73.81464594697542, 40.84721961352901], [-73.81451106769597, 40.84710607802672], [-73.81453370023934, 40.84709089939391], [-73.81457540884595, 40.847124816995624], [-73.81460847368038, 40.847127137241564], [-73.8148473509641, 40.846963571625594], [-73.81496489547806, 40.84688983746205], [-73.81515846332752, 40.84677136764705], [-73.8153287782355, 40.84666566380006], [-73.81543413390234, 40.84659072608568], [-73.8155040927001, 40.84651260985806], [-73.81547456779656, 40.84649683598922], [-73.81555508085557, 40.84640893914352], [-73.81558313973727, 40.846423627606036], [-73.81568288414337, 40.846307825124846], [-73.8156910465945, 40.84631082662619], [-73.81570353189448, 40.84629134042384], [-73.81566171153669, 40.84628809801731], [-73.81561559185766, 40.846293276014435], [-73.81561094027825, 40.846293798289835], [-73.81557285082476, 40.84630144567658], [-73.81551442131553, 40.84632255239668], [-73.81516370934223, 40.84649929275548], [-73.81511795800365, 40.84652427263893], [-73.81507222380488, 40.846543471616144], [-73.81503922076097, 40.84654727225552], [-73.81499863613446, 40.84653949889562], [-73.81496569829835, 40.84652017377916], [-73.81492265739294, 40.84648348869217], [-73.81484683784961, 40.84652123412636], [-73.8147021413662, 40.846603315666634], [-73.81458976583284, 40.846669227806274], [-73.81456579118257, 40.846683016022794], [-73.81451301364092, 40.8467133689247], [-73.81447890592031, 40.84673298372796], [-73.81443423469617, 40.84675867437311], [-73.8144095316957, 40.84677288069775], [-73.81435726288593, 40.84680294067716], [-73.81433272712044, 40.846817050760656], [-73.8142787652347, 40.84684808397358], [-73.8142426258526, 40.8468688674331], [-73.81420111199441, 40.84689274108202], [-73.81416157394456, 40.84691547990903], [-73.81412394940415, 40.846937116818296], [-73.81409776493562, 40.846952176568365], [-73.81404710378914, 40.84698131125024], [-73.81402010393954, 40.846996837897606], [-73.8139672085705, 40.847027257368424], [-73.81392771742684, 40.847049968716775], [-73.81389036650836, 40.84707144784833], [-73.81386532718723, 40.84708584851121], [-73.81381218552613, 40.84711640856845], [-73.81378699193706, 40.8471308984231], [-73.81373354969317, 40.84716163134604], [-73.81370805578399, 40.84717629257799], [-73.81365740839362, 40.84720527717644], [-73.81365654726848, 40.847215705153666], [-73.81370542127051, 40.84726491500232], [-73.81368634738199, 40.84727432550905], [-73.81361194639693, 40.847202595716325], [-73.81356372861671, 40.847151411278524], [-73.81358305958231, 40.8471407102681], [-73.8136274532093, 40.84718958339062], [-73.8136447278293, 40.84719024319919], [-73.81369588380107, 40.8471605188045], [-73.81372091416893, 40.8471461873514], [-73.8137731809535, 40.84711626217957], [-73.81380002008125, 40.84710089498112], [-73.81385116806617, 40.847071610254524], [-73.8138789424857, 40.84705570830289], [-73.8139064166056, 40.84703997824203], [-73.81395483717435, 40.84701225458044], [-73.81400644417954, 40.846982707009985], [-73.81403390211042, 40.84696698560396], [-73.81408421730943, 40.84693817754444], [-73.8141126142839, 40.84692191921119], [-73.81412248680294, 40.846916266110604], [-73.81428325967708, 40.84682421385871], [-73.81431749077636, 40.84680461522695], [-73.81442363291605, 40.846743841837906], [-73.81443094799361, 40.84673965478643], [-73.81458182304954, 40.846653268772705], [-73.81484315852319, 40.846505089301154], [-73.814908582032, 40.846468764878985], [-73.81465695793413, 40.846205545301444], [-73.81446907674172, 40.846234151701964], [-73.81442352579822, 40.84618782507239], [-73.81465507970388, 40.84596849742507], [-73.81460449034037, 40.84590867307145], [-73.81468170770279, 40.84586721536335], [-73.81475299202867, 40.84581753085871], [-73.81480534287805, 40.84577794558428], [-73.81486296240931, 40.84574356282199], [-73.81508593855773, 40.84559500341856], [-73.8150262760428, 40.845499995058404], [-73.81420573129112, 40.84601018088845], [-73.81399042132385, 40.84582691919379], [-73.81390002991992, 40.84586580865546], [-73.81318865072497, 40.8462295364752], [-73.81314460200237, 40.84616856213872], [-73.8138188057647, 40.84580248822438], [-73.81400589013697, 40.84566869163601], [-73.81401812695707, 40.84563145688775], [-73.81397964395012, 40.845649113005585], [-73.8134832683883, 40.84596517094709], [-73.81346409683638, 40.84594950610961], [-73.81397419150323, 40.845635554708096], [-73.81402255974176, 40.8456179666301], [-73.81403198219364, 40.845589297867896], [-73.81395424463112, 40.845521567553575], [-73.81368589093518, 40.8456590622548], [-73.81367220100483, 40.84564653246912], [-73.81394279128922, 40.8455115891112], [-73.81390206940699, 40.84547610835489], [-73.813856677988, 40.84541756288903], [-73.81372892648774, 40.845485068172216], [-73.81371114891479, 40.84546210844934], [-73.8138425886934, 40.84539939043908], [-73.8138054459058, 40.84535148296823], [-73.81363258232699, 40.84528076903137], [-73.81361921535247, 40.845306143731605], [-73.81361456155729, 40.845315742706], [-73.8136099439493, 40.84532525948444], [-73.81360627346879, 40.84533285629322], [-73.8135984047367, 40.84534902639254], [-73.81351835900998, 40.84551779014537], [-73.8135169818933, 40.84552058590417], [-73.8134852598153, 40.84558498593946], [-73.81345513687894, 40.84564614160247], [-73.81345137381052, 40.84565378114233], [-73.81342525440728, 40.84571018508857], [-73.8134056557891, 40.84575250478186], [-73.8134017466251, 40.845760946691], [-73.8133590558502, 40.84584549933101], [-73.81335311605325, 40.84585424368401], [-73.81333092964161, 40.84588690276115], [-73.81331925050839, 40.845904095438364], [-73.81328932692855, 40.84595102273163], [-73.81321295244251, 40.84592293984184], [-73.81321888080062, 40.84591364264857], [-73.81328359296052, 40.84593743814766], [-73.81330787049271, 40.84589936323206], [-73.81331213394002, 40.845892188380766], [-73.81333800338913, 40.84584866229296], [-73.81334354640917, 40.84583933649325], [-73.81336084994268, 40.84581022336595], [-73.81336591663198, 40.84580169873154], [-73.81343964459093, 40.8456501583979], [-73.81346215335952, 40.845601698458296], [-73.8134714600873, 40.845581657372854], [-73.81348768163403, 40.845546732410114], [-73.81349880426079, 40.84552278743233], [-73.81350354028108, 40.84551259137301], [-73.81352545669, 40.84546545122117], [-73.81352888367317, 40.84545807950861], [-73.8135513216049, 40.84540981761643], [-73.81355519045734, 40.84540149809662], [-73.81357718780484, 40.84535418233245], [-73.81358150186045, 40.8453449056292], [-73.81358334364413, 40.8453454641151], [-73.81359057586107, 40.84533097660404], [-73.81359235780202, 40.84532738391684], [-73.81360307935834, 40.84530593757009], [-73.81360529679493, 40.84530146843104], [-73.81360874968259, 40.845294529304766], [-73.81361858267053, 40.845275042388515], [-73.81346166413532, 40.84521084953066], [-73.81325997724689, 40.84523399045822], [-73.8132385841432, 40.84529364896686], [-73.81323306389241, 40.84530870462134], [-73.81320532266803, 40.845376859208855], [-73.81318496869365, 40.845426867328605], [-73.8131813263456, 40.84543581742801], [-73.81315836336442, 40.84549223296162], [-73.81312894063261, 40.84556452164169], [-73.81310414849683, 40.84562543004051], [-73.81310021214391, 40.84563482259397], [-73.81307003010966, 40.84570682624162], [-73.81306571530193, 40.84571712180477], [-73.81305592038038, 40.845740487583925], [-73.81303214849963, 40.845797201479186], [-73.81297222057104, 40.84593197685412], [-73.81296525153213, 40.84594764931379], [-73.81296109021649, 40.84595700916516], [-73.81293267079396, 40.84601706732122], [-73.81292791787256, 40.846027110714765], [-73.8128995185849, 40.84608712617606], [-73.81289475100886, 40.846097199698704], [-73.81286634522233, 40.84615722988279], [-73.8128616248963, 40.846167206986784], [-73.81283471482801, 40.846224073218984], [-73.81282910435463, 40.84623593117618], [-73.81280034773182, 40.84629500504941], [-73.81285506329952, 40.84631005254602], [-73.81284939958525, 40.84631879949822], [-73.81272457676761, 40.84628661994713], [-73.81273118509972, 40.84627639345535], [-73.81278637726436, 40.84628888969871], [-73.81281302458174, 40.846232678405585], [-73.81291272697044, 40.84602236357809], [-73.81291695576553, 40.846013094970935], [-73.81294340748332, 40.84595513052506], [-73.81294861826635, 40.845943712166594], [-73.81298050490136, 40.845873834682926], [-73.81298556073538, 40.845862755977556], [-73.81301735339505, 40.84579308572515], [-73.81302130291374, 40.845784431976575], [-73.81304250986348, 40.84573352064155], [-73.81308968175215, 40.845620268975544], [-73.81311515692455, 40.84555911090309], [-73.8131199180934, 40.84554768024854], [-73.81314023855164, 40.845496754893226], [-73.81315189449639, 40.845467545869504], [-73.8131663297347, 40.84543136866384], [-73.81316934230622, 40.84542381787774], [-73.81319008790805, 40.84537182875385], [-73.81320083160338, 40.84534490411173], [-73.81321337703977, 40.84531346728017], [-73.81321733224652, 40.84530355425585], [-73.81321883271909, 40.84530004019003], [-73.81324326350918, 40.84523590835256], [-73.8132073362552, 40.84524002990253], [-73.81318603211815, 40.845218681683086], [-73.8131607253336, 40.84520002274004], [-73.81313199687555, 40.84518448142888], [-73.81310050626846, 40.84517241453328], [-73.81306697644588, 40.84516409907407], [-73.81303217715568, 40.84515972594982], [-73.8129969072876, 40.84515939555485], [-73.81293647420665, 40.84514842232433], [-73.8128770359758, 40.8451346679459], [-73.81286150958843, 40.845174987722444], [-73.81299499392401, 40.84521129724105], [-73.81314914269447, 40.845199582814956], [-73.81315597044244, 40.84521210037631], [-73.8129934380874, 40.84522477118414], [-73.81285536957633, 40.845186285461466], [-73.81283121824967, 40.84525297023396], [-73.81275096195384, 40.84546508915683], [-73.81269357395503, 40.845603247141305], [-73.81263653799114, 40.84574901292879], [-73.81260846487879, 40.84582075804066], [-73.81258924696179, 40.845869871979886], [-73.81258526774707, 40.845880039579306], [-73.81251579437537, 40.84606170959747], [-73.81248886322167, 40.84613512255843], [-73.812469820348, 40.84618703139432], [-73.81246665727525, 40.846195654572554], [-73.81244657871599, 40.8462515223213], [-73.81236589325664, 40.84647602663034], [-73.81234003852444, 40.84654452112497], [-73.81241445328128, 40.846559380748744], [-73.8124095770743, 40.846570544319746], [-73.81227790900483, 40.846543458279285], [-73.81228170265241, 40.84653122414932], [-73.81232960133006, 40.84654151183249], [-73.81239225664594, 40.846359429128874], [-73.81240162310021, 40.84633220748286], [-73.81240460541035, 40.846323542299295], [-73.8124274491956, 40.8462571530233], [-73.8124437463115, 40.846213126925214], [-73.81245152428279, 40.84619211782991], [-73.81245518041634, 40.846182240029286], [-73.81246537830961, 40.846154694230144], [-73.8124794586283, 40.846116656183504], [-73.81249769032014, 40.846067405637086], [-73.81250124152137, 40.84605780927202], [-73.8125193042311, 40.8460090167925], [-73.81252247454867, 40.84600032225913], [-73.81254490240872, 40.845938814598576], [-73.8125481027327, 40.845930037858956], [-73.81256795450659, 40.84587559467993], [-73.81257091004653, 40.845867489982936], [-73.8125890919327, 40.84581762502888], [-73.81259307324952, 40.845806709773306], [-73.8126158658126, 40.84574419972368], [-73.81262066867791, 40.84573288173383], [-73.81264753175402, 40.845669588414026], [-73.81265211763225, 40.8456587843688], [-73.81267740391031, 40.84559920533424], [-73.81268166510716, 40.84558916500479], [-73.81270305301986, 40.84553876949518], [-73.81270737483655, 40.84552858603019], [-73.81273003634698, 40.8454696920823], [-73.81273369555522, 40.84546018215934], [-73.81275913732, 40.84539405886649], [-73.8127626091814, 40.84538503596562], [-73.81278779244019, 40.84531958368211], [-73.81279160895893, 40.84530966826943], [-73.81281480700318, 40.845249377688724], [-73.81281873708731, 40.84523916158629], [-73.81284143551395, 40.84518017067741], [-73.81260675421473, 40.845129560282885], [-73.81261378787293, 40.845109507865814], [-73.81284896543414, 40.84516302844035], [-73.8128577433794, 40.845129544589135], [-73.81278677056558, 40.845107764018586], [-73.81271815525626, 40.84508199258821], [-73.81265228592719, 40.8450523762078], [-73.8126418704152, 40.845039728473985], [-73.81263431789743, 40.845025957807046], [-73.81262983160204, 40.84501143476023], [-73.8126285322481, 40.84499655013244], [-73.81254457815619, 40.84497959800826], [-73.8124400843122, 40.84523707432019], [-73.81254866464359, 40.845260690103196], [-73.81253844344073, 40.845283730151216], [-73.81245544053235, 40.84526432796373], [-73.81218860345625, 40.8459521030058], [-73.81217481496283, 40.84594604165193], [-73.81195504551972, 40.84647582483539], [-73.81196127339025, 40.846484425279904], [-73.81203383713486, 40.84650169799506], [-73.81202172362966, 40.84652942842734], [-73.81203501629656, 40.84653260540141], [-73.8120266503986, 40.8465509818762], [-73.81191568266975, 40.84652738919134], [-73.8118845884477, 40.84659496706121], [-73.81230236497042, 40.846689407061106], [-73.81243625060671, 40.84673771207555], [-73.81242358654634, 40.84675536693241], [-73.81230255202037, 40.84671279219771], [-73.81187766058915, 40.84661655663379], [-73.81184149221674, 40.84671412757344], [-73.81169971823665, 40.84668170081364], [-73.81223386948285, 40.845396783522574], [-73.81224107628775, 40.84537890034358], [-73.81231816792578, 40.84518730651574], [-73.81231936981116, 40.845184317833315], [-73.81232956124433, 40.845159027573864], [-73.81234277106647, 40.84512618337472], [-73.81243223218368, 40.84486828248771], [-73.81243398195343, 40.844863208183774], [-73.81244786509014, 40.84482326774509], [-73.81251553354934, 40.84462820008201], [-73.81251753679987, 40.84462241253633], [-73.81252704775312, 40.844594927089545], [-73.81260112783652, 40.844381397924316], [-73.81260320565703, 40.844375445822116], [-73.81262135209091, 40.84432313360275], [-73.8126482067927, 40.84424569285329], [-73.81266141349049, 40.84420764950083], [-73.81277306108588, 40.84422651790778], [-73.81278395303981, 40.84422834819608], [-73.81278360795028, 40.844229471889484], [-73.81278360787154, 40.84422949986578], [-73.81271381182702, 40.844461863794514], [-73.81271242301725, 40.84446653629642], [-73.81271596620674, 40.84446710962054], [-73.8127238416698, 40.844468412509286], [-73.81272387652409, 40.84446841256587], [-73.81272698328182, 40.8444689386095], [-73.81272816252338, 40.84446912379517], [-73.81277618716038, 40.84428468345949], [-73.8127769894225, 40.8442823511525], [-73.81277790078785, 40.84427958161732], [-73.81277841251041, 40.84427733176299], [-73.81277881686847, 40.84427513668232], [-73.81278096800884, 40.84425543198108], [-73.81282121937906, 40.84425961554686], [-73.81279995233872, 40.84435487689028], [-73.81276123529807, 40.844473304438125], [-73.81276862682175, 40.84447858573546], [-73.81277607099767, 40.84448005192654], [-73.81280551188065, 40.844485864208735], [-73.81280554651427, 40.84448586426493], [-73.81299120304948, 40.84452250755805], [-73.81298325218074, 40.84454982704335], [-73.81297181218781, 40.84454745193529], [-73.81275955824992, 40.84450334094461], [-73.81276135037977, 40.844496606708994], [-73.81276183239135, 40.84449480309046], [-73.81274408650032, 40.84449191263888], [-73.81271493393892, 40.844487198761406], [-73.81271240439833, 40.84448678288029], [-73.81270337280483, 40.844485312432425], [-73.81270267989628, 40.84448750871942], [-73.8126978656709, 40.84450289819947], [-73.8126488933667, 40.84465946766736], [-73.81289731370842, 40.84471323145966], [-73.81291074426947, 40.84468373602105], [-73.81290225785118, 40.8446814440978], [-73.8129117569329, 40.84465804769341], [-73.81296220789088, 40.84467253925254], [-73.8129721379385, 40.84465018537361], [-73.8131131815271, 40.844683954956196], [-73.8130928806672, 40.84473104823433], [-73.81304510205834, 40.84471754979041], [-73.8130361971365, 40.844743284463085], [-73.81307041826864, 40.84475069087712], [-73.8130647312539, 40.844772889142], [-73.81311795023566, 40.84478760356964], [-73.81309338317085, 40.84484827629709], [-73.81265744462624, 40.84475144920646], [-73.81268023984991, 40.844690116161225], [-73.81267984609725, 40.84469003159224], [-73.81264095809888, 40.844681662260335], [-73.81254909120709, 40.84495227514607], [-73.81263397114111, 40.844970866820425], [-73.81264025469774, 40.84495917724791], [-73.81264904026584, 40.84494845795869], [-73.81266007700297, 40.84493901500449], [-73.81267304979318, 40.84493111799548], [-73.81268758824365, 40.844924992402994], [-73.81270327725996, 40.84492081312166], [-73.8127196688978, 40.844918699475926], [-73.8128536716289, 40.8449199046705], [-73.8129874745271, 40.84492558937607], [-73.81312081806666, 40.84493574256625], [-73.81325344361194, 40.84495034454784], [-73.8133517176982, 40.844953369980544], [-73.81344958137997, 40.844960824851476], [-73.81354668877825, 40.84497268281276], [-73.8135476194773, 40.84504186920363], [-73.81359095648517, 40.84504822935521], [-73.81363296498053, 40.84505851711379], [-73.8136558066588, 40.8450591224657], [-73.81367848758785, 40.84505698086103], [-73.81370043852486, 40.845052146049476], [-73.81372110854787, 40.84504473937447], [-73.81373997888441, 40.84503494672788], [-73.81375657593014, 40.84502301388406], [-73.81377048313631, 40.84500924033168], [-73.81378135146424, 40.844993971756715], [-73.81378890814463, 40.84497759136734], [-73.81383957780267, 40.84496631314284], [-73.81389185092073, 40.84496065565071], [-73.81394377728165, 40.84494924196862], [-73.81399303795402, 40.844932335656196], [-73.81403863128376, 40.84491028048288], [-73.814079630191, 40.84488352491331], [-73.81411520102003, 40.844852612988504], [-73.81414462049185, 40.84481817326274], [-73.81416729040971, 40.844780906022834], [-73.81418274982286, 40.84474156904799], [-73.81411591388145, 40.84476412450858], [-73.8138620492567, 40.8448183815554], [-73.81386694883041, 40.84484233215543], [-73.81374940735262, 40.844867067648444], [-73.81373976204523, 40.8448413061524], [-73.81369979287803, 40.84484845686337], [-73.81369162177985, 40.84482910503367], [-73.81389591464291, 40.84478890255925], [-73.8138938118485, 40.84477314504453], [-73.81395108050033, 40.844760197864176], [-73.8139610494715, 40.84477705546289], [-73.81403795661886, 40.844760857781395], [-73.81418653212441, 40.8447254159458], [-73.81418334597303, 40.84468219953711], [-73.81417097564207, 40.84463994715471], [-73.81414974846557, 40.844599776790766], [-73.81412022612626, 40.84456275134531], [-73.8140831897909, 40.84452985050305], [-73.81403961944139, 40.8445019448113], [-73.81399066794314, 40.84447977264607], [-73.81393763054012, 40.844463920675146], [-73.81388191058579, 40.84445480833596], [-73.81383041777484, 40.84446023443392], [-73.81381176562526, 40.844461915921144], [-73.81372273148042, 40.844451988439126], [-73.81365179646245, 40.84443683825208], [-73.81358891945234, 40.844397618968216], [-73.81355528835343, 40.84437910481038], [-73.81353932708109, 40.84434009802115], [-73.81353615806098, 40.84433235060963], [-73.81349521226797, 40.84428217748505], [-73.81345592741259, 40.844242626879904], [-73.81343074980109, 40.844187440444145], [-73.81342078460055, 40.84412370037605], [-73.81341603573895, 40.84406308117255], [-73.81339678166465, 40.84400775336993], [-73.81337679294293, 40.8439574595646], [-73.81336555156658, 40.84390562317463], [-73.81336324694246, 40.84385311769116], [-73.81336991788451, 40.84380082787789], [-73.8133854519607, 40.84374963486259], [-73.81340958738964, 40.843700401288686], [-73.81344191745198, 40.84365395677988], [-73.81348189734598, 40.843611083960184], [-73.81354351238565, 40.84357829593178], [-73.813596874996, 40.843556684842824], [-73.81365345267933, 40.84354046171452], [-73.81371230684839, 40.84352989567722], [-73.8137724611528, 40.84352516201438], [-73.81383291767408, 40.843526339254254], [-73.81389267348071, 40.8435334078671], [-73.81395479579975, 40.84352943040399], [-73.81401565719491, 40.843519171144855], [-73.81407416129895, 40.84350281490183], [-73.81412925421093, 40.843480656319045], [-73.81417994348193, 40.843453094564694], [-73.8142253159947, 40.843420626139995], [-73.81426455441185, 40.84338383593459], [-73.81429695190002, 40.843343386690535], [-73.8143219248619, 40.84330000706269], [-73.81433902344891, 40.84325447849229], [-73.81434793966353, 40.84320762113033], [-73.81433904017473, 40.84319282466564], [-73.81433357893498, 40.84317709535262], [-73.81433171460951, 40.84316089018348], [-73.81433350136119, 40.84314467997544], [-73.81433888727611, 40.84312893569123], [-73.81434771587207, 40.84311411475723], [-73.81435973064592, 40.84310064777258], [-73.81437458252545, 40.8430889259994], [-73.81443311693067, 40.8430982852661], [-73.81447435420355, 40.84318544130673], [-73.8145302823009, 40.84325409145745], [-73.81458365727987, 40.843288897497416], [-73.81464226888777, 40.84331844841381], [-73.81470522534168, 40.843342294582804], [-73.81476748814121, 40.8433566433511], [-73.81482697475403, 40.843376663783964], [-73.81488279316403, 40.843402055671135], [-73.81493410635808, 40.84343243825602], [-73.81498014487664, 40.843467355945016], [-73.81502021835243, 40.843506285138574], [-73.81505372586119, 40.84354864208284], [-73.81508016493551, 40.84359379162279], [-73.8150935717148, 40.843606944986675], [-73.81511033055865, 40.843677638455965], [-73.81513413714164, 40.8437471559981], [-73.81516485293174, 40.8438150930236], [-73.81520229918517, 40.84388105414047], [-73.81524625798409, 40.84394465545534], [-73.81529647350618, 40.84400552680751], [-73.81535265351195, 40.84406331392409], [-73.81539614036446, 40.84410241829302], [-73.81544124858463, 40.844136302679125], [-73.81548639348827, 40.84416496237132], [-73.81553442761394, 40.84419077171556], [-73.8155538550995, 40.84420973962538], [-73.81557050239195, 40.84423017542359], [-73.81558475951772, 40.844252913713], [-73.81559557426921, 40.84427672133807], [-73.8155948819365, 40.84428990065019], [-73.81559649706655, 40.844303033292164], [-73.81560039113369, 40.84431588730953], [-73.8156064953604, 40.84432823566863], [-73.81561361207982, 40.844338512605155], [-73.81562226066892, 40.8443480879866], [-73.81563232274601, 40.844356830744815], [-73.81564400690353, 40.84436483141949], [-73.81565687237841, 40.84437170790415], [-73.81567073272595, 40.84437736054545], [-73.81569792948075, 40.8443864281129], [-73.81572663977093, 40.84439220931232], [-73.81575617959831, 40.84439456641176], [-73.81581729631598, 40.844404255607856], [-73.81587930562611, 40.84440977839467], [-73.81594171601608, 40.84441109099639], [-73.81595261849685, 40.84441232782473], [-73.81596363860406, 40.84441212134858], [-73.81597444750204, 40.844410477728914], [-73.81598472265817, 40.844407446010834], [-73.81599415746581, 40.84440311665946], [-73.81600247039512, 40.84439761886071], [-73.81600941339211, 40.84439111666641], [-73.81601477928108, 40.844383804099316], [-73.81601840794703, 40.84437589936285], [-73.81602019111288, 40.844367638330915], [-73.81602007557044, 40.844359267508544], [-73.81601806476836, 40.84435103667714], [-73.81600028898751, 40.84433276285884], [-73.81598630210995, 40.84431267964334], [-73.81597583544776, 40.84428954898817], [-73.81597039431108, 40.84426544231978], [-73.81597011983966, 40.844240984973766], [-73.81597501914739, 40.84421681138169], [-73.81598496513935, 40.84419354861375], [-73.81599969980863, 40.84417180011267], [-73.81601970133299, 40.8441345510654], [-73.81604649513972, 40.844099849652835], [-73.8160795332132, 40.84406840561157], [-73.81611813982926, 40.84404086205575], [-73.81616152537532, 40.84401778232297], [-73.81620880249945, 40.8439996384538], [-73.81625900426044, 40.84398680153721], [-73.81631110390217, 40.84397953412081], [-73.81634628559065, 40.84398173672404], [-73.81638078456292, 40.843987418855995], [-73.81641400672652, 40.84399648266722], [-73.81644537997586, 40.844008772073586], [-73.81646142591855, 40.844020929929], [-73.81647463438595, 40.84403491867298], [-73.81648464895692, 40.844050360831815], [-73.8164911993952, 40.84406683971259], [-73.8164941089401, 40.84408391064677], [-73.81649329907742, 40.8441011129896], [-73.81649226951575, 40.844104836284345], [-73.81649206747677, 40.84410863769033], [-73.81649269855802, 40.844112411885185], [-73.81649414527524, 40.844116054301104], [-73.81649636754568, 40.8441194640211], [-73.8164993037987, 40.84412254657506], [-73.81650287268272, 40.844125216557565], [-73.8165069753176, 40.84412739999382], [-73.81651115785635, 40.844128937003745], [-73.81651560208203, 40.84412996680365], [-73.81652020207204, 40.8441304648495], [-73.81652484819097, 40.84413041927109], [-73.8165294297045, 40.84412983115472], [-73.8165338374184, 40.84412871451719], [-73.81653796627933, 40.84412709597242], [-73.81654171788186, 40.84412501409629], [-73.81654803579622, 40.84411713039859], [-73.81655579562262, 40.84411002784444], [-73.81656489614979, 40.84410381933773], [-73.81657509495035, 40.84409868886183], [-73.81658617249596, 40.84409474684975], [-73.8165978903427, 40.84409207815315], [-73.81660999626493, 40.84409074021557], [-73.8166311886855, 40.84410697792727], [-73.81665561354282, 40.8441203430208], [-73.8166826036293, 40.84413047040477], [-73.81671142166353, 40.84413708343122], [-73.81674128042832, 40.84414000145353], [-73.81677136427729, 40.84413914476039], [-73.81680085141552, 40.8441345367542], [-73.8168289363478, 40.84412630331068], [-73.81684719792797, 40.84411229365962], [-73.81686826993233, 40.8441007819621], [-73.81689156699254, 40.84409208800587], [-73.81691644193094, 40.84408645330339], [-73.8169422037372, 40.84408403438295], [-73.81696813676572, 40.84408489844079], [-73.8169935206138, 40.844089021473685], [-73.81701765013457, 40.844096288946766], [-73.81703985502557, 40.84410649897402], [-73.81705951844759, 40.84411936792766], [-73.81707609416169, 40.84413453831601], [-73.81708912170255, 40.84415158871505], [-73.81709823916935, 40.84417004547454], [-73.81709507751613, 40.844187660670585], [-73.81708835296621, 40.8442046895192], [-73.81707822858992, 40.84422071906344], [-73.81707489073452, 40.844225516511436], [-73.81707264035197, 40.844230666283316], [-73.81707153906245, 40.84423602736941], [-73.81707161702109, 40.84424145297411], [-73.81707287209358, 40.8442467945344], [-73.81707526991408, 40.84425190578928], [-73.81707874482646, 40.84425664678347], [-73.81708320168126, 40.84426088770004], [-73.8170885184427, 40.84426451241531], [-73.81709454952792, 40.84426742167806], [-73.81710112979529, 40.84426953582733], [-73.81710807906538, 40.8442707969741], [-73.81711520705454, 40.84427117058587], [-73.81715021150436, 40.84427945628585], [-73.81718636615088, 40.84428408789739], [-73.81722301274397, 40.84428498109465], [-73.81731841759297, 40.84430674088586], [-73.81741119253728, 40.84433428898618], [-73.81750072974424, 40.844367444910375], [-73.81783277820627, 40.844370746825334], [-73.81823722746202, 40.844355041712625], [-73.81824065893247, 40.84434212790991], [-73.81824124459443, 40.84432896131916], [-73.81823896847384, 40.84431590110469], [-73.81823389266117, 40.84430330352895], [-73.81822615561835, 40.84429151223401], [-73.81821596840095, 40.8442808488678], [-73.81820566350187, 40.84427409514651], [-73.81819696203605, 40.84426614606328], [-73.8181901011048, 40.84425721821861], [-73.81818526765763, 40.84424755488286], [-73.81818259339703, 40.844237419367], [-73.81818215119185, 40.844227087847976], [-73.81818395309016, 40.844216841843895], [-73.81818794999268, 40.84420696054203], [-73.81819403298859, 40.84419771319239], [-73.81819985147386, 40.84417669362955], [-73.81820127234383, 40.84415524178031], [-73.81819826067787, 40.844133884922904], [-73.818190890506, 40.844113147999956], [-73.81816887844329, 40.844111065173344], [-73.81814670636902, 40.84411157594584], [-73.81812490102688, 40.844114668182925], [-73.81810398044887, 40.84412026842222], [-73.81808444164687, 40.84412824361817], [-73.81806674880681, 40.84413840430326], [-73.81805132226046, 40.84415050908909], [-73.81801695603708, 40.84418849707869], [-73.81797529226338, 40.84422200999295], [-73.81792732610218, 40.84425024734845], [-73.81786296480249, 40.84426306619356], [-73.81780564298111, 40.84426942426333], [-73.81774776234208, 40.84427124056503], [-73.8176899451903, 40.84426849557082], [-73.81763281314862, 40.84426121879356], [-73.81759643820345, 40.84425411569277], [-73.8175607738279, 40.84424517284428], [-73.81751331632168, 40.84422661675826], [-73.81746907981335, 40.84420393077191], [-73.81742868454596, 40.84417743296862], [-73.8173926969017, 40.844147494877205], [-73.81736232764281, 40.844115384571715], [-73.81733703579171, 40.84408082946184], [-73.81731715864584, 40.84404429039278], [-73.81728029492882, 40.84399785628158], [-73.81723673532649, 40.843954896219806], [-73.81718704179603, 40.84391596441751], [-73.81716878406534, 40.8439113982863], [-73.81714976960329, 40.84390925737281], [-73.81713055270801, 40.84390960408763], [-73.81711169357992, 40.84391242832392], [-73.81669068165955, 40.84397496582519], [-73.81667877696744, 40.84397102198651], [-73.81665600190942, 40.84396347568799], [-73.81662677325096, 40.843944898560224], [-73.81660732931886, 40.84391707357562], [-73.81661234792885, 40.84386705152037], [-73.81661236142156, 40.84386215716094], [-73.81661244498649, 40.84383184466543], [-73.81657668436155, 40.84381076823534], [-73.81655885162657, 40.84380025890586], [-73.81651503368255, 40.843763129555185], [-73.81648830094262, 40.84372417472246], [-73.8164445195421, 40.84367407385203], [-73.816437307343, 40.84363515057113], [-73.81642277916197, 40.84359436132307], [-73.81639116165071, 40.84355725134012], [-73.81636686950459, 40.8435183008651], [-73.81635809445422, 40.843495916409964], [-73.81635233182159, 40.843481218060724], [-73.81635489948353, 40.84343489740633], [-73.81636235714114, 40.84338487806814], [-73.8163503053, 40.843331122875284], [-73.81630900985746, 40.843264350232594], [-73.81627260471049, 40.843193878224916], [-73.81623130431188, 40.84312895869531], [-73.8162021785278, 40.84307332313071], [-73.81615112347605, 40.84300653420623], [-73.81610484559108, 40.84297681371047], [-73.81602683823573, 40.842950746214136], [-73.81596837571968, 40.84291544711158], [-73.8159387775396, 40.84289193312023], [-73.81590994535827, 40.84286902912583], [-73.81587589832016, 40.84282820931973], [-73.81586704543801, 40.84278860976364], [-73.81572300131998, 40.8425365659869], [-73.81517113664873, 40.842577161623836], [-73.81516936817916, 40.84255492332517], [-73.81570207846407, 40.84251972168959], [-73.8156179809096, 40.84245835926559], [-73.81550698344904, 40.84242060831805], [-73.81544243533584, 40.84241082719334], [-73.81541503896409, 40.8423913277834], [-73.81540599274848, 40.84235379026757], [-73.81540790011593, 40.84232599873667], [-73.81543361658642, 40.84229129674323], [-73.81546847090182, 40.842260778031296], [-73.81546968074404, 40.84225954263417], [-73.8155051742541, 40.84222331387149], [-73.81552354975133, 40.84219554851018], [-73.81554743972904, 40.842159453120026], [-73.81556406036422, 40.842105280978515], [-73.81556419521851, 40.84205664041994], [-73.81555879401647, 40.84202466853028], [-73.81557540624677, 40.84197327392124], [-73.81559206830936, 40.84190381376299], [-73.81558492163327, 40.84184126460356], [-73.81556869858584, 40.8417522956215], [-73.81552506814646, 40.841647995900175], [-73.81547217396636, 40.84158537238329], [-73.81542649444837, 40.84156028460357], [-73.81537535736693, 40.84152406966567], [-73.81532969699884, 40.841492032142156], [-73.81530238614381, 40.84144195885927], [-73.8152915382384, 40.84139469015294], [-73.81528985873143, 40.841340487564345], [-73.81528083654403, 40.84129461172706], [-73.81526263397656, 40.841259839422975], [-73.81523211232641, 40.84123377337664], [-73.8147974828056, 40.84138417014289], [-73.81480293388553, 40.84139807535181], [-73.81476263162953, 40.8414132987143], [-73.81473345817534, 40.8413757283108], [-73.81522026179319, 40.84120267649966], [-73.81521713938885, 40.84116804427172], [-73.81522089631062, 40.84113330713769], [-73.81523378640593, 40.84110414274757], [-73.81524671254658, 40.84106247173637], [-73.81523404887245, 40.841009641496534], [-73.81522135566156, 40.840967928942966], [-73.81520503680377, 40.840913702896174], [-73.8151831980253, 40.84087058573759], [-73.81514858030347, 40.84081633153237], [-73.81512854729566, 40.8407815562704], [-73.81510852634034, 40.84074261067954], [-73.81509998662794, 40.84072432982889], [-73.81509033516018, 40.8407036696935], [-73.81507398877265, 40.840659170867454], [-73.81506678156754, 40.84061885703699], [-73.8150663842936, 40.84059068688925], [-73.81505399109437, 40.840538085896554], [-73.81497890551917, 40.840551141246124], [-73.81498025770709, 40.84055843942445], [-73.8149157299578, 40.84056667373986], [-73.81491163259714, 40.840559371155685], [-73.81490477086118, 40.84055936014459], [-73.81490069938222, 40.840542676755], [-73.8149089431792, 40.84053956264442], [-73.81490758787837, 40.84053330696266], [-73.8149707522553, 40.840521943627536], [-73.81497347937898, 40.840528201509166], [-73.815049126282, 40.840517619551235], [-73.81500569765576, 40.84029373486581], [-73.81497336213258, 40.84007688469778], [-73.81480646696015, 40.839804367389014], [-73.81436596502486, 40.83986536376494], [-73.81436188587786, 40.83985180818457], [-73.81479697880752, 40.83978795740684], [-73.81478892933622, 40.83977327891799], [-73.81477935155439, 40.83976284018757], [-73.81476701970095, 40.83975552437362], [-73.81475878782422, 40.83975446932075], [-73.81474506385649, 40.83975444727889], [-73.81473269673526, 40.8397596390901], [-73.8147203367438, 40.839762745403654], [-73.81470935814201, 40.83976272776754], [-73.81469838960713, 40.839758541476456], [-73.81469567415563, 40.83974811376349], [-73.81469983843603, 40.83973144359535], [-73.81470537675676, 40.839713733132], [-73.81471914179329, 40.83969916439648], [-73.81473018446566, 40.839676251098346], [-73.8147302657413, 40.83964706668479], [-73.81472761705194, 40.83961266621052], [-73.81472319684482, 40.83958888660002], [-73.81447505522941, 40.83962580976234], [-73.81447095193839, 40.83962059265944], [-73.81438444888595, 40.839635044333015], [-73.81438717009922, 40.83964338772789], [-73.81431578800081, 40.83964952650949], [-73.81430900133682, 40.839622416379285], [-73.81438450995489, 40.839613156567296], [-73.81438722825912, 40.839622542292545], [-73.81447097519408, 40.839612253681175], [-73.81446962061506, 40.83960599799443], [-73.81471999083577, 40.83957187959457], [-73.81469650157487, 40.8394510589777], [-73.81478277740266, 40.83907648795766], [-73.81538843489142, 40.8388523153941], [-73.81540002409541, 40.83881569859166], [-73.81542613964203, 40.83878279776938], [-73.8154521927371, 40.83877295737675], [-73.8154769186815, 40.838776128130306], [-73.8154782077358, 40.838776292690945], [-73.8154868552591, 40.83878618910912], [-73.81552154585935, 40.838789538794444], [-73.81554757935396, 40.838786286235745], [-73.81559976613778, 40.83873695709624], [-73.81566927530216, 40.83869753887238], [-73.81573871986129, 40.838681177688514], [-73.81579944386067, 40.838681274682536], [-73.81584721151336, 40.83866158629328], [-73.8158863476013, 40.838625412462164], [-73.81596456850167, 40.83857283051692], [-73.81606022905474, 40.838487333713715], [-73.81612981830266, 40.83841826741801], [-73.81619078912547, 40.83832942150598], [-73.81626470640903, 40.838263655717135], [-73.81629965234724, 40.838174768285], [-73.81633894250302, 40.83808259306099], [-73.81634147251413, 40.83803170124037], [-73.81630880926807, 40.838000190365356], [-73.81628721293391, 40.83796721452012], [-73.81628730390062, 40.837934272546605], [-73.81630907303996, 40.8379046587926], [-73.81632225026149, 40.837894692322834], [-73.81635253674234, 40.83787178705994], [-73.81640906870993, 40.83781916909941], [-73.81645257929428, 40.83776982592475], [-73.81647878477862, 40.8377039838885], [-73.8164789029114, 40.837661159370924], [-73.81644869632308, 40.83760511031885], [-73.81644033122897, 40.8374930950356], [-73.81642765539806, 40.83737118912981], [-73.81642365412327, 40.837249298199865], [-73.81641525209483, 40.83715045912872], [-73.81639818381184, 40.83704831256697], [-73.81638980002965, 40.83694288512829], [-73.81636407644693, 40.83683413638706], [-73.8163425982448, 40.83675833484838], [-73.8162993988223, 40.83669567616344], [-73.81623447512567, 40.83664616063875], [-73.81619549444879, 40.83662633267886], [-73.81616090485221, 40.836586747032165], [-73.81616966141667, 40.83655711423162], [-73.81620014053696, 40.8365143380932], [-73.81620466896722, 40.83644516702766], [-73.81618326520262, 40.83634301401463], [-73.81614023718535, 40.836217765478104], [-73.81609280117425, 40.83611886413313], [-73.81606068217324, 40.83603019622843], [-73.81720434599991, 40.83574058099987], [-73.8180458349999, 40.8355423629999], [-73.81890004099992, 40.83534343599992], [-73.81977578099998, 40.835132839999915], [-73.82062699699992, 40.83492251499993], [-73.82150930799996, 40.83473357299988], [-73.82223130099996, 40.8345560129999], [-73.822580515, 40.83447870199988], [-73.82265928699988, 40.834469871999886], [-73.82309210499989, 40.834421378999934], [-73.82319485499993, 40.83440178799987], [-73.8232749899999, 40.8343881879999], [-73.82368336699984, 40.83431888899992], [-73.82379383199985, 40.8343001469999], [-73.82463346500003, 40.833855807999925], [-73.82489104199995, 40.83422775199989], [-73.82515883900005, 40.83461447199994], [-73.82601252600003, 40.83402077799985], [-73.82612415599984, 40.834214164999864], [-73.82622087800003, 40.834354707999864], [-73.82604118599988, 40.83450929499991], [-73.8258777559998, 40.83467404699993], [-73.82573143499985, 40.8348481889999], [-73.82560350399983, 40.83503014699991], [-73.8254949649998, 40.83521822399992], [-73.82544607399977, 40.83536112899984], [-73.82541568999991, 40.83550885499988], [-73.82540482599977, 40.83565927499994], [-73.82541397499979, 40.835810148999876], [-73.82544296399993, 40.83595917099997], [-73.82549108799998, 40.83610415299995], [-73.82555705999988, 40.836243043999914], [-73.82565389199993, 40.836442047999874], [-73.82573525099993, 40.83664539499994], [-73.82580066799997, 40.83685202199996], [-73.8258498599999, 40.83706086699989], [-73.8258866379999, 40.8381214889999], [-73.82590798500001, 40.83874481799989], [-73.82596226799994, 40.83997641699986], [-73.82596550399984, 40.840326137999924], [-73.825986869, 40.84067575199988], [-73.82602634299997, 40.84102446399987], [-73.82608382099987, 40.841371456999894], [-73.82624132999996, 40.84299359399991], [-73.82580705599993, 40.84288069299988], [-73.82567803799994, 40.8428471519999], [-73.82558155599993, 40.842818658999946], [-73.82517999, 40.842700058999874], [-73.82513836199985, 40.843343597999905], [-73.82507950099988, 40.84430400299992], [-73.82508489299991, 40.8446976979999], [-73.82495697699986, 40.846105444999864], [-73.82443760499989, 40.84637787399988], [-73.82395955500006, 40.84664124199988], [-73.82301297099994, 40.847161737999905], [-73.82203826799994, 40.84769036899989], [-73.82110355699993, 40.84819897999991], [-73.82048405599983, 40.84850102599995], [-73.82014043700003, 40.848020598999895], [-73.81915009199983, 40.84817017999989], [-73.81820226899997, 40.848311031999884], [-73.81726322699988, 40.848426566999954], [-73.816301192, 40.84857217199994], [-73.81507165904237, 40.84913361979451], [-73.81517828216496, 40.84905376734075], [-73.81522652669221, 40.84901120779714], [-73.81529101730445, 40.8488955840948], [-73.81530585173346, 40.84881790341616], [-73.81530729613678, 40.84881033800619], [-73.81526739378965, 40.84873718412659], [-73.8152675460326, 40.84868236537186], [-73.81527578737355, 40.84860319691036], [-73.81541233179878, 40.84853641599008], [-73.81548477457869, 40.84844516872847], [-73.81550118820577, 40.84831119549049], [-73.81561382067721, 40.84818955758243]]]}}, {\&quot;id\&quot;: \&quot;58\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 59, \&quot;Shape_Leng\&quot;: 0.0377948070893, \&quot;Shape_Area\&quot;: 6.28765230648e-05, \&quot;zone\&quot;: \&quot;Crotona Park\&quot;, \&quot;LocationID\&quot;: 59, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88941724899998, 40.839422732999836], [-73.88869040799987, 40.83915802599988], [-73.88813752199994, 40.83986200199991], [-73.88754251799996, 40.839640657999944], [-73.88659802299989, 40.839279049999895], [-73.88730373200002, 40.83812719099994], [-73.88841187199996, 40.838553390999905], [-73.88874067899994, 40.8379684589999], [-73.89057363299985, 40.836901047999916], [-73.8907397549999, 40.83682930899993], [-73.89091660699987, 40.83677103399994], [-73.89110124799988, 40.83672748199993], [-73.89129045299998, 40.83669941999994], [-73.8914808639999, 40.83668706399992], [-73.89337676299994, 40.836540007999886], [-73.89361903299995, 40.8364761079999], [-73.89385624299995, 40.8363951019999], [-73.89408527499982, 40.8362973469999], [-73.89430313999998, 40.83618364399991], [-73.89450698899992, 40.83605519399989], [-73.89469434299991, 40.83591357399992], [-73.89486311099988, 40.83576065299992], [-73.89501173599986, 40.835598554999876], [-73.89513914999998, 40.83542950399993], [-73.89526368299991, 40.835315097999946], [-73.89539409500006, 40.83520453499989], [-73.89553017999992, 40.83509798999991], [-73.89567172399995, 40.83499562899987], [-73.89581850399996, 40.83489761499993], [-73.89597028899992, 40.834804100999925], [-73.89612683899982, 40.834715234999926], [-73.89628790799986, 40.8346311569999], [-73.89645324200002, 40.834551998999835], [-73.89662258200005, 40.83447788599992], [-73.89679566, 40.83440893499992], [-73.89697220299995, 40.8343452539999], [-73.89809341399994, 40.834628802999916], [-73.89845304899994, 40.834720240999935], [-73.89963414999981, 40.835016222999904], [-73.9012157839999, 40.8354101409999], [-73.90122534999992, 40.83549991099991], [-73.90056610899994, 40.83659250799993], [-73.9003894469999, 40.83690622999995], [-73.90035730100003, 40.83696331799991], [-73.90030702699993, 40.837052593999914], [-73.9002588729999, 40.83713810599989], [-73.90022284799984, 40.83720207899991], [-73.90019045299977, 40.837259606999964], [-73.90014268099999, 40.83734444099984], [-73.90004236899996, 40.83752257599983], [-73.89996792899998, 40.8376547629999], [-73.89903034699984, 40.839330476999876], [-73.89826966299981, 40.84067994699995], [-73.89749111599987, 40.84206708899992], [-73.89666161699988, 40.84352460699992], [-73.89642177099996, 40.84338795899991], [-73.8961725309998, 40.8432605479999], [-73.89591487099987, 40.843142918999895], [-73.89564979700005, 40.843035539999896], [-73.89537836199995, 40.842938778999965], [-73.89527784899985, 40.84287986099988], [-73.89509807299986, 40.84277448099986], [-73.89501415799995, 40.84272529099996], [-73.89493579999981, 40.84267935899995], [-73.89484862799985, 40.84262825999993], [-73.89410150499992, 40.84219030299994], [-73.89317098900001, 40.841637343999906], [-73.89216815599981, 40.84104963999991], [-73.89017468599991, 40.83987366699987], [-73.88941724899998, 40.839422732999836]]]}}, {\&quot;id\&quot;: \&quot;59\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 60, \&quot;Shape_Leng\&quot;: 0.0786482878226, \&quot;Shape_Area\&quot;: 0.000161833284912, \&quot;zone\&quot;: \&quot;Crotona Park East\&quot;, \&quot;LocationID\&quot;: 60, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.87823856799989, 40.839985917999854], [-73.87791380399995, 40.8399703279999], [-73.87747229399999, 40.839983546999925], [-73.87561285199983, 40.839902520999885], [-73.87359713599987, 40.83979855499992], [-73.87283453899995, 40.839754862999925], [-73.87277204699981, 40.83975128199995], [-73.87298042899992, 40.83895248499995], [-73.87312728200003, 40.83833509599989], [-73.87314714699997, 40.838263898999905], [-73.87322928299983, 40.83815590199992], [-73.87347510499988, 40.837746339999896], [-73.87353901799992, 40.83766841799995], [-73.87367306200004, 40.837541539999926], [-73.87379590199993, 40.837445132999896], [-73.87401051299989, 40.837310004999914], [-73.87407495699992, 40.83728961699988], [-73.87419768599986, 40.837250794999896], [-73.87430028599992, 40.8372424419999], [-73.87437386800003, 40.837242521999904], [-73.87454332199997, 40.83726133799991], [-73.87471801499991, 40.83731259599988], [-73.874908511, 40.83735960999999], [-73.87472739999993, 40.83723397399996], [-73.87470145099985, 40.83716231099987], [-73.87469588499998, 40.83708331399992], [-73.8747145209998, 40.83700225399988], [-73.87475779999978, 40.83692560499988], [-73.87482228199987, 40.836859479999866], [-73.87490147299994, 40.83680809399989], [-73.87498772399994, 40.836772977999864], [-73.87525928600002, 40.83670942699994], [-73.87545635000001, 40.836691981999934], [-73.87565111799996, 40.83665954899988], [-73.87584064899983, 40.836612485999915], [-73.87609408699988, 40.83652621199991], [-73.87615142899986, 40.83649857399996], [-73.87628029499993, 40.83646153199987], [-73.8764548759999, 40.83638732799986], [-73.87655099199999, 40.83634482899989], [-73.87673323499986, 40.836205617999944], [-73.87698921499998, 40.83610249599995], [-73.87728333599982, 40.83596804299988], [-73.87734872299994, 40.83593341499993], [-73.87746425099982, 40.835872232999876], [-73.87747843299982, 40.83586472899987], [-73.87756524599996, 40.8358187519999], [-73.87783304799999, 40.835655621999926], [-73.8779460599999, 40.83557678399992], [-73.87801301899998, 40.835530071999905], [-73.87808502000001, 40.83547984299993], [-73.87838370399996, 40.83525903199987], [-73.87866481499992, 40.83502565899989], [-73.87892705599994, 40.83478096399987], [-73.87906181199985, 40.83463927099988], [-73.87916928999984, 40.83452626099988], [-73.87925239499992, 40.83442478999991], [-73.87940077099982, 40.83447236499995], [-73.88005188499987, 40.83470205899989], [-73.88007189299988, 40.834671876999934], [-73.88057338999994, 40.83403109299997], [-73.88251168699992, 40.83155430699988], [-73.88384720899988, 40.829872518999906], [-73.88390094800003, 40.82980281599986], [-73.88357411800004, 40.829478645999934], [-73.8835201879999, 40.82926018099994], [-73.88378414099992, 40.828274291999946], [-73.88438705399992, 40.826817283999965], [-73.88460938899989, 40.82530353599988], [-73.88461335999997, 40.825276502999905], [-73.8846216589999, 40.824956205999904], [-73.88465102199984, 40.823822897999925], [-73.8843985489999, 40.822965575999866], [-73.88456358400003, 40.82293706699989], [-73.88508162399985, 40.822868444999834], [-73.88658010099988, 40.822668116999864], [-73.88698003699992, 40.82261725799987], [-73.88709505499989, 40.82260272499986], [-73.88719405099982, 40.82259352899993], [-73.88753429599987, 40.82250933899995], [-73.88706248999988, 40.823190274999945], [-73.88710697199997, 40.823305870999874], [-73.88647552899988, 40.825285423999915], [-73.88635032500002, 40.826012622999926], [-73.88615037899993, 40.82730567799994], [-73.88609624199987, 40.82765577699989], [-73.88601262699991, 40.828238530999926], [-73.88755325099989, 40.82929634299989], [-73.88761307899992, 40.8293374189999], [-73.88805361099989, 40.82950305199991], [-73.88898205299992, 40.829814800999905], [-73.8899110649999, 40.830124191999865], [-73.89087299799995, 40.83013600299989], [-73.89187594399993, 40.830137505999936], [-73.8928855849999, 40.8301475709999], [-73.893360418, 40.83015253099996], [-73.894692052, 40.83061909399988], [-73.89485843399979, 40.830601857999895], [-73.89560633499985, 40.830524382999876], [-73.89669632499995, 40.8304145039999], [-73.89717220999982, 40.830368832999966], [-73.89690017899987, 40.8310333359999], [-73.89669216099999, 40.83196614399987], [-73.89647296199996, 40.83304756799986], [-73.89630199999992, 40.833543217999896], [-73.89678082699999, 40.834126789999914], [-73.89697220299995, 40.8343452539999], [-73.89679566, 40.83440893499992], [-73.89662258200005, 40.83447788599992], [-73.89645324200002, 40.834551998999835], [-73.89628790799986, 40.8346311569999], [-73.89612683899982, 40.834715234999926], [-73.89597028899992, 40.834804100999925], [-73.89581850399996, 40.83489761499993], [-73.89567172399995, 40.83499562899987], [-73.89553017999992, 40.83509798999991], [-73.89539409500006, 40.83520453499989], [-73.89526368299991, 40.835315097999946], [-73.89513914999998, 40.83542950399993], [-73.89501173599986, 40.835598554999876], [-73.89486311099988, 40.83576065299992], [-73.89469434299991, 40.83591357399992], [-73.89450698899992, 40.83605519399989], [-73.89430313999998, 40.83618364399991], [-73.89408527499982, 40.8362973469999], [-73.89385624299995, 40.8363951019999], [-73.89361903299995, 40.8364761079999], [-73.89337676299994, 40.836540007999886], [-73.8914808639999, 40.83668706399992], [-73.89129045299998, 40.83669941999994], [-73.89110124799988, 40.83672748199993], [-73.89091660700001, 40.83677103499991], [-73.8907397549999, 40.83682930899993], [-73.89057363299985, 40.836901047999916], [-73.88874067899994, 40.8379684589999], [-73.88841187199996, 40.838553390999905], [-73.88730373200002, 40.83812719099994], [-73.88659802299989, 40.839279049999895], [-73.88618432099992, 40.840105043999884], [-73.88583496499986, 40.83989692699992], [-73.88469619299984, 40.83920338699989], [-73.88464898099988, 40.83917463299988], [-73.88435324499997, 40.83927764999993], [-73.88418143199976, 40.839335306999914], [-73.88412724499999, 40.83935591899995], [-73.88403342700002, 40.83930464099993], [-73.88351820399988, 40.8390223659999], [-73.8831387399999, 40.838810671999944], [-73.88274769899994, 40.8385923409999], [-73.88279558600006, 40.83854994599993], [-73.88285365099989, 40.83849533499994], [-73.88246404800005, 40.83824724099992], [-73.88235442499995, 40.83814382399988], [-73.88225831200006, 40.83803121799985], [-73.88217759099985, 40.837911036999905], [-73.88211370499987, 40.83778515499997], [-73.88206752699985, 40.837655624999876], [-73.88203937499988, 40.8375245929999], [-73.88200384100001, 40.837443781999895], [-73.88191969599985, 40.837616932999914], [-73.88182513299996, 40.837787064999915], [-73.88172047499994, 40.83795364899991], [-73.88169674899986, 40.83798711299989], [-73.88166303799993, 40.838028618999914], [-73.88160324799993, 40.83809985899994], [-73.88154924699987, 40.838182756999885], [-73.88138310599982, 40.83837771399988], [-73.88135107299988, 40.83840917199989], [-73.88113550299995, 40.838622141999906], [-73.880965322, 40.838748079999895], [-73.88080919100001, 40.83888681999984], [-73.88080895400005, 40.838887035999875], [-73.88080875199994, 40.83888725199996], [-73.88066897399986, 40.83903757099989], [-73.88066892699996, 40.839037624999904], [-73.88066887899986, 40.83903768799993], [-73.88054735399987, 40.839198110999895], [-73.88044599500002, 40.839366353999885], [-73.88044592400004, 40.839366479999924], [-73.88044586500001, 40.83936659699989], [-73.88036587299996, 40.83954043499988], [-73.88036583800002, 40.83954050699991], [-73.88036581299994, 40.839540578999895], [-73.88030771499984, 40.83971779899986], [-73.88030769199985, 40.8397178709999], [-73.88030767999986, 40.839717943999894], [-73.88027152699999, 40.839896239999874], [-73.88010086899989, 40.84006661599993], [-73.880061996, 40.840162234999845], [-73.87992249999996, 40.840154029999916], [-73.87978300299987, 40.840145825999855], [-73.8786598319999, 40.840019903999824], [-73.87850461299986, 40.840005593999905], [-73.87841924999984, 40.83999458999992], [-73.87831009099979, 40.8399893509999], [-73.87823856799989, 40.839985917999854]]]}}, {\&quot;id\&quot;: \&quot;60\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 61, \&quot;Shape_Leng\&quot;: 0.117310808097, \&quot;Shape_Area\&quot;: 0.000510772092295, \&quot;zone\&quot;: \&quot;Crown Heights North\&quot;, \&quot;LocationID\&quot;: 61, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92916130699993, 40.68343632399992], [-73.92900883999985, 40.68270290499991], [-73.92609461699993, 40.683038709999884], [-73.92281374299995, 40.68341442999991], [-73.92267012199994, 40.68268151199991], [-73.9225447959999, 40.68193561299989], [-73.92250799299985, 40.68171006999996], [-73.92249266199998, 40.681616108999926], [-73.92242652099985, 40.68121074499992], [-73.92240197099996, 40.68108955299994], [-73.92238256000003, 40.68099373699993], [-73.92236962399983, 40.68092987999994], [-73.92235458599998, 40.68085564499991], [-73.92233849599998, 40.680776217999885], [-73.92231261899987, 40.680648472999955], [-73.92227774199988, 40.6804762929999], [-73.92225617599988, 40.68036776399987], [-73.92223681799994, 40.680270342999904], [-73.92221626999996, 40.680166934999924], [-73.92217715699984, 40.679970084999894], [-73.92215222999988, 40.67984463499988], [-73.92213242899994, 40.67974497799986], [-73.92211149999984, 40.67965755699986], [-73.92208787199984, 40.67955885799993], [-73.92205453499997, 40.6794196039999], [-73.92203214100006, 40.67932605899988], [-73.92201534599985, 40.679255899999916], [-73.9219999079998, 40.6791914139999], [-73.92197287199998, 40.67907846999987], [-73.92183500099998, 40.67894555899991], [-73.92164666399992, 40.67886992299994], [-73.92171159899995, 40.67811571399989], [-73.92181538999996, 40.67701838999991], [-73.92182360999988, 40.67693835799988], [-73.92183232600003, 40.67684904199989], [-73.92190090500002, 40.67613162099988], [-73.92197495299999, 40.675348546999935], [-73.92204843299987, 40.67457439699991], [-73.92213153399979, 40.673683888999946], [-73.92221444299993, 40.67279163299992], [-73.92229950400001, 40.67190026199992], [-73.92238401799992, 40.67100876299986], [-73.92245355399994, 40.67026114899993], [-73.92246696799995, 40.6701169299999], [-73.92254432199987, 40.66927581099986], [-73.92261354299985, 40.668564106999874], [-73.92263210799995, 40.66837321099994], [-73.92265529999987, 40.668127114999905], [-73.9227271419999, 40.667365055999866], [-73.92275257199998, 40.667097332999894], [-73.922811066, 40.66707176099994], [-73.92303439399991, 40.66697412599995], [-73.92311978499988, 40.666936793999945], [-73.92323224599997, 40.66688762799987], [-73.92331039799996, 40.66685345999985], [-73.92424467199989, 40.666444999999875], [-73.92439099400002, 40.66638142299991], [-73.92546270199979, 40.66591675199991], [-73.92592201499984, 40.66571503599991], [-73.92637970499992, 40.6655148919999], [-73.92739349999997, 40.665074715999936], [-73.92771188899987, 40.66493432799991], [-73.928228724, 40.66470986499991], [-73.92872204599985, 40.66449556899988], [-73.92869200600002, 40.66496229699995], [-73.92868404399992, 40.66508602299993], [-73.92930683899975, 40.66511700699991], [-73.9314554999999, 40.665233817999884], [-73.93422426299998, 40.665377742999915], [-73.93698362399992, 40.665535507999955], [-73.93694519299984, 40.66598129699992], [-73.93690681099987, 40.66642658999988], [-73.93686802199987, 40.666849828999894], [-73.9368252179999, 40.66731699399983], [-73.93674946999998, 40.66812737099991], [-73.93951520799993, 40.66829561599992], [-73.94228420399995, 40.6684614269999], [-73.94504645700006, 40.66861461599994], [-73.94781857499984, 40.66878375399989], [-73.94775110299997, 40.669495265999934], [-73.9477299629999, 40.66971344199991], [-73.9505004649999, 40.66986833099988], [-73.95160495999987, 40.669923718999904], [-73.95327019699985, 40.67000720499991], [-73.95526963699997, 40.6701249049999], [-73.957973172, 40.67065727399988], [-73.95904725399988, 40.67088226799995], [-73.96131877999991, 40.67140667599988], [-73.96126442099991, 40.67156359099989], [-73.96102898299978, 40.67224318399995], [-73.96070974499996, 40.673121393999985], [-73.96039301899985, 40.67399860199986], [-73.96007428300001, 40.67487807099994], [-73.96318238899983, 40.675529503999876], [-73.9628644419999, 40.67640534099992], [-73.96254635399981, 40.67728661699993], [-73.96222841199993, 40.67816620799992], [-73.96195644399998, 40.67893384299989], [-73.96167998599988, 40.67970220599991], [-73.96153961999995, 40.68008625499992], [-73.9614104629999, 40.680413152999925], [-73.96134655899995, 40.6804635239999], [-73.95829216799997, 40.67983113299993], [-73.9559586239999, 40.679346246999906], [-73.95529361599996, 40.679203150999825], [-73.95530907499989, 40.67927313499995], [-73.95543681599986, 40.67995785499992], [-73.95436836300001, 40.680075106999915], [-73.95328187399996, 40.68020003099985], [-73.9533701749999, 40.680640507999904], [-73.95155682700002, 40.680498847999935], [-73.95115828499993, 40.68047861499993], [-73.94955688699993, 40.68039040299995], [-73.94773023599987, 40.6802918459999], [-73.94674916000001, 40.68023966099991], [-73.94627471000001, 40.68021332599986], [-73.94397347799995, 40.680088127999916], [-73.94326176899995, 40.68005060699992], [-73.9412086429999, 40.67993835399988], [-73.94032794, 40.679889974999874], [-73.93843613299988, 40.679785851999924], [-73.93739763699983, 40.679729899999934], [-73.93487210899987, 40.679593087999855], [-73.93435066499993, 40.67956340799991], [-73.93439530999997, 40.67983537999992], [-73.93450838999993, 40.6802216929999], [-73.93457098299989, 40.68056476199988], [-73.93471441099992, 40.6812973839999], [-73.93486257200001, 40.68203056899991], [-73.93500821699992, 40.68276376799985], [-73.93208669799994, 40.68310034999988], [-73.92916130699993, 40.68343632399992]]]}}, {\&quot;id\&quot;: \&quot;61\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 62, \&quot;Shape_Leng\&quot;: 0.0822593359838, \&quot;Shape_Area\&quot;: 0.000158238169004, \&quot;zone\&quot;: \&quot;Crown Heights South\&quot;, \&quot;LocationID\&quot;: 62, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92916752199997, 40.664299531999895], [-73.9294035289999, 40.66419984599983], [-73.92987364799986, 40.66399077299992], [-73.93068465499985, 40.66362047699992], [-73.93160743400001, 40.66355672299988], [-73.93437459299999, 40.663372810999896], [-73.93455236699992, 40.6633622859999], [-73.93726377600001, 40.66319183299991], [-73.94002976999997, 40.66302074299991], [-73.94282892199992, 40.6628474859999], [-73.94269628999989, 40.664055128999934], [-73.94408198699985, 40.664128572999914], [-73.94489227700002, 40.66417414399993], [-73.94546293699983, 40.66422610399989], [-73.94816604199978, 40.66408182199995], [-73.9494063899999, 40.66400530799991], [-73.9509741009999, 40.6639048679999], [-73.95384851099975, 40.66372780899991], [-73.95720935499996, 40.663517396999914], [-73.95729172699991, 40.66430263299986], [-73.95787061899992, 40.66427335799993], [-73.95934422499985, 40.66417564699991], [-73.96033682899981, 40.66410869799995], [-73.96061544799986, 40.663302749999936], [-73.96095595499996, 40.66328505499992], [-73.96110886899996, 40.664062323999914], [-73.96125791699997, 40.66480182299993], [-73.96161627599987, 40.66669521599988], [-73.96180658699991, 40.66768122699987], [-73.96199657599993, 40.66866286999989], [-73.96211021099997, 40.66919569699996], [-73.96219447199988, 40.66964102999985], [-73.96252326599993, 40.67137973899986], [-73.96254108199987, 40.67146011899995], [-73.96258784899996, 40.671711596999884], [-73.96131877999991, 40.67140667599988], [-73.95904725399988, 40.67088226799995], [-73.957973172, 40.67065727399988], [-73.95526963699997, 40.6701249049999], [-73.95327019699985, 40.67000720499991], [-73.95160495999987, 40.669923718999904], [-73.9505004649999, 40.66986833099988], [-73.9477299629999, 40.66971344199991], [-73.94775110299997, 40.669495265999934], [-73.94781857499984, 40.66878375399989], [-73.94504645700006, 40.66861461599994], [-73.94228420399995, 40.6684614269999], [-73.93951520799993, 40.66829561599992], [-73.93674946999998, 40.66812737099991], [-73.9368252179999, 40.66731699399983], [-73.93686802199987, 40.666849828999894], [-73.93690681099987, 40.66642658999988], [-73.93694519299984, 40.66598129699992], [-73.93698362399992, 40.665535507999955], [-73.93422426299998, 40.665377742999915], [-73.9314554999999, 40.665233817999884], [-73.92930683899975, 40.66511700699991], [-73.92868404499993, 40.66508602299991], [-73.92869200600002, 40.66496229699995], [-73.92872204599985, 40.66449556899988], [-73.92905235499991, 40.66435100699988], [-73.92916752199997, 40.664299531999895]]]}}, {\&quot;id\&quot;: \&quot;62\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 63, \&quot;Shape_Leng\&quot;: 0.119100721883, \&quot;Shape_Area\&quot;: 0.000353190910142, \&quot;zone\&quot;: \&quot;Cypress Hills\&quot;, \&quot;LocationID\&quot;: 63, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86650407899994, 40.684474051999885], [-73.86631496899999, 40.683248942999924], [-73.86630263900003, 40.68318669399984], [-73.86629002999987, 40.68311500699992], [-73.86602666799992, 40.681918051999936], [-73.8649940449999, 40.68212896999991], [-73.86410096700003, 40.68237284999988], [-73.86399008800005, 40.68192857599995], [-73.86378674500001, 40.68111374699991], [-73.86334943599995, 40.67935163999989], [-73.86330964200002, 40.67916796999987], [-73.86328640800004, 40.67907719699985], [-73.86296470699986, 40.67911281599989], [-73.86234580499983, 40.67916478599994], [-73.86225943099994, 40.67881678599989], [-73.86202843099984, 40.67788611399987], [-73.86171238699991, 40.67661059599987], [-73.86139775899983, 40.67533658999988], [-73.86131863599985, 40.6750212689999], [-73.86106294999989, 40.67434293499984], [-73.86176409699986, 40.6742322599999], [-73.86310051, 40.67464721299993], [-73.86413333499988, 40.67499725199989], [-73.86455313199994, 40.675151121999896], [-73.86521514199991, 40.67538657399996], [-73.86627349499993, 40.67576404499992], [-73.86725717699991, 40.676112683999875], [-73.86838105899999, 40.67653059899985], [-73.86942312899993, 40.67691222799995], [-73.86977606799984, 40.67702720899994], [-73.870458215, 40.67722236799989], [-73.87148141800003, 40.677500662999925], [-73.87176417499987, 40.677572227999875], [-73.87204099299996, 40.677657418999935], [-73.87231018000001, 40.67775574699987], [-73.87257015500002, 40.67786660999989], [-73.87304845699995, 40.678194106999904], [-73.87318521799988, 40.678330001999946], [-73.87331183100002, 40.678471800999894], [-73.87342767099986, 40.67861884699991], [-73.87353219499991, 40.67877042099986], [-73.87363895999985, 40.678944030999894], [-73.87376075799997, 40.679112496999885], [-73.87389692799991, 40.67927472199993], [-73.87404657399993, 40.67942964799988], [-73.87420866699985, 40.67957633999987], [-73.8744016199999, 40.67971160899987], [-73.87461126400001, 40.679834253999964], [-73.87483538999999, 40.679942569999874], [-73.87507136399991, 40.68003514599991], [-73.87531627599998, 40.68011098399988], [-73.8755670759999, 40.68016946499992], [-73.87657495299996, 40.68016700199996], [-73.87688955199985, 40.68016499699994], [-73.877426862, 40.6800144369999], [-73.87838855899999, 40.67973905399991], [-73.87862924200003, 40.67967653299995], [-73.87926692499995, 40.679491084999896], [-73.87974063299995, 40.67936096099988], [-73.88015110700003, 40.67924206299993], [-73.88061377799994, 40.679110031999876], [-73.88063900599983, 40.679176984999856], [-73.88109834200004, 40.68107447699986], [-73.88116730300005, 40.68135366299988], [-73.88210725299986, 40.68121749099986], [-73.88303083299995, 40.68108517499993], [-73.88397193799985, 40.68094711499989], [-73.88489254699988, 40.68081111599983], [-73.88467046600006, 40.679940284999894], [-73.88555502399997, 40.67965659699994], [-73.88643790499991, 40.67937347599991], [-73.88730460899997, 40.67909753699995], [-73.8881563449999, 40.67882783499992], [-73.88900569799982, 40.678557043999916], [-73.88987439199998, 40.67830214999987], [-73.89077319200003, 40.678164588999934], [-73.89167121099989, 40.67803172099987], [-73.89257905399984, 40.67790012399996], [-73.8934840539999, 40.677762060999896], [-73.8943888149999, 40.677629888999896], [-73.89531770399991, 40.67749603799994], [-73.89621773699986, 40.67735818399991], [-73.8965367649999, 40.67859358099985], [-73.89695521899982, 40.67840924299985], [-73.89747545199997, 40.67816325499989], [-73.89761600299984, 40.67811198799991], [-73.89775655500003, 40.67806072099993], [-73.89783505699992, 40.67799357599992], [-73.898199615, 40.677761731999944], [-73.89836229199989, 40.677658275999875], [-73.89883201499994, 40.677446439999855], [-73.89912562799992, 40.67731263799992], [-73.89992296499994, 40.67694927299984], [-73.9000462609999, 40.676893089999936], [-73.90014864399993, 40.67694931599989], [-73.9005649959999, 40.67717798499989], [-73.90099766899989, 40.67745246799996], [-73.90136992499991, 40.67768861999989], [-73.90140356899998, 40.6777099629999], [-73.90142169599987, 40.6777214619999], [-73.90144574099996, 40.67773656199995], [-73.90187352500006, 40.678005191999866], [-73.90198538099985, 40.67807543199993], [-73.90199214699999, 40.678079679999925], [-73.90236198199986, 40.67831191499993], [-73.90239451899987, 40.67833234699987], [-73.9023946, 40.67833239799992], [-73.90287079599995, 40.6786314149999], [-73.9031631289999, 40.6788149779999], [-73.90324287399993, 40.6788650509999], [-73.90333666199992, 40.6789239429999], [-73.90333723699995, 40.678924302999874], [-73.903630796, 40.67904695599991], [-73.90400588299991, 40.67920367099988], [-73.90402950499993, 40.67921353999991], [-73.9040463979999, 40.67922059799985], [-73.90358874799992, 40.67967480399991], [-73.90262262299991, 40.6806645029999], [-73.90075235999984, 40.67967664399992], [-73.90047001100004, 40.679535243999936], [-73.89969830299987, 40.67954409199993], [-73.89889928299989, 40.67956093399993], [-73.89870944799999, 40.67963016999989], [-73.89848997800001, 40.67967050899991], [-73.89827418999997, 40.67972504299988], [-73.89806444599996, 40.67979343099991], [-73.89786299899986, 40.67987501099987], [-73.89767194200002, 40.6799688539999], [-73.89749312100001, 40.680073775999915], [-73.89738856299982, 40.68016295199989], [-73.89729111699982, 40.68025667899985], [-73.8972011219999, 40.680354629999904], [-73.89711889399996, 40.68045646099994], [-73.89704472199993, 40.68056181599996], [-73.89697886299997, 40.68067032699991], [-73.89692154999993, 40.680781612999915], [-73.89687298299991, 40.680895284999934], [-73.89674965999993, 40.68149202599986], [-73.89663536799999, 40.68155649499991], [-73.89658158699996, 40.6815747179999], [-73.89652633199988, 40.68200291799991], [-73.89646625099995, 40.68233642199988], [-73.89643010399996, 40.68244635899987], [-73.89641909099993, 40.68247987599991], [-73.896367991, 40.68259975699988], [-73.89635898799989, 40.68262086699985], [-73.89628634699977, 40.68275838299988], [-73.89620169599988, 40.68289148199994], [-73.89599727299998, 40.68319687899986], [-73.89577945499994, 40.6834971829999], [-73.89561476499993, 40.683707421999955], [-73.89554859399983, 40.6837918919999], [-73.89530504899982, 40.684080519999966], [-73.8950492689999, 40.68436259899988], [-73.89417463299992, 40.6852832479999], [-73.89414204200001, 40.68524656699989], [-73.89404051299984, 40.68513229799984], [-73.89274142399994, 40.683670185999866], [-73.89252316799995, 40.683424532999865], [-73.8916601069998, 40.6840441779999], [-73.89015418699982, 40.68500398999987], [-73.88962787599998, 40.684236453999894], [-73.8890889529999, 40.68464055299995], [-73.88808341799984, 40.68529363199983], [-73.88728392899995, 40.68562247499987], [-73.88452250999984, 40.68668474899988], [-73.88377698600002, 40.68786341099992], [-73.88226665399998, 40.689038550999896], [-73.88118296199987, 40.689866269999904], [-73.87956139399984, 40.691104780999915], [-73.87950641199996, 40.69114676899987], [-73.87939315099985, 40.691209631999875], [-73.87402053199992, 40.69419129499995], [-73.870042929, 40.69494148499996], [-73.86891704399994, 40.69515042299987], [-73.8684248969999, 40.694718118999916], [-73.86868454299989, 40.6940346919999], [-73.86859478099983, 40.693884374999854], [-73.8680588529999, 40.69118395799991], [-73.867909485, 40.69047626099993], [-73.86776832199985, 40.68980328899986], [-73.86762340399984, 40.6891453419999], [-73.867460889, 40.688415017999915], [-73.86728057399986, 40.68774928499989], [-73.86701802999987, 40.686830348999884], [-73.86687058599995, 40.686330590999944], [-73.86659848299999, 40.68526955899992], [-73.86650407899994, 40.684474051999885]]]}}, {\&quot;id\&quot;: \&quot;63\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 64, \&quot;Shape_Leng\&quot;: 0.18445188474, \&quot;Shape_Area\&quot;: 0.00105790284614, \&quot;zone\&quot;: \&quot;Douglaston\&quot;, \&quot;LocationID\&quot;: 64, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.74412314584049, 40.77863865777706], [-73.74153532911315, 40.777110631086295], [-73.74075991577695, 40.77669471074994], [-73.74036629409532, 40.77638970422471], [-73.74007973985933, 40.7762087951981], [-73.73937598893414, 40.77601366983492], [-73.73912362001862, 40.775704143036336], [-73.73886227381915, 40.775573157950646], [-73.73770283611138, 40.7747935858661], [-73.73688222993059, 40.77433096117149], [-73.73389261595659, 40.77252717887968], [-73.73304215822819, 40.77195443418381], [-73.73191230278991, 40.7713532077885], [-73.73113636491937, 40.77086955609971], [-73.73030460922762, 40.77041060576091], [-73.72970531807846, 40.770053446074], [-73.72870722109356, 40.76946148404628], [-73.7277187531248, 40.76879613592288], [-73.72658720816285, 40.76811459879865], [-73.72554599082781, 40.76749535591531], [-73.72356002293202, 40.76612876183406], [-73.72305924186259, 40.76614440615705], [-73.72248438405902, 40.76552721017787], [-73.72114272775374, 40.764872606934006], [-73.7209758841712, 40.76476015914438], [-73.72080904877663, 40.764647715919004], [-73.72075222623495, 40.76458735257297], [-73.72071269900161, 40.76453219025292], [-73.72063083099366, 40.76447640375274], [-73.72021435708592, 40.76419260579632], [-73.71657585309137, 40.76178181176188], [-73.71413538009266, 40.76024270987026], [-73.71386982697975, 40.76006061549925], [-73.71365557006699, 40.75993557094455], [-73.71351828186042, 40.75983773091619], [-73.71426287799991, 40.7598267469999], [-73.71455685899994, 40.759808807999896], [-73.71498213999979, 40.759782864999885], [-73.71612528199985, 40.75966071399991], [-73.71613842699988, 40.759658278999964], [-73.71685440399995, 40.75952551499989], [-73.71767237099996, 40.75931121199987], [-73.71831971899985, 40.7590820759999], [-73.71877787700004, 40.758871691999886], [-73.7189705039999, 40.75878323799989], [-73.71917909599986, 40.758666436999924], [-73.71956460799996, 40.7584505599999], [-73.7196773229999, 40.75837249899988], [-73.71998297099998, 40.75816082099986], [-73.72031595299998, 40.75789725799992], [-73.7206331939999, 40.75761683499996], [-73.72096511799994, 40.75729378899992], [-73.72111001499998, 40.75711152599996], [-73.72121176099995, 40.7569792089999], [-73.72145870299994, 40.75665808099994], [-73.72159631499989, 40.7564275039999], [-73.72161357099998, 40.756398594999894], [-73.72176339599984, 40.75613846699984], [-73.72180289199983, 40.75606989799992], [-73.72207071399988, 40.75549670299993], [-73.72241094799993, 40.754920188999925], [-73.72264543599995, 40.75460052399995], [-73.72279703199989, 40.75443353799988], [-73.72299301299984, 40.754217670999914], [-73.72326673499998, 40.75394759899994], [-73.72344135499989, 40.75379084499986], [-73.72351867299997, 40.753721436999825], [-73.72382698899992, 40.75346908899995], [-73.72384451899983, 40.75345681199988], [-73.72475823099984, 40.7529081479999], [-73.72506848099987, 40.752721843999886], [-73.72509445399984, 40.75270759199993], [-73.72551247899986, 40.75247819799989], [-73.72582988899985, 40.752291720999935], [-73.72602966399984, 40.752174354999916], [-73.7264147219999, 40.75191587799986], [-73.72666529899992, 40.75171358799987], [-73.726777395, 40.75162309199987], [-73.72709389599997, 40.75134160399987], [-73.72737889099987, 40.751029566999854], [-73.72771356199995, 40.750626894999904], [-73.72788401199996, 40.750387482999884], [-73.72805355599995, 40.750082150999894], [-73.7282538099999, 40.74969372899995], [-73.72837798399998, 40.74938116699989], [-73.728491785, 40.74904470699989], [-73.72862207399999, 40.74851209199989], [-73.72871952799996, 40.74819708099994], [-73.728962516, 40.74763288799986], [-73.72906670999978, 40.74739095899988], [-73.729145939, 40.74727379999993], [-73.72953448999986, 40.746716395999925], [-73.72964619299997, 40.74656191399992], [-73.72993169099983, 40.74618812499993], [-73.73043134700004, 40.74558483599989], [-73.7306280189999, 40.745364157999866], [-73.7310646189999, 40.744888375999885], [-73.73226918099995, 40.743818962999946], [-73.73232731699994, 40.74377143299988], [-73.73241694699988, 40.74369457599995], [-73.7336646159999, 40.74281318399988], [-73.73370171499998, 40.74278515699989], [-73.73375484899985, 40.742747627999975], [-73.7343696589998, 40.74235159899991], [-73.73539272699988, 40.74181104999989], [-73.73560786699984, 40.74169621999989], [-73.73685894199984, 40.741050400999875], [-73.73751038099981, 40.74071544799988], [-73.73816047999985, 40.74037643499986], [-73.738571759, 40.74009212299992], [-73.73901210399985, 40.73974647899997], [-73.73933151399987, 40.739474474999916], [-73.73972244199989, 40.739036089999914], [-73.73986995499992, 40.73886690099992], [-73.74016951799993, 40.73848189799986], [-73.74029081599988, 40.738516669999974], [-73.74055585499997, 40.73858718299989], [-73.740773448, 40.738635272999886], [-73.7408821769999, 40.73869623999991], [-73.7410061249999, 40.73874389499987], [-73.74100625499993, 40.73874393099987], [-73.74100638499996, 40.738743967999895], [-73.74114115799996, 40.73877533799986], [-73.74128113899988, 40.73878869199996], [-73.74142000699983, 40.73878380799991], [-73.74155202599987, 40.73876204099987], [-73.74222678199988, 40.738615671999874], [-73.74306820799991, 40.7384408179999], [-73.743469568, 40.73887010399992], [-73.74360280299993, 40.73901260899992], [-73.74371941299982, 40.73938314999984], [-73.74385264199996, 40.740093948999835], [-73.74396193599988, 40.740789125999925], [-73.74657796099996, 40.74034659199985], [-73.74996804299987, 40.73974575299995], [-73.7500915089999, 40.73981690899991], [-73.75009170899982, 40.73981702699994], [-73.75009192199988, 40.73981711699985], [-73.75022786299992, 40.73987649399992], [-73.75022795699996, 40.739876530999865], [-73.75037344499992, 40.73992242099994], [-73.75037358699991, 40.73992246699986], [-73.75037372900003, 40.7399224929999], [-73.75052495299994, 40.739953708999934], [-73.75052516599999, 40.73995375399992], [-73.7505254029999, 40.739953780999905], [-73.75067885099993, 40.73996996299991], [-73.75083158999993, 40.73998889799992], [-73.75083176700001, 40.73998891699989], [-73.75083193299997, 40.73998895299995], [-73.75098218299992, 40.74002143499992], [-73.75098230100001, 40.740021462999884], [-73.75098241899988, 40.74002149899998], [-73.75112706799992, 40.74006711599992], [-73.7511273519999, 40.74006720699986], [-73.75112759899997, 40.740067314999884], [-73.75126376099992, 40.74012514299993], [-73.75126399699991, 40.74012524299995], [-73.75126422199989, 40.74012536999987], [-73.75138967499991, 40.74019415999988], [-73.75347299999999, 40.74240484399992], [-73.75253331799986, 40.742611332999914], [-73.75163327499985, 40.742806759999915], [-73.75072790300003, 40.74299784699989], [-73.74979834499989, 40.74314244299993], [-73.74887697299994, 40.74328837499995], [-73.74784861300004, 40.743296077999936], [-73.74671975299987, 40.74312364799993], [-73.74567621100002, 40.7430272989999], [-73.74477587099986, 40.74328109699994], [-73.74593060399998, 40.74571565899988], [-73.74625984399985, 40.74671147499993], [-73.74384322099985, 40.74769009599988], [-73.74409668799983, 40.748206641999936], [-73.74507911699986, 40.75027389699992], [-73.74577948799998, 40.75156080499994], [-73.746216657, 40.75168585099987], [-73.74637489399997, 40.75176036499987], [-73.74652681399978, 40.7518426459999], [-73.74667146099986, 40.75193218699994], [-73.746807946, 40.752028417999924], [-73.74684219699994, 40.75205807499989], [-73.74687468099984, 40.75208864699991], [-73.7470988539999, 40.75234682899989], [-73.74737514999993, 40.752959618999974], [-73.74760569999985, 40.75350787799988], [-73.74774116499985, 40.75384994499991], [-73.74711113899991, 40.75417328599991], [-73.74809587899985, 40.75589954999988], [-73.75004764499985, 40.75840465799996], [-73.75057710699984, 40.75801489499991], [-73.75115582999983, 40.7590697689999], [-73.75230259399993, 40.759455198999916], [-73.752771716, 40.75887302799991], [-73.75320997199995, 40.7582448729999], [-73.75335958499983, 40.75832324899992], [-73.75352058499996, 40.758390329999905], [-73.75369069100002, 40.75844478799994], [-73.7538672559999, 40.75848565299992], [-73.75404744899984, 40.75851238599993], [-73.75422838200002, 40.75852489199992], [-73.75497607999992, 40.75850155999997], [-73.75511648399994, 40.758479497999915], [-73.75525632799999, 40.75844214599991], [-73.75539137399988, 40.758389247999915], [-73.75551718999986, 40.75832147399991], [-73.7555734369999, 40.75828095199988], [-73.75583713299987, 40.757742061999934], [-73.75625606399994, 40.75843046999994], [-73.75682062199998, 40.75973480599985], [-73.75800131799996, 40.76037986699988], [-73.75848075099995, 40.7619947369999], [-73.75811452099987, 40.76205389699988], [-73.75802364199994, 40.76211096099997], [-73.75794391899996, 40.76218407699988], [-73.75792673399994, 40.7622083249999], [-73.75788220699995, 40.76227115299988], [-73.75784418199986, 40.76236794099986], [-73.75783301499992, 40.76246859399991], [-73.75784470399994, 40.76254231099988], [-73.75784858699993, 40.76256679999993], [-73.75788761399987, 40.76265702199986], [-73.75794474699994, 40.7627354049999], [-73.75809857499982, 40.76298453899995], [-73.75823811499988, 40.763238765999944], [-73.75836296599996, 40.76349738299991], [-73.75844568799998, 40.76368152999987], [-73.75843838499995, 40.763928487999856], [-73.75844672099987, 40.76411514599987], [-73.75851382899985, 40.76410483099993], [-73.75859320499987, 40.764088229999906], [-73.7588643139999, 40.76327454099993], [-73.759097561, 40.76405669599989], [-73.75921689799992, 40.76432485599988], [-73.75862488400004, 40.76438314999996], [-73.75856122399995, 40.76438654599987], [-73.75850831399994, 40.76439435899995], [-73.7583941619999, 40.7644052469999], [-73.75635669699987, 40.764599557999915], [-73.75601361099996, 40.76463784199992], [-73.75567226899989, 40.76469114899985], [-73.75533439, 40.764759409999954], [-73.75500165499989, 40.76484240599992], [-73.75467572399998, 40.76493975999991], [-73.75435817399999, 40.76505094399988], [-73.75405049899983, 40.7651753319999], [-73.75377036482259, 40.76530463174143], [-73.75380733759789, 40.76511533246209], [-73.75380441445209, 40.765068227844544], [-73.75375190107101, 40.76503043842622], [-73.75367229455681, 40.764971622785595], [-73.75355704488845, 40.76486880710364], [-73.75346745383098, 40.76477581534768], [-73.75340994726432, 40.76469265965659], [-73.75330736474879, 40.764638713155435], [-73.75321775669782, 40.76455060405654], [-73.75311540991821, 40.764433163533354], [-73.75297443068116, 40.76434006075026], [-73.75285898250387, 40.76429096965374], [-73.75264732366146, 40.764202599394764], [-73.7526925441715, 40.76413431754799], [-73.75264128126541, 40.76410001719451], [-73.7524937694181, 40.76403620602584], [-73.75236834738628, 40.763949379623185], [-73.75226304070037, 40.763894066011986], [-73.75219261536506, 40.76383041851506], [-73.75212233558226, 40.763727698090904], [-73.75204563186178, 40.76362496379624], [-73.7520040194552, 40.76350287108586], [-73.75195275558251, 40.76336126369825], [-73.75189013131875, 40.76320438155103], [-73.75181884878003, 40.76299772753364], [-73.75178042777567, 40.76289650166449], [-73.75160082700452, 40.76257386182551], [-73.75150345347899, 40.762362502304455], [-73.75139722117518, 40.76223244243897], [-73.75128533569809, 40.76211176666061], [-73.75117340232892, 40.762003900915104], [-73.75107037762622, 40.761917410250106], [-73.75105245896142, 40.761902850669735], [-73.75104033492728, 40.76184047245043], [-73.7510842820423, 40.761803838736846], [-73.7510743225255, 40.76176367133622], [-73.7509735123674, 40.76168572586612], [-73.75090170424691, 40.76166250926074], [-73.75082187737034, 40.76168112774134], [-73.75072728692017, 40.76174242208793], [-73.75057468214737, 40.7616788158593], [-73.75041128338685, 40.7615121726565], [-73.75019289977786, 40.7614285535738], [-73.74998548162718, 40.76133664570978], [-73.74949376072769, 40.76124411676728], [-73.74914665740043, 40.761192791089265], [-73.74868090837376, 40.76096434231705], [-73.74861225072561, 40.76092780307599], [-73.74853166386495, 40.760882140561826], [-73.7484570766551, 40.76083194257801], [-73.7484004868574, 40.76076813730873], [-73.7482281259856, 40.76050136976691], [-73.74796573496857, 40.7602960998587], [-73.7478976470288, 40.76023808603646], [-73.74778567833137, 40.76014217625904], [-73.74773327425393, 40.76003870885871], [-73.7476583327047, 40.75995398486197], [-73.74753513475062, 40.75985719618731], [-73.74746117500982, 40.75981005494173], [-73.74728967123532, 40.759714014147775], [-73.7471698249882, 40.759622357401994], [-73.74695558696763, 40.75953903440671], [-73.74673016390221, 40.75944372971427], [-73.7465598186793, 40.75933914768842], [-73.7464254631052, 40.75922354214357], [-73.74628904491358, 40.75905924481752], [-73.74628582855765, 40.75901909233278], [-73.74628600098946, 40.75897382351047], [-73.74629189268191, 40.75890123331028], [-73.74632597925213, 40.75879966345884], [-73.74634096546987, 40.7586989079362], [-73.74632333540838, 40.75860918308185], [-73.74630325887233, 40.75857155662324], [-73.74635621902131, 40.758528110630884], [-73.74641486447456, 40.758466741898815], [-73.74638144167064, 40.75839406564263], [-73.74640309403442, 40.758312968449296], [-73.74641337628168, 40.7582677218775], [-73.7464134955851, 40.758267113348396], [-73.74642482955997, 40.758209665279864], [-73.74641167584906, 40.758124220706435], [-73.74637157591067, 40.758035301609446], [-73.74633023584065, 40.75797712659557], [-73.74631454146692, 40.757968550858195], [-73.74626743586923, 40.757949655989066], [-73.74624838205933, 40.75793850985342], [-73.74624390337235, 40.757935084455255], [-73.74624054497137, 40.757931660352156], [-73.7462371874519, 40.7579282362508], [-73.7462360784208, 40.75792481827516], [-73.74623496178856, 40.75792310637381], [-73.74623496830108, 40.75792139694663], [-73.74623497480721, 40.757919689194615], [-73.74623498131783, 40.757917980269944], [-73.74623499433008, 40.757914564766], [-73.74623725253437, 40.75791115303519], [-73.74625308746172, 40.75788300039028], [-73.74627682644942, 40.75784376316326], [-73.74628135718679, 40.7578335225235], [-73.74628363711001, 40.75782498586535], [-73.74628478821236, 40.75781730093923], [-73.74628480122651, 40.757813884262504], [-73.74628369242, 40.75781046511508], [-73.74628034510107, 40.757804479723], [-73.74627700539382, 40.75779678540849], [-73.74626136313661, 40.7577745414491], [-73.74623789033056, 40.75774374023382], [-73.7462188906345, 40.757718928060626], [-73.7462099395368, 40.75770951361565], [-73.74620770191625, 40.757706946198816], [-73.7462054625862, 40.75770523232625], [-73.7461953829455, 40.757697523160154], [-73.74618193736195, 40.75768895185608], [-73.7461752084484, 40.75768552149715], [-73.7461684791486, 40.75768294418255], [-73.74615725922665, 40.75767950107878], [-73.74615501338599, 40.75767949612995], [-73.74614828083048, 40.75767777352784], [-73.74613929851625, 40.757676900688345], [-73.74613143454941, 40.757676883358265], [-73.74611008616621, 40.75767854407576], [-73.74610334252881, 40.757679382258424], [-73.74609771771479, 40.757681933521056], [-73.74607183962367, 40.757692980648315], [-73.74605833716052, 40.75769892890423], [-73.74600094895115, 40.75772528164094], [-73.74598069133656, 40.75773548641946], [-73.7459491686193, 40.7577542080311], [-73.74589061547654, 40.75779166231073], [-73.74588385596999, 40.75779677187182], [-73.74587709276122, 40.75780273614509], [-73.74584552065286, 40.75783427072537], [-73.74583763539503, 40.75784023252097], [-73.74582750623101, 40.75784533414149], [-73.74581738010093, 40.75784958255485], [-73.74580726225128, 40.75785212271662], [-73.74579714457572, 40.75785380882725], [-73.74579265266253, 40.757853798915036], [-73.7457892814692, 40.757853791475746], [-73.74578479215516, 40.75785292735082], [-73.74578142620533, 40.75785206570453], [-73.74577918555481, 40.757850352993536], [-73.74577582220617, 40.75784863663218], [-73.74576014295548, 40.75783664481693], [-73.74575006788852, 40.757827226180424], [-73.7457444715135, 40.757822089357006], [-73.7456974812008, 40.75777329804245], [-73.74567957544278, 40.75775532210831], [-73.74563031826347, 40.75771165241087], [-73.74554859793469, 40.75763886874296], [-73.74553069357489, 40.75762089278826], [-73.74552062382129, 40.75761061942213], [-73.74548705882032, 40.757575525503874], [-73.74546131211113, 40.757552406566525], [-73.74544674827708, 40.75754212493889], [-73.74542993623295, 40.75753269138673], [-73.74538396629083, 40.75751038195785], [-73.74537387044663, 40.75750694411011], [-73.74532563749915, 40.75748889990954], [-73.7453043316149, 40.757479456404035], [-73.74528752286861, 40.757469169792586], [-73.74527295907737, 40.757458888645495], [-73.74526176625159, 40.75744861277299], [-73.74525169762303, 40.75743748684236], [-73.74523383674908, 40.75740840676913], [-73.74522713431325, 40.75739899554475], [-73.74519135509507, 40.75735535546363], [-73.74515554196519, 40.75732110951952], [-73.74512866796508, 40.757298842230995], [-73.74509394882874, 40.75727228732276], [-73.74508946871022, 40.75726886020077], [-73.74508610540423, 40.7572671449918], [-73.74507601527569, 40.7572619970184], [-73.7450390130659, 40.75724483344262], [-73.74502892382331, 40.75723968613712], [-73.74502331642866, 40.757237110065674], [-73.74500848856957, 40.75722838462264], [-73.74499417705718, 40.75721996387875], [-73.74498184854157, 40.75721310217035], [-73.74498072779814, 40.7572122454709], [-73.74495943751793, 40.75719853218402], [-73.74494264524719, 40.75718397530416], [-73.74493593369215, 40.75717627180867], [-73.7449303481282, 40.7571685724813], [-73.7449236542483, 40.75715659927284], [-73.74491360993711, 40.75713949484265], [-73.74490803614141, 40.75712837883434], [-73.74489352243867, 40.75710528413908], [-73.74488682530038, 40.757094165139506], [-73.74488348163936, 40.75708732432283], [-73.7448812604461, 40.757080486662126], [-73.74487575929356, 40.757050579684545], [-73.74487577237984, 40.757047163007705], [-73.74487355184948, 40.7570403253482], [-73.74486908179121, 40.75703433625488], [-73.74486796826072, 40.757031770128414], [-73.74486572898314, 40.7570300574023], [-73.7448646115155, 40.7570283466582], [-73.74486237136128, 40.757026632757416], [-73.74485676618775, 40.757024058357956], [-73.74485003174925, 40.757022335675316], [-73.74483543956013, 40.75701974086647], [-73.74481186189642, 40.757017126151005], [-73.74479277587083, 40.757014521381635], [-73.74478716195661, 40.75701365422342], [-73.74478155285772, 40.75701193285728], [-73.74477594221253, 40.75701021266016], [-73.74477145951205, 40.757007640743375], [-73.7447681003836, 40.757005070813264], [-73.74474344954679, 40.75698878704991], [-73.74472217336258, 40.756971657043756], [-73.74467627739422, 40.75693055636426], [-73.74464494262489, 40.75689973739264], [-73.7446359905721, 40.75689117586707], [-73.74463376024596, 40.75688690117124], [-73.74463152687576, 40.7568834780066], [-73.74462817997272, 40.75687749239859], [-73.74462819307169, 40.7568740757217], [-73.74462820289574, 40.75687151325582], [-73.74462822254384, 40.75686638832415], [-73.74462936531678, 40.75686126638481], [-73.7446406799881, 40.75683993785017], [-73.74464180595058, 40.75683908562516], [-73.74464294894216, 40.756833963686155], [-73.74464409259474, 40.75682884174865], [-73.7446441089695, 40.756824570357985], [-73.7446452569718, 40.756817738988104], [-73.7446453028102, 40.756805781875045], [-73.74464533555502, 40.75679724026632], [-73.74464542068948, 40.756775032619544], [-73.7446421825129, 40.75674085921853], [-73.74463894040585, 40.756707539524264], [-73.74464011025233, 40.75669558440013], [-73.74464352524502, 40.756683634085206], [-73.74464465907351, 40.756681074110936], [-73.74464918475132, 40.75667254296403], [-73.74465596716065, 40.75666145382896], [-73.74469086913759, 40.756640177067666], [-73.74469001514127, 40.75661324074209], [-73.74468986758575, 40.75660857161472], [-73.74468877720241, 40.756600027516434], [-73.74465748646857, 40.75655810497731], [-73.74465411927862, 40.75655724279255], [-73.74462653500422, 40.75655130464249], [-73.74462606107197, 40.75655120257331], [-73.74461483813911, 40.756548615205176], [-73.74460585993965, 40.75654688636107], [-73.74460137007021, 40.75654602168568], [-73.74455864030779, 40.756557885832535], [-73.74455292838134, 40.75658264466303], [-73.74454039038096, 40.75663044806491], [-73.7445502656967, 40.75669111478052], [-73.74455137593789, 40.75669453394865], [-73.74455908496117, 40.756734695287655], [-73.744560185375, 40.756740677424126], [-73.74456566802672, 40.75677571002285], [-73.74456887603034, 40.756817569649364], [-73.7445710218452, 40.75684405366969], [-73.74457308423663, 40.756891891121754], [-73.74457639642843, 40.756907272386385], [-73.7445819524476, 40.75692266030129], [-73.7445897571554, 40.75693805152646], [-73.7446009329801, 40.75695259717943], [-73.74461548062342, 40.7569671491338], [-73.74462443683731, 40.75697485712175], [-73.74462490978154, 40.75697521768243], [-73.74463451750677, 40.75698256693157], [-73.74464235954294, 40.756987708788095], [-73.74465468364045, 40.75699627778754], [-73.74469950605639, 40.7570245641607], [-73.74471071138478, 40.75703142173538], [-73.74471631220506, 40.75703570557416], [-73.74473870826283, 40.75705369278365], [-73.7447745258561, 40.757087082975666], [-73.74480809130256, 40.75712132355832], [-73.7448215019215, 40.75713929084582], [-73.74485052430722, 40.75718718683517], [-73.74486058801497, 40.75719916751141], [-73.74486618338649, 40.75720430487898], [-73.74487290409643, 40.75720944423588], [-73.74491660449456, 40.75723772854086], [-73.74491884704905, 40.75723858772495], [-73.74495919877508, 40.75726088540533], [-73.74497388924861, 40.75726953047292], [-73.7449883390321, 40.75727803277557], [-73.74499506563798, 40.75728146386926], [-73.74504887346743, 40.75730976932465], [-73.74506008019742, 40.75731662804068], [-73.74509033710218, 40.75733548612527], [-73.74510712943892, 40.757350044156034], [-73.74512056306564, 40.75736203176307], [-73.745125039926, 40.75736631242475], [-73.745148540614, 40.757389426971976], [-73.74516307822353, 40.757406542493584], [-73.74519549607847, 40.757447613163535], [-73.74521003022959, 40.75746558171702], [-73.7452234567032, 40.75747927756497], [-73.74524025695877, 40.75749212782685], [-73.74525817665554, 40.75750583360742], [-73.74527946383118, 40.757520400379555], [-73.74528282626937, 40.75752211675349], [-73.74528731383276, 40.75752383444244], [-73.74529292298591, 40.75752555628655], [-73.74529853606852, 40.75752642341801], [-73.74533783768734, 40.75752992584022], [-73.74535130665119, 40.75753251759941], [-73.7453569203959, 40.757533384729555], [-73.74536140249367, 40.75753595662189], [-73.74536588983982, 40.75753767430737], [-73.74536924923648, 40.75754024472283], [-73.74542635286744, 40.757588203300145], [-73.74547897707495, 40.7576327357487], [-73.74550361788225, 40.75765158081212], [-73.74555064800546, 40.757690121675985], [-73.7455663154504, 40.757705531372245], [-73.74558197157725, 40.75772350235585], [-73.7456110278219, 40.75776285771527], [-73.7456266711447, 40.75778424587238], [-73.7456423188386, 40.757804780488705], [-73.7456792232361, 40.75784756869152], [-73.74570608133453, 40.757874107240035], [-73.74573295575978, 40.75789637439206], [-73.74575984954205, 40.75791351710864], [-73.74576433167874, 40.75791608948764], [-73.74576881906094, 40.75791780715734], [-73.74578003900936, 40.7579212486236], [-73.74579238861907, 40.7579229853177], [-73.74580474105058, 40.75792386729598], [-73.74581822381136, 40.757923042325366], [-73.74583058928901, 40.7579205054465], [-73.74584183531493, 40.75791711355347], [-73.74585196056832, 40.7579128661413], [-73.74589923219948, 40.7578882001035], [-73.74592738556296, 40.75786947107443], [-73.74597807807304, 40.75783199944327], [-73.74599384573716, 40.757820931719834], [-73.74600622658913, 40.757814125105035], [-73.74601297697997, 40.75781157750125], [-73.74601859854921, 40.75780988095649], [-73.746024222978, 40.75780818559046], [-73.74602983803098, 40.75780819796979], [-73.74603433126282, 40.75780820787569], [-73.74603882515608, 40.757808217782866], [-73.7460421911072, 40.75780907942148], [-73.74604668174588, 40.75780994286928], [-73.74605453182136, 40.757813376879874], [-73.74606237384283, 40.75781851914108], [-73.74607581187087, 40.75782965309685], [-73.74610490620208, 40.757858758298426], [-73.7461463202189, 40.75789728603619], [-73.74616086056976, 40.75791354721772], [-73.74617203822314, 40.75792809271902], [-73.7461753788079, 40.75793578653575], [-73.74617871872883, 40.75794348135603], [-73.74618532398014, 40.757979371566336], [-73.74618866302863, 40.757987064876666], [-73.74619089673813, 40.757990487508565], [-73.74619312957277, 40.75799390846309], [-73.74619648775423, 40.75799733256716], [-73.74619984721016, 40.75799990195313], [-73.74620320407233, 40.75800332555147], [-73.74620768688935, 40.75800589891986], [-73.74621778416946, 40.75800933786992], [-73.74622339361433, 40.75801105799371], [-73.74622788360375, 40.758011922605704], [-73.74623013011656, 40.75801192755456], [-73.74625592955528, 40.75802137911002], [-73.74631196705487, 40.75805481402274], [-73.74630710944605, 40.75815046956326], [-73.74630110309532, 40.75825295380464], [-73.74629290506739, 40.75834091284919], [-73.74627011032777, 40.75842713197698], [-73.74619442433067, 40.758538859618106], [-73.74609973183355, 40.758626628049555], [-73.7460621494217, 40.7587615004492], [-73.74610201562086, 40.75891191914624], [-73.74616224371887, 40.759024799276894], [-73.74625836714088, 40.75915057154628], [-73.74635893029055, 40.759290872701186], [-73.74655378098826, 40.75945017403582], [-73.74672422976337, 40.75952742182279], [-73.74691154237048, 40.75960129137661], [-73.74708983971603, 40.75968282611382], [-73.74736655364313, 40.759879034440424], [-73.74749424153497, 40.75997668685211], [-73.7474971489094, 40.759981616662685], [-73.74754670154863, 40.76006563412159], [-73.74760477048451, 40.76015630091755], [-73.74765057016263, 40.76022387943766], [-73.74774348406547, 40.760308643293214], [-73.74790688416107, 40.76046872647574], [-73.7480344027219, 40.76061164876987], [-73.74815865904617, 40.76072637728021], [-73.74824810096803, 40.760838465418395], [-73.7482454950954, 40.76085038845037], [-73.7482389574376, 40.76088029909271], [-73.7482084978379, 40.760914398721546], [-73.74821281435773, 40.760961385107564], [-73.74824062871396, 40.761032340776104], [-73.74823023192417, 40.76110833840965], [-73.74821974793956, 40.76120739621181], [-73.74823056733841, 40.76131675001058], [-73.74825832786304, 40.761402225746664], [-73.74837456439464, 40.76155878963078], [-73.74847532850517, 40.761647841442766], [-73.74858298910182, 40.761695909285656], [-73.74872212469546, 40.76173806599188], [-73.7488690635061, 40.761796468669914], [-73.74902175447068, 40.761819009230464], [-73.74913505044145, 40.761861962688094], [-73.7492900714412, 40.76186230015056], [-73.74936203349068, 40.76184452034025], [-73.74938249132595, 40.76178135642719], [-73.74933672650815, 40.76170352992407], [-73.7493392273061, 40.761636058201745], [-73.74933054315699, 40.76155574870995], [-73.7492847562694, 40.76148390115628], [-73.74921977977574, 40.7614367811098], [-73.74917158863074, 40.76140678142459], [-73.74917394462378, 40.76137774482792], [-73.74947027461442, 40.76143988860852], [-73.74966102560238, 40.7614975308269], [-73.74979792102468, 40.76153797410411], [-73.75004042130583, 40.7615760827396], [-73.75018846125836, 40.7616404648094], [-73.75032282701994, 40.76175692013944], [-73.75046183009748, 40.76183494941578], [-73.75057049365302, 40.76191547482149], [-73.75063847963764, 40.76205911882312], [-73.75084802828285, 40.76219794405175], [-73.75098356953296, 40.76230073499874], [-73.75110899242155, 40.76240606640948], [-73.75123100279916, 40.76252249564248], [-73.75132609064228, 40.76262946906892], [-73.75142048789601, 40.76276169436681], [-73.7515099562405, 40.762949040571364], [-73.75153545083482, 40.76303855921119], [-73.75156943251743, 40.76316082612466], [-73.75156024509342, 40.76331573008709], [-73.75160045302414, 40.76343919180898], [-73.7516212179657, 40.763492759268495], [-73.75163503200241, 40.763528699851285], [-73.75163833199954, 40.76353629608098], [-73.75163834488852, 40.76353632576103], [-73.75163837349352, 40.76353639501102], [-73.75164899665232, 40.76355787419641], [-73.75165063764818, 40.76356119174191], [-73.75165082833455, 40.763561578636434], [-73.7516952345571, 40.763651827368705], [-73.7518283443928, 40.76380586056595], [-73.75197615773142, 40.76393259332168], [-73.75207014373261, 40.76403443876415], [-73.7521574815898, 40.76411150121125], [-73.75219219823434, 40.76414061642908], [-73.75222243034136, 40.76416715900465], [-73.75221773780626, 40.76422096091368], [-73.75225349976849, 40.76427057840176], [-73.75234326679305, 40.764298958896], [-73.75240147997198, 40.76435374973257], [-73.7524484210661, 40.764418765585695], [-73.7524785175615, 40.764482037465825], [-73.75251092750104, 40.76452737691871], [-73.75256704187835, 40.76454201880534], [-73.75266249865089, 40.76455076377027], [-73.75274102673858, 40.76457997404058], [-73.75281605035713, 40.76464590422408], [-73.75289327855934, 40.764722944411886], [-73.75298298856781, 40.764766697677715], [-73.75304571089994, 40.76481722743511], [-73.75307921070038, 40.76487196427665], [-73.75311373500155, 40.7649531830293], [-73.75314599997928, 40.76503781195535], [-73.75319227856545, 40.765101952761405], [-73.75321270194533, 40.765132346676744], [-73.75323764786424, 40.76516072229634], [-73.75326677589696, 40.76518669238562], [-73.75332826529235, 40.765267114094485], [-73.75338853072753, 40.7653339455862], [-73.75339682847972, 40.76535743094704], [-73.75341078980225, 40.765387042137355], [-73.75342969954757, 40.76541716951095], [-73.75345277791402, 40.76544728653655], [-73.75346684422311, 40.76546301168187], [-73.75346796389704, 40.7654638671222], [-73.75347120459557, 40.76546708872052], [-73.75347915705996, 40.76547499522476], [-73.75348713687973, 40.765483131298055], [-73.75349594446142, 40.76549211397729], [-73.75350218209317, 40.76549655404032], [-73.7535027027036, 40.765496924047376], [-73.75350496885727, 40.76549853681403], [-73.7535052704541, 40.765498787241235], [-73.75351274922001, 40.765504961846815], [-73.75355758134413, 40.76553324473846], [-73.75357662436602, 40.765547806322985], [-73.75359676377177, 40.765570057699804], [-73.75361689198797, 40.76559658817567], [-73.75361887109622, 40.76559925976317], [-73.75363589047707, 40.76562224392221], [-73.75365491524836, 40.76564192991895], [-73.7536593957098, 40.765645356702194], [-73.75366115798266, 40.765646367303766], [-73.75366387999607, 40.7656479282712], [-73.75367357800295, 40.76565417244392], [-73.75368517388588, 40.765661640433045], [-73.75369077667018, 40.76566592383144], [-73.75369215758916, 40.76566698018958], [-73.75369525780206, 40.765669348939326], [-73.75370754683831, 40.76568731326578], [-73.75370946721739, 40.76569067426458], [-73.75372317471823, 40.76571467893723], [-73.75372540254051, 40.765719808666475], [-73.75372586129843, 40.76572266530188], [-73.75372650076784, 40.76572664491773], [-73.753728648975, 40.765753127054154], [-73.75372941146722, 40.76575488201507], [-73.7537308774602, 40.76575825678467], [-73.7537314575656, 40.76576095067618], [-73.75373198134588, 40.76576338427885], [-73.7537546208494, 40.76579963528729], [-73.75375655148282, 40.76580272725988], [-73.75378449274987, 40.765840364315075], [-73.75381582683036, 40.765874602969355], [-73.75383791548944, 40.76589543549867], [-73.75384941236669, 40.7659062782456], [-73.753852845085, 40.76590852859029], [-73.75385725748721, 40.765911419470896], [-73.75386677763164, 40.76591733439259], [-73.75387519046984, 40.76592256193281], [-73.75387692703067, 40.76592355706362], [-73.7538796747829, 40.76592513349339], [-73.75388209534087, 40.76592760180443], [-73.75388303331701, 40.76592855787087], [-73.75393115954603, 40.765977347183544], [-73.7539457200029, 40.76598933597816], [-73.75397933654801, 40.76601247028503], [-73.75399278071055, 40.766022748423524], [-73.75400845052455, 40.76603815745188], [-73.75402298892796, 40.76605612487066], [-73.75403639591704, 40.76607665185295], [-73.75405983454807, 40.766117702460434], [-73.7540687588374, 40.766134803839336], [-73.75406990996136, 40.76613770902588], [-73.7540765503842, 40.76615446561802], [-73.75409428749936, 40.76621856488986], [-73.75409438750937, 40.76621886983374], [-73.75410206777033, 40.76624164351026], [-73.75410302014075, 40.76624383528004], [-73.75411097902656, 40.766262163065655], [-73.75412214720791, 40.766280123278335], [-73.75413696709579, 40.766297128508526], [-73.7541400449881, 40.766300661506705], [-73.75415172628783, 40.76631207437325], [-73.75416019515129, 40.76632034981886], [-73.75416058406073, 40.76632064599768], [-73.75418483942393, 40.766339193499206], [-73.75420482305684, 40.76635314434022], [-73.75421061235566, 40.766357184862485], [-73.75421846070479, 40.766361473025135], [-73.75422631000248, 40.76636490747495], [-73.75426781969234, 40.7663812241278], [-73.75427395377056, 40.76638474336995], [-73.75427678686661, 40.766386367717004], [-73.75428575309054, 40.766392366525565], [-73.7542880240036, 40.76639425537017], [-73.75431151258437, 40.766413774537455], [-73.75433389504231, 40.76643688478174], [-73.75435199344946, 40.76645969053854], [-73.75435290758911, 40.76646084037817], [-73.75436854227797, 40.76648564449461], [-73.754427699876, 40.76658997735722], [-73.75445786021571, 40.76664274408993], [-73.75450248682485, 40.76672082036144], [-73.75453245940645, 40.76677266996907], [-73.75453709317966, 40.766780685758185], [-73.75454235546341, 40.76678927381596], [-73.75458846135214, 40.76686450022992], [-73.75460968591979, 40.76689700433747], [-73.75463428056362, 40.766930368159684], [-73.75466224335983, 40.766963739651175], [-73.75469245300037, 40.766997115919565], [-73.75470700774542, 40.76701081303696], [-73.75472380440347, 40.767025369644536], [-73.75473151276402, 40.76703126304617], [-73.75480222531259, 40.767085326550436], [-73.75481634567822, 40.76709756139691], [-73.75481902377297, 40.767099883147836], [-73.75483357366191, 40.76711443378519], [-73.75487271796067, 40.76716234936266], [-73.75488500979354, 40.76718031356404], [-73.75488893674114, 40.7671882191101], [-73.7548939308534, 40.76719826891797], [-73.75491614552455, 40.76724764045222], [-73.75492624631949, 40.767270087181146], [-73.754945267647, 40.767303935292325], [-73.75496084794494, 40.7673316585225], [-73.75497199993241, 40.767353891708765], [-73.75498535207142, 40.76738893930633], [-73.75499531479272, 40.76742910516272], [-73.75499536929894, 40.76742938253471], [-73.75507210849031, 40.76753310678742], [-73.75507603383382, 40.767663748308834], [-73.75499605461913, 40.76784780377672], [-73.75495617473564, 40.76799105146965], [-73.75492911896265, 40.76801576419739], [-73.75492457714904, 40.768021104656974], [-73.75491896445862, 40.76802770096123], [-73.7549042883991, 40.768047315050715], [-73.75489184864901, 40.768069496881004], [-73.75488164924215, 40.76809339023432], [-73.75487256100014, 40.76812070533027], [-73.75487060374897, 40.7681292428303], [-73.75486571084737, 40.76815058431918], [-73.7548627188635, 40.7681803689903], [-73.75485987826801, 40.76820865361768], [-73.75485653531162, 40.76822609437051], [-73.75485529629613, 40.76823256109786], [-73.75485129960616, 40.768247537320136], [-73.75484960110137, 40.76825390205139], [-73.75484682303404, 40.768261426615666], [-73.75483258063379, 40.768299990854324], [-73.75482801752048, 40.76831877123044], [-73.75482801691055, 40.768318936912685], [-73.7548279986502, 40.7683238971604], [-73.75482798602786, 40.76832732589454], [-73.75482798293194, 40.76832816687006], [-73.75482908672076, 40.768333295356385], [-73.75483123007663, 40.768336576564344], [-73.75483243914007, 40.768338426952276], [-73.7548347461836, 40.76834231512126], [-73.75483802115825, 40.7683478340406], [-73.75485479639369, 40.76836836976145], [-73.75485605431479, 40.76837029647758], [-73.75486150013704, 40.768378633451896], [-73.7548624413177, 40.7683822640742], [-73.75486260862132, 40.76838290622344], [-73.7548632480079, 40.7683853772567], [-73.75486371578062, 40.76838717982988], [-73.75486371140651, 40.76838758992498], [-73.75486370005846, 40.76839145121471], [-73.75486256146147, 40.768395718535245], [-73.75486142307676, 40.768399988034055], [-73.75486084218902, 40.7684010797398], [-73.75485915829324, 40.76840425295842], [-73.75485577282537, 40.76840851717352], [-73.75485126381926, 40.76841277782529], [-73.75485002766149, 40.76841361835497], [-73.75484000164228, 40.76842044080652], [-73.75480509138609, 40.768442574811026], [-73.75480345733583, 40.76844411827146], [-73.75480058171519, 40.7684468349567], [-73.75479607269864, 40.768451096779025], [-73.75479533576191, 40.768451840702745], [-73.75479269036948, 40.76845450678226], [-73.75479042712017, 40.76845877221111], [-73.75478135898942, 40.768480960701346], [-73.75477459400017, 40.768506719555276], [-73.75476768394783, 40.768533035794846], [-73.75476068535333, 40.76854827014798], [-73.7547574915997, 40.768555220214914], [-73.75475315314952, 40.7685625861583], [-73.75474392479494, 40.76857825384548], [-73.75473150442745, 40.768595310733495], [-73.75472181615622, 40.76860488685348], [-73.75471684573888, 40.768609800372744], [-73.75470219963017, 40.76862087283543], [-73.7546923613104, 40.768626915000965], [-73.75468418375833, 40.768631938623905], [-73.75466855538552, 40.76863815022539], [-73.75466280690638, 40.768640433597966], [-73.75464656395906, 40.76864533466979], [-73.75464031279178, 40.768647219095804], [-73.75463798636613, 40.76864763513515], [-73.75461670478812, 40.76865143973457], [-73.75460658949804, 40.768652273915315], [-73.75459423181064, 40.768652247594744], [-73.75458524725447, 40.768651372733466], [-73.75455307361956, 40.768649145119234], [-73.75454705986645, 40.76864872990984], [-73.75454548351453, 40.768648724876286], [-73.754538071276, 40.76864871076057], [-73.75453734347198, 40.76864870921004], [-73.75453694839094, 40.76864870836834], [-73.75452908086366, 40.768649544650586], [-73.75452766896971, 40.76864987703017], [-73.7545110901395, 40.76865377824045], [-73.75450838321264, 40.76865418307988], [-73.75450546904293, 40.76865461930755], [-73.75449196913841, 40.76865971500431], [-73.7544891892807, 40.76866107492285], [-73.75447283530931, 40.76866907061462], [-73.75445332042013, 40.76867994001487], [-73.75445144581661, 40.76868098339416], [-73.75444506541723, 40.76868540471995], [-73.7544379299309, 40.76869035097133], [-73.75442666048079, 40.76869972165972], [-73.75441753972149, 40.768707995776516], [-73.75441538875721, 40.76870994706131], [-73.75440748905719, 40.76871932610307], [-73.75440071107668, 40.768729561082004], [-73.75439618245464, 40.768738947811386], [-73.75439547239391, 40.76874471037513], [-73.75439502293871, 40.76874834004711], [-73.75439438120904, 40.76875122834032], [-73.7543938826934, 40.76875346274863], [-73.75439432480357, 40.768755170784054], [-73.75439498828825, 40.768757735853434], [-73.75439497883637, 40.76876029881814], [-73.75439497838663, 40.76876042077632], [-73.7543949779937, 40.76876052732225], [-73.75439497568617, 40.768761153028116], [-73.75439609110637, 40.76876371788809], [-73.75439716604436, 40.76876495149782], [-73.75439832787339, 40.76876628463585], [-73.75440056618083, 40.76876885188936], [-73.7544039271558, 40.76877142153601], [-73.75440729062186, 40.76877313646868], [-73.75441292701873, 40.76877621605693], [-73.75441513992966, 40.76877742461781], [-73.7544263612727, 40.76878086523446], [-73.7544387095356, 40.768783454035166], [-73.75444246049993, 40.768783462029525], [-73.75444320350958, 40.76878346361305], [-73.75445218896665, 40.76878433748228], [-73.75446197302739, 40.768784358333434], [-73.75446451187187, 40.76878436156604], [-73.75446454713334, 40.76878435996597], [-73.75447054668635, 40.76878396817526], [-73.75460276521305, 40.76877526190596], [-73.75467018424933, 40.76877284350026], [-73.75467355401318, 40.768772850675404], [-73.75467639031449, 40.7687733958143], [-73.75467804330147, 40.76877371327814], [-73.7546800519135, 40.76877415513362], [-73.75468590272664, 40.768775438948126], [-73.75469052084651, 40.76877745792352], [-73.75469375453986, 40.76877887236429], [-73.75470047988182, 40.768783156928265], [-73.7547051792433, 40.76878615158182], [-73.75470720411681, 40.76878744316481], [-73.75471167921705, 40.768792577153974], [-73.75471391687849, 40.76879514389752], [-73.7547150263036, 40.76879856228822], [-73.7547150243261, 40.76879909920572], [-73.75471501686158, 40.768801125923034], [-73.75471586026373, 40.76880306549521], [-73.75471613163991, 40.768803689103244], [-73.75471580642598, 40.76880769195444], [-73.75471495394928, 40.768818207440624], [-73.75471296984013, 40.76884132502884], [-73.75471143383741, 40.768859199997806], [-73.75471115070579, 40.76893607268946], [-73.75471113632253, 40.768939977864314], [-73.754711122394, 40.768943759573354], [-73.75471342579756, 40.768949656879414], [-73.75471446004603, 40.768952308342094], [-73.75473118097804, 40.768988218353776], [-73.75473175595867, 40.7689922626574], [-73.75473227688181, 40.76899590763075], [-73.75473311585844, 40.769001801986654], [-73.7547333705779, 40.76900359807563], [-73.75472987183133, 40.76903861032414], [-73.75472073687521, 40.76907873671094], [-73.75469682582235, 40.76916495330184], [-73.75468757418824, 40.76919361460781], [-73.75467864238544, 40.76922128852382], [-73.75467753501032, 40.76922867776093], [-73.75467633797275, 40.76923665968261], [-73.75467516247359, 40.7692511768507], [-73.75467563707237, 40.76926171442707], [-73.75467619953538, 40.76927424106258], [-73.7546820222256, 40.76930279223348], [-73.75468613309415, 40.769322948032354], [-73.75469736216039, 40.76940669722155], [-73.7546981632071, 40.769412660014815], [-73.7546992140291, 40.769431452837644], [-73.75469914166756, 40.769451098490784], [-73.75469444943913, 40.76950490045573], [-73.75468301130525, 40.76956039582006], [-73.75468068508523, 40.769581743934395], [-73.75468172347436, 40.76960480865059], [-73.75468418709654, 40.76962739493064], [-73.75468498470264, 40.769634710826296], [-73.7546863132379, 40.76964510966561], [-73.75469044476876, 40.76967742908769], [-73.75469594529733, 40.769709044463255], [-73.7547019742048, 40.76972864329839], [-73.75470593650574, 40.769741522945246], [-73.75472038781855, 40.76978340730226], [-73.75472483218735, 40.76979708338937], [-73.75472685555812, 40.76980291978894], [-73.75474706538549, 40.76986119159111], [-73.75475122821963, 40.769872157507734], [-73.75475485442077, 40.76988170819281], [-73.75476377580713, 40.769899663549594], [-73.75478053634816, 40.76992446948909], [-73.75481298260995, 40.76996126716663], [-73.75487228166313, 40.77002801719697], [-73.75490125042909, 40.77008055843747], [-73.75520665378217, 40.77067505360193], [-73.75533279459194, 40.77099815465322], [-73.75540415008778, 40.7709818761834], [-73.75539975859014, 40.77097006430209], [-73.75551295786343, 40.770945013956315], [-73.75553498728895, 40.77098552649437], [-73.75540180261751, 40.77101727887619], [-73.75539741111736, 40.77100546716245], [-73.75534216255899, 40.77102215324632], [-73.75540541388642, 40.77115189018926], [-73.75542237803558, 40.771186687391356], [-73.75550243961897, 40.77128250909249], [-73.7555614028682, 40.77144869926292], [-73.7555733264932, 40.77152912592269], [-73.75550146510625, 40.77159968041305], [-73.75542423703571, 40.77164213534985], [-73.75525555666596, 40.7716574387015], [-73.75508267713634, 40.77171322899481], [-73.75510753193235, 40.77183111826108], [-73.7551141490279, 40.771830713509175], [-73.75511523562321, 40.77183490648697], [-73.75507386869062, 40.771840266849175], [-73.75507498743053, 40.77183607855887], [-73.7550805011998, 40.77183567146361], [-73.75505920386043, 40.771719174693374], [-73.75501054255479, 40.771737511519824], [-73.75485465862842, 40.77179791526066], [-73.75470604943379, 40.771870737751996], [-73.75438074757537, 40.772041271642195], [-73.75429600282433, 40.7721303370364], [-73.75419859120392, 40.77220176666602], [-73.75403331561613, 40.77233837754101], [-73.75397521229509, 40.772383121369145], [-73.75392578468146, 40.772419465504065], [-73.75387756050716, 40.772454887276105], [-73.7538086391264, 40.772504431493566], [-73.75372221291418, 40.772570217951014], [-73.75363974518132, 40.77263163450949], [-73.75357000906136, 40.77269461612923], [-73.75350609831754, 40.77276955713253], [-73.75345192598736, 40.77286268480925], [-73.75340985812166, 40.772959174816684], [-73.75338994029593, 40.773056448326535], [-73.75336691999294, 40.77320784776336], [-73.7533923720637, 40.773272201808666], [-73.75347847944079, 40.77348991346416], [-73.75356167498403, 40.77366488473272], [-73.7536224771741, 40.77382223841322], [-73.75363972748997, 40.77386687964439], [-73.75367969121629, 40.77397297882968], [-73.75375277248573, 40.774055560926136], [-73.75380768158755, 40.77414573010844], [-73.75383615718921, 40.77422433743274], [-73.75391367176762, 40.77427246809169], [-73.75395573939913, 40.77430620907517], [-73.75398027625992, 40.77439672509203], [-73.75400596724323, 40.77446940655343], [-73.75402061841987, 40.77451085549081], [-73.75410406104969, 40.77471047414804], [-73.7541211549045, 40.774917483321616], [-73.75414415458538, 40.775044679046815], [-73.75418344182958, 40.77511851809306], [-73.7541895302817, 40.77512995803968], [-73.75427404182139, 40.775184235667176], [-73.75424149999385, 40.77526683036528], [-73.75433349266498, 40.77541954835593], [-73.75442248917767, 40.77554919354539], [-73.75448302120184, 40.775629023427626], [-73.75454560558667, 40.77568395070161], [-73.754571582022, 40.77570674904423], [-73.75457996749098, 40.775718976040814], [-73.7546604244237, 40.77583628448718], [-73.754709121297, 40.77585519732232], [-73.75475233563776, 40.77587791923645], [-73.75480097120251, 40.77589859528199], [-73.75480082727547, 40.77593768284009], [-73.75481957405265, 40.77599121013415], [-73.75483825982116, 40.776061197070916], [-73.75485431476889, 40.77611060485996], [-73.75485691445691, 40.776139412150236], [-73.75488688128335, 40.77618932212071], [-73.7549295876917, 40.77624654271092], [-73.75501053125387, 40.77631254606015], [-73.75509684051448, 40.776377323742835], [-73.75513664233078, 40.77640719547497], [-73.75516154144688, 40.77645893085605], [-73.75518575394315, 40.7764980708302], [-73.75517697141768, 40.776543673716674], [-73.75510694138278, 40.77658842240476], [-73.75506630223659, 40.77660067868264], [-73.75502286717963, 40.77663761615085], [-73.75497549376992, 40.7766984471819], [-73.75496848490822, 40.7767074476952], [-73.7549385058147, 40.77676498578115], [-73.75489578230594, 40.776829846623684], [-73.75488054179407, 40.77684806875527], [-73.75486883106046, 40.77686774160918], [-73.75486088379957, 40.77688847260641], [-73.75485685860569, 40.77690984805278], [-73.75485683580645, 40.77693144139307], [-73.75485996015284, 40.7769477275573], [-73.75486616959907, 40.77696349456987], [-73.75487533188723, 40.77697840659675], [-73.75488725186452, 40.77699214601451], [-73.75490167563905, 40.777004420176], [-73.75491970109897, 40.777015725276094], [-73.75493983826522, 40.777024738326176], [-73.75498193747218, 40.77704380336285], [-73.75497732886075, 40.777063064882405], [-73.75496863967113, 40.777081494448325], [-73.75495610373531, 40.77709859610114], [-73.75494005840592, 40.777113909617135], [-73.75492093547855, 40.77712702289251], [-73.75491087095614, 40.77713571502858], [-73.7549026611194, 40.77714546896862], [-73.75489649670558, 40.777156058102484], [-73.7548925209316, 40.77716723641653], [-73.75489082616622, 40.777178744208726], [-73.75489145178453, 40.777190314122066], [-73.75489438325314, 40.77720167735625], [-73.75483577692417, 40.777466986201695], [-73.75484180870602, 40.77748504846197], [-73.754849296987, 40.77750747469179], [-73.75481517188274, 40.7776130205783], [-73.75481322893425, 40.77761903230558], [-73.75541831287357, 40.77763574482788], [-73.75542434578475, 40.777583945671296], [-73.75551781604716, 40.777584144019926], [-73.75551737581792, 40.77770404836418], [-73.75542002110872, 40.77770088125016], [-73.75542214211723, 40.77765351641497], [-73.75481217058518, 40.77763599592199], [-73.75478633943226, 40.77764784602946], [-73.754710055367, 40.77767238421957], [-73.75468724014247, 40.77768181762751], [-73.75466391587001, 40.77769477151285], [-73.75464068611555, 40.77771048072842], [-73.75460152243082, 40.77773986165084], [-73.75457883060362, 40.77775777932316], [-73.75455791105837, 40.77777659066429], [-73.75448452828304, 40.777904467981585], [-73.75464981317504, 40.777992106294526], [-73.7544419628204, 40.77812515653839], [-73.75437336549648, 40.77826269398068], [-73.75430183540871, 40.778406111489865], [-73.75430006363402, 40.778417615914684], [-73.75428865261564, 40.778517935169106], [-73.75428214069518, 40.778558516029946], [-73.75427379768243, 40.77859495944767], [-73.75426250967827, 40.778632963288175], [-73.754248170366, 40.77867296925754], [-73.75423069482916, 40.77871529279238], [-73.75412244438803, 40.77897174125878], [-73.75411171878478, 40.77902456898705], [-73.75413143029364, 40.77914672865191], [-73.75412964083071, 40.77938414323761], [-73.75402624009541, 40.779603879394756], [-73.75393275467012, 40.77976261058041], [-73.75390659784934, 40.77977871026392], [-73.75353040031737, 40.78023400238808], [-73.75300812549725, 40.780866075188506], [-73.75299839296423, 40.781289489522116], [-73.75274786895811, 40.7815180842781], [-73.75245962687079, 40.7817810905684], [-73.75080593606877, 40.782893378833954], [-73.75029101900083, 40.7824829202005], [-73.74706767699601, 40.780545532125686], [-73.7452105881078, 40.7793265500935], [-73.74412314584049, 40.77863865777706]]]}}, {\&quot;id\&quot;: \&quot;64\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 65, \&quot;Shape_Leng\&quot;: 0.0446070683658, \&quot;Shape_Area\&quot;: 8.1803882541e-05, \&quot;zone\&quot;: \&quot;Downtown Brooklyn/MetroTech\&quot;, \&quot;LocationID\&quot;: 65, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98712491499988, 40.70063447999997], [-73.98705765100006, 40.70063138099992], [-73.9869230459999, 40.70063356299989], [-73.98679382899994, 40.7006332229999], [-73.986798143, 40.700405223999915], [-73.98679868199991, 40.70019229799991], [-73.98680917799996, 40.70007095599988], [-73.98681513199986, 40.69993433099993], [-73.98686354799999, 40.69922012199989], [-73.98694749699983, 40.69873467399986], [-73.98696892299995, 40.698503613999954], [-73.98615985099988, 40.698478503999915], [-73.98584009799997, 40.69845759999986], [-73.98571222099984, 40.6984492459999], [-73.98557305399999, 40.69844703999995], [-73.98537892999997, 40.69844056799989], [-73.98496067199994, 40.69844496199991], [-73.98399562199991, 40.698413970999916], [-73.98314891699987, 40.69838165699989], [-73.98305147099988, 40.69837793399991], [-73.98305797599978, 40.698296076999945], [-73.98311793999989, 40.697542042999935], [-73.98227354299986, 40.69750629999991], [-73.98220436299987, 40.69750337199986], [-73.98210986499997, 40.69749936799996], [-73.9820190099999, 40.697496579999886], [-73.98050926199988, 40.69744627499991], [-73.9804096149999, 40.696559343999915], [-73.98040269799995, 40.6965021049999], [-73.98039561699981, 40.69644348999992], [-73.98038723500002, 40.696382911999926], [-73.98037063399991, 40.69626304999989], [-73.9803568289999, 40.69617751699992], [-73.98031019799991, 40.695905994999876], [-73.9802635679999, 40.69563447299992], [-73.98024270299999, 40.69545652899992], [-73.98021990699989, 40.6952871029999], [-73.9801557449999, 40.694810117999964], [-73.98013518099992, 40.694698016999936], [-73.98009475099997, 40.694587003999835], [-73.9800347509999, 40.69448012199993], [-73.97995651799985, 40.69438029499986], [-73.97986236999992, 40.694290091999946], [-73.97975539199989, 40.69421147699993], [-73.97961647699987, 40.694115582999935], [-73.97961635799989, 40.6941155019999], [-73.97961626399996, 40.69411542099993], [-73.9794907449999, 40.69400713899989], [-73.97949061399991, 40.69400703099989], [-73.97949049699993, 40.69400690499993], [-73.97938094200002, 40.69388775699988], [-73.9792896699999, 40.69375999399987], [-73.97928957399992, 40.69375986699991], [-73.97928950399996, 40.69375974199993], [-73.97921815699976, 40.69362600299992], [-73.97921806199986, 40.69362583099995], [-73.97921799199985, 40.69362565099988], [-73.97916718399999, 40.69348832299992], [-73.98011299200002, 40.6935238809999], [-73.98098333199992, 40.69355661699993], [-73.98147150299985, 40.693574934999965], [-73.98154756999999, 40.69357778999993], [-73.9817531689998, 40.69358338499997], [-73.9822668969999, 40.693604775999866], [-73.98234987399988, 40.69360788799985], [-73.98242892099991, 40.693610852999925], [-73.98251122999989, 40.69361433399992], [-73.98253983699992, 40.693002615999944], [-73.98175888999991, 40.692955172999895], [-73.98179025899985, 40.69202541599988], [-73.98178907299996, 40.691644867999905], [-73.98206215699987, 40.69131209099991], [-73.98213180199994, 40.69122723699989], [-73.98150118599992, 40.68998815499986], [-73.98147568199991, 40.689930943999876], [-73.98157420299987, 40.68993518299988], [-73.98276720099986, 40.68998648099994], [-73.98313467299995, 40.690002276999884], [-73.9835048569999, 40.69000570599997], [-73.98372011099993, 40.69000671899992], [-73.9840703399998, 40.69014307899988], [-73.98443216299995, 40.690292171999936], [-73.98510411999996, 40.69056114499992], [-73.98536391899995, 40.69066661299989], [-73.98633134999982, 40.69105050999989], [-73.98646436299995, 40.69110361099993], [-73.98734787400004, 40.69145766799992], [-73.9882070139999, 40.69180695999995], [-73.98893356299986, 40.69208664099989], [-73.98902944799994, 40.69212386099992], [-73.98910541699992, 40.69215331399992], [-73.98947238599989, 40.69229549399994], [-73.99066626299994, 40.69249717699989], [-73.99097186899995, 40.69254879999995], [-73.99085041499994, 40.6927982509999], [-73.99072895999997, 40.693047700999905], [-73.9905879449999, 40.693391378999905], [-73.99045286499987, 40.693720583999934], [-73.99044474099998, 40.69382825099991], [-73.99066605599978, 40.69456882399993], [-73.99080803800004, 40.69502713399987], [-73.99115539099992, 40.696196475999926], [-73.99118780399986, 40.696287414999894], [-73.99120620999996, 40.69635779799992], [-73.99128413800005, 40.69658820999993], [-73.99136812199991, 40.69701375299993], [-73.99142289799994, 40.69778099299988], [-73.99143347099985, 40.69828185899997], [-73.99142848599986, 40.6984190989999], [-73.99141799499986, 40.69855615899995], [-73.991402007, 40.698692910999945], [-73.99138053899995, 40.6988292269999], [-73.99135360999992, 40.698964980999925], [-73.99132124499982, 40.69910004499998], [-73.99128347399984, 40.699234293999915], [-73.99124033199993, 40.69936760199986], [-73.9910295809998, 40.699847169999956], [-73.99084157899988, 40.700281256999844], [-73.99082272099989, 40.7003547539999], [-73.99081766499997, 40.70046229299989], [-73.99083516199983, 40.7005697619999], [-73.99087453800003, 40.70067311699993], [-73.99093201799984, 40.7007662159999], [-73.99087002799989, 40.70076967799992], [-73.99038407800006, 40.70074858499989], [-73.99025489399995, 40.70074725899985], [-73.99013277299997, 40.7007393779999], [-73.98997709599989, 40.700738283999925], [-73.98972975399985, 40.70073504399989], [-73.98881846999987, 40.70071191899989], [-73.98866705299986, 40.70070499699995], [-73.98774282899993, 40.700662955999924], [-73.98717933299986, 40.700636986999925], [-73.98712491499988, 40.70063447999997]]]}}, {\&quot;id\&quot;: \&quot;65\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 66, \&quot;Shape_Leng\&quot;: 0.0546334593634, \&quot;Shape_Area\&quot;: 0.000108378855948, \&quot;zone\&quot;: \&quot;DUMBO/Vinegar Hill\&quot;, \&quot;LocationID\&quot;: 66, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.97906084869959, 40.7059460290057], [-73.97924508744678, 40.705548389137], [-73.97912179285028, 40.70552703403614], [-73.9793276249999, 40.70474627599989], [-73.97960292799985, 40.704176399999916], [-73.97998854, 40.703541057999935], [-73.98022432, 40.703063323999885], [-73.9806490779999, 40.70156087299994], [-73.98074079499993, 40.70127730999996], [-73.98040482499984, 40.700699005999915], [-73.98041744299996, 40.700518152999926], [-73.98044078599986, 40.700183630999895], [-73.98046217199987, 40.69970315799986], [-73.98048077899998, 40.6993727139999], [-73.98048604199988, 40.69927922799994], [-73.98054419199988, 40.69824651199988], [-73.98050926199988, 40.69744627499991], [-73.98201901099986, 40.69749657999987], [-73.98210986499997, 40.69749936799996], [-73.98220436399998, 40.69750337199986], [-73.98227354299996, 40.697506300999926], [-73.983117941, 40.69754204299991], [-73.98305797499987, 40.69829607699988], [-73.98305147099988, 40.69837793399991], [-73.98314891699982, 40.6983816579999], [-73.98399562199991, 40.698413970999916], [-73.98496067199994, 40.69844496199991], [-73.98537892999997, 40.69844056799989], [-73.98557305399999, 40.69844703999995], [-73.98571222099984, 40.6984492459999], [-73.98584009799997, 40.69845759999986], [-73.98615984999995, 40.698478503999915], [-73.98696892299995, 40.698503613999954], [-73.98694749699983, 40.69873467399986], [-73.98686354799999, 40.69922012199989], [-73.98681513199986, 40.69993433099993], [-73.98680917799996, 40.70007095599988], [-73.98679868199991, 40.70019229799991], [-73.98679814199983, 40.70040522399987], [-73.98679382799996, 40.700633222999954], [-73.9869230459999, 40.70063356299989], [-73.98705765100006, 40.70063138099992], [-73.98712491499988, 40.70063447999997], [-73.98717933299986, 40.700636986999925], [-73.98774282899993, 40.700662955999924], [-73.98866705299986, 40.70070499699995], [-73.98881846899985, 40.70071191899997], [-73.98972975399985, 40.70073504399989], [-73.98997709599989, 40.700738283999925], [-73.99013277299997, 40.7007393779999], [-73.99025489399995, 40.70074725899985], [-73.99038407800006, 40.70074858499989], [-73.99087002799989, 40.70076967799992], [-73.99093201799984, 40.7007662159999], [-73.99126294499995, 40.701027101999905], [-73.99193644899997, 40.701556408999856], [-73.99202772899994, 40.70162814199991], [-73.99206681900003, 40.70165885999988], [-73.9921106779999, 40.701693442999925], [-73.99221871100002, 40.70177257799986], [-73.99232767899991, 40.70185536999985], [-73.99261204999985, 40.702061128999915], [-73.99286016199979, 40.70220276699991], [-73.99325388199995, 40.702411970999876], [-73.99380996599997, 40.70267441199997], [-73.99417681200005, 40.702824653999855], [-73.99444009399991, 40.702909269999964], [-73.99470923300002, 40.702993885999916], [-73.99490815999987, 40.7030473409999], [-73.99504592724139, 40.70313183989976], [-73.99544564312069, 40.70327530547179], [-73.99529346700928, 40.70355406589793], [-73.9949820331283, 40.7033817155352], [-73.99480038274874, 40.703291958141975], [-73.99466290343602, 40.703430608056536], [-73.99485765933736, 40.70356613852609], [-73.99499542533941, 40.70365056321164], [-73.99488239902435, 40.703788025837355], [-73.99491043069509, 40.703797315958745], [-73.99492964609256, 40.70377131508382], [-73.99502925916443, 40.703808200868025], [-73.99488204726403, 40.70400865389511], [-73.99483637435264, 40.70398633908107], [-73.99476934191567, 40.70395289495363], [-73.99471424235146, 40.70399668906091], [-73.99477158125163, 40.70404936037442], [-73.99479231460045, 40.704068405633734], [-73.99479231299986, 40.70408889470715], [-73.99477286162535, 40.70410454169924], [-73.99469807470796, 40.704164700797286], [-73.99477614353454, 40.70424586105244], [-73.99470229068396, 40.704292531913545], [-73.99463603408383, 40.70433440342858], [-73.99456978950866, 40.70437626401652], [-73.99386341031877, 40.704556007433], [-73.99380687248414, 40.704539613214074], [-73.9937815542649, 40.70446894454372], [-73.993774572078, 40.70444945740879], [-73.9936933612927, 40.70447612883778], [-73.99368792224479, 40.70447791421154], [-73.99358606975355, 40.704509118218105], [-73.99362643916744, 40.704595244657405], [-73.99350881403605, 40.70462350527397], [-73.99280104228988, 40.704634023927845], [-73.99269135574991, 40.70462984994532], [-73.99251210682041, 40.70469411255762], [-73.99230833787269, 40.7046900017427], [-73.99212703535072, 40.70468964203349], [-73.99212100639093, 40.70439620157788], [-73.99195715431195, 40.704200677853294], [-73.99186159189317, 40.70408664210433], [-73.99141794782705, 40.70400408902072], [-73.99094755350794, 40.704032442139194], [-73.99071473114778, 40.70435137954312], [-73.99054617998553, 40.704416167501705], [-73.9903076849381, 40.704839880601966], [-73.99028496035659, 40.70486642939217], [-73.99022721196006, 40.70493404448709], [-73.99009111393421, 40.7049434632891], [-73.98949358971352, 40.70480903812361], [-73.98934734717507, 40.70472969170266], [-73.98920046436149, 40.704723896988796], [-73.98906989652578, 40.704705914698266], [-73.98898897757786, 40.70469035678166], [-73.9886972330476, 40.704564578776804], [-73.9884074480715, 40.704554500840814], [-73.98830332208532, 40.70454046895503], [-73.98828999111284, 40.70507065950018], [-73.98795676491503, 40.70513421741247], [-73.98726969301138, 40.70517572069416], [-73.98686320660372, 40.70515985694144], [-73.98681551756646, 40.705147146367295], [-73.9867708111665, 40.70512922547279], [-73.98673006395875, 40.70510648571843], [-73.98669416601165, 40.705079423826106], [-73.98666390146528, 40.70504863092951], [-73.98663993140148, 40.705014779659855], [-73.9866227794053, 40.704978609454166], [-73.98652973012089, 40.70497909917376], [-73.98642911608661, 40.70506917993066], [-73.98643429826662, 40.70534860741953], [-73.98474329943133, 40.70554290726692], [-73.9840214979145, 40.70559863478224], [-73.98343806260941, 40.705644094923855], [-73.98342627521598, 40.70557722117468], [-73.98340650315147, 40.70546637083022], [-73.98336819889047, 40.70546106503822], [-73.98326398719114, 40.70548506633028], [-73.98308639129395, 40.705477090851126], [-73.98308986582964, 40.70551154191292], [-73.98283552150646, 40.705555807198955], [-73.98274161892988, 40.70557244126629], [-73.98274508079308, 40.70555270993459], [-73.98274859333847, 40.705532691119664], [-73.98245956886106, 40.705508797112664], [-73.98245898620758, 40.705542414486125], [-73.98237340600002, 40.70554334999991], [-73.98232944175258, 40.705552033831964], [-73.98092510305972, 40.705369255100244], [-73.98090634668807, 40.7059060592102], [-73.98073921101802, 40.70585303034286], [-73.98022034622862, 40.70584764123357], [-73.98023778333459, 40.705760192228695], [-73.97956222047334, 40.70573887396689], [-73.97955873010817, 40.705765374298394], [-73.97933238122667, 40.705760033226255], [-73.97928362082712, 40.70578387584555], [-73.97927661710943, 40.705911077051084], [-73.97921742108453, 40.70590046607558], [-73.97918606171815, 40.70595876205], [-73.97905429658508, 40.70596017019387], [-73.9790576702781, 40.70595288914233], [-73.97906084869959, 40.7059460290057]]]}}, {\&quot;id\&quot;: \&quot;66\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 67, \&quot;Shape_Leng\&quot;: 0.0997470781551, \&quot;Shape_Area\&quot;: 0.000394282272487, \&quot;zone\&quot;: \&quot;Dyker Heights\&quot;, \&quot;LocationID\&quot;: 67, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.0109702639999, 40.63068186899988], [-74.01000340799995, 40.630113088999906], [-74.00922358699998, 40.63063393399994], [-74.0084560119999, 40.631150269999914], [-74.00773968299988, 40.63163008999991], [-74.00702302499997, 40.63210999499996], [-74.00633870699993, 40.63169362599995], [-74.00413727999998, 40.630363965999905], [-74.00368597199991, 40.63009178099986], [-74.00306153999993, 40.6297151749999], [-74.00193011399998, 40.629032766999885], [-74.00222793499994, 40.62875116999988], [-74.00251454799998, 40.62847420999986], [-74.00031369499995, 40.62714458299991], [-73.99811614300002, 40.625815706999944], [-73.99724067099987, 40.62528868699994], [-73.99748403999989, 40.624519845999934], [-73.99771358999998, 40.62368026999996], [-73.99932090299998, 40.62465524699996], [-73.99994665000001, 40.624050621999864], [-74.00052987499996, 40.623489938999946], [-74.00120222399994, 40.62284271199989], [-74.00169380199993, 40.622372426999966], [-74.00227586299998, 40.621814273999874], [-74.00285701599996, 40.621253642999896], [-74.0034355699999, 40.62069540399994], [-74.00401906899995, 40.62013618899991], [-74.00459907, 40.619576852999955], [-74.00522665999992, 40.618973153999875], [-74.00585319899992, 40.61837047699991], [-74.00643394999992, 40.617814716999874], [-74.00701531599991, 40.6172539459999], [-74.00759806899993, 40.61669446099994], [-74.00817687599992, 40.61613318099995], [-74.00876039999996, 40.61557582299988], [-74.00934164499988, 40.615015095999865], [-74.0099237199999, 40.61445664299991], [-74.01050403599997, 40.613896610999866], [-74.01108648099991, 40.61333904399986], [-74.01171201499994, 40.61273502899992], [-74.01348255899993, 40.61103739799988], [-74.01522379399994, 40.6093563839999], [-74.01701910199995, 40.60765441699994], [-74.0162363669999, 40.60723326599993], [-74.01549854999998, 40.606841523999925], [-74.01640553099998, 40.605975924999875], [-74.01671283899998, 40.60568263499987], [-74.0172836679999, 40.60513782499993], [-74.01746711399991, 40.604965104999906], [-74.01750868599993, 40.604850496999866], [-74.01804702599995, 40.604365734999874], [-74.01811904999991, 40.60431522299989], [-74.01817646699998, 40.604252608999936], [-74.01821458599989, 40.60418195799988], [-74.01823145099998, 40.604108472999926], [-74.018660218, 40.60364106799989], [-74.0186913569999, 40.60360792399995], [-74.01909859999992, 40.60373226399985], [-74.01912316599994, 40.60373976999991], [-74.019189715, 40.60376183999993], [-74.01924239499986, 40.60377850099991], [-74.0205358359999, 40.60419641799992], [-74.02129949199998, 40.60442832299987], [-74.02139467199993, 40.604493997999924], [-74.02122508399991, 40.604738061999974], [-74.02078540899996, 40.60567368599989], [-74.02247769499994, 40.60667421599987], [-74.02150602899994, 40.60782209899992], [-74.02430437599996, 40.60945696999991], [-74.02439534399993, 40.60954853399993], [-74.02447207599994, 40.60965008299994], [-74.02453195999996, 40.60975959499989], [-74.02457307699996, 40.6098745279999], [-74.02459441699996, 40.60999204099989], [-74.02459593799989, 40.61010922499989], [-74.0245785549999, 40.610223301999916], [-74.02478376299999, 40.60969962899984], [-74.02497932499995, 40.609741974999906], [-74.02710660599995, 40.61024395599991], [-74.02637609099996, 40.61245060299993], [-74.02653228199998, 40.61242537099991], [-74.02754297299998, 40.61293718299988], [-74.02736880500001, 40.61323451599991], [-74.02651463099991, 40.61467032699992], [-74.02624732399988, 40.61510478099994], [-74.02607013199996, 40.615486666999885], [-74.02574989099996, 40.616058222999904], [-74.02525327199992, 40.616678457999946], [-74.02462461299996, 40.61738902399985], [-74.02387367099986, 40.618259319999865], [-74.02363350499998, 40.61853764799987], [-74.02287598699992, 40.61946614799993], [-74.02226919899991, 40.620109624999934], [-74.02172925499997, 40.6206794519999], [-74.02167353899998, 40.62073479999989], [-74.02117792099988, 40.621252195999865], [-74.02090368299993, 40.62152616599993], [-74.02062330999992, 40.62180625199994], [-74.02008667300001, 40.62242095199986], [-74.01970491599991, 40.6221849649999], [-74.01938702899992, 40.62289181899993], [-74.01907578299992, 40.62361467399988], [-74.0189099719999, 40.62408698799987], [-74.0187518069999, 40.62431751099996], [-74.01784193399993, 40.626590693999944], [-74.01722288099991, 40.62810068899994], [-74.01696955099997, 40.628728785999925], [-74.0169264479999, 40.62883563899991], [-74.01664336499988, 40.62957607899994], [-74.01634322399995, 40.630285595999915], [-74.01604820399999, 40.631032888999876], [-74.01574804399996, 40.63176426899986], [-74.01542409899997, 40.632513138999904], [-74.01514630699995, 40.63322193799993], [-74.01317645999991, 40.63201376599993], [-74.0109702639999, 40.63068186899988]]]}}, {\&quot;id\&quot;: \&quot;67\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 68, \&quot;Shape_Leng\&quot;: 0.0493373795569, \&quot;Shape_Area\&quot;: 0.000111073378655, \&quot;zone\&quot;: \&quot;East Chelsea\&quot;, \&quot;LocationID\&quot;: 68, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00201937799989, 40.74044408899989], [-74.00252381399994, 40.739752643999864], [-74.00310733899988, 40.73999752099994], [-74.00515808199998, 40.74085808099991], [-74.00536591799992, 40.74094529499997], [-74.00697077699994, 40.7416271269999], [-74.0077911609999, 40.74197084499982], [-74.00820401899988, 40.74214751799986], [-74.00789568799996, 40.74257005099984], [-74.00770461499994, 40.74283381299992], [-74.00723774599994, 40.743470231999865], [-74.00696604399992, 40.74384701399987], [-74.00681149999996, 40.74406132399991], [-74.00638477199996, 40.74464590299987], [-74.00595977599997, 40.74523098499991], [-74.00553403999999, 40.74581556899986], [-74.0051071349999, 40.746402772999865], [-74.0046527429999, 40.74702295299989], [-74.004168307, 40.74768929299991], [-74.0039029229999, 40.74805366099985], [-74.00368344599993, 40.74835499999993], [-74.003235611, 40.74897425499992], [-74.00316116799988, 40.749076422999906], [-74.00312806199997, 40.749121859999946], [-74.00278526999996, 40.74959231999985], [-74.002458683, 40.75003580599991], [-74.002431475, 40.75007275199989], [-74.00233168599986, 40.75020825799991], [-74.00188266699993, 40.75082793099988], [-74.00142970699987, 40.75144572099988], [-74.000974548, 40.752054664999896], [-74.00086139300001, 40.75221483899992], [-74.00052667499992, 40.75268862399987], [-74.00001529900001, 40.75339158699995], [-73.99992459199981, 40.75351627999993], [-73.99963228999997, 40.75391808599989], [-73.99914292099987, 40.754584933999865], [-73.99866067199993, 40.755251761999894], [-73.99820870599997, 40.75586865599991], [-73.99775836599989, 40.75648752899987], [-73.99730671499998, 40.757110506999894], [-73.99577488199998, 40.75645451499985], [-73.99511286399995, 40.75617577399984], [-73.99500601599988, 40.756136713999865], [-73.99446824699999, 40.75590886199991], [-73.99163271299996, 40.75470680499996], [-73.99207900099996, 40.75409111599986], [-73.99252855999994, 40.75347391299987], [-73.99297937799993, 40.75285340299989], [-73.99346417699986, 40.75219005499987], [-73.99394825699984, 40.751522221999934], [-73.99437946899984, 40.75093038999993], [-73.99484363799989, 40.75029330899991], [-73.99529821499979, 40.749671682999924], [-73.99574855499995, 40.74905219599985], [-73.99619655499993, 40.74843932799997], [-73.99664704399989, 40.74782272899995], [-73.99709902899994, 40.74720510199991], [-73.99755164599995, 40.746580899999834], [-73.99800822000003, 40.74595130199988], [-73.99848652399989, 40.745294163999894], [-73.99897237399989, 40.74463005499994], [-73.99942208999991, 40.74400957299992], [-73.9998482359998, 40.74342501899993], [-74.0002751799999, 40.74283879799987], [-74.00070275499995, 40.74225361099988], [-74.00112917399991, 40.741668097999884], [-74.00155531499993, 40.741080025999935], [-74.00201937799989, 40.74044408899989]]]}}, {\&quot;id\&quot;: \&quot;68\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 69, \&quot;Shape_Leng\&quot;: 0.0789896450483, \&quot;Shape_Area\&quot;: 0.00019905160381, \&quot;zone\&quot;: \&quot;East Concourse/Concourse Village\&quot;, \&quot;LocationID\&quot;: 69, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91179361999997, 40.8264281559999], [-73.91130974499993, 40.824848557999886], [-73.91192435199989, 40.82504975899994], [-73.91316674499997, 40.82545645499989], [-73.91351191699981, 40.824804943999915], [-73.91475121099991, 40.82520047299993], [-73.91527590199993, 40.82565539499992], [-73.91541108199998, 40.82577390899993], [-73.91545061499994, 40.82574777899985], [-73.91592284999992, 40.8254400559999], [-73.91613011899993, 40.82530572099995], [-73.91618778499992, 40.82526834599989], [-73.91624748099997, 40.82522965499987], [-73.91630388, 40.825193101999915], [-73.9163666169999, 40.82515243999989], [-73.91642451899982, 40.82511491299993], [-73.91661368499985, 40.82499230799991], [-73.91630917499997, 40.82490286699987], [-73.91608782899984, 40.82483785199988], [-73.91677400599986, 40.82438708699987], [-73.9168919579999, 40.8243119259999], [-73.917126938, 40.82416263099988], [-73.91719007399993, 40.824122516999914], [-73.91725010299993, 40.82408437699994], [-73.9173178239999, 40.82404134999992], [-73.9174045909999, 40.82398622199988], [-73.91746772799986, 40.82394610699989], [-73.9175659939999, 40.823883671999944], [-73.91782151699984, 40.82371837099987], [-73.91788272099983, 40.823678776999884], [-73.91833693999992, 40.82338493199989], [-73.91875570599991, 40.8231152179999], [-73.91888836899983, 40.82302977399992], [-73.91929142000006, 40.82277017699986], [-73.91938041799983, 40.82271235199997], [-73.91944303599995, 40.82267166799987], [-73.91980424599993, 40.822436974999896], [-73.91993471699983, 40.82235220199986], [-73.92038676299994, 40.822058483999875], [-73.92048603299985, 40.82197953699992], [-73.92054346999996, 40.821933856999856], [-73.92066539199996, 40.82183689399995], [-73.92114408999996, 40.82156300199989], [-73.92194764099997, 40.82103154499987], [-73.92265261199995, 40.82049431499993], [-73.92402557199983, 40.8192853299999], [-73.92454726099986, 40.81871262399987], [-73.92518486499998, 40.818012668999884], [-73.92538538499986, 40.818065414999865], [-73.92582070699982, 40.81818033699992], [-73.92635859099993, 40.818320691999936], [-73.92724662700006, 40.81854298499994], [-73.92731653099999, 40.81855963399991], [-73.92687781699988, 40.81947887199991], [-73.92662466400002, 40.820026393999946], [-73.92634345699999, 40.82057855199989], [-73.92628127099981, 40.82053716099994], [-73.92610404099997, 40.820745970999944], [-73.92565452999989, 40.82112523299984], [-73.92573567299983, 40.8211742359999], [-73.92537221999999, 40.82160252099991], [-73.92517593199985, 40.821899196999944], [-73.92499654899987, 40.82220270099992], [-73.9248346779998, 40.82251216799988], [-73.92469079500003, 40.82282671599988], [-73.92456530199985, 40.823145454999896], [-73.92445847599993, 40.823467428999955], [-73.92442266399998, 40.823644865999924], [-73.92437413499995, 40.8238206829999], [-73.92431310200004, 40.8239940979999], [-73.92347379199992, 40.82541321999991], [-73.92306184099985, 40.82609561099991], [-73.9229413879998, 40.82629934999992], [-73.9228330809999, 40.82650710299994], [-73.92273725099989, 40.826718249999935], [-73.92267670999986, 40.82684999599992], [-73.92264951599996, 40.826972409999904], [-73.922233014, 40.82772080999991], [-73.92211960699997, 40.82792587599993], [-73.92183738200004, 40.82843621099994], [-73.92174660200004, 40.82860240899991], [-73.9213893, 40.82923701399989], [-73.92117904700004, 40.82962895599993], [-73.9204611219999, 40.830914820999936], [-73.91986089399987, 40.83194722699992], [-73.91949947100001, 40.8324794919999], [-73.91903136700003, 40.83308734899987], [-73.91839346699996, 40.833809411999866], [-73.91778665899993, 40.83442951199992], [-73.91773115000002, 40.83448623099987], [-73.91770299099986, 40.83451500899989], [-73.91767974800003, 40.83453875599988], [-73.9176438849999, 40.83457540699993], [-73.91720735700002, 40.83502151399988], [-73.91667316899982, 40.83556740499994], [-73.91647433399987, 40.835779030999895], [-73.91587067499995, 40.836393593999915], [-73.9153159669999, 40.83694742399996], [-73.91477300600005, 40.8375141009999], [-73.91423754099989, 40.83810879599992], [-73.91383125899985, 40.83863904499986], [-73.91377104999991, 40.838721647999925], [-73.91371372699993, 40.83880893499991], [-73.91313156299994, 40.83981053999988], [-73.912960009, 40.84019622899994], [-73.9127782319999, 40.840691064999945], [-73.91269769199985, 40.840930128999894], [-73.9126225619999, 40.84115715899991], [-73.91246930299995, 40.841620256999924], [-73.91240381699996, 40.84181649699988], [-73.91222180499983, 40.84235659099988], [-73.91197045599988, 40.84310439399992], [-73.91193751499992, 40.843202387999916], [-73.91175379899997, 40.84318035699991], [-73.91096872799983, 40.84313621399987], [-73.91043026399994, 40.8431077299999], [-73.91046008499987, 40.842791642999885], [-73.90958727299986, 40.84275637499993], [-73.90865715699992, 40.84271936999993], [-73.90774413799994, 40.84270215599993], [-73.90684546599987, 40.842667510999966], [-73.90596061799985, 40.84262870399992], [-73.9058672189999, 40.84257998699996], [-73.90514893999989, 40.84254719499995], [-73.9050151499998, 40.842404697999875], [-73.90503176699985, 40.8422629449999], [-73.90515655599995, 40.84104021299991], [-73.90519207999992, 40.840707581999915], [-73.905272123, 40.8404855589999], [-73.90536832399985, 40.84026688999992], [-73.90548026199987, 40.840052591999935], [-73.90560739499988, 40.8398436189999], [-73.90538358099987, 40.8397689829999], [-73.90597940399996, 40.83850519599985], [-73.90625475300006, 40.83806527999994], [-73.90635674699993, 40.837902326999924], [-73.90646169600002, 40.83773464999995], [-73.90652354, 40.83763584299988], [-73.90679878899991, 40.837196073999976], [-73.90688497199997, 40.83705837699988], [-73.906975505, 40.836913727999885], [-73.90713954499994, 40.83665163499991], [-73.90721294199983, 40.83653436399994], [-73.90727112599996, 40.83644139899997], [-73.90733306999991, 40.83634242699987], [-73.90740200499981, 40.836232282999966], [-73.90757269399987, 40.83592860399989], [-73.90762665999985, 40.835832588999935], [-73.9077182169999, 40.835669695999854], [-73.90783293099987, 40.83546559899987], [-73.90797135199996, 40.83521932399989], [-73.90799132699986, 40.8351837829999], [-73.90810870199985, 40.83497494999988], [-73.90823980199985, 40.83474169399996], [-73.90837656, 40.83449837099991], [-73.90852151699984, 40.834240455999904], [-73.90857547999998, 40.834144441999904], [-73.90869131200002, 40.83393834699988], [-73.90882575999996, 40.8336988109999], [-73.90889804099996, 40.833570034999894], [-73.90910597799993, 40.833199565999905], [-73.909177781, 40.83307163899986], [-73.90923681499991, 40.83296646099988], [-73.90928354899982, 40.83288319599993], [-73.9093741529999, 40.832721771999914], [-73.90942257599983, 40.83263549599993], [-73.90946039499991, 40.83256811599989], [-73.9095189569999, 40.83246377699987], [-73.90962130699984, 40.832281421999895], [-73.91049010699992, 40.830737372999884], [-73.90971373799982, 40.83047001399989], [-73.909144659, 40.83028572999996], [-73.908959903, 40.83022623299989], [-73.90948178399991, 40.82959211899987], [-73.91030770399989, 40.828772484999895], [-73.91169430299985, 40.82775871599993], [-73.91179361999997, 40.8264281559999]]]}}, {\&quot;id\&quot;: \&quot;69\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 70, \&quot;Shape_Leng\&quot;: 0.0638403183367, \&quot;Shape_Area\&quot;: 0.000195458476728, \&quot;zone\&quot;: \&quot;East Elmhurst\&quot;, \&quot;LocationID\&quot;: 70, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.85912375899987, 40.76127549899994], [-73.85896628099991, 40.761158795999904], [-73.85880387699986, 40.76104606399992], [-73.858636721, 40.76093742299987], [-73.8584649899998, 40.760832988999894], [-73.85828886699981, 40.760732872999895], [-73.85810853999996, 40.7606371819999], [-73.857924202, 40.760546017999935], [-73.85773604799981, 40.760459477999845], [-73.85754427999996, 40.76037765399996], [-73.85734910199996, 40.76030063399988], [-73.856705981, 40.76004386599993], [-73.85655895700003, 40.75998156099994], [-73.85638216199997, 40.7599066399999], [-73.85603980899994, 40.75972578699984], [-73.85576997499993, 40.75953834299993], [-73.85553311699984, 40.75934259099992], [-73.85525140099983, 40.7591475299999], [-73.855067026, 40.758943277999926], [-73.85500920899997, 40.758879225999884], [-73.85463995799994, 40.75846615799992], [-73.8545797199998, 40.7583876199999], [-73.85449593299987, 40.75827863899985], [-73.85462918699993, 40.75830695499996], [-73.85476880299996, 40.758328129999896], [-73.85490872699997, 40.75833644899987], [-73.85505441, 40.758330370999914], [-73.85530200199995, 40.75829284199989], [-73.85540366099997, 40.75834030899989], [-73.85560819899995, 40.758305410999846], [-73.85695186799988, 40.7581331269999], [-73.85775351199999, 40.75802727499996], [-73.85856138999993, 40.75791243699992], [-73.85888932400003, 40.75789947599986], [-73.85951332399988, 40.75787858999995], [-73.85992746199989, 40.75786410199987], [-73.86046162199992, 40.75784373199991], [-73.86099882399996, 40.75782499299988], [-73.8619061719999, 40.757794863999926], [-73.86280704199999, 40.75775898399997], [-73.86371499900002, 40.757725670999875], [-73.86461956599985, 40.75769371599994], [-73.86567436999994, 40.75762958299988], [-73.86656997600001, 40.75753552099992], [-73.86746336500002, 40.757441539999895], [-73.86848374899984, 40.75733493699991], [-73.86950314799998, 40.75722801899992], [-73.87041371399981, 40.75713241199987], [-73.87132395899997, 40.75703633999996], [-73.87221856399995, 40.75694322399988], [-73.87311054799989, 40.756850881999895], [-73.87365721799983, 40.756803485999946], [-73.87420803099994, 40.75673156299993], [-73.87513874300004, 40.756633815999905], [-73.87551080399989, 40.758679635999975], [-73.875806546, 40.76030783599991], [-73.87601371899997, 40.76144373199991], [-73.87549091099996, 40.76135159499989], [-73.87499575099986, 40.761264321999924], [-73.87531552900002, 40.762944974999876], [-73.87532089499993, 40.763008007999886], [-73.87532637000001, 40.76305660499986], [-73.875535095, 40.76423051299991], [-73.87586503899996, 40.76605165399989], [-73.87613975699989, 40.76769550599995], [-73.87623300399999, 40.768085937999885], [-73.87624365599994, 40.76812831899984], [-73.87625062099983, 40.76816607499988], [-73.87638792400003, 40.76899955799995], [-73.87601415599997, 40.769816975999944], [-73.87602197499997, 40.770312000999915], [-73.87600937699986, 40.77048155299986], [-73.87597756999998, 40.77090960899993], [-73.8759736269999, 40.77104276199989], [-73.87598378999998, 40.771176146999935], [-73.87600801500002, 40.7713084929999], [-73.87604778699992, 40.77144359299993], [-73.87608949699984, 40.77153690299987], [-73.87601656500001, 40.77155104399987], [-73.87517573299982, 40.77167671199991], [-73.87475943399997, 40.77171998699991], [-73.87426330499983, 40.771753387999894], [-73.87380524599989, 40.77176797799988], [-73.8732794149999, 40.77176740099993], [-73.87272561699997, 40.7717366429999], [-73.87223577699984, 40.77169565899993], [-73.8717353399999, 40.7716225859999], [-73.87143357299982, 40.77157646699987], [-73.87071447499993, 40.771390689999926], [-73.87016128299994, 40.77120898499992], [-73.86962970499988, 40.77100636599992], [-73.869437198, 40.77092448199991], [-73.8688938269999, 40.770649021999915], [-73.868098735, 40.77017200899994], [-73.86728193799998, 40.76965000299989], [-73.86606875999985, 40.768796181999946], [-73.8655058869999, 40.768345767999946], [-73.86509294099989, 40.76801531499993], [-73.86458486999996, 40.76756668999989], [-73.86404975699998, 40.76706394799991], [-73.86353063400003, 40.76657622399992], [-73.86340214900002, 40.76645551199989], [-73.86321805300003, 40.76625081599989], [-73.86286118599996, 40.765846235999874], [-73.86180888799991, 40.76454470799988], [-73.8610972439999, 40.76366447699992], [-73.85992937999985, 40.76220030099993], [-73.859666663, 40.761901912999896], [-73.85913545299991, 40.76141844099987], [-73.85912375899987, 40.76127549899994]]]}}, {\&quot;id\&quot;: \&quot;70\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 71, \&quot;Shape_Leng\&quot;: 0.0931694551828, \&quot;Shape_Area\&quot;: 0.000382572587364, \&quot;zone\&quot;: \&quot;East Flatbush/Farragut\&quot;, \&quot;LocationID\&quot;: 71, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93177153199984, 40.65527364199989], [-73.93160868699992, 40.653741638999875], [-73.9313911669999, 40.6516896079999], [-73.93038144399998, 40.65173405399985], [-73.93020593200004, 40.65010866699993], [-73.92999915499996, 40.64818106399986], [-73.9298024389999, 40.64632007699988], [-73.92974213599983, 40.645743383999914], [-73.92959986299991, 40.64443271899991], [-73.9293545129999, 40.64213431899986], [-73.92910623099985, 40.63979510599992], [-73.92809818199994, 40.639856615999875], [-73.92761438900001, 40.639887640999845], [-73.92716497399995, 40.639916461999874], [-73.92622007399989, 40.63997609499989], [-73.92594627399988, 40.63999816299988], [-73.92574389399985, 40.64001446599985], [-73.92582711299985, 40.63962626999988], [-73.925834756, 40.63941858799992], [-73.92586068599987, 40.63921107199991], [-73.92590483099994, 40.63900510599991], [-73.92596691799999, 40.63880208899997], [-73.92604638799985, 40.638603341999904], [-73.92606338099995, 40.63852406099986], [-73.9260813459999, 40.63816294599993], [-73.9261268489999, 40.63774352299986], [-73.92616377799996, 40.63757296099988], [-73.9262739919998, 40.63721532799985], [-73.92652490899994, 40.63649272299989], [-73.92668615699995, 40.636257087999915], [-73.92674443099993, 40.636173105999916], [-73.92682085699984, 40.63606066199992], [-73.9269145769998, 40.6359394399999], [-73.92712769599991, 40.63566745599993], [-73.92744822299987, 40.635258409999864], [-73.92766858599995, 40.63524502299991], [-73.92861283799982, 40.63518764599997], [-73.92962453299997, 40.63512131599987], [-73.93055333099983, 40.63506291499989], [-73.9315273509998, 40.63500796799989], [-73.93223554799995, 40.634963338999924], [-73.93249995699995, 40.63494706899993], [-73.93342687599988, 40.634884050999915], [-73.93439440299989, 40.63482680299991], [-73.93535985000001, 40.6347673119999], [-73.93629596800004, 40.63470952599985], [-73.9372670019998, 40.634650624999885], [-73.93706492900004, 40.6327711669999], [-73.93703669099992, 40.63250924999988], [-73.93701746200003, 40.63231097899989], [-73.9374083309999, 40.63228068499994], [-73.93759273599986, 40.63226785699986], [-73.93799799799994, 40.63224680599991], [-73.93892456999993, 40.63219308999986], [-73.93985458399987, 40.63213497499991], [-73.94032359799989, 40.63210526799983], [-73.94078821499988, 40.632075845999886], [-73.94175680799997, 40.63201662699987], [-73.94272877999995, 40.631957293999896], [-73.94365994499996, 40.63189942699991], [-73.94462885499995, 40.63183773499993], [-73.94488042799988, 40.634176953999926], [-73.9451233509999, 40.636448278999865], [-73.94537272499998, 40.638786954999865], [-73.94638150299986, 40.638726249999905], [-73.94715150299994, 40.63867640599994], [-73.94826499699982, 40.63860718999994], [-73.94841343400003, 40.639987463999944], [-73.94744296799982, 40.6400476649999], [-73.94754496799999, 40.64100547599989], [-73.94778994699976, 40.643305735999924], [-73.94685570599987, 40.64336214099992], [-73.94586879199989, 40.64342374399988], [-73.94598813699993, 40.64453379699989], [-73.94607216799986, 40.64531181199988], [-73.94625972599981, 40.647006214999905], [-73.94647882399988, 40.64910075099988], [-73.94667414499985, 40.65094811899995], [-73.94570606199984, 40.65100678399988], [-73.94590468799987, 40.65285464999991], [-73.94606690599983, 40.65441026199991], [-73.94703257599998, 40.65433871399988], [-73.94715896299984, 40.65559378699993], [-73.94507909299995, 40.65572204699989], [-73.94487284399997, 40.655734761999966], [-73.94446083699984, 40.65576016599992], [-73.94335488899993, 40.655828334999896], [-73.94240147899986, 40.655884810999964], [-73.94146260999986, 40.655944248999944], [-73.94053214699989, 40.65600153899992], [-73.93955925399985, 40.656062752999915], [-73.93859348999989, 40.65612237899993], [-73.93765923499997, 40.656183875999886], [-73.93712063899989, 40.65621590299989], [-73.936684695, 40.65624182299995], [-73.936179278, 40.6562739719999], [-73.93571813299981, 40.656303296999894], [-73.93478437399983, 40.65636039499992], [-73.93381012099998, 40.65642299299988], [-73.93284657399983, 40.65647848199988], [-73.931907438, 40.656537652999916], [-73.93177153199984, 40.65527364199989]]]}}, {\&quot;id\&quot;: \&quot;71\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 72, \&quot;Shape_Leng\&quot;: 0.0952020695166, \&quot;Shape_Area\&quot;: 0.000323532461947, \&quot;zone\&quot;: \&quot;East Flatbush/Remsen Village\&quot;, \&quot;LocationID\&quot;: 72, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.92021313099984, 40.65997544099987], [-73.92008167099986, 40.659857632999866], [-73.919986348, 40.660115465999894], [-73.91990440499988, 40.66033711699987], [-73.91974399499988, 40.660770972999885], [-73.91966280899982, 40.66140503299994], [-73.9196271919999, 40.661708058999885], [-73.9195947979998, 40.66199567899985], [-73.91945727799987, 40.66188078499988], [-73.91920450999993, 40.661655199999835], [-73.91893607399996, 40.6614160109999], [-73.91860168199995, 40.661118048999846], [-73.91829936299985, 40.66116125699987], [-73.91818493100003, 40.660726208999954], [-73.91741819199994, 40.66005119199989], [-73.91707363499995, 40.65974535399988], [-73.91572803800001, 40.658550127999874], [-73.91556629599982, 40.65839257199986], [-73.91441247700004, 40.65736241899984], [-73.91402878099997, 40.65700370899984], [-73.91377943699983, 40.65678367899993], [-73.91314356299998, 40.65622086399992], [-73.91236458899995, 40.65551356499985], [-73.91199538399984, 40.65556155999991], [-73.91108323599995, 40.65570239299992], [-73.91012255699995, 40.655851770999945], [-73.90977962099994, 40.654466254999925], [-73.90975756199991, 40.654367116999865], [-73.90974279799993, 40.65431111199997], [-73.90972827499986, 40.65425186399989], [-73.9097001379998, 40.65415294699991], [-73.90933499299997, 40.65280859199989], [-73.90855790499995, 40.65209593799989], [-73.90944846399994, 40.65152159899992], [-73.91022992899991, 40.65101403099988], [-73.91110070199989, 40.65044791299992], [-73.91182280200003, 40.64998342299986], [-73.91253589199988, 40.64952147899985], [-73.91325294199991, 40.649061424999935], [-73.91396129299983, 40.64860065799996], [-73.91473216799982, 40.64810117499995], [-73.91550029699984, 40.647604853999916], [-73.91620934099993, 40.64715114199988], [-73.91693683599993, 40.64668353499992], [-73.91730801300002, 40.64644290499994], [-73.91764732399982, 40.646222935999916], [-73.91798513199991, 40.646010879999906], [-73.91830152299998, 40.645812262999925], [-73.91861676799982, 40.64560209799988], [-73.91892329099996, 40.64539775299986], [-73.91925419699997, 40.64517776399986], [-73.91943014999988, 40.64506079199986], [-73.91982077699998, 40.644783831999874], [-73.91995062999999, 40.64470762999989], [-73.91990782599999, 40.64432958099992], [-73.91973736999988, 40.64277814799987], [-73.92025802399995, 40.64236629899986], [-73.92154948099989, 40.64134469199992], [-73.92332654599986, 40.63990021599991], [-73.92335409199994, 40.64017632399992], [-73.92337418899983, 40.640495543999904], [-73.92341500199993, 40.640923605999916], [-73.92356525899983, 40.642499297999905], [-73.92454228399995, 40.64243917699988], [-73.92518618999996, 40.642397290999945], [-73.92538233099987, 40.64238453199987], [-73.92547887299986, 40.64158704199992], [-73.9255828079999, 40.64107003099984], [-73.92562125699988, 40.64081121999991], [-73.92570388299987, 40.6403609499999], [-73.92574389499987, 40.64001446599983], [-73.92594627400003, 40.63999816199989], [-73.92622007399989, 40.63997609499989], [-73.92716497399995, 40.639916461999874], [-73.92761438900001, 40.639887640999845], [-73.92809818199994, 40.639856615999875], [-73.92910623199991, 40.6397951059999], [-73.9293545129999, 40.64213431899986], [-73.92959986299991, 40.64443271899991], [-73.92974213599983, 40.645743383999914], [-73.9298024389999, 40.64632007699988], [-73.92999915499996, 40.64818106399986], [-73.93020593200004, 40.65010866699993], [-73.93038144299994, 40.65173405399986], [-73.9313911669999, 40.6516896079999], [-73.93160868699992, 40.653741638999875], [-73.93177153199984, 40.65527364199989], [-73.93190743899989, 40.656537652999944], [-73.93090354899984, 40.65661035599996], [-73.92989802399997, 40.65668443599994], [-73.92896419499985, 40.6567426129999], [-73.92799465199988, 40.65680210099988], [-73.92817215400002, 40.658477344999945], [-73.92834017599988, 40.660060035999884], [-73.92819257899993, 40.660177173999905], [-73.92725505399994, 40.65933756399987], [-73.92646424299983, 40.659814361999956], [-73.92828249199995, 40.6614470669999], [-73.92854068399994, 40.66168068599989], [-73.93068465499985, 40.66362047699992], [-73.92987364799986, 40.66399077299992], [-73.9294035289999, 40.66419984599983], [-73.92916752199997, 40.664299531999895], [-73.92905235499991, 40.66435100699988], [-73.92872204599985, 40.66449556899988], [-73.928228724, 40.66470986499991], [-73.92771188899987, 40.66493432799991], [-73.92739349999984, 40.66507471699986], [-73.92637970499992, 40.6655148919999], [-73.9245494589998, 40.66386259199993], [-73.92272843000003, 40.66223123199989], [-73.9209090419998, 40.66059911499987], [-73.92021313099984, 40.65997544099987]]]}}, {\&quot;id\&quot;: \&quot;72\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 73, \&quot;Shape_Leng\&quot;: 0.0853020209129, \&quot;Shape_Area\&quot;: 0.000291799754395, \&quot;zone\&quot;: \&quot;East Flushing\&quot;, \&quot;LocationID\&quot;: 73, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.79566545000003, 40.75023619999991], [-73.79644617199999, 40.74985921699992], [-73.79729524799988, 40.74943505299992], [-73.79704716099987, 40.7493323179999], [-73.796581036, 40.74897739799995], [-73.79598269399985, 40.74853189299996], [-73.79472264899997, 40.74759932999989], [-73.7946756879998, 40.74721192799994], [-73.79826235399989, 40.746965655999894], [-73.79921673599986, 40.74685628199987], [-73.80017472200002, 40.746755577999906], [-73.80327809299982, 40.746439510999934], [-73.8033521419999, 40.74643196499987], [-73.80302898599999, 40.747194800999935], [-73.80294034199993, 40.747408916999916], [-73.80286300399993, 40.74764296999995], [-73.80280481399987, 40.74788116399995], [-73.80276629299996, 40.74812214499988], [-73.80274770699985, 40.74836447599992], [-73.802749109, 40.74860675099995], [-73.80277033699984, 40.748847537999936], [-73.80280784099993, 40.74906666099989], [-73.80287666499987, 40.749765148999856], [-73.80295670699991, 40.74977052699987], [-73.80353070499987, 40.7498254129999], [-73.80446953099978, 40.74989927499992], [-73.80539953699991, 40.7499727289999], [-73.80633253899988, 40.750047665999936], [-73.8072707609999, 40.75011897499993], [-73.80750599299991, 40.750136586999936], [-73.80976035399992, 40.748779221999904], [-73.81161754599998, 40.74766484299989], [-73.81235411899996, 40.74722328299991], [-73.81316297299992, 40.74673791899988], [-73.81341871899997, 40.746584445999915], [-73.81416172099998, 40.74613857999986], [-73.81477152699999, 40.74668237099996], [-73.8153731739999, 40.747218337999946], [-73.81598751399984, 40.74776993599989], [-73.81654271199997, 40.748260041999856], [-73.81710925599998, 40.74876054399992], [-73.8176865099999, 40.749288211999925], [-73.81779541099995, 40.749392014999906], [-73.81826477299987, 40.749826989999875], [-73.81883698299988, 40.75035215799989], [-73.81911566899988, 40.750621072999856], [-73.81941130799996, 40.75088775499989], [-73.81998860999985, 40.751428620999896], [-73.820849288, 40.75224154499988], [-73.81977819399994, 40.752936894999884], [-73.819092321, 40.7533848199999], [-73.8184078289999, 40.75383042199998], [-73.82030067699999, 40.75551497999992], [-73.81961754399985, 40.75596557899992], [-73.81926771999996, 40.75619984799989], [-73.818936954, 40.75640957799994], [-73.81789245699991, 40.75708633799991], [-73.81856914499988, 40.7575188489999], [-73.819232864, 40.75794681199992], [-73.8200450059999, 40.75848322799985], [-73.82063593299985, 40.75887226799989], [-73.8172882139999, 40.75977554699992], [-73.8150873259998, 40.76037161099985], [-73.81399882899986, 40.760665033999906], [-73.8131322989999, 40.76089834899995], [-73.81226778099978, 40.761130021999854], [-73.81104963199985, 40.761417020999964], [-73.81044348399986, 40.761377438999894], [-73.80951372599986, 40.761299910999874], [-73.80859484099997, 40.76113246199993], [-73.80768023699983, 40.76095995899987], [-73.80676048599993, 40.7607877729999], [-73.80584005399999, 40.760615390999874], [-73.804916685, 40.760440411999895], [-73.80399971299993, 40.76027048799994], [-73.80307328899983, 40.76012624799988], [-73.80215291900004, 40.75998721799985], [-73.80125017499996, 40.75982823699995], [-73.80030038999979, 40.759702298999926], [-73.79940088899988, 40.759397218999936], [-73.798501602, 40.75907103599994], [-73.79760259799993, 40.758744178999905], [-73.79670467899993, 40.758417711999876], [-73.79621926899995, 40.75824167999989], [-73.79580437699985, 40.758091216999915], [-73.79493246199993, 40.75779802999994], [-73.79474720599988, 40.755628187999925], [-73.79457726999996, 40.7535630109999], [-73.794627692, 40.75270267499999], [-73.79465583899984, 40.75198814499991], [-73.79468324699988, 40.75127504499995], [-73.79471901099991, 40.75064761699991], [-73.79566545000003, 40.75023619999991]]]}}, {\&quot;id\&quot;: \&quot;73\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 74, \&quot;Shape_Leng\&quot;: 0.11029093625, \&quot;Shape_Area\&quot;: 0.000295038418204, \&quot;zone\&quot;: \&quot;East Harlem North\&quot;, \&quot;LocationID\&quot;: 74, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;MultiPolygon\&quot;, \&quot;coordinates\&quot;: [[[[-73.93380589881859, 40.81651249324708], [-73.93382900884613, 40.81558536018751], [-73.93394608825352, 40.815587624739145], [-73.93394609933729, 40.81557645756461], [-73.93394170146216, 40.81556529841819], [-73.93394905857512, 40.8155563695585], [-73.93395054151384, 40.81554298000987], [-73.93394173470415, 40.81553180845374], [-73.93394175021196, 40.81551618496343], [-73.93395205657892, 40.81549721872188], [-73.93395353730935, 40.81548605238904], [-73.93393445709587, 40.81547153450898], [-73.93394623227614, 40.81544251797633], [-73.93393892276251, 40.81541572428048], [-73.93394921255528, 40.81540122322664], [-73.93394628434712, 40.815390054870534], [-73.93395659090885, 40.81537220417373], [-73.93394853112638, 40.81534820251395], [-73.93394855439136, 40.81532476149812], [-73.9339485843048, 40.815294621684686], [-73.93395302092101, 40.81526672687829], [-73.93395452158198, 40.81523547202671], [-73.93394426378258, 40.815205325816855], [-73.93394870283136, 40.815175197910264], [-73.93394725313905, 40.815155097995664], [-73.93396344530967, 40.81512944302358], [-73.93396788302533, 40.8151004229544], [-73.9339635051222, 40.81506916406496], [-73.93396941358041, 40.81503902711455], [-73.93398565957851, 40.81494751042225], [-73.93398936930922, 40.814912357030906], [-73.93398203685818, 40.814895612781136], [-73.93398352753833, 40.81487439749633], [-73.93397473519484, 40.81484872821333], [-73.93398210661385, 40.81482529307837], [-73.93397332647235, 40.814787331860224], [-73.93399097511455, 40.81477506811652], [-73.9339777641614, 40.81475831111913], [-73.93398954202252, 40.81473822765621], [-73.93399543936422, 40.81471925787887], [-73.93398075656609, 40.81470474252187], [-73.93398224833994, 40.81468242057032], [-73.93398523963945, 40.814629959140966], [-73.9339764506598, 40.81460093082527], [-73.93396620950318, 40.814565211251484], [-73.93399121978341, 40.81452838643417], [-73.93401476726973, 40.814483752624774], [-73.93385652638806, 40.81448147441923], [-73.9338623097275, 40.814249296823014], [-73.93386383534269, 40.81418806900028], [-73.93386510261887, 40.814153157955616], [-73.93386927846709, 40.814101174816585], [-73.93387232548957, 40.814063264260696], [-73.933929846002, 40.813347690633734], [-73.93398178986803, 40.812814635545315], [-73.93400770204929, 40.81260849869726], [-73.93403843917875, 40.8123408800709], [-73.93409306691906, 40.81196840253071], [-73.93413711416075, 40.81171237092448], [-73.93419558749154, 40.811393177692835], [-73.93428227801395, 40.81082305050867], [-73.93430417398088, 40.810481665612656], [-73.93431440507302, 40.81032226491122], [-73.93434080971474, 40.80992758274956], [-73.93433864584743, 40.8095622138313], [-73.93421391016982, 40.809059173792676], [-73.93419639195767, 40.809031851582375], [-73.9341353262405, 40.80873639051419], [-73.93412073484292, 40.80865645197743], [-73.93356119311476, 40.80760067738665], [-73.93332852361837, 40.80731894646299], [-73.93325708526282, 40.80723665117304], [-73.93318395639754, 40.80715619829966], [-73.93317413539488, 40.80714539094985], [-73.93308471749718, 40.807026914702085], [-73.93293288329282, 40.806871022133876], [-73.93263088267565, 40.806552933906765], [-73.932390171191, 40.806299141471094], [-73.93154417434337, 40.805397783326654], [-73.9314959803404, 40.805351225035174], [-73.93147540101658, 40.805328196076914], [-73.93146693969662, 40.80530609218759], [-73.93144877545446, 40.805297790588014], [-73.93143182674825, 40.80528212682836], [-73.93140883156653, 40.80524712392972], [-73.93139067303517, 40.80523330439408], [-73.93130474200962, 40.80513197562958], [-73.93126904139163, 40.805090979973535], [-73.93115889451225, 40.80496753829942], [-73.93112621780075, 40.804923329268384], [-73.93111339209408, 40.80490502354579], [-73.93109717576777, 40.80488187751258], [-73.93107297157022, 40.804847791690065], [-73.93103304094329, 40.80479528916923], [-73.93102699955034, 40.80478331306253], [-73.93097556926416, 40.80471653438344], [-73.93097435882132, 40.804706407289295], [-73.93095741258308, 40.804687979468646], [-73.93093322065235, 40.804653894125565], [-73.9309082463483, 40.80462041055983], [-73.93082673180044, 40.80451111776966], [-73.93080494630988, 40.804475197603566], [-73.93071479334765, 40.804356834780585], [-73.93070875470728, 40.80434209583947], [-73.93069422131265, 40.80432735999997], [-73.93068575499123, 40.80431170072459], [-73.93063735551432, 40.8042472209788], [-73.93063009780597, 40.80423156175632], [-73.93060831208301, 40.80420853141013], [-73.93057080064615, 40.80415418355387], [-73.93057080892787, 40.804144975559375], [-73.93054055322638, 40.8041090497368], [-73.93044072678737, 40.80397594555043], [-73.93040321487011, 40.803922524216716], [-73.93035118741409, 40.80384975152175], [-73.93033061473649, 40.803821194039045], [-73.93030641012538, 40.803788035633886], [-73.93027617112581, 40.80373645606578], [-73.9302592352763, 40.803707901774544], [-73.93018908730323, 40.803585400031146], [-73.93018061288154, 40.80357619510721], [-73.93005719833698, 40.80336412151401], [-73.93001261302975, 40.80328749842868], [-73.92996159942555, 40.803183595030795], [-73.92996684404639, 40.80317620551488], [-73.93003768593684, 40.8030762926764], [-73.92993459708444, 40.80290522425536], [-73.92991008609907, 40.80286455074737], [-73.92988948082964, 40.802830357459], [-73.92978668000165, 40.802660748717486], [-73.92969251214573, 40.80244028594792], [-73.9295769383949, 40.80218002521572], [-73.92952043928469, 40.802053479615516], [-73.92945366333494, 40.80190736883596], [-73.92943654118756, 40.801861711857406], [-73.92935435998545, 40.80167125043787], [-73.92933126971816, 40.80159885399085], [-73.92930220396845, 40.801495801348956], [-73.92927487688024, 40.801373190232695], [-73.92920817595964, 40.80114752061126], [-73.92911838814219, 40.8011130032263], [-73.92903490240305, 40.80108090385195], [-73.92902671406671, 40.80096986031424], [-73.92902123584639, 40.80089557256171], [-73.92901644642038, 40.80083071554217], [-73.92900788120616, 40.80077234912531], [-73.92899994866313, 40.800710097692665], [-73.92898618762995, 40.80060212311935], [-73.92895348657567, 40.80030936848467], [-73.92893763668584, 40.800170843777614], [-73.92890152344123, 40.79985521516526], [-73.92891942515779, 40.799458186491485], [-73.92894396946947, 40.79891158893545], [-73.92897121002336, 40.798258860579715], [-73.9290364017962, 40.79676259410132], [-73.92927936741167, 40.795853139520645], [-73.92930773275864, 40.79581025745309], [-73.92953058056904, 40.79550779834928], [-73.92968294251123, 40.79529623376317], [-73.92974594691611, 40.79520874823406], [-73.92987485778272, 40.795035156225694], [-73.92984244753445, 40.79501503785587], [-73.92985144395278, 40.79500140093118], [-73.92980955349977, 40.79498316629674], [-73.9298325404253, 40.7949490611408], [-73.9298874065193, 40.7949672926039], [-73.92990139788401, 40.79494682436246], [-73.9299163612059, 40.79494911213701], [-73.92993735334552, 40.7949187862844], [-73.92992039501047, 40.79490967283261], [-73.93006881035544, 40.79470082860543], [-73.9301077102813, 40.79471299106365], [-73.93019664392844, 40.794593224854886], [-73.93041980479966, 40.79447087234853], [-73.93111408045347, 40.794096501343894], [-73.93142758557968, 40.79392798838291], [-73.93165821105735, 40.79380174043914], [-73.93179292520253, 40.793727962293545], [-73.93187500171737, 40.7936819218437], [-73.93201001457182, 40.793605486169795], [-73.93207886021688, 40.79356650933645], [-73.93235128869077, 40.7934138451512], [-73.93250920949691, 40.79333190154454], [-73.9325385265489, 40.79331668213541], [-73.93267239130893, 40.79324823277293], [-73.93287712655086, 40.793130251367806], [-73.93310683207811, 40.79299532820945], [-73.93324587394584, 40.792914296531684], [-73.93327130499016, 40.79289947490208], [-73.93348475349612, 40.792774284831985], [-73.93372762154044, 40.79260172681524], [-73.93388747605493, 40.792489813861515], [-73.93406949343559, 40.79235873425466], [-73.93427161550181, 40.79221786711484], [-73.93433968650805, 40.79216855838269], [-73.93450968573121, 40.79205197655582], [-73.9347379410771, 40.79190156964996], [-73.93505300002766, 40.79168720295447], [-73.93508265899982, 40.79171004399993], [-73.93513822199999, 40.791752834999876], [-73.93519360499981, 40.79179799899988], [-73.93524060799987, 40.79183387499989], [-73.93529038099987, 40.791873136999875], [-73.93542842699999, 40.791996879999886], [-73.93555312799995, 40.79184222599987], [-73.93679209299992, 40.792403928999924], [-73.93773612099982, 40.792815803999936], [-73.93819346899994, 40.79218819499989], [-73.93864883299987, 40.79155775499987], [-73.94103496899987, 40.79254666899993], [-73.94327251199996, 40.79348810299993], [-73.94281682199988, 40.79413407699997], [-73.942346766, 40.79476079799989], [-73.94187604699994, 40.79540586899984], [-73.94232710899988, 40.795593102999895], [-73.9424792319999, 40.79565624799992], [-73.94275347999998, 40.79577008499989], [-73.94287776099993, 40.795821670999935], [-73.94348323999992, 40.796072993999935], [-73.94415121699987, 40.79635931699993], [-73.94421313799992, 40.79638585799993], [-73.9449594289999, 40.79670574099988], [-73.94509614599993, 40.79676348299992], [-73.94522698899986, 40.7968201329999], [-73.94556506799988, 40.79696479499997], [-73.9456668469999, 40.79700834399995], [-73.94670030999991, 40.797450543999894], [-73.94722520899997, 40.797671685999944], [-73.94831125500004, 40.79812921799992], [-73.9482064149998, 40.79827285099987], [-73.94815384299984, 40.79834487599987], [-73.94810108999994, 40.798417147999885], [-73.94805130199998, 40.79848535999987], [-73.94784679099992, 40.798765542999945], [-73.94781663099997, 40.79880686299992], [-73.94775716499986, 40.798888331999855], [-73.94771056, 40.79895218099991], [-73.94741996199991, 40.79935029499992], [-73.94737599799991, 40.799410523999896], [-73.94732771499984, 40.79947667099991], [-73.94728018299999, 40.79954178899988], [-73.94697366799987, 40.79996170299987], [-73.94646133899998, 40.800665304999875], [-73.9459678969998, 40.801342394999935], [-73.94550863900001, 40.8019702309999], [-73.94505128000004, 40.80259859899995], [-73.94459751299998, 40.803228144999906], [-73.94613131, 40.80387735799992], [-73.9456926129999, 40.804514948999895], [-73.94523965199991, 40.80513601399989], [-73.94478208199993, 40.805761255999904], [-73.94430194599991, 40.806390824999916], [-73.94275367199994, 40.80574401299988], [-73.9422631119999, 40.80641573799991], [-73.94177140199992, 40.807088999999955], [-73.94015793699995, 40.8064090899999], [-73.93869430499996, 40.80579102899988], [-73.93854407899988, 40.80572965299991], [-73.9380866689998, 40.80635301199987], [-73.937634394, 40.8069746069999], [-73.93718011799989, 40.807598999999904], [-73.93671827500005, 40.80822047899987], [-73.93625935999997, 40.80885560799991], [-73.93586263399992, 40.80943020299987], [-73.93580780199986, 40.80949763799987], [-73.93740733700004, 40.810175610999856], [-73.93901753299998, 40.81085655699991], [-73.93874394499981, 40.8112308209999], [-73.93863753299989, 40.8113763889999], [-73.93838748499988, 40.811718443999894], [-73.93830924999986, 40.81182546399991], [-73.93820642699986, 40.81196760499992], [-73.9381355239999, 40.81206561899994], [-73.93763499299979, 40.81274779999994], [-73.93714398399993, 40.81342104099985], [-73.9366881329999, 40.81404324299994], [-73.936209578, 40.81467384999995], [-73.93613554399998, 40.814788126999915], [-73.93575548199986, 40.81532558399993], [-73.93487343800004, 40.81652784699992], [-73.93463790299994, 40.81690804799997], [-73.93445400100002, 40.81718852899994], [-73.934235195, 40.81755488099992], [-73.93412816799999, 40.81773396299989], [-73.93407463999996, 40.81782651399992], [-73.93408481999982, 40.8179308619999], [-73.934235761, 40.81864931899987], [-73.93429487799989, 40.81890498699991], [-73.934381129, 40.819328075999906], [-73.93439036800001, 40.819587434999924], [-73.93440039999986, 40.81966778299989], [-73.93431276899999, 40.81962986599991], [-73.9341167129999, 40.819547052999965], [-73.93383089287109, 40.819521063761556], [-73.9338294812938, 40.81947330955996], [-73.93382777421705, 40.819415494918886], [-73.93382614137711, 40.819356429750336], [-73.93380019473052, 40.818349758874035], [-73.93379334625767, 40.81777660857971], [-73.93378997399186, 40.817151373701705], [-73.93380589881859, 40.81651249324708]]], [[[-73.92688606022001, 40.800840648368855], [-73.92650954883642, 40.80065703126224], [-73.9265524180424, 40.80060482504614], [-73.92684528429592, 40.80073964671281], [-73.92683162740748, 40.80076552901467], [-73.92686908679453, 40.80078367679929], [-73.92699531303118, 40.80063617610429], [-73.92704640297914, 40.800651743031324], [-73.92688606022001, 40.800840648368855]]], [[[-73.92666565490181, 40.80018271401784], [-73.92669572614771, 40.80014697707624], [-73.9272477078927, 40.800392957368906], [-73.92711464230626, 40.80056375622957], [-73.9270669662848, 40.800543012125786], [-73.92716933022471, 40.80040585369612], [-73.92666565490181, 40.80018271401784]]], [[[-73.92672091168967, 40.800414210943586], [-73.92653846445016, 40.80033389815394], [-73.92655351676811, 40.80031517296066], [-73.92674263892977, 40.800403498972756], [-73.92673683953086, 40.80041147148191], [-73.92672526216785, 40.800407339325346], [-73.92672091168967, 40.800414210943586]]], [[[-73.92718514789182, 40.797349896890104], [-73.9273548544178, 40.797316580786315], [-73.92734692252739, 40.79729390212041], [-73.92767122620857, 40.79721701426623], [-73.92770694127064, 40.7972986638821], [-73.92738263624496, 40.797377063580456], [-73.92736675660653, 40.79734682034475], [-73.9272029978516, 40.797386747899886], [-73.92718514789182, 40.797349896890104]]]]}}, {\&quot;id\&quot;: \&quot;74\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 75, \&quot;Shape_Leng\&quot;: 0.0876638997685, \&quot;Shape_Area\&quot;: 0.00024056392715, \&quot;zone\&quot;: \&quot;East Harlem South\&quot;, \&quot;LocationID\&quot;: 75, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94103496899987, 40.79254666899993], [-73.93864883299987, 40.79155775499987], [-73.93819346899994, 40.79218819499989], [-73.93773612099982, 40.792815803999936], [-73.93679209299991, 40.792403927999956], [-73.93555312799995, 40.79184222599987], [-73.93542842699999, 40.791996879999886], [-73.93529038199985, 40.79187313699991], [-73.93524060899985, 40.791833874999874], [-73.93519360499981, 40.79179799899988], [-73.93513822199999, 40.791752834999876], [-73.93508265899982, 40.79171004399993], [-73.93505300002766, 40.79168720295447], [-73.93510685331493, 40.79164962938518], [-73.93517135169378, 40.791605207031644], [-73.93526809778392, 40.79152802580044], [-73.93526500788931, 40.79152576348113], [-73.93519039296176, 40.791471160129014], [-73.93546762088405, 40.79126365205755], [-73.93553896695929, 40.79131869365975], [-73.93583106788897, 40.79109470487024], [-73.93602391823781, 40.79082912812599], [-73.93632010870607, 40.79042595764855], [-73.93669302210014, 40.789913049159075], [-73.9370616874706, 40.78941359021347], [-73.93705304578876, 40.789406416757465], [-73.93708104382307, 40.78936639571], [-73.93707246262223, 40.78934584188616], [-73.93701479686747, 40.78932128118494], [-73.93614073314119, 40.78894907341048], [-73.93612836235276, 40.788938530059575], [-73.93612689279682, 40.78892686798536], [-73.93621859869943, 40.78880049757431], [-73.93622751295341, 40.78879561294985], [-73.93624303325042, 40.78879577415203], [-73.93714965461099, 40.78916844905941], [-73.93722890167288, 40.78899630803707], [-73.93739788609298, 40.78862171984343], [-73.93741675677381, 40.788579762018934], [-73.93754989162562, 40.7882837445288], [-73.93763482912277, 40.788094244814715], [-73.93768669385378, 40.787973560579], [-73.9376956302226, 40.78795729352046], [-73.93774122176191, 40.78785390435085], [-73.937773632551, 40.787783358062626], [-73.9378172269292, 40.787688468680855], [-73.93794768976979, 40.78747729942922], [-73.93794590851209, 40.78746915925781], [-73.93795930775185, 40.787456279929934], [-73.93797181801379, 40.787431873382516], [-73.93811570089733, 40.787184762756446], [-73.93813356192969, 40.787165790398426], [-73.9381942962531, 40.78709733029969], [-73.93824519951416, 40.78704106810817], [-73.93853937331639, 40.78671077700018], [-73.93926642644561, 40.78588875256448], [-73.93982619696462, 40.785256552415454], [-73.93983453997872, 40.7852539728617], [-73.93984282390869, 40.78525141086653], [-73.93985267603377, 40.78524393165018], [-73.93988045560609, 40.78523237601269], [-73.93988852061734, 40.785223527347014], [-73.9399100328247, 40.78521196675792], [-73.93992974399465, 40.78520176553124], [-73.93995483679325, 40.7851895227944], [-73.93998978019029, 40.7851704772902], [-73.94001308386723, 40.78515687380644], [-73.94002473252543, 40.78515347642582], [-73.94004982707635, 40.785138513728796], [-73.94006415729082, 40.78513102962013], [-73.94011434323865, 40.78510382464465], [-73.94014947276271, 40.78508725537949], [-73.94018512931001, 40.7850662025632], [-73.94020230181276, 40.78505918714035], [-73.94022475284191, 40.785045150788385], [-73.94023795768307, 40.785037134684046], [-73.94026700995506, 40.785022101453436], [-73.94036209351322, 40.784971984082354], [-73.94045320748533, 40.78492287258088], [-73.94053377198209, 40.78487877160597], [-73.94055093807705, 40.784866742096156], [-73.94058130200887, 40.784853708709214], [-73.94059054968368, 40.78484668914218], [-73.9406235705765, 40.78482965041163], [-73.94067374402164, 40.78480359792665], [-73.94071732676325, 40.78478054106708], [-73.94072128361502, 40.78478054310243], [-73.94074901720532, 40.784767518202216], [-73.94076750825941, 40.78475749512128], [-73.94078868006106, 40.78474744878865], [-73.94083088142574, 40.78472742455638], [-73.94102499731892, 40.78463522248629], [-73.94108573710648, 40.78460916651668], [-73.94111082838812, 40.78459714918312], [-73.94113723613098, 40.78458311400423], [-73.94117288854788, 40.784566076962534], [-73.94144612018933, 40.78443147385159], [-73.94152576810184, 40.78439090096986], [-73.94167454195741, 40.78431383063195], [-73.9418544859221, 40.78422074667744], [-73.94201431753096, 40.78413758489741], [-73.94217918595555, 40.78405136339483], [-73.94231388874256, 40.78398116626903], [-73.9423912852098, 40.78394072618266], [-73.94243451137048, 40.7839178303223], [-73.94246970444752, 40.783896460947055], [-73.94257225524868, 40.78382472415543], [-73.9426044272356, 40.78380183093073], [-73.94267379818272, 40.78375374314713], [-73.94278137533362, 40.78367819009659], [-73.94286783792664, 40.78361865580254], [-73.94293520531122, 40.78357210608961], [-73.94301663136942, 40.78351486545848], [-73.94311516211297, 40.78344617062962], [-73.94316141910545, 40.78341182999217], [-73.94320565536934, 40.783369842987604], [-73.94323985739757, 40.78332785169434], [-73.94327003035636, 40.78328815517934], [-73.94331027382039, 40.783233180946446], [-73.94334749366392, 40.783182032998575], [-73.94339679077277, 40.783109502846365], [-73.94344105526409, 40.78304918212819], [-73.94355143839495, 40.78290350798582], [-73.94354420706223, 40.78288052416259], [-73.94360760400002, 40.782865369999904], [-73.9437600529999, 40.78282893199988], [-73.94383256699986, 40.78285908899991], [-73.94389324599985, 40.78288772699988], [-73.94395460199989, 40.78291551999991], [-73.94405439399999, 40.782964357999894], [-73.94464666000002, 40.78321787299997], [-73.94472264499986, 40.78324757199987], [-73.94706938199998, 40.78423622699993], [-73.94933170599992, 40.78519312699994], [-73.95033804099997, 40.785617149999936], [-73.95092733999991, 40.78586544699993], [-73.95244615099996, 40.78650248599994], [-73.95255145499999, 40.78654858099986], [-73.95266136699996, 40.78659501999989], [-73.95416383099995, 40.787226860999944], [-73.9557773589999, 40.78791392399995], [-73.95527481199989, 40.78858337999986], [-73.95481723799992, 40.789204743999974], [-73.95439919199988, 40.78977490899994], [-73.95388917099996, 40.790470498999866], [-73.95343832999994, 40.791085367999926], [-73.95298394599986, 40.791721432999964], [-73.95252222700002, 40.792347621999966], [-73.95207222299993, 40.792966160999896], [-73.95160265399991, 40.79360780499995], [-73.95111102399997, 40.794285034999874], [-73.95061371799994, 40.7949655739999], [-73.95015821299991, 40.795587731999895], [-73.94969538299988, 40.79621687199992], [-73.94940516399991, 40.79663170399987], [-73.94922045699984, 40.796909858999896], [-73.94909695599983, 40.79705785599992], [-73.94879165299983, 40.797477127999905], [-73.94831125500004, 40.79812921799992], [-73.94722520899997, 40.797671685999944], [-73.94670030999991, 40.797450543999894], [-73.9456668469999, 40.79700834399995], [-73.94556506799988, 40.79696479499997], [-73.94522698899986, 40.7968201329999], [-73.94509614699999, 40.79676348299994], [-73.9449594289999, 40.79670574099988], [-73.94421313799992, 40.79638585799993], [-73.94415121699987, 40.79635931699993], [-73.94348323999992, 40.796072993999935], [-73.94287776199995, 40.7958216709999], [-73.94275347999998, 40.79577008499989], [-73.9424792319999, 40.79565624799992], [-73.94232710899988, 40.795593102999895], [-73.94187604699994, 40.79540586899984], [-73.942346766, 40.79476079799989], [-73.94281682199988, 40.79413407699997], [-73.94327251199996, 40.79348810299993], [-73.94103496899987, 40.79254666899993]]]}}, {\&quot;id\&quot;: \&quot;75\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 76, \&quot;Shape_Leng\&quot;: 0.241203016269, \&quot;Shape_Area\&quot;: 0.00126660143241, \&quot;zone\&quot;: \&quot;East New York\&quot;, \&quot;LocationID\&quot;: 76, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88063900599983, 40.679176984999856], [-73.88061377799994, 40.679110031999876], [-73.88015110700003, 40.67924206299993], [-73.87974063299995, 40.67936096099988], [-73.87926692499995, 40.679491084999896], [-73.87862924200003, 40.67967653299995], [-73.87838855899999, 40.67973905399991], [-73.877426862, 40.6800144369999], [-73.87688955199985, 40.68016499699994], [-73.87657495299996, 40.68016700199996], [-73.8755670759999, 40.68016946499992], [-73.87531627599998, 40.68011098399988], [-73.87507136399991, 40.68003514599991], [-73.87483538999999, 40.679942569999874], [-73.87461126400001, 40.679834253999964], [-73.8744016199999, 40.67971160899987], [-73.87420866699985, 40.67957633999987], [-73.87404657399993, 40.67942964799988], [-73.87389692799991, 40.67927472199993], [-73.87376075799997, 40.679112496999885], [-73.87363895999985, 40.678944030999894], [-73.87353219499991, 40.67877042099986], [-73.87342767099986, 40.67861884699991], [-73.87331183100002, 40.678471800999894], [-73.87318521799988, 40.678330001999946], [-73.87304845699995, 40.678194106999904], [-73.87257015500002, 40.67786660999989], [-73.87231018000001, 40.67775574699987], [-73.87204099299996, 40.677657418999935], [-73.87176417499987, 40.677572227999875], [-73.87148141800003, 40.6775006639999], [-73.870458215, 40.67722236799989], [-73.86977606799984, 40.67702720899994], [-73.86942312899993, 40.67691222799995], [-73.86838105899999, 40.67653059899985], [-73.86725717699987, 40.676112684999936], [-73.86627349499987, 40.6757640459999], [-73.86521514199991, 40.67538657399996], [-73.86455313199994, 40.675151121999896], [-73.86413333499988, 40.67499725199989], [-73.86310051, 40.67464721299993], [-73.86176409699988, 40.67423226099992], [-73.86106294999989, 40.67434293499984], [-73.86107192499996, 40.67401981399992], [-73.86077512799977, 40.67280562199989], [-73.86038937900003, 40.67126877499985], [-73.85947416499987, 40.671380531999944], [-73.85855480399997, 40.67153293399986], [-73.85763323199998, 40.67165619399985], [-73.85730947699993, 40.67041623299989], [-73.8572848669999, 40.6703219889999], [-73.85726744599997, 40.670255293999965], [-73.85724675799997, 40.670174050999925], [-73.85722693699994, 40.670096211999876], [-73.85684676199999, 40.668602934999925], [-73.85646311899993, 40.66704176299991], [-73.85618809699999, 40.66584655499992], [-73.85610973799986, 40.66550601099989], [-73.85568461199988, 40.66386749199993], [-73.85611710199991, 40.663808401999844], [-73.85659075099987, 40.66374715999991], [-73.85753563299991, 40.66359786299995], [-73.85842950899992, 40.66345335999987], [-73.85811779299999, 40.66203657099987], [-73.8580250429998, 40.66172104999989], [-73.85792219800001, 40.6613188559999], [-73.85761052799985, 40.660108355999924], [-73.85851436399994, 40.65989894199987], [-73.859386918, 40.6597727149999], [-73.8603597819999, 40.65964582899991], [-73.86122244999984, 40.659220936999894], [-73.86174758999981, 40.65893835699988], [-73.86317083299996, 40.65827651199994], [-73.86269778299766, 40.65761830900614], [-73.86300202201295, 40.657488116627256], [-73.86300994210443, 40.65747609303757], [-73.86301532164248, 40.65746328042212], [-73.86301803082985, 40.657449987927706], [-73.86301800429979, 40.65743653627954], [-73.86301524269408, 40.65742325004282], [-73.86300981264718, 40.65741044979137], [-73.86300184517782, 40.6573984443731], [-73.86301297536053, 40.657349024043626], [-73.86300267139957, 40.65733403625386], [-73.86299489115147, 40.65731819000542], [-73.86298975506234, 40.65730173061768], [-73.86299451835025, 40.65728255653711], [-73.86300321589033, 40.6572642008645], [-73.86301562734518, 40.65724712860224], [-73.8630314382944, 40.657231772240266], [-73.86305024819939, 40.657218520799205], [-73.86307158054906, 40.65720770997593], [-73.86307775804119, 40.65721242301864], [-73.86308485453102, 40.65721631374498], [-73.86309268342231, 40.657219279851915], [-73.86310103886122, 40.657221243347905], [-73.86310970114857, 40.65722215260464], [-73.86311844251696, 40.657221983714], [-73.86312343186994, 40.65721921414201], [-73.86312777533718, 40.65721587249529], [-73.86313136108828, 40.65721204481046], [-73.86313409680184, 40.65720782963826], [-73.86313591204231, 40.65720333550579], [-73.86313676007325, 40.65719867812249], [-73.86313661906057, 40.65719397740099], [-73.86313549263544, 40.657189354369905], [-73.86313340979943, 40.657184928057], [-73.86313042417935, 40.65718081242592], [-73.86312661264536, 40.657177113440476], [-73.86312207333215, 40.65717392633775], [-73.86312086315435, 40.6571678659817], [-73.86312096522205, 40.657161736440834], [-73.86312237680909, 40.65715570140494], [-73.86312506021913, 40.65714992204003], [-73.8631289437907, 40.657144552684535], [-73.86313392381267, 40.657139736727196], [-73.86313986729341, 40.65713560277828], [-73.8631466155115, 40.65713226123533], [-73.86315398825552, 40.65712980133423], [-73.86315810974206, 40.65708778410358], [-73.86321868203983, 40.65704187934266], [-73.86321606220991, 40.65703782728763], [-73.86321439496035, 40.6570334928127], [-73.86321372982172, 40.65702900468712], [-73.86321408655384, 40.65702449624463], [-73.86321545455876, 40.657020101422546], [-73.86321779319539, 40.65701595078287], [-73.86322103298691, 40.65701216763333], [-73.8632250776853, 40.65700886436401], [-73.86322980713008, 40.6570061391089], [-73.86323508081834, 40.6570040728301], [-73.8632407420788, 40.6570027269128], [-73.86324662272614, 40.65700214134173], [-73.86326056957371, 40.65698307345786], [-73.86327051713553, 40.65696260378152], [-73.86327623068586, 40.656941215328104], [-73.86324988488909, 40.656900408905685], [-73.86321767415188, 40.656862120798515], [-73.86318000805555, 40.65682683785396], [-73.86313736554554, 40.65679500870645], [-73.86309028884169, 40.656767038074264], [-73.86303937654401, 40.65674328161242], [-73.86300171715261, 40.65665375737019], [-73.86303117341409, 40.656508181683144], [-73.86303820106212, 40.65650375080435], [-73.863044194545, 40.656498512212096], [-73.86304899586064, 40.65649260400802], [-73.86305247843529, 40.65648618194618], [-73.86305455046099, 40.65647941532709], [-73.86305515731418, 40.656472482534596], [-73.86305428299774, 40.65646556633301], [-73.86305195056094, 40.6564588490495], [-73.86304822149259, 40.65645250776703], [-73.86304319409992, 40.65644670965629], [-73.86303700091668, 40.65644160756877], [-73.86302980520972, 40.656437336007194], [-73.8630130787124, 40.65641760960361], [-73.86299992602065, 40.656396371337], [-73.86299057835193, 40.65637399457031], [-73.86299398147607, 40.65636539001103], [-73.86299920962628, 40.65635733382082], [-73.86300611826856, 40.656350048715005], [-73.86301451641084, 40.65634373609222], [-73.86302417188485, 40.65633857046629], [-73.8630348177622, 40.65633469464218], [-73.86304615973482, 40.6563322157678], [-73.86305788425207, 40.65633120237212], [-73.86306966718652, 40.6563316824709], [-73.86312378925449, 40.6563899390293], [-73.86313059624987, 40.65639524283843], [-73.8631384969637, 40.656399578800716], [-73.86314725719119, 40.65640281838299], [-73.8631566172485, 40.656404865552574], [-73.86316629966998, 40.6564056596242], [-73.86317601743468, 40.65640517705863], [-73.86318487953123, 40.65639753532538], [-73.8631920616611, 40.65638893130981], [-73.86319738674325, 40.65637957715094], [-73.86320072348435, 40.65636970348318], [-73.86320198961536, 40.65635955374959], [-73.86320115391976, 40.656349378199856], [-73.86319823700312, 40.65633942771994], [-73.86319331078552, 40.65632994764667], [-73.86318649672684, 40.6563211717182], [-73.86312264260036, 40.65621227417521], [-73.86305132215273, 40.6561060983717], [-73.86297273468902, 40.656002940964], [-73.8628870998149, 40.65590309017312], [-73.86279465682358, 40.65580682498031], [-73.86269566402707, 40.655714414347514], [-73.8626411734316, 40.65566753700771], [-73.86173355547587, 40.655295221774004], [-73.86158297119158, 40.65528829429209], [-73.86143294284753, 40.65527625603836], [-73.86128376936315, 40.65525913099786], [-73.86113574795394, 40.655236953291066], [-73.86098917376947, 40.65520976705256], [-73.86059601899994, 40.65477969699992], [-73.86056716699993, 40.654747451999874], [-73.86052767799987, 40.6547059619999], [-73.86048308199992, 40.65465892899989], [-73.86042178299996, 40.65461220199988], [-73.85975533686633, 40.65410417609493], [-73.85898002989568, 40.65267545791771], [-73.85695870295893, 40.65058737348713], [-73.85701278090167, 40.65054096134554], [-73.85706090518094, 40.65049089031753], [-73.85710265151224, 40.650437602309765], [-73.8571376518816, 40.65038156710168], [-73.85716559774956, 40.650323278690045], [-73.85718624276892, 40.6502632509345], [-73.85720730991866, 40.65023104914557], [-73.85723212115558, 40.65020043363679], [-73.85726047236975, 40.65017165626019], [-73.8575242937435, 40.64999619023134], [-73.85759335427862, 40.649397285892846], [-73.85770542077616, 40.648745971467285], [-73.85783469416334, 40.648302338287635], [-73.85837605251689, 40.64727441531264], [-73.85839397177297, 40.647139412197646], [-73.85840315341014, 40.64700390123735], [-73.85840357526584, 40.64686821031541], [-73.85839523637277, 40.646732667748836], [-73.85837815696057, 40.64659760149385], [-73.8583523784073, 40.6464633383521], [-73.85831796313752, 40.646330203180305], [-73.8582749944715, 40.646198518103844], [-73.85822357642378, 40.64606860173777], [-73.85816383344905, 40.645940768415805], [-73.85809591014267, 40.645815327430086], [-73.85801997088917, 40.64569258228269], [-73.85793619946534, 40.6455728299514], [-73.85784479859338, 40.64545636017166], [-73.85774598945184, 40.6453434547353], [-73.85772560911354, 40.64532159083552], [-73.85763299887402, 40.6451968240604], [-73.85754830556488, 40.645068835220016], [-73.85747172186305, 40.644937915557776], [-73.85740342198902, 40.64480436298478], [-73.85734356130943, 40.64466848140127], [-73.85729227598536, 40.64453058000568], [-73.85724968266203, 40.64439097259035], [-73.85721587820477, 40.6442499768278], [-73.85719093947807, 40.644107913547664], [-73.85717492317225, 40.64396510600649], [-73.85716786567292, 40.643821879152576], [-73.85716978298207, 40.64367855888597], [-73.8574134314329, 40.64359349657502], [-73.85766067130159, 40.64351467655158], [-73.85791122705675, 40.64344218665107], [-73.85816481947492, 40.64337610765482], [-73.85842116595126, 40.64331651319946], [-73.85867998081395, 40.64326346969551], [-73.85894097564288, 40.64321703625277], [-73.85920385959095, 40.6431772646152], [-73.85946833970695, 40.6431441991029], [-73.85973412126268, 40.64311787656272], [-73.86000090808096, 40.64309832632753], [-73.86026840286512, 40.64308557018329], [-73.8605284136282, 40.64307059470142], [-73.86078784559764, 40.64305062748121], [-73.86104653361731, 40.64302568123402], [-73.86130431300528, 40.64299577184074], [-73.86156101965909, 40.64296091834184], [-73.86178755735516, 40.642925904886596], [-73.86201301027748, 40.64288704102003], [-73.86289463224384, 40.64255067968245], [-73.86331138939109, 40.642299129028494], [-73.86379865777398, 40.641799578171785], [-73.86439393961581, 40.64141360621634], [-73.86509362394393, 40.64093967569411], [-73.86531173665126, 40.64075119144387], [-73.86670411973783, 40.6400217634955], [-73.86609210225917, 40.63943387946263], [-73.86598797060661, 40.63950441118262], [-73.86535389969112, 40.638951293675774], [-73.86534275703448, 40.63890203859465], [-73.86536256486231, 40.63883569112215], [-73.86548637000524, 40.638765183481624], [-73.86557348743777, 40.6387695662165], [-73.86563247391335, 40.63878676362291], [-73.86625535025003, 40.63931631406574], [-73.86617093011522, 40.639367600569045], [-73.86681528201245, 40.6399635276668], [-73.86702994403059, 40.639851069021354], [-73.86732291072707, 40.63987198395282], [-73.86867282895084, 40.640925079203356], [-73.8699123933944, 40.64327820299355], [-73.87001708273587, 40.64407137240543], [-73.87061492461066, 40.64485674188673], [-73.87119172949637, 40.64530535631248], [-73.87157174183598, 40.64541496283752], [-73.8719847673393, 40.64544587181563], [-73.87212202857904, 40.645423703864466], [-73.87257043102892, 40.64557561235967], [-73.87337828287791, 40.64671520526748], [-73.87342508856524, 40.6467812305158], [-73.87346558258602, 40.64681663296923], [-73.87352036861594, 40.6468762094049], [-73.87623339658143, 40.650554274824266], [-73.87629452461884, 40.65063714033261], [-73.87921658230903, 40.65459108377298], [-73.87926863785954, 40.65456913073254], [-73.87933211680556, 40.65462201684979], [-73.8796386550231, 40.65449909180424], [-73.87971979034293, 40.65437592977636], [-73.87924124622316, 40.653737186432], [-73.87910837392907, 40.65370623553959], [-73.87676193956291, 40.65056095449518], [-73.87672243382207, 40.65037540309043], [-73.87672192491898, 40.6503232219678], [-73.87395425313315, 40.64644443461837], [-73.87390127736091, 40.64636836786121], [-73.87386034009012, 40.64631440660161], [-73.87382160378151, 40.64625653142808], [-73.87375709027744, 40.64616014330094], [-73.8736728495642, 40.646067979143226], [-73.87360265286914, 40.64596662919093], [-73.87352462463141, 40.64587122906811], [-73.87345352818083, 40.645752814416575], [-73.87342337082691, 40.6456507035949], [-73.8733574021273, 40.645594475914194], [-73.87330678000762, 40.64558267959164], [-73.87318593330937, 40.64544501336156], [-73.87331378312935, 40.64522208871266], [-73.87335638175688, 40.645114714533555], [-73.87339074846517, 40.64500564205859], [-73.8734167680292, 40.64489523711673], [-73.87343435322148, 40.64478387000366], [-73.87344344510424, 40.644671914240746], [-73.87344401322652, 40.64455974532177], [-73.87343605572586, 40.64444773945352], [-73.87341959933369, 40.644336272293806], [-73.8733946992858, 40.644225717692095], [-73.87336143913527, 40.64411644643527], [-73.87331993047317, 40.64400882500423], [-73.87327031255236, 40.6439032143449], [-73.87309815600656, 40.643934684043515], [-73.87297320732566, 40.64383923106529], [-73.87275635704977, 40.6432489646548], [-73.87194880116543, 40.64239408453872], [-73.87189439830122, 40.642248236727454], [-73.87088107173645, 40.64077187075254], [-73.87084503422264, 40.640556620183226], [-73.87061752711526, 40.64038627866385], [-73.87043578304258, 40.64029080737933], [-73.87008544224433, 40.63984418136626], [-73.87007958407006, 40.639211694017035], [-73.86989583386247, 40.63893452891954], [-73.86977753759143, 40.63884414565845], [-73.86952435189357, 40.638645701918655], [-73.86859780095368, 40.638349566578306], [-73.86808857108026, 40.63818561428028], [-73.86799709668125, 40.63811526520958], [-73.8686067398553, 40.63774336259496], [-73.86926691693779, 40.637311481309595], [-73.86960972136559, 40.63708553460871], [-73.86961569339263, 40.63709056489554], [-73.86962489466698, 40.637083191836915], [-73.86969549818932, 40.63714738961505], [-73.8692084611063, 40.637465809261], [-73.86955902490304, 40.6379474843275], [-73.86976333670746, 40.63786528033555], [-73.86997059067167, 40.63778746815808], [-73.870180624162, 40.637714108851334], [-73.87025308570794, 40.63769004523161], [-73.87042969307484, 40.63763400156946], [-73.87060795904935, 40.63758109327911], [-73.87077065591667, 40.6375237119634], [-73.87093022302477, 40.63746143911107], [-73.87108640707612, 40.63739437357764], [-73.87123896014546, 40.63732262182698], [-73.87138764007423, 40.637246297761536], [-73.87153221085434, 40.63716552254151], [-73.8716724430032, 40.63708042439297], [-73.87243460834033, 40.63654851920012], [-73.87255337118395, 40.636493365056346], [-73.872676601456, 40.636444226820885], [-73.87280377480171, 40.63640131357759], [-73.87293435009087, 40.636364807922334], [-73.87306777172168, 40.636334865186626], [-73.87320347198329, 40.6363116127764], [-73.87334087347163, 40.63629514963032], [-73.87347939154502, 40.63628554579879], [-73.87368012187775, 40.636349316203116], [-73.87387767294561, 40.63641860954281], [-73.87407178301434, 40.63649333401509], [-73.87426219490607, 40.636573390621486], [-73.87444865634032, 40.636658673298705], [-73.87463092026667, 40.63674906905968], [-73.87480874519362, 40.63684445814244], [-73.8749818955075, 40.63694471416899], [-73.87515014178462, 40.637049704312986], [-73.87531326109587, 40.63715928947522], [-73.8754710373013, 40.637273324467614], [-73.87562736530136, 40.6374406598268], [-73.87579100112605, 40.63760389050788], [-73.87596175925121, 40.6377628313934], [-73.87613944607081, 40.63791730222954], [-73.87632386011742, 40.63806712783068], [-73.87664550484685, 40.638294638557646], [-73.87696550124826, 40.638523495048375], [-73.87702388943292, 40.63857717609552], [-73.87708844516781, 40.63862658898945], [-73.87715863327793, 40.63867132408132], [-73.87723387188987, 40.63871101050158], [-73.87731353725628, 40.63874531923534], [-73.87739696892777, 40.63877396585033], [-73.87748347522731, 40.63879671285495], [-73.87757233898627, 40.63881337166764], [-73.8776628234893, 40.63882380417986], [-73.87778782070119, 40.63882050261284], [-73.87791286639488, 40.638822468673865], [-73.87803757833375, 40.638829696353355], [-73.87816157529974, 40.63884216355752], [-73.87828447826044, 40.638859832176976], [-73.87835076562644, 40.63887161374519], [-73.87841589406925, 40.638912189353306], [-73.87797341300002, 40.63980711799987], [-73.87752894599991, 40.64071679999995], [-73.8773424829999, 40.641082679999904], [-73.87709627099984, 40.641602954999875], [-73.87683348999987, 40.64211858899987], [-73.87654859999992, 40.64263892799989], [-73.8761993309999, 40.643257172999895], [-73.87617767099991, 40.643289658999905], [-73.87616087400002, 40.64332052799993], [-73.87596309099979, 40.643644483999935], [-73.87545861899982, 40.64442693099989], [-73.87530646399993, 40.64465566899992], [-73.874953578, 40.64514158399989], [-73.8745808109999, 40.64561010599992], [-73.87468212999995, 40.6456544679999], [-73.87610398000004, 40.6462147889999], [-73.87679877399998, 40.64714224999992], [-73.87798475599999, 40.64872529299991], [-73.87843582199996, 40.649327343999914], [-73.87908517399995, 40.65020211699988], [-73.87992598699992, 40.651334759999905], [-73.88141998000002, 40.653347175999926], [-73.88172188099986, 40.653753826999846], [-73.88220052999989, 40.65444157599989], [-73.88221364899994, 40.65451863799996], [-73.88278243099995, 40.65426976799992], [-73.88465215799992, 40.65345165399985], [-73.8855122199999, 40.65309253199994], [-73.88621116599981, 40.65280058399992], [-73.88628975299989, 40.65276890099989], [-73.88637373700001, 40.65273440399987], [-73.88713099000002, 40.65239391599988], [-73.88794902799988, 40.652040973999924], [-73.88876540999999, 40.65169059099987], [-73.88959044299983, 40.651337545999866], [-73.89000589199988, 40.651148696999925], [-73.8900378249999, 40.6511781769999], [-73.89136543599977, 40.65236471899988], [-73.89245737399976, 40.653710938999886], [-73.89354677099988, 40.65520271399988], [-73.89441113999996, 40.6548329489999], [-73.89520540399988, 40.654487929999895], [-73.89546427299999, 40.65437757699991], [-73.89558884499993, 40.65432447199986], [-73.8959444279999, 40.654172887999934], [-73.89667745599995, 40.65385495699996], [-73.89678213299993, 40.65380955599988], [-73.89741344699992, 40.653538319999896], [-73.89761013299987, 40.65345381599992], [-73.89746257800005, 40.653321056999886], [-73.89684143499989, 40.65276219199989], [-73.89676845099996, 40.65269652599995], [-73.896634179, 40.65257571499996], [-73.89654981299998, 40.652499805999916], [-73.89619634499996, 40.652181767999906], [-73.89610981499999, 40.65210391199988], [-73.89586154900002, 40.65188052699987], [-73.89621590699987, 40.65164801899989], [-73.89627957599997, 40.65160624199991], [-73.89655685999999, 40.65142430299996], [-73.89661390699996, 40.65138687099991], [-73.89675272299998, 40.65129578599992], [-73.896807004, 40.65126016999988], [-73.89721054799986, 40.65099537899994], [-73.89727504499993, 40.650953162999876], [-73.897365881, 40.65089370699991], [-73.89742477899996, 40.6508550119999], [-73.89757174800003, 40.65075888699994], [-73.89771516099994, 40.65066508899988], [-73.8977945719999, 40.65061310899986], [-73.89797649499998, 40.650494030999894], [-73.89872808799994, 40.650024606999885], [-73.89946894299986, 40.649541768999924], [-73.90019369799995, 40.64908881799994], [-73.90027087999994, 40.649037770999946], [-73.90056999899996, 40.64884760699989], [-73.90074707899997, 40.6487354449999], [-73.90089120800002, 40.648641709999886], [-73.90165833699982, 40.64814221199989], [-73.90235538599994, 40.64768960199993], [-73.903099438, 40.64719961099992], [-73.90398200599991, 40.64662856799988], [-73.9050958029999, 40.64760685199993], [-73.90579983699993, 40.64826507899992], [-73.90588893999983, 40.64834514399994], [-73.90637218799996, 40.6487793819999], [-73.90754641399995, 40.64983425399987], [-73.90761503399983, 40.649895893999876], [-73.90827570699999, 40.65049857399994], [-73.90849084299998, 40.650586417999875], [-73.90868769500001, 40.65072148099995], [-73.90944846399994, 40.65152159899992], [-73.90855790499995, 40.65209593799989], [-73.90821606899983, 40.65231208699988], [-73.90740035699999, 40.6528439899999], [-73.90780156999993, 40.654438948999925], [-73.90782538299986, 40.65453360399992], [-73.90784346399994, 40.65459152999988], [-73.90692334299995, 40.65473841999989], [-73.906067832, 40.6548638509999], [-73.90556272799998, 40.654937909999866], [-73.90507059799985, 40.655010060999935], [-73.90489261799983, 40.65503619999986], [-73.90446144000003, 40.655099535999895], [-73.90414221400002, 40.65514642099993], [-73.90317858399993, 40.655311633999915], [-73.90298366699997, 40.655380780999906], [-73.90279641599983, 40.655463210999876], [-73.90261911399985, 40.65555811099995], [-73.90245383299998, 40.6556643669999], [-73.90230238299979, 40.65578061099992], [-73.901185599, 40.6565145509999], [-73.90064904799996, 40.65704155799989], [-73.900574915, 40.657099946999885], [-73.90048767199994, 40.65714867899987], [-73.9003948669999, 40.657184204999936], [-73.9002942619999, 40.657208882999925], [-73.90002679299982, 40.65725384799987], [-73.89988986899985, 40.6572745209999], [-73.89968548099993, 40.65729793799992], [-73.89948109299996, 40.65732134299993], [-73.899041804, 40.657371657999846], [-73.89891727499989, 40.65739022499992], [-73.89880698499995, 40.65740666199988], [-73.89796594499987, 40.65753203599994], [-73.89704215399999, 40.65766358899991], [-73.89612587299993, 40.657814663999936], [-73.89613759299986, 40.6578822489999], [-73.8961675609999, 40.657978451999924], [-73.89571848099996, 40.65815995999984], [-73.89491382099995, 40.65852644899994], [-73.8940984499999, 40.65887791999994], [-73.89327894299984, 40.659230173999916], [-73.89246408899987, 40.659580274999925], [-73.89164919999989, 40.65993257599996], [-73.89083184199988, 40.660283967999895], [-73.89001492699988, 40.66063583299995], [-73.88919997600003, 40.6609880809999], [-73.88838556399988, 40.66133773899992], [-73.88756863499995, 40.66168908099994], [-73.88681373099988, 40.66201382299991], [-73.88593573999994, 40.66239371299988], [-73.88511751799982, 40.662745639999876], [-73.88430189299984, 40.66309545699992], [-73.88348677599993, 40.663447816999906], [-73.88309163, 40.66361709199986], [-73.88266944200001, 40.66379795399993], [-73.88185557299985, 40.66414998799994], [-73.88208825799985, 40.66446414699991], [-73.88330883399975, 40.66611200499991], [-73.88391264599986, 40.66585179899992], [-73.88412170000004, 40.665760741999854], [-73.88474247400003, 40.66549489399995], [-73.88493743699995, 40.665407108999936], [-73.88556364499998, 40.66514048699991], [-73.88641344699995, 40.66478080699991], [-73.88657767900006, 40.6647080369999], [-73.88726131299987, 40.66441357399985], [-73.88739217299995, 40.66435345699988], [-73.88810817399994, 40.664047411999896], [-73.88898470699996, 40.663916614999884], [-73.889906696, 40.66377828999986], [-73.89029917799994, 40.66531175899996], [-73.89069385399985, 40.66685223399992], [-73.88976988599985, 40.66698991499991], [-73.89016521899985, 40.668524376999876], [-73.89055869, 40.67006023099991], [-73.89087805100002, 40.671318086999875], [-73.8917995219999, 40.67118041299995], [-73.89271090700004, 40.67104582799992], [-73.89302801299988, 40.67231449199992], [-73.89335128299989, 40.67358164599988], [-73.89367036399987, 40.67482177099988], [-73.89459383999989, 40.6746841039999], [-73.895499435, 40.67455074399987], [-73.89650978, 40.67439704799988], [-73.89748422799983, 40.674255484999954], [-73.89838655899997, 40.67412124399994], [-73.89930675399987, 40.67398204199991], [-73.8997089949999, 40.67549424999994], [-73.89971755899985, 40.6755642639999], [-73.89972239699993, 40.675603736999896], [-73.89973501099999, 40.675654870999914], [-73.89974568900007, 40.67571196399987], [-73.9000274839998, 40.67681911399995], [-73.90004626199993, 40.67689308999995], [-73.89992296499994, 40.67694927299984], [-73.89912562799992, 40.67731263799992], [-73.89883201599999, 40.677446439999855], [-73.89836229199989, 40.677658275999875], [-73.89783505699992, 40.67799357599992], [-73.89775655599985, 40.67806072099989], [-73.89761600399984, 40.67811198799995], [-73.89747545199997, 40.67816325499989], [-73.89695521899982, 40.67840924299985], [-73.8965367649999, 40.67859358099985], [-73.89621773699986, 40.67735818399991], [-73.89531770399991, 40.67749603799994], [-73.8943888149999, 40.677629888999896], [-73.8934840539999, 40.677762060999896], [-73.89257905399984, 40.67790012399996], [-73.89167121099989, 40.67803172099987], [-73.89077319200003, 40.678164588999934], [-73.88987439199998, 40.67830214999987], [-73.88900569799982, 40.678557043999916], [-73.8881563449999, 40.67882783499992], [-73.88730460899997, 40.67909753699995], [-73.88643790499991, 40.67937347599991], [-73.88555502399997, 40.67965659699994], [-73.88467046600006, 40.679940284999894], [-73.88489254699988, 40.68081111599983], [-73.88397193799985, 40.68094711499989], [-73.88303083299995, 40.68108517499993], [-73.88210725299986, 40.68121749099986], [-73.88116730300005, 40.68135366299988], [-73.88109834200004, 40.68107447699986], [-73.88063900599983, 40.679176984999856]]]}}, {\&quot;id\&quot;: \&quot;76\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 77, \&quot;Shape_Leng\&quot;: 0.075461081444, \&quot;Shape_Area\&quot;: 0.000191917981315, \&quot;zone\&quot;: \&quot;East New York/Pennsylvania Avenue\&quot;, \&quot;LocationID\&quot;: 77, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8997089949999, 40.67549425099991], [-73.89930675399987, 40.67398204199991], [-73.89838655899997, 40.67412124399994], [-73.89748422799983, 40.674255484999954], [-73.89650978, 40.67439704799988], [-73.895499435, 40.67455074399987], [-73.89459383999989, 40.6746841039999], [-73.89367036399987, 40.67482177099988], [-73.89335128299989, 40.67358164599988], [-73.89302801299988, 40.67231449199992], [-73.89271090699994, 40.671045828999915], [-73.8917995219999, 40.67118041299995], [-73.89087805100002, 40.671318086999875], [-73.89055869, 40.67006023099991], [-73.89016521899985, 40.668524376999876], [-73.88976988599985, 40.66698991499991], [-73.89069385399985, 40.66685223399992], [-73.89029917799994, 40.66531175899996], [-73.889906696, 40.66377828999986], [-73.88898470699996, 40.663916614999884], [-73.88810817399994, 40.664047411999896], [-73.88739217299995, 40.66435345699988], [-73.88726131299987, 40.66441357399985], [-73.88657767900006, 40.6647080369999], [-73.88641344699995, 40.66478080699991], [-73.88556364499998, 40.66514048699991], [-73.88493743699995, 40.665407108999936], [-73.88474247400003, 40.66549489399995], [-73.88412170000004, 40.665760741999854], [-73.88391264599986, 40.66585179899992], [-73.88330883399975, 40.66611200499991], [-73.88208825799985, 40.66446414699991], [-73.88185557299985, 40.66414998799994], [-73.88266944200001, 40.66379795399993], [-73.88309163100001, 40.66361709099988], [-73.88348677599993, 40.663447816999906], [-73.88430189399988, 40.66309545699991], [-73.88511751799982, 40.662745639999876], [-73.88593573999994, 40.66239371299988], [-73.88681373099988, 40.66201382299991], [-73.88756863499995, 40.66168908099994], [-73.88838556499994, 40.66133773799988], [-73.88919997600003, 40.6609880809999], [-73.89001492699988, 40.66063583299995], [-73.89083184299982, 40.660283967999895], [-73.89164919999989, 40.65993257599996], [-73.89246408799995, 40.659580274999925], [-73.89327894299984, 40.659230173999916], [-73.8940984499999, 40.65887791999994], [-73.89491381999983, 40.658526448999886], [-73.89571848199988, 40.65815995999985], [-73.8961675609999, 40.657978451999924], [-73.89613759299986, 40.6578822489999], [-73.89612587399984, 40.657814663999915], [-73.89704215399999, 40.65766358899991], [-73.89796594499987, 40.65753203599994], [-73.89880698499995, 40.65740666199988], [-73.89881834799998, 40.65745381299991], [-73.89883571499976, 40.657525941999936], [-73.89921760899985, 40.65911140399994], [-73.89965233299985, 40.66073541599994], [-73.89972880499995, 40.66070453499989], [-73.89988908799995, 40.66063980699986], [-73.900146584, 40.66065327699988], [-73.90066118699986, 40.66058615799992], [-73.90105329800004, 40.66212482099994], [-73.90145114700002, 40.66365836499993], [-73.90071711999985, 40.66376455299993], [-73.90050930099981, 40.663793574999914], [-73.90041654099997, 40.663806526999934], [-73.9008513569999, 40.665345894999895], [-73.90126570400001, 40.66688064999991], [-73.90166767899989, 40.668413528999885], [-73.90198218099997, 40.669670070999906], [-73.90228822599984, 40.67093600699995], [-73.90266008399996, 40.67219717899991], [-73.90296768999997, 40.67343939499992], [-73.9032213189999, 40.67447291399992], [-73.90344272399983, 40.67537791899986], [-73.90346228899996, 40.675457918999896], [-73.90347422300006, 40.67550668299985], [-73.90313803899994, 40.67562221499988], [-73.90302076399996, 40.675656480999905], [-73.90291887299995, 40.675684580999864], [-73.90279745999989, 40.67575749299986], [-73.90267831799984, 40.6757897289999], [-73.90257716399994, 40.67583170699991], [-73.90245583099997, 40.6758820509999], [-73.90096234799994, 40.67650221199989], [-73.90079183699987, 40.67657245799992], [-73.90004626199993, 40.67689308999995], [-73.9000274839998, 40.67681911399995], [-73.89974568900007, 40.67571196399987], [-73.89973501099999, 40.675654870999914], [-73.89972239699999, 40.67560373799994], [-73.89971755899985, 40.6755642639999], [-73.8997089949999, 40.67549425099991]]]}}, {\&quot;id\&quot;: \&quot;77\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 78, \&quot;Shape_Leng\&quot;: 0.0935944495806, \&quot;Shape_Area\&quot;: 0.000191114419551, \&quot;zone\&quot;: \&quot;East Tremont\&quot;, \&quot;LocationID\&quot;: 78, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.88963328299991, 40.85317381799993], [-73.88993961599995, 40.85259076299992], [-73.88987871399985, 40.85207022099993], [-73.88963044999998, 40.85188593199995], [-73.88951837699989, 40.85180274499989], [-73.88895256299988, 40.85144078099994], [-73.8887824569999, 40.851341184999924], [-73.88823974099995, 40.85103536599995], [-73.88800539899992, 40.85097610299994], [-73.88751770499984, 40.85094946799988], [-73.88643555899993, 40.850309427999875], [-73.88581418499989, 40.84993079699989], [-73.88480193499986, 40.84930945899987], [-73.88377755799993, 40.84868218399991], [-73.88322877699981, 40.84834587799986], [-73.88311982600001, 40.848221091999925], [-73.88278133699995, 40.84807038999989], [-73.88276104799992, 40.848057845999904], [-73.88284445599996, 40.847817225999954], [-73.88199829499979, 40.847235311999874], [-73.88106059899991, 40.84659008499992], [-73.88048011699989, 40.84619371599996], [-73.87919408799995, 40.84532173399988], [-73.87800756899993, 40.844484295999926], [-73.8773292409999, 40.84398312499995], [-73.878171756, 40.84262443699987], [-73.87757279999985, 40.84248377099988], [-73.87694201699995, 40.84233562799991], [-73.87686858199996, 40.84231710599989], [-73.876798721, 40.84229978699994], [-73.87608505099992, 40.84206482699991], [-73.87459175399982, 40.841520647999914], [-73.87456845, 40.84164271999992], [-73.87399295499982, 40.842561505999925], [-73.87280708199992, 40.843424263999964], [-73.87190184999997, 40.843721432999914], [-73.87184610299998, 40.84376077799993], [-73.87179038499981, 40.8438028139999], [-73.87109207899995, 40.84432478099992], [-73.87047298799992, 40.84542033999984], [-73.86944230399996, 40.84724417999992], [-73.86889243299996, 40.848112321999906], [-73.86941402699996, 40.848788024999884], [-73.86920944599997, 40.84923837199993], [-73.86837388899988, 40.8489695979999], [-73.86785992999985, 40.84886493099987], [-73.86800652899981, 40.84830196599988], [-73.86835465899985, 40.84708023299993], [-73.86843808099991, 40.84705127899987], [-73.86892652699994, 40.84688174099993], [-73.86883109200002, 40.84673752699992], [-73.86875399499986, 40.84658447099989], [-73.86875397099986, 40.8465844179999], [-73.8687539479999, 40.846584363999966], [-73.86869718899982, 40.8464246689999], [-73.86869712999989, 40.846424505999934], [-73.86869709399987, 40.84642434499988], [-73.86866197399985, 40.84626032399993], [-73.86866193799993, 40.84626015299994], [-73.86866192800001, 40.846259982999946], [-73.86864915099987, 40.84609409699992], [-73.86864914000002, 40.84609392599993], [-73.86864915200002, 40.846093754999906], [-73.8686587279999, 40.84592863299986], [-73.86865873999996, 40.84592845299991], [-73.86865877499986, 40.845928281999925], [-73.86869009299983, 40.84576627499991], [-73.86874186599977, 40.845609728999904], [-73.86863721699989, 40.845309842999896], [-73.86804200399997, 40.8448138389999], [-73.8688925879999, 40.844409658999936], [-73.86959555499995, 40.84398144199994], [-73.87030135699996, 40.8435486959999], [-73.87099518100001, 40.843111391999926], [-73.87153346199983, 40.84251428099987], [-73.87223024699988, 40.841643169999934], [-73.87229921099988, 40.84157999599991], [-73.87236365199989, 40.84147695999991], [-73.87244734699995, 40.84134426699992], [-73.87280724899995, 40.84086864499993], [-73.87326716999992, 40.84021994899994], [-73.87359713599987, 40.83979855499992], [-73.87561285199983, 40.839902520999885], [-73.87747229399999, 40.839983546999925], [-73.87791380399995, 40.8399703279999], [-73.87823856699993, 40.839985917999904], [-73.87831009099979, 40.8399893509999], [-73.87841924999984, 40.83999458999992], [-73.87850461299986, 40.840005593999905], [-73.8786598319999, 40.840019903999824], [-73.87978300299987, 40.840145825999855], [-73.87992249999996, 40.840154029999916], [-73.880061996, 40.840162234999845], [-73.88010086899989, 40.84006661599993], [-73.88027152599983, 40.83989623999985], [-73.88030767899997, 40.839717943999894], [-73.88030769199985, 40.8397178709999], [-73.88030771499984, 40.83971779899986], [-73.88036581299994, 40.839540578999895], [-73.88036583800002, 40.83954050699991], [-73.88036587199986, 40.839540434999904], [-73.88044586500001, 40.83936659699989], [-73.88044592299988, 40.839366479999924], [-73.88044599399986, 40.83936635399988], [-73.88054735399987, 40.839198110999895], [-73.88066887899986, 40.83903768799993], [-73.88066892599986, 40.83903762499989], [-73.88066897399986, 40.83903757099989], [-73.88080875199994, 40.83888725199996], [-73.88080895400005, 40.838887035999875], [-73.88080919100001, 40.83888681999984], [-73.880965322, 40.838748079999895], [-73.88113550199986, 40.83862214199998], [-73.88135107299988, 40.83840917199989], [-73.88138310599982, 40.83837771399988], [-73.88154924699987, 40.838182756999885], [-73.88160324799993, 40.83809985899994], [-73.88166303799993, 40.838028618999914], [-73.88169674899986, 40.83798711299989], [-73.88172047499994, 40.83795364899991], [-73.88182513299996, 40.837787064999915], [-73.88191969599985, 40.837616932999914], [-73.88200384100001, 40.837443781999895], [-73.88203937499988, 40.8375245929999], [-73.88206752699985, 40.837655624999876], [-73.88211370499987, 40.83778515499997], [-73.88217759099985, 40.837911036999905], [-73.88225831200006, 40.83803121799985], [-73.88235442499995, 40.83814382399988], [-73.88246404800005, 40.83824724099992], [-73.88285365099989, 40.83849533499994], [-73.88279558600006, 40.83854994599993], [-73.88274769899994, 40.8385923409999], [-73.8831387399999, 40.838810671999944], [-73.88351820399988, 40.8390223659999], [-73.88403342700002, 40.83930464099993], [-73.88412724499999, 40.83935591899995], [-73.88418143199976, 40.839335306999914], [-73.88435324499997, 40.83927764999993], [-73.88464898099988, 40.83917463299988], [-73.88469619299984, 40.83920338699989], [-73.88583496499986, 40.83989692699992], [-73.88618432099993, 40.8401050449999], [-73.88659802299989, 40.839279049999895], [-73.88754251799996, 40.839640657999944], [-73.88813752199994, 40.83986200199991], [-73.88869040799987, 40.83915802599988], [-73.88941724899988, 40.83942273399985], [-73.89017468599997, 40.839873667999896], [-73.89216815599981, 40.84104963999991], [-73.89317098899986, 40.84163734299991], [-73.89410150499995, 40.84219030199994], [-73.89484862699986, 40.84262825999986], [-73.89493579899987, 40.84267935899992], [-73.89501415699996, 40.84272529099994], [-73.89509807299986, 40.84277448099986], [-73.89527784899985, 40.84287986099988], [-73.89537836099996, 40.842938778999944], [-73.89484758699984, 40.84364636299994], [-73.89481942600001, 40.84368377099985], [-73.89479022099985, 40.8437203219999], [-73.89464252699996, 40.84390413999996], [-73.89398467499994, 40.844703958999936], [-73.89290102299996, 40.84626832999992], [-73.89337309899989, 40.84640119399996], [-73.89360906599997, 40.84644525599987], [-73.89384985999999, 40.84647439399987], [-73.8940930149999, 40.84648822299994], [-73.89433599299984, 40.846486680999874], [-73.89535848999982, 40.84651803199993], [-73.89617712999998, 40.8466583209999], [-73.89611702199987, 40.846778518999926], [-73.89557755999984, 40.847854641999895], [-73.89494627999981, 40.849104852999865], [-73.89407258999995, 40.85071318899992], [-73.89478764999994, 40.85108166699989], [-73.89431774099977, 40.851891310999854], [-73.89307140900002, 40.85324998699989], [-73.89216687399981, 40.85276946199989], [-73.89090203399996, 40.854116885999865], [-73.8906903199999, 40.854353261999954], [-73.89038953999983, 40.85468905799996], [-73.89003039600001, 40.854220991999945], [-73.88960978099988, 40.85362187999995], [-73.88963328299991, 40.85317381799993]]]}}, {\&quot;id\&quot;: \&quot;78\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 79, \&quot;Shape_Leng\&quot;: 0.0426249113144, \&quot;Shape_Area\&quot;: 0.000107893068218, \&quot;zone\&quot;: \&quot;East Village\&quot;, \&quot;LocationID\&quot;: 79, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.98377990999991, 40.72153595399992], [-73.98382387299982, 40.72147287199987], [-73.98467780299995, 40.72173060499991], [-73.98551686199984, 40.72198522499986], [-73.98628574000003, 40.722241919999874], [-73.98713584799998, 40.7224698109999], [-73.98786491500006, 40.72269708899991], [-73.98854361399988, 40.722903617999904], [-73.98863862799996, 40.7229337199999], [-73.9887568319999, 40.72297036599986], [-73.98939218099996, 40.723174057999884], [-73.99027361600001, 40.72342601799986], [-73.99102410399989, 40.723649431999895], [-73.99127307099994, 40.7237298129999], [-73.99135472799999, 40.72375461899987], [-73.99250385799984, 40.72410592499995], [-73.99260322199994, 40.72413644999987], [-73.99257987399992, 40.724201554999915], [-73.99232642199998, 40.72490823199993], [-73.99220971099992, 40.72523128999992], [-73.9920616679999, 40.72564244299991], [-73.99179379299984, 40.72639145899992], [-73.99154832699986, 40.72708947099994], [-73.99136388099988, 40.72755978299991], [-73.99135869199992, 40.72778246999995], [-73.99112256699988, 40.72856796599996], [-73.99093053499996, 40.7291422959999], [-73.99075728499993, 40.729740830999916], [-73.99072530399991, 40.729878686999896], [-73.99050558599988, 40.73056495699994], [-73.99039009999987, 40.731288523999865], [-73.99021190999987, 40.73199633399989], [-73.99002687699983, 40.73275628399994], [-73.98986852099996, 40.73352711499991], [-73.98990295999991, 40.7344347899999], [-73.98877931699997, 40.733965399999924], [-73.98718049699994, 40.733292147999876], [-73.98494102799992, 40.73234760399984], [-73.98255629299986, 40.731350133999875], [-73.98246876199994, 40.731314883999914], [-73.98150053399984, 40.730918076999934], [-73.98082000799998, 40.73063915899997], [-73.98034007599992, 40.73044246099994], [-73.97926849199996, 40.729981427999846], [-73.97802697999985, 40.729433059999984], [-73.97805542899995, 40.7293830859999], [-73.97853582999998, 40.72874608499992], [-73.97899862099985, 40.72810574699991], [-73.979469131, 40.727467676999865], [-73.97990650199998, 40.72686577299986], [-73.9803329819999, 40.72628033599988], [-73.98076713900005, 40.7256855949999], [-73.9812112959998, 40.72507279999992], [-73.981636639, 40.72449348099985], [-73.9820824239999, 40.72388204399991], [-73.98252449499985, 40.723277976999945], [-73.9829641439999, 40.72267132499997], [-73.98344363599992, 40.72201850699989], [-73.98377990999991, 40.72153595399992]]]}}, {\&quot;id\&quot;: \&quot;79\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 80, \&quot;Shape_Leng\&quot;: 0.117212621448, \&quot;Shape_Area\&quot;: 0.00040732245622, \&quot;zone\&quot;: \&quot;East Williamsburg\&quot;, \&quot;LocationID\&quot;: 80, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.93174841322003, 40.728053727696675], [-73.93168317826739, 40.72803172609697], [-73.93166858749639, 40.72803828280952], [-73.93157356186828, 40.7280182950609], [-73.93120770151333, 40.72794133862442], [-73.9308047913174, 40.72784883926168], [-73.93072254234549, 40.72784107268961], [-73.93032635559958, 40.72779514224887], [-73.92991812728, 40.72763889835636], [-73.92983531275382, 40.72760788932665], [-73.92966308042121, 40.727543397711244], [-73.92965484905174, 40.727547652551394], [-73.92963224605802, 40.72756459428362], [-73.92962400635008, 40.72757757457619], [-73.92962734303951, 40.727600054005656], [-73.92961163522367, 40.72761121943942], [-73.92958020690887, 40.72761282070866], [-73.9294975342307, 40.72755906458196], [-73.92942476304782, 40.727511752515085], [-73.92937588603782, 40.72747996953887], [-73.92924333948385, 40.72739794231863], [-73.92926898893549, 40.72736521532118], [-73.92886953254997, 40.72700263162835], [-73.92849418540158, 40.72661460330786], [-73.92833738013012, 40.72641758269856], [-73.92815870725637, 40.726205230757685], [-73.92813074743837, 40.7261726868244], [-73.9280542953431, 40.726072340162595], [-73.92795514073464, 40.725916517513646], [-73.92793912625204, 40.725883729045734], [-73.92792754362857, 40.72587905684713], [-73.92790171856065, 40.725875780441555], [-73.9278825766526, 40.7258664841229], [-73.9278717240502, 40.725854051197615], [-73.92786431997051, 40.72582667905824], [-73.92785895385158, 40.72575459949976], [-73.92780584783978, 40.72504980016611], [-73.92779650104073, 40.7249256692162], [-73.92720275963465, 40.72365294718613], [-73.92561470516611, 40.72006166221244], [-73.92481798943687, 40.72026513747534], [-73.92481537158021, 40.72022555855079], [-73.92470891655738, 40.71999887556637], [-73.92471098441669, 40.71999119597938], [-73.92474503108099, 40.71998524724633], [-73.92467622369254, 40.719885695480855], [-73.92460885647313, 40.7197896928349], [-73.92453432562169, 40.71966615777251], [-73.92451999415132, 40.71961273042429], [-73.92452018596838, 40.719568370774205], [-73.92452083048202, 40.71955356651187], [-73.92453854985803, 40.719342580204575], [-73.92455355876741, 40.71927913119411], [-73.92457948088894, 40.7191625233347], [-73.92462954199868, 40.71898697487623], [-73.9246900485712, 40.71872233555582], [-73.92470227807098, 40.71868830410057], [-73.92477183253615, 40.71856461085536], [-73.9248155567726, 40.718486835905985], [-73.9248641350909, 40.71844044541349], [-73.92493181378975, 40.718405828749404], [-73.92499204426545, 40.718384788263776], [-73.92508677520757, 40.71838421920426], [-73.92615790234161, 40.718099468135776], [-73.92638366600745, 40.71808480802871], [-73.92837930101507, 40.717578367290116], [-73.92839153834066, 40.71757875368058], [-73.92840375075583, 40.71758019296097], [-73.92842127419078, 40.7175842105983], [-73.92842419720883, 40.71758530268078], [-73.92842688160763, 40.71758675412747], [-73.92842937757847, 40.71758857435136], [-73.92843171853902, 40.71759080894033], [-73.92843568965912, 40.717595953982475], [-73.92844561386065, 40.71761186331317], [-73.92844953863248, 40.717616088268166], [-73.92845165582267, 40.71761777322944], [-73.92845389020685, 40.717619198094184], [-73.92846194563565, 40.717623120381695], [-73.92847083084905, 40.7176262868002], [-73.92848064026589, 40.717628732421325], [-73.9284915378775, 40.71763049638031], [-73.92851353839693, 40.71763209434512], [-73.92857425221365, 40.71763313166123], [-73.9285917078938, 40.71763506050507], [-73.92860667565203, 40.71763833823792], [-73.9286372006141, 40.71764795729271], [-73.92866774684488, 40.71765931310398], [-73.92869826813597, 40.71767238068159], [-73.92872866939294, 40.7176871410362], [-73.9287353864659, 40.71769118761855], [-73.92874207976142, 40.71769646885917], [-73.92876845782247, 40.717722042250244], [-73.92877608561962, 40.717727270793475], [-73.92877998940898, 40.71772931636664], [-73.92878398825955, 40.71773100248575], [-73.92878963057198, 40.71773285212232], [-73.9287956187773, 40.71773429739506], [-73.92880855316629, 40.717735971449116], [-73.92882252966149, 40.71773599768121], [-73.92883713697681, 40.71773436746044], [-73.92885202896086, 40.717731107711856], [-73.92886642560443, 40.717726344101365], [-73.92887965179995, 40.717720318623556], [-73.92889108105969, 40.71771331116421], [-73.92896850706042, 40.71764754015081], [-73.92898221166264, 40.71763657123715], [-73.92907419357621, 40.71757133281935], [-73.92909346674548, 40.717556161224586], [-73.92911003942831, 40.71754160111232], [-73.9291243277067, 40.71752729272452], [-73.92913648610188, 40.717513071310634], [-73.92913856054393, 40.717510038005024], [-73.92914020897827, 40.71750676236066], [-73.92914231209284, 40.71749933299893], [-73.92914297144002, 40.71749071598783], [-73.92914245456932, 40.71746451965398], [-73.92914397867989, 40.717456613991715], [-73.92914530784584, 40.717453139463885], [-73.92914701545092, 40.7174499159568], [-73.92915700695039, 40.717436414577925], [-73.92916989772768, 40.71742355510231], [-73.92918539042974, 40.71741165011861], [-73.92920294211369, 40.717401098006235], [-73.92956856905529, 40.71722153556257], [-73.92960578835353, 40.71719018455505], [-73.92963940071803, 40.71715649885372], [-73.92964876146104, 40.71714594216955], [-73.92966723720504, 40.71712254843958], [-73.92968295619124, 40.71709844304385], [-73.92969572853036, 40.717073929091114], [-73.92970539915328, 40.71704927938918], [-73.92970762282195, 40.71704020380317], [-73.92970848430281, 40.7170306673565], [-73.92970798609383, 40.71702080692028], [-73.92970612734644, 40.71701080158015], [-73.92969847812826, 40.71699103024035], [-73.92969285538712, 40.716981725376904], [-73.9296861770915, 40.71697307523373], [-73.92950714859491, 40.71659078087593], [-73.92950234927692, 40.71658551842918], [-73.92949846168197, 40.71657965377863], [-73.92949561546526, 40.71657342087128], [-73.92949390595588, 40.71656703436778], [-73.92949347200953, 40.7165632699393], [-73.92949464975428, 40.716535769271715], [-73.92949639794345, 40.71652681971331], [-73.92949731486091, 40.71652213772954], [-73.9295016940007, 40.71649978980536], [-73.92931999766078, 40.71611200883265], [-73.92931572636294, 40.71607810126976], [-73.92931651965557, 40.7160438378059], [-73.92932187977752, 40.71601207044922], [-73.9293317763477, 40.71597656097953], [-73.92934483421232, 40.71593891798302], [-73.92936131668621, 40.71589831554491], [-73.92938250209323, 40.71585162805965], [-73.92940052893961, 40.715816518766324], [-73.92941981817356, 40.71578500369684], [-73.92944067813087, 40.71575657861639], [-73.92946325081381, 40.71573104475621], [-73.92947356921455, 40.71572145262114], [-73.92948531923271, 40.71571242793815], [-73.92949834532271, 40.71570406928501], [-73.92951247231095, 40.71569650521456], [-73.92952747418936, 40.7156898412977], [-73.92954313880661, 40.71568419668339], [-73.9295592038559, 40.71567964911099], [-73.92957543323405, 40.71567627365539], [-73.93029962426964, 40.71550787636393], [-73.93149304610854, 40.71520848107516], [-73.93151298432782, 40.71521190462473], [-73.93153325506185, 40.71521398848785], [-73.93153596540606, 40.71521416080974], [-73.93155892431574, 40.71521485076743], [-73.9315843812832, 40.71521425275001], [-73.93165926717428, 40.71520855239426], [-73.93170534538301, 40.715203167612366], [-73.93175008954245, 40.7151945849367], [-73.93179267229117, 40.71518297509124], [-73.93183242829471, 40.71516852832981], [-73.93190482995988, 40.715137583883475], [-73.93198814917388, 40.71510013641414], [-73.9320446165215, 40.71507417192053], [-73.93208047053639, 40.715056497540985], [-73.93210478113058, 40.715042599269246], [-73.93212999514387, 40.71502560378398], [-73.9321557326611, 40.7150060591762], [-73.93219753146339, 40.71497210749033], [-73.93220607307306, 40.71496398092936], [-73.93221363282309, 40.71495510661935], [-73.93222529811959, 40.71493579746084], [-73.93223037717549, 40.71492154524626], [-73.93223414916336, 40.71490201583286], [-73.93223469045104, 40.71489346121944], [-73.9322353635064, 40.714882853137915], [-73.93223397469464, 40.71486442837482], [-73.93223001508791, 40.7148469655458], [-73.93221519306172, 40.71480561350932], [-73.9321969843879, 40.71476644888617], [-73.93217367921345, 40.7147221395194], [-73.93215665337218, 40.71469483448544], [-73.93215361559824, 40.71469104222988], [-73.932149986012, 40.714687464730225], [-73.93214128153326, 40.71468129159166], [-73.93213686921216, 40.71467904647472], [-73.93175357182275, 40.714741675505685], [-73.93159048356533, 40.71439949248125], [-73.93155662007531, 40.714393384423], [-73.93154203825726, 40.714359606502086], [-73.93148254530635, 40.714221748840004], [-73.93124067059496, 40.71372481088467], [-73.93145301733048, 40.713438844463575], [-73.9315560427113, 40.71339947275473], [-73.93159144262145, 40.713384815917905], [-73.93164527391656, 40.713342793758144], [-73.93197184127631, 40.7132532609102], [-73.9324516315665, 40.71312171743927], [-73.93255041730532, 40.71309537126197], [-73.93257765480163, 40.71308911115324], [-73.9325956361949, 40.713083700676535], [-73.93261051935492, 40.71307728824735], [-73.93261675980561, 40.71307367214419], [-73.9326222660997, 40.713069749371755], [-73.93263159981665, 40.7130613711127], [-73.9326390524247, 40.71305258616936], [-73.93264437548959, 40.713043701808665], [-73.93264621458815, 40.71303927229798], [-73.93264747285893, 40.7130348786332], [-73.93264823497748, 40.7130310430457], [-73.9326491737301, 40.713015815055016], [-73.93264693956343, 40.71300073028623], [-73.93203262980515, 40.71159022307427], [-73.93338484615303, 40.711233727745665], [-73.93328349320237, 40.71097870745788], [-73.9319010192085, 40.71133847142828], [-73.93166398860762, 40.71081024398526], [-73.93151092590584, 40.71046980839423], [-73.93126572703261, 40.70992444355293], [-73.93102978770145, 40.70935851220726], [-73.93093227547743, 40.709165311254075], [-73.93079490181064, 40.70911470106856], [-73.9307918037048, 40.70911293481054], [-73.93078745172906, 40.709110005160596], [-73.93078694295174, 40.709109590392615], [-73.93078352647346, 40.70910679800705], [-73.93078002706979, 40.70910330128765], [-73.93077693109801, 40.709099480980846], [-73.9307719933313, 40.70909101303475], [-73.93076857210804, 40.709081132574475], [-73.93076600066632, 40.70906065402331], [-73.93076683651668, 40.7090191674455], [-73.93076602623842, 40.70900254307664], [-73.93076270533346, 40.70898637705963], [-73.93075999154775, 40.70897937849044], [-73.93075653104769, 40.708972982737215], [-73.93073903156917, 40.708947316942], [-73.93071882196693, 40.70892173947502], [-73.93069593784345, 40.708896313011245], [-73.93067043926465, 40.708871073938994], [-73.93064180374176, 40.70884694166527], [-73.93057213306344, 40.70879486826071], [-73.93054296635056, 40.70876887089745], [-73.93052794395754, 40.708751183869595], [-73.93052572285508, 40.708747608338385], [-73.93051585863094, 40.70873176236181], [-73.93050712316408, 40.70871122513413], [-73.93050203180053, 40.708690294909395], [-73.93050100083194, 40.70868122503959], [-73.9303609456579, 40.7087177385352], [-73.93037347956368, 40.70873930350495], [-73.93037720999881, 40.70874751861006], [-73.9303818492876, 40.70875776871385], [-73.93038563133163, 40.70877453878897], [-73.93038574076616, 40.70878231914898], [-73.93038466900703, 40.708789765583106], [-73.9303802173509, 40.70880284776285], [-73.93037287805068, 40.70881587324679], [-73.93036285425627, 40.70882846505405], [-73.93035053503768, 40.70884013775799], [-73.93028879813227, 40.70888572873882], [-73.93026628094589, 40.708904924092934], [-73.93026509729741, 40.70890609372025], [-73.93025651835315, 40.70891654288407], [-73.93025038849073, 40.708927912919975], [-73.93037671406199, 40.70922233953024], [-73.93060170783275, 40.7097467525867], [-73.93062904674879, 40.709791038263994], [-73.93063814682539, 40.709801768663844], [-73.93065009956263, 40.7098127901007], [-73.93070567535537, 40.70985517357679], [-73.93071575895901, 40.70986497746762], [-73.93072360705276, 40.70987464532034], [-73.93072912419363, 40.70988365305337], [-73.93073348083954, 40.70989336336667], [-73.93073890171183, 40.709915357740414], [-73.93074036930459, 40.70993797930222], [-73.93073947816461, 40.70999853812925], [-73.93074145900518, 40.71001600921204], [-73.93074537263652, 40.7100313020978], [-73.93076957459168, 40.7100982520984], [-73.930791487333, 40.710146640057424], [-73.93080914645333, 40.71017853827857], [-73.93085266627386, 40.71025176672247], [-73.93087163508754, 40.71028754614978], [-73.93090318414211, 40.710355886650596], [-73.93093021730881, 40.71042117175436], [-73.9309979955702, 40.71059932449671], [-73.93103036450829, 40.71068854870446], [-73.93115836965862, 40.71100104854482], [-73.93154613746852, 40.71185535175101], [-73.93088881912188, 40.71205600685815], [-73.93085966173909, 40.71206494115675], [-73.9308357102634, 40.712074931985754], [-73.93081637309481, 40.71208622106957], [-73.93080841450526, 40.71209238429651], [-73.93080159026496, 40.71209889079763], [-73.93078780933578, 40.71211647921726], [-73.93078286503948, 40.71212531932618], [-73.9307793659171, 40.71213390717069], [-73.93077736917618, 40.712142064536344], [-73.93077687548653, 40.71214978254474], [-73.9307778853388, 40.712157013953636], [-73.93077894737037, 40.71216042795544], [-73.93078037522965, 40.71216370664792], [-73.930790204141, 40.71218082226048], [-73.93080080544334, 40.71219469685591], [-73.93081258043564, 40.71220580594958], [-73.93081894298919, 40.712210349085794], [-73.9308256373487, 40.71221423370464], [-73.93083369272601, 40.71221792246413], [-73.93084682544475, 40.71222140637212], [-73.93085528765457, 40.712220663782], [-73.93086409444768, 40.71221819268688], [-73.93161032734847, 40.71203802318303], [-73.93182042077258, 40.712478983611106], [-73.93183334985444, 40.71250752798771], [-73.93184122321138, 40.71252826277801], [-73.93184635118098, 40.71254724913816], [-73.93184868877432, 40.71256477418327], [-73.93184794872995, 40.712593491059096], [-73.93184249493441, 40.71262723799059], [-73.93183415746144, 40.712655374577345], [-73.93182187286679, 40.712679465226174], [-73.93181633870033, 40.71268716098756], [-73.93180970336468, 40.71269477484574], [-73.93179285963701, 40.71271003780262], [-73.93177226424528, 40.71272495661109], [-73.93173436851761, 40.71274929223796], [-73.93066788646628, 40.71302126689367], [-73.9305711431028, 40.7130510969146], [-73.93054642776369, 40.71305574646063], [-73.9305271320743, 40.71306156090452], [-73.9305190693687, 40.71306503188885], [-73.9305120595292, 40.71306888245433], [-73.93050607875219, 40.713073137548186], [-73.93050113783234, 40.713077790811234], [-73.93049150439325, 40.71309041971448], [-73.93047361522203, 40.71311996285386], [-73.93046418241934, 40.71313167232028], [-73.93043603849989, 40.713156086450766], [-73.93043058814568, 40.713161549060715], [-73.93042631105753, 40.71316678789339], [-73.93042448583894, 40.71316958700425], [-73.93042294313065, 40.71317255867104], [-73.93042263899005, 40.71319163126945], [-73.93077166547451, 40.71392946758245], [-73.93095073591746, 40.714363819478436], [-73.93105231901723, 40.71461022392334], [-73.93085190134036, 40.71490298559276], [-73.92991665528311, 40.715149816999386], [-73.92990279901291, 40.71512496347697], [-73.92931412285716, 40.71527983468949], [-73.92927167066954, 40.715314216978754], [-73.92925366567535, 40.71532880253978], [-73.92843881814578, 40.71553094957575], [-73.92890242854061, 40.7165728123179], [-73.92890598986219, 40.716596354731784], [-73.92890601265002, 40.71661895731207], [-73.9289025104377, 40.71664010793748], [-73.92889551897623, 40.71665951948844], [-73.92888441854586, 40.71668042166825], [-73.92887072694849, 40.716701449064075], [-73.92885446710963, 40.71672257421461], [-73.92883566172434, 40.7167437780346], [-73.9287905809, 40.716787938570135], [-73.92876805027394, 40.71680733061646], [-73.92874531987793, 40.716825128348454], [-73.92871111320488, 40.716849745859825], [-73.92867728796146, 40.71687240872566], [-73.92864365422389, 40.716893243646275], [-73.92861009191238, 40.71691233129565], [-73.92857581108359, 40.71692983368455], [-73.92848910920299, 40.716971041911755], [-73.92843622401524, 40.716998834267095], [-73.92832241942101, 40.717062456200466], [-73.92827145107029, 40.71708972883212], [-73.92825263489712, 40.71709859586681], [-73.9282325304494, 40.717106453750795], [-73.92821135004563, 40.71711323979312], [-73.9281892718893, 40.71711888022515], [-73.9281665195066, 40.7171233328014], [-73.92814336621645, 40.717126524817886], [-73.92812006106152, 40.71712843649421], [-73.92809688744708, 40.717129034669306], [-73.92595163943949, 40.7176910705699], [-73.92594091108849, 40.71767415165964], [-73.92514606059815, 40.71785561237674], [-73.9249974068021, 40.717889555087254], [-73.9249747370717, 40.717893899534175], [-73.92495489653578, 40.71789814597476], [-73.92494252442464, 40.71790088484829], [-73.92492621081297, 40.71790485414829], [-73.924902393685, 40.717909422318826], [-73.92488911247905, 40.71791154744498], [-73.92486299711757, 40.71791650059256], [-73.92483730903177, 40.71792192342344], [-73.92482214344714, 40.71792509251212], [-73.92479461917726, 40.71793177393681], [-73.92477173579029, 40.71793694712741], [-73.92475077183728, 40.717940443953374], [-73.92472906134888, 40.71794405068778], [-73.92471227577259, 40.717946155912], [-73.92469362102345, 40.71794812488463], [-73.92467591434051, 40.71794992259175], [-73.92466004074598, 40.71795144323361], [-73.92464513863976, 40.71795310891734], [-73.9246255503998, 40.717953843264645], [-73.92460339476072, 40.717953306073376], [-73.92458693486758, 40.717950702646235], [-73.92458407107215, 40.71795024074147], [-73.92456824137071, 40.71794488190683], [-73.92455290971758, 40.71793913473411], [-73.9245380167141, 40.717932371796], [-73.92452081662728, 40.7179244813951], [-73.92450755701465, 40.717917637268215], [-73.92449266537841, 40.71790967583763], [-73.92447781046084, 40.71790098551972], [-73.92446061312032, 40.7178908795681], [-73.92445062958915, 40.71788537964227], [-73.92442924671535, 40.71787229884444], [-73.9244087753187, 40.717858894811435], [-73.92439020556472, 40.717848256552855], [-73.92436927002785, 40.7178364200924], [-73.92435070091092, 40.717825231837054], [-73.92433303151248, 40.71781399072887], [-73.92431306786708, 40.717802154896944], [-73.92429305607753, 40.717790065394034], [-73.92427585871782, 40.717780607576316], [-73.92426006927353, 40.717770880796486], [-73.9242456522157, 40.717761730707366], [-73.9242335769337, 40.71775456383365], [-73.9242219623098, 40.71774774806305], [-73.92420571235455, 40.71773697627477], [-73.92419082355931, 40.71772697114595], [-73.92418084168771, 40.71772024707839], [-73.92416598865648, 40.717709971916534], [-73.92415062601867, 40.717699992771976], [-73.92413531121534, 40.717689582275256], [-73.9241199951009, 40.717679360578266], [-73.92410280094333, 40.7176671372024], [-73.9240842361937, 40.71765219513093], [-73.92406646435994, 40.7176385671579], [-73.92404826607324, 40.71762433680912], [-73.92403042353494, 40.71760939353005], [-73.92401456906461, 40.71759477706518], [-73.92400123172588, 40.71758340440814], [-73.92398912454873, 40.71757201446884], [-73.92397727997053, 40.71755992092113], [-73.92396563780986, 40.717546415588856], [-73.92395450324652, 40.71753361051829], [-73.92394037469352, 40.717520813855145], [-73.9239313285829, 40.71751413595133], [-73.92390367881583, 40.717495620696546], [-73.92389417064558, 40.7174890594181], [-73.92387326148531, 40.717474546641604], [-73.92385189177755, 40.717460755430274], [-73.92383238966089, 40.717448477883465], [-73.92381472136069, 40.71743663242616], [-73.92380657161958, 40.717431494845535], [-73.92379521885265, 40.717423553926565], [-73.92378242354737, 40.71741459365532], [-73.92377013710404, 40.717405994405105], [-73.92374875470075, 40.7173921758591], [-73.9237283193837, 40.71737827651839], [-73.92370971501525, 40.71736731362656], [-73.9236873979865, 40.71735310679241], [-73.92367370384754, 40.71734403836096], [-73.92366000842217, 40.71733551941521], [-73.92363989262059, 40.71732065749333], [-73.92362699414979, 40.71730857309419], [-73.92361499494635, 40.71729682250124], [-73.92360155242616, 40.71728473773811], [-73.92358786233967, 40.71727158063685], [-73.92357604244324, 40.717258425947975], [-73.9235660685184, 40.71724527147838], [-73.92355875481299, 40.71723477608635], [-73.92354950298376, 40.71722055092756], [-73.92353534366401, 40.71720456649131], [-73.92352727087955, 40.7171951504717], [-73.92351902168116, 40.71718501413588], [-73.92351052402459, 40.71717381467611], [-73.92349611939407, 40.71715461539783], [-73.92348498545175, 40.71714217213949], [-73.92347481994251, 40.71713080085855], [-73.92346278696195, 40.71711764601619], [-73.92345233852708, 40.71710589643689], [-73.92344002043036, 40.71709292970286], [-73.92342891999935, 40.717081999229585], [-73.92341861434718, 40.717069015738694], [-73.923410699233, 40.71705692524807], [-73.92340522164903, 40.71704449445611], [-73.92340130597819, 40.717032083298584], [-73.92339299433871, 40.71701539074552], [-73.92338539779375, 40.717002949663616], [-73.92337834167141, 40.71699424629923], [-73.92337052250669, 40.71698144505282], [-73.92336526384003, 40.71697452587305], [-73.92335355684713, 40.716965899489054], [-73.92328653237342, 40.71683400310813], [-73.92323157113599, 40.71669943915755], [-73.92316776085262, 40.716478915386126], [-73.92313445722395, 40.716479468945344], [-73.923117181684, 40.71647618845653], [-73.9231114960376, 40.71646918823154], [-73.92310361124972, 40.71645153249399], [-73.92307579911487, 40.716389234766446], [-73.92305500014334, 40.71634266479336], [-73.92326039798908, 40.716249734135324], [-73.92331244916073, 40.71622884989675], [-73.92333477379717, 40.71622532676395], [-73.92336627583238, 40.71621730560632], [-73.92338579746807, 40.71621278917319], [-73.92340491085959, 40.716192404479855], [-73.9234316927592, 40.71617252109859], [-73.92347144070784, 40.71614666662387], [-73.92361145155542, 40.716103508171265], [-73.92359001003088, 40.71602814919749], [-73.92431329961565, 40.715847056576735], [-73.92459408281036, 40.715534375855434], [-73.92483287559034, 40.715282912041374], [-73.92488553507611, 40.71526718765259], [-73.92485230936, 40.71519860069832], [-73.92478745137134, 40.715075593546025], [-73.92476629284467, 40.715032049009196], [-73.92476128782185, 40.71501947417909], [-73.92476257206151, 40.71500407627395], [-73.92476493340077, 40.71498865277085], [-73.92476155049336, 40.71497597144838], [-73.92472981629032, 40.71493796647526], [-73.92469009338394, 40.714880957032975], [-73.92466013078389, 40.71486688040726], [-73.92461501505854, 40.71482708365424], [-73.92455568744005, 40.71475365373278], [-73.9245258166989, 40.71469041784693], [-73.92451226161313, 40.71462077218059], [-73.92448221734742, 40.71452345230061], [-73.92443153174062, 40.714364776176346], [-73.92441910967021, 40.71434961252492], [-73.92441453117704, 40.714348538518855], [-73.92440910864588, 40.71434991286799], [-73.92439028050491, 40.71434917913236], [-73.92436718832793, 40.7143308294748], [-73.92434751117983, 40.7143070530094], [-73.92433779606827, 40.714253708710935], [-73.92433699107761, 40.71420158735123], [-73.92433637463596, 40.71414008175541], [-73.92433589757124, 40.71412259346647], [-73.9240590971852, 40.71411155982241], [-73.92404011299993, 40.714008312999916], [-73.92313936299986, 40.713394727999905], [-73.92223294699991, 40.712854424999904], [-73.92168663599989, 40.71189431699987], [-73.92154601699998, 40.71104328399984], [-73.92122073500002, 40.71079055899986], [-73.92109442099995, 40.71072126499991], [-73.92074519699985, 40.71052968599989], [-73.92189184699987, 40.709396095999836], [-73.92248241799982, 40.709332487999895], [-73.92418647499989, 40.70906472899986], [-73.92576502499996, 40.7088037639999], [-73.92740683799988, 40.70854132199989], [-73.92902566099997, 40.70827681499986], [-73.9320728499999, 40.70778578599989], [-73.93229708600003, 40.70774944699988], [-73.93252310899986, 40.70823818799996], [-73.93269215700003, 40.708632035999905], [-73.93299690799995, 40.709317159999884], [-73.93329596399984, 40.709987710999926], [-73.933601465, 40.7106691059999], [-73.93389272699982, 40.711335677999905], [-73.93425709399997, 40.712123023999936], [-73.93453329099987, 40.71275330399992], [-73.93480281900003, 40.713372495999884], [-73.93724803599986, 40.712782740999884], [-73.93832001399986, 40.71252368499994], [-73.93846617699984, 40.71248925599995], [-73.94068803099992, 40.71196204799987], [-73.9404771349999, 40.711562642999866], [-73.94042251999994, 40.711217647999945], [-73.94075355899997, 40.711186512999916], [-73.94116852899995, 40.71114748299993], [-73.94159179599998, 40.711107670999915], [-73.94196964799987, 40.7110721309999], [-73.94210580699989, 40.71105932199989], [-73.94245994699992, 40.7110258639999], [-73.94283637099988, 40.7109902979999], [-73.94326978899984, 40.710949344999925], [-73.94357731299993, 40.710920286999894], [-73.94378799599994, 40.710900378999945], [-73.94368828299991, 40.71029296399993], [-73.94367685499988, 40.71022334799989], [-73.94358512999999, 40.70966450499993], [-73.94357094699997, 40.70957809399996], [-73.94355745099986, 40.709495864999965], [-73.94354434699991, 40.70941603099986], [-73.94344009799994, 40.70878089099988], [-73.94332294399995, 40.708070194999934], [-73.94320222899984, 40.7073347509999], [-73.94308587399995, 40.70659666199991], [-73.94296619399988, 40.70588843999991], [-73.94285013599988, 40.70518202999993], [-73.94273448399997, 40.70447330599988], [-73.9422114949999, 40.7045232859999], [-73.94214324999996, 40.70452980699987], [-73.9417696579999, 40.70456550799983], [-73.94168041699996, 40.70457403599987], [-73.94103009799993, 40.70463617699996], [-73.9408928719998, 40.70391415699989], [-73.94077939399978, 40.70322246899988], [-73.94076481300007, 40.70313403299987], [-73.94067555499998, 40.7025926509999], [-73.9406199669999, 40.702255449999896], [-73.94060119499999, 40.70214158099988], [-73.9405445659999, 40.701798044999855], [-73.94042057899993, 40.701076597999865], [-73.94193078899983, 40.70072523399989], [-73.94220058700002, 40.700890666999896], [-73.94306406899986, 40.701424434999886], [-73.94322685999988, 40.70152070899991], [-73.94382473799989, 40.70186200799988], [-73.94400503999998, 40.70196179199989], [-73.94431460199992, 40.70213334499988], [-73.94463910199993, 40.702313693999926], [-73.94544988199996, 40.70276063599993], [-73.945854991, 40.70298720699987], [-73.94625107799986, 40.703208746999934], [-73.94705205299991, 40.70366394899985], [-73.94785367299988, 40.704111382999876], [-73.948140661, 40.704271253999885], [-73.94854962699999, 40.704500430999936], [-73.94866498899984, 40.704565073999945], [-73.949253357, 40.70489593099994], [-73.94947068299989, 40.7050190189999], [-73.94983788699977, 40.70522902199988], [-73.95023693799996, 40.705473245999876], [-73.95028918399986, 40.70591343899985], [-73.95040588999979, 40.706652745999875], [-73.95053010000007, 40.70739098499994], [-73.95065919499987, 40.70816998299994], [-73.95076027199997, 40.708802859999906], [-73.95082963899989, 40.70914359799985], [-73.95087492699996, 40.70951311499991], [-73.94865533499987, 40.70972498299988], [-73.94877149699997, 40.71043225899994], [-73.94889233899988, 40.71116753499993], [-73.94901358399997, 40.71190375599989], [-73.94913082999982, 40.71261242099995], [-73.94924526199999, 40.7133203089999], [-73.94937231899985, 40.71406687799986], [-73.95162366299994, 40.7140663609999], [-73.9529104979999, 40.714060986999876], [-73.9530314939999, 40.714062846999894], [-73.95316497599985, 40.714065097999914], [-73.95325272999993, 40.71406562999987], [-73.95348472199983, 40.71407020799988], [-73.95335294599992, 40.71418365499992], [-73.95275381300002, 40.71473599099994], [-73.95210878499995, 40.715258893999874], [-73.95182429600005, 40.715475968999925], [-73.95114433699997, 40.71603452099991], [-73.95004619199985, 40.71680522799992], [-73.9498379229999, 40.716938665999855], [-73.94954034299991, 40.717121995999946], [-73.94904281699998, 40.717428518999924], [-73.94866397500004, 40.7176827709999], [-73.94832167599995, 40.71786451199997], [-73.94721341799986, 40.718560985999865], [-73.94679211599993, 40.7188216079999], [-73.94560358899994, 40.71956728599989], [-73.94440536699992, 40.72024041199988], [-73.94367547999985, 40.7206599749999], [-73.94281683699987, 40.72114362099989], [-73.94195633599989, 40.721652318999894], [-73.94150380799985, 40.7219909789999], [-73.9410941879999, 40.72230924499994], [-73.94022123699996, 40.722891504999936], [-73.93931199899998, 40.72334789399991], [-73.93891183799992, 40.72357882499994], [-73.9384885709999, 40.723808905999924], [-73.93765314599989, 40.72426555499987], [-73.93676382399988, 40.724838918999836], [-73.93539740399997, 40.725906866999956], [-73.93412337399995, 40.726855470999894], [-73.93255438599991, 40.727862889999905], [-73.93226852175046, 40.72817465801565], [-73.93200420453815, 40.72814508289344], [-73.93196085293658, 40.728125624359585], [-73.93188125492881, 40.72809538279412], [-73.93174841322003, 40.728053727696675]]]}}, {\&quot;id\&quot;: \&quot;80\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 81, \&quot;Shape_Leng\&quot;: 0.197592771731, \&quot;Shape_Area\&quot;: 0.00039956655019, \&quot;zone\&quot;: \&quot;Eastchester\&quot;, \&quot;LocationID\&quot;: 81, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8236684811033, 40.889903740147645], [-73.82267708790054, 40.88961946903566], [-73.82248620406577, 40.890098054202106], [-73.823264898565, 40.88998702102998], [-73.8233660128753, 40.891075135853136], [-73.82285335053221, 40.8912068290476], [-73.82061223573477, 40.89061328894856], [-73.81957464105017, 40.890315096230374], [-73.8194872442203, 40.89028998018013], [-73.8194065171428, 40.890260434137176], [-73.81827738067017, 40.88984713076362], [-73.8176062682385, 40.88967702389679], [-73.81661400923757, 40.88943342775268], [-73.81601699496034, 40.889323833921495], [-73.81574261419216, 40.88919733695206], [-73.81533047581053, 40.88908250586605], [-73.81524197088714, 40.889060148794826], [-73.81516854879645, 40.88903776212969], [-73.81365108415028, 40.88867845028846], [-73.8124290411048, 40.88837921189019], [-73.8112683481647, 40.88809890623766], [-73.80989822392435, 40.8877405420035], [-73.80943273224275, 40.88763840646659], [-73.80872106090143, 40.887480598188404], [-73.80755944196362, 40.887108891800416], [-73.8063796861458, 40.886829379091225], [-73.80483870751024, 40.886473964049], [-73.80452614974675, 40.88640924817111], [-73.80423761712582, 40.88634168194171], [-73.80290946460593, 40.886030680167714], [-73.80192449924954, 40.88571296801209], [-73.79930206256022, 40.88506905492873], [-73.79772783123815, 40.88464812978279], [-73.79732759309121, 40.88454106108392], [-73.79628181490725, 40.884290884012586], [-73.7948690107813, 40.88391531791826], [-73.79405517398024, 40.88369996689047], [-73.79385527171416, 40.883643311166146], [-73.79300652624502, 40.88335873744268], [-73.79322870891143, 40.88282259495222], [-73.79416555799988, 40.88299321599987], [-73.79449254399985, 40.88306825099994], [-73.79744825599991, 40.88384538399988], [-73.79937520399986, 40.88435196999995], [-73.80220388299996, 40.8851211149999], [-73.803286821, 40.885415552999916], [-73.80520113699998, 40.88599995599985], [-73.80550576700001, 40.886092948999874], [-73.80571277199984, 40.8860393679999], [-73.80592498899998, 40.88599671799993], [-73.80614087499991, 40.88596540999986], [-73.80635884999995, 40.88594565999989], [-73.80657730199997, 40.88593752499988], [-73.80693113299988, 40.88592660899994], [-73.80728647099995, 40.885931813999875], [-73.80764139499996, 40.885953251999915], [-73.80799398199987, 40.88599083099993], [-73.80834232399997, 40.88604431399994], [-73.8086845939999, 40.88611329099997], [-73.80915068099985, 40.88621447699993], [-73.8097107929999, 40.88633607499994], [-73.81027053199992, 40.88645124299992], [-73.81083611999995, 40.88655115199987], [-73.81140645199994, 40.88663558699991], [-73.811980437, 40.88670433899995], [-73.81209659199986, 40.88671500999993], [-73.813567347, 40.8867787089999], [-73.81399748399998, 40.8867821319999], [-73.81442762200005, 40.88677196499989], [-73.81485665899983, 40.88674823199989], [-73.81518316800005, 40.88671965999993], [-73.81528345499991, 40.886711023999936], [-73.81536464199993, 40.886701220999875], [-73.8154787309999, 40.88668744599995], [-73.81670778599998, 40.88648095099994], [-73.81742638899989, 40.88629430599987], [-73.81841703399995, 40.886036993999916], [-73.81983275399992, 40.885669253999886], [-73.82027432999985, 40.885550699999925], [-73.82031167699992, 40.8856097399999], [-73.82077408699998, 40.886710602999884], [-73.82382288900006, 40.8877472369999], [-73.82385099099994, 40.88776831599994], [-73.82387140599998, 40.88778362799996], [-73.82403093399992, 40.88769579499991], [-73.82448935900001, 40.88742251999986], [-73.82529579999982, 40.88697637999996], [-73.82611278899988, 40.886666035999895], [-73.82672826599993, 40.88644534299988], [-73.82700490399988, 40.88634614699992], [-73.82777310599991, 40.88604701799995], [-73.82791367899995, 40.88599054299988], [-73.82953327299994, 40.885303333999936], [-73.83033698199986, 40.88496949199991], [-73.83065358999984, 40.884852938999906], [-73.83130254299985, 40.884711422999956], [-73.83233699199998, 40.88454919399989], [-73.83256211099994, 40.88451947199993], [-73.83256233799996, 40.884519444999945], [-73.83256256300001, 40.884519400999864], [-73.83278516199996, 40.88447693199989], [-73.83278538799992, 40.8844768879999], [-73.83278561299993, 40.88447683399987], [-73.83300396199995, 40.88442179699992], [-73.83300425799992, 40.88442172499994], [-73.83300454299992, 40.884421634999974], [-73.83321703599982, 40.88435437999986], [-73.83321711899991, 40.88435435299995], [-73.83321720199997, 40.88435431699985], [-73.8334219759999, 40.88427549499986], [-73.83342222600004, 40.8842753959999], [-73.8334224639999, 40.88427528899988], [-73.83361799799997, 40.88418563099992], [-73.83404698799987, 40.883990319999945], [-73.83434541999985, 40.88385001999989], [-73.83475583399996, 40.8835562939999], [-73.83560954999997, 40.88294527899995], [-73.83621837399981, 40.88239301299993], [-73.83664134299984, 40.88212002499992], [-73.8369874379998, 40.88193908299993], [-73.83782792499997, 40.88160813999987], [-73.83874273699996, 40.881265967999916], [-73.83965170899998, 40.88092595799992], [-73.84046213299987, 40.880622867999875], [-73.84127784699999, 40.8803175479999], [-73.84201454899988, 40.87987225999992], [-73.8427378519999, 40.87942490299989], [-73.84324113799987, 40.879108912999904], [-73.84239559299994, 40.87875039299991], [-73.84228241899993, 40.878701972999906], [-73.84114053199991, 40.878215735999945], [-73.8401480179999, 40.8777884259999], [-73.839711891, 40.8776115949999], [-73.8395648579999, 40.87754981599993], [-73.83925549199988, 40.87741982299989], [-73.83855197999986, 40.87711952799991], [-73.8381484219999, 40.876953298999915], [-73.83841016399981, 40.87686761499991], [-73.83924788999988, 40.876618737999905], [-73.8383540939998, 40.87492195799993], [-73.83746027699993, 40.87322264999988], [-73.83829221499984, 40.87295133899995], [-73.83740181300006, 40.87110892899991], [-73.83655628099997, 40.86935217599989], [-73.83565766499987, 40.86751275599992], [-73.83481793799997, 40.8677817219999], [-73.83391246099991, 40.868075988999884], [-73.83354911599997, 40.868193637999916], [-73.8334796669999, 40.86821612199987], [-73.83315960399985, 40.86831975599994], [-73.83312947400005, 40.86826747399991], [-73.83175316499981, 40.8659067679999], [-73.83054182799988, 40.86373143499994], [-73.83022388499991, 40.863429527999884], [-73.82954731199996, 40.862164086999925], [-73.82840758999997, 40.860948300999894], [-73.82834347399992, 40.86089202599988], [-73.82841963500002, 40.86093193999992], [-73.82911929099998, 40.86150997699985], [-73.82924089599999, 40.8616318679999], [-73.82950892699994, 40.86184121299988], [-73.82972614799992, 40.86195274499995], [-73.83012015999996, 40.862049281999894], [-73.83089329699999, 40.86221284899995], [-73.83162007899985, 40.86265937499991], [-73.83578436699997, 40.86501601099999], [-73.8361860139999, 40.86522409899994], [-73.83678824299999, 40.86554590599999], [-73.83697021099982, 40.8656431359999], [-73.83784380099986, 40.86609918799993], [-73.83875223499997, 40.866572776999945], [-73.83922085399998, 40.866820839999924], [-73.83954475699979, 40.86698673799988], [-73.83974233299988, 40.867087930999894], [-73.84064364799995, 40.86755417499991], [-73.84122362499986, 40.86785815099992], [-73.84185186599998, 40.868191924999934], [-73.842406294, 40.86847474399989], [-73.84280443499989, 40.868680752999886], [-73.84315715499991, 40.868863265999934], [-73.84358581499981, 40.86908763699989], [-73.84423146999998, 40.86942034999993], [-73.84442133700004, 40.86952229899989], [-73.84487737499977, 40.86976050699997], [-73.845172567, 40.86991469799994], [-73.84578147499997, 40.870227695999894], [-73.84608957099984, 40.870389771999946], [-73.84640766399981, 40.870554300999885], [-73.84699273699992, 40.87085288799987], [-73.84725144800001, 40.870987051999926], [-73.84792614099985, 40.87134223399991], [-73.84859676099995, 40.871670784999864], [-73.84987645199996, 40.8721018809999], [-73.85078983299995, 40.87239629199989], [-73.85108463399987, 40.87249279099995], [-73.85170987299989, 40.872697458999944], [-73.85265751899979, 40.872992186999966], [-73.85357628499997, 40.87327602099987], [-73.85363638799987, 40.87330059899996], [-73.85362131899994, 40.87331208699986], [-73.85278034299986, 40.87395322899988], [-73.85215435899995, 40.87443419899993], [-73.85206424599991, 40.874503646999905], [-73.85143247999996, 40.87498727099993], [-73.8506895569999, 40.87548667799993], [-73.85093186799989, 40.875830013999874], [-73.85172236099986, 40.87684337099995], [-73.85254854099988, 40.877091586999924], [-73.8521121739999, 40.87729787999995], [-73.85091896099982, 40.877893440999856], [-73.85138374099995, 40.878476222999886], [-73.85186563799999, 40.87905886499989], [-73.85207011699983, 40.87929765699988], [-73.85248305800003, 40.87946370499989], [-73.85203280500001, 40.88013997199988], [-73.85156600599989, 40.88082536399993], [-73.851106036, 40.88150897099993], [-73.8506512309999, 40.882191789999865], [-73.85020149399993, 40.88286986999993], [-73.84973488199986, 40.8835558029999], [-73.84927742099983, 40.88424150399993], [-73.84882044099987, 40.88491966699994], [-73.84876385000003, 40.88500531699991], [-73.84846274099996, 40.88546103199993], [-73.84836417199985, 40.885610210999886], [-73.84832190799986, 40.8856731779999], [-73.84828534100001, 40.885727657999915], [-73.84824941299993, 40.88578118699991], [-73.84820835300003, 40.88584236099989], [-73.84817178599984, 40.88589684199993], [-73.84813585799989, 40.88595036999992], [-73.84809415299982, 40.886012505999865], [-73.84804918100001, 40.88607950799991], [-73.84802165699985, 40.886120514999924], [-73.84798702099991, 40.886172117999884], [-73.84790388199997, 40.88629598399993], [-73.84785777299996, 40.88636441199987], [-73.84748708800002, 40.886914537999864], [-73.84744396900003, 40.88697853099991], [-73.84704957999995, 40.8876718159999], [-73.84572953199992, 40.88787170599993], [-73.84525554699991, 40.887943469999875], [-73.84465398699979, 40.888033088999855], [-73.84437965699982, 40.888074788999845], [-73.84432835199986, 40.88808258799989], [-73.84407903899991, 40.88812048499992], [-73.844021975, 40.88812915899988], [-73.84376573899986, 40.88816810699991], [-73.84367707000004, 40.888181673999924], [-73.84362775199982, 40.88818922099994], [-73.8431922509999, 40.88825585499997], [-73.84313196799998, 40.88826507899989], [-73.84285880200002, 40.88830687399991], [-73.84196149599987, 40.88845596699989], [-73.84105278599993, 40.888553466999895], [-73.84017616799996, 40.88868679899988], [-73.83998563399987, 40.88871867199988], [-73.83979050699996, 40.8887364029999], [-73.839593563, 40.8887395329999], [-73.83939762699993, 40.88872801299994], [-73.83920549799991, 40.88870221699993], [-73.83822700999995, 40.8886445249999], [-73.83732165099995, 40.8887419639999], [-73.83643359099989, 40.888935663999916], [-73.83554853999995, 40.88913350399993], [-73.83645878199995, 40.89151612599989], [-73.83737956161106, 40.893924741304346], [-73.83630541779426, 40.89359916544134], [-73.83525790584999, 40.89339164402785], [-73.83356849751318, 40.89280642617215], [-73.83267808688781, 40.892601826167834], [-73.83184501081413, 40.89235427900909], [-73.83095773989488, 40.89203015895004], [-73.83007965306355, 40.89178823291273], [-73.82890564213675, 40.89143945016886], [-73.82866341175486, 40.891367484944055], [-73.82796933603909, 40.89114527505283], [-73.82722429759038, 40.89091023377534], [-73.82520822804308, 40.890344349924874], [-73.82391571097277, 40.88997462522143], [-73.8236684811033, 40.889903740147645]]]}}, {\&quot;id\&quot;: \&quot;81\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 82, \&quot;Shape_Leng\&quot;: 0.119875649697, \&quot;Shape_Area\&quot;: 0.000323601079994, \&quot;zone\&quot;: \&quot;Elmhurst\&quot;, \&quot;LocationID\&quot;: 82, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.86768504899995, 40.744071717999915], [-73.86749135099993, 40.74330204699993], [-73.86747169199991, 40.74209572299991], [-73.8675572959999, 40.74167769699988], [-73.86756253399983, 40.740941888999956], [-73.86731779499996, 40.740261344999915], [-73.867146698, 40.73983722399991], [-73.86703973799995, 40.73957218999992], [-73.86676012199987, 40.73889036999984], [-73.8664801159999, 40.73821096399996], [-73.86609463699996, 40.73725142999991], [-73.86582955999995, 40.73664322399992], [-73.86550061599992, 40.73598933199985], [-73.86515865399998, 40.73532501399992], [-73.8648150539999, 40.73466021499993], [-73.86462193199988, 40.73428275699994], [-73.864572486, 40.73418839799996], [-73.86450230199999, 40.73407539899988], [-73.86447086199989, 40.73400727399998], [-73.86491748899991, 40.733866509999864], [-73.86524772599986, 40.73376224899993], [-73.8661043939999, 40.73349176299991], [-73.86682801299989, 40.733245779999926], [-73.86792586499989, 40.73287256899993], [-73.86810582299985, 40.73282625499992], [-73.86827761499993, 40.732767071999874], [-73.8683180679999, 40.73275361999993], [-73.86835853299982, 40.732740158999874], [-73.86845203499989, 40.732713375999886], [-73.8686094929999, 40.732653176999854], [-73.8690483869999, 40.73251391799992], [-73.86955585299982, 40.73235284299989], [-73.87054725300005, 40.73203701799992], [-73.87112231399985, 40.73187152899993], [-73.87128940500001, 40.7318162619999], [-73.87134309799984, 40.7317993569999], [-73.87149800699996, 40.73175058699994], [-73.87192058399992, 40.731613928999884], [-73.87315527199992, 40.731243969999866], [-73.87415476600002, 40.73095008599991], [-73.87481299, 40.73075339399985], [-73.87509154199992, 40.73067136299992], [-73.8753864729999, 40.73059067299993], [-73.87628302399997, 40.73031309399994], [-73.87699724199997, 40.73004835299989], [-73.87789402699987, 40.729715930999944], [-73.87836629199992, 40.72951588699991], [-73.87847478499992, 40.72946892199991], [-73.87969354099992, 40.729010158999884], [-73.88008877499988, 40.728906274999936], [-73.88049068199993, 40.72881654199995], [-73.88088484699995, 40.728743729999906], [-73.88089793699997, 40.728741311999876], [-73.88130917699985, 40.72868082699991], [-73.88172301799989, 40.72863525399986], [-73.88208519900004, 40.728610374999924], [-73.88297543399985, 40.728540950999914], [-73.8835332119999, 40.72849744799988], [-73.88387642499987, 40.7284675829999], [-73.88391980299994, 40.72846391299988], [-73.88444917100003, 40.72841912699995], [-73.88500729499987, 40.7283718949999], [-73.88559330999979, 40.728274440999954], [-73.88590069999995, 40.728211322999904], [-73.88623765899992, 40.72812701699997], [-73.8865683549999, 40.72802889099993], [-73.88661323299988, 40.72801339299988], [-73.8867298489999, 40.72797312799988], [-73.88689134399985, 40.727917365999915], [-73.88720524999994, 40.727792996999874], [-73.88720482599993, 40.72786882899991], [-73.88720430099983, 40.72801082999992], [-73.88720051699987, 40.72809239399991], [-73.88719765199994, 40.72818371199987], [-73.88720114099984, 40.728612069999926], [-73.88723573099988, 40.728932964999956], [-73.88728902599995, 40.72925284999991], [-73.887360922, 40.729570737999936], [-73.88736093299984, 40.72957078299989], [-73.88736094499983, 40.72957082699987], [-73.88745118199992, 40.72988564399985], [-73.88745122999997, 40.729885822999904], [-73.8874512889999, 40.729885994999904], [-73.88755962199991, 40.73019705599993], [-73.888059752, 40.730087229999896], [-73.88811223499987, 40.73059071099994], [-73.88817834099999, 40.73119478199992], [-73.88825349299994, 40.73189716199991], [-73.88828525999989, 40.732260539999864], [-73.88830747899983, 40.73251463099991], [-73.8883315609999, 40.73276054799993], [-73.8883492629999, 40.73294143199996], [-73.88837510099995, 40.73320535899991], [-73.88840065599999, 40.73344799199987], [-73.88844349199991, 40.73385475599986], [-73.88847908999993, 40.73415815399987], [-73.8885228599999, 40.734531159999904], [-73.88770199299982, 40.73429132299987], [-73.88751426599988, 40.734225348999864], [-73.88718676699979, 40.7341589399999], [-73.88689197799985, 40.7340991629999], [-73.88639651899999, 40.734067462999846], [-73.88598467599994, 40.734041121999894], [-73.88548975099985, 40.73400945499987], [-73.88532612599988, 40.734008121999885], [-73.88532603099999, 40.73400812199985], [-73.88532593599987, 40.73400811199986], [-73.885162107, 40.73399498199991], [-73.88500028499989, 40.73397007399991], [-73.88500017899989, 40.73397005699992], [-73.88500007199993, 40.733970027999895], [-73.88484260399989, 40.73393370699992], [-73.88484243799992, 40.73393366999992], [-73.88484227299996, 40.73393361599995], [-73.88469091999995, 40.73388646899984], [-73.88381086999975, 40.73355953599985], [-73.883529104, 40.733848278999844], [-73.88268121899998, 40.733511239999885], [-73.88182222699987, 40.73320039799993], [-73.8810869159999, 40.73293562999988], [-73.8802939189999, 40.732561644999926], [-73.87932144399987, 40.732207540999916], [-73.87844215099989, 40.73192119199992], [-73.87752195799992, 40.731593168999915], [-73.87725122499988, 40.7317941529999], [-73.87822455999998, 40.73210226899988], [-73.87708276299998, 40.73290931699991], [-73.87771964099996, 40.73341722599989], [-73.87834921099993, 40.73390580499987], [-73.87895373100004, 40.73438004699995], [-73.87931157699985, 40.734662119999875], [-73.87955435499998, 40.734853488999924], [-73.88015913099984, 40.73532715699987], [-73.88056928399986, 40.735644932999904], [-73.88066188999987, 40.73570787399994], [-73.88051536899988, 40.73575217199992], [-73.88035425599993, 40.73713112399985], [-73.88033854099989, 40.737265696999906], [-73.88033059399996, 40.73733367699989], [-73.88051819099995, 40.73736701099992], [-73.881509822, 40.73753989799992], [-73.88203267999987, 40.73764290299995], [-73.88230252700001, 40.737707700999934], [-73.88213493800001, 40.73773983999991], [-73.88178451799989, 40.73780702699984], [-73.88128967299998, 40.73789514699991], [-73.87964850399992, 40.7381904399999], [-73.87955038800004, 40.73818743799991], [-73.87945154899991, 40.73819811399992], [-73.8793568999999, 40.7382222559999], [-73.87927094299985, 40.73825836599989], [-73.87823490600005, 40.73844453599987], [-73.87797778399988, 40.73849579099991], [-73.87743058400002, 40.73860051599991], [-73.87791831799989, 40.739394956999874], [-73.87848682299996, 40.739933908999916], [-73.87863239399987, 40.74005996299993], [-73.87910739799986, 40.74044507799988], [-73.879319796, 40.740602079999896], [-73.87999120499994, 40.741070261999894], [-73.88011277199999, 40.74116823899993], [-73.88027765499996, 40.74129746199992], [-73.88100387999987, 40.74184066199995], [-73.88186399099997, 40.74173456799989], [-73.882942868, 40.741609543999836], [-73.88282912199988, 40.74099228299989], [-73.88325318299987, 40.7408594559999], [-73.88333435099989, 40.740834026999906], [-73.88416972299986, 40.74057237299994], [-73.88461489999989, 40.74043293499989], [-73.88540705199999, 40.740196431999934], [-73.88551225099985, 40.74016501899988], [-73.88559037099996, 40.74057655799991], [-73.88572588199987, 40.74128870599986], [-73.88661927199986, 40.741181715999865], [-73.88666826999996, 40.741178144999914], [-73.887511321, 40.74108252699992], [-73.88798650799986, 40.743548191999935], [-73.88886955199995, 40.74339931999985], [-73.88974416799982, 40.74326829099992], [-73.88979159800003, 40.743261185999884], [-73.88983831799999, 40.74325444899993], [-73.89071647499993, 40.74312778399992], [-73.8911102629999, 40.74520271899995], [-73.89139145499985, 40.74664100399984], [-73.89175048799991, 40.7468117269999], [-73.89143128599983, 40.74684473599992], [-73.8905012919998, 40.74694193899997], [-73.88957128399994, 40.7470390539999], [-73.88867766199992, 40.74713427699987], [-73.88778326899983, 40.74722892599993], [-73.88764663699996, 40.747244838999926], [-73.88671656299988, 40.7473414629999], [-73.88578740499986, 40.74743975399987], [-73.88485538499994, 40.747534811999856], [-73.88393579499991, 40.747630242999904], [-73.8829991829999, 40.747734401999914], [-73.88256876999999, 40.74777784499986], [-73.88207112100002, 40.74782992699986], [-73.88113747599988, 40.74792729299991], [-73.88020647999986, 40.74802497999991], [-73.87983894900005, 40.74806172499992], [-73.87927779999994, 40.74812409299993], [-73.87845779299981, 40.74821481099991], [-73.87834312599989, 40.7482226599999], [-73.87741612499993, 40.748319373999955], [-73.87692458299989, 40.74836898899989], [-73.87647952999997, 40.74841640199987], [-73.87625180199986, 40.748438849999914], [-73.87555643099991, 40.74851360799994], [-73.87543236199986, 40.74852735999987], [-73.87462946399991, 40.74861392799995], [-73.87398293699992, 40.74868566899991], [-73.8737009829999, 40.748717318999866], [-73.87330310099995, 40.748758124999895], [-73.87277356899986, 40.74881295799992], [-73.87237256399987, 40.74885155099986], [-73.87184095900001, 40.7489055769999], [-73.871356485, 40.74895695099991], [-73.87037881299995, 40.74906407799989], [-73.86942458599987, 40.74915685199991], [-73.86919188099995, 40.74876289399987], [-73.8689139579999, 40.748368876999955], [-73.86852925199995, 40.747588301999954], [-73.86843750999991, 40.747031196999934], [-73.86826502599992, 40.74631422299992], [-73.86808574299982, 40.745600582999884], [-73.86790963899986, 40.74493371599989], [-73.86787595099985, 40.74481530599989], [-73.86785097499994, 40.74471654499991], [-73.86782691099991, 40.74462945699988], [-73.86768504899995, 40.744071717999915]]]}}, {\&quot;id\&quot;: \&quot;82\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 83, \&quot;Shape_Leng\&quot;: 0.105984933269, \&quot;Shape_Area\&quot;: 0.000217463718718, \&quot;zone\&quot;: \&quot;Elmhurst/Maspeth\&quot;, \&quot;LocationID\&quot;: 83, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89111026199994, 40.745202717999874], [-73.89071647499993, 40.74312778399992], [-73.88983831799999, 40.74325444899993], [-73.88979159800003, 40.743261185999884], [-73.8897441679999, 40.74326829199989], [-73.88886955199995, 40.74339931999985], [-73.88798650799986, 40.743548191999935], [-73.887511321, 40.74108252699992], [-73.88666826999996, 40.741178144999914], [-73.88661927199986, 40.741181715999865], [-73.88572588200003, 40.741288704999874], [-73.88559037099996, 40.74057655699986], [-73.88551225099985, 40.74016501899988], [-73.88540705199999, 40.740196431999934], [-73.88461489999985, 40.74043293399991], [-73.88416972299986, 40.74057237299994], [-73.88333435099989, 40.740834026999906], [-73.88325318299987, 40.7408594559999], [-73.88282912199988, 40.74099228299989], [-73.882942868, 40.741609543999836], [-73.88186399099997, 40.74173456699986], [-73.88100387999987, 40.74184066199995], [-73.88027765499996, 40.74129746199992], [-73.88011277199999, 40.74116823899993], [-73.87999120499994, 40.741070261999894], [-73.879319796, 40.740602079999896], [-73.87910739799986, 40.74044507799988], [-73.87863239399987, 40.74005996299993], [-73.87848682299996, 40.739933908999916], [-73.87791831799989, 40.739394956999874], [-73.87743058399992, 40.738600514999916], [-73.87797778399988, 40.73849579099991], [-73.87823490600005, 40.73844453599987], [-73.87927094299985, 40.73825836599989], [-73.8793568999999, 40.7382222559999], [-73.87945154899991, 40.73819811399992], [-73.87955038799986, 40.738187436999986], [-73.87964850399992, 40.7381904399999], [-73.88128967299998, 40.73789514699991], [-73.88178451799989, 40.73780702699984], [-73.88213493800001, 40.73773983999991], [-73.88230252700001, 40.737707700999934], [-73.88203268000002, 40.73764290399986], [-73.881509822, 40.73753989799992], [-73.88051819099995, 40.73736701099992], [-73.88033059399996, 40.73733367699989], [-73.88033854099989, 40.737265696999906], [-73.88035425599993, 40.73713112399985], [-73.88051536899988, 40.73575217199992], [-73.88066188999987, 40.73570787399994], [-73.88056928399986, 40.735644932999904], [-73.88015913099984, 40.73532715699987], [-73.87955435499998, 40.734853488999924], [-73.87931157699985, 40.734662119999875], [-73.87895373100004, 40.73438004699995], [-73.87834921099993, 40.73390580499987], [-73.87771964099996, 40.73341722599989], [-73.87708276299998, 40.73290931699991], [-73.87822455999998, 40.73210226899988], [-73.87725122499988, 40.7317941529999], [-73.87752195799992, 40.731593168999915], [-73.87844215099989, 40.73192119199992], [-73.87932144399987, 40.732207540999916], [-73.8802939189999, 40.732561644999926], [-73.8810869159999, 40.73293562999988], [-73.88182222699987, 40.73320039799993], [-73.88268121899998, 40.733511239999885], [-73.883529104, 40.733848278999844], [-73.88381086999975, 40.73355953599985], [-73.88469091999995, 40.73388646899984], [-73.88484227299996, 40.73393361599995], [-73.88484243799992, 40.73393366999992], [-73.88484260399989, 40.73393370699992], [-73.88500007199993, 40.733970027999895], [-73.88500017899989, 40.73397005699992], [-73.88500028499989, 40.73397007399991], [-73.885162107, 40.73399498199991], [-73.88532593599987, 40.73400811199986], [-73.88532603099999, 40.73400812199985], [-73.88532612599988, 40.734008121999885], [-73.88548975099985, 40.73400945499987], [-73.88598467599994, 40.734041121999894], [-73.88639651899999, 40.734067462999846], [-73.88689197799985, 40.7340991629999], [-73.88718676699979, 40.7341589399999], [-73.88751426599988, 40.734225348999864], [-73.88770199299982, 40.73429132299987], [-73.8885228599999, 40.734531159999904], [-73.88910318999984, 40.73459239599987], [-73.88993450699996, 40.734559955999906], [-73.89113852799989, 40.73451296999988], [-73.89138497899995, 40.734504988999895], [-73.8917501639998, 40.73448480999984], [-73.89232644100004, 40.73447014099991], [-73.89255554699984, 40.73447812599994], [-73.89278405699996, 40.73449596299988], [-73.89301088099992, 40.734523575999944], [-73.89323494499989, 40.7345608119999], [-73.89347408299997, 40.734602177999875], [-73.8937090569999, 40.7346574519999], [-73.89393780599978, 40.73472620999992], [-73.89415835499986, 40.734807791999884], [-73.89424644900001, 40.73484181299991], [-73.89440759699976, 40.73489932399987], [-73.89457531899991, 40.73494649199996], [-73.89457544899996, 40.7349465289999], [-73.89457557899993, 40.734946554999915], [-73.8947480899998, 40.73498275099996], [-73.89474827899986, 40.734982786999915], [-73.89474848099997, 40.73498281499997], [-73.89492421799993, 40.73500772199991], [-73.89510133499994, 40.73502118299989], [-73.89602931599993, 40.735017891999846], [-73.89651105199997, 40.73509674199992], [-73.89691187999993, 40.73508660199993], [-73.8978323689999, 40.73516035399992], [-73.89806882999987, 40.73518359899987], [-73.89806895999997, 40.73518360799988], [-73.89806910099988, 40.735183616999954], [-73.89830786699996, 40.73519417399996], [-73.89830799699995, 40.735194183999965], [-73.89830812699986, 40.73519418399992], [-73.8985475869999, 40.735191909999934], [-73.89854772799987, 40.735191909999855], [-73.89854787099992, 40.7351919009999], [-73.89878621299994, 40.73517681999992], [-73.89878634299994, 40.73517681099992], [-73.89878646099986, 40.73517679299992], [-73.89902209999995, 40.73514908399993], [-73.89922944799997, 40.73511159899988], [-73.89943348500005, 40.73506258999993], [-73.89963257999993, 40.73500235799992], [-73.89982513099983, 40.734931394999926], [-73.90000969399993, 40.73485031999996], [-73.90015343399983, 40.73479640499991], [-73.90028989999986, 40.73472960699994], [-73.90029003099994, 40.734729542999915], [-73.90029014899983, 40.734729471999906], [-73.90041629699991, 40.734650803999884], [-73.90041646300001, 40.73465070499992], [-73.90041661699985, 40.73465058799992], [-73.90053009099984, 40.73456135699991], [-73.90053014999994, 40.73456130199992], [-73.90062887299989, 40.73446333999988], [-73.90062893299998, 40.73446328599989], [-73.90062897999994, 40.734463231999946], [-73.9007113889999, 40.73435872699986], [-73.90091094899987, 40.7341260369999], [-73.90107970900003, 40.73391463399987], [-73.90194324799982, 40.73434002499993], [-73.9024461159998, 40.734572838999945], [-73.9028664949999, 40.73476746099994], [-73.90333476000002, 40.734996402999876], [-73.903367991, 40.73501264999993], [-73.90378660899988, 40.735217315999876], [-73.90455512499977, 40.73560527299987], [-73.90470297599984, 40.73567990299986], [-73.90516948899983, 40.73585964299986], [-73.90573589799986, 40.73463343599988], [-73.9060183039999, 40.73401073899992], [-73.90568645899998, 40.73391582499989], [-73.9059835329999, 40.73326568399991], [-73.90628903499987, 40.732400751999876], [-73.91068876399997, 40.733471081999916], [-73.91023874099996, 40.73433921699993], [-73.90991066500006, 40.73499734099988], [-73.90959716499998, 40.7356564569999], [-73.90932941199996, 40.73623244499992], [-73.90930551799993, 40.73628728499989], [-73.90928542399993, 40.73633405899988], [-73.90926002999988, 40.736403179999854], [-73.90890220399997, 40.73644071099989], [-73.90789283699988, 40.736597387999936], [-73.907619066, 40.73665029899992], [-73.90739546899985, 40.736709318999935], [-73.90672950499994, 40.73691348499992], [-73.90646283399997, 40.73702598499988], [-73.90598452499982, 40.7372186479999], [-73.90556671799989, 40.737414398999896], [-73.90486204399993, 40.73772361199986], [-73.90463288899997, 40.73782416299991], [-73.90369365299995, 40.73819895599996], [-73.90364752599992, 40.73821736899992], [-73.903575259, 40.73824323399991], [-73.90316328499986, 40.738390687999924], [-73.90268254099986, 40.73856750299995], [-73.90174321599993, 40.73890039799996], [-73.90102306499992, 40.73926666799989], [-73.90057825399985, 40.73949289599988], [-73.89974871399977, 40.74013220399991], [-73.89920950799993, 40.7405454809999], [-73.89916350300004, 40.74059856999987], [-73.89908954799988, 40.74065715499993], [-73.89896997799984, 40.74075331499988], [-73.89889421999989, 40.740814239999935], [-73.8988332499998, 40.74085897699991], [-73.89868042099991, 40.74097933999994], [-73.89818354199996, 40.74139090199992], [-73.89762150399993, 40.741841761999865], [-73.89732904499989, 40.74207636599991], [-73.897207419, 40.74217393599989], [-73.89706891399995, 40.74228451999994], [-73.89638129299982, 40.74284491999988], [-73.89576162799989, 40.74335656899989], [-73.89557809299986, 40.74350275399994], [-73.89540662199998, 40.74365743999987], [-73.89524819599988, 40.74381972999992], [-73.89499026399977, 40.744134212999896], [-73.8949120899999, 40.74428123099996], [-73.89484503999992, 40.744431661999876], [-73.89478949299988, 40.74458478799991], [-73.89474567599989, 40.74473983299986], [-73.894693961, 40.74495583499987], [-73.89466630799988, 40.74517683999988], [-73.89466369299987, 40.74540049699994], [-73.8946865809999, 40.74562431999986], [-73.89473484699982, 40.74584579899992], [-73.89480782, 40.74606246499995], [-73.89490427299994, 40.746271992999944], [-73.89496338799982, 40.74637214699989], [-73.89502251499994, 40.7464722929999], [-73.89535589999988, 40.74710841299986], [-73.89566359199999, 40.747695496999896], [-73.89583033399997, 40.74801363999995], [-73.89610755799994, 40.7485008479999], [-73.89624245599988, 40.74871954499987], [-73.89614389199978, 40.74867878599984], [-73.89583955299999, 40.74854685699991], [-73.89560209500003, 40.748449719999904], [-73.89521297399997, 40.748290552999926], [-73.89379708799999, 40.747691499999874], [-73.89240906700005, 40.747135327999885], [-73.89175048799991, 40.7468117269999], [-73.89139145499985, 40.74664100399984], [-73.89111026199994, 40.745202717999874]]]}}, {\&quot;id\&quot;: \&quot;83\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 84, \&quot;Shape_Leng\&quot;: 0.233623987032, \&quot;Shape_Area\&quot;: 0.00207375572052, \&quot;zone\&quot;: \&quot;Eltingville/Annadale/Prince&apos;s Bay\&quot;, \&quot;LocationID\&quot;: 84, \&quot;borough\&quot;: \&quot;Staten Island\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.16005732699996, 40.527635041999886], [-74.15988277075512, 40.52736935827443], [-74.15994367873692, 40.52736460798024], [-74.15999341625403, 40.52734733915582], [-74.16001146160204, 40.527342810785534], [-74.16004022395717, 40.52734323910654], [-74.16005554683676, 40.52734493811437], [-74.16008419227262, 40.52736090101808], [-74.16013065929955, 40.52740191736376], [-74.16016839366702, 40.527448332314734], [-74.16019359405244, 40.52748925315915], [-74.16020751740506, 40.52750820806293], [-74.16022582487547, 40.52752444888366], [-74.16023231856387, 40.52753020940202], [-74.16025716713632, 40.527547438061426], [-74.16026450758767, 40.527552533640204], [-74.1603042631396, 40.527555747824614], [-74.1603409737616, 40.527549828131136], [-74.16040893562746, 40.52752986340302], [-74.16047493730298, 40.52750451007662], [-74.16054717701898, 40.52748726819039], [-74.16061775898544, 40.52746724757211], [-74.16152666515212, 40.527029381829415], [-74.16154625377834, 40.52702377298726], [-74.16158217423518, 40.52701347777668], [-74.16164743469216, 40.52701465879783], [-74.16169141315441, 40.52702390351627], [-74.16175881551293, 40.52704801621294], [-74.16182749073316, 40.52707161543773], [-74.161897175874, 40.5270880273121], [-74.1619669783145, 40.52710417763109], [-74.16203117512099, 40.52713034777669], [-74.16206636173392, 40.52714437519105], [-74.16209796862164, 40.52715697375597], [-74.16214390483917, 40.52718045998372], [-74.16220244797076, 40.52719607656212], [-74.16222577962044, 40.527202274889866], [-74.16227196108895, 40.52719426281089], [-74.16233039191978, 40.52716606171715], [-74.16238512563739, 40.52712627773963], [-74.1624403983033, 40.52709544379206], [-74.16250698728896, 40.52706896148613], [-74.16256536120572, 40.52703685337438], [-74.16263198944374, 40.527007327916294], [-74.16269855315247, 40.52697494795893], [-74.16276280751576, 40.52694471328185], [-74.16282757854665, 40.52691804388985], [-74.16289520141652, 40.52689026370809], [-74.1629575060745, 40.526853845457396], [-74.16301732011821, 40.52681663075126], [-74.1630784953535, 40.52678672410565], [-74.16312608537125, 40.52676093369092], [-74.16317181206539, 40.52671474203093], [-74.16322654513108, 40.5266750471119], [-74.16328589798596, 40.526638443401794], [-74.1633490917526, 40.5266030787796], [-74.16340865825354, 40.526566807919906], [-74.16346849035503, 40.52652829693557], [-74.16351595922495, 40.52649539134296], [-74.16356404014883, 40.526452166655076], [-74.16361738290826, 40.52641368125647], [-74.16367305827846, 40.526378857404445], [-74.1637200159487, 40.526350032996056], [-74.16378904863853, 40.52633450479553], [-74.16382940261882, 40.526328513449315], [-74.16386460199075, 40.52633280710802], [-74.16389790294477, 40.52634212167503], [-74.16393757258862, 40.52633604180663], [-74.16400488402428, 40.52631544294323], [-74.16407189088119, 40.5262921512552], [-74.1643995358268, 40.526209094151916], [-74.164602248092, 40.52615279838773], [-74.16474657068605, 40.52608034550147], [-74.1650341131794, 40.52582754961078], [-74.16530607172459, 40.52564918360973], [-74.16542588856903, 40.525592387035516], [-74.16592084252488, 40.52541220547592], [-74.16613400493428, 40.5253150796155], [-74.16652810000556, 40.525081427226304], [-74.16690462540775, 40.52483129006192], [-74.16755867477953, 40.52440902876843], [-74.16829560779412, 40.523949868110265], [-74.16839091003757, 40.52389048803941], [-74.16884431820021, 40.52359068215665], [-74.16898557136982, 40.52352916214104], [-74.16920066800394, 40.52343810320529], [-74.16935136134755, 40.52336054452499], [-74.16944771743327, 40.523327955346645], [-74.16955299276312, 40.52327628994602], [-74.16963714493947, 40.523229437825805], [-74.16967960342768, 40.52320579866472], [-74.16983248964985, 40.52313389981412], [-74.1699971116146, 40.523045772452306], [-74.17007269489395, 40.52302655162228], [-74.17014586058583, 40.52300793760332], [-74.17022498733132, 40.523008972567176], [-74.17032706385987, 40.523026957841964], [-74.17039614222017, 40.523053682661704], [-74.17048859810274, 40.523084172649895], [-74.17057009188476, 40.52314788073061], [-74.1705931469583, 40.52318574255418], [-74.1706100526443, 40.52321348729538], [-74.17076227805249, 40.523355701798174], [-74.17080648143494, 40.52338975028164], [-74.17089812897197, 40.52346034360391], [-74.17103027207942, 40.52352912247979], [-74.17110263696176, 40.523549706673656], [-74.1712653606599, 40.52355912147656], [-74.17134981850703, 40.523553392209635], [-74.1720632017547, 40.52332056936472], [-74.17269667263014, 40.52296873552358], [-74.17278271090665, 40.52292094996797], [-74.17342635928968, 40.522569159917396], [-74.17506810745108, 40.521494273787326], [-74.17601245479067, 40.52087596282906], [-74.17760133813562, 40.51931649499758], [-74.17758110816588, 40.51931360137952], [-74.17758082600331, 40.51929588947166], [-74.17756158077196, 40.51928751791759], [-74.17755135508193, 40.51928306954647], [-74.17753078094204, 40.51925861375083], [-74.1775491391979, 40.519235298764094], [-74.17756306042942, 40.519217618159864], [-74.17756663736948, 40.51921662739506], [-74.177570375152, 40.51921608295464], [-74.17757417880544, 40.51921599867233], [-74.17757795168454, 40.51921637668948], [-74.1775815979258, 40.51921720740124], [-74.17758502488357, 40.51921846970048], [-74.17758814548375, 40.51922013151399], [-74.17770261696565, 40.51932100548376], [-74.17777234503342, 40.519352398801956], [-74.1782708127379, 40.519923675664856], [-74.17831876690433, 40.51994578563496], [-74.17837082900233, 40.519961583533544], [-74.17842558448912, 40.51997064012644], [-74.1784936298451, 40.51997981156714], [-74.17856035946404, 40.519993500585656], [-74.17862525939358, 40.52001160174881], [-74.17870240960569, 40.52002807719417], [-74.17878128209175, 40.52003879855972], [-74.17886114175502, 40.52004366592176], [-74.17894124429743, 40.52004263391609], [-74.17902084315703, 40.52003571216092], [-74.17909919646684, 40.520022965167755], [-74.17917557396926, 40.52000451173923], [-74.1791799692992, 40.51999851587877], [-74.17918564647486, 40.51999318380906], [-74.17919243740532, 40.51998867340321], [-74.17920014102289, 40.519985118206094], [-74.17920852923737, 40.519982623480864], [-74.17921735368851, 40.519981263091864], [-74.1792263531002, 40.51998107731764], [-74.17923526101619, 40.51998207165874], [-74.17924381368908, 40.51998421667446], [-74.17925175788962, 40.51998744885473], [-74.17925885840404, 40.519991672500694], [-74.17926490499875, 40.519996762557405], [-74.17926971864468, 40.52000256831761], [-74.17927315681786, 40.520008917883], [-74.17929773247596, 40.520158179785646], [-74.17932303420199, 40.52020078552198], [-74.17935437773546, 40.52024098423037], [-74.17939137556665, 40.52027827890804], [-74.1794335702753, 40.520312208455735], [-74.17943716601998, 40.52031477241966], [-74.17946516743717, 40.52033326607575], [-74.17970770292054, 40.520493668952895], [-74.17981016948934, 40.520552337706], [-74.17998905151346, 40.520588878574365], [-74.18009755932276, 40.52059826147795], [-74.1802352477878, 40.52059804536449], [-74.18033122156834, 40.520601078045196], [-74.18049398813153, 40.520616743326855], [-74.18064008999073, 40.5206419860285], [-74.18087275843453, 40.520682306633134], [-74.18104081208887, 40.520705036287154], [-74.18115760502826, 40.52069211651063], [-74.18147441265003, 40.520583356443936], [-74.18182006847873, 40.520477649292964], [-74.18189434441686, 40.52043417820423], [-74.18192155369601, 40.52041825301177], [-74.18195667134623, 40.52041960762215], [-74.18204081284071, 40.52043420132781], [-74.18213362064886, 40.52040839326869], [-74.18233555621087, 40.52035223806129], [-74.18263745466407, 40.52022874621202], [-74.18283208173136, 40.52008772084574], [-74.18314810962117, 40.519870832266164], [-74.18325813603732, 40.51985265666168], [-74.18342370583406, 40.51988972456803], [-74.1838130349663, 40.51975173601095], [-74.18403696242659, 40.519618704645445], [-74.18417322756973, 40.51960411413418], [-74.18428548317002, 40.519578353874394], [-74.1848311647976, 40.519341358600826], [-74.1851629037099, 40.519129282625485], [-74.18546140887109, 40.51892234394305], [-74.18588730164078, 40.5186361994914], [-74.18656733191354, 40.51811585040488], [-74.18759896367169, 40.51717107849326], [-74.18779042528426, 40.517012970083776], [-74.18797576814546, 40.516850670927234], [-74.18815483487393, 40.51668431887701], [-74.18832747342314, 40.51651405522783], [-74.18849353720901, 40.51634002459576], [-74.18865288523577, 40.51616237479525], [-74.18880538221464, 40.51598125671339], [-74.1889508986793, 40.515796824182246], [-74.18906140992775, 40.51564809361495], [-74.18916738113884, 40.51549745094445], [-74.18926875557315, 40.515344976872356], [-74.18884614386798, 40.51510484487468], [-74.18884404213027, 40.515103352411614], [-74.18884230472543, 40.51510160823291], [-74.18884098256879, 40.51509966345229], [-74.1888401144064, 40.51509757506203], [-74.18883972568021, 40.51509540426325], [-74.18883982778155, 40.51509321467174], [-74.18884041771852, 40.51509107045404], [-74.1888414782028, 40.51508903444723], [-74.18884297815646, 40.51508716631711], [-74.18884487362294, 40.51508552080951], [-74.18884710905482, 40.51508414614676], [-74.18884961894243, 40.51508308261369], [-74.18885232973261, 40.51508236137739], [-74.18885516198492, 40.515082003573944], [-74.18885803269946, 40.51508201968887], [-74.18940933082028, 40.51533369213587], [-74.18945073974398, 40.51534873688931], [-74.18949485290003, 40.51535830964661], [-74.18954043873414, 40.51536214315457], [-74.18958622457698, 40.51536013038885], [-74.18963093217458, 40.515352327542146], [-74.18967331337697, 40.5153389524551], [-74.18971218498393, 40.51532037853429], [-74.19158090301478, 40.51334072190166], [-74.19162047377624, 40.513263554592754], [-74.19166863525211, 40.51318928635761], [-74.19172502696235, 40.513118473037345], [-74.1917892268341, 40.513051644613725], [-74.1918607543608, 40.51298930124345], [-74.1919390741988, 40.512931909514684], [-74.19202360017422, 40.5128798989557], [-74.19211369967013, 40.51283365882027], [-74.19220869836079, 40.512793535174744], [-74.19279996381384, 40.51220932809702], [-74.19281567384283, 40.51219380443744], [-74.19316595564403, 40.51184769858796], [-74.19330807318319, 40.51170952195666], [-74.19344318346744, 40.51156730959325], [-74.19357108999736, 40.51142126837362], [-74.19369160675681, 40.51127161074228], [-74.19380455848221, 40.51111855440297], [-74.19390978091913, 40.51096232200203], [-74.19400712105934, 40.51080314080423], [-74.19409643736367, 40.510641242362226], [-74.19521339999068, 40.5099776529556], [-74.19593485609805, 40.509856203578536], [-74.19603087689242, 40.50985296643164], [-74.19612693068868, 40.509855571490036], [-74.19622240829706, 40.50986400223228], [-74.19631670418124, 40.50987820518893], [-74.19640922029949, 40.50989809028247], [-74.19649936989559, 40.50992353139785], [-74.19658658122064, 40.50995436718267], [-74.19670276823794, 40.510006581247204], [-74.19681433917133, 40.51006436353172], [-74.19692083659992, 40.51012747714548], [-74.19702182389827, 40.51019566334], [-74.19725817895724, 40.51034094940742], [-74.19748914407793, 40.51049120095594], [-74.19771454022825, 40.510646301541996], [-74.19779692577328, 40.51072398261458], [-74.19788563701174, 40.510797493614284], [-74.19798031248911, 40.510866535003416], [-74.19808056644499, 40.51093082545619], [-74.19818144044018, 40.51098770518905], [-74.19828668015873, 40.51103977364202], [-74.19839589221958, 40.51108683618085], [-74.1984996773149, 40.511144655614984], [-74.19860831704759, 40.51119702314984], [-74.19872132060244, 40.51124370219286], [-74.19883817744555, 40.51128448185153], [-74.19895835963109, 40.51131917788564], [-74.19908132418689, 40.5113476335404], [-74.19920651556788, 40.51136972025444], [-74.19933336816597, 40.51138533824086], [-74.19946130886673, 40.51139441693824], [-74.19949239977682, 40.51138775948159], [-74.19952447399193, 40.51138490638349], [-74.1995567375377, 40.51138592827046], [-74.199588391753, 40.5113907998464], [-74.19961865305945, 40.511399400518776], [-74.19964677235937, 40.511411517384055], [-74.19967205357709, 40.511426850497486], [-74.1996938708912, 40.5114450202982], [-74.19971168422506, 40.51146557700449], [-74.2000371231315, 40.51267759982975], [-74.19992960944485, 40.512712946186575], [-74.19990247925942, 40.5127218647023], [-74.19892572793859, 40.51277730599833], [-74.19896278699422, 40.51282012058021], [-74.19900552600113, 40.51285973204682], [-74.19905347339986, 40.5128957033372], [-74.19910610016022, 40.512927637554526], [-74.19916282561876, 40.5129551823451], [-74.19922302388592, 40.512978033786645], [-74.19928603075158, 40.512995939741934], [-74.19936127407836, 40.51301019443217], [-74.19943822355076, 40.513017401531776], [-74.19951575024025, 40.513017455305196], [-74.1995927167492, 40.51301035496338], [-74.19966799389906, 40.512996204675694], [-74.19970753197478, 40.51298169765322], [-74.19974595151908, 40.512965534528036], [-74.19981408314813, 40.512947170035005], [-74.19988465622781, 40.51293533816418], [-74.19995659988416, 40.51293021845216], [-74.20002882244746, 40.51293188858514], [-74.20010022801556, 40.51294032322073], [-74.20018520017844, 40.51297068123254], [-74.20027304849728, 40.51299582229696], [-74.20036322411362, 40.51301558933668], [-74.20045516362643, 40.51302985885054], [-74.20054829261352, 40.51303854168506], [-74.2006420292192, 40.513041583590976], [-74.20073578779198, 40.513038965563155], [-74.20082898254232, 40.513030703958414], [-74.20097738056025, 40.51300730199303], [-74.20268081102346, 40.512738661754625], [-74.20323003312072, 40.51262093396144], [-74.20391668552791, 40.512473744077646], [-74.20419746366701, 40.512416025219316], [-74.20447746264747, 40.512358417799], [-74.20464466309228, 40.51232810346069], [-74.20467010671484, 40.5123234901946], [-74.20470203423241, 40.51231643884202], [-74.20474262938437, 40.51230534323708], [-74.20479737906909, 40.512293569791595], [-74.20485317338206, 40.512285123141105], [-74.20490966586989, 40.51228005573488], [-74.20498315433055, 40.512285655353494], [-74.20505574742559, 40.512296025872296], [-74.2051269144439, 40.512311091474636], [-74.20519613509917, 40.512330742019735], [-74.2053586899099, 40.51231661021616], [-74.206238443888, 40.51214565451205], [-74.20759701728615, 40.51183515615181], [-74.20780809056909, 40.51176873971944], [-74.20801578972448, 40.51169639198572], [-74.20821982874101, 40.51161821258057], [-74.20841992665042, 40.51153430916454], [-74.20861580791524, 40.5114447972802], [-74.2088072028073, 40.51134980019293], [-74.20899384778049, 40.51124944872136], [-74.20917548583245, 40.51114388105671], [-74.20935186685985, 40.511033242572715], [-74.20952274800162, 40.51091768562526], [-74.20968789397448, 40.510797369342356], [-74.20927776652347, 40.51048338085088], [-74.20922122417662, 40.51052353035443], [-74.2091899682503, 40.51049905695518], [-74.2093220046419, 40.510398628895395], [-74.20935837735608, 40.51042236182036], [-74.2093018345809, 40.510461711572255], [-74.20971374205877, 40.510777703242994], [-74.20979622955178, 40.510712935588195], [-74.2098765501006, 40.5106466003708], [-74.20999477704768, 40.5105424951943], [-74.21013598908237, 40.51040899868249], [-74.21027071719323, 40.51027165401236], [-74.21039878156121, 40.51013064453609], [-74.21052001126658, 40.50998615849728], [-74.21063424451708, 40.5098383887794], [-74.21074132886355, 40.50968753264821], [-74.21084112140274, 40.50953379148834], [-74.21093348896892, 40.50937737053439], [-74.21101830831059, 40.50921847859689], [-74.21109546625489, 40.50905732778337], [-74.21110649763585, 40.509040446116686], [-74.2111198592797, 40.509024575519604], [-74.21114086689144, 40.50900543275003], [-74.21116524905771, 40.508988783056054], [-74.2111925033283, 40.50897496954096], [-74.2112220680678, 40.50896427686242], [-74.21124713782135, 40.50895562031976], [-74.2112702602015, 40.50894423571413], [-74.21129092925099, 40.508930372161124], [-74.21130869269622, 40.50891433301951], [-74.2113231618442, 40.508896469253536], [-74.2113394556123, 40.50886265597218], [-74.21135666295963, 40.50883803057888], [-74.21137155741015, 40.50882118680084], [-74.21138832089028, 40.50880539940495], [-74.21149650880552, 40.50868783698416], [-74.2115985998613, 40.50856713987462], [-74.21169443837452, 40.5084434921724], [-74.21178387820076, 40.50831708247287], [-74.21178832276219, 40.5083133753558], [-74.2117948024027, 40.508306124722154], [-74.21180347990948, 40.50829641620653], [-74.21181466920432, 40.50827491340112], [-74.2118193208539, 40.50826237417325], [-74.21181694045957, 40.50825128014592], [-74.21181314633507, 40.50823803897107], [-74.21179478802503, 40.5082180224169], [-74.21178440618708, 40.508198349656574], [-74.21178477846054, 40.5081939209598], [-74.21179183197995, 40.50817327349501], [-74.21180447511732, 40.50816644740152], [-74.21182935119818, 40.50816562414525], [-74.21184952499443, 40.50817209263543], [-74.21186206100487, 40.50817773153637], [-74.21187243262713, 40.508178200590365], [-74.21188275583197, 40.50817730406347], [-74.2118927242892, 40.50817506855932], [-74.21190204219565, 40.50817156041406], [-74.21191043305252, 40.508166883728144], [-74.21198875142503, 40.50810220205466], [-74.21206129133526, 40.508033706992975], [-74.21212773490433, 40.50796169871397], [-74.21218779097335, 40.50788649278341], [-74.21224119637824, 40.507808418779284], [-74.21228771710221, 40.50772781884722], [-74.21228088629543, 40.50772201316972], [-74.21227541636684, 40.50771542086717], [-74.21227145982967, 40.5077082257477], [-74.21226912700006, 40.507700628426775], [-74.21226848292227, 40.50769284073455], [-74.21226954555374, 40.507685079808375], [-74.21227228526553, 40.50767756204003], [-74.21227662566783, 40.507670497040685], [-74.21228244574074, 40.50766408179794], [-74.21228958320754, 40.50765849518247], [-74.21229783906037, 40.507653892960654], [-74.21230698310823, 40.50765040345257], [-74.21231676039584, 40.50764812395292], [-74.21232689831143, 40.507647118018966], [-74.21233711418861, 40.50764741369819], [-74.21234712318729, 40.50764900274668], [-74.21235935187873, 40.507649118464606], [-74.21237144723337, 40.50764773899954], [-74.21238309749239, 40.507644899907085], [-74.21239400236918, 40.50764067436548], [-74.21240388078938, 40.50763517128831], [-74.21241247813637, 40.507628532518076], [-74.21241957281302, 40.50762092916938], [-74.21242498195419, 40.50761255721916], [-74.212469109696, 40.507543027976546], [-74.21252145049147, 40.507476901447916], [-74.21258155816881, 40.50741474129019], [-74.21260429253782, 40.50738539835731], [-74.21263191375205, 40.50735860954538], [-74.21266393606682, 40.50733484595486], [-74.21281403368066, 40.507230146332546], [-74.21296033917497, 40.50712236499311], [-74.21299767227997, 40.50708181270402], [-74.21303970639433, 40.5070440355638], [-74.21308608941341, 40.50700935001108], [-74.21313643280568, 40.50697804658764], [-74.21322298566018, 40.5069107548499], [-74.21330481575855, 40.50684010443856], [-74.21338169973609, 40.50676628821535], [-74.21345342773242, 40.50668950768308], [-74.21351980396362, 40.506609972435704], [-74.21352692087261, 40.50660119549384], [-74.21353206366952, 40.50659164901709], [-74.21353509417533, 40.50658158950686], [-74.21353593096521, 40.50657128724867], [-74.21353455155688, 40.50656101905034], [-74.21353099301393, 40.50655106080436], [-74.21351794029142, 40.50651322910223], [-74.21351359963718, 40.506474248040966], [-74.21351810019696, 40.506435277546395], [-74.21353130803675, 40.50639747722785], [-74.2135586930013, 40.506403728058004], [-74.21358454603869, 40.50641303341087], [-74.21360828614134, 40.506425184162815], [-74.21362937978549, 40.506439907244435], [-74.21364735292187, 40.50645687177696], [-74.21375171236187, 40.50654706072898], [-74.21380778551456, 40.506595519978646], [-74.21383094316958, 40.5066027625566], [-74.21385533847373, 40.5066070246834], [-74.2138803178839, 40.50660819217817], [-74.21390521220889, 40.506606233763875], [-74.21392935453652, 40.506601201906], [-74.21434250129728, 40.506518911287216], [-74.2145052736106, 40.506436853488815], [-74.21466348884147, 40.50634975767173], [-74.21481687952192, 40.506257771084194], [-74.21496518634406, 40.50616104924237], [-74.21510815859857, 40.50605975566708], [-74.2152455545974, 40.50595406160774], [-74.21537714208378, 40.50584414575232], [-74.21552102597181, 40.505732714782305], [-74.21565837406435, 40.50561657803736], [-74.21578892250353, 40.505495958655736], [-74.21591242050023, 40.505371088386966], [-74.2160286308154, 40.505242207146686], [-74.21613733021583, 40.50510956255549], [-74.21623830990282, 40.50497340946303], [-74.21633137591344, 40.50483400945808], [-74.2164163494922, 40.50469163036647], [-74.21735453442754, 40.503642896458096], [-74.21740975778067, 40.503561971545125], [-74.21751853650296, 40.50339134449908], [-74.21752648446406, 40.503380022023215], [-74.21753620569285, 40.50336953669987], [-74.21754755095681, 40.50336004949062], [-74.2175640128441, 40.50334967242369], [-74.21758240164539, 40.503341392663486], [-74.21760226300273, 40.50333541478962], [-74.2176231061741, 40.503331886505485], [-74.2176447374599, 40.503330899516875], [-74.21766629906656, 40.5033325511201], [-74.21768724213341, 40.50333679927285], [-74.21770703354522, 40.50334353583657], [-74.21772516950195, 40.503352589328784], [-74.21774118834347, 40.503363729288715], [-74.21779200715531, 40.503371648880396], [-74.21784380521872, 40.50337369060309], [-74.21789542238488, 40.50336980872706], [-74.21794570255717, 40.503360090196935], [-74.21799351958559, 40.503344752683596], [-74.21803780248969, 40.50332413970897], [-74.2180775594475, 40.50329871295202], [-74.21811190000946, 40.50326904190765], [-74.21814317872035, 40.50324771545581], [-74.21817648437909, 40.50322825936179], [-74.21822997486109, 40.50320275948046], [-74.21828692035882, 40.50318207330557], [-74.21834658055987, 40.503166469764125], [-74.218408179861, 40.50315615170689], [-74.21861332128304, 40.50310799064943], [-74.21881609351551, 40.50305430112445], [-74.21901624093961, 40.50299515081598], [-74.21921351124648, 40.50293061429154], [-74.21940765575711, 40.50286077290877], [-74.21959842973497, 40.50278571471262], [-74.21968321146456, 40.502761677014604], [-74.21977016417237, 40.50274268846472], [-74.21985877264986, 40.50272886157314], [-74.2199485118786, 40.502720278265876], [-74.22003885014124, 40.50271698940033], [-74.22012925217143, 40.502719014463445], [-74.22021918232528, 40.502726341456416], [-74.22032276952281, 40.502741577459105], [-74.2204276250922, 40.5027504140985], [-74.22053307166941, 40.502752794290394], [-74.22063842807191, 40.50274870265868], [-74.2207430136998, 40.50273816563523], [-74.22084615293313, 40.502721251288875], [-74.22094717949659, 40.502698068885834], [-74.22104544076478, 40.50266876818359], [-74.22111032227026, 40.502659437877796], [-74.22117326247195, 40.50264421809158], [-74.22123334742355, 40.5026233298297], [-74.22128970464198, 40.502597076407945], [-74.22134151577676, 40.50256583904863], [-74.22134174271483, 40.502565707936654], [-74.22138680334184, 40.50254306201155], [-74.22143526134924, 40.5025249593466], [-74.22148633479932, 40.50251169205292], [-74.22153919955196, 40.50250347421612], [-74.22159300278173, 40.50250043822093], [-74.22188242299993, 40.502674840999866], [-74.22321582499997, 40.508658610999866], [-74.22290251399993, 40.50893653999989], [-74.22663407199991, 40.51725100999996], [-74.22690993399992, 40.51917139799985], [-74.226710219, 40.51912029999991], [-74.2265150859999, 40.51905608999989], [-74.22632671899993, 40.51897915999993], [-74.226147208, 40.51889020799993], [-74.22597849399989, 40.518790184999894], [-74.22582224299991, 40.51868027699988], [-74.2256798289999, 40.51856182999988], [-74.22549932099996, 40.518505187999935], [-74.22531657499994, 40.51845289399988], [-74.22513176899994, 40.51840500099992], [-74.22494508599989, 40.518361553999895], [-74.22475670999995, 40.51832259699992], [-74.22456682499998, 40.51828816899994], [-74.22437561899991, 40.518258301999865], [-74.22418327999995, 40.51823302699989], [-74.22398999699992, 40.518212367999894], [-74.22379595899992, 40.518196345999876], [-74.22365064300001, 40.51821893699983], [-74.22350680499993, 40.518246492999864], [-74.2233647369999, 40.518278959999904], [-74.22322472599994, 40.51831627099988], [-74.22308705699992, 40.518358350999904], [-74.22295200699995, 40.51840511399991], [-74.22281984999994, 40.51845646599994], [-74.22269085399991, 40.518512303999934], [-74.22013810199992, 40.5196218829999], [-74.21802828299994, 40.520663726999935], [-74.21760570099995, 40.520871687999865], [-74.21735501199993, 40.5209300489999], [-74.21450845999989, 40.52115497999993], [-74.21354593499994, 40.521235714999925], [-74.2136147579999, 40.52153163699993], [-74.21381535699993, 40.52249465099986], [-74.21390912599999, 40.523014630999945], [-74.21398779899988, 40.52345242299989], [-74.21409806799993, 40.52409719499991], [-74.2135190009999, 40.524148838999885], [-74.21229294499989, 40.524276852999876], [-74.21201514099994, 40.52431623199986], [-74.21142518399989, 40.52441410199989], [-74.21028201899998, 40.52472106699988], [-74.2101209019999, 40.52479737599988], [-74.20997053199989, 40.52488777599995], [-74.20983404399989, 40.52499076799997], [-74.20983398499993, 40.524990811999864], [-74.20983392599999, 40.5249908669999], [-74.20971385199991, 40.5251045449999], [-74.20961205799995, 40.52522663499995], [-74.20953726399988, 40.52526850299993], [-74.20945757499997, 40.52530473499994], [-74.20937372099999, 40.525334998999874], [-74.20928646399996, 40.52535902099987], [-74.20919660199999, 40.525376579999865], [-74.209104955, 40.52538751599993], [-74.20901235799994, 40.525391729999946], [-74.2089196559999, 40.525389182999895], [-74.20882769699993, 40.52537989899983], [-74.20873731700001, 40.52536396199985], [-74.20864934299995, 40.525341516999916], [-74.20856457599997, 40.525312769999886], [-74.208441382, 40.52528672099987], [-74.20831655199999, 40.52526569499987], [-74.20819043499995, 40.52524975299988], [-74.20806338799994, 40.525238938999905], [-74.20793576699992, 40.52523328199992], [-74.20780793299994, 40.52523279999989], [-74.20768024599988, 40.52523749299995], [-74.20755306399994, 40.52524734899988], [-74.20742674699993, 40.525262338999916], [-74.20730164999993, 40.52528242199985], [-74.20674433099997, 40.52534553599984], [-74.20666645799994, 40.52535435799996], [-74.20546090199988, 40.525544336999936], [-74.20525952799987, 40.525576179999874], [-74.203687632, 40.525782940999896], [-74.20276973299998, 40.5259072179999], [-74.20217525999989, 40.52606646299992], [-74.20152661599995, 40.526265205999934], [-74.20142565199997, 40.526382032999905], [-74.20133258999991, 40.526502620999935], [-74.20124767199998, 40.52662665999985], [-74.20117111699992, 40.52675382699987], [-74.20103324199994, 40.5269194149999], [-74.200879328, 40.52707723199989], [-74.20071057499999, 40.52722595199986], [-74.2005284199999, 40.52736440399985], [-74.19984360499993, 40.52785744099988], [-74.19927554899992, 40.52819690099989], [-74.19909783799994, 40.52829964499994], [-74.19779445399999, 40.52903208399988], [-74.19608390199986, 40.52991174699987], [-74.19478532600002, 40.53051789799983], [-74.19453974799998, 40.530619741999885], [-74.1939845689999, 40.53087104699991], [-74.19313382999995, 40.53119491599988], [-74.19250928499991, 40.53149740799989], [-74.19174368799999, 40.53191669699986], [-74.19237403399998, 40.533040610999905], [-74.19267129299996, 40.533633488999904], [-74.19300900999994, 40.53432605099987], [-74.19329057000002, 40.53487778199998], [-74.19335436399993, 40.53499987599987], [-74.19341548699992, 40.53512049899993], [-74.19356025199987, 40.53540617199993], [-74.19377169299999, 40.53583384699993], [-74.19135323799996, 40.53666485899984], [-74.19030442599998, 40.53724645399989], [-74.189510226, 40.537788579999905], [-74.18903145199995, 40.53815934199989], [-74.18826921099989, 40.53886614199993], [-74.18770381799999, 40.5395269479999], [-74.18738120699997, 40.53989224299986], [-74.1870889679999, 40.54024712299989], [-74.18657647099997, 40.54085328399988], [-74.18559859999995, 40.54195759399991], [-74.18369101699987, 40.54417358399989], [-74.18285329599989, 40.545145824999885], [-74.18206740999993, 40.54604483999988], [-74.18128532999992, 40.54695757299989], [-74.18018524699995, 40.54837960899992], [-74.17991198599996, 40.548834452999905], [-74.1793348139999, 40.54988835199988], [-74.17874485199995, 40.5509958689999], [-74.17815548399993, 40.552112789999924], [-74.17746276899993, 40.553411145999846], [-74.17661991899996, 40.55499100699991], [-74.17611659899998, 40.555937540999935], [-74.17579913099998, 40.55651243799986], [-74.17559957599995, 40.55685071199989], [-74.1754729799999, 40.557065311999914], [-74.17512402999996, 40.557620037999925], [-74.1750629909999, 40.55771126399991], [-74.17475740499992, 40.55816798199986], [-74.17437344399991, 40.55870866599984], [-74.17358785199997, 40.55969842799995], [-74.17321541599998, 40.560077661999884], [-74.17245326199999, 40.56088825699991], [-74.17222993499993, 40.561135857999915], [-74.17185166499996, 40.56152092299991], [-74.17177723899994, 40.56149241599994], [-74.17146296099997, 40.56137542899988], [-74.17126370299995, 40.561323959999875], [-74.17106256099997, 40.561276946999875], [-74.17085970499996, 40.561234430999875], [-74.17065530999997, 40.561196445999926], [-74.17044954799991, 40.56116302699989], [-74.17024259599992, 40.561134199999856], [-74.17003462899996, 40.561109990999896], [-74.16982582400001, 40.56109042099991], [-74.16983437299987, 40.560949543999875], [-74.16983351999993, 40.56080851799988], [-74.16982326899996, 40.56066770699989], [-74.16980364499997, 40.560527475999876], [-74.16977469899997, 40.56038818799986], [-74.16973650599986, 40.560250200999896], [-74.16947719799997, 40.559126671999856], [-74.16931680999987, 40.55840978199988], [-74.1691669539999, 40.55770084699984], [-74.16900167899998, 40.55697216699986], [-74.16884272899996, 40.55626910699991], [-74.16868441299991, 40.555567584999864], [-74.16852396199995, 40.55485193799988], [-74.16836706799991, 40.554131592999944], [-74.16820548500002, 40.55343190299991], [-74.16810265799997, 40.55294619199988], [-74.16805222599993, 40.55271771199992], [-74.16789463099991, 40.55200100599988], [-74.16786573399993, 40.55188942699987], [-74.16776724799992, 40.551438072999865], [-74.16773525199996, 40.551291459999916], [-74.16757223299994, 40.55057473399989], [-74.16741722299999, 40.54988134599994], [-74.1672586319999, 40.54916666599995], [-74.16709947799988, 40.54844736699987], [-74.167103286, 40.54837591999994], [-74.16710008899994, 40.548304454999865], [-74.16708990499995, 40.54823337199991], [-74.16707279099998, 40.548163066999926], [-74.16704884299999, 40.54809393299987], [-74.16701819400001, 40.548026356999856], [-74.16698101499993, 40.547960714999924], [-74.16693751499993, 40.547897373999916], [-74.1668879359999, 40.54783668799997], [-74.16683255399994, 40.547778995999906], [-74.16623327299993, 40.54734247899993], [-74.16619699799993, 40.54711041099993], [-74.16574238499992, 40.545397704999914], [-74.16548821099998, 40.544652541999874], [-74.16540080799992, 40.54443272299989], [-74.16526055199988, 40.54423960899985], [-74.16478748999995, 40.543802109999916], [-74.16423140999989, 40.54330115899992], [-74.16359221499997, 40.54264214599987], [-74.16252750299994, 40.5415027069999], [-74.16102399199994, 40.539897758999885], [-74.15955749199995, 40.53833428299992], [-74.15914106399993, 40.53789864499992], [-74.15853613800002, 40.537252883999905], [-74.1584155779999, 40.537106678999876], [-74.1582881369999, 40.53696391199987], [-74.15815398399998, 40.536824769999896], [-74.15801329399991, 40.53668943899991], [-74.15786625499994, 40.53655809499985], [-74.15771305999992, 40.53643091299995], [-74.15755391099991, 40.53630806099992], [-74.15738901899991, 40.53618969999996], [-74.15721859999992, 40.53607598699992], [-74.15704288099992, 40.535967071999885], [-74.15593326499996, 40.53535375799987], [-74.15404693799991, 40.534308456999916], [-74.15397419799994, 40.53426814799993], [-74.15415844299997, 40.53407479199993], [-74.15438619499999, 40.533837150999865], [-74.15447193999992, 40.53374918899989], [-74.15502905599998, 40.53316020399993], [-74.15553157399994, 40.53263083299993], [-74.15602014099989, 40.53211509399988], [-74.1566887699999, 40.53142883599987], [-74.15679305099997, 40.531341828999906], [-74.15690813799995, 40.531262027999915], [-74.15703269699993, 40.53119055399988], [-74.15716510199995, 40.53112831799989], [-74.15730358599997, 40.53107601399994], [-74.15851066999988, 40.53056568999989], [-74.16037397400001, 40.529783172999906], [-74.16122606799999, 40.5294244229999], [-74.16134961699994, 40.5293734239999], [-74.16085825899998, 40.52871854699992], [-74.16042481199997, 40.528118481999854], [-74.16005732699996, 40.527635041999886]]]}}, {\&quot;id\&quot;: \&quot;84\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 85, \&quot;Shape_Leng\&quot;: 0.0574751473562, \&quot;Shape_Area\&quot;: 0.000143637804933, \&quot;zone\&quot;: \&quot;Erasmus\&quot;, \&quot;LocationID\&quot;: 85, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.94715896299984, 40.65559378699993], [-73.94703257599998, 40.65433871399988], [-73.94606690599983, 40.65441026199991], [-73.94590468799987, 40.65285464999991], [-73.94570606199984, 40.65100678399988], [-73.94667414499985, 40.65094811899995], [-73.94647882399988, 40.64910075099988], [-73.94625972599981, 40.647006214999905], [-73.94607216799986, 40.64531181199988], [-73.94598813699993, 40.64453379699989], [-73.94586879199989, 40.64342374399988], [-73.94685570699994, 40.64336214099992], [-73.94778994699976, 40.643305735999924], [-73.94754496799999, 40.64100547599989], [-73.94744296799982, 40.6400476649999], [-73.94841343400003, 40.639987463999944], [-73.94826499600005, 40.63860718999994], [-73.94923295699995, 40.63854767299993], [-73.95017361500003, 40.63851059699987], [-73.95116311199983, 40.63844818299984], [-73.95213852299987, 40.63844349599993], [-73.95307699899985, 40.638446260999864], [-73.9536000469999, 40.63842234699991], [-73.95374853799996, 40.63858633799993], [-73.95404358599993, 40.6388775489999], [-73.95427358399985, 40.63911553899988], [-73.95476763299989, 40.63962444699996], [-73.95563820699984, 40.64050392599988], [-73.95571599999984, 40.64058252599991], [-73.95707031, 40.64196067099995], [-73.95746359899987, 40.64237166999987], [-73.95763644599988, 40.64268949899989], [-73.95789394399986, 40.64401556199989], [-73.95791873699986, 40.64414326499991], [-73.95797764699991, 40.64457625599989], [-73.95802176499988, 40.6450699619999], [-73.95803664499991, 40.64530249999989], [-73.95810672200003, 40.64651800899988], [-73.95814068499989, 40.647503403999934], [-73.95815003599986, 40.64776767399996], [-73.95825517200004, 40.64853244899996], [-73.9587078989999, 40.65038727299989], [-73.9558251839998, 40.6505298079999], [-73.95480071999985, 40.65056930299989], [-73.95295084000004, 40.650655559999954], [-73.95246901399994, 40.650669454999914], [-73.95137845899984, 40.65071574499988], [-73.94957113100006, 40.65080789999991], [-73.94966851199989, 40.651697519999914], [-73.94976875000005, 40.65264232299987], [-73.94993008899999, 40.65415032699993], [-73.9500666489999, 40.65542299699989], [-73.94715896299984, 40.65559378699993]]]}}, {\&quot;id\&quot;: \&quot;85\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 86, \&quot;Shape_Leng\&quot;: 0.134245282582, \&quot;Shape_Area\&quot;: 0.000623278815249, \&quot;zone\&quot;: \&quot;Far Rockaway\&quot;, \&quot;LocationID\&quot;: 86, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76669071688973, 40.61422662157113], [-73.76663280474156, 40.614188090292245], [-73.76659603795996, 40.61415620580289], [-73.76655752621322, 40.61412554090954], [-73.76648154954675, 40.61407197232676], [-73.76640026141413, 40.614023141025854], [-73.76631416907505, 40.613979351720964], [-73.76622123270072, 40.613948266132155], [-73.76612561446998, 40.613922330741474], [-73.766027805102, 40.613901678650315], [-73.76600277923055, 40.61389096579561], [-73.76597356286003, 40.61388206310417], [-73.76594390100304, 40.61387557276066], [-73.76590929681872, 40.613870072495615], [-73.76577937364263, 40.61385568693899], [-73.765713840849, 40.61384767414089], [-73.76554735771236, 40.61382929695943], [-73.7654573313066, 40.61381699220672], [-73.7653331716059, 40.61379659421426], [-73.7653079415949, 40.61379371497338], [-73.76524354206231, 40.61378942287313], [-73.7652255416092, 40.61378698222855], [-73.7652096838288, 40.613783626388305], [-73.76520308506144, 40.61378166738938], [-73.76519677155784, 40.613779232518894], [-73.76519073170368, 40.613776311198635], [-73.7651849533732, 40.61377291345589], [-73.76517409928843, 40.613764625041625], [-73.76516400829198, 40.61375420268657], [-73.76514898195599, 40.613732785002355], [-73.7651244912455, 40.61368755610694], [-73.76511369195244, 40.61367026208242], [-73.76508378272462, 40.61362660576178], [-73.76506031696873, 40.61358912366839], [-73.76504104839242, 40.61355425272034], [-73.76502554335005, 40.6135211527105], [-73.7650205004746, 40.61350668008154], [-73.76501724522896, 40.61349135519837], [-73.76501580220098, 40.61347518749322], [-73.76501614607245, 40.61345818696599], [-73.7650182993051, 40.61344034243834], [-73.76502224207296, 40.613421664926456], [-73.76502798219816, 40.613402117757175], [-73.76503554665682, 40.613381655919895], [-73.76503813998191, 40.61337674305695], [-73.76504185479139, 40.61337205044227], [-73.765046739582, 40.61336754031307], [-73.76505287604441, 40.613363112821354], [-73.76506594816784, 40.613355791192376], [-73.76509874740034, 40.613340234254515], [-73.76511217652426, 40.61333197618983], [-73.76511719002606, 40.61332774575997], [-73.76512108018139, 40.613323386717155], [-73.76512389686395, 40.613318844883956], [-73.76512568643251, 40.6133140654055], [-73.76513733345502, 40.61326178699131], [-73.76514592812889, 40.6132066746086], [-73.76515155831194, 40.613148314136886], [-73.76515223873422, 40.613132682677545], [-73.76515429478773, 40.61308589621872], [-73.76515707653228, 40.6129871130944], [-73.76515561199474, 40.612956619226765], [-73.76515206853225, 40.61292936213759], [-73.76514573378662, 40.61289949610398], [-73.76512924250447, 40.6128342651111], [-73.7651237245843, 40.6128072378575], [-73.76511218412732, 40.612738782987726], [-73.76510837815503, 40.61269529861784], [-73.76510843477006, 40.612645409277974], [-73.76511130585179, 40.61257854171328], [-73.7651175619944, 40.612523271428145], [-73.7651187061248, 40.61250393114174], [-73.76511737315961, 40.61248297248403], [-73.76511291010738, 40.61246510722905], [-73.76511124503968, 40.61246131213068], [-73.76510948711574, 40.61245729185027], [-73.7651052819417, 40.61245023177142], [-73.76510029414598, 40.6124439266564], [-73.76509451138658, 40.61243838569407], [-73.76504425370344, 40.6124018566937], [-73.76499541692499, 40.6123608104616], [-73.76499016553302, 40.61235551433581], [-73.76498561413864, 40.61234964166405], [-73.764981866706, 40.61234332199183], [-73.76497900646008, 40.61233670609842], [-73.76497772419994, 40.61233164257704], [-73.76497737641814, 40.61232627472219], [-73.76497795224616, 40.61232069247531], [-73.76497946113022, 40.6123150225078], [-73.76498505323232, 40.61230396576788], [-73.764988994485, 40.612298940401224], [-73.76499352404916, 40.61229446523158], [-73.76500647572327, 40.61228427056625], [-73.76503932155175, 40.612261887413986], [-73.7650533511491, 40.61225116421339], [-73.76508677691687, 40.612221831265], [-73.76509205464984, 40.61221639248281], [-73.76509631619642, 40.612210863838186], [-73.7650995138344, 40.612205313250726], [-73.76510161275102, 40.612199825754374], [-73.76510385766348, 40.612186645935196], [-73.76510355561396, 40.61217177723917], [-73.765093651216, 40.61211864393701], [-73.76509191260185, 40.612082088957], [-73.76508948257325, 40.612067287279444], [-73.76508687389499, 40.61205996157751], [-73.76508330393696, 40.612053623675365], [-73.76507871435258, 40.61204817461116], [-73.76507602880078, 40.61204576524109], [-73.76507307015397, 40.612043561709164], [-73.76505961679173, 40.612035230610466], [-73.76504367100014, 40.61202689609064], [-73.76498676806158, 40.6120016362585], [-73.7648851174193, 40.61195567304717], [-73.7648108217638, 40.61192368792771], [-73.764737825289, 40.61189484710063], [-73.76466588211673, 40.61186905289796], [-73.76459483901746, 40.611846242016604], [-73.76455265822071, 40.611834944713], [-73.76450473059718, 40.61182484116257], [-73.76445501191374, 40.611816328133095], [-73.76435372713276, 40.61180098289912], [-73.7641892443344, 40.611773359535405], [-73.76413999058126, 40.611767360433994], [-73.76409546481764, 40.611764134414926], [-73.76399822638167, 40.61176085527847], [-73.76384171496271, 40.61175768850187], [-73.76372229932802, 40.611756857410356], [-73.7636707130079, 40.61175539202343], [-73.76366337770511, 40.61175477366764], [-73.76365590117706, 40.61175362311462], [-73.76364027088391, 40.61174962906869], [-73.76362356072626, 40.61174347920745], [-73.76357485503232, 40.611722721134804], [-73.76355883664321, 40.61171788863157], [-73.76354389811969, 40.611715273926], [-73.7635366099537, 40.61171481699], [-73.76352858551707, 40.61171493551054], [-73.7634931119177, 40.6117183660714], [-73.76348472026018, 40.611718700113975], [-73.76347721809432, 40.6117184590145], [-73.76342545508612, 40.61171382416491], [-73.7633741106811, 40.61170750363372], [-73.76332337442068, 40.611699546897825], [-73.7632734247846, 40.611689961362096], [-73.76323678796824, 40.61168139449969], [-73.76322255859913, 40.61167742690416], [-73.76319855273074, 40.611670733898855], [-73.7631892622385, 40.61166777076174], [-73.7631581383879, 40.61165782691472], [-73.76311389262129, 40.6116421392386], [-73.763026155521, 40.61160862050955], [-73.76294809170496, 40.61157639203976], [-73.76289698451858, 40.6115534580457], [-73.76275848988121, 40.611488523961604], [-73.76271397442427, 40.6114692958422], [-73.76266773125485, 40.611450776138646], [-73.76261974879229, 40.6114329450566], [-73.76256997841372, 40.61141581405303], [-73.76251873787662, 40.61140065131079], [-73.76246108507048, 40.61138712328248], [-73.76239615019814, 40.611374840497376], [-73.7623044835184, 40.611360143582466], [-73.76229944090419, 40.61135920604586], [-73.76172413788876, 40.61184724275769], [-73.76101512745583, 40.611359712588005], [-73.76023635756965, 40.610820864950284], [-73.76076730398712, 40.610184642971014], [-73.76087049521189, 40.61019812235988], [-73.76103107637614, 40.61001265160484], [-73.76106712691544, 40.6099710131896], [-73.76117344842932, 40.609839344137896], [-73.76178242960594, 40.60915167005445], [-73.76155051905889, 40.60903136580077], [-73.76154422819783, 40.60903918643414], [-73.761468385922, 40.60913355798008], [-73.76142052284622, 40.609215307072176], [-73.76140457135281, 40.60924480256101], [-73.7612613099961, 40.609380924608374], [-73.76110660758368, 40.60955759317357], [-73.76084686113951, 40.60985879158432], [-73.760668143153, 40.61006739366464], [-73.76056913844502, 40.61018295125937], [-73.76032133549326, 40.61047700509601], [-73.75998446974822, 40.61087937784668], [-73.7594911983337, 40.61081579591091], [-73.75973571099013, 40.61015545765216], [-73.7597209903858, 40.61015159808286], [-73.75970578731508, 40.610149046396195], [-73.75968243621176, 40.61014773915803], [-73.75965913710012, 40.61014950482124], [-73.7596365810579, 40.610154291014275], [-73.75961543712306, 40.61016195577321], [-73.75959633244965, 40.61017227175256], [-73.75957983370535, 40.610184932968565], [-73.75956643026325, 40.61019956387472], [-73.75955651968803, 40.61021573050111], [-73.75950902919092, 40.61029655950143], [-73.7595011327095, 40.61030982921634], [-73.759490367694, 40.61032187057974], [-73.75947705298303, 40.61033232694855], [-73.75946158293257, 40.61034088862442], [-73.75944441573677, 40.610347302026], [-73.75936292845843, 40.6103609209809], [-73.75928012157641, 40.61036863836023], [-73.75919672932062, 40.610370385735784], [-73.75911349111223, 40.61036614761372], [-73.7591044220478, 40.61036436368268], [-73.75907022522372, 40.61035787076551], [-73.75904511473067, 40.610351667614275], [-73.75900812829903, 40.61034226101927], [-73.75898721665443, 40.6103380203889], [-73.75895697014224, 40.610333895710504], [-73.75892030237395, 40.61033419709067], [-73.75888924674067, 40.61033827495676], [-73.75885114200875, 40.610337348491576], [-73.75883136120025, 40.6103309664966], [-73.75880039730679, 40.61031920427265], [-73.75878071065507, 40.61031304863154], [-73.75874562442633, 40.61030748152985], [-73.75871310860462, 40.61030337899627], [-73.75868333119982, 40.610299993030964], [-73.75864883787516, 40.61029739978981], [-73.75861193268273, 40.61029479158901], [-73.75858266022281, 40.610292622085076], [-73.75854665481931, 40.61028963864403], [-73.75850903056701, 40.610286731869614], [-73.75848022846047, 40.61028488833536], [-73.75844677519656, 40.610282098528906], [-73.75841702630294, 40.61028080248619], [-73.75838338936416, 40.610282784858406], [-73.75834929653381, 40.61028694565507], [-73.75832147772391, 40.61029110974947], [-73.75829926069888, 40.61029509798366], [-73.75829550033363, 40.61029577460223], [-73.75829125477554, 40.6102967653235], [-73.7582577507584, 40.610304592208756], [-73.7582269006985, 40.61031053409526], [-73.75819491433819, 40.610313628260144], [-73.75815889909484, 40.61031336250973], [-73.75812105252575, 40.61030962737675], [-73.75808825488171, 40.61030541534655], [-73.75805437268517, 40.61030330904905], [-73.75802880460462, 40.61030257120322], [-73.75800190081794, 40.61030227080735], [-73.75797402450189, 40.61030240091894], [-73.75794434716126, 40.61030459086045], [-73.75791022597653, 40.61030643654317], [-73.75788559499932, 40.61030485360956], [-73.75784908810411, 40.61030013848025], [-73.75781820510514, 40.61029551761364], [-73.7577894051914, 40.6102929525283], [-73.75775408741215, 40.610289672755385], [-73.75772433905365, 40.61028798954109], [-73.75768786959213, 40.61028604839457], [-73.75765998908317, 40.610284367928585], [-73.75762074385337, 40.61028195266314], [-73.7575877699896, 40.61027748865654], [-73.75755753440913, 40.61027347185674], [-73.75752779240311, 40.61027028502671], [-73.75749483565947, 40.610270430606604], [-73.75747534560298, 40.610272037473244], [-73.75743848238733, 40.6102776156533], [-73.75740623638153, 40.61028059161272], [-73.75738300800195, 40.61027983058391], [-73.75737380421911, 40.610276298898036], [-73.75736975048056, 40.61027011285435], [-73.75735905593557, 40.61027006397637], [-73.7573383590768, 40.61028804814461], [-73.75731666566746, 40.61029105506836], [-73.75729976071221, 40.610283238964485], [-73.75729703527199, 40.61028198159578], [-73.7572956814805, 40.61028086215243], [-73.7572741228047, 40.610263076415215], [-73.75724254710155, 40.610260596467185], [-73.75721192022327, 40.61026335951094], [-73.75718049765929, 40.61026748941501], [-73.75714700339951, 40.610259791363504], [-73.75711602497977, 40.61024890969251], [-73.75708351664257, 40.61024598695955], [-73.75704800614409, 40.61024681221035], [-73.75701247800151, 40.61024904214853], [-73.756978170497, 40.610253580366674], [-73.75695101212871, 40.61025462143374], [-73.7569314958743, 40.61025376111171], [-73.75689086851851, 40.61025427846316], [-73.75686929194647, 40.61025447607804], [-73.75683630817768, 40.610252326256266], [-73.75681050712097, 40.61024754348165], [-73.75677843192791, 40.61024272983445], [-73.75674660315728, 40.61024153768482], [-73.75672036013536, 40.61023799618673], [-73.75668271214545, 40.61023174018212], [-73.75665225558224, 40.6102267948972], [-73.75662364865083, 40.61022027689952], [-73.75659942149335, 40.610205024296256], [-73.75658046085303, 40.61018140904115], [-73.75656956469595, 40.610165518230076], [-73.75655062478583, 40.6101552125715], [-73.75652563163669, 40.61017538498005], [-73.75649716738332, 40.610187977691176], [-73.7564735551872, 40.61019512289571], [-73.75643362895231, 40.61019833310154], [-73.75640467161288, 40.61019050070696], [-73.75637780586109, 40.610199007545866], [-73.7563521235751, 40.61021018261843], [-73.75632916761667, 40.61021254721898], [-73.75629508193786, 40.61021791464015], [-73.75626657727715, 40.61022204997856], [-73.75624220788647, 40.61022644755194], [-73.75621022387813, 40.610229063542874], [-73.7561919008085, 40.61023128482026], [-73.7561835188916, 40.61023230287607], [-73.75614528566263, 40.610237633477404], [-73.75611605822041, 40.61024242479879], [-73.756082024449, 40.610252889355536], [-73.75606303287732, 40.61025685585744], [-73.756039521865, 40.61025247464753], [-73.7560249513726, 40.610239791884354], [-73.75600650505237, 40.61022075972843], [-73.75598972222198, 40.61021229535099], [-73.75598031214558, 40.61021320315286], [-73.75597348586042, 40.61021887093002], [-73.75597162609579, 40.61023638270558], [-73.7559674738124, 40.61025676995049], [-73.75595506330369, 40.61028372340788], [-73.75594948952418, 40.61029241155394], [-73.75591508294892, 40.61030472027324], [-73.75588061031844, 40.61031573233037], [-73.7558553156395, 40.61031766081564], [-73.75582482776083, 40.61031160686896], [-73.75580362404574, 40.610300251060885], [-73.75577995993108, 40.61028309952759], [-73.75576265399067, 40.61026566564261], [-73.75574522332289, 40.61024663560284], [-73.755727601822, 40.61022815582459], [-73.75571074035422, 40.61020220299001], [-73.75569710325406, 40.61017980494853], [-73.75567967220253, 40.61015794783541], [-73.75566930431309, 40.61013676328769], [-73.75566121883598, 40.6101116845066], [-73.75564946697222, 40.61008766928267], [-73.75563040563364, 40.61007827222955], [-73.7556083701559, 40.61007791963748], [-73.75559880868329, 40.61008163605521], [-73.75559496353753, 40.610099161194164], [-73.75559789661662, 40.610104877175395], [-73.75560182951712, 40.61010859598401], [-73.75561374660208, 40.61011984094885], [-73.75562259040024, 40.61012818145094], [-73.75580892838548, 40.61036528895029], [-73.75587251467283, 40.61037425785732], [-73.75587637625526, 40.610374824937836], [-73.7558756121628, 40.61038028930362], [-73.75587412912144, 40.61038518505482], [-73.75569925964342, 40.610365686657296], [-73.75569746400105, 40.61035580428942], [-73.75569974469146, 40.61035262071335], [-73.75570173151115, 40.610352130388634], [-73.75571634332071, 40.610353511900286], [-73.75575727259817, 40.6103606771733], [-73.75571167394627, 40.61030222568417], [-73.75556369084146, 40.61011842794625], [-73.75550218966305, 40.610120801540084], [-73.75545094849186, 40.61011499913182], [-73.75539915499955, 40.610115783533786], [-73.75534825676537, 40.610123132822736], [-73.75529967634799, 40.61013684159296], [-73.75527347337746, 40.6101494480493], [-73.755244821347, 40.61015844226332], [-73.75521456958829, 40.6101635576193], [-73.75518361485531, 40.61016464248254], [-73.75515287474015, 40.61016166469454], [-73.75512326047287, 40.610154712525734], [-73.75509564991016, 40.610143992059655], [-73.75507086151059, 40.61012982108318], [-73.75505193518073, 40.61012716504604], [-73.75503270124402, 40.610126678385924], [-73.75501358543141, 40.610128371874794], [-73.75499501085996, 40.61013220802829], [-73.75497738866586, 40.61013810193554], [-73.75496110890589, 40.61014592313847], [-73.75494580155386, 40.610156060557486], [-73.7548940656952, 40.610192240178726], [-73.754847762547, 40.61023246843121], [-73.75480743435165, 40.61027627422274], [-73.75477355338558, 40.61032314456516], [-73.75474651642602, 40.610372530581905], [-73.75473447491667, 40.61040110303178], [-73.75473218890687, 40.61040730222276], [-73.7534583619849, 40.61051986270308], [-73.75008771088383, 40.61164055391355], [-73.74912000690117, 40.6117943267718], [-73.74821585891324, 40.61201107779471], [-73.74799307308612, 40.61231015798392], [-73.74761418914572, 40.61199801094233], [-73.74721567892574, 40.612178838825315], [-73.74694207111293, 40.611774999155706], [-73.74685539012165, 40.611574100529694], [-73.7457615018933, 40.611991654374336], [-73.7456211250613, 40.61174249247841], [-73.74536751706268, 40.611203552050156], [-73.74456658083739, 40.61011745296871], [-73.74386981824344, 40.60889248424052], [-73.74338029298465, 40.60817868098387], [-73.74307247919678, 40.60788609719336], [-73.74332648806525, 40.607538062927716], [-73.74314655207264, 40.60725986604785], [-73.74121366909178, 40.60551892016551], [-73.74029138988146, 40.60459823188922], [-73.73922512581528, 40.60414236691341], [-73.73815143112287, 40.60271044008338], [-73.73799702694568, 40.601601233828404], [-73.73830554702238, 40.59824293796482], [-73.73830871892699, 40.59820837383979], [-73.73828313185064, 40.59816556815509], [-73.73807514912781, 40.59781762609574], [-73.73808925304178, 40.59768829704553], [-73.73825953089265, 40.59762564118727], [-73.73827146702239, 40.59763212570347], [-73.73828458902938, 40.597637103992284], [-73.73829857253124, 40.59764045298744], [-73.73831307184743, 40.59764208989999], [-73.73832772854637, 40.59764197426433], [-73.73834218030606, 40.59764010893923], [-73.73835606987075, 40.59763654003658], [-73.73836905388242, 40.59763135578154], [-73.73838081136934, 40.59762468433206], [-73.73839691743511, 40.59761090433321], [-73.73840997547153, 40.59759536286517], [-73.73841965958415, 40.597578447804516], [-73.73842572808496, 40.59756058130902], [-73.73842802952184, 40.59754220928152], [-73.73843000496976, 40.59752114632383], [-73.7384365132318, 40.59750062061242], [-73.7384473758534, 40.59748119494373], [-73.73846229498801, 40.597463401951494], [-73.73852716400212, 40.597415479198546], [-73.73852725571271, 40.59739205956135], [-73.73864871908607, 40.597344265996654], [-73.73863472627416, 40.5973131923762], [-73.73862744479486, 40.5972808113883], [-73.73857716826399, 40.59726344429299], [-73.73857382102462, 40.59726837127244], [-73.73855884632226, 40.597263214810766], [-73.73850355568756, 40.59736319785864], [-73.73848900400793, 40.597358894240195], [-73.73850854977917, 40.59732414727481], [-73.73852423807804, 40.5972962589159], [-73.73854295052871, 40.5972629936935], [-73.73856037839491, 40.597232013669405], [-73.73856611221647, 40.59722181928265], [-73.73858809179461, 40.5971827453487], [-73.73861389690552, 40.5971368706904], [-73.73862486165704, 40.59711737906302], [-73.73864407374766, 40.59708322671648], [-73.73865537843393, 40.59706313023849], [-73.73865954991007, 40.59705571446355], [-73.73868423105195, 40.59701183770795], [-73.73869078548499, 40.59700018716796], [-73.7387154873913, 40.59695627309346], [-73.73871968076894, 40.596948817326414], [-73.73873823189528, 40.596955440413964], [-73.73857461617719, 40.5972446315777], [-73.73858805052276, 40.59724807773863], [-73.73858466737627, 40.59725319461563], [-73.73862641254613, 40.59726591462481], [-73.73862781419399, 40.59724144290196], [-73.73863304587005, 40.59721727466488], [-73.738760045504, 40.596994466345315], [-73.73876263070068, 40.59698988947153], [-73.73876621138677, 40.59698572037735], [-73.73877068055083, 40.59698208365872], [-73.73877590462943, 40.59697908800116], [-73.7387817274975, 40.596976822931595], [-73.73878797513527, 40.59697535614313], [-73.73879446082829, 40.59697473147134], [-73.73880099074813, 40.59697496758506], [-73.7388073697443, 40.59697605742797], [-73.7388134071765, 40.59697796842924], [-73.73881892261252, 40.596980643477615], [-73.73882375122074, 40.596984002627835], [-73.73882774869459, 40.59698794548945], [-73.73883079556741, 40.59699235422792], [-73.73883280078138, 40.596997097085264], [-73.738882685792, 40.597046439024254], [-73.73893943794074, 40.59709126249315], [-73.73900235793, 40.59713101516901], [-73.73907067045685, 40.59716520721108], [-73.7391435337668, 40.597193417297234], [-73.73922005002483, 40.597215297816014], [-73.73929927638089, 40.59723057914991], [-73.7393802365885, 40.5972390729983], [-73.73946193303371, 40.59724067469769], [-73.73954335902998, 40.59723536451154], [-73.73962897165448, 40.59721149558431], [-73.73971099873867, 40.597181181110095], [-73.73978860759591, 40.59714472882414], [-73.7398610103941, 40.597102508768735], [-73.73992747215387, 40.597054949536634], [-73.73998731821021, 40.59700253391936], [-73.74003994106113, 40.59694579400635], [-73.74008480653316, 40.59688530578333], [-73.74010543603896, 40.59684794614482], [-73.74011797914022, 40.596808555742726], [-73.74012211431592, 40.596768144328436], [-73.74011773557845, 40.59672774782453], [-73.74010495518917, 40.596688401769434], [-73.74008410077897, 40.59665111477248], [-73.7400627513751, 40.596612011334976], [-73.74003427764893, 40.59657564054258], [-73.73999926623331, 40.59654275171455], [-73.73995843844962, 40.59651402243284], [-73.73991263544504, 40.596490044582794], [-73.7398628008646, 40.59647131215955], [-73.73980996140897, 40.59645821109084], [-73.73980543695005, 40.59645411751473], [-73.73980187243376, 40.596449505667046], [-73.73979936788847, 40.59644450496627], [-73.73979799359657, 40.59643925574317], [-73.73979778812388, 40.59643390530248], [-73.739798757236, 40.59642860378924], [-73.73990407814098, 40.596373376738526], [-73.74003703042294, 40.596281233554514], [-73.74006954777121, 40.59623570144109], [-73.74009714262667, 40.59620864729175], [-73.74011818218939, 40.59620376463578], [-73.7401537610051, 40.59620261274076], [-73.74025075069052, 40.596210227619046], [-73.74030905351357, 40.59618693954036], [-73.74039153834977, 40.59618219567315], [-73.74039294483362, 40.59623643247847], [-73.7403475207975, 40.59627454091755], [-73.74034900829132, 40.596307823429576], [-73.74033279524065, 40.596318879119906], [-73.74028393005828, 40.596409979862386], [-73.74028204054135, 40.596480232284165], [-73.7403601274953, 40.59677499554009], [-73.74038232489124, 40.59679939856366], [-73.74040960334438, 40.59682059858816], [-73.74044118144295, 40.59683798831977], [-73.74047615460643, 40.59685106961344], [-73.74051352099603, 40.59685946774307], [-73.7405522102172, 40.596862942136205], [-73.74055955620689, 40.596861262801525], [-73.74056715739592, 40.59686048575863], [-73.74057482428888, 40.59686063037905], [-73.74058236575246, 40.59686169305737], [-73.74058959378046, 40.5968636473014], [-73.74059632818015, 40.59686644439246], [-73.74060240106479, 40.59687001459978], [-73.74060766103945, 40.59687426891931], [-73.74061197697394, 40.59687910129197], [-73.74061834076392, 40.59689615557484], [-73.74062102518255, 40.596913767850374], [-73.74061996040308, 40.59693148000702], [-73.74061517411833, 40.596948831335396], [-73.74060679082126, 40.59696537051088], [-73.74060921413064, 40.5969730997288], [-73.74061334857008, 40.59698039499648], [-73.74061907043597, 40.596987038036445], [-73.74062620852796, 40.596992830086], [-73.7406345492715, 40.59699759784441], [-73.7406438431081, 40.597001198658276], [-73.74068530132834, 40.59699944738718], [-73.74072577925703, 40.59699239499603], [-73.74076411879872, 40.59698024325797], [-73.74079922303956, 40.59696333984049], [-73.74080307578484, 40.596959059846064], [-73.74080769951492, 40.59695524918273], [-73.74081299715759, 40.5969519878522], [-73.74081885749266, 40.59694934432396], [-73.74082515748691, 40.596947374096615], [-73.7408579579203, 40.59695348046154], [-73.7408916351951, 40.596955329519346], [-73.74092524512245, 40.596952869428755], [-73.74095784540083, 40.59694616916218], [-73.74098852203713, 40.59693541657071], [-73.74099306854177, 40.59693438287048], [-73.74099733176617, 40.59693279586703], [-73.74100119672039, 40.596930698365874], [-73.74100455915755, 40.59692814694157], [-73.74100732838409, 40.59692521041234], [-73.74100942970746, 40.596921967983796], [-73.74101080644976, 40.59691850711215], [-73.74101142147724, 40.59691492114546], [-73.74101125820096, 40.5969113068061], [-73.7410103210251, 40.59690776158178], [-73.74100863522756, 40.59690438109566], [-73.74100624627896, 40.59690125652778], [-73.74100321861472, 40.596898472155324], [-73.74100179815535, 40.59690098534124], [-73.74099985226756, 40.596903284989516], [-73.74099743448241, 40.59690530783691], [-73.74099461131338, 40.5969069982345], [-73.740991460426, 40.5969083096797], [-73.74098806850112, 40.5969092060944], [-73.74098452885066, 40.596909662818334], [-73.74098093885092, 40.59690966728692], [-73.74097739726272, 40.59690921937726], [-73.74097400151531, 40.59690833141136], [-73.74097084502581, 40.59690702781715], [-73.74096836219971, 40.59690780998126], [-73.74096574706559, 40.596908278886644], [-73.74096306716235, 40.596908422423475], [-73.74096039170094, 40.5969082368846], [-73.74095778977808, 40.596907727061904], [-73.74095532859113, 40.59690690612187], [-73.74095307170278, 40.59690579526628], [-73.74095107739952, 40.59690442318411], [-73.74094939718606, 40.596902825310785], [-73.74094807445584, 40.59690104291308], [-73.7409471433695, 40.59689912202301], [-73.74094662797329, 40.59689711224983], [-73.74095619595559, 40.596879774582014], [-73.74096938067086, 40.59686387549446], [-73.74098582174452, 40.59684984955056], [-73.74100506979715, 40.59683808011593], [-73.74104337975957, 40.596828361748585], [-73.74108315342914, 40.5968230665761], [-73.74112351700808, 40.59682231092948], [-73.7411635837387, 40.5968261114096], [-73.74118553063452, 40.59682842558906], [-73.74120768649566, 40.59682840021409], [-73.7412296241696, 40.596826035773596], [-73.74125092071091, 40.59682137785288], [-73.7412518896136, 40.5968182426191], [-73.74125351590618, 40.596815269672824], [-73.7412557561001, 40.5968125385127], [-73.74125855029123, 40.59681012217198], [-73.74126182376057, 40.596808085265245], [-73.74126548897357, 40.59680648226088], [-73.74126944791945, 40.59680535602441], [-73.74127359473346, 40.59680473667221], [-73.74127781852663, 40.59680464076604], [-73.74128200635205, 40.59680507087047], [-73.74128604622405, 40.596806015484376], [-73.7412898301138, 40.59680744934806], [-73.74129325683718, 40.5968093341191], [-73.74129623476148, 40.59681161939718], [-73.7413031074393, 40.59681721848292], [-73.74131109804405, 40.59682187629571], [-73.7413199874715, 40.5968254651174], [-73.7413295319721, 40.59682788654153], [-73.74133946983298, 40.59682907417223], [-73.74134952855663, 40.59682899544437], [-73.741357765473, 40.59683365187186], [-73.74136495054117, 40.59683922929574], [-73.74137090842818, 40.59684559161302], [-73.74137549374574, 40.59685258356743], [-73.74137859460036, 40.59686003453777], [-73.74138013532291, 40.59686776270181], [-73.74138007831561, 40.59687557947273], [-73.74137842496869, 40.59688329410187], [-73.74139847117411, 40.59690473687481], [-73.74142192576541, 40.596924066747974], [-73.74142175588474, 40.596926193469066], [-73.74142207004247, 40.596928310628876], [-73.74142285881184, 40.59693035469747], [-73.74142409852432, 40.596932264337724], [-73.74142575197932, 40.59693398224683], [-73.74142776956123, 40.59693545687521], [-73.74143009072836, 40.59693664397304], [-73.74143264582878, 40.59693750791897], [-73.74143535819077, 40.59693802278842], [-73.74143814642423, 40.59693817313153], [-73.74144092686164, 40.596937954437045], [-73.74144361607023, 40.59693737326711], [-73.74144613335383, 40.596936447061154], [-73.74146607403786, 40.5969243241283], [-73.74148827777292, 40.59691475599329], [-73.74151218637357, 40.59690798319158], [-73.74153719879638, 40.59690417598596], [-73.74156268624876, 40.59690343008671], [-73.7415653811586, 40.596904102346244], [-73.74156818656417, 40.59690441667493], [-73.74157102127162, 40.59690436397548], [-73.74157380323898, 40.596903945773114], [-73.74157645195119, 40.59690317417132], [-73.74157889074901, 40.59690207150173], [-73.74158104904993, 40.596900669677765], [-73.74158286438781, 40.59689900927075], [-73.74158428422388, 40.59689713833607], [-73.7415852674651, 40.59689511102202], [-73.74158578565496, 40.59689298600293], [-73.74158582379607, 40.59689082478082], [-73.74158538078444, 40.59688868990544], [-73.7415973671053, 40.596866178110496], [-73.74161388139287, 40.59684539835504], [-73.7416345064164, 40.59682687563051], [-73.7416587210913, 40.596811077904945], [-73.74168591364314, 40.596798404300436], [-73.74171539706398, 40.5967891750093], [-73.74174642646953, 40.59678362320475], [-73.74177821791754, 40.59678188915041], [-73.74179629237203, 40.596767927614245], [-73.74181096661388, 40.59675181474797], [-73.74182180790893, 40.596734025712834], [-73.74182849655536, 40.596715085099284], [-73.74183083531219, 40.59669555145679], [-73.74182875521423, 40.59667600082241], [-73.74182451436532, 40.59665904436297], [-73.74181686745597, 40.596642796441266], [-73.74180600036239, 40.596627651996705], [-73.74179187067021, 40.596613720892826], [-73.74177502220874, 40.596601673530444], [-73.74175588115652, 40.59659181464368], [-73.74173493168095, 40.59658439361002], [-73.7417127036924, 40.59657959814215], [-73.7417037086474, 40.59658266372059], [-73.74169418510041, 40.59658459013184], [-73.74168437953736, 40.596585327517175], [-73.74167454574275, 40.596584856791765], [-73.74166493823267, 40.596583190138816], [-73.74165580566556, 40.59658037069413], [-73.7416473844081, 40.59657647142976], [-73.74163989241653, 40.59657159326545], [-73.74163352359669, 40.59656586245637], [-73.74159574046283, 40.59654887614067], [-73.74155506097243, 40.59653636656588], [-73.74151239169112, 40.59652861251448], [-73.74115347299904, 40.596540239701305], [-73.74094313576546, 40.59654705211172], [-73.7409414631812, 40.59655175339061], [-73.7409387973399, 40.59655618037783], [-73.7409352110988, 40.59656021208484], [-73.74093080246882, 40.59656373832592], [-73.74092569193654, 40.59656666272959], [-73.74092001917201, 40.59656890537255], [-73.74091393921043, 40.59657040496381], [-73.74087487147645, 40.59655573103651], [-73.7408331572998, 40.59654618609025], [-73.74078994633359, 40.596542033185855], [-73.74074642948112, 40.5965433867782], [-73.7407038060766, 40.596550209562075], [-73.74066111186984, 40.596562375683], [-73.74061674572245, 40.59657034051727], [-73.74057141605768, 40.59657397688532], [-73.7405258466843, 40.5965732267228], [-73.74052059824265, 40.59657185597492], [-73.74051574138403, 40.59656981191844], [-73.74051142341858, 40.59656715655039], [-73.74050777531151, 40.596563970409], [-73.740504907711, 40.596560350130865], [-73.74050290759243, 40.59655640552021], [-73.74050183561943, 40.59655225621845], [-73.74050172430566, 40.59654802807515], [-73.74050257702658, 40.59654384933126], [-73.74050436791904, 40.596539846729335], [-73.74050704266466, 40.59653614166962], [-73.74051052013718, 40.596532846527516], [-73.74051469486409, 40.59653006124564], [-73.74054563704607, 40.59649026444071], [-73.74057097581999, 40.596448228434745], [-73.74059043582385, 40.59640441005918], [-73.74060380558622, 40.59635928551451], [-73.74061093982257, 40.5963133451953], [-73.74061525971155, 40.59627245088244], [-73.74061079345005, 40.596231565707086], [-73.74059766007412, 40.59619177920585], [-73.74057620958588, 40.59615415163541], [-73.74054701362383, 40.596119685717944], [-73.74053082459658, 40.59612457940447], [-73.74051142026894, 40.596124535589944], [-73.74050176132286, 40.59611342145448], [-73.74049382946058, 40.59607396063], [-73.74047930089631, 40.596067764059136], [-73.74045917623138, 40.59606911296055], [-73.74044371824415, 40.59607014906631], [-73.74041452651389, 40.59609226945322], [-73.74030143748699, 40.59606613039738], [-73.74029022946958, 40.59603775498193], [-73.7402223263083, 40.59603513663349], [-73.74018670507758, 40.59604738195101], [-73.73992792985005, 40.596061587313315], [-73.73991492767561, 40.596078813973264], [-73.73981229328994, 40.59627456218199], [-73.73957904997508, 40.596376337848696], [-73.73953153596668, 40.596535232658084], [-73.73960988055163, 40.596763437540325], [-73.73946370303052, 40.596878420092], [-73.73948220989597, 40.59697762988142], [-73.73948781808575, 40.59697593479486], [-73.7394966087387, 40.5970203707591], [-73.73957870164308, 40.596980082262924], [-73.73958631560401, 40.596976346846645], [-73.73969757669637, 40.596921742250395], [-73.739705436777, 40.59691637748516], [-73.73975111242625, 40.596885195054845], [-73.73976010849762, 40.59687905384428], [-73.73981105771489, 40.596844270047], [-73.73983374627073, 40.59682117497731], [-73.73984650947756, 40.59680818193786], [-73.7398504168596, 40.59680420424124], [-73.73988306007304, 40.59677097418953], [-73.73979486697488, 40.59665124795648], [-73.7397915823696, 40.59664678841122], [-73.73973369321162, 40.59656819869528], [-73.73970950101993, 40.5965734083625], [-73.73965518724205, 40.59658510556953], [-73.73964853372279, 40.59656715206082], [-73.73969621382008, 40.5965552954201], [-73.73974724022848, 40.59654260483508], [-73.73975390043238, 40.59655202638888], [-73.73977602333036, 40.59658331679867], [-73.73977984293752, 40.59658871957666], [-73.73980566371779, 40.59662524227227], [-73.73981102756485, 40.59663283012041], [-73.73983351575824, 40.59666463683548], [-73.73983784246828, 40.596670757620046], [-73.73986424975341, 40.59670810956276], [-73.73986828861138, 40.596713821256586], [-73.73988420556657, 40.59673633511134], [-73.7398966257443, 40.596753902602096], [-73.73990994690175, 40.596772744520315], [-73.73979634028939, 40.596882675627874], [-73.73969866310973, 40.59694676530583], [-73.73969333890277, 40.59695025998227], [-73.73968736688427, 40.5969541787169], [-73.73963571050848, 40.59698224810066], [-73.73958504738884, 40.597005331340895], [-73.73957401693768, 40.59701035737161], [-73.73954671965845, 40.597022793742596], [-73.73951745995797, 40.597036125964884], [-73.73950885867268, 40.59704004409154], [-73.73949652209808, 40.597042578162096], [-73.73945528659308, 40.59704556873792], [-73.73944033499654, 40.59704665209554], [-73.73943095850046, 40.59704658024129], [-73.7394064975102, 40.59704639091866], [-73.73939810824884, 40.59704632565623], [-73.73936639462225, 40.59704113854307], [-73.73924172058136, 40.59700250359185], [-73.7392166950812, 40.59699474980928], [-73.73920841735517, 40.596992183229275], [-73.73914434758687, 40.59696717151354], [-73.73913856349672, 40.59696488952607], [-73.73908184815292, 40.59694251078459], [-73.73907319397102, 40.59693909580605], [-73.73901571928859, 40.59691402762481], [-73.73892850726293, 40.59687548946645], [-73.73894704511588, 40.59686319031951], [-73.73897266456387, 40.59687376554155], [-73.73904606722695, 40.59690608057036], [-73.7390548498901, 40.59690974227924], [-73.73910946934664, 40.596932518180445], [-73.73911830379909, 40.59693620194847], [-73.73916751427618, 40.59695672131168], [-73.73917528803719, 40.596959963069125], [-73.73922317497744, 40.59697993158166], [-73.7392355386211, 40.59698408506149], [-73.73928808236302, 40.597001738128064], [-73.73929610421013, 40.59700443194724], [-73.73934283227533, 40.597020130123084], [-73.7393979636384, 40.597029543017925], [-73.73944749042397, 40.59702863204729], [-73.73944497449672, 40.59697756908488], [-73.73945583288493, 40.596978282586775], [-73.73943957124749, 40.596897402307455], [-73.73933278706397, 40.59691318437725], [-73.73910683002381, 40.596804204365206], [-73.73912307710913, 40.59678451979306], [-73.73894690694097, 40.59676316642691], [-73.73889308019422, 40.59679519246272], [-73.73884642112992, 40.59682210248287], [-73.73883031859042, 40.59680480879736], [-73.73862636110987, 40.5968598115698], [-73.73858431403262, 40.59686094777612], [-73.73860200843423, 40.59688440787326], [-73.73852427660151, 40.59691381296728], [-73.73848679652468, 40.59698768159276], [-73.73844962513597, 40.59698266793203], [-73.73826706178608, 40.59735449138662], [-73.73822344542049, 40.59735112738425], [-73.73812220887619, 40.597386102069386], [-73.73813316409253, 40.59728564583394], [-73.73803749195454, 40.5959131511688], [-73.73773567396867, 40.59478499423731], [-73.73770476300949, 40.59466942244817], [-73.73763679389783, 40.594415399837956], [-73.7376468285491, 40.59441408134138], [-73.7376479822356, 40.59441483987047], [-73.7376539685101, 40.594418788648994], [-73.73766540626953, 40.594433196371575], [-73.73767387555077, 40.59445767474746], [-73.73768487329951, 40.59447281876304], [-73.73770589774527, 40.594491832320074], [-73.73771202922693, 40.59449473670989], [-73.7377385952103, 40.59450733277356], [-73.73776863283119, 40.59451761311257], [-73.737804303554, 40.594528042498645], [-73.73784632428159, 40.594537277966346], [-73.73786658749289, 40.59453944160252], [-73.7380612247574, 40.594546116708024], [-73.7381686471151, 40.59454268675029], [-73.73825859616619, 40.594533417676665], [-73.73829117183324, 40.594525640075524], [-73.73836396686413, 40.5945045895076], [-73.73839885733365, 40.594494187093225], [-73.73842547703404, 40.594481153379654], [-73.73844602742476, 40.594464593914914], [-73.73845944615474, 40.59444079733848], [-73.73846105156619, 40.594389857304975], [-73.73847314107705, 40.594373414277754], [-73.73848811323195, 40.59436637171761], [-73.7385086654192, 40.59439126284707], [-73.73852246399807, 40.59441244741771], [-73.73852462983481, 40.594435578016046], [-73.73853764634308, 40.5944481524451], [-73.73856957886235, 40.59445413186819], [-73.73865814740493, 40.594480503520934], [-73.73867835139818, 40.59448881573182], [-73.73874923699084, 40.59451800985268], [-73.73877153079722, 40.59452520803298], [-73.73877815501379, 40.59444891235183], [-73.73878418806137, 40.59441333800904], [-73.73877005026992, 40.59441215745293], [-73.73877753514914, 40.59435500821518], [-73.73881662516276, 40.59435976495602], [-73.73881112762062, 40.594416435556795], [-73.73879338493006, 40.59441445740864], [-73.7387913253894, 40.59444907681658], [-73.73878644978721, 40.594529565560244], [-73.73883432550788, 40.59454304930055], [-73.73889349191411, 40.59455720483895], [-73.73900196778274, 40.5945862322444], [-73.73907212417535, 40.594596476534605], [-73.73910729317714, 40.59459655638528], [-73.73916764971513, 40.59459300170851], [-73.7391954400391, 40.59458593253053], [-73.73925589391581, 40.59455778446143], [-73.73927692202334, 40.59454553044771], [-73.73928729631761, 40.594533009676084], [-73.73928512794382, 40.59450742092013], [-73.73927780495323, 40.59448280202721], [-73.73928109875231, 40.59446533930758], [-73.73929430628124, 40.594453005560645], [-73.73930406142904, 40.5944539455886], [-73.73931941105549, 40.59446194143417], [-73.73932662910883, 40.59447398009358], [-73.73933385925235, 40.59448601878002], [-73.73934856041359, 40.59451206802289], [-73.73936472405694, 40.594523171714336], [-73.73939659170452, 40.59453070929159], [-73.73942749489994, 40.594537200626306], [-73.73945887454893, 40.59454245833712], [-73.73949465784864, 40.594545339725514], [-73.7395276572985, 40.594550187793], [-73.7395646533139, 40.59456157857743], [-73.73956502573112, 40.59451945535183], [-73.7395522688195, 40.59451943799904], [-73.73955249471965, 40.594426474456995], [-73.73958763297539, 40.5944265256111], [-73.73958740902066, 40.594518270376916], [-73.73957519758912, 40.59451825258765], [-73.73957493121861, 40.59456474305713], [-73.73958864884943, 40.594568966581505], [-73.73961965222445, 40.59458004187891], [-73.73964106023107, 40.59458245037932], [-73.73967453660494, 40.59458634372677], [-73.7396953946558, 40.59458939428621], [-73.73968123124612, 40.59450355888254], [-73.73995801592365, 40.59450076878709], [-73.73995275016908, 40.594636709613916], [-73.73998678749325, 40.59463285989959], [-73.74001746414017, 40.59462486123154], [-73.74004742639178, 40.59461463597358], [-73.74006098155643, 40.59460121264042], [-73.740072950435, 40.59457959082199], [-73.74008908945062, 40.594530657145285], [-73.74010803139174, 40.59451126617564], [-73.74013580364566, 40.59451157273891], [-73.74014139121738, 40.59451754659306], [-73.74013382011009, 40.594566031909075], [-73.74014286699474, 40.59458153196842], [-73.74018445146005, 40.59461192931863], [-73.74021122864659, 40.5946251649163], [-73.74027412098314, 40.594647071736055], [-73.74032962528412, 40.59466121825713], [-73.74036408761145, 40.59466969808866], [-73.7403919369275, 40.59467450780171], [-73.740419032672, 40.59467880098619], [-73.7405061595838, 40.594699475119604], [-73.74062832064128, 40.59472165227207], [-73.740651588069, 40.59472003049213], [-73.7406816322751, 40.59470719329445], [-73.74069758978415, 40.59469583776901], [-73.74070773498553, 40.594672014279574], [-73.74073935409572, 40.594670545350084], [-73.74076790338214, 40.59466251420721], [-73.74079275823493, 40.59465024325229], [-73.74083151673132, 40.59461116602116], [-73.74083862240138, 40.59459764797131], [-73.74083755553995, 40.59457433879751], [-73.74084054278646, 40.59454742062226], [-73.74085331865267, 40.59450336828137], [-73.74086643220772, 40.59449105173324], [-73.7409017059638, 40.5944882487506], [-73.74091740970762, 40.594505682310846], [-73.7409156959837, 40.59451789891997], [-73.7409053346814, 40.594554734495134], [-73.74088874912545, 40.59459718403629], [-73.74089520274937, 40.59461157919189], [-73.7409401621547, 40.594636607841124], [-73.74096717985206, 40.59465173387741], [-73.74102990553376, 40.59467729775638], [-73.74108997034794, 40.5946973351586], [-73.74112633401295, 40.59470622295994], [-73.74115233831625, 40.594714737780315], [-73.74118104185605, 40.594730633342806], [-73.7412611561602, 40.59476875309056], [-73.74129498270835, 40.59478271580657], [-73.7413182062532, 40.59479259288114], [-73.74137287779189, 40.59480814176124], [-73.74146578067547, 40.59480802697643], [-73.74150058113821, 40.59480557506032], [-73.74156118998467, 40.59480118137393], [-73.7415916774986, 40.594795685093054], [-73.74162091692338, 40.59478649313513], [-73.7416408809993, 40.59477144541601], [-73.74165498494048, 40.59474732500191], [-73.74165774557974, 40.594675225647016], [-73.74166197274509, 40.594654370132346], [-73.74167638401231, 40.59464243402208], [-73.74169766300271, 40.59464174405287], [-73.74171730107162, 40.5946498837432], [-73.74173218981556, 40.59466416328336], [-73.74174014598705, 40.59468094923735], [-73.7417376616572, 40.594727771793366], [-73.74174977224077, 40.59474256660813], [-73.74177588782638, 40.59475904205792], [-73.74180151991479, 40.59477199527085], [-73.7418488883716, 40.59479449776606], [-73.74191490578423, 40.5948181498347], [-73.74196836844072, 40.59483786620653], [-73.74202229932045, 40.59485881545237], [-73.7420847378624, 40.594879271628734], [-73.74214660413497, 40.59489483679036], [-73.74222603097068, 40.59490588332426], [-73.74225988208669, 40.59490455501748], [-73.74232229363123, 40.59489547413439], [-73.74242926334367, 40.59486851780651], [-73.7423874258487, 40.59472925606014], [-73.74261837534051, 40.5947368068089], [-73.7427604397498, 40.59474431144505], [-73.74277459101098, 40.594790810567766], [-73.74279563385534, 40.59480522068059], [-73.74280966836622, 40.594808377363236], [-73.74283993997102, 40.5948193134478], [-73.74287488141269, 40.59482601158156], [-73.74291424530844, 40.59483215904353], [-73.74297445988655, 40.594831969904114], [-73.74300969211616, 40.59482781672778], [-73.74304104329526, 40.59481910675949], [-73.74306717345472, 40.594804126358085], [-73.7430994470635, 40.59479203181844], [-73.74313202933371, 40.594785793298854], [-73.74316618149479, 40.59478908436607], [-73.74319069326747, 40.59479254268566], [-73.74322060926447, 40.594794580862654], [-73.74328649698155, 40.59479687178487], [-73.74331966019673, 40.594795982400626], [-73.74334951603205, 40.594795148276276], [-73.7433744085999, 40.59479188108], [-73.74340201112331, 40.59478428844293], [-73.74342845401051, 40.59477374753133], [-73.74345292601652, 40.59475678330378], [-73.74346867615824, 40.594734584393905], [-73.74347021013651, 40.59471074143902], [-73.74345368532323, 40.59463620381585], [-73.74345571627173, 40.59461200245114], [-73.74346642638272, 40.59459756333345], [-73.7434844228204, 40.594590516990586], [-73.74350188978259, 40.59460093027141], [-73.74351563536557, 40.59462094375595], [-73.74353464516977, 40.59464182422796], [-73.74358643822328, 40.59465040476105], [-73.74398868331865, 40.594664628781324], [-73.74414761988396, 40.59466528029151], [-73.74451941399786, 40.594653238665394], [-73.74461964043492, 40.59464731092186], [-73.74472011812641, 40.594633891375196], [-73.74506981727697, 40.59457025243548], [-73.74514756425398, 40.59454824576606], [-73.74524623370854, 40.594519592943556], [-73.7453919908722, 40.59448200412548], [-73.74576700628545, 40.594399419083096], [-73.74588152239984, 40.594375682763335], [-73.74597487469723, 40.594359696390406], [-73.74606380498341, 40.5943537429195], [-73.74633803574713, 40.59432789142369], [-73.74642483662306, 40.594310351461175], [-73.74657572303371, 40.59429685271138], [-73.74662298522834, 40.59428658867152], [-73.74664920374843, 40.594280895008744], [-73.74675560739023, 40.594243694148254], [-73.74683948398362, 40.59420899253098], [-73.74687686045283, 40.59416285051162], [-73.74692257807818, 40.59410975743752], [-73.7469877100281, 40.594090143051616], [-73.74705451165403, 40.59408158190828], [-73.74712039646221, 40.59408129602737], [-73.74712916578538, 40.59408031567385], [-73.74715073481806, 40.594077894414376], [-73.74718527378876, 40.594075449584224], [-73.74721470033396, 40.59407279480699], [-73.74727767310603, 40.59406444960137], [-73.7473428051014, 40.59405715550065], [-73.74741792429445, 40.59403588753023], [-73.74754294839317, 40.593938229632755], [-73.74760282517072, 40.59391154380944], [-73.74765788192904, 40.593881993330605], [-73.74775402443677, 40.59384325554806], [-73.74786754387374, 40.59379812802524], [-73.74793001816698, 40.593768510763624], [-73.7480968163944, 40.59362318914886], [-73.74814789619523, 40.59360773255468], [-73.74830456677556, 40.59358869579131], [-73.7485123044914, 40.59354496191742], [-73.74895028827507, 40.59340538311677], [-73.74918491752474, 40.59327851543212], [-73.74923723499444, 40.59322905616515], [-73.7493317329166, 40.59316846807457], [-73.74938620259219, 40.593140561804695], [-73.74950615034876, 40.59307241936008], [-73.74963881698261, 40.59301136471626], [-73.74971695134795, 40.59297329973449], [-73.74980984069296, 40.59291610140136], [-73.74999063621222, 40.592810305377085], [-73.75022538179961, 40.59270823678695], [-73.75037372333664, 40.59261259832038], [-73.75064164562772, 40.59241330843881], [-73.75074472812084, 40.59233727580714], [-73.75083983764087, 40.59224470968875], [-73.75092985909811, 40.59211661561272], [-73.75103368083255, 40.5919686499819], [-73.7511534608213, 40.591808282565914], [-73.75131940156294, 40.59161696509918], [-73.7513584707491, 40.59157819191071], [-73.75147213875667, 40.591472616011835], [-73.75154772812445, 40.5914220086854], [-73.75163854884676, 40.59138023139625], [-73.75175127901, 40.59134251756634], [-73.7518092615259, 40.591318923257134], [-73.75187164604968, 40.59130308266377], [-73.75208039307323, 40.59127735483698], [-73.75223475926043, 40.59125640779624], [-73.75235329623182, 40.59123572593447], [-73.75257921234481, 40.591183460100424], [-73.75263919939694, 40.59117343123855], [-73.7526758422693, 40.59116746764309], [-73.75271719872373, 40.59116105531522], [-73.7527511645542, 40.59115695908706], [-73.75278463818802, 40.5911519521024], [-73.75284115059198, 40.59114564370349], [-73.75286727165079, 40.59114163862416], [-73.75293148208962, 40.59113669769829], [-73.75299279987641, 40.59112775191378], [-73.75305170830612, 40.59111573930899], [-73.75311212524532, 40.59109805751856], [-73.75313483211737, 40.591091000521054], [-73.75317176753282, 40.59108262362464], [-73.7532677610427, 40.59103419232235], [-73.7532993144495, 40.59102111299008], [-73.75338089874752, 40.59099413754488], [-73.75343228226795, 40.59097256273838], [-73.75345522617467, 40.59096509221967], [-73.75349168911401, 40.59095322941643], [-73.75352988157324, 40.59094648500059], [-73.75355794778345, 40.59094362749599], [-73.75359114847551, 40.590942088063755], [-73.75365382039506, 40.59093445022406], [-73.75372199695761, 40.59093001207567], [-73.75374861134372, 40.59093015137155], [-73.75378173188352, 40.590930797643225], [-73.75381427976859, 40.59092982266386], [-73.75385060867407, 40.590922462664544], [-73.75390232431987, 40.59090975840006], [-73.75394637764788, 40.59090268497197], [-73.75398349406454, 40.59090256575355], [-73.75406364294247, 40.59090606949451], [-73.75426138209615, 40.590924504024116], [-73.75433376822224, 40.590931871638745], [-73.75438328246368, 40.590936246149674], [-73.75440305171236, 40.590937999555855], [-73.75447308112479, 40.59094029175186], [-73.75453500647647, 40.59093992950473], [-73.75457182984402, 40.590932848601135], [-73.75458831317428, 40.59092815611133], [-73.754611810522, 40.590921461202385], [-73.75464087599367, 40.59091655299063], [-73.754676719751, 40.59091243272865], [-73.75473532047647, 40.59090675743492], [-73.75477000716293, 40.590902581399654], [-73.75480303925438, 40.59089834704099], [-73.75483172480736, 40.5908942568565], [-73.75486536388713, 40.59088870129376], [-73.75495964643265, 40.59087474627759], [-73.75498975915815, 40.59087129822395], [-73.75501860929782, 40.59087026073922], [-73.75505442583602, 40.59087019268324], [-73.75508259331284, 40.590868937948734], [-73.75521122361054, 40.59086253882331], [-73.75528072638602, 40.59086046307248], [-73.75533106525006, 40.590859120464394], [-73.75537689752801, 40.59085974006773], [-73.75541498594802, 40.59086207358678], [-73.7555038248681, 40.59086978122559], [-73.75553036586294, 40.59086745089645], [-73.75556957875274, 40.59086577810023], [-73.75571850574238, 40.59086532131434], [-73.75577045063802, 40.59086727791204], [-73.75580079510667, 40.59087153819075], [-73.75583628405437, 40.59087361341051], [-73.75586357310075, 40.590873508888954], [-73.75592115806575, 40.590871109225816], [-73.7559546362305, 40.590874198049825], [-73.75602036595409, 40.59088630496383], [-73.75605024598252, 40.59089781371333], [-73.75607723387715, 40.59091181133894], [-73.75610479724386, 40.59092691805504], [-73.7561318000948, 40.59093718765598], [-73.75616278331961, 40.59094419618295], [-73.75619478638879, 40.59095315172029], [-73.75623154401504, 40.590964153494056], [-73.75625999802007, 40.590971464046554], [-73.75629179897616, 40.59098095003038], [-73.75632502885645, 40.59099079101608], [-73.75635783011097, 40.59100126166589], [-73.75638878883085, 40.59101180914955], [-73.75642199513254, 40.59102143478119], [-73.75645231340867, 40.591029352010295], [-73.75648210550776, 40.59103602403912], [-73.75651228449009, 40.59104303126979], [-73.75654462693286, 40.59105018748697], [-73.75657827475327, 40.59105541902863], [-73.75661224706137, 40.591058750117995], [-73.75664012057273, 40.59106032211658], [-73.75667054293734, 40.59105904546611], [-73.75669866323629, 40.591060860556546], [-73.75675525782049, 40.59107102144743], [-73.7568249426794, 40.59108706250415], [-73.75691806701087, 40.591111907381965], [-73.75694734161965, 40.59112124510418], [-73.75700245101464, 40.59113681495333], [-73.75703419417235, 40.59114937160005], [-73.75706297359264, 40.591158131775074], [-73.75711328332214, 40.5911748798808], [-73.75714554578028, 40.59118430461713], [-73.75717655040047, 40.59119183544117], [-73.75720108105554, 40.59119960454252], [-73.7572211627071, 40.591203239987166], [-73.7572407067868, 40.59120501102491], [-73.75730257288988, 40.59121411946992], [-73.75733639369399, 40.59122053039772], [-73.75739663764747, 40.59123729047855], [-73.75745186056763, 40.591251186057356], [-73.75748350555223, 40.59126146463545], [-73.75751466374516, 40.59126914831187], [-73.7575576526475, 40.5912784687471], [-73.75762331559734, 40.591292692514706], [-73.75767587486234, 40.591305013951896], [-73.75773334295016, 40.591321768671946], [-73.7577894312456, 40.59133456574357], [-73.75785285721308, 40.59135045845573], [-73.75789189861872, 40.59135698827763], [-73.75795637515171, 40.59135995234955], [-73.75798801159918, 40.59136273799488], [-73.7580128027422, 40.591367013969894], [-73.75804097641971, 40.591373854573675], [-73.75811181401144, 40.59137839818963], [-73.75813777460367, 40.591379498054145], [-73.75816643522687, 40.591378953928334], [-73.75829781442644, 40.591389955448335], [-73.75856200201768, 40.59142856761067], [-73.75871537076522, 40.59145097941272], [-73.75878945264255, 40.59146647080124], [-73.75885981629324, 40.59147504724865], [-73.75892785511789, 40.59147917052124], [-73.75904521901246, 40.59149193468693], [-73.75906249579332, 40.591493620078055], [-73.75914462613561, 40.59150163466767], [-73.7592283619613, 40.59150980685747], [-73.75928714482238, 40.5914932070092], [-73.75938010754977, 40.591504577464306], [-73.75947486517903, 40.59152563198178], [-73.75960054182336, 40.591552496045956], [-73.7596717559462, 40.591567602582735], [-73.75969570621598, 40.59157267789848], [-73.75976734920664, 40.591586605527176], [-73.75979294806714, 40.59159164523478], [-73.75989658654491, 40.591612045000495], [-73.75994809255582, 40.59161805117161], [-73.76007031564953, 40.591623169161466], [-73.76016560077571, 40.591619225565495], [-73.76023595718786, 40.591620057084604], [-73.76030924413571, 40.59162328130438], [-73.76038205920773, 40.59163013268843], [-73.76041824810322, 40.59163199116775], [-73.76054954013327, 40.59163800155924], [-73.76065279969747, 40.59164727620251], [-73.76078573008135, 40.59166078133847], [-73.76084382257397, 40.59166493654668], [-73.76095548743734, 40.59168271095222], [-73.76108305835777, 40.59169203527808], [-73.7612089514512, 40.591708047789616], [-73.7612787298498, 40.59171832330683], [-73.76134311678325, 40.59172663385036], [-73.76141229292924, 40.59172329321627], [-73.76157030497218, 40.59169996479758], [-73.76172098788959, 40.591681222340064], [-73.76229978054906, 40.59164087015591], [-73.76236416229632, 40.591637683712996], [-73.76243967044952, 40.59163394611224], [-73.76276146869947, 40.59162420917798], [-73.76295275572143, 40.591611177431], [-73.76303822435928, 40.59159747704603], [-73.76308430596761, 40.59158769299509], [-73.76347652151587, 40.59148431951076], [-73.76354057868238, 40.59147225835319], [-73.76376223423699, 40.591439709016804], [-73.76385620499985, 40.59175407799996], [-73.763912182, 40.592039344999925], [-73.7640494709999, 40.59273904699989], [-73.76414300399986, 40.593205171999905], [-73.76429039299992, 40.5939396449999], [-73.76440183099987, 40.59457168299989], [-73.76362979899989, 40.59466694999985], [-73.76277845599988, 40.59475654399989], [-73.762981598, 40.59589946999991], [-73.76299716399983, 40.595987023999875], [-73.76301370999988, 40.596081549999916], [-73.76319972899987, 40.59714459099989], [-73.7633344969999, 40.59782287399992], [-73.76255289900001, 40.59831811799991], [-73.76181486399989, 40.59895137099994], [-73.76128753399995, 40.59954927099993], [-73.76154124799989, 40.599846560999886], [-73.76158779199984, 40.59990109899993], [-73.76165797299986, 40.599973069999876], [-73.76336096499998, 40.599105042999945], [-73.76386778499985, 40.59972731299991], [-73.76444582499997, 40.6004352409999], [-73.76654204999997, 40.599434441999904], [-73.76599689399987, 40.59872106199988], [-73.76618488799977, 40.59865569699989], [-73.76636755699995, 40.59857174399987], [-73.76654034499992, 40.598469425999895], [-73.76669864799996, 40.598349814999935], [-73.76683818399978, 40.598214847999884], [-73.76695532899997, 40.598067273999895], [-73.76704742299998, 40.59791042699988], [-73.76711296699986, 40.5977480419999], [-73.76715168699985, 40.59758390099991], [-73.76716449199986, 40.597421597999904], [-73.76715321499994, 40.59726433399986], [-73.76712577699985, 40.59712732699992], [-73.76711717700006, 40.5969881329999], [-73.767127717, 40.59684901399989], [-73.76715706599988, 40.59671223899986], [-73.76717720099997, 40.5966231809999], [-73.76721443599983, 40.596535878999845], [-73.76726813399988, 40.59645316599989], [-73.76733661099998, 40.59637765199988], [-73.76742090699994, 40.59630520399985], [-73.76771811799993, 40.596261309999925], [-73.76776273800007, 40.59654905699993], [-73.76795322999999, 40.5974260569999], [-73.76809925802587, 40.59784597005487], [-73.76808948115853, 40.59786141186906], [-73.76806678092747, 40.59791051677544], [-73.76803688591761, 40.597983245938565], [-73.76802839158346, 40.59800389559855], [-73.7680081292507, 40.59804505428412], [-73.76800671591312, 40.59804723953703], [-73.76800499434478, 40.59804938798138], [-73.76800049037357, 40.59805366530517], [-73.76797967142298, 40.59806790552089], [-73.76797547820793, 40.5980713022647], [-73.76797219339382, 40.598074627296874], [-73.76795030970385, 40.598099643719394], [-73.76793987039952, 40.59811524830741], [-73.76793669062471, 40.59812275107256], [-73.76793516521563, 40.59812979898456], [-73.76793501234442, 40.59813318512241], [-73.76793526089354, 40.59813648160468], [-73.76793592288796, 40.59813970638148], [-73.76793698739951, 40.59814284200773], [-73.7679383588175, 40.598145699986695], [-73.76794006182584, 40.59814845041087], [-73.76794453414253, 40.59815366358615], [-73.76795043655434, 40.5981585114185], [-73.76795788671298, 40.598163101364314], [-73.7679735866159, 40.59817025642905], [-73.76801725401066, 40.59818645491745], [-73.76804356253508, 40.59819727867728], [-73.7681062491692, 40.59822061090645], [-73.76813551682744, 40.598233358664366], [-73.76814108283848, 40.59823635075125], [-73.76814644628057, 40.598239828265406], [-73.76815671757392, 40.59824835899617], [-73.76816672252433, 40.59825915854686], [-73.76819439128423, 40.598293236805254], [-73.76820476656758, 40.59830277560051], [-73.76821010481004, 40.598306676911044], [-73.76821563403921, 40.59831007400694], [-73.76823995164165, 40.59832227984716], [-73.76826549483133, 40.59833244429065], [-73.76829168302484, 40.598340350555176], [-73.76831805693715, 40.598345851628416], [-73.76839693702648, 40.598356879620326], [-73.76843153022395, 40.598360182655995], [-73.76846416625214, 40.59836214836891], [-73.76848525498117, 40.59836194760225], [-73.76853280608204, 40.59835872931362], [-73.76855413008346, 40.59835900613289], [-73.76856615207234, 40.59836036321092], [-73.76857915096119, 40.59836281253829], [-73.76863287860479, 40.59837725624019], [-73.76864559342032, 40.59837999263673], [-73.76865718894716, 40.598381754101055], [-73.76870119627677, 40.598385372366586], [-73.7687851600615, 40.59838854966014], [-73.7687971144413, 40.59838899638874], [-73.76883903289473, 40.59839186455648], [-73.76888469830521, 40.59839453099987], [-73.76890472549103, 40.59839705641079], [-73.76889176380759, 40.59844309700456], [-73.76893146064765, 40.59846776382943], [-73.7689799009702, 40.598453009537664], [-73.76900728611821, 40.598485604222866], [-73.76901642123492, 40.59849509605623], [-73.76902297252785, 40.59850001801285], [-73.7690308024206, 40.59850421194153], [-73.76903989945066, 40.5985076875357], [-73.76905027444222, 40.598510429069286], [-73.76907474247716, 40.598513711060114], [-73.76910411185766, 40.59851403962738], [-73.76918917846884, 40.59850927592098], [-73.76922076994283, 40.598505710169235], [-73.7692324467041, 40.59850439136927], [-73.76925114099092, 40.59850352860201], [-73.7692560185019, 40.59850384413721], [-73.76926090713974, 40.59850469227168], [-73.76926586446571, 40.59850607965441], [-73.7692709962844, 40.59850804469486], [-73.76930264378103, 40.59852579417719], [-73.76930921498162, 40.598528905160784], [-73.7693153972632, 40.59853115945395], [-73.76941553633635, 40.59856154676938], [-73.76958690877635, 40.598614372870564], [-73.76961311333139, 40.59862099039476], [-73.76967401111023, 40.59863268407702], [-73.76970071987024, 40.59864013052369], [-73.7697177925864, 40.59864685537092], [-73.76973574379937, 40.598655554470966], [-73.76980002538818, 40.598693091134756], [-73.76982828415264, 40.59870722425542], [-73.76993238412204, 40.59874703640101], [-73.76997616916023, 40.59876378404294], [-73.77001557170144, 40.59878377364488], [-73.77005175466385, 40.598805467437195], [-73.77007316919209, 40.59882066602884], [-73.77011765933023, 40.59885549768401], [-73.77017682425011, 40.598896986313505], [-73.77027408869283, 40.59895978547217], [-73.77028053833372, 40.598963310122805], [-73.7702923541327, 40.59896976420225], [-73.77031339088283, 40.59897801872385], [-73.77033634816473, 40.598984223332735], [-73.77036024774937, 40.5989881078579], [-73.77038390667956, 40.598989496709535], [-73.77040662910537, 40.598988389335254], [-73.77042764768771, 40.59898480212829], [-73.77043736736675, 40.59898212012738], [-73.7704464760719, 40.59897885172398], [-73.7704683455717, 40.598968259780925], [-73.77049004964127, 40.59895419260177], [-73.77051209601598, 40.59893651399356], [-73.77055524769148, 40.59889729232011], [-73.77057450087534, 40.59888111170244], [-73.77059633936453, 40.59886564874629], [-73.77061795344157, 40.59885383212521], [-73.77064482646136, 40.5988414128369], [-73.77066458708046, 40.59883227583165], [-73.7706956755438, 40.59882045129777], [-73.77072503590009, 40.59881308010125], [-73.77073894803341, 40.59881121728292], [-73.77075252398886, 40.598810542248174], [-73.77078720521955, 40.59881244001284], [-73.7708235249685, 40.598818499960174], [-73.77086131911726, 40.59882870584586], [-73.77090026970177, 40.59884297578282], [-73.77093086474137, 40.59885759912505], [-73.77095834516885, 40.59887485333718], [-73.77098168371995, 40.59889409104954], [-73.7710002428972, 40.59891476786325], [-73.77101070690539, 40.59892979083342], [-73.7710202328009, 40.59894585748658], [-73.77103672115965, 40.598981532790056], [-73.77105014425419, 40.59902249776632], [-73.77106245222207, 40.59907466205954], [-73.77106471104767, 40.59909118264467], [-73.77106497919539, 40.599109770434104], [-73.77105912334285, 40.59917048108935], [-73.77105828189103, 40.59919198386322], [-73.77105997150446, 40.59921233940989], [-73.77106455326746, 40.59923046704428], [-73.77107042772171, 40.59924356265017], [-73.77107908782979, 40.5992572858428], [-73.77109056842833, 40.599271861682865], [-73.77112720101427, 40.59931407892318], [-73.77113690037558, 40.59932803855502], [-73.7711437557007, 40.59934115487388], [-73.77115249540978, 40.59936616151324], [-73.77115807337863, 40.59939324240757], [-73.7711605243632, 40.599422452073746], [-73.77115986181745, 40.599453968287726], [-73.7711557024036, 40.59948176876551], [-73.7711467245462, 40.59951232305057], [-73.77113534274287, 40.599541045635874], [-73.77110581598824, 40.59960751824148], [-73.7710939261192, 40.59963985912255], [-73.77108674822033, 40.59966934546764], [-73.77108437410661, 40.599696573028744], [-73.7710871200451, 40.59979180908827], [-73.77109550611405, 40.599895809473374], [-73.77110624222676, 40.60000025648079], [-73.77111419742232, 40.60006435310831], [-73.77111914447596, 40.60008602941045], [-73.77113493157037, 40.60013350978704], [-73.77113905426296, 40.600154076572565], [-73.7711393089279, 40.60015922794802], [-73.77113891311716, 40.60016454002929], [-73.77113621586231, 40.600175944268535], [-73.77111624260783, 40.600219057797865], [-73.77111292431104, 40.60022883090313], [-73.77111126381162, 40.600237733977686], [-73.77111054072343, 40.600255805977156], [-73.77111187877777, 40.60027562941646], [-73.77112817318242, 40.60036459802649], [-73.77113028499313, 40.6003858091471], [-73.7711302089682, 40.60040484589827], [-73.77112590127966, 40.60045504211783], [-73.77111953843155, 40.60050186572423], [-73.7711110344584, 40.600546028547384], [-73.77110030469566, 40.600587863299594], [-73.77105282368589, 40.60074930554536], [-73.77093512613936, 40.601152308285606], [-73.77091239686352, 40.6012104189018], [-73.7708673092232, 40.60129269130317], [-73.77073733384829, 40.60153550225482], [-73.77074244654368, 40.6015817158007], [-73.77075283595511, 40.60162593119095], [-73.77077908903945, 40.601656115444754], [-73.77082643937688, 40.60168232507241], [-73.77084737913124, 40.60172455230795], [-73.77084198990094, 40.601758692487834], [-73.77083917528664, 40.60181091609616], [-73.77080471264298, 40.60186910380908], [-73.77078080648036, 40.60192329503747], [-73.77074383318684, 40.60194531862101], [-73.77071223428813, 40.60193721985457], [-73.77068865897292, 40.6018949885093], [-73.77065189914457, 40.601854737184134], [-73.7706175881491, 40.601868730478955], [-73.77060167895182, 40.601896822434604], [-73.77058311147579, 40.60193093629699], [-73.77054596552425, 40.60200317950911], [-73.77050356147332, 40.60207139551764], [-73.77044533066837, 40.60214359776326], [-73.77039741390276, 40.60228211207762], [-73.77034443950986, 40.60235834196636], [-73.77027546523118, 40.60248877892168], [-73.77026469363348, 40.60255504888111], [-73.7702328460693, 40.60261926802468], [-73.77022211742572, 40.60267348564586], [-73.77018588274089, 40.602748823325115], [-73.77023981935425, 40.602779886972485], [-73.770288763362, 40.602815430513466], [-73.77033207783559, 40.60285499141114], [-73.77036919910219, 40.60289805484946], [-73.77039964407953, 40.60294406043146], [-73.77039682621424, 40.602967653542606], [-73.77038875846117, 40.60299053226202], [-73.7703756783063, 40.603012023104945], [-73.7703579707886, 40.60303149344139], [-73.7703361571643, 40.60304837011899], [-73.77031087956307, 40.60306215633484], [-73.77028288208662, 40.60307244626041], [-73.77025298890355, 40.6030789369883], [-73.77025152605673, 40.60307914816689], [-73.7702408196256, 40.603079820671525], [-73.77019158542402, 40.60307987485414], [-73.77017898589695, 40.6030814251088], [-73.77017334566268, 40.603082674825664], [-73.77016805885243, 40.60308424858135], [-73.77016577454368, 40.60308518050411], [-73.77016484016474, 40.60308569194633], [-73.77016404658139, 40.60308623164771], [-73.77016339512008, 40.60308679743287], [-73.77016288511355, 40.603087391478326], [-73.77016251656966, 40.60308801160619], [-73.77016227802436, 40.6030886676779], [-73.77016219214377, 40.60308935203229], [-73.77016223713731, 40.60309007350495], [-73.77016242403113, 40.60309082156364], [-73.77016274026438, 40.60309160556471], [-73.77016379701433, 40.60309328196956], [-73.77016543416676, 40.603095113327136], [-73.77016908515742, 40.6030982810755], [-73.77017429474198, 40.60310202924763], [-73.77020712683694, 40.60312326562137], [-73.77021459537006, 40.603129620043916], [-73.77021718414757, 40.6031325077352], [-73.77021903074902, 40.603135240317805], [-73.77024599008497, 40.60318723578144], [-73.7702718933096, 40.60324447062789], [-73.77029746555604, 40.60330841369927], [-73.7703263389662, 40.60338816794179], [-73.77033952766757, 40.60342845736956], [-73.77035205529455, 40.60347217530938], [-73.77037750437735, 40.60357862357121], [-73.77040862113736, 40.603719023818094], [-73.77041588743104, 40.60375180813819], [-73.77043556340162, 40.60384686154675], [-73.77045185260809, 40.60393739745087], [-73.77046357455843, 40.60401935994732], [-73.77047139482067, 40.604099008939336], [-73.7704744997586, 40.60417177661492], [-73.77047540249363, 40.60431832145352], [-73.77047105451693, 40.60441441715326], [-73.77047158381761, 40.604453032116616], [-73.7704746817832, 40.604476235797506], [-73.77047953587791, 40.60459547958392], [-73.77048062362502, 40.60471477786669], [-73.77048893638917, 40.604756983507215], [-73.7704891070582, 40.60479966184392], [-73.77048113198757, 40.60484190531993], [-73.77046518075221, 40.60488281562423], [-73.7704415925433, 40.60492152279403], [-73.77041086895497, 40.60495720371523], [-73.77037366331972, 40.604989099625804], [-73.77033076681522, 40.60501653225206], [-73.7702682118161, 40.605049823403746], [-73.77021002042594, 40.60508743150987], [-73.77015670371276, 40.60512902628116], [-73.77010872993579, 40.60517424241473], [-73.77006652043227, 40.605222682803124], [-73.77003044591854, 40.605273922020714], [-73.77000082323222, 40.605327510060555], [-73.76999690762636, 40.60535766861426], [-73.76999420287767, 40.60538803833292], [-73.76999408117247, 40.6054166658867], [-73.76999691052053, 40.60544251718156], [-73.77000011297223, 40.605456093322296], [-73.77000524884225, 40.60547101725451], [-73.77003373282179, 40.60553707304843], [-73.77003849335085, 40.60555459008922], [-73.77004034008233, 40.60557070360015], [-73.77004040748075, 40.605609272572], [-73.77004041197118, 40.605611542607335], [-73.77003782936973, 40.6056444871658], [-73.77003224550127, 40.60567385147461], [-73.77002346997727, 40.60570028231908], [-73.7700171718621, 40.605714353261696], [-73.77001053824887, 40.60572914491508], [-73.76999819959372, 40.60575078716462], [-73.76998434837355, 40.6057688685591], [-73.76996865368979, 40.60578366904808], [-73.76996089553964, 40.60578913760247], [-73.76995154367613, 40.60579450362133], [-73.76995140139938, 40.60579458458842], [-73.76990388214686, 40.60581772314249], [-73.76989263053164, 40.605825553064655], [-73.76988816153622, 40.605829642059106], [-73.76988439044467, 40.605833920754215], [-73.76988039970524, 40.60583993763161], [-73.76987704256089, 40.60584700920382], [-73.7698696351318, 40.60587086700765], [-73.76986025918269, 40.60590349221747], [-73.76985219369494, 40.60594001930243], [-73.76983506067754, 40.6060496411682], [-73.76982781931672, 40.60610762977467], [-73.7698237091003, 40.60616538106313], [-73.76982277888568, 40.606222689070265], [-73.7698249935709, 40.6062793451514], [-73.76983037846216, 40.60633515234232], [-73.76983889691651, 40.606389966158574], [-73.76985052748687, 40.60644363393708], [-73.76986524728281, 40.6064960386955], [-73.76991551796586, 40.60664479740757], [-73.76995807121004, 40.60678398710599], [-73.76997746213935, 40.60684515327842], [-73.77000440332164, 40.60692723621898], [-73.77001192144186, 40.60695013362844], [-73.77001531520949, 40.60696313485274], [-73.77001735907474, 40.60697684487389], [-73.77001742079666, 40.607006976368396], [-73.77001285560377, 40.60703922421976], [-73.7700102145254, 40.60705128558923], [-73.77000025048235, 40.60709673335051], [-73.77000884974875, 40.607121713473376], [-73.77001450545818, 40.607143445505145], [-73.77001452895217, 40.607143516919805], [-73.77001456325434, 40.60714376895291], [-73.77001760359343, 40.60716327196342], [-73.7700180619659, 40.60718112181868], [-73.77001587858616, 40.60719731672403], [-73.77001104335504, 40.6072117249807], [-73.77000354472193, 40.60722438107633], [-73.76999878643595, 40.60723004393906], [-73.769993369065, 40.607235282805426], [-73.76996315560298, 40.607259546295985], [-73.76988784485623, 40.607313508270565], [-73.76985535749172, 40.60733899952773], [-73.76976899709642, 40.60741074266819], [-73.76974492340653, 40.60743289278435], [-73.76972484641294, 40.60745363561274], [-73.7697110570677, 40.607470988677434], [-73.76970030178391, 40.60748912180668], [-73.76969288938248, 40.607507468029716], [-73.76968900989174, 40.60752561493523], [-73.76968855777348, 40.607536816733024], [-73.76968970945995, 40.6075489669464], [-73.76969718031438, 40.60757860935677], [-73.76970211276303, 40.60759097471478], [-73.76970929856138, 40.607604038495026], [-73.7697521300489, 40.60766260402667], [-73.7697607528582, 40.60767718246931], [-73.76976659007242, 40.60769076456131], [-73.7697701968254, 40.6077036404038], [-73.76977235935462, 40.60771716186028], [-73.76977241260262, 40.607746212937585], [-73.76976677311299, 40.607778044157016], [-73.76975533215408, 40.60781326778836], [-73.76970592739838, 40.60792694099788], [-73.76970090617823, 40.60794387018821], [-73.76969151386992, 40.60798820197771], [-73.76968721740275, 40.608000728266965], [-73.76968186242391, 40.608011623209634], [-73.76967128998126, 40.60802770362672], [-73.76965766717895, 40.60804472262901], [-73.76965760798781, 40.608044803762226], [-73.76965731146738, 40.60804511829115], [-73.76960694482013, 40.60809849110895], [-73.76958957749022, 40.60811860038658], [-73.76950882786181, 40.60822781620049], [-73.76947829292341, 40.60826637874011], [-73.76946420453096, 40.60828114552284], [-73.76944853940672, 40.60829392910921], [-73.76943176069963, 40.60830435047032], [-73.76941417394845, 40.60831222174791], [-73.76940167237193, 40.608315988363856], [-73.76938718798358, 40.608318813336915], [-73.76933748366145, 40.60832402646428], [-73.76931943037118, 40.60832682784867], [-73.769299481436, 40.60833145233542], [-73.76928031925691, 40.60833708675856], [-73.76926228969427, 40.60834364251946], [-73.76924561573853, 40.60835102876289], [-73.76923055805143, 40.608359130919716], [-73.76921716314595, 40.60836791105494], [-73.76920552729723, 40.608377307208926], [-73.76919569817498, 40.60838726486325], [-73.7691790720129, 40.60840809745203], [-73.76916395114543, 40.60843071507354], [-73.76915015931363, 40.60845536146521], [-73.76913743491646, 40.60848248642137], [-73.769117804581, 40.608534741012946], [-73.76907784265943, 40.60866134609502], [-73.7690280579699, 40.60880254804337], [-73.76901324996051, 40.60885084001258], [-73.76900175529865, 40.60889474534333], [-73.76898858447721, 40.60895510674909], [-73.76897685578123, 40.60901835473809], [-73.76896647581314, 40.60908505403272], [-73.7689572722044, 40.60915629339664], [-73.76895214115504, 40.60920131821295], [-73.76895070639367, 40.60923021317384], [-73.76895228222197, 40.6092564665492], [-73.76895714023856, 40.60927991805636], [-73.76896899693551, 40.60931607885401], [-73.76898446840087, 40.60935567038207], [-73.76900078034787, 40.609391553487406], [-73.76903693493541, 40.60947111456458], [-73.76906734519808, 40.60953713992963], [-73.76908776343276, 40.609578325038484], [-73.7691085136945, 40.60961554957389], [-73.76912963328095, 40.60964845224971], [-73.76913964340078, 40.60966166547592], [-73.76915128441289, 40.609674745942776], [-73.76917976560823, 40.60970087375623], [-73.76921556009525, 40.60972739402596], [-73.76926359313588, 40.60975796492355], [-73.76930923097416, 40.60978428747008], [-73.76941724136196, 40.6098430207667], [-73.76946722660614, 40.60987283021983], [-73.76950134222372, 40.609896248070775], [-73.76957257646704, 40.60994953965], [-73.7696019995385, 40.60996952761247], [-73.76966090947737, 40.61000587377956], [-73.76971531021152, 40.61003699685999], [-73.76976745552511, 40.610064188671736], [-73.76981818454574, 40.610087875418095], [-73.76982838609898, 40.61009216718075], [-73.76985762894924, 40.61010446980088], [-73.76990145566118, 40.610121550569865], [-73.77001763216501, 40.610162964525784], [-73.77014896854337, 40.610208099859044], [-73.77019373076314, 40.61022134629524], [-73.77023486320056, 40.610231604605076], [-73.77024458117825, 40.61023328022782], [-73.77025485957076, 40.61023410223413], [-73.77026559974071, 40.61023405183104], [-73.77027667569713, 40.61023313798061], [-73.77028797772111, 40.61023136816997], [-73.77029925976277, 40.610228761340544], [-73.77031028441786, 40.61022537917164], [-73.77032080237387, 40.61022129454294], [-73.77032436638449, 40.6102194456048], [-73.77032759987875, 40.61021712005475], [-73.77033053985504, 40.6102142981982], [-73.77033324566118, 40.6102109176651], [-73.77033731097586, 40.61020405439635], [-73.77034527335127, 40.61018728535329], [-73.77034989420949, 40.61018021629505], [-73.7703523373575, 40.61017752847406], [-73.77035498094149, 40.610175236925734], [-73.77035785802019, 40.61017331692192], [-73.77036098383705, 40.61017174654638], [-73.77038237359653, 40.61016384636806], [-73.77040557876032, 40.61015758020957], [-73.77043045720318, 40.610152982966994], [-73.77045679265326, 40.610150108487176], [-73.77048443534659, 40.61014897573584], [-73.7705129103782, 40.61014960956341], [-73.77054178049336, 40.610152017305175], [-73.77057050360519, 40.610156135390476], [-73.77058023384357, 40.6101582083894], [-73.77058919293884, 40.610160792656266], [-73.77058996001047, 40.61016101867684], [-73.77060921844134, 40.61016882009694], [-73.77062780467537, 40.61017936581403], [-73.77064497700059, 40.61019221508597], [-73.77066798471779, 40.610215520962484], [-73.77071371980345, 40.61027240823682], [-73.77072621280226, 40.610285113635726], [-73.77073890354532, 40.610295800864215], [-73.77076212825757, 40.61031130865436], [-73.77078978749671, 40.61032592665456], [-73.77082244546227, 40.610340002437646], [-73.77086443569365, 40.61035542348201], [-73.77091857291383, 40.61037396382913], [-73.77095493259962, 40.61038405974893], [-73.77098868403316, 40.610389935584955], [-73.77100447736629, 40.61039116488701], [-73.77101975640439, 40.610391276577886], [-73.77102585543037, 40.61039083857602], [-73.77103212068106, 40.61038987720768], [-73.77104543864475, 40.61038633820573], [-73.7710862987221, 40.61036941718363], [-73.77110034057867, 40.61036459181746], [-73.77111357298146, 40.61036189799134], [-73.77111984842713, 40.610361424149346], [-73.77112600479279, 40.61036150827835], [-73.7711689452305, 40.610364990268245], [-73.77119969623142, 40.61037030119035], [-73.7712289122568, 40.61037905814711], [-73.77124075766046, 40.610384160715654], [-73.77125101879477, 40.61038983710174], [-73.7712912175345, 40.61041752596299], [-73.77136135007882, 40.61047169694773], [-73.7713897690596, 40.610492528309244], [-73.7714934010843, 40.61056422777396], [-73.77149370721929, 40.61056444466316], [-73.77156633578339, 40.61061469325633], [-73.7716783827704, 40.6106928023703], [-73.77175068390629, 40.610745735191124], [-73.77177270190808, 40.61076523897404], [-73.77177276151261, 40.610765294042025], [-73.77179266153695, 40.61078883677322], [-73.77181070491237, 40.610816689532804], [-73.77182798309488, 40.6108505205691], [-73.77183567042678, 40.610869501343835], [-73.77185132437893, 40.610915089557274], [-73.77186131675909, 40.61093724456386], [-73.77187277684048, 40.610955052578454], [-73.77190585729397, 40.61099785702015], [-73.77191334262928, 40.61101040794046], [-73.77191837105117, 40.61102222221602], [-73.77194457459913, 40.6111103555345], [-73.77197043212044, 40.6112059792419], [-73.7719796331746, 40.61123161744909], [-73.77198997844316, 40.61125384451127], [-73.77199000196882, 40.611253907716595], [-73.77199003780456, 40.61125397094622], [-73.77199007357872, 40.611254052269096], [-73.77200909650384, 40.61128557231708], [-73.7720532149166, 40.61134901093654], [-73.77211190787796, 40.61143890990163], [-73.77211789530061, 40.61144672027096], [-73.7721252314717, 40.61145424516313], [-73.7721438888505, 40.611468402542336], [-73.77216765565773, 40.61148122779965], [-73.77219408886714, 40.611491645073976], [-73.772195965905, 40.61149237838507], [-73.77221438055132, 40.611497664583986], [-73.77223450234523, 40.61150167675028], [-73.77225630686416, 40.61150442086574], [-73.77227984029001, 40.61150589149225], [-73.77235885560256, 40.611506317561414], [-73.77235963567736, 40.611506282249785], [-73.77245013985568, 40.61150240908259], [-73.7725317703667, 40.61149506030717], [-73.77263219715753, 40.61148144552586], [-73.77268245759265, 40.611473053031155], [-73.77272806684849, 40.61146363357612], [-73.77277007489664, 40.611452973464196], [-73.77280893259515, 40.61144094677056], [-73.77291336710068, 40.611402989418536], [-73.77304604538075, 40.6113500764281], [-73.77317979315391, 40.61129528186083], [-73.77326368427093, 40.61125874165951], [-73.77330125585432, 40.61123931064123], [-73.77331668625673, 40.61122934508988], [-73.773330120849, 40.611219051096064], [-73.77334370614358, 40.61120638970322], [-73.77335673062024, 40.611191665417344], [-73.77336952707269, 40.611174561928834], [-73.773383685269, 40.611152950391634], [-73.77339309446671, 40.61113458978192], [-73.77339979420599, 40.61111385446016], [-73.77340383065187, 40.61109080935154], [-73.77340389078967, 40.611090448779], [-73.77340563790028, 40.61106301306704], [-73.77340520518642, 40.611051512485744], [-73.77340338988809, 40.611039649157746], [-73.77339559311453, 40.61101456383304], [-73.77338222622511, 40.610987315106684], [-73.77336131902807, 40.61095385476212], [-73.7733244987483, 40.61090188452717], [-73.77323628183373, 40.61078552461406], [-73.77319873884215, 40.61073086959151], [-73.77316210701994, 40.61067196629814], [-73.7731307266893, 40.610618368630945], [-73.77304946279641, 40.610463119592424], [-73.773019690345, 40.610416279523584], [-73.77295676540665, 40.61033058652429], [-73.77293272002777, 40.61029549117771], [-73.77291139315624, 40.61026016565034], [-73.77289590086995, 40.61022937360428], [-73.772884997904, 40.610200643531165], [-73.77287854345656, 40.61017342532192], [-73.77287840879376, 40.6101715251035], [-73.77287865131598, 40.6101696350119], [-73.77287923617226, 40.61016778999218], [-73.77288018741419, 40.61016596328696], [-73.77288150513638, 40.61016419175308], [-73.77288316631983, 40.61016245691658], [-73.77288751313765, 40.610159161320624], [-73.77289320683816, 40.610156119344964], [-73.772900070499, 40.61015344958591], [-73.77290788845032, 40.61015122298471], [-73.77291637813553, 40.610149528108415], [-73.7729341192848, 40.610147987039554], [-73.77294255492997, 40.61014821998454], [-73.77295028088521, 40.6101491273411], [-73.77295702145892, 40.610150653615136], [-73.77296268686534, 40.610152762945724], [-73.77296508104024, 40.61015403738109], [-73.77296717978257, 40.61015543755019], [-73.77296895866235, 40.61015697211622], [-73.77297042983133, 40.61015862300996], [-73.77299992670021, 40.610199383907386], [-73.77306601457155, 40.61029673598037], [-73.77339019496708, 40.61075314800841], [-73.77340971200925, 40.61078269915479], [-73.77342761373566, 40.61080980202038], [-73.77349222861594, 40.6109170832587], [-73.77351890708198, 40.61095946065268], [-73.77354839797641, 40.61100218567637], [-73.77357751691721, 40.6110394789879], [-73.77360460444339, 40.61106958244737], [-73.77367760714131, 40.611142705083424], [-73.77370915833684, 40.611177356686206], [-73.7737449292238, 40.611221786404634], [-73.77376767753121, 40.61125622247544], [-73.77378104179124, 40.61128430946837], [-73.77379138951497, 40.61131637102398], [-73.77379900757467, 40.611352342874014], [-73.77380720929449, 40.61140784143564], [-73.77380978495356, 40.611432583240706], [-73.77381081335125, 40.611460275881086], [-73.77380863014407, 40.61154996353017], [-73.77380884252659, 40.61158168130349], [-73.77381102073075, 40.61161168141205], [-73.77381536140189, 40.61163869704945], [-73.77382415413824, 40.61167302439311], [-73.77384727397728, 40.61174793881712], [-73.77385497769873, 40.611779283162846], [-73.77388591019262, 40.611937197679545], [-73.77391081130263, 40.612041049611385], [-73.77391703488719, 40.61208027079028], [-73.77392076775064, 40.612094902451915], [-73.7739239440798, 40.612102500800724], [-73.7739278681188, 40.61210917183659], [-73.7739326342091, 40.612115035361], [-73.77393827753895, 40.61212015175367], [-73.77394229745471, 40.612122789705175], [-73.77394430327868, 40.6121237390188], [-73.77394630995796, 40.612124435699705], [-73.77394831660732, 40.61212488158879], [-73.7739503249933, 40.61212507434425], [-73.77395234585147, 40.612125024541434], [-73.77395435588404, 40.61212473096199], [-73.7739563775416, 40.61212418544094], [-73.7739584015895, 40.61212338846286], [-73.7739624744208, 40.612121046368415], [-73.77396659812177, 40.61211770422277], [-73.77397078374364, 40.612113344289575], [-73.77398539252552, 40.61209136466629], [-73.77400930728074, 40.6120431888255], [-73.77401764033394, 40.612028472162585], [-73.77405276935937, 40.61197332182517], [-73.7740809475436, 40.6119256939622], [-73.77409284355927, 40.61190221412751], [-73.77411806047178, 40.61184285571593], [-73.7741312788372, 40.61181616324954], [-73.77413182408637, 40.611815362859815], [-73.77413250067724, 40.61181466207327], [-73.77413332974614, 40.611814051047034], [-73.77413430026861, 40.61181353964375], [-73.77413541249396, 40.61181311915227], [-73.77413664243689, 40.611812796562006], [-73.77413801402106, 40.6118125829765], [-73.77413949166653, 40.61181246894438], [-73.77414282314955, 40.61181254736078], [-73.77414652034192, 40.61181304163379], [-73.77415045182457, 40.61181394028045], [-73.77415446562193, 40.61181519977985], [-73.77416205233125, 40.611818600792404], [-73.77416525980846, 40.61182057003741], [-73.77416789935114, 40.61182263767906], [-73.77416988911098, 40.6118246948298], [-73.77417063107842, 40.61182572274073], [-73.77417119391467, 40.6118267415883], [-73.77417159328917, 40.61182773330986], [-73.77417180232338, 40.61182871527586], [-73.77417184679693, 40.6118296699464], [-73.77417171308002, 40.611830597461996], [-73.774161726854, 40.611865619651276], [-73.77414786993229, 40.611903603526855], [-73.7741301655297, 40.61194489725949], [-73.77410192392666, 40.61200510278893], [-73.77408950538367, 40.61202740570797], [-73.77405335830696, 40.61208262542263], [-73.77404497735554, 40.61209895865359], [-73.77403932881545, 40.61211414884065], [-73.77403522797262, 40.61213158629511], [-73.77403265331083, 40.61215119826687], [-73.77403016171108, 40.612218812626736], [-73.7740276516538, 40.61224473020021], [-73.77400830908317, 40.61235765948454], [-73.77398615369667, 40.61245779570801], [-73.77397767570855, 40.61248913519638], [-73.7739697707448, 40.61251841821367], [-73.77394965118486, 40.612584257775346], [-73.77392543466452, 40.612656751420296], [-73.77389100971483, 40.61275422573868], [-73.77384604655711, 40.61287380911937], [-73.77382494541348, 40.61292460023349], [-73.77380379155755, 40.612971799407745], [-73.7737736886651, 40.61303047834605], [-73.77371081639753, 40.61313984431636], [-73.77368650717207, 40.61318455916043], [-73.77364588445435, 40.613268611302004], [-73.7735758160344, 40.6134272535469], [-73.7735466529197, 40.613490419876555], [-73.7735141321426, 40.61355476753436], [-73.773481748665, 40.61361161063556], [-73.77346587818103, 40.613635469564464], [-73.77345045782228, 40.613653395149335], [-73.77345031409877, 40.61365351012634], [-73.77343386792192, 40.6136667877601], [-73.77342509849096, 40.6136720153198], [-73.77341596206944, 40.61367629561389], [-73.77339803484179, 40.61368296748421], [-73.77338277882686, 40.6136870541096], [-73.77337035980797, 40.61368919578096], [-73.77336232912107, 40.61368901911916], [-73.77335608646888, 40.61368855280565], [-73.77332964754102, 40.613684430711444], [-73.77329896191252, 40.61367497196102], [-73.77326127524387, 40.61365136745161], [-73.77321979995166, 40.613631797089205], [-73.77317696868322, 40.61361842478523], [-73.7731332193545, 40.61360690709986], [-73.77304977884343, 40.61359451210485], [-73.77296528060725, 40.61358740749043], [-73.7728803012121, 40.61358564173448], [-73.77279542050722, 40.61358922688536], [-73.77271121766803, 40.61359813848014], [-73.77262826724544, 40.61361231571145], [-73.77252205525943, 40.61364825941569], [-73.77241812289253, 40.613687884674846], [-73.77231668973992, 40.613731107767585], [-73.77221797011781, 40.6137778373709], [-73.77215915970974, 40.61381372551739], [-73.77209575329097, 40.61384473767983], [-73.77202844410407, 40.61387053478952], [-73.771957968065, 40.613890834795654], [-73.77187500460022, 40.6139086087822], [-73.77179004380021, 40.61391961497738], [-73.77170403355123, 40.61392373058756], [-73.771654144762, 40.613924710645136], [-73.77160464827602, 40.61391985236653], [-73.77157232045141, 40.613913391685294], [-73.77154415104286, 40.61390284819679], [-73.77151470107658, 40.613894582888705], [-73.77149192825127, 40.61388992737643], [-73.77141220326567, 40.613890766362616], [-73.7713326800468, 40.61389516680603], [-73.77127396321097, 40.61390072517808], [-73.771215619475, 40.613908225831494], [-73.77112286825097, 40.61392432219383], [-73.771031821726, 40.61394532343614], [-73.7709429259498, 40.6139711266706], [-73.77091678395117, 40.61397276719949], [-73.77089122605439, 40.61397726480554], [-73.77086678706019, 40.613984525376075], [-73.77084397835702, 40.61399439698316], [-73.77080663362396, 40.61400979861785], [-73.77076680152705, 40.61402101149677], [-73.77072528617398, 40.614027809260314], [-73.77068292565424, 40.61403005467906], [-73.77064057511912, 40.61402770242352], [-73.77038968748185, 40.614044682072375], [-73.77019814694472, 40.61406330653122], [-73.77010609275644, 40.61406317623786], [-73.77006907432802, 40.61406201308636], [-73.77002788909296, 40.6140592555852], [-73.76985886892095, 40.614043033167775], [-73.76965068224214, 40.61403117088185], [-73.76963849147283, 40.61402992934977], [-73.76962599613113, 40.61402782442917], [-73.76959938519454, 40.61402089082527], [-73.76957481264448, 40.61401222402047], [-73.76951917147099, 40.61399014801285], [-73.76949266011108, 40.61398137846054], [-73.76946947006188, 40.61397598290578], [-73.76944759498394, 40.61397341704376], [-73.76940997385499, 40.61397218060091], [-73.76937109456867, 40.61397254337085], [-73.76933085131219, 40.61397452507587], [-73.76928901812339, 40.61397811587945], [-73.76924563215687, 40.61398331417909], [-73.76920000707541, 40.61399018393143], [-73.76915158682361, 40.61399881247275], [-73.76909892905647, 40.61400944987172], [-73.76902068965084, 40.61402631317462], [-73.76896496255547, 40.61403933884359], [-73.76891513219671, 40.61405241319663], [-73.76887037118318, 40.614065832110235], [-73.76858268472621, 40.61416176216617], [-73.76846044441163, 40.61420061738405], [-73.76841416033392, 40.61421360802995], [-73.76837140539077, 40.614224165701835], [-73.76835465017773, 40.61422714847352], [-73.76833706074915, 40.61422865345921], [-73.76831847311404, 40.61422867848521], [-73.76829854249856, 40.614227243462224], [-73.76825921241463, 40.6142211393147], [-73.7681828504966, 40.61420436172427], [-73.76815131971195, 40.614198489046444], [-73.76811864665672, 40.61419476714477], [-73.76808937643767, 40.61419447472638], [-73.76803145576746, 40.61419976068117], [-73.76789952592243, 40.614218188647286], [-73.76786697167925, 40.6142211406185], [-73.76783729461303, 40.61422240416597], [-73.76778765465387, 40.614221403090404], [-73.76766549195821, 40.614214042266255], [-73.76763170757866, 40.61421381147214], [-73.76760132093918, 40.6142153085681], [-73.7675607760041, 40.61421920708899], [-73.76754530082158, 40.614221131702], [-73.7675186061643, 40.61422445276445], [-73.7674275279154, 40.61423919037484], [-73.76737638307308, 40.614249820664746], [-73.76726342522326, 40.61427650864115], [-73.76721373576882, 40.61428641338739], [-73.76715921956162, 40.61429454290923], [-73.76710253635196, 40.61430041558083], [-73.76704379234957, 40.61430402508025], [-73.76698308457676, 40.61430535183291], [-73.76694157398309, 40.61430453808634], [-73.76690019985251, 40.61430185212442], [-73.76685925777915, 40.61429732034635], [-73.76681903151112, 40.614290961923935], [-73.7667529623521, 40.614261005953615], [-73.76669071688973, 40.61422662157113]]]}}, {\&quot;id\&quot;: \&quot;86\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 87, \&quot;Shape_Leng\&quot;: 0.0369015496117, \&quot;Shape_Area\&quot;: 6.72050210692e-05, \&quot;zone\&quot;: \&quot;Financial District North\&quot;, \&quot;LocationID\&quot;: 87, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00372234899996, 40.70693234399989], [-74.00360537999994, 40.706780592999905], [-74.00316110499998, 40.70623201399992], [-74.00306957, 40.706142802999885], [-74.0030261529999, 40.70610867499988], [-74.00299474599991, 40.70608024599991], [-74.00295417200002, 40.706027114999934], [-74.00256965079724, 40.705523579761724], [-74.00268512768783, 40.70544924811862], [-74.00236285311736, 40.7051589666926], [-74.00241573476919, 40.705129311282505], [-74.00238385458334, 40.705101270250836], [-74.00197070397937, 40.7047378684872], [-74.00197014837809, 40.704731159202304], [-74.00217184941894, 40.70460659646366], [-74.00218562331561, 40.70460701887392], [-74.00233344621154, 40.70474813530697], [-74.00233393075767, 40.70474260740423], [-74.00242059318663, 40.70468033460375], [-74.0024307107586, 40.70467785800438], [-74.00248839829254, 40.70472677235117], [-74.00248790148628, 40.704733761091624], [-74.00239832748949, 40.70479492514084], [-74.00238670740669, 40.70479566367449], [-74.00332307270776, 40.70562859522001], [-74.00358262337747, 40.70546112883118], [-74.00363187169316, 40.70542980675177], [-74.00360802644228, 40.70540778137035], [-74.00355934714837, 40.705438338158096], [-74.00287843069457, 40.70483135798975], [-74.00297246475286, 40.704766492442566], [-74.00358383172679, 40.70530161130755], [-74.00364968772803, 40.705377950512094], [-74.00362197523796, 40.705398899984345], [-74.00364446183858, 40.70542168463882], [-74.00383327532252, 40.70530324302638], [-74.00394758957431, 40.705402871900304], [-74.0043834441722, 40.7051132598548], [-74.00426687037424, 40.70501166020209], [-74.00458622952459, 40.70479945067928], [-74.00459003883662, 40.70478775294495], [-74.00349632042315, 40.70379676926777], [-74.00351016434425, 40.70378808825903], [-74.00371987043046, 40.70365448194469], [-74.00396975693849, 40.70388164511804], [-74.00480628900739, 40.70464206905123], [-74.00484062824778, 40.704639779526524], [-74.00492037826484, 40.70459100497326], [-74.00518805067318, 40.704420535690545], [-74.00511107204132, 40.704350605261965], [-74.00508460380269, 40.704366355828846], [-74.00492580498366, 40.70421180838465], [-74.00500393507072, 40.70416531254446], [-74.00516296842157, 40.70432009323669], [-74.00513867768034, 40.70433455643976], [-74.00521160900396, 40.70440553223528], [-74.00526035829189, 40.704374488410075], [-74.0053502722475, 40.70431007996148], [-74.00418492090171, 40.703248066176315], [-74.00418130143021, 40.703250361430186], [-74.0041574215416, 40.703231632087295], [-74.00416265161378, 40.703227768889136], [-74.00420723493835, 40.70319937375783], [-74.00411763228837, 40.70311193702741], [-74.004272587521, 40.70301566641148], [-74.00429788566103, 40.70301726836962], [-74.00432634521925, 40.70304454424587], [-74.00434743166828, 40.703046947298816], [-74.00436534740585, 40.70307021681555], [-74.00438643514065, 40.70308866795962], [-74.00441805325255, 40.70311673525835], [-74.00444124738806, 40.703137598367604], [-74.00448447402037, 40.70317690392736], [-74.00462520935534, 40.70330003518526], [-74.00462626412609, 40.703314479168114], [-74.00465050979112, 40.70332972316352], [-74.00466632025643, 40.70334817446862], [-74.00467686257008, 40.70334817404074], [-74.00474855169037, 40.703419564148824], [-74.0048022288324, 40.70348400677523], [-74.00483652285267, 40.703512926391674], [-74.00498836312711, 40.703637436151816], [-74.0050337744232, 40.7036749205554], [-74.00510304451781, 40.70373114347389], [-74.00520771937107, 40.70382133725155], [-74.00527929789541, 40.703875218096265], [-74.00534891537728, 40.70392373409762], [-74.00535945878065, 40.703919725687555], [-74.0053963553808, 40.703942183324386], [-74.00538791847218, 40.703949405145195], [-74.00559242542963, 40.70408256373169], [-74.00560507496257, 40.70408496696345], [-74.00563775955965, 40.70410583053918], [-74.00566330640648, 40.7041042444782], [-74.00589012878147, 40.70395873810608], [-74.00601862724882, 40.70387315289086], [-74.00614010577931, 40.70397866027171], [-74.00634162385869, 40.703848533682745], [-74.00643225275432, 40.70379036104623], [-74.00659591913875, 40.70368590245183], [-74.00634518899977, 40.70348864644174], [-74.00632434161025, 40.70346987449462], [-74.00591217944537, 40.70309876190139], [-74.00588747266426, 40.70307651522387], [-74.0054838408244, 40.70271432213403], [-74.00552682615245, 40.70268528761711], [-74.00550531272066, 40.70266684658552], [-74.00547130861277, 40.70268982908357], [-74.00543599763346, 40.70265955541132], [-74.00542728826254, 40.70266543619403], [-74.00530412596079, 40.70255986563306], [-74.00549427805105, 40.70243138195557], [-74.00550166067457, 40.70243086779703], [-74.00561361797617, 40.702530242032324], [-74.00560163196401, 40.70253805976984], [-74.00560905264518, 40.70255281855374], [-74.00559479485831, 40.70256802032948], [-74.00559935100472, 40.702580167839244], [-74.00559022977765, 40.70258581428382], [-74.00559194611432, 40.702598835921144], [-74.00558509547798, 40.70260405020236], [-74.00558909594902, 40.70261273059688], [-74.00553546138171, 40.70264552110693], [-74.0055577199881, 40.702664394651975], [-74.00567522249852, 40.70258407270014], [-74.005984303395, 40.702860018041086], [-74.00623870508527, 40.70307978930156], [-74.0063637273041, 40.70318779225255], [-74.00649425191104, 40.703300548171775], [-74.00654880812648, 40.70336761508583], [-74.00655720878508, 40.70336314833331], [-74.00675541584022, 40.70354148947679], [-74.00678502191047, 40.70356812790525], [-74.00699466002446, 40.70344118856669], [-74.00722046663674, 40.70330197730327], [-74.007519052838, 40.70312182023711], [-74.00752714979265, 40.70311498141609], [-74.00760498189766, 40.70299314132918], [-74.00763657899991, 40.70300436799988], [-74.0077967509999, 40.703063514999876], [-74.00782878499996, 40.70308642199992], [-74.00785483099992, 40.70310778999987], [-74.00797948599994, 40.703188755999875], [-74.00854172499996, 40.70369761199989], [-74.00898541299989, 40.70407915999986], [-74.00907940599997, 40.70416904299986], [-74.00945463899993, 40.7045278569999], [-74.00974639299997, 40.704775247999905], [-74.00998418599995, 40.70514773299991], [-74.00999520599994, 40.705331238999904], [-74.0098658089999, 40.705796426999925], [-74.01118994199994, 40.706278727999916], [-74.01187330299993, 40.706551406999864], [-74.01240001199992, 40.70678480799989], [-74.01250773999998, 40.706767065999934], [-74.01194691399999, 40.7074515319999], [-74.01170249899995, 40.707755712999834], [-74.01124834999997, 40.708304700999854], [-74.01118228399991, 40.70838557399989], [-74.01101198499991, 40.70859402199989], [-74.01084638199993, 40.70879754499991], [-74.01054246499999, 40.70915414799992], [-74.00998739199997, 40.70980567299989], [-74.00954277299995, 40.71032749299992], [-74.00947357899996, 40.710412542999954], [-74.00906264799988, 40.71088670399992], [-74.00774466599994, 40.71022077299992], [-74.00705335899995, 40.70987195099989], [-74.00643549199992, 40.70955732099991], [-74.00551253, 40.709093407999866], [-74.0052621729999, 40.70892071099989], [-74.00505672899992, 40.70878876899998], [-74.00478782699994, 40.70840189299991], [-74.00432857299997, 40.70782349599986], [-74.00405660199985, 40.70743678099992], [-74.00392127499991, 40.70723974499993], [-74.00372234899996, 40.70693234399989]]]}}, {\&quot;id\&quot;: \&quot;87\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 88, \&quot;Shape_Leng\&quot;: 0.0352046035327, \&quot;Shape_Area\&quot;: 5.72999455414e-05, \&quot;zone\&quot;: \&quot;Financial District South\&quot;, \&quot;LocationID\&quot;: 88, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-74.00974639299997, 40.704775247999905], [-74.00945463899993, 40.7045278569999], [-74.00898541299989, 40.70407915999986], [-74.00854172499996, 40.70369761199989], [-74.00797948599993, 40.70318875499991], [-74.0078548309999, 40.70310778899988], [-74.00782878499996, 40.70308642199992], [-74.0077967509999, 40.703063514999876], [-74.00763657899991, 40.70300436799988], [-74.00760498189766, 40.70299314132918], [-74.00764555180645, 40.702928174389456], [-74.00765095550902, 40.702919839105114], [-74.00765840854532, 40.70290916746315], [-74.00770527479769, 40.702881825407246], [-74.00770614970409, 40.702875161620035], [-74.00796578643664, 40.70271815707015], [-74.0083739580163, 40.70246975865777], [-74.009127727589, 40.70200832442169], [-74.00915955533813, 40.70199730764995], [-74.00930907655483, 40.70195460302249], [-74.00869964313567, 40.701139867542174], [-74.00775549150644, 40.70154800167175], [-74.00759136204225, 40.70132808104815], [-74.00853611510765, 40.700919695745085], [-74.0083492755909, 40.7006693483882], [-74.00862036163882, 40.70055216421584], [-74.00960052263278, 40.70186548191784], [-74.01026710345066, 40.70169866881413], [-74.01083741653544, 40.70155334480754], [-74.01116664151876, 40.70147720220832], [-74.01109588602684, 40.70127499934889], [-74.01111949092332, 40.701268748305765], [-74.01112667396998, 40.701274996376725], [-74.01128983905525, 40.70124998224428], [-74.0112097577877, 40.701044583273756], [-74.01112868539599, 40.701064897450436], [-74.0110783797454, 40.70095712031517], [-74.0110670856897, 40.70091494089483], [-74.01110886351543, 40.7009014206063], [-74.0110951435839, 40.7008665271816], [-74.01109514108846, 40.700851532992615], [-74.01108063438, 40.70085194885256], [-74.01105929378232, 40.700811562771484], [-74.01106312665488, 40.70080281982734], [-74.01104287442345, 40.70075743496105], [-74.011021525765, 40.70074120110607], [-74.01103575886044, 40.700731617687474], [-74.01102699993733, 40.700712878931306], [-74.01101386500967, 40.70071163747197], [-74.01100072817277, 40.700690819617186], [-74.01101659417203, 40.70068415386645], [-74.01101221338783, 40.700668746136365], [-74.01099990958122, 40.70067374615791], [-74.01097965965197, 40.700645849111844], [-74.01099825777675, 40.700635024239574], [-74.01097034745736, 40.70057548420756], [-74.01094845841567, 40.70057631454651], [-74.01093752366046, 40.7005671573749], [-74.0109386101689, 40.7005563341749], [-74.01096049734583, 40.70053884409263], [-74.0109344927399, 40.700487624779925], [-74.01092027169815, 40.70049262380237], [-74.01090112139877, 40.70046223399988], [-74.01092026515036, 40.70045265012994], [-74.01081026034738, 40.70023406243364], [-74.01082511780585, 40.70020930486715], [-74.01083751798708, 40.70020722317945], [-74.01093093205073, 40.700415152334415], [-74.01100364429968, 40.70058110994409], [-74.01104377249544, 40.70068284521962], [-74.01107427475966, 40.70074833789612], [-74.01110436404349, 40.700810649429386], [-74.01113362222917, 40.70086787440548], [-74.01115033556829, 40.70089840010092], [-74.01135836291361, 40.70085195863628], [-74.0113031892115, 40.700647844036354], [-74.01129816432261, 40.70059888503188], [-74.01130986410945, 40.70057980119103], [-74.01133409410409, 40.70056835368226], [-74.01136082267426, 40.700565810999194], [-74.0113817187564, 40.7005702571179], [-74.01139508123386, 40.700590607673846], [-74.01143269912247, 40.70067454111621], [-74.011469474374, 40.70074892825803], [-74.011502911437, 40.70081505897416], [-74.0117292681748, 40.700770118059616], [-74.01170009248334, 40.700721538635975], [-74.011682753977, 40.70069334506204], [-74.01166539833068, 40.700637560590245], [-74.01163149614034, 40.70055539174732], [-74.01161019835872, 40.70049300642145], [-74.01161413587107, 40.70047261846256], [-74.01163147918638, 40.7004582182481], [-74.01167798034295, 40.70046181520738], [-74.01170321011998, 40.70048100238685], [-74.01172605835686, 40.70047860442191], [-74.01175129264924, 40.70053078758623], [-74.0117773082774, 40.70057097487754], [-74.01182619233424, 40.700666342782014], [-74.01183407601519, 40.70068613447612], [-74.01184827026111, 40.700729925805916], [-74.01185378549594, 40.700738921450146], [-74.01199159781133, 40.70070483146649], [-74.01208668214687, 40.70068130873922], [-74.01208509377949, 40.70066451480386], [-74.0120693217167, 40.7005997333441], [-74.01203856797002, 40.700528956309654], [-74.0119767064249, 40.7003784242992], [-74.01190488098494, 40.700226930002], [-74.01185672556994, 40.70010710340836], [-74.01193096316563, 40.70005120965432], [-74.01196196116912, 40.70003754559547], [-74.01204027930196, 40.70004809164558], [-74.01208842091677, 40.7000865836894], [-74.01212759506136, 40.7001430865068], [-74.01215779158525, 40.700211378648156], [-74.01217247961002, 40.700233115597726], [-74.01223694549928, 40.70032127784431], [-74.01225490284888, 40.70036473434146], [-74.01231855974255, 40.70048828759264], [-74.01236222440257, 40.70057582996201], [-74.01239160032279, 40.70062052809406], [-74.01259392327509, 40.700570833472426], [-74.01259064684221, 40.70051185050813], [-74.01255471870927, 40.700359730657794], [-74.01252899955234, 40.70025232035699], [-74.01251593564186, 40.70018464848017], [-74.01251511280114, 40.700150492110794], [-74.01254202780153, 40.7001349741483], [-74.01261382087365, 40.7001082658111], [-74.0126480885809, 40.70011508828302], [-74.01268072728439, 40.70014675538139], [-74.0127349915856, 40.70021877320353], [-74.01279619139247, 40.70030009988461], [-74.01283454933404, 40.70035287473442], [-74.01286637756563, 40.700407513371665], [-74.01288188403379, 40.700441659886145], [-74.01290474249377, 40.70049691216282], [-74.01290881793962, 40.70052361169349], [-74.01300205335563, 40.700516028968046], [-74.01310747847366, 40.70050745218069], [-74.01311155389506, 40.7004720530446], [-74.01311153191459, 40.70036029060313], [-74.01309395831619, 40.70022369323981], [-74.01307843485947, 40.70010324258431], [-74.01302495705559, 40.699882830206], [-74.0130118926586, 40.69981825663122], [-74.01302085702764, 40.699793419367936], [-74.01304370092431, 40.699774784735816], [-74.01311303826309, 40.69977416588525], [-74.01314078965082, 40.69980333792552], [-74.01315384897737, 40.69984494048546], [-74.01316691626799, 40.699931244337535], [-74.01317753563323, 40.7000175474625], [-74.01318571684631, 40.70010323034394], [-74.01320084197312, 40.70023982797609], [-74.01320736787193, 40.700275216518826], [-74.01322288016905, 40.700333586085485], [-74.0132734948308, 40.7004968702278], [-74.01348560832729, 40.700478222908394], [-74.01348068493708, 40.700357771068354], [-74.01348311536108, 40.70026338811632], [-74.01350349660855, 40.700176459528265], [-74.01353285018102, 40.70010816142327], [-74.01358669315087, 40.70007959034501], [-74.01361029865362, 40.7000842982948], [-74.01367479307396, 40.70012582122537], [-74.01366274984949, 40.700136656517614], [-74.01364265243346, 40.700161782904686], [-74.01361182284575, 40.700245174325296], [-74.01357049004972, 40.700232202686955], [-74.01356130915947, 40.70029512207909], [-74.01353310202803, 40.70029712412281], [-74.01353047798223, 40.70031110017328], [-74.01356131218263, 40.70031009779257], [-74.01356034122136, 40.70036653321862], [-74.01352950894581, 40.70037352406205], [-74.01353147488012, 40.70038201609177], [-74.01356297105794, 40.700380013103185], [-74.01355970574456, 40.70043893421369], [-74.0135236177836, 40.700441937789115], [-74.01352295909443, 40.70046041520351], [-74.01358070009414, 40.70045691424639], [-74.0135854179925, 40.70050191287807], [-74.01355283214755, 40.70050335758483], [-74.01357712861271, 40.70064368123795], [-74.01351039646312, 40.70065037107601], [-74.0135582697974, 40.70093987091524], [-74.01395152778245, 40.70099098222993], [-74.01415893499998, 40.70109628999988], [-74.01376867899998, 40.7011432629999], [-74.01377528899994, 40.70118271299988], [-74.01378191199989, 40.70122215499992], [-74.01379120799997, 40.70130547599994], [-74.01389890399994, 40.702270669999976], [-74.014192151, 40.70275671099995], [-74.01442983199998, 40.70315064799991], [-74.014391769, 40.70359878299993], [-74.01425523899994, 40.704425471999905], [-74.01425342599994, 40.70445756399993], [-74.01425861399996, 40.70448944299991], [-74.01427065899998, 40.70452022899989], [-74.01428922899998, 40.70454907499989], [-74.01419226999991, 40.70457040399989], [-74.01326979499997, 40.704553495999974], [-74.01332610899989, 40.7050307879999], [-74.01335309799998, 40.70519857699984], [-74.01335946199991, 40.705368655999926], [-74.01334484799996, 40.7055388269999], [-74.01330942899993, 40.70570683099988], [-74.01325396399993, 40.705870513999905], [-74.01250773999998, 40.706767065999934], [-74.01240001199992, 40.70678480799989], [-74.01187330299997, 40.70655140599994], [-74.01118994199994, 40.706278727999916], [-74.0098658089999, 40.705796426999925], [-74.00999520599994, 40.705331238999904], [-74.00998418599995, 40.70514773299991], [-74.00974639299997, 40.704775247999905]]]}}, {\&quot;id\&quot;: \&quot;88\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 89, \&quot;Shape_Leng\&quot;: 0.122794569553, \&quot;Shape_Area\&quot;: 0.000447548142373, \&quot;zone\&quot;: \&quot;Flatbush/Ditmas Park\&quot;, \&quot;LocationID\&quot;: 89, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.95374853799996, 40.63858633799993], [-73.9536000469999, 40.63842234699991], [-73.95307699899985, 40.638446260999864], [-73.95213852299987, 40.63844349599993], [-73.95116311199983, 40.63844818299984], [-73.95017361500003, 40.63851059699987], [-73.94923295699995, 40.63854767299993], [-73.94826499699982, 40.63860718999994], [-73.94715150299994, 40.63867640599994], [-73.94638150299986, 40.638726249999905], [-73.94537272499998, 40.638786954999865], [-73.9451233509999, 40.636448278999865], [-73.94488042799988, 40.634176953999926], [-73.94462885499995, 40.63183773499993], [-73.94561754699987, 40.63177742999988], [-73.94647961799998, 40.631708161999896], [-73.9455109549998, 40.63079148299986], [-73.94480816099995, 40.630127166999884], [-73.94453995099988, 40.62986656299989], [-73.94415535299993, 40.629508284999886], [-73.94446784099986, 40.629480051999884], [-73.94540053199998, 40.62937781199983], [-73.9463262219999, 40.629276641999915], [-73.94732672199994, 40.629166566999835], [-73.94832386299989, 40.62905666099993], [-73.94925229799985, 40.628954764999925], [-73.95017656999988, 40.6288527719999], [-73.95110641899993, 40.62875046699989], [-73.9520690179999, 40.628645780999875], [-73.95303133199995, 40.62854011499994], [-73.95395983399986, 40.62843938999987], [-73.95488499199999, 40.62833554799986], [-73.95581207199996, 40.62823349199987], [-73.95684697299988, 40.62811987899991], [-73.95805293100001, 40.627971118999895], [-73.95899416299996, 40.62788559399996], [-73.95995565099992, 40.627778671999884], [-73.96014773499996, 40.628915184999876], [-73.96022560099996, 40.62925450099989], [-73.96024902900002, 40.62937062199989], [-73.96025855099994, 40.62941826299991], [-73.96040734299989, 40.6301625309999], [-73.96046280599994, 40.630155660999904], [-73.96136921599995, 40.63005838799989], [-73.96163639899993, 40.63002222299986], [-73.96182099799995, 40.630004876999855], [-73.96197454299985, 40.629995040999866], [-73.96232599399991, 40.6299687169999], [-73.96322149299982, 40.629841060999865], [-73.96414862899985, 40.62973896499996], [-73.96508072799992, 40.629654674999856], [-73.96608191399986, 40.629542706999906], [-73.96707656900001, 40.629434681999946], [-73.96800084399993, 40.62933305799992], [-73.96892915899984, 40.62923162599992], [-73.97000109799986, 40.62911347399987], [-73.97109232299984, 40.628966140999886], [-73.97136622199992, 40.62892916199996], [-73.97120750499982, 40.62808971199992], [-73.97111421999993, 40.62758588399991], [-73.97092126300004, 40.62656998499993], [-73.97108160299985, 40.62655370899987], [-73.97119209799986, 40.6265426959999], [-73.97229894799983, 40.626431167999876], [-73.97322001099991, 40.62631854299984], [-73.97414911500006, 40.626214897999894], [-73.97507611299997, 40.62611376699993], [-73.975635809, 40.62603520899995], [-73.97623453700001, 40.625976349999895], [-73.97644970399986, 40.62700825499989], [-73.9765146209999, 40.62729448999989], [-73.97657775699989, 40.627573185999886], [-73.97669604399998, 40.62835456399994], [-73.97684964299987, 40.62908858099994], [-73.97699848899988, 40.62987149599992], [-73.97716511999984, 40.63074665399988], [-73.97604935699995, 40.63127590599986], [-73.975171463, 40.631688580999906], [-73.97431883499996, 40.632090573999946], [-73.97320194999996, 40.632618080999855], [-73.97281084499981, 40.63280454799989], [-73.97241686999978, 40.632992044999874], [-73.97231136199997, 40.63304155499987], [-73.97216145999994, 40.63311162099996], [-73.97190427099986, 40.63323009399994], [-73.97087567699992, 40.63371951299991], [-73.96986869299992, 40.63419467499989], [-73.97029036199991, 40.63640634099988], [-73.96935965799996, 40.63650554999993], [-73.96803868499985, 40.636650984999925], [-73.96822343400004, 40.63729690599994], [-73.96872218399989, 40.63901853799988], [-73.968790992, 40.639255932999895], [-73.96891461099989, 40.63975715999986], [-73.9693990309999, 40.64138244599991], [-73.96948468100001, 40.641689896999935], [-73.9696861179999, 40.64235600999992], [-73.96988464699999, 40.643030296999896], [-73.9700889779999, 40.643745839999944], [-73.97031677099991, 40.64453794099992], [-73.97054554399976, 40.64531666799991], [-73.97076976099986, 40.646110906999866], [-73.97084113799984, 40.64637857099989], [-73.97121039100001, 40.647620153999924], [-73.97139631700004, 40.64825778599986], [-73.97069344099991, 40.648496775999945], [-73.96967173699989, 40.64889793599989], [-73.96879367199982, 40.649248262999926], [-73.96790948399995, 40.649599373999884], [-73.9670280919999, 40.649947273999885], [-73.96614503299999, 40.650297679999866], [-73.96526281999996, 40.65064244999991], [-73.96465438699984, 40.650887727999894], [-73.96524103499988, 40.651742046999864], [-73.96575121499994, 40.65249922899995], [-73.96621321999996, 40.653189404999885], [-73.964144226, 40.65399426399989], [-73.96190028499997, 40.65487096199992], [-73.96156461500001, 40.655004116999905], [-73.96069809399995, 40.6553409239999], [-73.95986103199981, 40.65563478899989], [-73.95969665899997, 40.65483921499991], [-73.959451838, 40.65357538799987], [-73.95932926499988, 40.652928178999915], [-73.95915000999992, 40.65214455699985], [-73.95892527299989, 40.65121154999988], [-73.9587078989999, 40.65038727299989], [-73.95844335399988, 40.64930344299989], [-73.95825517200004, 40.64853244899996], [-73.95815003599986, 40.64776767399996], [-73.95814068499989, 40.647503403999934], [-73.95810672200003, 40.64651800899988], [-73.95803664499991, 40.64530249999989], [-73.95802176499988, 40.6450699619999], [-73.95797764699991, 40.64457625599989], [-73.95791873699986, 40.64414326499991], [-73.95789394399986, 40.64401556199989], [-73.95763644599988, 40.64268949899989], [-73.95746359899987, 40.64237166999987], [-73.95707031, 40.64196067099995], [-73.95571599999984, 40.64058252599991], [-73.95563820699984, 40.64050392599988], [-73.95476763299989, 40.63962444699996], [-73.95427358399985, 40.63911553899988], [-73.95404358599993, 40.6388775489999], [-73.95374853799996, 40.63858633799993]]]}}, {\&quot;id\&quot;: \&quot;89\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 90, \&quot;Shape_Leng\&quot;: 0.0307591620819, \&quot;Shape_Area\&quot;: 5.53132476305e-05, \&quot;zone\&quot;: \&quot;Flatiron\&quot;, \&quot;LocationID\&quot;: 90, \&quot;borough\&quot;: \&quot;Manhattan\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9963368949999, 40.7380437469999], [-73.99683993899998, 40.73736088899995], [-73.99968392199986, 40.73855224899986], [-74.00252381499989, 40.73975264399995], [-74.00201937799989, 40.74044408899989], [-74.00155531499993, 40.741080025999935], [-74.00112917499989, 40.741668097999884], [-74.00070275499995, 40.74225361099988], [-74.0002751799999, 40.74283879799987], [-73.9998482359998, 40.74342501899993], [-73.99942208999991, 40.74400957299992], [-73.99897237399989, 40.74463005499994], [-73.99848652499993, 40.745294163999894], [-73.99800822000003, 40.74595130199988], [-73.99755164599995, 40.746580899999834], [-73.99709902899994, 40.74720510199991], [-73.99426258599996, 40.74600398099986], [-73.99141858599994, 40.74480268199988], [-73.9918710239999, 40.74418556999991], [-73.99206647199993, 40.74391620299988], [-73.99231888499988, 40.74356832299989], [-73.99280340900002, 40.74291001999997], [-73.99329166800001, 40.74223330099994], [-73.99373928799994, 40.74161720799987], [-73.99416492399986, 40.7410309369999], [-73.99459264899988, 40.740441980999925], [-73.99501798599992, 40.73986001099995], [-73.99544664199995, 40.7392721329999], [-73.99587409499989, 40.73868594599991], [-73.9963368949999, 40.7380437469999]]]}}, {\&quot;id\&quot;: \&quot;90\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 91, \&quot;Shape_Leng\&quot;: 0.124996624585, \&quot;Shape_Area\&quot;: 0.000537330013243, \&quot;zone\&quot;: \&quot;Flatlands\&quot;, \&quot;LocationID\&quot;: 91, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.91945472999996, 40.6401731369999], [-73.91941447399985, 40.63977466499991], [-73.91928984599986, 40.638596032999914], [-73.91917180399989, 40.63746984099993], [-73.91916482699992, 40.63740334199989], [-73.91905790399989, 40.63638510999988], [-73.9190277079998, 40.63609754399988], [-73.919006295, 40.63589361799995], [-73.91899154599992, 40.63575906299996], [-73.91895156599989, 40.63539431799991], [-73.91893983700002, 40.63528732099991], [-73.91892161299991, 40.635121060999914], [-73.91891212099982, 40.63503445999987], [-73.91889071099986, 40.6348391329999], [-73.91888284299993, 40.634767351999905], [-73.91886934599994, 40.63464421599985], [-73.91886199299982, 40.634577127999876], [-73.91885164499996, 40.634482718999955], [-73.91876282599999, 40.6336375289999], [-73.9186298239999, 40.63234687299989], [-73.91860649599992, 40.632090414999894], [-73.91824254499994, 40.62877007499986], [-73.91816260199982, 40.62800449499984], [-73.91799464599991, 40.62645772299993], [-73.91775240199999, 40.624164716999864], [-73.91770927100005, 40.6237176859999], [-73.91751556199989, 40.62194031599993], [-73.91746991599989, 40.62151242899988], [-73.91741279799999, 40.62095853099987], [-73.91726440900005, 40.61954803699993], [-73.91717137699983, 40.61871125199989], [-73.91716779499997, 40.618387961999886], [-73.91711554399998, 40.617925190999884], [-73.9170081, 40.6172019239999], [-73.91697651699978, 40.61693221199992], [-73.91690302699992, 40.61627422899993], [-73.91719587399997, 40.616091715999886], [-73.9173907319999, 40.61596630599988], [-73.91788753399999, 40.61564657999988], [-73.91862838199995, 40.615168606999916], [-73.91893348499988, 40.61496777999992], [-73.9193708869999, 40.61469022299991], [-73.9196079709999, 40.61453446399989], [-73.92010700000002, 40.614212128999874], [-73.9205269409999, 40.61394269499987], [-73.92062400299997, 40.6148386819999], [-73.92159370099995, 40.614778183999874], [-73.92252930300005, 40.61471903299993], [-73.92349786399998, 40.61465815799991], [-73.92446651399993, 40.61459941799995], [-73.9253954579999, 40.614540562999885], [-73.92640044599996, 40.61447853499988], [-73.9263159899999, 40.61343967599986], [-73.92629769899993, 40.61319215499985], [-73.92629604599998, 40.61311679899991], [-73.92739580799999, 40.614052690999884], [-73.92769203599991, 40.614312640999835], [-73.92776130099995, 40.61437342499987], [-73.92808935399992, 40.614667884999946], [-73.92842985399992, 40.61497277999991], [-73.92946094800007, 40.61589681999992], [-73.92989884499987, 40.616294271999934], [-73.93060244599985, 40.61692226299993], [-73.93173179199982, 40.61792692099988], [-73.93248727399993, 40.61743170199987], [-73.93320457599995, 40.6169704419999], [-73.93501858699992, 40.61860011099992], [-73.93686699599992, 40.620253280999904], [-73.93696272700001, 40.62019914099994], [-73.93757616399986, 40.619795528999866], [-73.93781351899986, 40.6196520959999], [-73.93828802399999, 40.619329018999906], [-73.93864732399993, 40.61909724599994], [-73.93900236399998, 40.61886727099992], [-73.93949341999998, 40.618550790999905], [-73.9397167159999, 40.618406095999866], [-73.94037010899984, 40.617992385999884], [-73.94045274699987, 40.617929049999894], [-73.94078914099987, 40.61769678999986], [-73.941282159, 40.617629269999924], [-73.94138899899984, 40.617617418999885], [-73.94221251499997, 40.617526054999864], [-73.94314510099991, 40.617425616999896], [-73.94325340699987, 40.617412063999936], [-73.94346961999989, 40.61738500099992], [-73.94395779499983, 40.616816308999894], [-73.94467599499988, 40.61616511299997], [-73.9448277099998, 40.61604620899986], [-73.94573691999982, 40.61536340699989], [-73.94576359499983, 40.61550406399987], [-73.94606699600003, 40.617103738999894], [-73.94651373199997, 40.61949401899995], [-73.94551663599992, 40.61960561199991], [-73.94451833400001, 40.61971364699989], [-73.9449703129999, 40.62210451199989], [-73.94542442899984, 40.624495609999926], [-73.94642266100001, 40.6243855669999], [-73.94687439899997, 40.62677366799994], [-73.94732672199994, 40.629166566999835], [-73.9463262219999, 40.629276641999915], [-73.94540053199998, 40.62937781199983], [-73.94446784099986, 40.629480051999884], [-73.94415535299993, 40.629508284999886], [-73.94453995099988, 40.62986656299989], [-73.94480816099995, 40.630127166999884], [-73.9455109549998, 40.63079148299986], [-73.94647961799998, 40.631708161999896], [-73.94561754699987, 40.63177742999988], [-73.94462885399984, 40.631837734999884], [-73.94365994499996, 40.63189942699991], [-73.94272877999995, 40.631957293999896], [-73.94175680799997, 40.63201662699987], [-73.94078821499988, 40.632075845999886], [-73.94032359799989, 40.63210526799983], [-73.93985458399987, 40.63213497499991], [-73.93892456999993, 40.63219308999986], [-73.93799799799994, 40.63224680599991], [-73.93759273599986, 40.63226785699986], [-73.9374083309999, 40.63228068499994], [-73.93701746200003, 40.63231097899989], [-73.93703669099992, 40.63250924999988], [-73.93706492799993, 40.63277116699994], [-73.9372670019998, 40.634650624999885], [-73.93629596699988, 40.634709525999874], [-73.93535985000001, 40.6347673119999], [-73.93439440199988, 40.634826802999925], [-73.93342687599988, 40.634884050999915], [-73.93249995699995, 40.63494706899993], [-73.93223554799995, 40.634963338999924], [-73.9315273509998, 40.63500796799989], [-73.93055333099983, 40.63506291499989], [-73.92962453299997, 40.63512131599987], [-73.92861283799982, 40.63518764599997], [-73.92766858599995, 40.63524502299991], [-73.92744822299987, 40.635258409999864], [-73.92712769499995, 40.63566745599995], [-73.9269145769998, 40.6359394399999], [-73.92682085699984, 40.63606066199992], [-73.92674442999993, 40.636173105999895], [-73.92668615699995, 40.636257087999915], [-73.92652490899994, 40.63649272299989], [-73.9262739919998, 40.63721532799985], [-73.92616377799996, 40.63757296099988], [-73.9261268489999, 40.63774352299986], [-73.9260813459999, 40.63816294599993], [-73.92606338099995, 40.63852406099986], [-73.92604638799999, 40.638603340999964], [-73.92596691799999, 40.63880208899997], [-73.92590483099994, 40.63900510599991], [-73.92586068599985, 40.63921107099989], [-73.925834756, 40.63941858799992], [-73.92582711299985, 40.63962626999988], [-73.92574389399985, 40.64001446599985], [-73.92570388299987, 40.6403609499999], [-73.92562125699988, 40.64081121999991], [-73.9255828079999, 40.64107003099984], [-73.92547887299986, 40.64158704199992], [-73.92538233099987, 40.64238453199987], [-73.92518618999996, 40.642397290999945], [-73.92454228399995, 40.64243917699988], [-73.92356525899983, 40.642499297999905], [-73.92341500199993, 40.640923605999916], [-73.92337418899983, 40.640495543999904], [-73.92335409199994, 40.64017632399992], [-73.92332654599986, 40.63990021599991], [-73.92154948099989, 40.64134469199992], [-73.92025802399995, 40.64236629899986], [-73.91973736999988, 40.64277814799987], [-73.91965951399997, 40.642078236999915], [-73.91958298599987, 40.64139576199993], [-73.919555766, 40.641184957999876], [-73.91953493999996, 40.640857740999884], [-73.91946588499995, 40.64028418699997], [-73.91946141199999, 40.64023929299983], [-73.91945472999996, 40.6401731369999]]]}}, {\&quot;id\&quot;: \&quot;91\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 92, \&quot;Shape_Leng\&quot;: 0.117830066799, \&quot;Shape_Area\&quot;: 0.000374946617289, \&quot;zone\&quot;: \&quot;Flushing\&quot;, \&quot;LocationID\&quot;: 92, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.82656578899986, 40.77064147599989], [-73.82655841999986, 40.770137083999906], [-73.82604927499997, 40.77021081399986], [-73.8255648519999, 40.77028295999992], [-73.82466908999987, 40.77040760799985], [-73.82444330299992, 40.7692855139999], [-73.82421202499988, 40.76816922799988], [-73.82395032599992, 40.76688720199994], [-73.82372658199988, 40.7658255159999], [-73.82348245199985, 40.76465179199993], [-73.82302513300002, 40.7636663409999], [-73.82260068399988, 40.76275987799985], [-73.82207166499991, 40.761625090999885], [-73.8218107709998, 40.76107223699987], [-73.82176735399993, 40.760979813999924], [-73.82155809699998, 40.76053432399992], [-73.82116404999985, 40.75968607499993], [-73.82080684899987, 40.7589417829999], [-73.82063593299985, 40.75887226799989], [-73.8200450059999, 40.75848322799985], [-73.819232864, 40.75794681199992], [-73.81856914499988, 40.7575188489999], [-73.81789245699991, 40.75708633799991], [-73.818936954, 40.75640957799994], [-73.81926771999996, 40.75619984799989], [-73.81961754399985, 40.75596557899992], [-73.82030067699999, 40.75551497999992], [-73.8184078289999, 40.75383042199998], [-73.819092321, 40.7533848199999], [-73.81977819399994, 40.752936894999884], [-73.820849288, 40.75224154499988], [-73.81998860999985, 40.751428620999896], [-73.81941130799996, 40.75088775499989], [-73.81911566899988, 40.750621072999856], [-73.81883698299988, 40.75035215799989], [-73.81826477299987, 40.749826989999875], [-73.81779541099995, 40.749392014999906], [-73.8176865099999, 40.749288211999925], [-73.81710925599998, 40.74876054399992], [-73.81654271199997, 40.748260041999856], [-73.81598751399984, 40.74776993599989], [-73.8153731739999, 40.747218337999946], [-73.81575069499985, 40.7469794799999], [-73.81657996199982, 40.74713778799989], [-73.81691898700001, 40.747204667999895], [-73.81782025899999, 40.74738541599988], [-73.8187314289999, 40.747711900999896], [-73.81961962699988, 40.748042042999934], [-73.82052281799989, 40.74835684999989], [-73.82108427599998, 40.748558445999954], [-73.82131898199997, 40.7487581829999], [-73.82239598999983, 40.74986422299986], [-73.82321319899984, 40.75070793199988], [-73.82426493900002, 40.75183288899994], [-73.8246103029999, 40.751626747999865], [-73.82492269399982, 40.75144029499993], [-73.82518837299989, 40.75128858499995], [-73.82576557299983, 40.750969023999914], [-73.82566698599992, 40.7509087479999], [-73.82565209100002, 40.75078150099995], [-73.82565201299991, 40.75065299899992], [-73.8256669259999, 40.7505247439999], [-73.82569664700004, 40.75039824999985], [-73.82574065099986, 40.750274963999864], [-73.82584440999999, 40.74934839099993], [-73.82673694299987, 40.74967723499986], [-73.82723921499992, 40.749859602999905], [-73.82737756299996, 40.74987437099992], [-73.82751792599984, 40.749874789999886], [-73.82765641899984, 40.749860830999886], [-73.82786693899982, 40.74981128499992], [-73.82807314199995, 40.74975046599994], [-73.82827349999988, 40.749678714999966], [-73.82846651899989, 40.74959657899997], [-73.82865083499996, 40.749504731999856], [-73.82882914999982, 40.74940718399992], [-73.82902159099983, 40.74932374899987], [-73.82922511999989, 40.74925608099989], [-73.82943632699994, 40.74920530899993], [-73.82965157399984, 40.749171992999905], [-73.83060941400002, 40.74902588399991], [-73.83071466599985, 40.74901721399987], [-73.83081942999986, 40.748995791999924], [-73.83091972599982, 40.748961710999886], [-73.8310116789999, 40.748916018999886], [-73.83109206499991, 40.74886061199991], [-73.83115861599995, 40.7487979979999], [-73.83121778600005, 40.74869012299991], [-73.83126084299984, 40.748576271999895], [-73.83128640999995, 40.74845858499988], [-73.83129377999995, 40.74833944999994], [-73.83128299699986, 40.7482212609999], [-73.8312547989999, 40.74810635999991], [-73.83300302099987, 40.74783363099988], [-73.83308582399988, 40.74798912499988], [-73.833116784, 40.74804727099989], [-73.83277623900001, 40.749313493999914], [-73.83228373899995, 40.751425268999895], [-73.83227581899978, 40.75145759599989], [-73.83225199799978, 40.75157800299994], [-73.832247237, 40.751700590999896], [-73.83226187399998, 40.75182272099988], [-73.8322953569999, 40.751941790999844], [-73.83560230899995, 40.75139485299991], [-73.83599840100001, 40.75200573699994], [-73.83701406699998, 40.75402742099987], [-73.83743572399989, 40.75408295599989], [-73.83766909799985, 40.75411369599991], [-73.83778038200002, 40.75413068299993], [-73.83798921299994, 40.75451504299986], [-73.83805974199996, 40.75466660699988], [-73.8381423329998, 40.75485403699987], [-73.83827816299996, 40.75523337799995], [-73.83834041199987, 40.75542546299986], [-73.83838479599993, 40.755640366999884], [-73.8384675259999, 40.7560401559999], [-73.83867321899987, 40.75701997899995], [-73.83861811099983, 40.75709081599992], [-73.83679107299986, 40.76116667099992], [-73.83689455800001, 40.76260268399992], [-73.83689970199995, 40.7626981179999], [-73.83691694399995, 40.762766679999885], [-73.8369514729998, 40.76283036999996], [-73.83790429599993, 40.764587796999876], [-73.83908354399988, 40.76525691299991], [-73.83922344399986, 40.765336291999844], [-73.83935912299995, 40.765409871999886], [-73.8394581342306, 40.76544576822929], [-73.83913189281712, 40.765991105784146], [-73.83871102200001, 40.76666838599987], [-73.83866554599997, 40.76674036599996], [-73.8386015299999, 40.76683050999985], [-73.83805766700006, 40.76759634399986], [-73.83746794599983, 40.76830671699987], [-73.83711212099999, 40.76864287199989], [-73.83678033699985, 40.76896614799991], [-73.83614052499993, 40.76952737399995], [-73.83536623599981, 40.77012144099994], [-73.83511636199991, 40.77028363399989], [-73.83433960199982, 40.77078781999989], [-73.83338983199998, 40.77134538399988], [-73.83209910199999, 40.77210429399989], [-73.83161455499989, 40.77241020899988], [-73.83150226899997, 40.77248795599991], [-73.83090463599999, 40.7729830689999], [-73.83000011099983, 40.77373240699996], [-73.82908256199991, 40.7747943209999], [-73.828793895, 40.77524292899992], [-73.82830621299996, 40.776000787999905], [-73.82789985099988, 40.7766822329999], [-73.82665895999996, 40.778818601999895], [-73.82642473899999, 40.779228734999954], [-73.82616437200001, 40.77968464499987], [-73.82607916299985, 40.77985255099991], [-73.82576928399986, 40.78046316399985], [-73.82557907999986, 40.78083309199997], [-73.82513740299993, 40.78169970599994], [-73.82498993100002, 40.7817014639999], [-73.82462418799997, 40.78170582499991], [-73.82384132799996, 40.781716885999835], [-73.82224127699999, 40.781693878999924], [-73.82243697299995, 40.781413836999896], [-73.8226154139999, 40.781126823999934], [-73.82277596999982, 40.780833776999906], [-73.82291816299993, 40.78053566699987], [-73.82331286899986, 40.77957865999986], [-73.82354681599996, 40.77903553799989], [-73.82376244899997, 40.77850455199988], [-73.82382108999985, 40.7783601379999], [-73.82405384599981, 40.7777178299999], [-73.82414480499983, 40.77747809299995], [-73.8242214729999, 40.777235226999935], [-73.8242835999999, 40.77698996099983], [-73.82433101899989, 40.776743069999924], [-73.82486800999989, 40.77654235499993], [-73.82583089999997, 40.77591527099986], [-73.82625348499994, 40.77452065899989], [-73.82647720799984, 40.77311644299986], [-73.82657481899986, 40.772345397999885], [-73.82657511799988, 40.771630352999935], [-73.82656578899986, 40.77064147599989]]]}}, {\&quot;id\&quot;: \&quot;92\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 93, \&quot;Shape_Leng\&quot;: 0.170998027597, \&quot;Shape_Area\&quot;: 0.000594278183978, \&quot;zone\&quot;: \&quot;Flushing Meadows-Corona Park\&quot;, \&quot;LocationID\&quot;: 93, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.8569635593979, 40.76407442786308], [-73.8566748236235, 40.763930188326135], [-73.85668299802357, 40.76392072858619], [-73.8568029095629, 40.763980845460814], [-73.8568542717766, 40.763922543905565], [-73.85686149910755, 40.76391434059379], [-73.85691477947755, 40.76385386154618], [-73.8569207286196, 40.76384710808833], [-73.85697496767924, 40.76378553994385], [-73.85698123375121, 40.76377842954332], [-73.85702898355706, 40.76372422680603], [-73.85703613508508, 40.76371611016756], [-73.8570833361649, 40.76366252925309], [-73.85708959006736, 40.7636554318984], [-73.85713828854304, 40.76360015443993], [-73.8571452328759, 40.76359227023111], [-73.8571946426761, 40.76353618498254], [-73.85720087844675, 40.76352910686474], [-73.85724903760318, 40.76347443965748], [-73.85725666284321, 40.76346578332061], [-73.85730643291356, 40.763409287863276], [-73.85731353865413, 40.76340122325119], [-73.85735990197853, 40.763348593736616], [-73.85736795787706, 40.76333944992225], [-73.85741662254271, 40.76328420899041], [-73.85742519945238, 40.76327447243974], [-73.85747258321598, 40.763220687374904], [-73.85747974744922, 40.76321255480913], [-73.85752810581124, 40.763157660396914], [-73.85753555737742, 40.763149201507154], [-73.85755915818416, 40.763122411786256], [-73.85754793889828, 40.763115565701206], [-73.85758285470693, 40.76307290062661], [-73.85746422874625, 40.76301478271995], [-73.85737359701484, 40.762970378519576], [-73.85718496087118, 40.762877960462795], [-73.85717606828264, 40.762873603814086], [-73.85709111433461, 40.76283198149714], [-73.85708275835432, 40.762827888020134], [-73.85698207201663, 40.76277855800093], [-73.85697105684375, 40.7627731613803], [-73.85688415442013, 40.7627305839378], [-73.85682507576576, 40.76270163909816], [-73.85682436749566, 40.762701292444234], [-73.85675571120355, 40.76266765415096], [-73.85674350380765, 40.76266167353797], [-73.85669035223006, 40.762635632858746], [-73.85660302580746, 40.76273141793303], [-73.8565867538878, 40.762722840114236], [-73.8567823696347, 40.76250827740658], [-73.85679858100602, 40.76251682329276], [-73.85671169399488, 40.76261568695248], [-73.85676092804188, 40.762639826189165], [-73.85677318714824, 40.76264583651674], [-73.85682558732012, 40.7626715270996], [-73.8568366081776, 40.76267693094509], [-73.85688788040733, 40.76270206793208], [-73.85690044326856, 40.762708227386334], [-73.85698999094755, 40.76275213155589], [-73.85709311210883, 40.76280268870123], [-73.85710529468155, 40.76280866153997], [-73.85718716762985, 40.76284880177785], [-73.85719629175131, 40.76285327497573], [-73.85728240762211, 40.76289549655458], [-73.85729174591326, 40.76290007370879], [-73.8573806782753, 40.76294367543134], [-73.85738951387346, 40.76294800770227], [-73.85747499963058, 40.7629899192708], [-73.85748453757667, 40.76299459449141], [-73.85760424037194, 40.76305328178898], [-73.85763578363799, 40.763012321964815], [-73.85765037151214, 40.763019173878945], [-73.8577084468895, 40.762950395280726], [-73.85771567256866, 40.762941835081996], [-73.85776740573347, 40.762880552278006], [-73.85777623039976, 40.7628700979901], [-73.85783497417715, 40.76280051049886], [-73.85784136663887, 40.76279293749988], [-73.85789701257401, 40.76272701849153], [-73.85794433387208, 40.762670962169565], [-73.8579670234807, 40.76264408295382], [-73.85797500120835, 40.76263463209225], [-73.8580451152925, 40.76255157517708], [-73.85807199853592, 40.762519729773025], [-73.85813288714913, 40.76244759870893], [-73.85814119991119, 40.762437750876416], [-73.85817631070509, 40.7623962942238], [-73.85781983894705, 40.76222613388971], [-73.85780788168364, 40.76222042710023], [-73.85768834724743, 40.76216337375971], [-73.85767257542702, 40.7621558457594], [-73.85752950976803, 40.76208756021165], [-73.8574600419264, 40.76205440229832], [-73.85737149406725, 40.762012137796255], [-73.85735065780416, 40.762002192446865], [-73.85718801666012, 40.76192456443414], [-73.85716303200887, 40.76191263827355], [-73.85700279501378, 40.76183615483602], [-73.85698328892109, 40.76182684448665], [-73.85683800035645, 40.761757495880914], [-73.85677632095462, 40.76172805592267], [-73.85667457135632, 40.76167948956146], [-73.85665617597306, 40.76167070874793], [-73.85661195813331, 40.761649542759294], [-73.85662772941468, 40.761629062393226], [-73.85677893473327, 40.76170097456675], [-73.85679154181352, 40.76170696991361], [-73.85688557543547, 40.76175169107733], [-73.85690054310561, 40.76175880925622], [-73.85699014273463, 40.76180142237466], [-73.85700272542273, 40.761807405606], [-73.85709011185035, 40.76184896685109], [-73.85710534324438, 40.761856210472295], [-73.85719139863377, 40.761897137075714], [-73.85720516175633, 40.761903682792855], [-73.8572941135809, 40.761945985785], [-73.85730868889425, 40.761952918978366], [-73.85739929667307, 40.761996009469485], [-73.85741179997495, 40.762001956372046], [-73.85750467691464, 40.762046126613114], [-73.85751841919019, 40.76205266188022], [-73.85761007602207, 40.762096253064605], [-73.85762293989328, 40.762102369423516], [-73.85771566567898, 40.76214646911336], [-73.85773024174472, 40.762153400578725], [-73.85781948058784, 40.76219584021852], [-73.8578332359116, 40.762202381494895], [-73.85819433132511, 40.7623741079845], [-73.85827164316137, 40.762287628352816], [-73.85828091939457, 40.76227725147556], [-73.85836158883386, 40.76218701512108], [-73.85844323288775, 40.76209568947986], [-73.85845113610489, 40.762099465008106], [-73.85851749742233, 40.7620149112025], [-73.85850740232593, 40.76200806491507], [-73.8585852628444, 40.76191700859695], [-73.85747662435531, 40.76130891668733], [-73.8562732064007, 40.76090240843036], [-73.85537633453939, 40.760669385032244], [-73.85530351821596, 40.76074715385173], [-73.85529349219507, 40.760742320360684], [-73.85522306397422, 40.76081695051194], [-73.8552098725408, 40.76080930077564], [-73.85527660311541, 40.76073426476228], [-73.85526921633013, 40.76072983580968], [-73.85533454594008, 40.760658154889406], [-73.85530266029582, 40.76064958525487], [-73.85499808982104, 40.760391170767384], [-73.85466366458877, 40.7601711695621], [-73.8545203082371, 40.76015934488466], [-73.85425219901792, 40.76025067778132], [-73.85396489201136, 40.76027142272702], [-73.85372403934942, 40.76024638863483], [-73.8532844944673, 40.76012651275205], [-73.85306618709187, 40.76003870448119], [-73.85294927727757, 40.76002140181005], [-73.85277928565588, 40.75997298911409], [-73.85210362063094, 40.759682826699695], [-73.85200759608603, 40.75957250068762], [-73.85188711257045, 40.75952236727886], [-73.85171252421836, 40.759401258516625], [-73.85158552901191, 40.75935542065696], [-73.85144347566316, 40.75941908427621], [-73.85133438850518, 40.75942068096519], [-73.85121495373862, 40.75941585413536], [-73.8509512195169, 40.759419583092814], [-73.8506905306545, 40.75944879109037], [-73.85042437822479, 40.75950641103758], [-73.85029807674991, 40.7595462437419], [-73.8501750399337, 40.7595916012256], [-73.85005568532608, 40.75964232956161], [-73.84994041798382, 40.759698256595414], [-73.84970908350634, 40.759838837957474], [-73.84950202299183, 40.76000672901061], [-73.84933909178683, 40.76018858944728], [-73.84934906664418, 40.7601982826528], [-73.84930110814332, 40.76024287534997], [-73.84987484496149, 40.76110381294847], [-73.8518167929994, 40.76035373284717], [-73.85184046510508, 40.760305978821485], [-73.85197412962866, 40.76024940738178], [-73.85207200177854, 40.7603928846721], [-73.84981162475142, 40.76127097400822], [-73.84916662406035, 40.760296584790396], [-73.84914140272522, 40.760306890639015], [-73.84891393714967, 40.76027578667359], [-73.8486865565891, 40.76013849511064], [-73.84858834617657, 40.76017956308828], [-73.84821242063795, 40.760437594507884], [-73.84796233649804, 40.76055108883418], [-73.84670933714987, 40.76134526931977], [-73.84663046699997, 40.76129165899989], [-73.84606731299985, 40.76090886399986], [-73.84601517799996, 40.76080248899988], [-73.84597463499995, 40.76071730199993], [-73.8459114399999, 40.76058469999987], [-73.84585235799983, 40.76045539799988], [-73.8454898629999, 40.75972867199994], [-73.84513404100002, 40.75906847499993], [-73.84479027099985, 40.75840315899994], [-73.84444970399977, 40.75774348399989], [-73.84404431200002, 40.756944772999915], [-73.84363442799987, 40.75615699399987], [-73.84324381399976, 40.75533680399995], [-73.84253360699991, 40.75554469899986], [-73.84183146799998, 40.75576926799991], [-73.84113839099994, 40.756010244999864], [-73.84045537199995, 40.756267296999965], [-73.83978335899995, 40.75654003599987], [-73.8391232999999, 40.75682806199994], [-73.83875129700003, 40.756994991999925], [-73.83867321899987, 40.75701997899995], [-73.8384675259999, 40.7560401559999], [-73.83838479599993, 40.755640366999884], [-73.83834041199997, 40.755425461999906], [-73.83827816299996, 40.75523337799995], [-73.83814233299988, 40.75485403799992], [-73.83805974199996, 40.75466660699988], [-73.83798921299986, 40.7545150419999], [-73.83778038200002, 40.75413068299993], [-73.83766909799985, 40.75411369599991], [-73.83743572399989, 40.75408295599989], [-73.83701406699998, 40.75402742099987], [-73.83599840099994, 40.752005735999916], [-73.83560230899995, 40.75139485299991], [-73.8322953569999, 40.751941790999844], [-73.83226187399998, 40.75182272199993], [-73.832247237, 40.751700590999896], [-73.83225199799978, 40.75157800399993], [-73.83227581899978, 40.7514575949999], [-73.83228373899995, 40.751425268999895], [-73.83277623900001, 40.74931349499994], [-73.833116784, 40.74804727099989], [-73.83308582399988, 40.74798912499988], [-73.83300302099987, 40.74783363099988], [-73.83364897199982, 40.74764609899995], [-73.83370364199992, 40.74762634799989], [-73.83392204099982, 40.74753213699994], [-73.83392218299996, 40.74753207499989], [-73.83392232599984, 40.747532001999936], [-73.83413036799998, 40.7474264389999], [-73.83426490799998, 40.747337797999926], [-73.83426506200006, 40.74733769899993], [-73.834265193, 40.74733759999988], [-73.83438980999983, 40.74723985799992], [-73.83450304299996, 40.747133967999886], [-73.83450311499995, 40.74713390399994], [-73.83450317399993, 40.74713383299994], [-73.83460358999982, 40.74702113399993], [-73.834603649, 40.747021071999875], [-73.83460369599997, 40.747020998999886], [-73.83469042599992, 40.746902697999936], [-73.83506574799989, 40.74620410899988], [-73.83543777199996, 40.74552397399991], [-73.83556958700001, 40.745150630999916], [-73.83567553899992, 40.74485051799991], [-73.83584967799999, 40.7441757629999], [-73.83595071499995, 40.74373056899992], [-73.835925305, 40.743500569999846], [-73.83591564899993, 40.74343089299987], [-73.83590196999995, 40.74337980599992], [-73.83586131899989, 40.743227984999926], [-73.83609989199991, 40.7424290689999], [-73.83687304099996, 40.74213754699986], [-73.83690407799999, 40.74212583899989], [-73.83699037399995, 40.74209330099992], [-73.8371072069999, 40.7413962279999], [-73.8369627279999, 40.74065666099988], [-73.83679277399987, 40.73990191199988], [-73.83675088199985, 40.73972053399992], [-73.83669458799986, 40.73954125399997], [-73.83662419799995, 40.739365059999905], [-73.83627527100006, 40.73956837599992], [-73.83564585599999, 40.738491010999894], [-73.83563372699986, 40.737111629999916], [-73.83574733199998, 40.73699114199996], [-73.8361887679999, 40.73562665299992], [-73.83628669399984, 40.73513136699995], [-73.83635625099998, 40.73500859199989], [-73.8361277859999, 40.734241311999924], [-73.83606223299994, 40.734098694999865], [-73.8360070899999, 40.733978740999916], [-73.83584824699989, 40.73383374899988], [-73.83489939499987, 40.732967641999906], [-73.83448336599982, 40.73216391599991], [-73.83400368799985, 40.7315677099999], [-73.83386267199987, 40.730553188999885], [-73.83307087999992, 40.729919030999966], [-73.832895707, 40.7295863309999], [-73.83269855399999, 40.72925986199992], [-73.83248002199991, 40.7289408539999], [-73.83224087999997, 40.7286305209999], [-73.83198207999989, 40.728329997999865], [-73.83170465899991, 40.728040331999836], [-73.83140452799991, 40.72759762199997], [-73.83086471499999, 40.72670963399988], [-73.83073214599987, 40.72654932799991], [-73.83057976800002, 40.72639650399984], [-73.83057961499996, 40.72639635099986], [-73.83057943699991, 40.72639619699987], [-73.83040824999996, 40.7262528629999], [-73.83040820199987, 40.726252827999915], [-73.83040815599992, 40.72625279999995], [-73.83021964699995, 40.72612077799993], [-73.83021953999997, 40.72612069599989], [-73.83021940999994, 40.7261206249999], [-73.8300158949998, 40.72600180799986], [-73.83001569399997, 40.72600168999989], [-73.83001549299993, 40.72600159099995], [-73.82979916899991, 40.72589728099996], [-73.82979910999985, 40.72589725399995], [-73.82979903999995, 40.72589722599985], [-73.82957260399982, 40.72580846999996], [-73.82957252099986, 40.725808433999866], [-73.82957243899995, 40.725808406999896], [-73.82933887099998, 40.72573593899991], [-73.82933877699988, 40.72573592099995], [-73.82910097699988, 40.72567999799992], [-73.82887984399996, 40.725638253999925], [-73.828879714, 40.72563822699989], [-73.82887959600001, 40.725638191999906], [-73.82866154299994, 40.725581422999866], [-73.82844909199999, 40.72550982199991], [-73.82824491699995, 40.72542399599991], [-73.82805160699986, 40.72532493099987], [-73.82805145299996, 40.725324849999915], [-73.8280513119999, 40.725324759999864], [-73.82787086399985, 40.72521360999989], [-73.82770512299993, 40.72509185599994], [-73.8277049809999, 40.725091747999905], [-73.827704851, 40.72509162999989], [-73.8275552779999, 40.72496094999987], [-73.82742447699991, 40.72480770299991], [-73.82742443099994, 40.724807657999875], [-73.82742439499987, 40.72480760399992], [-73.8273090039999, 40.72464607699988], [-73.82721028599994, 40.7244775779999], [-73.8271293019999, 40.72430378399993], [-73.82712926599994, 40.72430371199989], [-73.82712924299986, 40.7243036399999], [-73.82706662699995, 40.7241260829999], [-73.82702267100002, 40.72394639099995], [-73.82672635699993, 40.72308159999988], [-73.82585945699992, 40.72046263199995], [-73.8257413029999, 40.72022165599988], [-73.82564380900001, 40.719974137999934], [-73.825643726, 40.71997393899991], [-73.82564366799977, 40.719973732999904], [-73.825567704, 40.719721168999854], [-73.82556765699992, 40.71972101499993], [-73.82556762199991, 40.719720870999936], [-73.82551375400004, 40.71946457499994], [-73.82551374199984, 40.719464530999865], [-73.82551374199986, 40.71946448499992], [-73.82548231999989, 40.71920620699995], [-73.82548231999995, 40.71920613499989], [-73.8254734689999, 40.71894785499994], [-73.82547345799988, 40.7189476569999], [-73.82547346999992, 40.718947467999875], [-73.82548692499986, 40.71869066199987], [-73.82545983199994, 40.71799986599993], [-73.8254192649999, 40.71739254399993], [-73.82531644999993, 40.71727569999994], [-73.82518614699985, 40.717288189999884], [-73.82487503799997, 40.71732243199995], [-73.8237298389999, 40.717437003999855], [-73.82332432099994, 40.71745250999989], [-73.82291752899988, 40.71745256099993], [-73.82251099399988, 40.717437075999904], [-73.82210623799986, 40.71740613099991], [-73.821704791, 40.717359889999905], [-73.82085213599989, 40.717348876999935], [-73.81962622499992, 40.7173404429999], [-73.81952343899992, 40.71733973299991], [-73.8191283259999, 40.71734991899995], [-73.81732944799997, 40.717660456999916], [-73.81725907799989, 40.71763787699993], [-73.81729568999994, 40.71757964499995], [-73.81887154599995, 40.71725932899994], [-73.81907861099985, 40.71720434499988], [-73.81930469499987, 40.71713608099988], [-73.82005442499994, 40.716810333999916], [-73.82018883899984, 40.71673522399984], [-73.82051599199986, 40.71681199099988], [-73.82100705300005, 40.71687995099992], [-73.82187417699991, 40.716917117999856], [-73.82346833799978, 40.71673105099993], [-73.825090876, 40.71645279299986], [-73.82524731699984, 40.71645544499987], [-73.82561290699984, 40.7162098979999], [-73.82566233799984, 40.716152637999926], [-73.82591945199992, 40.71598987599992], [-73.82627826, 40.71580688099987], [-73.82630699099998, 40.71579072399993], [-73.82646966099986, 40.715695567999916], [-73.82681044699991, 40.715550945999965], [-73.82700619999987, 40.715440297999855], [-73.82715524299999, 40.71538800399986], [-73.82850807699991, 40.71504432899996], [-73.82926493499993, 40.714792229999894], [-73.82995752699982, 40.714580886999876], [-73.83031312099993, 40.71449974499997], [-73.83082284299995, 40.71438342799993], [-73.8309675249999, 40.71435449099987], [-73.83103141800002, 40.71433672599993], [-73.83106922200002, 40.71435395599992], [-73.83115849800005, 40.71439336699996], [-73.83125888999979, 40.71444125999994], [-73.83145866999996, 40.714554448999934], [-73.83138630199987, 40.71457739699988], [-73.83122975599984, 40.71462702899991], [-73.83050460999999, 40.7148569439999], [-73.83035327299996, 40.7149518069999], [-73.83021283199997, 40.71505777899988], [-73.83008542999981, 40.71517363999986], [-73.8300853579999, 40.71517370299991], [-73.83008529899986, 40.71517376599995], [-73.82997259699991, 40.71529812199986], [-73.82987589099987, 40.71542940099992], [-73.8297961659998, 40.71556571899986], [-73.83072818099994, 40.71625964099996], [-73.8320714099999, 40.717290595999884], [-73.83348148399978, 40.71833345599985], [-73.83456936899987, 40.71902728199992], [-73.83457034900002, 40.71902795899989], [-73.83468657499992, 40.71910892099989], [-73.83479214399989, 40.71920142799992], [-73.83488359399998, 40.719303271999934], [-73.8349589409999, 40.71941247699992], [-73.83501684199989, 40.71952679899991], [-73.83505666300006, 40.719643840999886], [-73.83511286899991, 40.71991727199992], [-73.83518572100002, 40.72018871899989], [-73.83527502199999, 40.72045730599992], [-73.83538045099985, 40.720722179999925], [-73.83556698599992, 40.72104319099987], [-73.83576124499994, 40.72136157399993], [-73.83596312399996, 40.72167716799987], [-73.83603385999993, 40.72176720199997], [-73.83652367699997, 40.722370553999944], [-73.83836161400004, 40.725561841999856], [-73.83871473099992, 40.72622079099988], [-73.83906354600003, 40.7268795339999], [-73.8394453729999, 40.7275367999999], [-73.83985434299984, 40.72817756899988], [-73.84032703199988, 40.728807114999896], [-73.84146810899993, 40.72999809299991], [-73.84162181800001, 40.73011794699988], [-73.8428141259999, 40.73115341199989], [-73.84350489099987, 40.73181434399993], [-73.84370558699993, 40.73203240499986], [-73.84389098199985, 40.73225885599994], [-73.844060203, 40.7324927399999], [-73.84421250399983, 40.73273304099995], [-73.84434729799992, 40.73297869299997], [-73.84475302099987, 40.73361999799993], [-73.8449680009999, 40.734007128999906], [-73.84511542099983, 40.734277407999855], [-73.84542613099978, 40.734949802999935], [-73.84569341599997, 40.7356664799999], [-73.84590881499994, 40.736399800999884], [-73.84605541899985, 40.73709918799988], [-73.84689366199993, 40.73867121699989], [-73.84721361599989, 40.73864398699985], [-73.84732494199989, 40.738771457999896], [-73.84746313999992, 40.73895203099994], [-73.84750820299992, 40.73900780699995], [-73.8475557979999, 40.7390639149999], [-73.84767033700003, 40.7391952349999], [-73.84775740199994, 40.739299088999864], [-73.84777844199982, 40.7393448349999], [-73.84823627999982, 40.739290400999955], [-73.84794174099986, 40.73981640499991], [-73.84780164699998, 40.740049676999874], [-73.84795885999989, 40.74009701599994], [-73.84892344899993, 40.740391914999854], [-73.8493530509999, 40.74052324999996], [-73.84965207399982, 40.740614663999935], [-73.84984431299986, 40.740665549999896], [-73.84996425999991, 40.74070177199997], [-73.85011556599989, 40.74072356299995], [-73.85020444599994, 40.74090203399989], [-73.85051160899988, 40.741518856999946], [-73.85086917499987, 40.74218041099995], [-73.85099327299999, 40.74242254299989], [-73.85120929199985, 40.74284402099991], [-73.85135102799995, 40.743119057999884], [-73.85155107299987, 40.74350722699996], [-73.85189537499998, 40.74417973799992], [-73.85224097499999, 40.74484096599985], [-73.85257733899984, 40.7455056469999], [-73.8529235349999, 40.74618194799996], [-73.85325493199986, 40.74682354899991], [-73.85360568399982, 40.74749682799991], [-73.8537828699998, 40.74780299099994], [-73.85382450799997, 40.74785403999988], [-73.85405453299994, 40.748158316999906], [-73.85436928099995, 40.748738929999874], [-73.85442575299999, 40.748851725999884], [-73.8513110499998, 40.74984337599988], [-73.85086439699992, 40.74999564199986], [-73.85098691399993, 40.75023929799988], [-73.85118150899994, 40.75062629599989], [-73.85151883499987, 40.751297136999916], [-73.85171508699987, 40.751687413999875], [-73.85185614699996, 40.75196793299992], [-73.85220450599998, 40.752660681999934], [-73.85246329699996, 40.75312740899989], [-73.85261725399984, 40.75340506599992], [-73.85300762299985, 40.75455456599985], [-73.85302119999993, 40.754618001999866], [-73.85312635499996, 40.75510934299989], [-73.85318740799981, 40.755400028999944], [-73.85335273999982, 40.756017825999876], [-73.85339582599983, 40.75614235899991], [-73.8535413749999, 40.75656303299997], [-73.85377320199979, 40.75711640099996], [-73.85379813799992, 40.757177611999914], [-73.85405570299993, 40.75760316299988], [-73.85436796999998, 40.75811908299986], [-73.85449593299987, 40.75827863899985], [-73.8545797199998, 40.7583876199999], [-73.85463995799994, 40.75846615799992], [-73.85500920899997, 40.758879225999884], [-73.855067026, 40.758943277999926], [-73.85525140099983, 40.7591475299999], [-73.85553311699984, 40.75934259099992], [-73.85576997499993, 40.75953834299993], [-73.85603980899994, 40.75972578699984], [-73.85638216199997, 40.7599066399999], [-73.85655895700003, 40.75998156099994], [-73.856705981, 40.76004386599993], [-73.85734910199996, 40.76030063399988], [-73.85754427999996, 40.76037765399996], [-73.85773604799981, 40.760459477999845], [-73.857924202, 40.760546017999935], [-73.85810853999996, 40.7606371819999], [-73.85828886699981, 40.760732872999895], [-73.8584649899998, 40.760832988999894], [-73.858636721, 40.76093742299987], [-73.85880387699986, 40.76104606399992], [-73.85896628099991, 40.761158795999904], [-73.85912375899987, 40.76127549899994], [-73.85913545299991, 40.76141844099987], [-73.859666663, 40.761901912999896], [-73.85992937999985, 40.76220030099993], [-73.86109724399991, 40.76366447799989], [-73.86093691499987, 40.76372861499989], [-73.86057039699999, 40.76383121299987], [-73.86043337809801, 40.76386888243776], [-73.86001698390152, 40.76326428551858], [-73.85975083822206, 40.7628778391954], [-73.85949072467386, 40.76256261539987], [-73.8594133939809, 40.7624832653393], [-73.85922062887968, 40.762482744481545], [-73.85915607632676, 40.76251963069956], [-73.85907893363806, 40.76252283227078], [-73.85892056312618, 40.762406401185224], [-73.85899197332793, 40.762246523709955], [-73.85898423264058, 40.7621714744713], [-73.85892298182517, 40.762122346521515], [-73.85879204218736, 40.76227933874763], [-73.85867190067573, 40.76252227000638], [-73.85864510487932, 40.76251439590902], [-73.85876525911517, 40.76226519184914], [-73.85888722726258, 40.762133609398525], [-73.85883984926524, 40.76210532221611], [-73.85871170031803, 40.762233761955024], [-73.85869110268315, 40.762221190500945], [-73.85884371506147, 40.76205876728172], [-73.85861915281858, 40.7619355969989], [-73.85854218676641, 40.762026898691005], [-73.85853208671435, 40.76202176133262], [-73.8584808798073, 40.762082699861345], [-73.85847289638568, 40.762092199501595], [-73.85846125776057, 40.76210605116506], [-73.85846562340063, 40.76210880228016], [-73.85840968995647, 40.76217335587738], [-73.85840137452446, 40.762183042901206], [-73.85833010330997, 40.762266065611094], [-73.85832178366148, 40.76227575597448], [-73.85824801084416, 40.762361693691965], [-73.85823701549468, 40.76237450310679], [-73.85816550201432, 40.76245780652361], [-73.85815675514272, 40.76246799574389], [-73.85808172268878, 40.76255539983264], [-73.85807451463484, 40.76256379539836], [-73.85800186588557, 40.76264842076873], [-73.85799432914435, 40.762657200731425], [-73.85793183124306, 40.762730003860696], [-73.85792332108373, 40.76273991559671], [-73.85786819502788, 40.76280413118438], [-73.857859431059, 40.76281433962614], [-73.85780092280253, 40.762882493565314], [-73.85779250823931, 40.76289229618249], [-73.85773856319483, 40.76295513258302], [-73.85773293300596, 40.76296169164485], [-73.85767843741588, 40.76302774852689], [-73.85768965370534, 40.763036305706244], [-73.85765473616219, 40.76307982335119], [-73.85777497639125, 40.76313883512948], [-73.85786962064152, 40.763185283759206], [-73.85788103167226, 40.763190884493554], [-73.85796457800302, 40.76323188698831], [-73.85805470915611, 40.76327612040054], [-73.85815033962187, 40.763323053661004], [-73.85815280980245, 40.7633242660726], [-73.85816421582143, 40.76332986291929], [-73.85825464723334, 40.763374244804325], [-73.85826783696172, 40.763380717148394], [-73.85835219792034, 40.76342211890684], [-73.8584153868299, 40.76345313042265], [-73.85848633892353, 40.763369346378035], [-73.85850081255238, 40.763376433585044], [-73.85834319308863, 40.76356256146058], [-73.85832948824915, 40.763555851275136], [-73.85839531409529, 40.76347705912173], [-73.8583507077488, 40.76345478950192], [-73.8583381131546, 40.763448503350624], [-73.8582525680361, 40.763405793589826], [-73.8582413092282, 40.763400172809334], [-73.85813903143266, 40.763349110468035], [-73.85812806185179, 40.76334363326728], [-73.85805097021218, 40.76330514587175], [-73.85803917484533, 40.76329925703871], [-73.85795122974932, 40.763255349132415], [-73.85794243473829, 40.763250958823285], [-73.85786245501016, 40.76321102718345], [-73.85784979492291, 40.76320470688977], [-73.85777061776874, 40.76316517706584], [-73.85775931084058, 40.76315953255724], [-73.85763896602008, 40.763099448634655], [-73.85760068527979, 40.76314040113684], [-73.85758834275414, 40.763133551992205], [-73.85683888701782, 40.76400017911488], [-73.85697078354372, 40.76406606756879], [-73.8569635593979, 40.76407442786308]]]}}, {\&quot;id\&quot;: \&quot;93\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 94, \&quot;Shape_Leng\&quot;: 0.0498326083147, \&quot;Shape_Area\&quot;: 6.25819407393e-05, \&quot;zone\&quot;: \&quot;Fordham South\&quot;, \&quot;LocationID\&quot;: 94, \&quot;borough\&quot;: \&quot;Bronx\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.89964261700001, 40.862210436999874], [-73.89943670799998, 40.862116911999856], [-73.89841038399996, 40.862296966999935], [-73.89798099399988, 40.86240253999991], [-73.89737274799985, 40.86243236399985], [-73.897143798, 40.86244506499991], [-73.89773815399992, 40.86135113699993], [-73.89802453099999, 40.86082046099989], [-73.89822728999994, 40.860448863999885], [-73.89828973399992, 40.86033442099995], [-73.898590972, 40.859766782999934], [-73.89880457699982, 40.8593642709999], [-73.89883814599983, 40.859307307999906], [-73.89866157499996, 40.859246901999896], [-73.89818244699991, 40.85908368099995], [-73.89735765499988, 40.85876273499986], [-73.89636314599984, 40.85837531899991], [-73.89573924699978, 40.85813820699986], [-73.8946932639999, 40.85942628199991], [-73.89381026099987, 40.858986564999924], [-73.89321520799987, 40.85987420599986], [-73.89256392599998, 40.860522728999925], [-73.89141802399983, 40.86166298399996], [-73.89138023399983, 40.86170058799992], [-73.89106280699994, 40.8615294119999], [-73.89106059999996, 40.861471814999945], [-73.89115375599981, 40.86091361599996], [-73.89174394999986, 40.860177146999945], [-73.89225707599982, 40.85940997599994], [-73.8929935429999, 40.85838611999985], [-73.89441355099994, 40.85643377599997], [-73.89477596099992, 40.85592952599996], [-73.89549889799987, 40.85474976599994], [-73.89560883299981, 40.85457036999986], [-73.89644052599982, 40.854907758999914], [-73.89709926799998, 40.855172290999874], [-73.89831118599984, 40.85406115099989], [-73.89863543699985, 40.85390697499993], [-73.89816577499982, 40.85514637599989], [-73.89877598599995, 40.85536324699995], [-73.89967155800004, 40.85566890799991], [-73.90060385999978, 40.85598723799995], [-73.90077922699986, 40.85604710999993], [-73.90085477199993, 40.8559374399999], [-73.90116590999993, 40.85549567499992], [-73.90130126599995, 40.85530348999985], [-73.90153703400001, 40.85499464299988], [-73.90185996099993, 40.85458614899994], [-73.90208001099982, 40.85462259899992], [-73.90298864599995, 40.854773108999936], [-73.90395154299999, 40.854973922999896], [-73.90472622199998, 40.85537039499996], [-73.90557007299988, 40.855787321999884], [-73.90522169999987, 40.856203594999926], [-73.90508614099994, 40.856410830999955], [-73.90468371399987, 40.85706030199991], [-73.90565953499988, 40.85739873399997], [-73.90526389299997, 40.85804717799987], [-73.90486847199993, 40.8586932249999], [-73.90447464099996, 40.85934159499988], [-73.90408132700006, 40.859987847999875], [-73.90351390599986, 40.86091750999989], [-73.90254479399998, 40.86057825499988], [-73.90233887199986, 40.86095497099995], [-73.90211720400006, 40.8613269479999], [-73.90188007299994, 40.86169362499991], [-73.90162785099997, 40.86205443399997], [-73.90136090399993, 40.8624088639999], [-73.90107966999994, 40.86275638299992], [-73.90028368099995, 40.86247183699992], [-73.89996177599984, 40.86235027999989], [-73.89964261700001, 40.862210436999874]]]}}, {\&quot;id\&quot;: \&quot;94\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 95, \&quot;Shape_Leng\&quot;: 0.113629605476, \&quot;Shape_Area\&quot;: 0.00057277033803, \&quot;zone\&quot;: \&quot;Forest Hills\&quot;, \&quot;LocationID\&quot;: 95, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.84732494199989, 40.738771457999896], [-73.84721361599989, 40.73864398699985], [-73.84689366199993, 40.73867121699989], [-73.84605541799989, 40.737099187999874], [-73.84590881499994, 40.736399800999884], [-73.84569341599997, 40.7356664799999], [-73.84542613099978, 40.734949802999935], [-73.84511541999991, 40.734277407999855], [-73.8449680009999, 40.734007128999906], [-73.84475302099987, 40.73361999799993], [-73.84434729799992, 40.73297869299997], [-73.84421250399983, 40.73273304099995], [-73.844060203, 40.7324927399999], [-73.84389098199985, 40.73225885599994], [-73.84370558699993, 40.73203240499986], [-73.84350489099987, 40.73181434399993], [-73.8428141259999, 40.73115341199989], [-73.84162181699999, 40.73011794699993], [-73.84146810899993, 40.72999809299991], [-73.84032703199988, 40.728807114999896], [-73.83985434299984, 40.72817756899988], [-73.8394453729999, 40.7275367999999], [-73.83906354600003, 40.7268795339999], [-73.83871473099992, 40.72622079099988], [-73.83836161400004, 40.725561841999856], [-73.8365236769999, 40.722370552999884], [-73.83603385999993, 40.72176720199997], [-73.83596312399996, 40.72167716799987], [-73.83576124499994, 40.72136157399993], [-73.83556698599992, 40.72104319099987], [-73.83538045099985, 40.720722179999925], [-73.83527502199999, 40.72045730599992], [-73.83518572100002, 40.72018871899989], [-73.83511286899991, 40.71991727199992], [-73.8350566629999, 40.71964384199989], [-73.83501684199989, 40.71952679899991], [-73.8349589409999, 40.71941247699992], [-73.83488359399998, 40.719303271999934], [-73.83479214399989, 40.71920142799992], [-73.83468657499992, 40.71910892099989], [-73.834570349, 40.719027959999934], [-73.83456936899987, 40.71902728199992], [-73.83348148399978, 40.71833345599985], [-73.8320714099999, 40.717290595999884], [-73.83072818099994, 40.71625964099996], [-73.8297961659998, 40.71556571899986], [-73.82987589099987, 40.71542940099992], [-73.82997259699991, 40.71529812199986], [-73.83008529899986, 40.71517376599995], [-73.8300853579999, 40.71517370299991], [-73.83008542999981, 40.71517363999986], [-73.83021283199997, 40.71505777899988], [-73.83035327299996, 40.7149518069999], [-73.83050460999999, 40.7148569439999], [-73.83122975599984, 40.71462702899991], [-73.83138630199986, 40.71457739799996], [-73.83145866999996, 40.714554448999934], [-73.83125888999979, 40.71444125999994], [-73.83115849800005, 40.71439336699996], [-73.83106922200002, 40.71435395599992], [-73.83103141799982, 40.71433672499987], [-73.83115264699987, 40.7143068559999], [-73.83129817899982, 40.714264132999844], [-73.83135959999987, 40.71423170499988], [-73.83243372799994, 40.71365996799988], [-73.83317906799991, 40.71326322499991], [-73.83330196199995, 40.71320007099996], [-73.83355895899987, 40.713068003999865], [-73.833657742, 40.71301572899994], [-73.83374150300001, 40.712969680999905], [-73.83426226999985, 40.71268337399986], [-73.83505175599991, 40.712253576999885], [-73.83600510799992, 40.71172967199989], [-73.83602786500002, 40.711749063999896], [-73.83611476599982, 40.71182514699994], [-73.83640857599988, 40.71164176899991], [-73.83640880199984, 40.71164162599989], [-73.83640902599988, 40.71164149999986], [-73.83671639099991, 40.711470315999854], [-73.83671661599983, 40.711470191999894], [-73.83671685300001, 40.71147007499992], [-73.83703669299996, 40.711311803999926], [-73.83703688199994, 40.711311704999915], [-73.83703708399995, 40.7113116139999], [-73.837368179, 40.711166928999944], [-73.8377089419999, 40.71103648399989], [-73.83805756099987, 40.71092087199988], [-73.83952312699982, 40.7104964509999], [-73.83972439899992, 40.71039876599992], [-73.83978025199983, 40.710385523999925], [-73.840191993, 40.710276828999916], [-73.84024206299989, 40.71026193199985], [-73.84069154199982, 40.710153213999924], [-73.84133936599986, 40.709946233999894], [-73.84263067999993, 40.709432976999885], [-73.84267962199995, 40.709414123999906], [-73.8430466589999, 40.7092641499999], [-73.84314625299982, 40.70922345599992], [-73.84321861899991, 40.70918746199985], [-73.84347552199995, 40.70906047099992], [-73.84381825699988, 40.70891181999989], [-73.84417281299982, 40.70877842099986], [-73.84453738799996, 40.708661054999894], [-73.84491011200004, 40.708560330999944], [-73.84528898599984, 40.70847667899995], [-73.84567198199987, 40.70841036599989], [-73.84615958399999, 40.70835081999995], [-73.84665724099989, 40.70831864199995], [-73.8476241019999, 40.708332622999855], [-73.84857838799986, 40.70843871999993], [-73.84876725199985, 40.70844457899986], [-73.84895712599986, 40.70843813799993], [-73.84914591599988, 40.7084193199999], [-73.84933156199999, 40.70838833399994], [-73.84951207399992, 40.708345660999925], [-73.8504290539999, 40.7080870669999], [-73.85059051099984, 40.70803988299985], [-73.85110121699995, 40.707900982999895], [-73.85268225699998, 40.70741814499989], [-73.85275370599992, 40.7073971469999], [-73.85473240499985, 40.70676414299989], [-73.85593991699984, 40.7063980339999], [-73.85595536199988, 40.70642977899992], [-73.85667714399985, 40.70769187399986], [-73.85729287299985, 40.711467676999874], [-73.85744857899988, 40.7136927999999], [-73.85777168499992, 40.71645629299992], [-73.85823757099998, 40.719612410999936], [-73.85852214099987, 40.72153379399993], [-73.8586809759999, 40.72261243999988], [-73.85990796499992, 40.72434623399985], [-73.86203833799982, 40.72595678499994], [-73.86015205599992, 40.725227040999876], [-73.85960517199996, 40.7250223999999], [-73.85805416899993, 40.72444540599986], [-73.85776316799985, 40.72490571199994], [-73.85727108100001, 40.72568129799988], [-73.8594198799999, 40.726464837999885], [-73.85901374300002, 40.7271089069999], [-73.85860783699987, 40.72775228399992], [-73.85820066499991, 40.72839135199992], [-73.85812618599992, 40.728508245999905], [-73.8580876569999, 40.728568721999864], [-73.85775002599989, 40.72844560099985], [-73.85741240699991, 40.72832247999986], [-73.85771592500002, 40.728505460999926], [-73.85762923599995, 40.728606921999884], [-73.857827674, 40.72897471999988], [-73.85816500199988, 40.72962493499991], [-73.85837971299996, 40.73003567799985], [-73.85851097899999, 40.73028680199993], [-73.85625665099991, 40.73095912299993], [-73.85659673999993, 40.731623059999926], [-73.85704937999998, 40.732512433999894], [-73.85730927099998, 40.73300411099996], [-73.85765183100001, 40.73366788599986], [-73.85799293699985, 40.73433365699993], [-73.85834345899994, 40.73500123999988], [-73.8585833349998, 40.73547194199987], [-73.85867078199992, 40.73561895999997], [-73.85872465799989, 40.73570864399988], [-73.85862016399997, 40.73573990699991], [-73.85801767699988, 40.73590708399994], [-73.8566154109999, 40.73633083699988], [-73.85628567699989, 40.73642604299987], [-73.85567427699986, 40.73658665799995], [-73.85505083399991, 40.736720220999885], [-73.85415418099988, 40.73687781299987], [-73.85340136499995, 40.73700275799991], [-73.85244443499992, 40.737202311999916], [-73.85187067499986, 40.73734292899995], [-73.85130352699998, 40.73751172799992], [-73.8508760629999, 40.73765385999991], [-73.85079216499992, 40.73768175599991], [-73.8499544029998, 40.737960303999884], [-73.84956453799992, 40.738106091999875], [-73.84859447999989, 40.73850117099989], [-73.84801295299997, 40.73876334399993], [-73.84750820299992, 40.73900780699995], [-73.84746313999992, 40.73895203099994], [-73.84732494199989, 40.738771457999896]]]}}, {\&quot;id\&quot;: \&quot;95\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 96, \&quot;Shape_Leng\&quot;: 0.185180248095, \&quot;Shape_Area\&quot;: 0.000547566253402, \&quot;zone\&quot;: \&quot;Forest Park/Highland Park\&quot;, \&quot;LocationID\&quot;: 96, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.83804164799996, 40.70832329499994], [-73.83773266099998, 40.70821535699991], [-73.83743395899987, 40.70809301499986], [-73.83743389999984, 40.70809298699988], [-73.83743384099994, 40.70809296099992], [-73.83714702999997, 40.70795704599989], [-73.83781050699982, 40.70698817599987], [-73.83790705599984, 40.706871460999864], [-73.83790716199995, 40.7068713259999], [-73.83790724599992, 40.70687119099992], [-73.83798758599988, 40.706743142999834], [-73.83798760999981, 40.70674309799987], [-73.83798763399989, 40.70674305399993], [-73.83804872099981, 40.70660560399997], [-73.83804876799985, 40.706605495999945], [-73.83804879199987, 40.70660539699989], [-73.83808807400005, 40.706461289999936], [-73.83808812099979, 40.70646110899985], [-73.83808814499993, 40.70646092899994], [-73.83810401799988, 40.7063130239999], [-73.83809585899986, 40.70616468899991], [-73.83809584699989, 40.70616458099993], [-73.83809582399991, 40.7061644729999], [-73.83806408500001, 40.706019256999866], [-73.83806406099988, 40.70601912199987], [-73.83806401399981, 40.70601898699988], [-73.83801015599994, 40.70587982699987], [-73.83801013199992, 40.7058797729999], [-73.83801010900005, 40.70587971799994], [-73.83793647999991, 40.705749291999865], [-73.83793643299985, 40.705749219999866], [-73.83793637399988, 40.70574914799994], [-73.83784595199988, 40.70562953999993], [-73.83733095699989, 40.704854975999886], [-73.83696237799982, 40.70421245199992], [-73.83856418299983, 40.70329696899991], [-73.83947815200001, 40.70269019399994], [-73.84156378099983, 40.70110059799985], [-73.84215844799995, 40.700902563999875], [-73.842365123, 40.700832543999915], [-73.84236528999996, 40.700832489999904], [-73.84236544299989, 40.7008324279999], [-73.84256506999995, 40.70075073599988], [-73.84256525999987, 40.70075065499986], [-73.8425654379999, 40.700750565999925], [-73.8427564879998, 40.70065776799991], [-73.84275664199988, 40.70065769499992], [-73.84275678399989, 40.70065761499992], [-73.84293789599988, 40.700554428999894], [-73.84359398099988, 40.70017235199988], [-73.84427352200001, 40.69978050599992], [-73.84502472899999, 40.6993593769999], [-73.84700405300002, 40.698825210999914], [-73.84789669799994, 40.69860032899992], [-73.84820912899981, 40.69851840899985], [-73.84913837299978, 40.69828274099995], [-73.85070842300001, 40.70020312499988], [-73.85410116499996, 40.70051374799992], [-73.85443455699989, 40.70060295199994], [-73.85429389599985, 40.700445760999926], [-73.85377512599996, 40.6999095679999], [-73.85328620599985, 40.69928735699989], [-73.8527113089999, 40.69841496199995], [-73.85265915099988, 40.698266471999915], [-73.85262446500002, 40.698114106999896], [-73.85260789899989, 40.697959664999885], [-73.8526096609999, 40.69780503999987], [-73.85262948599983, 40.697652077999926], [-73.85277238699999, 40.69755711199987], [-73.85283544399991, 40.69754896199987], [-73.85478796099983, 40.69729662299988], [-73.85567421900002, 40.69717935799988], [-73.85657185199995, 40.69706469199983], [-73.85744447700002, 40.6969129849999], [-73.8583307899999, 40.69674371099995], [-73.85928498399986, 40.69655371099988], [-73.86016364299988, 40.6963846579999], [-73.86236834199985, 40.69595014299991], [-73.86368656399996, 40.695691417999925], [-73.8645570889999, 40.695520456999915], [-73.86681433899996, 40.69506535099989], [-73.86842489800001, 40.69471811999993], [-73.86891704399994, 40.69515042299987], [-73.870042929, 40.69494148499996], [-73.874020533, 40.69419129499994], [-73.87939315099985, 40.691209631999875], [-73.87950641199996, 40.69114676899987], [-73.87956139399984, 40.691104780999915], [-73.88118296199987, 40.689866269999904], [-73.88226665499997, 40.689038550999896], [-73.88377698600002, 40.68786341099992], [-73.88452250999984, 40.68668474899988], [-73.88728392899995, 40.68562247499987], [-73.88808341799984, 40.68529363199983], [-73.8890889529999, 40.68464055299995], [-73.88962787599998, 40.684236453999894], [-73.89015418699982, 40.68500398999987], [-73.8916601069998, 40.6840441779999], [-73.89252316899987, 40.683424532999865], [-73.89274142399994, 40.683670185999866], [-73.89404051299984, 40.68513229799984], [-73.89414204200001, 40.68524656699989], [-73.89417463299992, 40.6852832479999], [-73.8950492689999, 40.68436259899988], [-73.89530504899982, 40.684080519999966], [-73.89554859499991, 40.68379189199988], [-73.89561476599985, 40.68370742199992], [-73.89577945499994, 40.6834971829999], [-73.8959972739999, 40.683196878999894], [-73.89620169599988, 40.68289148199994], [-73.89628634799988, 40.682758382999914], [-73.896358989, 40.68262086699989], [-73.896367991, 40.68259975699988], [-73.89641909099993, 40.68247987599991], [-73.89643010499985, 40.682446358999925], [-73.89646625099995, 40.68233642199988], [-73.8965264419999, 40.682403298999894], [-73.90116155099986, 40.687877934999946], [-73.90042465099988, 40.688183897999856], [-73.90180467199995, 40.6907662979999], [-73.90123290699994, 40.69144227899997], [-73.90103661799981, 40.691845252999904], [-73.9003866789998, 40.69313995999992], [-73.900030392, 40.693437450999895], [-73.89973223499982, 40.69351918299989], [-73.89935202799984, 40.69364779599994], [-73.89896466800003, 40.69376479299993], [-73.89857107699993, 40.69386983399992], [-73.89817221699985, 40.693962657999926], [-73.89776907799997, 40.69404304999986], [-73.89736265799978, 40.6941108469999], [-73.89691021299986, 40.69384226999992], [-73.89742730199983, 40.69328897999988], [-73.89764233499987, 40.69340865099986], [-73.89768631800001, 40.69336525799989], [-73.89695653499987, 40.6919492069999], [-73.89576145299988, 40.69233462199984], [-73.89474270999995, 40.6926369519999], [-73.89326209899984, 40.69220094699994], [-73.89357935000005, 40.69308532899988], [-73.89398113199998, 40.69307596499988], [-73.89558625499984, 40.693979161999884], [-73.8950769439999, 40.694591389999886], [-73.89245207599993, 40.695225727999855], [-73.89195658699997, 40.694410569999896], [-73.88919365299998, 40.694935769999894], [-73.88828642399997, 40.69523691699991], [-73.88865416899996, 40.69582954899994], [-73.88648530299996, 40.6964399149999], [-73.88642048199995, 40.696458148999945], [-73.88681137199994, 40.69666794799984], [-73.88699989899986, 40.6967711439999], [-73.88717721900005, 40.69689008599989], [-73.88734003299987, 40.6970236659999], [-73.88748536199982, 40.69717024899989], [-73.88761064199986, 40.69732774499996], [-73.88771392599995, 40.697493692999906], [-73.88779396299992, 40.697665426999905], [-73.88785023699991, 40.69784014499988], [-73.88788297599991, 40.69801511999985], [-73.88809909499986, 40.69876329599988], [-73.88818025800003, 40.69885791099992], [-73.88771297999986, 40.699678075999906], [-73.8867672829999, 40.69982608499987], [-73.88584205499986, 40.69996547099991], [-73.88492223099993, 40.70010402699988], [-73.88431619499985, 40.70020119599994], [-73.88384293499996, 40.70034725999994], [-73.88343086899987, 40.70047443799989], [-73.88280948499987, 40.7006834549999], [-73.88273014799978, 40.700549908999925], [-73.88182690599986, 40.69952929899987], [-73.88106992699986, 40.69979988799984], [-73.880246012, 40.70009334899991], [-73.87942953599995, 40.70040484899988], [-73.87860797499998, 40.700704187999875], [-73.87778919199995, 40.701013620999916], [-73.87621714199997, 40.70159500499993], [-73.87625758399986, 40.70174876599991], [-73.87639785199997, 40.70229404199989], [-73.87543139399997, 40.702374352999875], [-73.8744627409999, 40.70245683199996], [-73.87351208999992, 40.70253545899994], [-73.87256153500006, 40.7026120979999], [-73.87210385799979, 40.70264976299988], [-73.87164751899996, 40.702687309999895], [-73.87073324199999, 40.70276203899995], [-73.86981898499995, 40.702837929999845], [-73.86915596200001, 40.702893432999865], [-73.86903271499997, 40.70290390099996], [-73.86873243499991, 40.702929097999856], [-73.86824273999996, 40.70297019599989], [-73.86724652399994, 40.703051654999875], [-73.86653775700002, 40.703109737999895], [-73.86564021600002, 40.70318258999988], [-73.8647283009999, 40.70325882199997], [-73.86379389300001, 40.70333379599989], [-73.86341506899986, 40.7033788049999], [-73.86285374199994, 40.7034144919999], [-73.86241891699996, 40.703377473999865], [-73.86142263099983, 40.70326975799987], [-73.86068159399994, 40.70318418699986], [-73.85997492299997, 40.70310890199989], [-73.85874741999989, 40.702974297999894], [-73.858530295, 40.7029497089999], [-73.85824915999993, 40.702916934999905], [-73.85819890699996, 40.70291107399986], [-73.85823494999983, 40.7028328909999], [-73.85893224399979, 40.70132034499989], [-73.85827405799986, 40.70122365899992], [-73.85739221099976, 40.701213978999895], [-73.85725351500002, 40.70121217699989], [-73.85716688299983, 40.70167410499991], [-73.85630830699988, 40.70183818199996], [-73.85538910499996, 40.701976915999836], [-73.85529571500001, 40.70199100999991], [-73.85529275899978, 40.702595501999944], [-73.85518109699989, 40.702583266999895], [-73.85252019099998, 40.70229172399997], [-73.85305663899999, 40.703137045999945], [-73.85371219899997, 40.70391788699991], [-73.85389480199986, 40.704183418999904], [-73.85392092799985, 40.70422140899995], [-73.85396105499991, 40.7042642169999], [-73.85411264799981, 40.70442593399984], [-73.854739573, 40.70518484999995], [-73.85473254599995, 40.706731913999924], [-73.85473240499985, 40.70676414299989], [-73.85275370600007, 40.70739714799987], [-73.85268225699998, 40.70741814499989], [-73.85110121699995, 40.707900982999895], [-73.85059051099984, 40.70803988299985], [-73.8504290539999, 40.7080870669999], [-73.84951207399992, 40.708345660999925], [-73.84933156199999, 40.70838833399994], [-73.84914591599988, 40.7084193199999], [-73.84895712599986, 40.70843813799993], [-73.84876725200003, 40.70844457799991], [-73.8485783879999, 40.708438720999894], [-73.8476241019999, 40.708332622999855], [-73.84665724099989, 40.70831864199995], [-73.84615958399984, 40.70835082099995], [-73.84567198199987, 40.70841036599989], [-73.84528898599984, 40.70847667899995], [-73.84491011200004, 40.708560330999944], [-73.84453738799996, 40.708661054999894], [-73.84417281299982, 40.70877842099986], [-73.84381825699984, 40.70891182099991], [-73.84347552199995, 40.70906047099992], [-73.84321861899991, 40.70918746199985], [-73.84314625299982, 40.70922345599992], [-73.84296437499994, 40.7091949589999], [-73.84290926199998, 40.70918631999993], [-73.84280177899991, 40.70916947799993], [-73.84220736299994, 40.709076316999884], [-73.84159160299998, 40.70898160199991], [-73.84151213299992, 40.7089693809999], [-73.84144586899984, 40.70895751099992], [-73.8409080659998, 40.70887501099991], [-73.84069937599986, 40.708841168999896], [-73.83975789399979, 40.70868851299985], [-73.83938086799994, 40.70862603399992], [-73.83911666099988, 40.70857492899989], [-73.83901101199996, 40.70855449199996], [-73.83868296400001, 40.70849332099987], [-73.8386827869999, 40.70849328499984], [-73.83868260999992, 40.70849323899989], [-73.83835899099991, 40.70841610699994], [-73.83829235499985, 40.70839661699987], [-73.83804164799996, 40.70832329499994]]]}}, {\&quot;id\&quot;: \&quot;96\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 97, \&quot;Shape_Leng\&quot;: 0.0624760147423, \&quot;Shape_Area\&quot;: 0.000163303970435, \&quot;zone\&quot;: \&quot;Fort Greene\&quot;, \&quot;LocationID\&quot;: 97, \&quot;borough\&quot;: \&quot;Brooklyn\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.9693409769999, 40.69576842999993], [-73.96880989600005, 40.69312038199996], [-73.96983118499983, 40.69313424399997], [-73.96952115199994, 40.69156355899989], [-73.96910362499993, 40.68946752199986], [-73.97013154199992, 40.68950630799986], [-73.9697831419999, 40.68775161199994], [-73.96948939899981, 40.68628830699986], [-73.96906202000002, 40.68415736099991], [-73.96867398499988, 40.68208599299987], [-73.96868961400001, 40.68200525799988], [-73.96969385699984, 40.68221680499988], [-73.97067424999982, 40.68242096299987], [-73.97186424199982, 40.68267028699993], [-73.97264904900005, 40.68282745499995], [-73.97278445899987, 40.68285242199992], [-73.97375598499991, 40.68303401999988], [-73.97483191299989, 40.68323523699998], [-73.97595299799993, 40.68347469799988], [-73.97624898299998, 40.68355587799986], [-73.97653928699988, 40.683649050999854], [-73.97676303199997, 40.68373178199996], [-73.97682267999997, 40.68375383799986], [-73.97709796699996, 40.6838697799999], [-73.97745722099988, 40.68405228699988], [-73.97804289599988, 40.68485661499987], [-73.97827416099987, 40.685195951999944], [-73.97899402899994, 40.686156131999894], [-73.97909065799995, 40.68629386599988], [-73.97936297699988, 40.686681999999934], [-73.97959037699985, 40.68700390199995], [-73.97984055899983, 40.68734433199992], [-73.98012756199996, 40.68775000899993], [-73.98064972099985, 40.688459476999874], [-73.980691182, 40.68851581099992], [-73.9808430809999, 40.688761361999916], [-73.98092822899991, 40.68890247699988], [-73.98101786899988, 40.68893792699991], [-73.98155298299992, 40.689146163999936], [-73.98209737999989, 40.68935800999991], [-73.98295657299988, 40.689699730999905], [-73.98372011099993, 40.69000671899992], [-73.9835048569999, 40.69000570599997], [-73.98313467299995, 40.690002276999884], [-73.98276720199986, 40.68998648099992], [-73.98157420399987, 40.68993518299992], [-73.98147568199991, 40.689930943999876], [-73.98150118599992, 40.68998815499986], [-73.98213180199994, 40.69122723699989], [-73.98206215699987, 40.69131209099991], [-73.98178907299996, 40.691644867999905], [-73.98179025899985, 40.69202541599988], [-73.98175888999991, 40.692955172999895], [-73.98253983699992, 40.693002615999944], [-73.98251122999989, 40.69361433399992], [-73.98242892099991, 40.693610852999925], [-73.98234987399988, 40.69360788799985], [-73.9822668969999, 40.693604775999866], [-73.9817531689998, 40.69358338499997], [-73.98154756999999, 40.69357778999993], [-73.98147150299985, 40.693574934999965], [-73.98098333199992, 40.69355661699993], [-73.98011299200002, 40.6935238809999], [-73.97916718399999, 40.69348832299992], [-73.97921799199992, 40.69362565199984], [-73.97921806199986, 40.69362583099995], [-73.97921815699976, 40.69362600299992], [-73.97928950399996, 40.69375974199993], [-73.97928957499984, 40.693759866999926], [-73.9792896699999, 40.69375999399987], [-73.97938094200002, 40.69388775699988], [-73.97949049699993, 40.69400690499993], [-73.979490615, 40.694007030999906], [-73.97949074499996, 40.69400713999986], [-73.97961626399982, 40.69411542199983], [-73.97961635799989, 40.6941155019999], [-73.97961647699987, 40.694115582999935], [-73.97975539199989, 40.69421147699993], [-73.97986236999992, 40.694290091999946], [-73.97995651799985, 40.69438029499986], [-73.9800347509999, 40.69448012199993], [-73.98009475099997, 40.694587003999835], [-73.98013518099992, 40.694698016999936], [-73.9801557449999, 40.694810117999964], [-73.98021990699989, 40.6952871029999], [-73.98024270299999, 40.69545652899992], [-73.9802635679999, 40.69563447299992], [-73.98031019799991, 40.695905994999876], [-73.9803568289999, 40.69617751699992], [-73.98037063399991, 40.69626304999989], [-73.98038723500002, 40.696382911999926], [-73.98039561699981, 40.69644348999992], [-73.9804026989999, 40.696502104999915], [-73.9804096149999, 40.696559343999915], [-73.98050926199988, 40.69744627499991], [-73.98054419199988, 40.69824651199988], [-73.97808892799996, 40.69813832499989], [-73.97753101699978, 40.698115812999916], [-73.97678642599985, 40.69808694699989], [-73.97578275800007, 40.698047729999864], [-73.97478615599996, 40.69800455299992], [-73.97377513399991, 40.697959390999884], [-73.97332378599988, 40.697939650999906], [-73.97279477799988, 40.69792083799993], [-73.97178445299986, 40.697882663999955], [-73.97076190899998, 40.69783928399989], [-73.9697278989999, 40.69780401399986], [-73.9693945009999, 40.696080388999846], [-73.96937861700003, 40.695991333999906], [-73.9693719569999, 40.695937759999936], [-73.96935567900005, 40.69585472899994], [-73.9693409769999, 40.69576842999993]]]}}, {\&quot;id\&quot;: \&quot;97\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 98, \&quot;Shape_Leng\&quot;: 0.121661018278, \&quot;Shape_Area\&quot;: 0.000485773020954, \&quot;zone\&quot;: \&quot;Fresh Meadows\&quot;, \&quot;LocationID\&quot;: 98, \&quot;borough\&quot;: \&quot;Queens\&quot;}, \&quot;geometry\&quot;: {\&quot;type\&quot;: \&quot;Polygon\&quot;, \&quot;coordinates\&quot;: [[[-73.76360860199983, 40.73917476499987], [-73.76268297099985, 40.73725583599988], [-73.76259694699998, 40.73708732599994], [-73.76253086199996, 40.73691167999987], [-73.76248609299991, 40.73673098099987], [-73.76246348299985, 40.73654750099995], [-73.76246334599998, 40.73636362499993], [-73.76248538699991, 40.73618169499987], [-73.76252875800003, 40.73600396099994], [-73.76273303499985, 40.73526216299995], [-73.76311240499989, 40.73516391399993], [-73.76318167799995, 40.735144947999906], [-73.76349692299982, 40.73504763299994], [-73.76388970599984, 40.73492638099988], [-73.7642906499999, 40.73480260699987], [-73.76503749400005, 40.73457204399988], [-73.76510920699994, 40.73455658499992], [-73.76470929199999, 40.73408485499987], [-73.76374010499987, 40.73291287299987], [-73.7636997919999, 40.73286411699993], [-73.76434014999984, 40.73275295499994], [-73.76491667699993, 40.73265467299992], [-73.76555086000002, 40.732544282999925], [-73.76564374500005, 40.732533126999954], [-73.76558856199988, 40.732467520999876], [-73.765288304, 40.732114664999905], [-73.7648685299999, 40.73166863999996], [-73.76435071499999, 40.73115119199987], [-73.76381866799998, 40.73068357399991], [-73.76327537799996, 40.730240540999915], [-73.76234209799992, 40.72953829099986], [-73.76160814399992, 40.72904753399989], [-73.76114083699993, 40.72879441399988], [-73.76024211099985, 40.728307611999874], [-73.75993818299987, 40.72815841199989], [-73.75831675599993, 40.727362406999916], [-73.75787141499994, 40.72710685099989], [-73.75684854799977, 40.72635581199993], [-73.75678272799996, 40.72630578399985], [-73.7567473959999, 40.72627289499993], [-73.75669771299987, 40.7262287109999], [-73.75677678599992, 40.72620833599996], [-73.75683174999999, 40.726194017999916], [-73.75698318299987, 40.72616032499988], [-73.75721902199992, 40.72610785499997], [-73.75755793699986, 40.7260324399999], [-73.75796018499997, 40.72595204999991], [-73.75835433199994, 40.72588850899994], [-73.75879801899991, 40.72584059599993], [-73.75922708600002, 40.72580597799991], [-73.75955973699996, 40.7258022329999], [-73.75994854100003, 40.72580527799991], [-73.76017281699988, 40.7258140209999], [-73.76083705999996, 40.725877042999855], [-73.76102756099999, 40.72589417899992], [-73.76181677799993, 40.72600393899992], [-73.7620440879999, 40.72603512499993], [-73.76241922899995, 40.726086592999934], [-73.76368265699995, 40.72625991699991], [-73.76376765199994, 40.72627157299995], [-73.76386689499986, 40.7262841589999], [-73.76475781199981, 40.72639712399995], [-73.76545422799997, 40.72638236199985], [-73.7654693229998, 40.72638204199991], [-73.76568253199987, 40.726377523999886], [-73.76610679099996, 40.72633693499997], [-73.76618933199987, 40.72632947499991], [-73.76629387899985, 40.726318367999944], [-73.76660888099983, 40.726267875999966], [-73.76717559599999, 40.72618267299988], [-73.76745788000002, 40.72613928099987], [-73.76856605399993, 40.72585397099989], [-73.76856674299998, 40.72586018599985], [-73.76856792799998, 40.72586650099986], [-73.7685696449999, 40.72587288899995], [-73.768571885, 40.72587934999989], [-73.76857466699992, 40.72588583999987], [-73.76857799399986, 40.72589235699989], [-73.76858186599988, 40.72589887499988], [-73.76858628199994, 40.72590537699995], [-73.76859122999998, 40.7259118259999], [-73.76859671300002, 40.72591821299991], [-73.76860271599992, 40.725924518999896], [-73.76860920399997, 40.725930700999896], [-73.7686161789998, 40.72593676599994], [-73.76862361599991, 40.725942669999874], [-73.76863146699995, 40.72594840399995], [-73.76863972199986, 40.72595394099988], [-73.76864834499995, 40.72595927999993], [-73.7686572999999, 40.72596439499989], [-73.76866656199985, 40.7259692859999], [-73.76867607499993, 40.725973915999894], [-73.76868582499995, 40.72597829299986], [-73.76869575399984, 40.72598241999985], [-73.7687058369998, 40.725986266999875], [-73.76871602799994, 40.72598984399985], [-73.76872630299988, 40.72599314299992], [-73.76924074899993, 40.72590270099988], [-73.7697527519999, 40.72578523199992], [-73.76991329299986, 40.72574839799991], [-73.77139578199996, 40.725350500999866], [-73.77163268999986, 40.72527440499992], [-73.77165390499994, 40.72526758999993], [-73.77224702999986, 40.7250770729999], [-73.77286784099987, 40.72486798499995], [-73.77348555899981, 40.7246249519999], [-73.77372529499999, 40.724530629999926], [-73.77423835499987, 40.72431652299992], [-73.774371087, 40.72426113199986], [-73.77496975299988, 40.72398806099991], [-73.77524876600002, 40.723843161999895], [-73.77548473600002, 40.723720613999866], [-73.77587312899986, 40.7234728209999], [-73.7760563109999, 40.72335593999985], [-73.776032805, 40.72336247699992], [-73.77583631399985, 40.72343173999993], [-73.77600685799993, 40.723303568999924], [-73.77727808000003, 40.72234633599988], [-73.77732562899998, 40.722392700999926], [-73.77738048899985, 40.72244906299987], [-73.77757868099984, 40.72264221799984], [-73.77774895399996, 40.72284210999989], [-73.7778760189999, 40.72303670299993], [-73.77803765999981, 40.723284268999855], [-73.77781693000003, 40.723339142999876], [-73.77759997899993, 40.72341057599986], [-73.77738999299997, 40.72349836699989], [-73.77719009799996, 40.723601881999905], [-73.7770032789999, 40.723720008999905], [-73.77683220599998, 40.7238512149999], [-73.77667910999996, 40.72399361299994], [-73.77654571399995, 40.72414504599983], [-73.7764331279998, 40.724303181999886], [-73.77634188999991, 40.72446564699988], [-73.7752338719998, 40.725237532999884], [-73.77556110500004, 40.72596986399986], [-73.77596177499996, 40.72681284899995], [-73.77672825799984, 40.72843008099995], [-73.7775479359998, 40.730136776999885], [-73.77757506899988, 40.73019327299987], [-73.77848636199998, 40.72994389499989], [-73.77936529399982, 40.72970186799997], [-73.78024774699996, 40.72945982399991], [-73.78116054999998, 40.72921275899992], [-73.78205851399986, 40.728918895999875], [-73.78292253099987, 40.72863594899996], [-73.78360140199989, 40.72841281999988], [-73.78397695399983, 40.728291396999964], [-73.78482734399982, 40.72801171499994], [-73.78568492899991, 40.727730192999914], [-73.78619017499982, 40.727563574999905], [-73.78655584699987, 40.727441503999906], [-73.78738339699986, 40.72717198199993], [-73.78825003899982, 40.726886972999935], [-73.78911280699997, 40.7266001679999], [-73.78964444799998, 40.72642499899994], [-73.78998042299995, 40.726317244999954], [-73.79085659799983, 40.72602748899991], [-73.7916922309998, 40.7257923849999], [-73.79174472699992, 40.725788849999944], [-73.79176169599994, 40.7258396519999], [-73.79191210299997, 40.72620816199992], [-73.79204513299999, 40.72655107399986], [-73.79229974199997, 40.72714071899992], [-73.79283910399985, 40.72842900799989], [-73.79322750899982, 40.72934789399992], [-73.79352516299998, 40.73005381599991], [-73.79378938699999, 40.730701180999866], [-73.79384983499995, 40.73124678299997], [-73.79381937199997, 40.731657387999874], [-73.793909425, 40.73171777599989], [-73.79392707899994, 40.73199969399992], [-73.79397708699996, 40.73229685299988], [-73.7942776749999, 40.73269614499986], [-73.79438449799987, 40.73286592899996], [-73.79447360099982, 40.73304250799991], [-73.79454395199986, 40.73322422999991], [-73.79459486499994, 40.73340935799989], [-73.794626052, 40.73359608899993], [-73.79459579399989, 40.7345442459999], [-73.79458633199991, 40.73505225199988], [-73.79516450899986, 40.73641140399995], [-73.79594852799994, 40.73781371899989], [-73.79584803299987, 40.7380746799999], [-73.79651029099988, 40.7379086369999], [-73.7965035009998, 40.73800383599993], [-73.79607605199982, 40.738144297999945], [-73.79636108899999, 40.73812415299987], [-73.79639000899994, 40.73823357999985], [-73.79640218700004, 40.73828235799987], [-73.79611584799986, 40.73833613999987], [-73.79588681699978, 40.73837637499989], [-73.79533772999987, 40.738493672999915], [-73.79440801799996, 40.73874822999989], [-73.79369341399999, 40.73895006199987], [-73.79297881699995, 40.73915188099988], [-73.79291603199995, 40.73916776099987], [-73.79285797099998, 40.73917973299994], [-73.79202817599997, 40.73940358099989], [-73.7911152649998, 40.73964983899984], [-73.79020750099997, 40.739894702999855], [-73.78934727299989, 40.74012633799987], [-73.7886511029998, 40.7403257139999], [-73.78848243499986, 40.7403682779999], [-73.78759444399994, 40.74061795799991], [-73.78673516799984, 40.74084177599985], [-73.78669085300001, 40.74085298599988], [-73.78664844699985, 40.74086674899993], [-73.78577051299996, 40.7411106799999], [-73.78484244599998, 40.74136852999993], [-73.78400944099984, 40.74159935699984], [-73.78349697199984, 40.74174135999992], [-73.7831101189999, 40.741848304999905], [-73.7821600969999, 40.742115548999905], [-73.78176526799983, 40.74221640599993], [-73.78137698899997, 40.74231999399989], [-73.78121857699983, 40.742362250999925], [-73.78100566399996, 40.74241954099993], [-73.78068584999994, 40.74250560699994], [-73.78036603499997, 40.74259166299987], [-73.77965641299991, 40.742729309999895], [-73.778599248, 40.742908122999886], [-73.77805835699986, 40.74298648899991], [-73.77579713399984, 40.743317665999925], [-73.77573836999991, 40.74332564699993], [-73.77569182399996, 40.74333358899985], [-73.77551238399991, 40.74335684299992], [-73.77486382100001, 40.74345333599993], [-73.77444330499989, 40.74351589999993], [-73.77403143100003, 40.74356760099993], [-73.77362185199992, 40.74363046299994], [-73.77321534699996, 40.74370439599986], [-73.77281267599984, 40.7437892489999], [-73.7724146099999, 40.743884844999926], [-73.77162097999985, 40.74415973099986], [-73.77156671899986, 40.74417951599989], [-73.77153402299984, 40.74419162499989], [-73.77145218799996, 40.7442215229999], [-73.77137678500003, 40.74425103599991], [-73.770389824, 40.74473791399991], [-73.76937164099995, 40.745220308999876], [-73.76857701200005, 40.74552220499988], [-73.76772991399994, 40.74577622599993], [-73.76770614499998, 40.74572274199992], [-73.76761507999991, 40.745526354999924], [-73.76697863000001, 40.74422296799987], [-73.76687853500006, 40.74409357899987], [-73.7667631489999, 40.74397036299992], [-73.76663352600005, 40.74385485299991], [-73.76649109699986, 40.74374842999987], [-73.76633756199995, 40.74365225899987], [-73.76617484699997, 40.743567271999936], [-73.76556849699985, 40.743258154999886], [-73.76515128799994, 40.74243734599991], [-73.76431495499992, 40.740672626999924], [-73.76360860199983, 40.73917476499987]]]}}, {\&quot;id\&quot;: \&quot;98\&quot;, \&quot;type\&quot;: \&quot;Feature\&quot;, \&quot;properties\&quot;: {\&quot;OBJECTID\&quot;: 99, \&quot;Shape_Leng