import%20marimo%0A%0A__generated_with%20%3D%20%220.9.19%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20sklearn.datasets%20import%20load_digits%0A%20%20%20%20from%20sklearn.model_selection%20import%20train_test_split%0A%20%20%20%20from%20sklearn.preprocessing%20import%20StandardScaler%0A%20%20%20%20from%20sklearn.preprocessing%20import%20RobustScaler%0A%20%20%20%20from%20sklearn.preprocessing%20import%20FunctionTransformer%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20seaborn%20as%20sns%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20hdbscan%0A%20%20%20%20from%20sklearn.decomposition%20import%20PCA%0A%20%20%20%20import%20altair%20as%20alt%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20FunctionTransformer%2C%0A%20%20%20%20%20%20%20%20PCA%2C%0A%20%20%20%20%20%20%20%20RobustScaler%2C%0A%20%20%20%20%20%20%20%20StandardScaler%2C%0A%20%20%20%20%20%20%20%20alt%2C%0A%20%20%20%20%20%20%20%20hdbscan%2C%0A%20%20%20%20%20%20%20%20load_digits%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20pd%2C%0A%20%20%20%20%20%20%20%20plt%2C%0A%20%20%20%20%20%20%20%20sns%2C%0A%20%20%20%20%20%20%20%20train_test_split%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20__(sns)%3A%0A%20%20%20%20sns.set(style%3D'white'%2C%20context%3D'notebook'%2C%20rc%3D%7B'figure.figsize'%3A(14%2C10)%7D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(pd)%3A%0A%20%20%20%20nba%20%3D%20pd.read_csv(%22%2FUsers%2Fjacobmatson%2FDownloads%2FFantrax-Players-Fantasy%20Baller%20Association%20(6).csv%22)%0A%20%20%20%20nba.head()%0A%20%20%20%20return%20(nba%2C)%0A%0A%0A%40app.cell%0Adef%20__(nba)%3A%0A%20%20%20%20nba.Team.value_counts()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(nba)%3A%0A%20%20%20%20nba.Position.value_counts()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(nba%2C%20sns)%3A%0A%20%20%20%20sns.pairplot(nba.drop(%5B%22Team%22%2C%22ID%22%2C%22Player%22%5D%2Caxis%3D1)%2C%20hue%3D'Position')%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20import%20umap%0A%20%20%20%20return%20(umap%2C)%0A%0A%0A%40app.cell%0Adef%20__(umap)%3A%0A%20%20%20%20reducer%20%3D%20umap.UMAP()%0A%20%20%20%20return%20(reducer%2C)%0A%0A%0A%40app.cell%0Adef%20__(nba)%3A%0A%20%20%20%20nba_data%20%3D%20nba%5B%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22FG%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22FT%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%223PTM%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22PTS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ST%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22AST%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22BLK%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22REB%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22TO%22%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%5D.values%0A%0A%20%20%20%20%23%20transformer%20%3D%20FunctionTransformer(np.log1p)%20%20%23%20log(1%20%2B%20x)%20to%20handle%20zeros%0A%20%20%20%20%23%20data_transformed%20%3D%20transformer.fit_transform(nba_data)%0A%20%20%20%20%23%20scaled_nba_data%20%3D%20StandardScaler().fit_transform(data_transformed)%0A%0A%20%20%20%20%23%20scaled_nba_data%20%3D%20StandardScaler().fit_transform(nba_data)%0A%20%20%20%20%23%20scaled_nba_data%20%3D%20RobustScaler().fit_transform(nba_data)%0A%20%20%20%20scaled_nba_data%20%3D%20nba_data%0A%20%20%20%20return%20nba_data%2C%20scaled_nba_data%0A%0A%0A%40app.cell%0Adef%20__(reducer%2C%20scaled_nba_data)%3A%0A%20%20%20%20embedding%20%3D%20reducer.fit_transform(scaled_nba_data)%0A%20%20%20%20embedding.shape%0A%20%20%20%20return%20(embedding%2C)%0A%0A%0A%40app.cell%0Adef%20__(embedding%2C%20nba%2C%20plt%2C%20sns)%3A%0A%20%20%20%20%23%20Define%20the%20position%20mapping%20to%20integers%0A%20%20%20%20position_mapping%20%3D%20%7B%0A%20%20%20%20%22PG%22%3A%200%2C%0A%20%20%20%20%22PG%2CSG%22%3A%201%2C%0A%20%20%20%20%22PG%2CSG%2CSF%22%3A%202%2C%0A%20%20%20%20%22SG%22%3A%202%2C%0A%20%20%20%20%22SG%2CSF%22%3A%203%2C%0A%20%20%20%20%22SF%22%3A%204%2C%0A%20%20%20%20%22SG%2CSF%2CPF%22%3A%204%2C%0A%20%20%20%20%22SF%2CPF%22%3A%205%2C%0A%20%20%20%20%22SG%2CSF%2CPF%2CC%22%3A%205%2C%0A%20%20%20%20%22PF%22%3A%206%2C%0A%20%20%20%20%22SF%2CPF%2CC%22%3A%206%2C%0A%20%20%20%20%22PF%2CC%22%3A%207%2C%0A%20%20%20%20%22C%22%3A%208%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20%23%20Map%20positions%20in%20the%20dataframe%0A%20%20%20%20mapped_positions%20%3D%20nba.Position.map(position_mapping).fillna(-1).astype(int)%0A%0A%20%20%20%20%23%20Create%20a%20color%20palette%0A%20%20%20%20num_colors%20%3D%20len(position_mapping)%20%2B%201%20%20%23%20Add%201%20for%20unmatched%20(-1)%0A%20%20%20%20palette%20%3D%20sns.color_palette(%22hsv%22%2C%20num_colors)%0A%0A%20%20%20%20%23%20Create%20the%20scatter%20plot%0A%20%20%20%20plt.scatter(%0A%20%20%20%20%20%20%20%20embedding%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20embedding%5B%3A%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20c%3D%5Bpalette%5Bx%5D%20for%20x%20in%20mapped_positions%5D%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Create%20legend%20handles%0A%20%20%20%20handles%20%3D%20%5B%0A%20%20%20%20%20%20%20%20plt.Line2D(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B0%5D%2C%20%5B0%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker%3D%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22w%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20markerfacecolor%3Dpalette%5Bi%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20markersize%3D10%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20label%3Dposition%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20for%20position%2C%20i%20in%20position_mapping.items()%0A%20%20%20%20%5D%0A%20%20%20%20handles.append(%0A%20%20%20%20%20%20%20%20plt.Line2D(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B0%5D%2C%20%5B0%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20marker%3D%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22w%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20markerfacecolor%3Dpalette%5B-1%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20markersize%3D10%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Unmatched%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Add%20the%20legend%20on%20the%20left-hand%20side%0A%20%20%20%20plt.legend(%0A%20%20%20%20%20%20%20%20handles%3Dhandles%2C%0A%20%20%20%20%20%20%20%20title%3D%22Position%22%2C%0A%20%20%20%20%20%20%20%20loc%3D%22center%20left%22%2C%0A%20%20%20%20%20%20%20%20bbox_to_anchor%3D(-0.2%2C%200.5)%2C%20%20%23%20Position%20legend%20on%20the%20left%20side%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Set%20plot%20properties%0A%20%20%20%20plt.gca().set_aspect(%22equal%22%2C%20%22datalim%22)%0A%20%20%20%20plt.title(%22UMAP%20projection%20of%20the%20NBA%20dataset%22%2C%20fontsize%3D24)%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20handles%2C%20mapped_positions%2C%20num_colors%2C%20palette%2C%20position_mapping%0A%0A%0A%40app.cell%0Adef%20__(PCA%2C%20hdbscan%2C%20np)%3A%0A%20%20%20%20def%20cluster_points(np_array%2C%20min_cluster_size%3D5%2C%20max_cluster_size%3D100)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20Cluster%20the%20embeddings%20using%20HDBSCAN%20algorithm.%0A%20%20%20%20%20%20%20%20We%20reduce%20the%20dimensionality%20of%20the%20embeddings%20to%2050D%0A%20%20%20%20%20%20%20%20in%20order%20to%20speed%20up%20the%20clustering%20process.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%0A%20%20%20%20%20%20%20%20pca%20%3D%20PCA(n_components%3D9)%0A%20%20%20%20%20%20%20%20np_array%20%3D%20pca.fit_transform(np_array)%0A%0A%20%20%20%20%20%20%20%20hdb%20%3D%20hdbscan.HDBSCAN(%0A%20%20%20%20%20%20%20%20%20%20%20%20min_samples%3D3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20min_cluster_size%3Dmin_cluster_size%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_cluster_size%3Dmax_cluster_size%2C%0A%20%20%20%20%20%20%20%20).fit(np_array)%0A%0A%20%20%20%20%20%20%20%20%23%20Get%20cluster%20labels%20and%20map%20to%20strings%0A%20%20%20%20%20%20%20%20labels%20%3D%20hdb.labels_%0A%20%20%20%20%20%20%20%20cluster_labels%20%3D%20np.array(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22cluster_%7Blabel%7D%22%20if%20label%20!%3D%20-1%20else%20%22outlier%22%20for%20label%20in%20labels%0A%20%20%20%20%20%20%20%20%5D%2C%20dtype%3Dobject)%20%20%23%20Ensure%20output%20is%20of%20type%20'object'%20for%20mixed%20strings%0A%0A%20%20%20%20%20%20%20%20return%20cluster_labels%0A%20%20%20%20return%20(cluster_points%2C)%0A%0A%0A%40app.cell%0Adef%20__(cluster_points%2C%20scaled_nba_data)%3A%0A%20%20%20%20nba_cl_labels%20%3D%20cluster_points(scaled_nba_data)%0A%20%20%20%20print(nba_cl_labels)%0A%20%20%20%20return%20(nba_cl_labels%2C)%0A%0A%0A%40app.cell%0Adef%20__(scaled_nba_data%2C%20umap)%3A%0A%20%20%20%20def%20umap_reduce(np_array)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20Reduce%20the%20dimensionality%20of%20the%20embeddings%20to%202D%20using%0A%20%20%20%20%20%20%20%20UMAP%20algorithm%0A%20%20%20%20%20%20%20%20%22%22%22%0A%0A%20%20%20%20%20%20%20%20reducer%20%3D%20umap.UMAP()%0A%0A%20%20%20%20%20%20%20%20%23%20reducer%20%3D%20umap.UMAP(%0A%20%20%20%20%20%20%20%20%23%20%20%20%20%20n_components%3D2%2C%0A%20%20%20%20%20%20%20%20%23%20%20%20%20%20metric%3D%22cosine%22%2C%0A%20%20%20%20%20%20%20%20%23%20%20%20%20%20n_neighbors%3D80%2C%0A%20%20%20%20%20%20%20%20%23%20%20%20%20%20min_dist%3D0.1%2C%0A%20%20%20%20%20%20%20%20%23%20)%0A%20%20%20%20%20%20%20%20return%20reducer.fit_transform(np_array)%0A%0A%20%20%20%20nba_two_d%20%3D%20umap_reduce(scaled_nba_data)%0A%20%20%20%20nba_two_d.shape%0A%20%20%20%20print(nba_two_d)%0A%20%20%20%20return%20nba_two_d%2C%20umap_reduce%0A%0A%0A%40app.cell%0Adef%20__(alt%2C%20mo%2C%20nba%2C%20nba_cl_labels%2C%20nba_two_d%2C%20pd)%3A%0A%20%20%20%20_data%20%3D%20nba%0A%0A%20%20%20%20new_columns%20%3D%20pd.DataFrame(%7B%0A%20%20%20%20%20%20%20%20'stats_2d_1'%3A%20nba_two_d%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20'stats_2d_2'%3A%20nba_two_d%5B%3A%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20'cluster'%3A%20nba_cl_labels%20%7D%20)%0A%0A%20%20%20%20_data%20%3D%20pd.concat(%5B_data%2C%20new_columns%5D%2C%20axis%3D1)%0A%20%20%20%20%23%20_data%20%3D%20_data.with_columns(%0A%20%20%20%20%23%20%20%20%20%20text_embedding_2d_1%3Dnba_two_d%5B%3A%2C%200%5D%2C%0A%20%20%20%20%23%20%20%20%20%20text_embedding_2d_2%3Dnba_two_d%5B%3A%2C%201%5D%2C%0A%20%20%20%20%23%20%20%20%20%20cluster%3Dnba_cl_labels%2C%0A%20%20%20%20%23%20)%0A%20%20%20%20%23_data%20%3D%20_data.drop(%5B%22text_embedding%22%5D)%0A%20%20%20%20_num_outliers%20%3D%20nba_cl_labels.tolist().count(%22outlier%22)%0A%0A%20%20%20%20_data%20%3D%20_data%5B_data%5B%22cluster%22%5D%20!%3D%20%22outlier%22%5D%0A%0A%20%20%20%20chart%20%3D%20mo.ui.altair_chart(%0A%20%20%20%20%20%20%20%20alt.Chart(_data)%0A%20%20%20%20%20%20%20%20.mark_point()%0A%20%20%20%20%20%20%20%20.encode(%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3Dalt.X(%22stats_2d_1%22).scale(zero%3DFalse)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3Dalt.Y(%22stats_2d_2%22).scale(zero%3DFalse)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22cluster%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20tooltip%3D%5B%22Player%22%2C%22PTS%22%2C%22REB%22%2C%22AST%22%2C%22ST%22%2C%22BLK%22%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.properties(%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3Df%22NBA%20clusters%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20chart%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22There%20are%20%7Blen(_data)%7D%20points%20in%20total%20and%20%7B_num_outliers%7D%20outliers.%20You%20can%20select%20points%20on%20the%20chart%20to%20see%20them%20in%20a%20table%20below.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20chart%2C%20new_columns%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
44a57dbce5a926f4f13fcd48d2865cdcf63ba4bd75ac26d6012f63bebfd94ea2