# Get set up, but we'll start on the board today
import polars as pl
import scipy as sp
import numpy as np
# change penguins to carnivora
url = "https://roualdes.sfo3.digitaloceanspaces.com/data/carnivora.csv"
df = pl.read_csv(url, null_values = ["NA"]).select("SuperFamily", "BW").drop_nulls()
x1 = df.select(pl.col("SuperFamily") == "Feliformia").cast(pl.Float64).to_numpy()
X = np.c_[np.ones_like(df[:, 1]), x1]
def ll_lm(theta, data):
    X = data["X"]
    y = data["y"]
    N = np.size(y)
    lm = np.zeros_like(y)
    for n in range(N):
        lm[n] = np.sum(X[n] * theta)
    d = y - lm
    return np.sum(d * d)
init = sp.stats.norm().rvs(size = 2)
d = {"X": X, "y": df["BW"].to_numpy()}
o = sp.optimize.minimize(ll_lm, init, args = (d,), method = "L-BFGS-B")
np.sum(o["x"])
np.float64(351.7162524773699)
(df
 .group_by("SuperFamily")
 .agg(pl.col("BW").mean().alias("mean BW"))
)
shape: (2, 2)
SuperFamily mean BW
str f64
"Caniformia" 164.970882
"Feliformia" 351.714286