From ea03bb4811ed90f1c6aa9c230913e7eac84cf6bf Mon Sep 17 00:00:00 2001 From: Alex Merose Date: Sun, 23 Jun 2024 17:43:11 +0200 Subject: [PATCH] Added README docs. Also, changed API a bit. (#7) - Using `chunksize`, which is a dask convention - Accepts strings or fcs - Added docstring to main function. - Aaron is an author. - rm pandas dep. --- README.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++- dask_ee/read.py | 25 ++++++++++++---- demo.png | Bin 0 -> 40344 bytes pyproject.toml | 9 ++++-- 4 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 demo.png diff --git a/README.md b/README.md index 1773ba2..7bc718c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,78 @@ # dask-ee -Earth Engine FeatureCollections via Dask Dataframes +Google Earth Engine `FeatureCollection`s via Dask DataFrames + +## How to use + +Install with pip: +```shell +pip install --upgrade dask-ee +``` + +Then, authenticate Earth Engine: +```shell +earthengine authenticate --quiet +``` + +In your Python environment, you may now import the library: + +```python +import ee +import dask_ee +``` + +You'll need to initialize Earth Engine before working with data: +```python +ee.Initialize() +``` + +From here, you can read Earth Engine FeatureCollections like they are DataFrames: +```python +ddf = dask_ee.read_ee("WRI/GPPD/power_plants") +ddf.head() +``` +These work like Pandas DataFrames, but they are lazily evaluated via [Dask](https://dask.org/). + +Feel free to do any analysis you wish. For example: +```python +# Thanks @aazuspan, https://www.aazuspan.dev/blog/dask_featurecollection +( + ddf[ddf.comm_year.gt(1940) & ddf.country.eq("USA") & ddf.fuel1.isin(["Coal", "Wind"])] + .astype({"comm_year": int}) + .drop(columns=["geo"]) + .groupby(["comm_year", "fuel1"]) + .agg({"capacitymw": "sum"}) + .reset_index() + .sort_values(by=["comm_year"]) + .compute(scheduler="threads") + .pivot_table(index="comm_year", columns="fuel1", values="capacitymw", fill_value=0) + .plot() +) +``` +![Coal vs Wind in the US since 1940](demo.png) + +There are a few other useful things you can do. + +For one, you may pass in a pre-processed `ee.FeatureCollection`. This allows full utilization +of the Earth Engine API. + +```python +import dask_ee + +fc = ( + ee.FeatureCollection("WRI/GPPD/power_plants") + .filter(ee.Filter.gt("comm_year", 1940)) + .filter(ee.Filter.eq("country", "USA")) +) +ddf = dask_ee.read_ee(fc) +``` + +In addition, you may change the `chunksize`, which controls how many rows are included in each +Dask partition. +```python +ddf = dask_ee.read_ee("WRI/GPPD/power_plants", chunksize=7_000) +ddf.head() +``` ## License ``` diff --git a/dask_ee/read.py b/dask_ee/read.py index fd5c21f..d9f7ebf 100644 --- a/dask_ee/read.py +++ b/dask_ee/read.py @@ -29,11 +29,24 @@ # TODO(#4): Support 'auto' chunks, where we calculate the maximum allowed page size given the number of # bytes in each row. def read_ee( - fc: ee.FeatureCollection, io_chunks: t.Union[int, t.Literal['auto']] = 5_000 + fc: t.Union[ee.FeatureCollection, str], + chunksize: t.Union[int, t.Literal['auto']] = 5_000, ) -> dd.DataFrame: + """Read Google Earth Engine FeatureCollections into a Dask Dataframe. - if io_chunks == 'auto': - raise NotImplementedError('Auto `io_chunks` are not implemented yet!') + Args: + fc: A Google Earth Engine FeatureCollection or valid string path to a FeatureCollection. + chunksize: The number of rows per partition to use. + + Returns: + A dask DataFrame with paged Google Earth Engine data. + """ + + if isinstance(fc, str): + fc = ee.FeatureCollection(fc) + + if chunksize == 'auto': + raise NotImplementedError('Auto chunksize is not implemented yet!') # Make all the getInfo() calls at once, up front. fc_size, all_info = ee.List([fc.size(), fc.limit(0)]).getInfo() @@ -42,12 +55,12 @@ def read_ee( columns.update(all_info['columns']) del columns['system:index'] - divisions = tuple(range(0, fc_size, io_chunks)) + divisions = tuple(range(0, fc_size, chunksize)) # TODO(#5): Compare `toList()` to other range operations, like getting all index IDs via `getInfo()`. - pages = [ee.FeatureCollection(fc.toList(io_chunks, i)) for i in divisions] + pages = [ee.FeatureCollection(fc.toList(chunksize, i)) for i in divisions] # Get the remainder, if it exists. `io_chunks` are not likely to evenly partition the data. - d, r = divmod(fc_size, io_chunks) + d, r = divmod(fc_size, chunksize) if r != 0: pages.append(ee.FeatureCollection(fc.toList(r, d))) divisions += (fc_size,) diff --git a/demo.png b/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..dad54cdb6804b37d6349c531d5526b18aa90c6ec GIT binary patch literal 40344 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.1.374", - "pandas", - "dask", + "dask[dataframe]", ] [project.optional-dependencies]