Testing in soon-to-be-past.
Some Python code:
import ibis
import ibis.selectors as s
import plotly.io as pio
import plotly.express as px
# configuration
pio.templates.default = "plotly_dark"
ibis.options.interactive = True
t = ibis.examples.penguins.fetch()
t
┏━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┓
┃ species ┃ island ┃ bill_length_mm ┃ bill_depth_mm ┃ flipper_length_mm ┃ body_mass_g ┃ sex ┃ year ┃
┡━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━┩
│ string │ string │ float64 │ float64 │ int64 │ int64 │ string │ int64 │
├─────────┼───────────┼────────────────┼───────────────┼───────────────────┼─────────────┼────────┼───────┤
│ Adelie │ Torgersen │ 39.1 │ 18.7 │ 181 │ 3750 │ male │ 2007 │
│ Adelie │ Torgersen │ 39.5 │ 17.4 │ 186 │ 3800 │ female │ 2007 │
│ Adelie │ Torgersen │ 40.3 │ 18.0 │ 195 │ 3250 │ female │ 2007 │
│ Adelie │ Torgersen │ nan │ nan │ NULL │ NULL │ NULL │ 2007 │
│ Adelie │ Torgersen │ 36.7 │ 19.3 │ 193 │ 3450 │ female │ 2007 │
│ Adelie │ Torgersen │ 39.3 │ 20.6 │ 190 │ 3650 │ male │ 2007 │
│ Adelie │ Torgersen │ 38.9 │ 17.8 │ 181 │ 3625 │ female │ 2007 │
│ Adelie │ Torgersen │ 39.2 │ 19.6 │ 195 │ 4675 │ male │ 2007 │
│ Adelie │ Torgersen │ 34.1 │ 18.1 │ 193 │ 3475 │ NULL │ 2007 │
│ Adelie │ Torgersen │ 42.0 │ 20.2 │ 190 │ 4250 │ NULL │ 2007 │
│ … │ … │ … │ … │ … │ … │ … │ … │
└─────────┴───────────┴────────────────┴───────────────┴───────────────────┴─────────────┴────────┴───────┘
t.group_by("species" ).agg(ibis._.count().name("count" ))
┏━━━━━━━━━━━┳━━━━━━━┓
┃ species ┃ count ┃
┡━━━━━━━━━━━╇━━━━━━━┩
│ string │ int64 │
├───────────┼───────┤
│ Adelie │ 152 │
│ Gentoo │ 124 │
│ Chinstrap │ 68 │
└───────────┴───────┘
┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ species ┃ Count(species) ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ string │ int64 │
├───────────┼────────────────┤
│ Adelie │ 152 │
│ Gentoo │ 124 │
│ Chinstrap │ 68 │
└───────────┴────────────────┘
px.scatter(t, title= "penguins" , x= "bill_length_mm" , y= "bill_depth_mm" , color= "species" )
def transform(t):
# compute the z score
t = t.mutate(
s.across(s.numeric(), {"zscore" : lambda x: (x - x.mean()) / x.std()})
).dropna() # drop rows with missing values
return t
f = transform(t)
f
┏━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┓
┃ species ┃ island ┃ bill_length_mm ┃ bill_depth_mm ┃ flipper_length_mm ┃ body_mass_g ┃ sex ┃ year ┃ bill_length_mm_zscore ┃ bill_depth_mm_zscore ┃ flipper_length_mm_zscore ┃ body_mass_g_zscore ┃ year_zscore ┃
┡━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━┩
│ string │ string │ float64 │ float64 │ int64 │ int64 │ string │ int64 │ float64 │ float64 │ float64 │ float64 │ float64 │
├─────────┼───────────┼────────────────┼───────────────┼───────────────────┼─────────────┼────────┼───────┼───────────────────────┼──────────────────────┼──────────────────────────┼────────────────────┼─────────────┤
│ Adelie │ Torgersen │ 39.1 │ 18.7 │ 181 │ 3750 │ male │ 2007 │ -0.883137 │ 0.784218 │ -1.416243 │ -0.563316 │ -1.258032 │
│ Adelie │ Torgersen │ 39.5 │ 17.4 │ 186 │ 3800 │ female │ 2007 │ -0.809877 │ 0.125990 │ -1.060674 │ -0.500969 │ -1.258032 │
│ Adelie │ Torgersen │ 40.3 │ 18.0 │ 195 │ 3250 │ female │ 2007 │ -0.663357 │ 0.429788 │ -0.420652 │ -1.186793 │ -1.258032 │
│ Adelie │ Torgersen │ 36.7 │ 19.3 │ 193 │ 3450 │ female │ 2007 │ -1.322698 │ 1.088015 │ -0.562879 │ -0.937402 │ -1.258032 │
│ Adelie │ Torgersen │ 39.3 │ 20.6 │ 190 │ 3650 │ male │ 2007 │ -0.846507 │ 1.746243 │ -0.776220 │ -0.688012 │ -1.258032 │
│ Adelie │ Torgersen │ 38.9 │ 17.8 │ 181 │ 3625 │ female │ 2007 │ -0.919767 │ 0.328522 │ -1.416243 │ -0.719185 │ -1.258032 │
│ Adelie │ Torgersen │ 39.2 │ 19.6 │ 195 │ 4675 │ male │ 2007 │ -0.864822 │ 1.239914 │ -0.420652 │ 0.590115 │ -1.258032 │
│ Adelie │ Torgersen │ 41.1 │ 17.6 │ 182 │ 3200 │ female │ 2007 │ -0.516837 │ 0.227256 │ -1.345129 │ -1.249140 │ -1.258032 │
│ Adelie │ Torgersen │ 38.6 │ 21.2 │ 191 │ 3800 │ male │ 2007 │ -0.974712 │ 2.050041 │ -0.705106 │ -0.500969 │ -1.258032 │
│ Adelie │ Torgersen │ 34.6 │ 21.1 │ 198 │ 4400 │ male │ 2007 │ -1.707313 │ 1.999408 │ -0.207311 │ 0.247203 │ -1.258032 │
│ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │ … │
└─────────┴───────────┴────────────────┴───────────────┴───────────────────┴─────────────┴────────┴───────┴───────────────────────┴──────────────────────┴──────────────────────────┴────────────────────┴─────────────┘
from sklearn.decomposition import PCA
# select "features" as X
X = f.select(s.contains("zscore" ))
# get the the first 2 principal components to visualize
n_components = 3
pca = PCA(n_components= n_components).fit(X)
# transform the table to get the principal components
t_pca = ibis.memtable(pca.transform(X)).relabel({"col0" : "pc1" , "col1" : "pc2" , "col2" : "pc3" })
# join the original table with the PCA table, assuming the order is the same
f = f.mutate(row_number= ibis.row_number().over()).join(
t_pca.mutate(row_number= ibis.row_number().over()), "row_number"
)
# plot the first 3 principal components
px.scatter_3d(f, title= "penguins PCA" , x= "pc1" , y= "pc2" , z= "pc3" , color= "species" )
graph TD
%% Extraction
JSON -->|Extract| CLOUDSTORAGE
PARQUET -->|Extract| CLOUDSTORAGE
DELTASRC -->|Extract| CLOUDSTORAGE
%% Transformation
CLOUDSTORAGE -->|Transform| DUCKDB
CLOUDSTORAGE -->|Transform| POLARS
%% Load
DUCKDB -->|Load| DELTADST
DUCKDB -->|Load| DBOUTPUT
POLARS -->|Load| DELTADST
POLARS -->|Load| DBOUTPUT
classDef dataFormat fill:#f9d,stroke:#333,stroke-width:2px;
classDef storage fill:#9df,stroke:#333,stroke-width:2px;
classDef processing fill:#fd9,stroke:#333,stroke-width:2px;
classDef output fill:#d9f,stroke:#333,stroke-width:2px;
class JSON,PARQUET,DELTASRC dataFormat;
class CLOUDSTORAGE storage;
class DUCKDB,POLARS processing;
class DELTADST,DBOUTPUT output;
Back to top