├── requirements.txt ├── uber_demo.png ├── load_data_compare.png ├── uber-raw-data-sep14.csv.gz ├── .gitignore ├── 00_download_nyc_data.py ├── README.md ├── streamlit_app_duck.py ├── 01_duck_streamlit.py ├── LICENSE └── full.ipynb /requirements.txt: -------------------------------------------------------------------------------- 1 | duckdb==0.3.4 2 | pyarrow==7.0.0 3 | streamlit==1.8.1 4 | -------------------------------------------------------------------------------- /uber_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gerardrbentley/uber-nyc-pickups-duckdb/HEAD/uber_demo.png -------------------------------------------------------------------------------- /load_data_compare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gerardrbentley/uber-nyc-pickups-duckdb/HEAD/load_data_compare.png -------------------------------------------------------------------------------- /uber-raw-data-sep14.csv.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gerardrbentley/uber-nyc-pickups-duckdb/HEAD/uber-raw-data-sep14.csv.gz -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | nyc-taxi 2 | *.html 3 | .vscode 4 | .ipynb_checkpoints 5 | .github 6 | *logs 7 | .pytest_cache 8 | .DS_store 9 | profiles -------------------------------------------------------------------------------- /00_download_nyc_data.py: -------------------------------------------------------------------------------- 1 | import time 2 | import boto3 3 | import os 4 | from botocore import UNSIGNED 5 | from botocore.client import Config 6 | from botocore.exceptions import ResponseStreamingError 7 | 8 | s3 = boto3.resource("s3", config=Config(signature_version=UNSIGNED)) 9 | 10 | 11 | def download_s3_folder(bucket_name, s3_folder, local_dir=None): 12 | bucket = s3.Bucket(bucket_name) 13 | for obj in bucket.objects.filter(Prefix=s3_folder): 14 | target = ( 15 | obj.key 16 | if local_dir is None 17 | else os.path.join(local_dir, os.path.relpath(obj.key, s3_folder)) 18 | ) 19 | if os.path.exists(target): 20 | print(f"skipping {target}") 21 | continue 22 | if not os.path.exists(os.path.dirname(target)): 23 | os.makedirs(os.path.dirname(target)) 24 | if obj.key[-1] == "/": 25 | continue 26 | print(f"downloading {target}") 27 | try: 28 | bucket.download_file(obj.key, target) 29 | except ResponseStreamingError: 30 | time.sleep(60) 31 | bucket.download_file(obj.key, target) 32 | print(f"downloaded {target}") 33 | 34 | if __name__ == '__main__': 35 | print("BEGIN DOWNLOAD!") 36 | download_s3_folder("ursa-labs-taxi-data", "", "nyc-taxi") 37 | print("DONE DOWNLOAD!!!") 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Open in Streamlit](https://static.streamlit.io/badges/streamlit_badge_black_white.svg)](https://share.streamlit.io/gerardrbentley/uber-nyc-pickups-duckdb/main/streamlit_app_duck.py) 2 | 3 | # Streamlit + DuckDB Demo: Uber / Taxi Pickups in New York City 4 | 5 | - `streamlit_app_duck.py`: Inspired / Copied from [streamlit demo repo](https://github.com/streamlit/demo-uber-nyc-pickups) 6 | - Analyzes a month of NYC Uber Pickup location data. The original is from the Streamlit [demo gallery](https://streamlit.io/gallery) 7 | - A [Streamlit](https://streamlit.io) demo converted to utilize [DuckDB](https://duckdb.org/docs/api/python) to run data analysis faster and on more data than raw pandas. 8 | - `01_duck_streamlit.py`: Inspired / Copied from [duckdb](https://duckdb.org/2021/12/03/duck-arrow.html) and [arrow](https://arrow.apache.org/blog/2021/12/03/arrow-duckdb/) blog post 9 | - Analyze 10 years (1.5 Billion rows / 40 GB) of NYC Taxi Pickup location data and demo some other filter optimizations over Pandas 10 | - A blog post on the power of DuckDB + Arrow converted to an interacive demo in Streamlit 11 | 12 | Read more in the accompanying [blog post](https://tech.gerardbentley.com/python/data/intermediate/2022/04/26/holy-duck.html) ✍🏻 13 | 14 | ## One Month Uber Dataset 15 | 16 | Check out the speed up on loading data. 17 | From left to right: 18 | 19 | - `5.087 s`: [streamlit example (100,000 rows)](https://github.com/streamlit/demo-uber-nyc-pickups/blob/e714e117abe0a22fe159ce7b29980c566289b6d1/streamlit_app.py#L32) 20 | - `54.306 s`: streamlit example (Full Dataset using `pd.read_csv`) 21 | - `1.178 s`: this example (Full Dataset using `pyarrow` + `duckdb`) 22 | 23 | ![load data speedup compare](load_data_compare.png) 24 | 25 | (*Note:* Profiled with [pyinstrument](https://pyinstrument.readthedocs.io/en/latest/how-it-works.html), see more on the caveats / how it works in [this post](http://joerick.me/posts/2017/12/15/pyinstrument-20/)) 26 | 27 | ### Analysis 28 | 29 | I wrote the `load_data` function above to match what the original code does, which is **load** the data into a `Dataframe`, not just load the schema. 30 | After it's loaded then `pandas` and `numpy` are used for some additional filtering and computation. 31 | 32 | The real point of `duckdb` is to do your filtering and computation **before** loading all of your data into memory. 33 | 34 | For parity with the streamlit demo `load_data` originally would be: 35 | 36 | ```py 37 | data = duckdb.arrow(data) 38 | return data.arrow().to_pandas() 39 | ``` 40 | 41 | Just returning the duckdb instance will drop the time `load_data` takes to `~0.1 s`! 42 | Then you have an in memory analysis object ready to go. 43 | 44 | ```py 45 | data = duckdb.arrow(data) 46 | return data 47 | ``` 48 | 49 | ### Run this demo locally 50 | 51 | ```sh 52 | git clone git@github.com:gerardrbentley/uber-nyc-pickups-duckdb.git duckdb-streamlit 53 | cd duckdb-streamlit 54 | python -m venv venv 55 | . ./venv/bin/activate 56 | python -m pip install -r requirements.txt 57 | 58 | streamlit run streamlit_app_duck.py 59 | ``` 60 | 61 | ## 10 Years of data 62 | 63 | *NOTE:* The following will download 40 GB of data to your machine. 64 | Not available on streamlit cloud due to storage limitations. 65 | 66 | Going deeper into the DuckDB / Arrow power, we can filter and analyze even larger datasets. 67 | 68 | We can select `304,851` interesting rows from all `1,547,741,381` in the 10 year dataset in < 3 seconds on a laptop! 69 | 70 | The following will download necessary files and then run the app 71 | 72 | ```sh 73 | # Setup 74 | python -m pip install boto3 75 | # Download datasets 76 | wget https://github.com/cwida/duckdb-data/releases/download/v1.0/lineitemsf1.snappy.parquet 77 | python 00_download_nyc_data.py 78 | # Run the demo 79 | streamlit run 01_duck_streamlit.py 80 | ``` 81 | -------------------------------------------------------------------------------- /streamlit_app_duck.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright 2018-2022 Streamlit Inc. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | 16 | # Modified by Gerard Bentley 17 | 18 | """An example of showing geographic data.""" 19 | 20 | from datetime import datetime 21 | from pathlib import Path 22 | import streamlit as st 23 | import pandas as pd 24 | import duckdb 25 | from pyarrow import csv 26 | import numpy as np 27 | import altair as alt 28 | import pydeck as pdk 29 | # from pyinstrument import Profiler 30 | 31 | # SETTING PAGE CONFIG TO WIDE MODE AND ADDING A TITLE AND FAVICON 32 | st.set_page_config(layout="wide", page_title="NYC Ridesharing Demo", page_icon=":taxi:") 33 | 34 | # profiler = Profiler(interval=0.0001) 35 | # profiler.start() 36 | 37 | # LOAD DUCKDB ONCE 38 | @st.cache_resource 39 | def load_data(): 40 | data = csv.read_csv( 41 | "uber-raw-data-sep14.csv.gz", 42 | convert_options=csv.ConvertOptions( 43 | include_columns=["Date/Time", "Lat", "Lon"], 44 | timestamp_parsers=["%m/%d/%Y %H:%M:%S"], 45 | ), 46 | ).rename_columns(["date/time", "lat", "lon"]) 47 | 48 | return duckdb.from_arrow(data) 49 | 50 | 51 | # FUNCTION FOR AIRPORT MAPS 52 | def map(data, lat, lon, zoom): 53 | st.write( 54 | pdk.Deck( 55 | map_style="mapbox://styles/mapbox/light-v9", 56 | initial_view_state={ 57 | "latitude": lat, 58 | "longitude": lon, 59 | "zoom": zoom, 60 | "pitch": 50, 61 | }, 62 | layers=[ 63 | pdk.Layer( 64 | "HexagonLayer", 65 | data=data, 66 | get_position=["lon", "lat"], 67 | radius=100, 68 | elevation_scale=4, 69 | elevation_range=[0, 1000], 70 | pickable=True, 71 | extruded=True, 72 | ), 73 | ], 74 | ) 75 | ) 76 | 77 | 78 | # FILTER DATA FOR A SPECIFIC HOUR, CACHE 79 | @st.cache_data 80 | def filterdata(hour_selected): 81 | data = load_data() 82 | return data.filter(f'hour("date/time") = {hour_selected}').to_df() 83 | 84 | 85 | # CALCULATE MIDPOINT FOR GIVEN SET OF DATA 86 | @st.cache_data 87 | def mpoint(): 88 | data = load_data() 89 | return tuple(data.query("data", "SELECT AVG(lat), AVG(lon) FROM data").fetchone()) 90 | 91 | 92 | # FILTER DATA BY HOUR 93 | @st.cache_data 94 | def histdata(hr): 95 | data = load_data() 96 | hist_query = f'SELECT histogram(minute("date/time")) FROM hist WHERE hour("date/time") >= {hr} and hour("date/time") < {hr + 1}' 97 | (results,) = data.query("hist", hist_query).fetchone() 98 | df = pd.DataFrame(results) 99 | df.columns = ["minute", "pickups"] 100 | return df 101 | 102 | 103 | # STREAMLIT APP LAYOUT 104 | # LAYING OUT THE TOP SECTION OF THE APP 105 | row1_1, row1_2 = st.columns((2, 3)) 106 | 107 | # SEE IF THERE'S A QUERY PARAM IN THE URL (e.g. ?pickup_hour=2) 108 | # THIS ALLOWS YOU TO PASS A STATEFUL URL TO SOMEONE WITH A SPECIFIC HOUR SELECTED, 109 | # E.G. https://share.streamlit.io/streamlit/demo-uber-nyc-pickups/main?pickup_hour=2 110 | if not st.session_state.get("url_synced", False): 111 | try: 112 | pickup_hour = int(st.experimental_get_query_params()["pickup_hour"][0]) 113 | st.session_state["pickup_hour"] = pickup_hour 114 | st.session_state["url_synced"] = True 115 | except KeyError: 116 | pass 117 | 118 | 119 | # IF THE SLIDER CHANGES, UPDATE THE QUERY PARAM 120 | def update_query_params(): 121 | hour_selected = st.session_state["pickup_hour"] 122 | st.experimental_set_query_params(pickup_hour=hour_selected) 123 | 124 | 125 | with row1_1: 126 | st.title("NYC Uber Ridesharing Data") 127 | hour_selected = st.slider( 128 | "Select hour of pickup", 0, 23, key="pickup_hour", on_change=update_query_params 129 | ) 130 | 131 | 132 | with row1_2: 133 | st.write( 134 | """ 135 | ## 136 | Examining how Uber pickups vary over time in New York City's and at its major regional airports. 137 | By sliding the slider on the left you can view different slices of time and explore different transportation trends. 138 | """ 139 | ) 140 | 141 | # LAYING OUT THE MIDDLE SECTION OF THE APP WITH THE MAPS 142 | row2_1, row2_2, row2_3, row2_4 = st.columns((2, 1, 1, 1)) 143 | 144 | # SETTING THE ZOOM LOCATIONS FOR THE AIRPORTS 145 | la_guardia = [40.7900, -73.8700] 146 | jfk = [40.6650, -73.7821] 147 | newark = [40.7090, -74.1805] 148 | zoom_level = 12 149 | midpoint = mpoint() 150 | 151 | with row2_1: 152 | st.write( 153 | f"""**All New York City from {hour_selected}:00 and {(hour_selected + 1) % 24}:00**""" 154 | ) 155 | map(filterdata(hour_selected), midpoint[0], midpoint[1], 11) 156 | 157 | with row2_2: 158 | st.write("**La Guardia Airport**") 159 | map(filterdata(hour_selected), la_guardia[0], la_guardia[1], zoom_level) 160 | 161 | with row2_3: 162 | st.write("**JFK Airport**") 163 | map(filterdata(hour_selected), jfk[0], jfk[1], zoom_level) 164 | 165 | with row2_4: 166 | st.write("**Newark Airport**") 167 | map(filterdata(hour_selected), newark[0], newark[1], zoom_level) 168 | 169 | # CALCULATING DATA FOR THE HISTOGRAM 170 | chart_data = histdata(hour_selected) 171 | # LAYING OUT THE HISTOGRAM SECTION 172 | st.write( 173 | f"""**Breakdown of rides per minute between {hour_selected}:00 and {(hour_selected + 1) % 24}:00**""" 174 | ) 175 | 176 | st.altair_chart( 177 | alt.Chart(chart_data) 178 | .mark_area( 179 | interpolate="step-after", 180 | ) 181 | .encode( 182 | x=alt.X("minute:Q", scale=alt.Scale(nice=False)), 183 | y=alt.Y("pickups:Q"), 184 | tooltip=["minute", "pickups"], 185 | ) 186 | .configure_mark(opacity=0.2, color="red"), 187 | use_container_width=True, 188 | ) 189 | # profiler.stop() 190 | 191 | # profiler.print() 192 | # (Path('profiles') / f"Duck_Load_{datetime.now().isoformat()}.html").write_text(profiler.output_html()) 193 | -------------------------------------------------------------------------------- /01_duck_streamlit.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | with st.echo(): 4 | from time import perf_counter as timer 5 | 6 | import duckdb 7 | import pyarrow as pa 8 | import pyarrow.dataset as ds 9 | import pyarrow.parquet as pq 10 | import pandas as pd 11 | 12 | import pydeck as pdk # for visualization 13 | 14 | 15 | home = "Duck DB NYC Taxi Analysis" 16 | projection_pushdown = "Line Items Projection Pushdown" 17 | filter_pushdown = "Line Items Filter Pushdown" 18 | taxi = "NYC Taxi Query" 19 | view = st.sidebar.radio("Page View", [home, projection_pushdown, filter_pushdown, taxi]) 20 | 21 | if view == home: 22 | st.header(home) 23 | """\ 24 | See duckbd / Apache Arrow [blogpost](https://duckdb.org/2021/12/03/duck-arrow.html) for source and discussion. 25 | 26 | Downloading the full dataset requires ~40 GB storage space 27 | 28 | Final example requires ~250 GB of memory / swap... 29 | 30 | Choose "NYC Taxi Query" on the left to see DuckDB + Arrow speed through 10 years of data in ~3 seconds in Streamlit (laptop benchmark. duckdb benchmark ~0.05 seconds) 31 | """ 32 | elif view == projection_pushdown: 33 | st.header(projection_pushdown) 34 | "In this example we run a simple aggregation on two columns of our lineitem table." 35 | with st.echo(): 36 | # DuckDB 37 | start_time = timer() 38 | lineitem = pq.read_table("lineitemsf1.snappy.parquet") 39 | con = duckdb.connect() 40 | 41 | # Transforms Query Result from DuckDB to Arrow Table 42 | result = con.execute( 43 | """SELECT sum(l_extendedprice * l_discount) AS revenue 44 | FROM 45 | lineitem;""" 46 | ).fetch_arrow_table() 47 | end_time = timer() 48 | duckdb_runtime = end_time - start_time 49 | st.write(f"Finished in {duckdb_runtime} seconds") 50 | st.write(result) 51 | with st.echo(): 52 | start_time = timer() 53 | # Pandas 54 | arrow_table = pq.read_table("lineitemsf1.snappy.parquet") 55 | # Converts an Arrow table to a Dataframe 56 | df = arrow_table.to_pandas() 57 | 58 | # Runs aggregation 59 | res = pd.DataFrame({"sum": [(df.l_extendedprice * df.l_discount).sum()]}) 60 | 61 | # Creates an Arrow Table from a Dataframe 62 | new_table = pa.Table.from_pandas(res) 63 | end_time = timer() 64 | pandas_runtime = end_time - start_time 65 | st.write(f"Finished in {pandas_runtime} seconds") 66 | st.write(new_table) 67 | 68 | st.metric("Duck DB Runtime", duckdb_runtime, pandas_runtime - duckdb_runtime) 69 | elif view == filter_pushdown: 70 | st.header(filter_pushdown) 71 | "For our filter pushdown we repeat the same aggregation used in the previous section, but add filters on 4 more columns." 72 | with st.echo(): 73 | # DuckDB 74 | start_time = timer() 75 | lineitem = pq.read_table("lineitemsf1.snappy.parquet") 76 | 77 | # Get database connection 78 | con = duckdb.connect() 79 | 80 | # Transforms Query Result from DuckDB to Arrow Table 81 | result = con.execute( 82 | """SELECT sum(l_extendedprice * l_discount) AS revenue 83 | FROM 84 | lineitem 85 | WHERE 86 | l_shipdate >= CAST('1994-01-01' AS date) 87 | AND l_shipdate < CAST('1995-01-01' AS date) 88 | AND l_discount BETWEEN 0.05 89 | AND 0.07 90 | AND l_quantity < 24; """ 91 | ).fetch_arrow_table() 92 | end_time = timer() 93 | duckdb_runtime = end_time - start_time 94 | st.write(f"Finished in {duckdb_runtime} seconds") 95 | st.write(result) 96 | with st.echo(): 97 | # Pandas 98 | start_time = timer() 99 | arrow_table = pq.read_table("lineitemsf1.snappy.parquet") 100 | 101 | df = arrow_table.to_pandas() 102 | filtered_df = df[ 103 | (df.l_shipdate >= "1994-01-01") 104 | & (df.l_shipdate < "1995-01-01") 105 | & (df.l_discount >= 0.05) 106 | & (df.l_discount <= 0.07) 107 | & (df.l_quantity < 24) 108 | ] 109 | 110 | res = pd.DataFrame( 111 | {"sum": [(filtered_df.l_extendedprice * filtered_df.l_discount).sum()]} 112 | ) 113 | new_table = pa.Table.from_pandas(res) 114 | end_time = timer() 115 | pandas_runtime = end_time - start_time 116 | st.write(f"Finished in {pandas_runtime} seconds") 117 | st.write(new_table) 118 | st.metric("Duck DB Runtime", duckdb_runtime, pandas_runtime - duckdb_runtime) 119 | elif view == taxi: 120 | st.header(taxi) 121 | "This example uses the full NYC taxi dataset which you can download. It filters data in a streaming fashion from DuckDB. Notably Pandas has to load the entire dataset into memory to filter." 122 | row_year = st.number_input('Rows in Year', 2009, 2019, 2014, 1) 123 | min_amount = st.number_input('Minimum Fare', 10, 10000, 100, 10) 124 | with st.echo(): 125 | # DuckDB 126 | # Open dataset using year,month folder partition 127 | start_time = timer() 128 | nyc = ds.dataset("nyc-taxi/", partitioning=["year", "month"]) 129 | 130 | # Get database connection 131 | con = duckdb.connect() 132 | 133 | # Run query that selects part of the data 134 | query = con.execute( 135 | f"SELECT total_amount, passenger_count,year,pickup_at, pickup_longitude as lon, pickup_latitude as lat FROM nyc where total_amount > {min_amount} and year > {row_year} and lat is not null and lon is not null" 136 | ) 137 | 138 | # Create Record Batch Reader from Query Result. 139 | # "fetch_record_batch()" also accepts an extra parameter related to the desired produced chunk size. 140 | record_batch_reader = query.fetch_record_batch() 141 | 142 | # Retrieve all batch chunks 143 | all_chunks = [] 144 | while True: 145 | try: 146 | # Process a single chunk here 147 | # pyarrow.lib.RecordBatch 148 | chunk = record_batch_reader.read_next_batch() 149 | all_chunks.append(chunk) 150 | except StopIteration: 151 | break 152 | end_time = timer() 153 | data = pa.Table.from_batches(all_chunks) 154 | duckdb_runtime = end_time - start_time 155 | st.write(f"Finished in {duckdb_runtime} seconds") 156 | 157 | st.metric("Duck DB Runtime", duckdb_runtime) 158 | df = data.to_pandas() 159 | st.write(len(df)) 160 | 161 | st.write( 162 | pdk.Deck( 163 | map_style="mapbox://styles/mapbox/light-v9", 164 | initial_view_state={ 165 | "latitude": 40.7, 166 | "longitude": -73.9, 167 | "zoom": 10, 168 | "pitch": 50, 169 | }, 170 | layers=[ 171 | pdk.Layer( 172 | "HexagonLayer", 173 | data=df[['lon', 'lat']], 174 | get_position=["lon", "lat"], 175 | radius=100, 176 | elevation_scale=4, 177 | elevation_range=[0, 1000], 178 | pickable=True, 179 | extruded=True, 180 | ), 181 | ], 182 | ) 183 | ) 184 | st.write(df) 185 | st.write(data) 186 | 187 | st.write("The below pandas example uses ~250 GB of memory. Run it if you've got it!") 188 | st.code("""\ 189 | # Pandas 190 | # We must exclude one of the columns of the NYC dataset due to an unimplemented cast in Arrow. 191 | start_time = timer() 192 | working_columns = [ 193 | "vendor_id", 194 | "pickup_at", 195 | "dropoff_at", 196 | "passenger_count", 197 | "trip_distance", 198 | "pickup_longitude", 199 | "pickup_latitude", 200 | "store_and_fwd_flag", 201 | "dropoff_longitude", 202 | "dropoff_latitude", 203 | "payment_type", 204 | "fare_amount", 205 | "extra", 206 | "mta_tax", 207 | "tip_amount", 208 | "tolls_amount", 209 | "total_amount", 210 | "year", 211 | "month", 212 | ] 213 | 214 | # Open dataset using year,month folder partition 215 | nyc_dataset = ds.dataset("nyc-taxi/", partitioning=["year", "month"]) 216 | 217 | # Generate a scanner to skip problematic column 218 | dataset_scanner = nyc_dataset.scanner(columns=working_columns) 219 | 220 | # Materialize dataset to an Arrow Table 221 | nyc_table = dataset_scanner.to_table() 222 | 223 | # Generate Dataframe from Arow Table 224 | nyc_df = nyc_table.to_pandas() 225 | 226 | # Apply Filter 227 | filtered_df = nyc_df[(nyc_df.total_amount > 100) & (nyc_df.year > 2014)] 228 | 229 | # Apply Projection 230 | res = filtered_df[["total_amount", "passenger_count", "year"]] 231 | 232 | # Transform Result back to an Arrow Table 233 | new_table = pa.Table.from_pandas(res) 234 | end_time = timer() 235 | """) 236 | # pandas_runtime = end_time - start_time 237 | # st.write(f"Finished in {pandas_runtime} seconds") 238 | # st.write(new_table) 239 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2022 Gerard Bentley 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /full.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import duckdb\n", 10 | "import pyarrow as pa\n", 11 | "import pyarrow.dataset as ds\n", 12 | "import pyarrow.parquet as pq\n", 13 | "import pandas as pd\n", 14 | "\n" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 3, 20 | "metadata": {}, 21 | "outputs": [ 22 | { 23 | "name": "stdout", 24 | "output_type": "stream", 25 | "text": [ 26 | "chunk total 0\n", 27 | "chunk total 1000448\n", 28 | "chunk total 2000896\n", 29 | "chunk total 3001344\n", 30 | "chunk total 4001792\n", 31 | "chunk total 5002240\n", 32 | "chunk total 6002688\n", 33 | "chunk total 7003136\n", 34 | "chunk total 8003584\n", 35 | "chunk total 9004032\n", 36 | "chunk total 10004480\n", 37 | "chunk total 11004928\n", 38 | "chunk total 12005376\n", 39 | "chunk total 13005824\n", 40 | "chunk total 14006272\n", 41 | "chunk total 15006845\n", 42 | "chunk total 16007293\n", 43 | "chunk total 17007741\n", 44 | "chunk total 18008189\n", 45 | "chunk total 19008637\n", 46 | "chunk total 20009085\n", 47 | "chunk total 21009533\n", 48 | "chunk total 22009981\n", 49 | "chunk total 23010429\n", 50 | "chunk total 24010877\n", 51 | "chunk total 25011325\n", 52 | "chunk total 26011773\n", 53 | "chunk total 27012221\n", 54 | "chunk total 28013207\n", 55 | "chunk total 29013655\n", 56 | "chunk total 30014103\n", 57 | "chunk total 31014551\n", 58 | "chunk total 32014999\n", 59 | "chunk total 33015447\n", 60 | "chunk total 34015895\n", 61 | "chunk total 35016343\n", 62 | "chunk total 36016791\n", 63 | "chunk total 37017239\n", 64 | "chunk total 38017687\n", 65 | "chunk total 39018135\n", 66 | "chunk total 40018583\n", 67 | "chunk total 41019031\n", 68 | "chunk total 42019650\n", 69 | "chunk total 43020098\n", 70 | "chunk total 44020546\n", 71 | "chunk total 45020994\n", 72 | "chunk total 46021442\n", 73 | "chunk total 47021890\n", 74 | "chunk total 48022338\n", 75 | "chunk total 49022786\n", 76 | "chunk total 50023234\n", 77 | "chunk total 51023682\n", 78 | "chunk total 52024130\n", 79 | "chunk total 53024578\n", 80 | "chunk total 54025026\n", 81 | "chunk total 55025474\n", 82 | "chunk total 56025922\n", 83 | "chunk total 57026113\n", 84 | "chunk total 58026561\n", 85 | "chunk total 59027009\n", 86 | "chunk total 60027457\n", 87 | "chunk total 61027905\n", 88 | "chunk total 62028353\n", 89 | "chunk total 63028801\n", 90 | "chunk total 64029249\n", 91 | "chunk total 65029697\n", 92 | "chunk total 66030145\n", 93 | "chunk total 67030593\n", 94 | "chunk total 68031041\n", 95 | "chunk total 69031489\n", 96 | "chunk total 70031937\n", 97 | "chunk total 71032922\n", 98 | "chunk total 72033370\n", 99 | "chunk total 73033818\n", 100 | "chunk total 74034266\n", 101 | "chunk total 75034714\n", 102 | "chunk total 76035162\n", 103 | "chunk total 77035610\n", 104 | "chunk total 78036058\n", 105 | "chunk total 79036506\n", 106 | "chunk total 80036954\n", 107 | "chunk total 81037402\n", 108 | "chunk total 82037850\n", 109 | "chunk total 83038298\n", 110 | "chunk total 84038746\n", 111 | "chunk total 85039194\n", 112 | "chunk total 86039443\n", 113 | "chunk total 87039891\n", 114 | "chunk total 88040339\n", 115 | "chunk total 89040787\n", 116 | "chunk total 90041235\n", 117 | "chunk total 91041683\n", 118 | "chunk total 92042131\n", 119 | "chunk total 93042579\n", 120 | "chunk total 94043027\n", 121 | "chunk total 95043475\n", 122 | "chunk total 96043923\n", 123 | "chunk total 97044371\n", 124 | "chunk total 98044819\n", 125 | "chunk total 99045002\n", 126 | "chunk total 100045450\n", 127 | "chunk total 101045898\n", 128 | "chunk total 102046346\n", 129 | "chunk total 103046794\n", 130 | "chunk total 104047242\n", 131 | "chunk total 105047690\n", 132 | "chunk total 106048138\n", 133 | "chunk total 107048586\n", 134 | "chunk total 108049034\n", 135 | "chunk total 109049482\n", 136 | "chunk total 110049930\n", 137 | "chunk total 111050378\n", 138 | "chunk total 112050826\n", 139 | "chunk total 113051010\n", 140 | "chunk total 114051458\n", 141 | "chunk total 115051906\n", 142 | "chunk total 116052354\n", 143 | "chunk total 117052802\n", 144 | "chunk total 118053250\n", 145 | "chunk total 119053698\n", 146 | "chunk total 120054146\n", 147 | "chunk total 121054594\n", 148 | "chunk total 122055042\n", 149 | "chunk total 123055490\n", 150 | "chunk total 124055938\n", 151 | "chunk total 125056386\n", 152 | "chunk total 126056834\n", 153 | "chunk total 127057401\n", 154 | "chunk total 128057849\n", 155 | "chunk total 129058297\n", 156 | "chunk total 130058745\n", 157 | "chunk total 131059193\n", 158 | "chunk total 132059641\n", 159 | "chunk total 133060089\n", 160 | "chunk total 134060537\n", 161 | "chunk total 135060985\n", 162 | "chunk total 136061433\n", 163 | "chunk total 137061881\n", 164 | "chunk total 138062329\n", 165 | "chunk total 139062777\n", 166 | "chunk total 140063225\n", 167 | "chunk total 141063673\n", 168 | "chunk total 142063936\n", 169 | "chunk total 143064384\n", 170 | "chunk total 144064832\n", 171 | "chunk total 145065280\n", 172 | "chunk total 146065728\n", 173 | "chunk total 147066176\n", 174 | "chunk total 148066624\n", 175 | "chunk total 149067072\n", 176 | "chunk total 150067520\n", 177 | "chunk total 151067968\n", 178 | "chunk total 152068416\n", 179 | "chunk total 153068864\n", 180 | "chunk total 154069312\n", 181 | "chunk total 155069760\n", 182 | "chunk total 156070208\n", 183 | "chunk total 157070411\n", 184 | "chunk total 158070859\n", 185 | "chunk total 159071307\n", 186 | "chunk total 160071755\n", 187 | "chunk total 161072203\n", 188 | "chunk total 162072651\n", 189 | "chunk total 163073099\n", 190 | "chunk total 164073547\n", 191 | "chunk total 165073995\n", 192 | "chunk total 166074443\n", 193 | "chunk total 167074891\n", 194 | "chunk total 168075339\n", 195 | "chunk total 169075787\n", 196 | "chunk total 170076235\n", 197 | "chunk total 171076279\n", 198 | "chunk total 172076727\n", 199 | "chunk total 173077175\n", 200 | "chunk total 174077623\n", 201 | "chunk total 175078071\n", 202 | "chunk total 176078519\n", 203 | "chunk total 177078967\n", 204 | "chunk total 178079415\n", 205 | "chunk total 179079863\n", 206 | "chunk total 180080311\n", 207 | "chunk total 181080759\n", 208 | "chunk total 182081207\n", 209 | "chunk total 183081655\n", 210 | "chunk total 184082103\n", 211 | "chunk total 185082551\n", 212 | "chunk total 186083065\n", 213 | "chunk total 187083513\n", 214 | "chunk total 188083961\n", 215 | "chunk total 189084409\n", 216 | "chunk total 190084857\n", 217 | "chunk total 191085305\n", 218 | "chunk total 192085753\n", 219 | "chunk total 193086201\n", 220 | "chunk total 194086649\n", 221 | "chunk total 195087097\n", 222 | "chunk total 196087545\n", 223 | "chunk total 197087993\n", 224 | "chunk total 198088441\n", 225 | "chunk total 199088889\n", 226 | "chunk total 200089337\n", 227 | "chunk total 201089815\n", 228 | "chunk total 202090263\n", 229 | "chunk total 203090711\n", 230 | "chunk total 204091159\n", 231 | "chunk total 205091607\n", 232 | "chunk total 206092055\n", 233 | "chunk total 207092503\n", 234 | "chunk total 208092951\n", 235 | "chunk total 209093399\n", 236 | "chunk total 210093847\n", 237 | "chunk total 211094295\n", 238 | "chunk total 212094743\n", 239 | "chunk total 213095191\n", 240 | "chunk total 214095639\n", 241 | "chunk total 215096087\n", 242 | "chunk total 216096535\n", 243 | "chunk total 217097502\n", 244 | "chunk total 218097950\n", 245 | "chunk total 219098398\n", 246 | "chunk total 220098846\n", 247 | "chunk total 221099294\n", 248 | "chunk total 222099742\n", 249 | "chunk total 223100190\n", 250 | "chunk total 224100638\n", 251 | "chunk total 225101086\n", 252 | "chunk total 226101534\n", 253 | "chunk total 227101982\n", 254 | "chunk total 228102430\n", 255 | "chunk total 229102878\n", 256 | "chunk total 230103326\n", 257 | "chunk total 231103774\n", 258 | "chunk total 232103878\n", 259 | "chunk total 233104326\n", 260 | "chunk total 234104774\n", 261 | "chunk total 235105222\n", 262 | "chunk total 236105670\n", 263 | "chunk total 237106118\n", 264 | "chunk total 238106566\n", 265 | "chunk total 239107014\n", 266 | "chunk total 240107462\n", 267 | "chunk total 241107910\n", 268 | "chunk total 242108358\n", 269 | "chunk total 243108806\n", 270 | "chunk total 244109254\n", 271 | "chunk total 245109702\n", 272 | "chunk total 246110157\n", 273 | "chunk total 247110605\n", 274 | "chunk total 248111053\n", 275 | "chunk total 249111501\n", 276 | "chunk total 250111949\n", 277 | "chunk total 251112397\n", 278 | "chunk total 252112845\n", 279 | "chunk total 253113293\n", 280 | "chunk total 254113741\n", 281 | "chunk total 255114189\n", 282 | "chunk total 256114637\n", 283 | "chunk total 257115085\n", 284 | "chunk total 258115533\n", 285 | "chunk total 259116542\n", 286 | "chunk total 260116990\n", 287 | "chunk total 261117438\n", 288 | "chunk total 262117886\n", 289 | "chunk total 263118334\n", 290 | "chunk total 264118782\n", 291 | "chunk total 265119230\n", 292 | "chunk total 266119678\n", 293 | "chunk total 267120126\n", 294 | "chunk total 268120574\n", 295 | "chunk total 269121022\n", 296 | "chunk total 270121470\n", 297 | "chunk total 271121918\n", 298 | "chunk total 272122366\n", 299 | "chunk total 273122814\n", 300 | "chunk total 274123247\n", 301 | "chunk total 275123695\n", 302 | "chunk total 276124143\n", 303 | "chunk total 277124591\n", 304 | "chunk total 278125039\n", 305 | "chunk total 279125487\n", 306 | "chunk total 280125935\n", 307 | "chunk total 281126383\n", 308 | "chunk total 282126831\n", 309 | "chunk total 283127279\n", 310 | "chunk total 284127727\n", 311 | "chunk total 285128175\n", 312 | "chunk total 286128623\n", 313 | "chunk total 287129071\n", 314 | "chunk total 288129519\n", 315 | "chunk total 289129766\n", 316 | "chunk total 290130214\n", 317 | "chunk total 291130662\n", 318 | "chunk total 292131110\n", 319 | "chunk total 293131558\n", 320 | "chunk total 294132006\n", 321 | "chunk total 295132454\n", 322 | "chunk total 296132902\n", 323 | "chunk total 297133350\n", 324 | "chunk total 298133798\n", 325 | "chunk total 299134246\n", 326 | "chunk total 300134694\n", 327 | "chunk total 301135142\n", 328 | "chunk total 302135590\n", 329 | "chunk total 303136284\n", 330 | "chunk total 304136732\n", 331 | "chunk total 305137180\n", 332 | "chunk total 306137628\n", 333 | "chunk total 307138076\n", 334 | "chunk total 308138524\n", 335 | "chunk total 309138972\n", 336 | "chunk total 310139420\n", 337 | "chunk total 311139868\n", 338 | "chunk total 312140316\n", 339 | "chunk total 313140764\n", 340 | "chunk total 314141212\n", 341 | "chunk total 315141660\n", 342 | "chunk total 316142550\n", 343 | "chunk total 317142998\n", 344 | "chunk total 318143446\n", 345 | "chunk total 319143894\n", 346 | "chunk total 320144342\n", 347 | "chunk total 321144790\n", 348 | "chunk total 322145238\n", 349 | "chunk total 323145686\n", 350 | "chunk total 324146134\n", 351 | "chunk total 325146582\n", 352 | "chunk total 326147030\n", 353 | "chunk total 327147478\n", 354 | "chunk total 328147926\n", 355 | "chunk total 329148374\n", 356 | "chunk total 330149242\n", 357 | "chunk total 331149690\n", 358 | "chunk total 332150138\n", 359 | "chunk total 333150586\n", 360 | "chunk total 334151034\n", 361 | "chunk total 335151482\n", 362 | "chunk total 336151930\n", 363 | "chunk total 337152378\n", 364 | "chunk total 338152826\n", 365 | "chunk total 339153274\n", 366 | "chunk total 340153722\n", 367 | "chunk total 341154170\n", 368 | "chunk total 342154618\n", 369 | "chunk total 343155066\n", 370 | "chunk total 344155434\n", 371 | "chunk total 345155882\n", 372 | "chunk total 346156330\n", 373 | "chunk total 347156778\n", 374 | "chunk total 348157226\n", 375 | "chunk total 349157674\n", 376 | "chunk total 350158122\n", 377 | "chunk total 351158570\n", 378 | "chunk total 352159018\n", 379 | "chunk total 353159466\n", 380 | "chunk total 354159914\n", 381 | "chunk total 355160362\n", 382 | "chunk total 356160810\n", 383 | "chunk total 357161258\n", 384 | "chunk total 358161706\n", 385 | "chunk total 359162154\n", 386 | "chunk total 360162392\n", 387 | "chunk total 361162840\n", 388 | "chunk total 362163288\n", 389 | "chunk total 363163736\n", 390 | "chunk total 364164184\n", 391 | "chunk total 365164632\n", 392 | "chunk total 366165080\n", 393 | "chunk total 367165528\n", 394 | "chunk total 368165976\n", 395 | "chunk total 369166424\n", 396 | "chunk total 370166872\n", 397 | "chunk total 371167320\n", 398 | "chunk total 372167768\n", 399 | "chunk total 373168216\n", 400 | "chunk total 374168664\n", 401 | "chunk total 375169109\n", 402 | "chunk total 376169557\n", 403 | "chunk total 377170005\n", 404 | "chunk total 378170453\n", 405 | "chunk total 379170901\n", 406 | "chunk total 380171349\n", 407 | "chunk total 381171797\n", 408 | "chunk total 382172245\n", 409 | "chunk total 383172693\n", 410 | "chunk total 384173141\n", 411 | "chunk total 385173589\n", 412 | "chunk total 386174037\n", 413 | "chunk total 387174485\n", 414 | "chunk total 388174933\n", 415 | "chunk total 389175381\n", 416 | "chunk total 390176137\n", 417 | "chunk total 391176585\n", 418 | "chunk total 392177033\n", 419 | "chunk total 393177481\n", 420 | "chunk total 394177929\n", 421 | "chunk total 395178377\n", 422 | "chunk total 396178825\n", 423 | "chunk total 397179273\n", 424 | "chunk total 398179721\n", 425 | "chunk total 399180169\n", 426 | "chunk total 400180617\n", 427 | "chunk total 401181065\n", 428 | "chunk total 402181513\n", 429 | "chunk total 403181961\n", 430 | "chunk total 404182409\n", 431 | "chunk total 405182862\n", 432 | "chunk total 406183310\n", 433 | "chunk total 407183758\n", 434 | "chunk total 408184206\n", 435 | "chunk total 409184654\n", 436 | "chunk total 410185102\n", 437 | "chunk total 411185550\n", 438 | "chunk total 412185998\n", 439 | "chunk total 413186446\n", 440 | "chunk total 414186894\n", 441 | "chunk total 415187342\n", 442 | "chunk total 416187790\n", 443 | "chunk total 417188238\n", 444 | "chunk total 418188686\n", 445 | "chunk total 419189134\n", 446 | "chunk total 420189615\n", 447 | "chunk total 421190063\n", 448 | "chunk total 422190511\n", 449 | "chunk total 423190959\n", 450 | "chunk total 424191407\n", 451 | "chunk total 425191855\n", 452 | "chunk total 426192303\n", 453 | "chunk total 427192751\n", 454 | "chunk total 428193199\n", 455 | "chunk total 429193647\n", 456 | "chunk total 430194095\n", 457 | "chunk total 431194543\n", 458 | "chunk total 432194991\n", 459 | "chunk total 433195032\n", 460 | "chunk total 434195480\n", 461 | "chunk total 435195928\n", 462 | "chunk total 436196376\n", 463 | "chunk total 437196824\n", 464 | "chunk total 438197272\n", 465 | "chunk total 439197720\n", 466 | "chunk total 440198168\n", 467 | "chunk total 441198616\n", 468 | "chunk total 442199064\n", 469 | "chunk total 443199512\n", 470 | "chunk total 444199960\n", 471 | "chunk total 445200408\n", 472 | "chunk total 446200856\n", 473 | "chunk total 447201304\n", 474 | "chunk total 448201684\n", 475 | "chunk total 449202132\n", 476 | "chunk total 450202580\n", 477 | "chunk total 451203028\n", 478 | "chunk total 452203476\n", 479 | "chunk total 453203924\n", 480 | "chunk total 454204372\n", 481 | "chunk total 455204820\n", 482 | "chunk total 456205268\n", 483 | "chunk total 457205716\n", 484 | "chunk total 458206164\n", 485 | "chunk total 459206612\n", 486 | "chunk total 460207060\n", 487 | "chunk total 461207508\n", 488 | "chunk total 462207956\n", 489 | "chunk total 463208404\n", 490 | "chunk total 464208448\n", 491 | "chunk total 465208896\n", 492 | "chunk total 466209344\n", 493 | "chunk total 467209792\n", 494 | "chunk total 468210240\n", 495 | "chunk total 469210688\n", 496 | "chunk total 470211136\n", 497 | "chunk total 471211584\n", 498 | "chunk total 472212032\n", 499 | "chunk total 473212480\n", 500 | "chunk total 474212928\n", 501 | "chunk total 475213376\n", 502 | "chunk total 476213824\n", 503 | "chunk total 477214272\n", 504 | "chunk total 478215142\n", 505 | "chunk total 479215590\n", 506 | "chunk total 480216038\n", 507 | "chunk total 481216486\n", 508 | "chunk total 482216934\n", 509 | "chunk total 483217382\n", 510 | "chunk total 484217830\n", 511 | "chunk total 485218278\n", 512 | "chunk total 486218726\n", 513 | "chunk total 487219174\n", 514 | "chunk total 488219622\n", 515 | "chunk total 489220070\n", 516 | "chunk total 490220518\n", 517 | "chunk total 491220966\n", 518 | "chunk total 492221414\n", 519 | "chunk total 493222021\n", 520 | "chunk total 494222469\n", 521 | "chunk total 495222917\n", 522 | "chunk total 496223365\n", 523 | "chunk total 497223813\n", 524 | "chunk total 498224261\n", 525 | "chunk total 499224709\n", 526 | "chunk total 500225157\n", 527 | "chunk total 501225605\n", 528 | "chunk total 502226053\n", 529 | "chunk total 503226501\n", 530 | "chunk total 504226949\n", 531 | "chunk total 505227397\n", 532 | "chunk total 506227845\n", 533 | "chunk total 507228293\n", 534 | "chunk total 508229041\n", 535 | "chunk total 509229489\n", 536 | "chunk total 510229937\n", 537 | "chunk total 511230385\n", 538 | "chunk total 512230833\n", 539 | "chunk total 513231281\n", 540 | "chunk total 514231729\n", 541 | "chunk total 515232177\n", 542 | "chunk total 516232625\n", 543 | "chunk total 517233073\n", 544 | "chunk total 518233521\n", 545 | "chunk total 519233969\n", 546 | "chunk total 520234417\n", 547 | "chunk total 521234865\n", 548 | "chunk total 522235313\n", 549 | "chunk total 523236114\n", 550 | "chunk total 524236562\n", 551 | "chunk total 525237010\n", 552 | "chunk total 526237458\n", 553 | "chunk total 527237906\n", 554 | "chunk total 528238354\n", 555 | "chunk total 529238802\n", 556 | "chunk total 530239250\n", 557 | "chunk total 531239698\n", 558 | "chunk total 532240146\n", 559 | "chunk total 533240594\n", 560 | "chunk total 534241042\n", 561 | "chunk total 535241490\n", 562 | "chunk total 536241938\n", 563 | "chunk total 537242386\n", 564 | "chunk total 538242834\n", 565 | "chunk total 539243773\n", 566 | "chunk total 540244221\n", 567 | "chunk total 541244669\n", 568 | "chunk total 542245117\n", 569 | "chunk total 543245565\n", 570 | "chunk total 544246013\n", 571 | "chunk total 545246461\n", 572 | "chunk total 546246909\n", 573 | "chunk total 547247357\n", 574 | "chunk total 548247805\n", 575 | "chunk total 549248253\n", 576 | "chunk total 550248701\n", 577 | "chunk total 551249149\n", 578 | "chunk total 552249597\n", 579 | "chunk total 553250045\n", 580 | "chunk total 554250493\n", 581 | "chunk total 555251095\n", 582 | "chunk total 556251543\n", 583 | "chunk total 557251991\n", 584 | "chunk total 558252439\n", 585 | "chunk total 559252887\n", 586 | "chunk total 560253335\n", 587 | "chunk total 561253783\n", 588 | "chunk total 562254231\n", 589 | "chunk total 563254679\n", 590 | "chunk total 564255127\n", 591 | "chunk total 565255575\n", 592 | "chunk total 566256023\n", 593 | "chunk total 567256471\n", 594 | "chunk total 568256919\n", 595 | "chunk total 569257367\n", 596 | "chunk total 570257468\n", 597 | "chunk total 571257916\n", 598 | "chunk total 572258364\n", 599 | "chunk total 573258812\n", 600 | "chunk total 574259260\n", 601 | "chunk total 575259708\n", 602 | "chunk total 576260156\n", 603 | "chunk total 577260604\n", 604 | "chunk total 578261052\n", 605 | "chunk total 579261500\n", 606 | "chunk total 580261948\n", 607 | "chunk total 581262396\n", 608 | "chunk total 582262844\n", 609 | "chunk total 583263292\n", 610 | "chunk total 584263740\n", 611 | "chunk total 585263824\n", 612 | "chunk total 586264272\n", 613 | "chunk total 587264720\n", 614 | "chunk total 588265168\n", 615 | "chunk total 589265616\n", 616 | "chunk total 590266064\n", 617 | "chunk total 591266512\n", 618 | "chunk total 592266960\n", 619 | "chunk total 593267408\n", 620 | "chunk total 594267856\n", 621 | "chunk total 595268304\n", 622 | "chunk total 596268752\n", 623 | "chunk total 597269200\n", 624 | "chunk total 598269648\n", 625 | "chunk total 599270096\n", 626 | "chunk total 600270843\n", 627 | "chunk total 601271291\n", 628 | "chunk total 602271739\n", 629 | "chunk total 603272187\n", 630 | "chunk total 604272635\n", 631 | "chunk total 605273083\n", 632 | "chunk total 606273531\n", 633 | "chunk total 607273979\n", 634 | "chunk total 608274427\n", 635 | "chunk total 609274875\n", 636 | "chunk total 610275323\n", 637 | "chunk total 611275771\n", 638 | "chunk total 612276219\n", 639 | "chunk total 613276667\n", 640 | "chunk total 614276787\n", 641 | "chunk total 615277235\n", 642 | "chunk total 616277683\n", 643 | "chunk total 617278131\n", 644 | "chunk total 618278579\n", 645 | "chunk total 619279027\n", 646 | "chunk total 620279475\n", 647 | "chunk total 621279923\n", 648 | "chunk total 622280371\n", 649 | "chunk total 623280819\n", 650 | "chunk total 624281267\n", 651 | "chunk total 625281715\n", 652 | "chunk total 626282163\n", 653 | "chunk total 627282611\n", 654 | "chunk total 628283059\n", 655 | "chunk total 629283417\n", 656 | "chunk total 630283865\n", 657 | "chunk total 631284313\n", 658 | "chunk total 632284761\n", 659 | "chunk total 633285209\n", 660 | "chunk total 634285657\n", 661 | "chunk total 635286105\n", 662 | "chunk total 636286553\n", 663 | "chunk total 637287001\n", 664 | "chunk total 638287449\n", 665 | "chunk total 639287897\n", 666 | "chunk total 640288345\n", 667 | "chunk total 641288793\n", 668 | "chunk total 642289241\n", 669 | "chunk total 643289636\n", 670 | "chunk total 644290084\n", 671 | "chunk total 645290532\n", 672 | "chunk total 646290980\n", 673 | "chunk total 647291428\n", 674 | "chunk total 648291876\n", 675 | "chunk total 649292324\n", 676 | "chunk total 650292772\n", 677 | "chunk total 651293220\n", 678 | "chunk total 652293668\n", 679 | "chunk total 653294116\n", 680 | "chunk total 654294564\n", 681 | "chunk total 655295012\n", 682 | "chunk total 656295460\n", 683 | "chunk total 657296066\n", 684 | "chunk total 658296514\n", 685 | "chunk total 659296962\n", 686 | "chunk total 660297410\n", 687 | "chunk total 661297858\n", 688 | "chunk total 662298306\n", 689 | "chunk total 663298754\n", 690 | "chunk total 664299202\n", 691 | "chunk total 665299650\n", 692 | "chunk total 666300098\n", 693 | "chunk total 667300546\n", 694 | "chunk total 668300994\n", 695 | "chunk total 669301442\n", 696 | "chunk total 670301890\n", 697 | "chunk total 671302338\n", 698 | "chunk total 672302921\n", 699 | "chunk total 673303369\n", 700 | "chunk total 674303817\n", 701 | "chunk total 675304265\n", 702 | "chunk total 676304713\n", 703 | "chunk total 677305161\n", 704 | "chunk total 678305609\n", 705 | "chunk total 679306057\n", 706 | "chunk total 680306505\n", 707 | "chunk total 681306953\n", 708 | "chunk total 682307401\n", 709 | "chunk total 683307849\n", 710 | "chunk total 684308297\n", 711 | "chunk total 685308745\n", 712 | "chunk total 686309488\n", 713 | "chunk total 687309936\n", 714 | "chunk total 688310384\n", 715 | "chunk total 689310832\n", 716 | "chunk total 690311280\n", 717 | "chunk total 691311728\n", 718 | "chunk total 692312176\n", 719 | "chunk total 693312624\n", 720 | "chunk total 694313072\n", 721 | "chunk total 695313520\n", 722 | "chunk total 696313968\n", 723 | "chunk total 697314416\n", 724 | "chunk total 698314864\n", 725 | "chunk total 699315312\n", 726 | "chunk total 700316048\n", 727 | "chunk total 701316496\n", 728 | "chunk total 702316944\n", 729 | "chunk total 703317392\n", 730 | "chunk total 704317840\n", 731 | "chunk total 705318288\n", 732 | "chunk total 706318736\n", 733 | "chunk total 707319184\n", 734 | "chunk total 708319632\n", 735 | "chunk total 709320080\n", 736 | "chunk total 710320528\n", 737 | "chunk total 711320976\n", 738 | "chunk total 712321424\n", 739 | "chunk total 713321872\n", 740 | "chunk total 714322320\n", 741 | "chunk total 715322768\n", 742 | "chunk total 716323324\n", 743 | "chunk total 717323772\n", 744 | "chunk total 718324220\n", 745 | "chunk total 719324668\n", 746 | "chunk total 720325116\n", 747 | "chunk total 721325564\n", 748 | "chunk total 722326012\n", 749 | "chunk total 723326460\n", 750 | "chunk total 724326908\n", 751 | "chunk total 725327356\n", 752 | "chunk total 726327804\n", 753 | "chunk total 727328252\n", 754 | "chunk total 728328700\n", 755 | "chunk total 729329148\n", 756 | "chunk total 730329596\n", 757 | "chunk total 731330608\n", 758 | "chunk total 732331056\n", 759 | "chunk total 733331504\n", 760 | "chunk total 734331952\n", 761 | "chunk total 735332400\n", 762 | "chunk total 736332848\n", 763 | "chunk total 737333296\n", 764 | "chunk total 738333744\n", 765 | "chunk total 739334192\n", 766 | "chunk total 740334640\n", 767 | "chunk total 741335088\n", 768 | "chunk total 742335536\n", 769 | "chunk total 743335984\n", 770 | "chunk total 744336432\n", 771 | "chunk total 745336880\n", 772 | "chunk total 746337129\n", 773 | "chunk total 747337577\n", 774 | "chunk total 748338025\n", 775 | "chunk total 749338473\n", 776 | "chunk total 750338921\n", 777 | "chunk total 751339369\n", 778 | "chunk total 752339817\n", 779 | "chunk total 753340265\n", 780 | "chunk total 754340713\n", 781 | "chunk total 755341161\n", 782 | "chunk total 756341609\n", 783 | "chunk total 757342057\n", 784 | "chunk total 758342505\n", 785 | "chunk total 759342953\n", 786 | "chunk total 760343401\n", 787 | "chunk total 761344153\n", 788 | "chunk total 762344601\n", 789 | "chunk total 763345049\n", 790 | "chunk total 764345497\n", 791 | "chunk total 765345945\n", 792 | "chunk total 766346393\n", 793 | "chunk total 767346841\n", 794 | "chunk total 768347289\n", 795 | "chunk total 769347737\n", 796 | "chunk total 770348185\n", 797 | "chunk total 771348633\n", 798 | "chunk total 772349081\n", 799 | "chunk total 773349529\n", 800 | "chunk total 774349977\n", 801 | "chunk total 775350265\n", 802 | "chunk total 776350713\n", 803 | "chunk total 777351161\n", 804 | "chunk total 778351609\n", 805 | "chunk total 779352057\n", 806 | "chunk total 780352505\n", 807 | "chunk total 781352953\n", 808 | "chunk total 782353401\n", 809 | "chunk total 783353849\n", 810 | "chunk total 784354297\n", 811 | "chunk total 785354745\n", 812 | "chunk total 786355193\n", 813 | "chunk total 787355502\n", 814 | "chunk total 788355950\n", 815 | "chunk total 789356398\n", 816 | "chunk total 790356846\n", 817 | "chunk total 791357294\n", 818 | "chunk total 792357742\n", 819 | "chunk total 793358190\n", 820 | "chunk total 794358638\n", 821 | "chunk total 795359086\n", 822 | "chunk total 796359534\n", 823 | "chunk total 797359982\n", 824 | "chunk total 798360430\n", 825 | "chunk total 799360878\n", 826 | "chunk total 800361326\n", 827 | "chunk total 801361819\n", 828 | "chunk total 802362267\n", 829 | "chunk total 803362715\n", 830 | "chunk total 804363163\n", 831 | "chunk total 805363611\n", 832 | "chunk total 806364059\n", 833 | "chunk total 807364507\n", 834 | "chunk total 808364955\n", 835 | "chunk total 809365403\n", 836 | "chunk total 810365851\n", 837 | "chunk total 811366299\n", 838 | "chunk total 812366747\n", 839 | "chunk total 813367195\n", 840 | "chunk total 814367643\n", 841 | "chunk total 815368091\n", 842 | "chunk total 816368423\n", 843 | "chunk total 817368871\n", 844 | "chunk total 818369319\n", 845 | "chunk total 819369767\n", 846 | "chunk total 820370215\n", 847 | "chunk total 821370663\n", 848 | "chunk total 822371111\n", 849 | "chunk total 823371559\n", 850 | "chunk total 824372007\n", 851 | "chunk total 825372455\n", 852 | "chunk total 826372903\n", 853 | "chunk total 827373351\n", 854 | "chunk total 828373799\n", 855 | "chunk total 829374247\n", 856 | "chunk total 830374695\n", 857 | "chunk total 831375370\n", 858 | "chunk total 832375818\n", 859 | "chunk total 833376266\n", 860 | "chunk total 834376714\n", 861 | "chunk total 835377162\n", 862 | "chunk total 836377610\n", 863 | "chunk total 837378058\n", 864 | "chunk total 838378506\n", 865 | "chunk total 839378954\n", 866 | "chunk total 840379402\n", 867 | "chunk total 841379850\n", 868 | "chunk total 842380298\n", 869 | "chunk total 843380746\n", 870 | "chunk total 844381194\n", 871 | "chunk total 845381304\n", 872 | "chunk total 846381752\n", 873 | "chunk total 847382200\n", 874 | "chunk total 848382648\n", 875 | "chunk total 849383096\n", 876 | "chunk total 850383544\n", 877 | "chunk total 851383992\n", 878 | "chunk total 852384440\n", 879 | "chunk total 853384888\n", 880 | "chunk total 854385336\n", 881 | "chunk total 855385784\n", 882 | "chunk total 856386232\n", 883 | "chunk total 857386680\n", 884 | "chunk total 858387604\n", 885 | "chunk total 859388052\n", 886 | "chunk total 860388500\n", 887 | "chunk total 861388948\n", 888 | "chunk total 862389396\n", 889 | "chunk total 863389844\n", 890 | "chunk total 864390292\n", 891 | "chunk total 865390740\n", 892 | "chunk total 866391188\n", 893 | "chunk total 867391636\n", 894 | "chunk total 868392084\n", 895 | "chunk total 869392532\n", 896 | "chunk total 870392980\n", 897 | "chunk total 871393428\n", 898 | "chunk total 872393475\n", 899 | "chunk total 873393923\n", 900 | "chunk total 874394371\n", 901 | "chunk total 875394819\n", 902 | "chunk total 876395267\n", 903 | "chunk total 877395715\n", 904 | "chunk total 878396163\n", 905 | "chunk total 879396611\n", 906 | "chunk total 880397059\n", 907 | "chunk total 881397507\n", 908 | "chunk total 882397955\n", 909 | "chunk total 883398403\n", 910 | "chunk total 884398851\n", 911 | "chunk total 885399299\n", 912 | "chunk total 886399747\n", 913 | "chunk total 887400738\n", 914 | "chunk total 888401186\n", 915 | "chunk total 889401634\n", 916 | "chunk total 890402082\n", 917 | "chunk total 891402530\n", 918 | "chunk total 892402978\n", 919 | "chunk total 893403426\n", 920 | "chunk total 894403874\n", 921 | "chunk total 895404322\n", 922 | "chunk total 896404770\n", 923 | "chunk total 897405218\n", 924 | "chunk total 898405666\n", 925 | "chunk total 899406114\n", 926 | "chunk total 900406562\n", 927 | "chunk total 901407010\n", 928 | "chunk total 902407593\n", 929 | "chunk total 903408041\n", 930 | "chunk total 904408489\n", 931 | "chunk total 905408937\n", 932 | "chunk total 906409385\n", 933 | "chunk total 907409833\n", 934 | "chunk total 908410281\n", 935 | "chunk total 909410729\n", 936 | "chunk total 910411177\n", 937 | "chunk total 911411625\n", 938 | "chunk total 912412073\n", 939 | "chunk total 913412521\n", 940 | "chunk total 914412969\n", 941 | "chunk total 915413417\n", 942 | "chunk total 916413634\n", 943 | "chunk total 917414082\n", 944 | "chunk total 918414530\n", 945 | "chunk total 919414978\n", 946 | "chunk total 920415426\n", 947 | "chunk total 921415874\n", 948 | "chunk total 922416322\n", 949 | "chunk total 923416770\n", 950 | "chunk total 924417218\n", 951 | "chunk total 925417666\n", 952 | "chunk total 926418114\n", 953 | "chunk total 927418562\n", 954 | "chunk total 928419010\n", 955 | "chunk total 929419458\n", 956 | "chunk total 930420199\n", 957 | "chunk total 931420647\n", 958 | "chunk total 932421095\n", 959 | "chunk total 933421543\n", 960 | "chunk total 934421991\n", 961 | "chunk total 935422439\n", 962 | "chunk total 936422887\n", 963 | "chunk total 937423335\n", 964 | "chunk total 938423783\n", 965 | "chunk total 939424231\n", 966 | "chunk total 940424679\n", 967 | "chunk total 941425127\n", 968 | "chunk total 942425575\n", 969 | "chunk total 943426212\n", 970 | "chunk total 944426660\n", 971 | "chunk total 945427108\n", 972 | "chunk total 946427556\n", 973 | "chunk total 947428004\n", 974 | "chunk total 948428452\n", 975 | "chunk total 949428900\n", 976 | "chunk total 950429348\n", 977 | "chunk total 951429796\n", 978 | "chunk total 952430244\n", 979 | "chunk total 953430692\n", 980 | "chunk total 954431140\n", 981 | "chunk total 955431588\n", 982 | "chunk total 956432529\n", 983 | "chunk total 957432977\n", 984 | "chunk total 958433425\n", 985 | "chunk total 959433873\n", 986 | "chunk total 960434321\n", 987 | "chunk total 961434769\n", 988 | "chunk total 962435217\n", 989 | "chunk total 963435665\n", 990 | "chunk total 964436113\n", 991 | "chunk total 965436561\n", 992 | "chunk total 966437009\n", 993 | "chunk total 967437457\n", 994 | "chunk total 968437905\n", 995 | "chunk total 969437905\n", 996 | "chunk total 970438353\n", 997 | "chunk total 971438801\n", 998 | "chunk total 972439249\n", 999 | "chunk total 973439697\n", 1000 | "chunk total 974440145\n", 1001 | "chunk total 975440593\n", 1002 | "chunk total 976441041\n", 1003 | "chunk total 977441489\n", 1004 | "chunk total 978441937\n", 1005 | "chunk total 979442385\n", 1006 | "chunk total 980442833\n", 1007 | "chunk total 981443281\n", 1008 | "chunk total 982443729\n", 1009 | "chunk total 983444177\n", 1010 | "chunk total 984444536\n", 1011 | "chunk total 985444984\n", 1012 | "chunk total 986445432\n", 1013 | "chunk total 987445880\n", 1014 | "chunk total 988446328\n", 1015 | "chunk total 989446776\n", 1016 | "chunk total 990447224\n", 1017 | "chunk total 991447672\n", 1018 | "chunk total 992448120\n", 1019 | "chunk total 993448568\n", 1020 | "chunk total 994449016\n", 1021 | "chunk total 995449464\n", 1022 | "chunk total 996449912\n", 1023 | "chunk total 997450784\n", 1024 | "chunk total 998451232\n", 1025 | "chunk total 999451680\n", 1026 | "chunk total 1000452128\n", 1027 | "chunk total 1001452576\n", 1028 | "chunk total 1002453024\n", 1029 | "chunk total 1003453472\n", 1030 | "chunk total 1004453920\n", 1031 | "chunk total 1005454368\n", 1032 | "chunk total 1006454816\n", 1033 | "chunk total 1007455264\n", 1034 | "chunk total 1008455712\n", 1035 | "chunk total 1009456160\n", 1036 | "chunk total 1010456753\n", 1037 | "chunk total 1011457201\n", 1038 | "chunk total 1012457649\n", 1039 | "chunk total 1013458097\n", 1040 | "chunk total 1014458545\n", 1041 | "chunk total 1015458993\n", 1042 | "chunk total 1016459441\n", 1043 | "chunk total 1017459889\n", 1044 | "chunk total 1018460337\n", 1045 | "chunk total 1019460785\n", 1046 | "chunk total 1020461233\n", 1047 | "chunk total 1021461681\n", 1048 | "chunk total 1022462315\n", 1049 | "chunk total 1023462763\n", 1050 | "chunk total 1024463211\n", 1051 | "chunk total 1025463659\n", 1052 | "chunk total 1026464107\n", 1053 | "chunk total 1027464555\n", 1054 | "chunk total 1028465003\n", 1055 | "chunk total 1029465451\n", 1056 | "chunk total 1030465899\n", 1057 | "chunk total 1031466347\n", 1058 | "chunk total 1032466795\n", 1059 | "chunk total 1033467243\n", 1060 | "chunk total 1034467691\n", 1061 | "chunk total 1035467844\n", 1062 | "chunk total 1036468292\n", 1063 | "chunk total 1037468740\n", 1064 | "chunk total 1038469188\n", 1065 | "chunk total 1039469636\n", 1066 | "chunk total 1040470084\n", 1067 | "chunk total 1041470532\n", 1068 | "chunk total 1042470980\n", 1069 | "chunk total 1043471428\n", 1070 | "chunk total 1044471876\n", 1071 | "chunk total 1045472324\n", 1072 | "chunk total 1046472772\n", 1073 | "chunk total 1047473220\n", 1074 | "chunk total 1048473341\n", 1075 | "chunk total 1049473789\n", 1076 | "chunk total 1050474237\n", 1077 | "chunk total 1051474685\n", 1078 | "chunk total 1052475133\n", 1079 | "chunk total 1053475581\n", 1080 | "chunk total 1054476029\n", 1081 | "chunk total 1055476477\n", 1082 | "chunk total 1056476925\n", 1083 | "chunk total 1057477373\n", 1084 | "chunk total 1058477821\n", 1085 | "chunk total 1059478269\n", 1086 | "chunk total 1060478717\n", 1087 | "chunk total 1061479594\n", 1088 | "chunk total 1062480042\n", 1089 | "chunk total 1063480490\n", 1090 | "chunk total 1064480938\n", 1091 | "chunk total 1065481386\n", 1092 | "chunk total 1066481834\n", 1093 | "chunk total 1067482282\n", 1094 | "chunk total 1068482730\n", 1095 | "chunk total 1069483178\n", 1096 | "chunk total 1070483626\n", 1097 | "chunk total 1071484074\n", 1098 | "chunk total 1072484522\n", 1099 | "chunk total 1073484970\n", 1100 | "chunk total 1074485280\n", 1101 | "chunk total 1075485728\n", 1102 | "chunk total 1076486176\n", 1103 | "chunk total 1077486624\n", 1104 | "chunk total 1078487072\n", 1105 | "chunk total 1079487520\n", 1106 | "chunk total 1080487968\n", 1107 | "chunk total 1081488416\n", 1108 | "chunk total 1082488864\n", 1109 | "chunk total 1083489312\n", 1110 | "chunk total 1084489760\n", 1111 | "chunk total 1085490208\n", 1112 | "chunk total 1086490656\n", 1113 | "chunk total 1087491175\n", 1114 | "chunk total 1088491623\n", 1115 | "chunk total 1089492071\n", 1116 | "chunk total 1090492519\n", 1117 | "chunk total 1091492967\n", 1118 | "chunk total 1092493415\n", 1119 | "chunk total 1093493863\n", 1120 | "chunk total 1094494311\n", 1121 | "chunk total 1095494759\n", 1122 | "chunk total 1096495207\n", 1123 | "chunk total 1097495655\n", 1124 | "chunk total 1098495878\n", 1125 | "chunk total 1099496326\n", 1126 | "chunk total 1100496774\n", 1127 | "chunk total 1101497222\n", 1128 | "chunk total 1102497670\n", 1129 | "chunk total 1103498118\n", 1130 | "chunk total 1104498566\n", 1131 | "chunk total 1105499014\n", 1132 | "chunk total 1106499462\n", 1133 | "chunk total 1107499910\n", 1134 | "chunk total 1108500358\n", 1135 | "chunk total 1109500806\n", 1136 | "chunk total 1110501702\n", 1137 | "chunk total 1111502150\n", 1138 | "chunk total 1112502598\n", 1139 | "chunk total 1113503046\n", 1140 | "chunk total 1114503494\n", 1141 | "chunk total 1115503942\n", 1142 | "chunk total 1116504390\n", 1143 | "chunk total 1117504838\n", 1144 | "chunk total 1118505286\n", 1145 | "chunk total 1119505734\n", 1146 | "chunk total 1120506182\n", 1147 | "chunk total 1121506605\n", 1148 | "chunk total 1122507053\n", 1149 | "chunk total 1123507501\n", 1150 | "chunk total 1124507949\n", 1151 | "chunk total 1125508397\n", 1152 | "chunk total 1126508845\n", 1153 | "chunk total 1127509293\n", 1154 | "chunk total 1128509741\n", 1155 | "chunk total 1129510189\n", 1156 | "chunk total 1130510637\n", 1157 | "chunk total 1131511085\n", 1158 | "chunk total 1132511533\n", 1159 | "chunk total 1133511821\n", 1160 | "chunk total 1134512269\n", 1161 | "chunk total 1135512717\n", 1162 | "chunk total 1136513165\n", 1163 | "chunk total 1137513613\n", 1164 | "chunk total 1138514061\n", 1165 | "chunk total 1139514509\n", 1166 | "chunk total 1140514957\n", 1167 | "chunk total 1141515405\n", 1168 | "chunk total 1142515853\n", 1169 | "chunk total 1143516301\n", 1170 | "chunk total 1144517297\n", 1171 | "chunk total 1145517745\n", 1172 | "chunk total 1146518193\n", 1173 | "chunk total 1147518641\n", 1174 | "chunk total 1148519089\n", 1175 | "chunk total 1149519537\n", 1176 | "chunk total 1150519985\n", 1177 | "chunk total 1151520433\n", 1178 | "chunk total 1152520881\n", 1179 | "chunk total 1153521329\n", 1180 | "chunk total 1154521777\n", 1181 | "chunk total 1155522225\n", 1182 | "chunk total 1156522638\n", 1183 | "chunk total 1157523086\n", 1184 | "chunk total 1158523534\n", 1185 | "chunk total 1159523982\n", 1186 | "chunk total 1160524430\n", 1187 | "chunk total 1161524878\n", 1188 | "chunk total 1162525326\n", 1189 | "chunk total 1163525774\n", 1190 | "chunk total 1164526222\n", 1191 | "chunk total 1165526670\n", 1192 | "chunk total 1166527118\n", 1193 | "chunk total 1167527800\n", 1194 | "chunk total 1168528248\n", 1195 | "chunk total 1169528696\n", 1196 | "chunk total 1170529144\n", 1197 | "chunk total 1171529592\n", 1198 | "chunk total 1172530040\n", 1199 | "chunk total 1173530488\n", 1200 | "chunk total 1174530936\n", 1201 | "chunk total 1175531384\n", 1202 | "chunk total 1176531832\n", 1203 | "chunk total 1177532280\n", 1204 | "chunk total 1178533017\n", 1205 | "chunk total 1179533465\n", 1206 | "chunk total 1180533913\n", 1207 | "chunk total 1181534361\n", 1208 | "chunk total 1182534809\n", 1209 | "chunk total 1183535257\n", 1210 | "chunk total 1184535705\n", 1211 | "chunk total 1185536153\n", 1212 | "chunk total 1186536601\n", 1213 | "chunk total 1187537049\n", 1214 | "chunk total 1188537497\n", 1215 | "chunk total 1189537945\n", 1216 | "chunk total 1190538145\n", 1217 | "chunk total 1191538593\n", 1218 | "chunk total 1192539041\n", 1219 | "chunk total 1193539489\n", 1220 | "chunk total 1194539937\n", 1221 | "chunk total 1195540385\n", 1222 | "chunk total 1196540833\n", 1223 | "chunk total 1197541281\n", 1224 | "chunk total 1198541729\n", 1225 | "chunk total 1199542177\n", 1226 | "chunk total 1200542625\n", 1227 | "chunk total 1201543073\n", 1228 | "chunk total 1202543139\n", 1229 | "chunk total 1203543587\n", 1230 | "chunk total 1204544035\n", 1231 | "chunk total 1205544483\n", 1232 | "chunk total 1206544931\n", 1233 | "chunk total 1207545379\n", 1234 | "chunk total 1208545827\n", 1235 | "chunk total 1209546275\n", 1236 | "chunk total 1210546723\n", 1237 | "chunk total 1211547171\n", 1238 | "chunk total 1212547619\n", 1239 | "chunk total 1213548067\n", 1240 | "chunk total 1214548952\n", 1241 | "chunk total 1215549400\n", 1242 | "chunk total 1216549848\n", 1243 | "chunk total 1217550296\n", 1244 | "chunk total 1218550744\n", 1245 | "chunk total 1219551192\n", 1246 | "chunk total 1220551640\n", 1247 | "chunk total 1221552088\n", 1248 | "chunk total 1222552536\n", 1249 | "chunk total 1223552984\n", 1250 | "chunk total 1224553432\n", 1251 | "chunk total 1225554374\n", 1252 | "chunk total 1226554822\n", 1253 | "chunk total 1227555270\n", 1254 | "chunk total 1228555718\n", 1255 | "chunk total 1229556166\n", 1256 | "chunk total 1230556614\n", 1257 | "chunk total 1231557062\n", 1258 | "chunk total 1232557510\n", 1259 | "chunk total 1233557958\n", 1260 | "chunk total 1234558406\n", 1261 | "chunk total 1235558662\n", 1262 | "chunk total 1236559110\n", 1263 | "chunk total 1237559558\n", 1264 | "chunk total 1238560006\n", 1265 | "chunk total 1239560454\n", 1266 | "chunk total 1240560902\n", 1267 | "chunk total 1241561350\n", 1268 | "chunk total 1242561798\n", 1269 | "chunk total 1243562246\n", 1270 | "chunk total 1244562694\n", 1271 | "chunk total 1245563389\n", 1272 | "chunk total 1246563837\n", 1273 | "chunk total 1247564285\n", 1274 | "chunk total 1248564733\n", 1275 | "chunk total 1249565181\n", 1276 | "chunk total 1250565629\n", 1277 | "chunk total 1251566077\n", 1278 | "chunk total 1252566525\n", 1279 | "chunk total 1253566973\n", 1280 | "chunk total 1254567421\n", 1281 | "chunk total 1255567869\n", 1282 | "chunk total 1256568239\n", 1283 | "chunk total 1257568687\n", 1284 | "chunk total 1258569135\n", 1285 | "chunk total 1259569583\n", 1286 | "chunk total 1260570031\n", 1287 | "chunk total 1261570479\n", 1288 | "chunk total 1262570927\n", 1289 | "chunk total 1263571375\n", 1290 | "chunk total 1264571823\n", 1291 | "chunk total 1265572271\n", 1292 | "chunk total 1266572945\n", 1293 | "chunk total 1267573393\n", 1294 | "chunk total 1268573841\n", 1295 | "chunk total 1269574289\n", 1296 | "chunk total 1270574737\n", 1297 | "chunk total 1271575185\n", 1298 | "chunk total 1272575633\n", 1299 | "chunk total 1273576081\n", 1300 | "chunk total 1274576529\n", 1301 | "chunk total 1275576977\n", 1302 | "chunk total 1276577793\n", 1303 | "chunk total 1277578241\n", 1304 | "chunk total 1278578689\n", 1305 | "chunk total 1279579137\n", 1306 | "chunk total 1280579585\n", 1307 | "chunk total 1281580033\n", 1308 | "chunk total 1282580481\n", 1309 | "chunk total 1283580929\n", 1310 | "chunk total 1284581377\n", 1311 | "chunk total 1285581825\n", 1312 | "chunk total 1286582273\n", 1313 | "chunk total 1287583233\n", 1314 | "chunk total 1288583681\n", 1315 | "chunk total 1289584129\n", 1316 | "chunk total 1290584577\n", 1317 | "chunk total 1291585025\n", 1318 | "chunk total 1292585473\n", 1319 | "chunk total 1293585921\n", 1320 | "chunk total 1294586369\n", 1321 | "chunk total 1295586817\n", 1322 | "chunk total 1296587265\n", 1323 | "chunk total 1297588269\n", 1324 | "chunk total 1298588717\n", 1325 | "chunk total 1299589165\n", 1326 | "chunk total 1300589613\n", 1327 | "chunk total 1301590061\n", 1328 | "chunk total 1302590509\n", 1329 | "chunk total 1303590957\n", 1330 | "chunk total 1304591405\n", 1331 | "chunk total 1305591853\n", 1332 | "chunk total 1306592230\n", 1333 | "chunk total 1307592678\n", 1334 | "chunk total 1308593126\n", 1335 | "chunk total 1309593574\n", 1336 | "chunk total 1310594022\n", 1337 | "chunk total 1311594470\n", 1338 | "chunk total 1312594918\n", 1339 | "chunk total 1313595366\n", 1340 | "chunk total 1314595814\n", 1341 | "chunk total 1315596262\n", 1342 | "chunk total 1316597066\n", 1343 | "chunk total 1317597514\n", 1344 | "chunk total 1318597962\n", 1345 | "chunk total 1319598410\n", 1346 | "chunk total 1320598858\n", 1347 | "chunk total 1321599306\n", 1348 | "chunk total 1322599754\n", 1349 | "chunk total 1323600202\n", 1350 | "chunk total 1324600650\n", 1351 | "chunk total 1325601098\n", 1352 | "chunk total 1326601270\n", 1353 | "chunk total 1327601718\n", 1354 | "chunk total 1328602166\n", 1355 | "chunk total 1329602614\n", 1356 | "chunk total 1330603062\n", 1357 | "chunk total 1331603510\n", 1358 | "chunk total 1332603958\n", 1359 | "chunk total 1333604406\n", 1360 | "chunk total 1334604854\n", 1361 | "chunk total 1335605302\n", 1362 | "chunk total 1336606114\n", 1363 | "chunk total 1337606562\n", 1364 | "chunk total 1338607010\n", 1365 | "chunk total 1339607458\n", 1366 | "chunk total 1340607906\n", 1367 | "chunk total 1341608354\n", 1368 | "chunk total 1342608802\n", 1369 | "chunk total 1343609250\n", 1370 | "chunk total 1344609698\n", 1371 | "chunk total 1345610146\n", 1372 | "chunk total 1346610243\n", 1373 | "chunk total 1347610691\n", 1374 | "chunk total 1348611139\n", 1375 | "chunk total 1349611587\n", 1376 | "chunk total 1350612035\n", 1377 | "chunk total 1351612483\n", 1378 | "chunk total 1352612931\n", 1379 | "chunk total 1353613379\n", 1380 | "chunk total 1354614025\n", 1381 | "chunk total 1355614473\n", 1382 | "chunk total 1356614921\n", 1383 | "chunk total 1357615369\n", 1384 | "chunk total 1358615817\n", 1385 | "chunk total 1359616265\n", 1386 | "chunk total 1360616713\n", 1387 | "chunk total 1361617161\n", 1388 | "chunk total 1362617609\n", 1389 | "chunk total 1363617810\n", 1390 | "chunk total 1364618258\n", 1391 | "chunk total 1365618706\n", 1392 | "chunk total 1366619154\n", 1393 | "chunk total 1367619602\n", 1394 | "chunk total 1368620050\n", 1395 | "chunk total 1369620498\n", 1396 | "chunk total 1370620946\n", 1397 | "chunk total 1371621394\n", 1398 | "chunk total 1372621637\n", 1399 | "chunk total 1373622085\n", 1400 | "chunk total 1374622533\n", 1401 | "chunk total 1375622981\n", 1402 | "chunk total 1376623429\n", 1403 | "chunk total 1377623877\n", 1404 | "chunk total 1378624325\n", 1405 | "chunk total 1379624773\n", 1406 | "chunk total 1380625221\n", 1407 | "chunk total 1381625669\n", 1408 | "chunk total 1382625972\n", 1409 | "chunk total 1383626420\n", 1410 | "chunk total 1384626868\n", 1411 | "chunk total 1385627316\n", 1412 | "chunk total 1386627764\n", 1413 | "chunk total 1387628212\n", 1414 | "chunk total 1388628660\n", 1415 | "chunk total 1389629108\n", 1416 | "chunk total 1390629556\n", 1417 | "chunk total 1391630199\n", 1418 | "chunk total 1392630647\n", 1419 | "chunk total 1393631095\n", 1420 | "chunk total 1394631543\n", 1421 | "chunk total 1395631991\n", 1422 | "chunk total 1396632439\n", 1423 | "chunk total 1397632887\n", 1424 | "chunk total 1398633335\n", 1425 | "chunk total 1399633783\n", 1426 | "chunk total 1400634667\n", 1427 | "chunk total 1401635115\n", 1428 | "chunk total 1402635563\n", 1429 | "chunk total 1403636011\n", 1430 | "chunk total 1404636459\n", 1431 | "chunk total 1405636907\n", 1432 | "chunk total 1406637355\n", 1433 | "chunk total 1407637803\n", 1434 | "chunk total 1408638251\n", 1435 | "chunk total 1409638253\n", 1436 | "chunk total 1410638701\n", 1437 | "chunk total 1411639149\n", 1438 | "chunk total 1412639597\n", 1439 | "chunk total 1413640045\n", 1440 | "chunk total 1414640493\n", 1441 | "chunk total 1415640941\n", 1442 | "chunk total 1416641389\n", 1443 | "chunk total 1417641837\n", 1444 | "chunk total 1418642329\n", 1445 | "chunk total 1419642777\n", 1446 | "chunk total 1420643225\n", 1447 | "chunk total 1421643673\n", 1448 | "chunk total 1422644121\n", 1449 | "chunk total 1423644569\n", 1450 | "chunk total 1424645017\n", 1451 | "chunk total 1425645465\n", 1452 | "chunk total 1426645913\n", 1453 | "chunk total 1427646721\n", 1454 | "chunk total 1428647169\n", 1455 | "chunk total 1429647617\n", 1456 | "chunk total 1430648065\n", 1457 | "chunk total 1431648513\n", 1458 | "chunk total 1432648961\n", 1459 | "chunk total 1433649409\n", 1460 | "chunk total 1434649857\n", 1461 | "chunk total 1435650305\n", 1462 | "chunk total 1436651180\n", 1463 | "chunk total 1437651628\n", 1464 | "chunk total 1438652076\n", 1465 | "chunk total 1439652524\n", 1466 | "chunk total 1440652972\n", 1467 | "chunk total 1441653420\n", 1468 | "chunk total 1442653868\n", 1469 | "chunk total 1443654316\n", 1470 | "chunk total 1444654764\n", 1471 | "chunk total 1445655212\n", 1472 | "chunk total 1446655531\n", 1473 | "chunk total 1447655979\n", 1474 | "chunk total 1448656427\n", 1475 | "chunk total 1449656875\n", 1476 | "chunk total 1450657323\n", 1477 | "chunk total 1451657771\n", 1478 | "chunk total 1452658219\n", 1479 | "chunk total 1453658667\n", 1480 | "chunk total 1454658706\n", 1481 | "chunk total 1455659154\n", 1482 | "chunk total 1456659602\n", 1483 | "chunk total 1457660050\n", 1484 | "chunk total 1458660498\n", 1485 | "chunk total 1459660946\n", 1486 | "chunk total 1460661394\n", 1487 | "chunk total 1461661842\n", 1488 | "chunk total 1462662054\n", 1489 | "chunk total 1463662502\n", 1490 | "chunk total 1464662950\n", 1491 | "chunk total 1465663398\n", 1492 | "chunk total 1466663846\n", 1493 | "chunk total 1467664294\n", 1494 | "chunk total 1468664742\n", 1495 | "chunk total 1469665190\n", 1496 | "chunk total 1470665812\n", 1497 | "chunk total 1471666260\n", 1498 | "chunk total 1472666708\n", 1499 | "chunk total 1473667156\n", 1500 | "chunk total 1474667604\n", 1501 | "chunk total 1475668052\n", 1502 | "chunk total 1476668500\n", 1503 | "chunk total 1477668948\n", 1504 | "chunk total 1478669081\n", 1505 | "chunk total 1479669529\n", 1506 | "chunk total 1480669977\n", 1507 | "chunk total 1481670425\n", 1508 | "chunk total 1482670873\n", 1509 | "chunk total 1483671321\n", 1510 | "chunk total 1484671769\n", 1511 | "chunk total 1485672217\n", 1512 | "chunk total 1486672665\n", 1513 | "chunk total 1487673482\n", 1514 | "chunk total 1488673930\n", 1515 | "chunk total 1489674378\n", 1516 | "chunk total 1490674826\n", 1517 | "chunk total 1491675274\n", 1518 | "chunk total 1492675722\n", 1519 | "chunk total 1493676170\n", 1520 | "chunk total 1494676618\n", 1521 | "chunk total 1495677334\n", 1522 | "chunk total 1496677782\n", 1523 | "chunk total 1497678230\n", 1524 | "chunk total 1498678678\n", 1525 | "chunk total 1499679126\n", 1526 | "chunk total 1500679574\n", 1527 | "chunk total 1501680022\n", 1528 | "chunk total 1502680470\n", 1529 | "chunk total 1503680581\n", 1530 | "chunk total 1504681029\n", 1531 | "chunk total 1505681477\n", 1532 | "chunk total 1506681925\n", 1533 | "chunk total 1507682373\n", 1534 | "chunk total 1508682821\n", 1535 | "chunk total 1509683269\n", 1536 | "chunk total 1510683717\n", 1537 | "chunk total 1511684245\n", 1538 | "chunk total 1512684693\n", 1539 | "chunk total 1513685141\n", 1540 | "chunk total 1514685589\n", 1541 | "chunk total 1515686037\n", 1542 | "chunk total 1516686485\n", 1543 | "chunk total 1517686933\n", 1544 | "chunk total 1518687236\n", 1545 | "chunk total 1519687684\n", 1546 | "chunk total 1520688132\n", 1547 | "chunk total 1521688580\n", 1548 | "chunk total 1522689028\n", 1549 | "chunk total 1523689476\n", 1550 | "chunk total 1524689924\n", 1551 | "chunk total 1525690372\n", 1552 | "chunk total 1526690789\n", 1553 | "chunk total 1527691237\n", 1554 | "chunk total 1528691685\n", 1555 | "chunk total 1529692133\n", 1556 | "chunk total 1530692581\n", 1557 | "chunk total 1531693029\n", 1558 | "chunk total 1532693477\n", 1559 | "chunk total 1533693848\n", 1560 | "chunk total 1534694296\n", 1561 | "chunk total 1535694744\n", 1562 | "chunk total 1536695192\n", 1563 | "chunk total 1537695640\n", 1564 | "chunk total 1538696088\n", 1565 | "chunk total 1539696536\n", 1566 | "chunk total 1540696984\n", 1567 | "chunk total 1541697381\n", 1568 | "chunk total 1542697829\n", 1569 | "chunk total 1543698277\n", 1570 | "chunk total 1544698725\n", 1571 | "chunk total 1545699173\n", 1572 | "chunk total 1546699621\n", 1573 | "chunk total 1547700069\n", 1574 | "chunk total 1547741381\n" 1575 | ] 1576 | } 1577 | ], 1578 | "source": [ 1579 | "nyc = ds.dataset(\"nyc-taxi/\", partitioning=[\"year\", \"month\"])\n", 1580 | "\n", 1581 | "# Get database connection\n", 1582 | "con = duckdb.connect()\n", 1583 | "\n", 1584 | "# Run query that selects part of the data\n", 1585 | "query = con.execute(\n", 1586 | " \"SELECT total_amount FROM nyc\"\n", 1587 | ")\n", 1588 | "\n", 1589 | "# Create Record Batch Reader from Query Result.\n", 1590 | "# \"fetch_record_batch()\" also accepts an extra parameter related to the desired produced chunk size.\n", 1591 | "record_batch_reader = query.fetch_record_batch()\n", 1592 | "\n", 1593 | "# Retrieve all batch chunks\n", 1594 | "total_rows = 0\n", 1595 | "while True:\n", 1596 | " print('chunk total', total_rows)\n", 1597 | " try:\n", 1598 | " # Process a single chunk here\n", 1599 | " # pyarrow.lib.RecordBatch\n", 1600 | " chunk = record_batch_reader.read_next_batch()\n", 1601 | " total_rows += len(chunk)\n", 1602 | " except StopIteration:\n", 1603 | " break" 1604 | ] 1605 | } 1606 | ], 1607 | "metadata": { 1608 | "interpreter": { 1609 | "hash": "5cce4339234dc84068df7ee439717747529a76a445a8b3e1bf5cb48e928293c5" 1610 | }, 1611 | "kernelspec": { 1612 | "display_name": "Python 3.9.10 ('py39')", 1613 | "language": "python", 1614 | "name": "python3" 1615 | }, 1616 | "language_info": { 1617 | "codemirror_mode": { 1618 | "name": "ipython", 1619 | "version": 3 1620 | }, 1621 | "file_extension": ".py", 1622 | "mimetype": "text/x-python", 1623 | "name": "python", 1624 | "nbconvert_exporter": "python", 1625 | "pygments_lexer": "ipython3", 1626 | "version": "3.9.10" 1627 | }, 1628 | "orig_nbformat": 4 1629 | }, 1630 | "nbformat": 4, 1631 | "nbformat_minor": 2 1632 | } 1633 | --------------------------------------------------------------------------------