Navigation Menu

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Performance improvements loading dask dataframes from many big parquet files in cloud storage #7750

Closed
hhuuggoo opened this issue Jun 2, 2021 · 14 comments

Comments

@hhuuggoo
Copy link

hhuuggoo commented Jun 2, 2021

I'd like to improve the performance of loading dask dataframes from parquet when

  1. The parquet files are large (the pandas memory footprint of a single parquet file is approximately 30 GB)
  2. There are a large number of parquet files, so traversing the directory tree is slow, and loading metadata/statistics/file hierarchies from a single process/thread is not desirable
    I've experimented with both the Arrow dataset/legacy enginges, as well as the FastParquet engines.

arrow

  • split_row_groups option seems to work well for reducing the memory footprint. It splits up a single parquet file into multiple dataframes, which mitigates the memory problem.
  • Struggles with loading parquet metadata. This is true when passed a S3 folder, as well as when passed a list of S3 file paths

fastparquet

  • Does not have issues with the large number of parquet files when gather_statistics is False.
  • Cannot use split_row_groups so the resulting dataframes are too large.

The following code addresses this issue with the fastparquet backend (it's not suitable to be merged for many reasons)

class FastParquetPartsEngine(FastParquetEngine):
    @classmethod
    def read_metadata(
        cls,
        fs,
        paths,
        categories=None,
        index=None,
        gather_statistics=None,
        filters=None,
        split_row_groups=True,
        hive_partitions=None,
        **kwargs,
    ):
        assert not gather_statistics
        (meta, stats, parts, index) = super().read_metadata(
            fs, paths, categories=categories, index=index,
            gather_statistics=False,
            filters=filters, split_row_groups=split_row_groups,
            **kwargs
        )
        num_row_groups = [read_row_groups(fs, x) for x in paths]
        num_row_groups = compute(*num_row_groups)
        new_parts = []
        for p, nrg in zip(parts, num_row_groups):
            for rg in range(nrg):
                pp = copy.copy(p)
                pp.setdefault('kwargs', {})['row_group'] = rg
                pp.setdefault('kwargs', {})['hive_partitions'] = hive_partitions
                new_parts.append(pp)
        for name in hive_partitions:
            meta[name] = pd.Series(dtype='str')
        return (meta, stats, new_parts, index)
    @classmethod
    def read_partition(cls, fs, piece, columns, index, categories=(),
                       row_group=None, hive_partitions=None, **kwargs):
        # Dask passes row_group in via kwargs.  If you're breaking
        # the parquet file into parts, row_group must be passed in
        null_index_name = False
        if isinstance(index, list):
            if index == [None]:
                index = []
                null_index_name = True
            columns += index
        assert row_group is not None
        parquet_file = kwargs.pop("parquet_file", None)
        assert parquet_file is None
        assert isinstance(piece, tuple)
        assert isinstance(piece[0], str)
        parquet_file = ParquetFile(
            piece[0], open_with=fs.open, sep=fs.sep, **kwargs.get("file", {})
        )
        row_group = parquet_file.row_groups[row_group]
        if null_index_name:
            if "__index_level_0__" in parquet_file.columns:
                # See "Handling a None-labeled index" comment above
                index = ["__index_level_0__"]
                columns += index
        df = parquet_file.read_row_group_file(
            row_group,
            columns,
            categories,
            index=index,
            **kwargs.get("read", {}),
        )
        if hive_partitions:
            hive_partition_values = {k: None for k in hive_partitions}
            for url_part in piece[0].split('/'):
                for partition_name in hive_partitions:
                    if url_part.startswith(f'{partition_name}='):
                        value = url_part.split('=')[-1]
                        hive_partition_values[partition_name] = value
            for partition_name in hive_partitions:
                df[partition_name] = hive_partition_values[partition_name]
        return df
@delayed
def read_row_groups(fs, path):
    pqf = ParquetFile(path, open_with=fs.open, sep=fs.sep)
    return len(pqf.row_groups)

I wanted to see what others thought about how this could/should be solved. #7557 seems to be a more general version for solving this problem. I would need to adapt that for fastparquet. The approach in #7557 requires parquet metadata, In my code snippet I gather row-group information in parallel using dask. Would there be interest in distributed fetches of fastparquet metadata?

tagging @aktech who will be working on it with me. Also cc @martindurant and @rjzamora, since we've chatted about this a bit.

@martindurant
Copy link
Member

The approach in #7557 requires parquet metadata, In my code snippet I gather row-group information in parallel using dask. Would there be interest in distributed fetches of fastparquet metadata?

Before looking at the code, this is an interesting question. I don't believe there's a case elsewhere in dask where dask is used client-side in generating the graph.

In dask/fastparquet#619 , we at least concurrent fetch the metadata bytes if the filesystem happens to be async and support cat_file(url, start=-footer_size) (s3, http atm, using main branches). Also, that PR presents a cython parquet-specific thrift reader/writer than may be 4-10x faster at decoding than the thrift library. Whether the micro-benchmark would lead to a real improvement remains to be seen.

@rjzamora
Copy link
Member

rjzamora commented Jun 2, 2021

Before looking at the code, this is an interesting question. I don't believe there's a case elsewhere in dask where dask is used client-side in generating the graph.

I may be misunderstanding, but the arrow-based engines will fetch the parquet metadata in parallel via create_metadata_file when the global metadata is required, but there is not _metadata file available. Also, operations like set_index use Dask client side to figure out the new divisions to use in the shuffle.

Re arrow:

Struggles with loading parquet metadata. This is true when passed a S3 folder, as well as when passed a list of S3 file paths

Can you say more about this and share the command that is taking a long time? (I certainly believe you, but I'm also interested to know more)

@hhuuggoo - I agree that we should add create_metadata_file support for fastparquet (or somthing like your example if that is not possible).

@hhuuggoo
Copy link
Author

hhuuggoo commented Jun 2, 2021

Before looking at the code, this is an interesting question. I don't believe there's a case elsewhere in dask where dask is used client-side in generating the graph.

I may be misunderstanding, but the arrow-based engines will fetch the parquet metadata in parallel via create_metadata_file when the global metadata is required, but there is not _metadata file available. Also, operations like set_index use Dask client side to figure out the new divisions to use in the shuffle.

Well, now I'm questioning what I observed! Let me attempt to reproduce.

@hhuuggoo
Copy link
Author

hhuuggoo commented Jun 7, 2021

@rjzamora @martindurant I dug a litlte bit deeper (but I haven't dug into the arrow engine yet to confirm. Will look later). The dataset I was looking at was 800k files, and is non-public. However I took the NYC taxi dataset, and I re-partitioned it to create way more files than anyone should have for the data (30k files). That bucket/directory should be public if anyone wants to experiment.

For this number of files listing the directory takes 7.5 seconds

files = fs.ls('s3://saturn-public-data/nyc-taxi/taxi_parquet_speed_test')
files = ["s3://" + x for x in files]

Passing the files into fastparquet is fast - 1 second

ddf = dd.read_parquet(files, engine='fastparquet', gather_statistics=False, storage_options={'anon': True})

Passing the files into pyarrow is slow - 35 seconds

ddf = dd.read_parquet(files, engine='pyarrow-legacy', gather_statistics=False, storage_options={'anon': True})

Passing the directories into fastparquet and pyarrow are both fast - 1 second

ddf = dd.read_parquet("s3://saturn-public-data/nyc-taxi/taxi_parquet_speed_test", engine='fastparquet', gather_statistics=False, storage_options={'anon': True})
ddf = dd.read_parquet("s3://saturn-public-data/nyc-taxi/taxi_parquet_speed_test", engine='pyarrow-legacy', gather_statistics=False, storage_options={'anon': True})

@aktech
Copy link
Contributor

aktech commented Jun 22, 2021

@hhuuggoo I did some profiling on this and have some insights on the root cause. I believe this issue does not have much to do with pyarrow or dask.

Profiles

cProfile

cProfile ordered by internal time: Click here

Tue Jun 22 06:46:14 2021    arrow-output.dat

         196754 function calls (194441 primitive calls) in 13.735 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     4016   12.968    0.003   12.968    0.003 {method 'acquire' of '_thread.lock' objects}
     1003    0.604    0.001    0.604    0.001 {method 'send' of '_socket.socket' objects}
     2006    0.011    0.000    0.012    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:222(__init__)
     1003    0.009    0.000   13.633    0.014 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/asyn.py:37(sync)
     2001    0.008    0.000    0.017    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:417(urlsplit)
     1004    0.007    0.000   12.978    0.013 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:270(wait)
        1    0.006    0.006   11.350   11.350 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:1436(_make_manifest)
     1005    0.005    0.000   12.986    0.013 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:540(wait)
     1003    0.005    0.000    0.627    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/tasks.py:900(run_coroutine_threadsafe)
     1002    0.005    0.000   13.451    0.013 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/asyn.py:84(wrapper)
     2000    0.005    0.000    0.005    0.000 {method 'split' of 're.Pattern' objects}
    23168    0.004    0.000    0.005    0.000 {built-in method builtins.isinstance}
     1000    0.004    0.000    0.025    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/utils.py:14(infer_storage_options)
     1000    0.003    0.000    0.004    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:718(__init__)
     1003    0.003    0.000    0.003    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/events.py:32(__init__)
     1000    0.002    0.000    0.004    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:407(_join_path)
     1003    0.002    0.000    0.007    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/concurrent/futures/_base.py:316(__init__)
     5001    0.002    0.000    0.003    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/re.py:289(_compile)
     2000    0.002    0.000    0.003    0.000 /Users/aktech/quansight/dask/dask/utils.py:1276(<listcomp>)
     1003    0.002    0.000    0.003    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/asyn.py:228(loop)
     1003    0.002    0.000    0.614    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/base_events.py:762(call_soon_threadsafe)
     1002    0.002    0.000    0.003    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:178(_strip_protocol)
     1003    0.002    0.000    0.005    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/base_events.py:738(_call_soon)
     1003    0.002    0.000    0.010    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:505(__init__)
     1000    0.002    0.000    0.003    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:391(_splitnetloc)
     1003    0.002    0.000    0.606    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/selector_events.py:129(_write_to_self)
     2007    0.002    0.000    0.002    0.000 {built-in method _thread.allocate_lock}
     3002    0.002    0.000    0.002    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:110(_coerce_args)
     1001    0.001    0.000    0.007    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:366(urlparse)
        1    0.001    0.001    0.007    0.007 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:401(_analyze_paths)
     5000    0.001    0.000    0.001    0.000 {method 'find' of 'str' objects}
     2000    0.001    0.000    0.011    0.000 /Users/aktech/quansight/dask/dask/utils.py:1250(natural_sort_key)
   1001/1    0.001    0.000    0.003    0.003 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/core.py:311(_un_chain)
     1004    0.001    0.000    0.002    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:258(_acquire_restore)
     2050    0.001    0.000    0.001    0.000 {method 'match' of 're.Pattern' objects}
     3003    0.001    0.000    0.001    0.000 {method 'split' of 'str' objects}
     2000    0.001    0.000    0.004    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/re.py:188(match)
     1003    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/coroutines.py:177(iscoroutine)
     1003    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:81(RLock)
7838/7630    0.001    0.000    0.001    0.000 {built-in method builtins.len}
     1005    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:249(__exit__)
     1000    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:195(_hostinfo)
     8138    0.001    0.000    0.001    0.000 {method 'append' of 'list' objects}
     2000    0.001    0.000    0.007    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/re.py:223(split)
     2002    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/util.py:81(_stringify_path)
     2000    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:183(_userinfo)
        3    0.001    0.000    0.012    0.004 {built-in method builtins.sorted}
     1000    0.001    0.000    0.025    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/s3fs/core.py:265(_get_kwargs_from_urls)
        1    0.001    0.001    0.035    0.035 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/core.py:534(get_fs_token_paths)
      271    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/base.py:411(find)
     1001    0.001    0.000    0.008    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:47(_parse_uri)
     1000    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/core.py:479(split_protocol)
     1003    0.001    0.000    0.001    0.000 {built-in method _asyncio.get_running_loop}
     3062    0.001    0.000    0.001    0.000 {built-in method __new__ of type object at 0x10e682808}
     2000    0.001    0.000    0.001    0.000 <string>:1(__new__)
     1005    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:246(__enter__)
     3002    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/utils.py:284(stringify_path)
  1019/15    0.001    0.000    0.001    0.000 /Users/aktech/quansight/dask/dask/utils.py:570(__call__)
     1003    0.001    0.000    0.001    0.000 {built-in method _contextvars.copy_context}
     4156    0.001    0.000    0.001    0.000 {method 'get' of 'dict' objects}
        1    0.001    0.001    0.001    0.001 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/arrow.py:1157(_construct_parts)
        1    0.001    0.001    0.005    0.005 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:461(<listcomp>)
     3083    0.001    0.000    0.001    0.000 {method 'startswith' of 'str' objects}
     1005    0.001    0.000    0.001    0.000 {method '__enter__' of '_thread.lock' objects}
     6000    0.001    0.000    0.001    0.000 {method 'isdigit' of 'str' objects}
     1000    0.001    0.000    0.002    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:166(port)
     1729    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/generic.py:30(_check)
     2000    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:399(_checknetloc)
     1004    0.001    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:261(_is_owned)
     1004    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/threading.py:255(_release_save)
    56/51    0.000    0.000    0.009    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:209(__init__)
        2    0.000    0.000    0.002    0.001 /Users/aktech/quansight/dask/dask/base.py:784(tokenize)
     1004    0.000    0.000    0.000    0.000 {built-in method posix.getpid}
     1000    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:147(username)
     3001    0.000    0.000    0.000    0.000 {method 'rpartition' of 'str' objects}
     1000    0.000    0.000    0.001    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:408(_scrub)
  180/157    0.000    0.000    0.000    0.000 {built-in method numpy.array}
    22/10    0.000    0.000    0.002    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:250(__new__)
     1000    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:151(password)
     2000    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:456(<genexpr>)
     2000    0.000    0.000    0.000    0.000 {method 'rsplit' of 'str' objects}
     1008    0.000    0.000    0.001    0.000 {built-in method builtins.any}
     3002    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:99(_noop)
2561/2559    0.000    0.000    0.000    0.000 {built-in method builtins.getattr}
     1003    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/base_events.py:648(is_closed)
  164/140    0.000    0.000    0.001    0.000 {built-in method builtins.all}
        1    0.000    0.000    0.004    0.004 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/core.py:601(<listcomp>)
        1    0.000    0.000    0.003    0.003 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/core.py:313(<listcomp>)
     1001    0.000    0.000    0.000    0.000 {built-in method builtins.min}
     2007    0.000    0.000    0.000    0.000 {method 'append' of 'collections.deque' objects}
     1003    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/base_events.py:506(_check_closed)
       61    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:185(__init__)
     2001    0.000    0.000    0.000    0.000 {method 'partition' of 'str' objects}
        1    0.000    0.000   13.688   13.688 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/arrow.py:483(read_metadata)
        1    0.000    0.000    0.008    0.008 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:1259(<listcomp>)
     1001    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/re.py:250(compile)
     1005    0.000    0.000    0.000    0.000 {method '__exit__' of '_thread.lock' objects}
      247    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1470(is_extension_array_dtype)
     2001    0.000    0.000    0.000    0.000 {method 'join' of 'str' objects}
      3/2    0.000    0.000    0.001    0.001 /Users/aktech/quansight/dask/dask/base.py:821(func)
      367    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/base.py:254(is_dtype)
      277    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/base.py:199(construct_from_string)
      339    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1610(_is_dtype_type)
        1    0.000    0.000    2.290    2.290 {method 'open' of 'pyarrow._parquet.ParquetReader' objects}
      202    0.000    0.000    0.000    0.000 {method 'clear' of 'dict' objects}
     1004    0.000    0.000    0.000    0.000 {method 'release' of '_thread.lock' objects}
    28/26    0.000    0.000    0.004    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/construction.py:423(sanitize_array)
       55    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:2641(get_block_type)
      129    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:5462(__setattr__)
       76    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:269(mgr_locs)
       69    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:127(__init__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/core.py:568(<listcomp>)
     1003    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/base_events.py:1877(get_debug)
        2    0.000    0.000    0.000    0.000 {built-in method _hashlib.openssl_md5}
     1023    0.000    0.000    0.000    0.000 {method 'lower' of 'str' objects}
       28    0.000    0.000    0.000    0.000 {method 'reduce' of 'numpy.ufunc' objects}
     1019    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/utils.py:544(dispatch)
    24/22    0.000    0.000    0.002    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/cast.py:1379(maybe_cast_to_datetime)
       47    0.000    0.000    0.004    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/frame.py:2987(__getitem__)
       62    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1769(pandas_dtype)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/core.py:497(expand_paths_if_needed)
     1019    0.000    0.000    0.000    0.000 {built-in method builtins.issubclass}
     1004    0.000    0.000    0.000    0.000 {method 'extend' of 'list' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/layers.py:1157(<dictcomp>)
        1    0.000    0.000   13.735   13.735 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/core.py:98(read_parquet)
        1    0.000    0.000   13.735   13.735 <string>:1(<module>)
     1000    0.000    0.000    0.000    0.000 {method 'isascii' of 'str' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/utils.py:7(_get_pyarrow_dtypes)
       23    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/range.py:85(__new__)
      190    0.000    0.000    0.000    0.000 {built-in method _abc._abc_instancecheck}
        2    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1327(_slice_take_blocks_ax0)
       15    0.000    0.000    0.000    0.000 {pandas._libs.lib.infer_dtype}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/json/decoder.py:343(raw_decode)
       45    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_dtype.py:321(_name_get)
     1001    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/core.py:594(<genexpr>)
       30    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:5406(__finalize__)
      238    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/inference.py:322(is_hashable)
  390/388    0.000    0.000    0.000    0.000 {built-in method builtins.hasattr}
     1002    0.000    0.000    0.000    0.000 {method 'replace' of 'str' objects}
     1001    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/core.py:603(<genexpr>)
       45    0.000    0.000    0.002    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:3780(_get_item_cache)
      106    0.000    0.000    0.000    0.000 {pandas._libs.lib.is_list_like}
     1002    0.000    0.000    0.000    0.000 {method 'rstrip' of 'str' objects}
       59    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:231(is_sparse)
    28/26    0.000    0.000    0.003    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/construction.py:554(_try_cast)
     1011    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/toolz/functoolz.py:19(identity)
       11    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/algorithms.py:1661(take_nd)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/arrow.py:1782(<listcomp>)
      105    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5953(maybe_extract_name)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/cast.py:1617(construct_1d_object_array_from_listlike)
      161    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1615(dtype)
      130    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:537(is_categorical_dtype)
       59    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:509(name)
       23    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5947(default_index)
       33    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:2690(make_block)
      104    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:5444(__getattr__)
       23    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:998(iget)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:232(_rebuild_blknos_and_blklocs)
       83    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/dtypes.py:1132(is_dtype)
      103    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:201(is_object_dtype)
       87    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/dtypes.py:923(is_dtype)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:4559(reindex)
       49    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:4279(__getitem__)
      105    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:463(is_period_dtype)
       60    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:459(name)
        1    0.000    0.000    0.013    0.013 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:395(_sort_and_analyze_paths)
      190    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/abc.py:96(__instancecheck__)
       83    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:703(is_integer_dtype)
      101    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:499(is_interval_dtype)
      100    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/urllib/parse.py:84(clear_cache)
        1    0.000    0.000    0.014    0.014 /Users/aktech/quansight/dask/dask/dataframe/io/utils.py:55(_meta_from_dtypes)
       87    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:388(is_datetime64tz_dtype)
       70    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:1017(_handle_fromlist)
       53    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1545(__init__)
       24    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/range.py:133(_simple_new)
      176    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/range.py:313(dtype)
      219    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:187(<lambda>)
        1    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1733(_form_blocks)
      161    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:444(dtype)
       28    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1577(from_array)
       76    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1307(is_float_dtype)
       30    0.000    0.000    0.000    0.000 {built-in method numpy.empty}
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/common.py:198(asarray_tuplesafe)
       11    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/algorithms.py:1534(_get_take_nd_function)
       48    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numerictypes.py:286(issubclass_)
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/numeric.py:180(_union)
       54    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:410(_set_axis)
      219    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:185(classes)
      120    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:195(<lambda>)
        1    0.000    0.000   13.735   13.735 {built-in method builtins.exec}
        1    0.000    0.000    0.015    0.015 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/arrow.py:1059(_generate_dd_meta)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1021(idelete)
        1    0.000    0.000   13.672   13.672 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/arrow.py:1674(_gather_metadata)
       59    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1743(validate_all_hashable)
       61    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/flags.py:47(__init__)
       86    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1575(get_dtype)
       16    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:425(_simple_new)
       13    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_asarray.py:221(require)
       52    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:355(is_datetime64_dtype)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:223(_build_nested_paths)
      128    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/range.py:747(__len__)
       44    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/ops/common.py:92(_maybe_match_name)
       49    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/construction.py:354(extract_array)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/blockwise.py:372(__init__)
       22    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:2644(union)
      285    0.000    0.000    0.000    0.000 {built-in method builtins.hash}
       36    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:288(make_block_same_class)
       70    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:429(is_timedelta64_dtype)
       29    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/inference.py:263(is_dict_like)
      221    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1588(_block)
        1    0.000    0.000    0.008    0.008 /Users/aktech/quansight/dask/dask/dataframe/io/utils.py:77(<dictcomp>)
       47    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:4230(__contains__)
       42    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:563(_reset_identity)
        1    0.000    0.000    0.002    0.002 /Users/aktech/quansight/dask/dask/dataframe/core.py:3813(<dictcomp>)
   121/98    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_asarray.py:14(asarray)
      118    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1762(<genexpr>)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numeric.py:2317(array_equal)
       23    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/frame.py:3303(_box_col_values)
       26    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1341(is_bool_dtype)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/dtypes.py:1078(construct_from_string)
        1    0.000    0.000    0.000    0.000 {method 'to_arrow_schema' of 'pyarrow._parquet.ParquetSchema' objects}
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/dtypes.py:870(construct_from_string)
      300    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:1232(name)
        2    0.000    0.000    0.000    0.000 {pandas._libs.lib.clean_index_list}
       69    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:161(_check_ndim)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:2116(maybe_convert_dtype)
      177    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:347(dtype)
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:2773(_wrap_setop_result)
       26    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/common.py:254(maybe_iterable_to_list)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1860(_stack_arrays)
       25    0.000    0.000    0.002    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5836(ensure_index)
        2    0.000    0.000    0.000    0.000 {built-in method pandas._libs.tslib.array_to_datetime}
       34    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/construction.py:612(is_empty_data)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/numpy_.py:156(__init__)
        1    0.000    0.000    0.001    0.001 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/core.py:1064(set_index_columns)
       32    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:573(is_string_dtype)
       45    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_dtype.py:307(_name_includes_bit_suffix)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/base.py:796(__iter__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:249(_parse_pandas_metadata)
      143    0.000    0.000    0.000    0.000 {pandas._libs.lib.is_scalar}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/construction.py:333(_homogenize)
       70    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/common.py:129(cast_scalar_indexer)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/dtypes.py:711(construct_from_string)
       46    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:157(ensure_python_int)
       90    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/inference.py:289(<genexpr>)
        1    0.000    0.000   11.371   11.371 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/arrow.py:1624(_get_dataset_object)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/common.py:170(all_none)
       23    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:4307(reindex)
        7    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:4393(equals)
    19/17    0.000    0.000    0.000    0.000 {built-in method numpy.core._multiarray_umath.implement_array_function}
       24    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numerictypes.py:360(issubdtype)
        9    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:6023(_maybe_cast_data_without_dtype)
        4    0.000    0.000    0.000    0.000 {method 'add' of 'pandas._libs.internals.BlockPlacement' objects}
        1    0.000    0.000   11.358   11.358 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:1243(__init__)
       24    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:3036(get_loc)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:4472(identical)
        1    0.000    0.000    0.000    0.000 {built-in method posix.urandom}
       30    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:337(_validate_dtype)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:1368(take_nd)
       46    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:4792(<genexpr>)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/cast.py:542(maybe_promote)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/arrow.py:348(_get_pandas_metadata)
       26    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:1239(name)
       44    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/ops/common.py:70(get_op_result_name)
       25    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:5517(_protect_consolidate)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/dtypes.py:277(construct_from_string)
      120    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:190(classes_and_not_datetimelike)
       30    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:467(_get_axis)
       33    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1551(_is_dtype)
        1    0.000    0.000    0.012    0.012 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1224(__init__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:1891(sequence_to_dt64ns)
        1    0.000    0.000   13.735   13.735 <ipython-input-5-9f00d55c0c2f>:1(read_parquet)
        2    0.000    0.000    0.000    0.000 {method 'get_indexer' of 'pandas._libs.index.IndexEngine' objects}
       30    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/flags.py:83(allows_duplicate_labels)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:1672(__init__)
       34    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1626(internal_values)
       14    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:206(shape)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/sparse/dtype.py:187(construct_from_string)
       24    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:692(__array__)
       44    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:912(is_datetime64_any_dtype)
       32    0.000    0.000    0.000    0.000 {method 'format' of 'str' objects}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/lib/function_base.py:4236(delete)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/layers.py:1137(__init__)
       12    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:290(_simple_new)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:1764(is_unique)
       17    0.000    0.000    0.000    0.000 {built-in method numpy.arange}
       24    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5287(_maybe_cast_indexer)
       25    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:591(array)
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/numeric.py:256(_can_union_without_object_cast)
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/range.py:560(_union)
       25    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:5533(f)
        4    0.000    0.000    0.000    0.000 {pandas._libs.algos.take_1d_int64_int64}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/tools/datetimes.py:267(_convert_listlike_datetimes)
        2    0.000    0.000    0.002    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/tools/datetimes.py:609(to_datetime)
      106    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:265(mgr_locs)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:421(_construct_axes_from_arguments)
       49    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/common.py:317(apply_if_callable)
        1    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/construction.py:364(extract_index)
        4    0.000    0.000    0.000    0.000 {pandas._libs.algos.take_2d_axis1_int64_int64}
       46    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:600(__len__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/lib/index_tricks.py:316(__getitem__)
        2    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1454(take)
       24    0.000    0.000    0.000    0.000 {method 'get_loc' of 'pandas._libs.index.IndexEngine' objects}
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/missing.py:367(array_equivalent)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/cast.py:1642(construct_1d_ndarray_preserving_na)
        3    0.000    0.000    0.000    0.000 {method 'astype' of 'numpy.ndarray' objects}
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:324(getitem_block)
        3    0.000    0.000    0.002    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:343(_init_dict)
       19    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:757(is_signed_integer_dtype)
       45    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_dtype.py:24(_kind_name)
        1    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/frame.py:4601(set_index)
      188    0.000    0.000    0.000    0.000 {method 'pop' of 'dict' objects}
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:126(__init__)
        5    0.000    0.000    0.005    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/frame.py:502(__init__)
        2    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:3142(get_indexer)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexers.py:225(maybe_convert_indices)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_ufunc_config.py:32(seterr)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/missing.py:465(_array_equivalent_object)
        2    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:3489(take)
       31    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:602(condition)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:1215(__new__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:59(__call__)
       13    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_asarray.py:298(<setcomp>)
        1    0.000    0.000    0.012    0.012 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/s3fs/core.py:1718(__init__)
        1    0.000    0.000    2.289    2.289 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/s3fs/core.py:1979(_fetch_range)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:376(apply)
       46    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:4485(<genexpr>)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:1268(_validate_read_indexer)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:3406(_set_as_cached)
        3    0.000    0.000    0.002    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/construction.py:632(create_series_with_explicit_dtype)
        1    0.000    0.000    0.005    0.005 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/construction.py:241(init_dict)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/string_.py:207(_from_sequence)
       34    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:556(_values)
       25    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:5529(_consolidate_inplace)
       18    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:813(is_unsigned_integer_dtype)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:574(_engine)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py:268(__array__)
       28    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:303(__len__)
       21    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:239(array_values)
        2    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:1221(_get_listlike_indexer)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/utils.py:14(<dictcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/uuid.py:130(__init__)
        1    0.000    0.000    2.290    2.290 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:214(__init__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/json/decoder.py:332(decode)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/algorithms.py:1374(wrapper)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1844(_multi_blockify)
        1    0.000    0.000    2.289    2.289 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/s3fs/core.py:1848(_fetch_range)
       24    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:1875(is_floating)
       18    0.000    0.000    0.000    0.000 {pandas._libs.algos.ensure_object}
        4    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/core.py:3979(__setattr__)
       74    0.000    0.000    0.000    0.000 {pandas._libs.lib.is_float}
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:3025(_convert_can_do_setop)
        2    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1260(reindex_indexer)
       13    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:615(is_dtype_equal)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/common.py:75(is_bool_indexer)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/_mixins.py:217(__getitem__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:309(_from_sequence_not_strict)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/datetimes.py:282(__new__)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/numpy_.py:41(__init__)
        1    0.000    0.000    0.002    0.002 /Users/aktech/quansight/dask/dask/dataframe/core.py:3805(__init__)
        9    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5969(_maybe_cast_with_dtype)
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/numpy_.py:202(__array__)
        1    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/api.py:161(union_indexes)
       34    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:453(_get_axis_number)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numerictypes.py:545(_can_coerce_all)
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1863(_asarray_compat)
       42    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:208(<genexpr>)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/weakref.py:103(remove)
        4    0.000    0.000    0.000    0.000 {built-in method pandas._libs.lib.is_datetime_array}
        1    0.000    0.000    0.012    0.012 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:927(open)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/cast.py:1677(maybe_cast_to_integer_array)
       60    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:245(flags)
       28    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:612(__len__)
        6    0.000    0.000    0.000    0.000 {pandas._libs.lib.array_equivalent_object}
        1    0.000    0.000    2.289    2.289 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/caching.py:345(_fetch)
       25    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:975(consolidate)
       25    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/missing.py:721(clean_reindex_fill_method)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/fromnumeric.py:70(_wrapreduction)
       20    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:351(iget)
        1    0.000    0.000    2.302    2.302 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:1135(_open_dataset_file)
        2    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/tools/datetimes.py:143(_maybe_cache)
       28    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:610(<genexpr>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/s3fs/core.py:284(split_path)
        1    0.000    0.000    0.001    0.001 /Users/aktech/quansight/dask/dask/dataframe/core.py:302(__init__)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:752(copy)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:372(apply)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:551(__array__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/utils.py:268(tokenize)
        8    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_dtype.py:178(_datetime_metadata_str)
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/range.py:474(equals)
        1    0.000    0.000    0.000    0.000 {built-in method pandas._libs.lib.ensure_string_array}
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:2134(_is_all_dates)
        1    0.000    0.000    2.289    2.289 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1449(read)
        1    0.000    0.000    0.012    0.012 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/s3fs/core.py:431(_open)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:2032(objects_to_datetime64ns)
       46    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:4070(_values)
       11    0.000    0.000    0.000    0.000 {method 'any' of 'numpy.ndarray' objects}
        1    0.000    0.000    0.000    0.000 {built-in method pandas._libs.missing.isnaobj}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:3478(reindex)
       27    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:157(blknos)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:450(<dictcomp>)
        3    0.000    0.000    0.000    0.000 {method 'hexdigest' of '_hashlib.HASH' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1951(_fast_count_smallints)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_ufunc_config.py:132(geterr)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:810(__getitem__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexers.py:363(check_array_indexer)
       46    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/common.py:174(<genexpr>)
        8    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:2222(_maybe_coerce_values)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/json/__init__.py:299(loads)
       23    0.000    0.000    0.000    0.000 {method 'search' of 're.Pattern' objects}
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/cast.py:698(_ensure_dtype_type)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/tools/datetimes.py:183(_box_as_indexlike)
       30    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:224(attrs)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:3937(__delitem__)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:510(_shallow_copy)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/missing.py:244(_isna_string_dtype)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:286(<listcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/filesystem.py:443(_ensure_filesystem)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:742(take)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/datetimelike.py:107(_simple_new)
       30    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:253(items)
       50    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:147(_maybe_coerce_values)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/string_.py:186(__init__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/cast.py:1257(maybe_castable)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:210(ndim)
        1    0.000    0.000    0.000    0.000 {method 'cumsum' of 'numpy.ndarray' objects}
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:3020(_assert_can_do_setop)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/missing.py:133(_isna)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/dispatch.py:88(make_meta)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/arrow.py:1125(<dictcomp>)
       55    0.000    0.000    0.000    0.000 {built-in method builtins.callable}
       42    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/typing.py:1822(new_type)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/uuid.py:778(uuid4)
        7    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:605(is_excluded_dtype)
       47    0.000    0.000    0.000    0.000 {pandas._libs.lib.item_from_zerodim}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:318(_verify_integrity)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1542(close)
       15    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_methods.py:53(_any)
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:2706(_union)
       46    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/numeric.py:164(_is_all_dates)
        2    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/config.py:436(get)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/highlevelgraph.py:63(__init__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/missing.py:202(_isna_ndarraylike)
        2    0.000    0.000    0.000    0.000 {pandas._libs.algos.take_2d_axis1_float64_float64}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:4119(_reduce)
       20    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1847(<lambda>)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/fromnumeric.py:2881(prod)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:2166(array_values)
        1    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1690(create_block_manager_from_arrays)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/core.py:1076(<listcomp>)
       13    0.000    0.000    0.000    0.000 {method 'ravel' of 'numpy.ndarray' objects}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:2169(iget)
        2    0.000    0.000    0.001    0.001 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:3588(_take_with_is_copy)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:319(_slice)
        3    0.000    0.000    0.000    0.000 <__array_function__ internals>:2(array_equal)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:3800(_slice)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:132(<listcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/nanops.py:241(_get_values)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/highlevelgraph.py:638(__init__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:5675(dtypes)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/_mixins.py:122(reshape)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/core.py:42(__init__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/algorithms.py:1570(take)
       12    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/numpy_.py:195(dtype)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/utils.py:96(update_storage_options)
       32    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:233(internal_values)
       10    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/_mixins.py:103(shape)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:1427(__invert__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:10558(_logical_func)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1602(get_slice)
       30    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/flags.py:51(allows_duplicate_labels)
        8    0.000    0.000    0.000    0.000 {method 'fill' of 'numpy.ndarray' objects}
        3    0.000    0.000    0.000    0.000 {method 'all' of 'numpy.ndarray' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:365(delete)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/s3fs/core.py:66(_coalesce_version_id)
        6    0.000    0.000    0.000    0.000 {built-in method builtins.max}
       24    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/numeric.py:78(_validate_dtype)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py:1776(maybe_infer_freq)
        8    0.000    0.000    0.000    0.000 {built-in method numpy.datetime_data}
        6    0.000    0.000    0.000    0.000 {method 'max' of 'numpy.ndarray' objects}
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:2127(inferred_type)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1958(_preprocess_slice_or_indexer)
       25    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:173(blklocs)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/caching.py:338(__init__)
        2    0.000    0.000    0.001    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:4946(get_indexer_for)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5011(_maybe_promote)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:776(get_slice)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/base.py:804(normalize_dict)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:2717(extend_blocks)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:1878(_slice)
        1    0.000    0.000    0.002    0.002 /Users/aktech/quansight/dask/dask/dataframe/core.py:6798(new_dd_object)
        7    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:532(is_)
        4    0.000    0.000    0.000    0.000 {method 'copy' of 'numpy.ndarray' objects}
        1    0.000    0.000    0.000    0.000 {built-in method _hashlib.openssl_sha256}
        1    0.000    0.000    0.000    0.000 {pandas._libs.algos.take_1d_object_object}
       11    0.000    0.000    0.000    0.000 {pandas._libs.algos.ensure_int64}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:5884(copy)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/registry.py:193(get_filesystem_class)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/inference.py:185(is_array_like)
       26    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/typing.py:1149(cast)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:689(_consolidate_check)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1699(<listcomp>)
        4    0.000    0.000    0.000    0.000 {method 'view' of 'numpy.ndarray' objects}
        1    0.000    0.000    0.000    0.000 {built-in method _operator.invert}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/numeric.py:47(__new__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5796(ensure_index_from_sequences)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:1504(_get_slice_axis)
        3    0.000    0.000    0.000    0.000 {method 'encode' of 'str' objects}
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_methods.py:56(_all)
        2    0.000    0.000    0.000    0.000 <__array_function__ internals>:2(prod)
        4    0.000    0.000    0.000    0.000 <__array_function__ internals>:2(can_cast)
        4    0.000    0.000    0.000    0.000 <__array_function__ internals>:2(ndim)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:333(_normalize_index_columns)
      3/2    0.000    0.000    0.001    0.001 /Users/aktech/quansight/dask/dask/base.py:819(normalize_seq)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py:209(_from_backing_data)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/string_.py:197(_validate)
       25    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/missing.py:64(clean_fill_method)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/backends.py:60(make_meta_pandas)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:319(<listcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:782(<listcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/blockwise.py:156(__init__)
       29    0.000    0.000    0.000    0.000 {method 'items' of 'dict' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/typing.py:868(__new__)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/_mixins.py:110(ndim)
        5    0.000    0.000    0.000    0.000 {method 'nonzero' of 'numpy.ndarray' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/base.py:840(normalize_object)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:2484(_maybe_coerce_values)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py:274(__getitem__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/utils.py:18(<dictcomp>)
        1    0.000    0.000    0.000    0.000 {method 'delete' of 'pandas._libs.internals.BlockPlacement' objects}
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5001(_index_as_unique)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:1749(_maybe_coerce_values)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:509(tz)
        2    0.000    0.000    0.000    0.000 {method 'take' of 'numpy.ndarray' objects}
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/_mixins.py:107(__len__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:2201(convert_to_index_sliceable)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:374(<listcomp>)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:473(_get_block_manager_axis)
       22    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:2636(_validate_sort_keyword)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:2235(check_bool_indexer)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:690(<listcomp>)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_ufunc_config.py:433(__enter__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:257(get_dtypes)
        4    0.000    0.000    0.000    0.000 {built-in method numpy.seterrobj}
        3    0.000    0.000    0.000    0.000 {method 'reshape' of 'numpy.ndarray' objects}
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/base.py:429(size)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/nanops.py:440(nanany)
        2    0.000    0.000    0.000    0.000 {method 'decode' of 'bytes' objects}
        1    0.000    0.000    0.002    0.002 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/construction.py:62(arrays_to_mgr)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:58(_get_filesystem_and_path)
       19    0.000    0.000    0.000    0.000 {pandas._libs.lib.is_iterator}
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_methods.py:37(_amax)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numeric.py:144(ones)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:10586(any)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/utils.py:1216(is_dataframe_like)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1301(closed)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1338(seek)
       23    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1634(is_consolidated)
       10    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:623(dtype)
        7    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:681(is_consolidated)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/numpy_.py:189(_from_backing_data)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/base.py:95(__eq__)
        5    0.000    0.000    0.000    0.000 {method 'update' of 'dict' objects}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:954(is_datetime64_ns_dtype)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:3394(_convert_listlike_indexer)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/missing.py:50(isna)
        7    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:4096(_get_engine_target)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:881(__getitem__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:1803(is_boolean)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/toolz/dicttoolz.py:18(merge)
        1    0.000    0.000    2.302    2.302 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:765(open)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:570(_cleanup)
        1    0.000    0.000    2.302    2.302 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:754(get_metadata)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:150(from_blocks)
       13    0.000    0.000    0.000    0.000 {method 'upper' of 'str' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:906(_get_values)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/api.py:232(_sanitize_and_check)
       14    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:487(dtype)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:114(_simple_new)
        2    0.000    0.000    0.000    0.000 {method 'sum' of 'numpy.ndarray' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/util.py:73(_is_path_like)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1579(__str__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1575(__del__)
        2    0.000    0.000    0.000    0.000 <__array_function__ internals>:2(delete)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:665(_set_axis)
        8    0.000    0.000    0.000    0.000 {built-in method numpy.geterrobj}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_ufunc_config.py:438(__exit__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/config.py:39(canonical_name)
       12    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py:205(_ndarray)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/copy.py:66(copy)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:796(copy)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numerictypes.py:569(find_common_type)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/core.py:3810(<listcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/numeric.py:107(_shallow_copy)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:1781(__hash__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py:288(_get_getitem_freq)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:653(view)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:991(_consolidate_inplace)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/core.py:994(process_statistics)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:320(<genexpr>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/blockwise.py:217(blockwise_token)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:298(<listcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/config.py:66(apply_config)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/core.py:6793(has_parallel_type)
        2    0.000    0.000    0.000    0.000 {pandas._libs.internals.get_blkno_placements}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/api.py:253(<setcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:7409(isna)
        8    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numerictypes.py:554(<listcomp>)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:814(copy_func)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/uuid.py:325(hex)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/caching.py:28(__init__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/utils.py:811(typename)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_ufunc_config.py:429(__init__)
        2    0.000    0.000    0.000    0.000 <__array_function__ internals>:2(copyto)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:3416(_convert_arr_indexer)
        5    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/utils.py:1220(<genexpr>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/core.py:1094(<listcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:403(_split_op_result)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:1706(iget)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/fromnumeric.py:71(<dictcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1566(from_blocks)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:3482(_clear_item_cache)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1869(_shape_compat)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:239(loc)
        9    0.000    0.000    0.000    0.000 {pandas._libs.lib.is_integer}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/tools/datetimes.py:87(should_cache)
        1    0.000    0.000    0.000    0.000 {built-in method numpy.zeros}
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:261(fill_value)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.sum}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/base.py:618(empty)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:1478(_getitem_axis)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/utils.py:323(is_dataframe_like)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/_mixins.py:151(copy)
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:343(shape)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_asarray.py:86(asanyarray)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:3314(_validate_positional_slice)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/registry.py:37(__contains__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/range.py:395(_shallow_copy)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/core.py:802(get_engine)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/logging/__init__.py:1412(debug)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1829(_simple_blockify)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/extension.py:58(fget)
        2    0.000    0.000    0.000    0.000 {method 'transpose' of 'numpy.ndarray' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:214(set_axis)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/frame.py:482(_constructor)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:4739(isna)
        2    0.000    0.000    0.000    0.000 {method 'remove' of 'collections.deque' objects}
        1    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:389(parent)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/highlevelgraph.py:647(<dictcomp>)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/aiohttp/client_reqrep.py:798(__del__)
        4    0.000    0.000    0.000    0.000 {built-in method pandas._libs.missing.checknull}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1187(needs_i8_conversion)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:276(make_block)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:162(_fs_token)
        1    0.000    0.000    0.000    0.000 <__array_function__ internals>:2(concatenate)
        1    0.000    0.000    0.000    0.000 {built-in method from_bytes}
        5    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1052(<genexpr>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:258(<listcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1563(readable)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:1699(shape)
        4    0.000    0.000    0.000    0.000 {pandas._libs.algos.ensure_platform_int}
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5296(_validate_indexer)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/logging/__init__.py:1677(isEnabledFor)
        1    0.000    0.000    0.000    0.000 <__array_function__ internals>:2(bincount)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/_methods.py:45(_sum)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/core.py:349(npartitions)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:10851(any)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:278(<listcomp>)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/fromnumeric.py:3075(ndim)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:5920(ensure_has_len)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/toolz/dicttoolz.py:10(_get_factory)
        3    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/utils.py:1221(<genexpr>)
        2    0.000    0.000    0.000    0.000 {built-in method pandas._libs.tslibs.timezones.maybe_get_tz}
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1695(<genexpr>)
        4    0.000    0.000    0.000    0.000 {method 'end' of 're.Match' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:102(iloc)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:817(<listcomp>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1801(<listcomp>)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:227(is_single_block)
        6    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/string_.py:66(type)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1307(closed)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/compat/numpy/function.py:45(__call__)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:61(<genexpr>)
        2    0.000    0.000    0.000    0.000 {built-in method pandas._libs.tslibs.offsets.to_offset}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexing.py:2347(need_slice)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/asyncio/selector_events.py:692(__del__)
        2    0.000    0.000    0.000    0.000 {built-in method _weakref._remove_dead_weakref}
        3    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/utils.py:1222(<genexpr>)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/multiarray.py:468(can_cast)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:542(_info_axis)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/nanops.py:197(_maybe_get_mask)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numerictypes.py:621(<listcomp>)
        2    0.000    0.000    0.000    0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:2162(internal_values)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:3831(_set_is_copy)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/base.py:153(kind)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/nanops.py:328(_na_ok_dtype)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:2251(validate_tz_from_dtype)
        2    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/backends.py:315(get_parallel_type_dataframe)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:581(<lambda>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/frame.py:628(axes)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/copy.py:107(_copy_immutable)
        4    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/fromnumeric.py:3071(_ndim_dispatcher)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/fromnumeric.py:2876(_prod_dispatcher)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/series.py:393(_constructor)
        5    0.000    0.000    0.000    0.000 {pandas._libs.lib.is_bool}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:61(tz_to_dtype)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:381(<genexpr>)
        3    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numeric.py:2313(_array_equal_dispatcher)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/frame.py:1158(__len__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:566(ndim)
        1    0.000    0.000    0.000    0.000 {method 'issubset' of 'set' objects}
        1    0.000    0.000    0.000    0.000 {method 'intersection' of 'set' objects}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:756(_maybe_disallow_fill)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1276(is_string_like_dtype)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/spec.py:1334(tell)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/fsspec/registry.py:25(__getitem__)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/core.py:3845(columns)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/util/_validators.py:208(validate_bool_kwarg)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/multiarray.py:1043(copyto)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py:1741(validate_inferred_freq)
        1    0.000    0.000    0.000    0.000 {method 'count' of 'list' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/string_.py:70(construct_array_type)
        2    0.000    0.000    0.000    0.000 {method 'copy' of 'dict' objects}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/blocks.py:1835(array_values)
        1    0.000    0.000    0.000    0.000 {built-in method _thread.get_ident}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pyarrow/parquet.py:242(metadata)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py:2209(_validate_dt64_dtype)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:1446(nlevels)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/lib/function_base.py:4232(_delete_dispatcher)
        1    0.000    0.000    0.000    0.000 /Users/aktech/quansight/dask/dask/dataframe/io/parquet/utils.py:304(<listcomp>)
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:405(<dictcomp>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.repr}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/common.py:1304(<lambda>)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/internals/managers.py:1611(index)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/s3fs/core.py:54(version_id_kw)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/dtypes/base.py:119(<genexpr>)
        1    0.000    0.000    0.000    0.000 {method 'keys' of 'dict' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/generic.py:3975(_check_inplace_and_allows_duplicate_labels)
        1    0.000    0.000    0.000    0.000 {method 'remove' of 'set' objects}
        2    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/indexes/base.py:3432(_convert_list_indexer)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/multiarray.py:852(bincount)
        1    0.000    0.000    0.000    0.000 {method 'lstrip' of 'str' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/nanops.py:172(_get_fill_value)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/pandas/core/base.py:397(ndim)
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/multiarray.py:143(concatenate)
        1    0.000    0.000    0.000    0.000 {method 'clear_mapping' of 'pandas._libs.index.IndexEngine' objects}
        1    0.000    0.000    0.000    0.000 {method 'values' of 'dict' objects}
        1    0.000    0.000    0.000    0.000 /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/numpy/core/numerictypes.py:622(<listcomp>)

PyInstruments Profile

PyInstruments Profile: Click here

  _     ._   __/__   _ _  _  _ _/_   Recorded: 12:41:01  Samples:  1179
 /_//_/// /_\ / //_// / //_'/ //     Duration: 13.376    CPU time: 10.891
/   _/                      v3.4.2

Program: /Users/aktech/anaconda3/envs/dask-dev/lib/python3.8/site-packages/ipykernel_launcher.py -f /Users/aktech/Library/Jupyter/runtime/kernel-71f2caac-f877-4a62-9b1d-0314dea6a48a.json

13.376 run_code  IPython/core/interactiveshell.py:3377
└─ 13.376 <module>  <ipython-input-8-8697f9619301>:6
   └─ 13.376 read_parquet  <ipython-input-5-9f00d55c0c2f>:1
      └─ 13.376 read_parquet  dask/dataframe/io/parquet/core.py:98
         ├─ 13.206 read_metadata  dask/dataframe/io/parquet/arrow.py:483
         │  └─ 13.168 _gather_metadata  dask/dataframe/io/parquet/arrow.py:1674
         │     ├─ 10.733 _get_dataset_object  dask/dataframe/io/parquet/arrow.py:1624
         │     │  └─ 10.725 __init__  pyarrow/parquet.py:1243
         │     │        [14 frames hidden]  pyarrow, urllib, <built-in>, <string>
         │     │           10.720 _make_manifest  pyarrow/parquet.py:1436
         │     │           └─ 10.720 wrapper  fsspec/asyn.py:84
         │     │              └─ 10.720 sync  fsspec/asyn.py:37
         │     │                 ├─ 10.347 wait  threading.py:540
         │     │                 │     [4 frames hidden]  threading, <built-in>
         │     │                 │        10.347 lock.acquire  <built-in>:0
         │     │                 └─ 0.373 run_coroutine_threadsafe  asyncio/tasks.py:900
         │     │                       [5 frames hidden]  asyncio, <built-in>
         │     └─ 2.435 get_metadata  pyarrow/parquet.py:754
         │           [4 frames hidden]  pyarrow2.419 __init__  pyarrow/parquet.py:214
         │              └─ 2.419 read  fsspec/spec.py:1449
         │                 └─ 2.419 _fetch  fsspec/caching.py:345
         │                    └─ 2.419 _fetch_range  s3fs/core.py:1847
         │                          [2 frames hidden]  s3fs2.419 _fetch_range  s3fs/core.py:1978
         │                             ├─ 2.024 wrapper  fsspec/asyn.py:84
         │                             │  └─ 2.024 sync  fsspec/asyn.py:37
         │                             │     └─ 2.024 wait  threading.py:540
         │                             │           [4 frames hidden]  threading, <built-in>
         │                             └─ 0.395 sync  fsspec/asyn.py:37
         │                                └─ 0.395 wait  threading.py:540
         │                                      [4 frames hidden]  threading, <built-in>
         └─ 0.137 get_engine  dask/dataframe/io/parquet/core.py:802

Summary

The bottleneck is call to fs.isfile which eventually calls s3fs._info:

Minimal Example:

import s3fs
fs = s3fs.S3FileSystem(anon=True)

files = fs.ls('s3://saturn-public-data/nyc-taxi/taxi_parquet_speed_test')
def minimal_example(files):
    for path in files:
        fs.isfile(path)

Timings

%%time
minimal_example(files[:1000])
CPU times: user 11.2 s, sys: 72.4 ms, total: 11.3 s
Wall time: 11.3 s

%%time
fs.isfile(files[0])
CPU times: user 14.5 ms, sys: 1.27 ms, total: 15.7 ms
Wall time: 14.6 ms

If it takes 14.6 ms for doing fs.isfile on single file, then it makes sense to take ~10 seconds on 1000 files, given the fact that its sequential.

Also note that, the slowness in not particularly in fs.isfile as it works fine for local filesystem. It's rather due to the
slow s3fs._info function.

Potential Solution

Making fs.isfile parallel, just like fs.cat

Something like (in function async def _isfile(self, path)):

+        if isinstance(path, str):
+            paths = [path]
+        else:
+            paths = path
+        k = await self._info(paths[0])
+        out = await asyncio.gather(
+            *[self._info(path) for path in paths],
+            return_exceptions=True,
+        )
+        return [
+            o["type"] == "file" for o in out
+        ]

Although the above suggestion doesn't makes it fast, probably because the function _ls_from_cache is blocking, which is called here in s3fs.core._info.

@martindurant any thoughts on this?

Also this issue should eventually be moved to either dask-s3fs or fsspec

@martindurant
Copy link
Member

Yes a couple of thoughts:

  • the current main branch of s3fs includes an improvement which caches the bucket region, leading to up to 3x reduction in latency. Can you please try with that?
  • listing the directories beforehand would cache the listings, so there would be no need for the many info calls
  • yes, it would be reasonable to implement a parallel info for a list of paths; but of course this would cost some time, and we would need to add it to all the backends. In this case, it would be better to use find(path, detail=True)
  • fastparquet main branch should already be loading the metadata from many files in parallel (concurrent/asyncio); it may be that this already solves the OP's requirements.

@martindurant
Copy link
Member

(Note that fsspec/filesystem_spec#676 might also help; releases are coming in the next couple of days)

@hhuuggoo
Copy link
Author

@aktech I think there are 2 things to look at here

  • looking at the performance of dask/pyarrow/s3fs with a large number of files ( with the context and latest developments that @martindurant brought up)
  • adding capabilities for fastparquet to support breaking out large files into smaller dataframes (via split_row_groups or other mechanisms)

@martindurant
Copy link
Member

There is no reason that fastparquet, in its current form, can't support split_row_groups. This option means multiple row-groups per dask partition (usually, but not necessarily, grouped within files). That means partitions get bigger - is that what you are after? Note that fastparquet doesn't have any threading internally, so you would loose a little parallelism by doing this, but have potentially much smaller graphs, and maybe benefit from readahead-caching of the data files.

@aktech
Copy link
Contributor

aktech commented Jun 23, 2021

@martindurant

the current main branch of s3fs includes an improvement which caches the bucket region, leading to up to 3x reduction in latency. Can you please try with that?

I was using fsspec from main branch and now after using s3fs as well from the main branch, it doesn't seems to affect the timing of the minimal example in my previous comment.

listing the directories beforehand would cache the listings, so there would be no need for the many info calls

I am indeed listing the directory in the minimal example above:

files = fs.ls('s3://saturn-public-data/nyc-taxi/taxi_parquet_speed_test')

yes, it would be reasonable to implement a parallel info for a list of paths; but of course this would cost some time, and we would need to add it to all the backends. In this case, it would be better to use find(path, detail=True)

Where would you use that? I am probably missing something here, using it directly instead of isfile is even slower

fastparquet main branch should already be loading the metadata from many files in parallel (concurrent/asyncio); it may be that this already solves the OP's requirements.

I have not played with this yet, will let you know as soon as I do

@hhuuggoo
Copy link
Author

@martindurant @aktech sorry for the delay. @aktech prepped a file that has row groups we can use for reference.

import dask.dataframe as dd
import s3fs
path = "s3://quansight-public/taxi-data.parquet/"
fs=s3fs.S3FileSystem(anon=True)
paths = [x for x in fs.ls(path) if x.endswith('parquet')]
paths = ["s3://" + x for x in paths]
good = dd.read_parquet(paths, engine='pyarrow', storage_options={'anon': True}, split_row_groups=True)
print(good.npartitions) # 25

good = dd.read_parquet(paths, engine='fastparquet', storage_options={'anon': True}, split_row_groups=False)
print(good.npartitions) # 25

bad = dd.read_parquet(paths, engine='fastparquet', storage_options={'anon': True}, split_row_groups=True, gather_statistics=False)
print(bad.npartitions) #  5

being able to split_row_groups, without having to pay the overhead of gathering statistics (which can be quite expensive for many files) is what I was looking for. Spitting row groups splits each parquet file into multiple dataframes/partitions, resulting in smaller dataframes.

@martindurant do you think implementing parallell/distributed statistics gathering would be a bad idea?

@martindurant
Copy link
Member

@hhuuggoo from the conversation above, there are some things that we might do immediately around find/isfile that will help the very many files situation. That's not the case for the five small taxi datafiles.

btw: have you tried with latest fsspec/fastparquet? It ought to now fetch all of the file metadata footers

do you think implementing parallell/distributed statistics gathering would be a bad idea?

This does break a dask model, by which the creation of a graph is done by the client, not by executing another graph. I don't see a problem with doing it conceptually,

You actually caused my to make a small fix in fastparquet (which may be released tomorrow): dask/fastparquet#652 . Following that, instantiating ParquetFile took 4.4s on the first go (including setting up S3 credentials, imports, etc) and 0.65s thereafter, versus 1.4-2.2s to make the uncomputed dataframe. Of course, dask is faster to actually load the dataframe.

@rjzamora
Copy link
Member

This does break a dask model, by which the creation of a graph is done by the client

This is usually true. However, there certainly are cases where we execute a graph on the workers to generate the necessary information to build a new graph on the client (e.g. set_index). We also already do this for the legacy arrow engine in parquet. So, I would consider it fair game.

@hhuuggoo
Copy link
Author

btw: have you tried with latest fsspec/fastparquet? It ought to now fetch all of the file metadata footers

@martindurant I haven't tried the latest fastparquet - I will do so, but I no longer have access to the problematic dataset in question. I can close this though, and if it becomes an issue again, I can raise/PR. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants