import pandas as pd def get_cluster_centers(con, features_column: str, cluster_column: str) -> pd.DataFrame: """ Funkcja zwraca pandas DataFrame z kolumnami cluster_column i "centroid" zawierającą pary (cluster_id, list of float). """ # Kwerenda wykonuje następujące kroki: # 1. UNNEST z WITH ORDINALITY rozbija listę na poszczególne wartości (val) i ich indeksy (idx) # 2. Grupuje po klastrze i indeksie wymiaru, licząc średnią (AVG) # 3. Składa średnie z powrotem w listę (LIST) zachowując kolejność wymiarów (ORDER BY idx) query = f""" WITH exploded AS ( SELECT "{cluster_column}", UNNEST({features_column}) as val, GENERATE_SUBSCRIPTS({features_column}, 1) as idx FROM wikipedia_corpus ), averages AS ( SELECT "{cluster_column}", idx, AVG(val) as avg_val FROM exploded GROUP BY "{cluster_column}", idx ) SELECT "{cluster_column}", LIST(avg_val ORDER BY idx) as centroid FROM averages GROUP BY "{cluster_column}" ORDER BY "{cluster_column}" """ return con.execute(query).df()