import%20marimo%0A%0A__generated_with%20%3D%20%220.12.0%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%0A%20%20%20%20%23%20import%20kagglehub%0A%0A%20%20%20%20%23%20Download%20latest%20version%0A%20%20%20%20%23%20path%20%3D%20kagglehub.dataset_download(%22madhavanbs%2Fcheese-dataset%22)%0A%0A%20%20%20%20%23%20print(%22Path%20to%20dataset%20files%3A%22%2C%20path)%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20Install%20dependencies%20as%20needed%3A%0A%20%20%20%20%23%20pip%20install%20kagglehub%5Bpandas-datasets%5D%0A%20%20%20%20import%20kagglehub%0A%20%20%20%20from%20kagglehub%20import%20KaggleDatasetAdapter%0A%0A%20%20%20%20%23%20Set%20the%20path%20to%20the%20file%20you'd%20like%20to%20load%0A%20%20%20%20file_path%20%3D%20%22cheeses.csv%22%0A%0A%20%20%20%20%23%20Load%20the%20latest%20version%0A%20%20%20%20df%20%3D%20kagglehub.load_dataset(%0A%20%20%20%20%20%20KaggleDatasetAdapter.PANDAS%2C%0A%20%20%20%20%20%20%22joebeachcapital%2Fcheese%22%2C%0A%20%20%20%20%20%20file_path%2C%0A%20%20%20%20%20%20%23%20Provide%20any%20additional%20arguments%20like%20%0A%20%20%20%20%20%20%23%20sql_query%20or%20pandas_kwargs.%20See%20the%20%0A%20%20%20%20%20%20%23%20documenation%20for%20more%20information%3A%0A%20%20%20%20%20%20%23%20https%3A%2F%2Fgithub.com%2FKaggle%2Fkagglehub%2Fblob%2Fmain%2FREADME.md%23kaggledatasetadapterpandas%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22First%205%20records%3A%22%2C%20df.head())%0A%20%20%20%20return%20KaggleDatasetAdapter%2C%20df%2C%20file_path%2C%20kagglehub%0A%0A%0A%40app.cell%0Adef%20_(df)%3A%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20webcolors%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%0A%20%20%20%20def%20color_to_hex(color)%3A%0A%20%20%20%20%20%20%20%20%23%20Handle%20NaN%20or%20non-string%20values%0A%20%20%20%20%20%20%20%20if%20pd.isna(color)%20or%20not%20isinstance(color%2C%20str)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20'%23ccc'%20%20%23%20Default%20color%20for%20NaN%20or%20invalid%20values%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%23%20Custom%20mapping%20for%20non-standard%20colors%0A%20%20%20%20%20%20%20%20custom_colors%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20'pale%20yellow'%3A%20'%23FFFF99'%2C%20%20%23%20Pale%20yellow%20is%20mapped%20to%20a%20light%20yellow%20hex%0A%20%20%20%20%20%20%20%20%20%20%20%20'blue-grey'%3A%20'%23607d8b'%2C%20%20%20%20%20%23%20Example%20for%20blue-grey%0A%20%20%20%20%20%20%20%20%20%20%20%20'pink%20and%20white'%3A%20'%23f8c8c8'%2C%20%23%20Example%20for%20pink%20and%20white%0A%20%20%20%20%20%20%20%20%20%20%20%20'brownish%20yellow'%3A%20'%23b29758'%2C%20%23%20Example%20for%20brownish%20yellow%0A%20%20%20%20%20%20%20%20%20%20%20%20'golden%20orange'%3A%20'%23ff9900'%2C%20%20%23%20Example%20for%20golden%20orange%0A%20%20%20%20%20%20%20%20%20%20%20%20'orange'%3A%20'%23ffbb00'%2C%20%20%23%20Example%20for%20golden%20orange%0A%20%20%20%20%20%20%20%20%20%20%20%20'straw'%3A%20'%23E4D00A'%2C%20%20%20%20%20%20%20%20%20%20%23%20Custom%20mapping%20for%20straw%20color%20(yellowish)%0A%20%20%20%20%20%20%20%20%20%20%20%20'white'%3A%20'%23fff'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20'cream'%3A%20'%23FFF5C3'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20'pale%20white'%3A%20'%23F5F5F5'%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%23%20If%20color%20is%20in%20the%20custom%20mapping%2C%20return%20it%20directly%0A%20%20%20%20%20%20%20%20if%20color.lower()%20in%20custom_colors%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20custom_colors%5Bcolor.lower()%5D%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Otherwise%2C%20try%20to%20find%20the%20color%20in%20webcolors%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20webcolors.name_to_hex(color)%0A%20%20%20%20%20%20%20%20except%20ValueError%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20If%20not%20found%20in%20webcolors%2C%20return%20a%20default%20color%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20'%23ccc'%0A%20%20%20%20cheeses%20%3D%20df%5Bdf%5B'country'%5D%20%3D%3D%20'Spain'%5D%0A%20%20%20%20non_nan_cheeses%20%3D%20cheeses%5B(cheeses%5B'cheese'%5D.notna())%20%26%20(cheeses%5B'cheese'%5D%20!%3D%20'NaN')%5D%0A%20%20%20%20print(non_nan_cheeses%5B'flavor'%5D)%0A%20%20%20%20color_counts%20%3D%20non_nan_cheeses%5B'color'%5D.value_counts()%0A%0A%20%20%20%20for%20color%20in%20non_nan_cheeses%5B'color'%5D.unique()%3A%0A%20%20%20%20%20%20%20%20print(f%22Color%3A%20%7Bcolor%7D%2C%20Hex%3A%20%7Bcolor_to_hex(color)%7D%22)%0A%0A%20%20%20%20%23%20Get%20unique%20colors%20from%20the%20DataFrame%0A%20%20%20%20colors%20%3D%20color_counts.index%20%20%23%20Ensure%20we%20use%20the%20order%20of%20counts%0A%0A%20%20%20%20%23%20Convert%20each%20color%20to%20its%20corresponding%20hex%20value%20based%20on%20the%20ordered%20list%0A%20%20%20%20hex_colors%20%3D%20list(map(color_to_hex%2C%20colors))%0A%0A%20%20%20%20%23%20def%20show_color(color)%3A%0A%20%20%20%20%23%20%20print(color%2C%20color_to_hex(color))%0A%0A%20%20%20%20white_index%20%3D%20color_counts.index.get_loc('white')%20%20%23%20Find%20the%20index%20of%20the%20white%20slice%0A%0A%20%20%20%20%23%20Apply%20the%20black%20outline%20to%20the%20white%20slice%20only%0A%20%20%20%20wedgeprops%20%3D%20%5B%7B'edgecolor'%3A%20'black'%20if%20i%20%3D%3D%20white_index%20else%20'none'%7D%20for%20i%20in%20range(len(color_counts))%5D%0A%0A%20%20%20%20%23%20list(map(show_color%2C%20colors))%0A%20%20%20%20plt.pie(color_counts%2C%20explode%3D%5B0.01%20for%20i%20in%20range(len(color_counts))%5D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20wedgeprops%3D%7B'edgecolor'%3A%20'none'%7D%2C%20labels%3Dcolor_counts.index%2C%20%0A%20%20%20%20autopct%3D'%251.1f%25%25'%2C%20colors%3Dhex_colors%2C%20pctdistance%3D1.25%2C%20labeldistance%3D.6)%0A%0A%20%20%20%20for%20i%2C%20wedge%20in%20enumerate(plt.gca().patches)%3A%0A%20%20%20%20%20%20%20%20if%20i%20%3D%3D%20white_index%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20wedge.set_edgecolor('black')%20%20%23%20Set%20black%20edge%20for%20the%20white%20slice%0A%0A%20%20%20%20plt.show()%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20cheeses%2C%0A%20%20%20%20%20%20%20%20color%2C%0A%20%20%20%20%20%20%20%20color_counts%2C%0A%20%20%20%20%20%20%20%20color_to_hex%2C%0A%20%20%20%20%20%20%20%20colors%2C%0A%20%20%20%20%20%20%20%20hex_colors%2C%0A%20%20%20%20%20%20%20%20i%2C%0A%20%20%20%20%20%20%20%20non_nan_cheeses%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%20webcolors%2C%0A%20%20%20%20%20%20%20%20wedge%2C%0A%20%20%20%20%20%20%20%20wedgeprops%2C%0A%20%20%20%20%20%20%20%20white_index%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(color_counts%2C%20hex_colors%2C%20plt)%3A%0A%20%20%20%20plt.bar(color_counts.index%2C%20color_counts.values%2C%20color%3Dhex_colors%2C%20edgecolor%3D'black')%0A%20%20%20%20plt.xticks(rotation%3D45%2C%20ha%3D'right')%20%20%23%20'ha'%20controls%20horizontal%20alignment%0A%20%20%20%20plt.gca()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(non_nan_cheeses%2C%20plt)%3A%0A%20%20%20%20flavor_counts%20%3D%20non_nan_cheeses%5B'flavor'%5D.value_counts()%0A%20%20%20%20%23%20flavor_counts%20%3D%20non_nan_cheeses%5B'flavor'%5D.str.split('%2C').str%5B0%5D.value_counts()%0A%20%20%20%20plt.pie(flavor_counts%2C%20explode%3D%5B0.01%20for%20_%20in%20range(len(flavor_counts))%5D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20wedgeprops%3D%7B'edgecolor'%3A%20'none'%7D%2C%20labels%3Dflavor_counts.index%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20autopct%3D'%251.1f%25%25'%2C%20pctdistance%3D1.25%2C%20labeldistance%3D.6)%0A%0A%20%20%20%20plt.gca()%0A%20%20%20%20return%20(flavor_counts%2C)%0A%0A%0A%40app.cell%0Adef%20_(non_nan_cheeses%2C%20plt)%3A%0A%20%20%20%20%23%20Count%20the%20occurrences%20of%20each%20flavor%20(splitting%20by%20commas%20and%20flattening%20the%20list)%0A%20%20%20%20all_flavor_counts%20%3D%20non_nan_cheeses%5B'flavor'%5D.str.split('%2C').explode().value_counts()%0A%0A%20%20%20%20%23%20Filter%20flavors%20that%20occur%20more%20than%20once%0A%20%20%20%20main_flavors%20%3D%20all_flavor_counts%5Ball_flavor_counts%20%3E%201%5D%0A%0A%20%20%20%20%23%20Create%20the%20pie%20chart%20with%20exploded%20slices%0A%20%20%20%20plt.pie(main_flavors%2C%20explode%3D%5B0.01%20for%20_%20in%20range(len(main_flavors))%5D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20wedgeprops%3D%7B'edgecolor'%3A%20'black'%7D%2C%20labels%3Dmain_flavors.index%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20autopct%3D'%251.1f%25%25'%2C%20pctdistance%3D0.7%2C%20labeldistance%3D1.1)%0A%0A%20%20%20%20%23%20Show%20the%20plot%0A%20%20%20%20plt.gca()%0A%20%20%20%20return%20all_flavor_counts%2C%20main_flavors%0A%0A%0A%40app.cell%0Adef%20_(all_flavor_counts%2C%20non_nan_cheeses%2C%20pd)%3A%0A%20%20%20%20import%20re%0A%20%20%20%20import%20plotly.express%20as%20px%0A%0A%20%20%20%20%23%20Count%20the%20occurrences%20of%20each%20flavor%20(splitting%20by%20commas%20and%20flattening%20the%20list)%0A%20%20%20%20_all_flavor_counts%20%3D%20non_nan_cheeses%5B'flavor'%5D.str.split('%2C').explode().value_counts()%0A%0A%20%20%20%20%23%20Filter%20flavors%20that%20occur%20more%20than%20once%0A%20%20%20%20_main_flavors%20%3D%20all_flavor_counts%5Ball_flavor_counts%20%3E%201%5D%0A%0A%0A%20%20%20%20%23%20Assuming%20main_flavor_counts%20and%20secondary_flavor_counts%20are%20already%20defined%0A%20%20%20%20main_flavor_counts%20%3D%20_all_flavor_counts%5B_all_flavor_counts%20%3E%201%5D%0A%0A%20%20%20%20%23%20Prepare%20data%20for%20nested%20pie%20chart%0A%20%20%20%20secondary_flavor_data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20flavor%3A%20non_nan_cheeses%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20non_nan_cheeses%5B'flavor'%5D.str.contains(flavor%2C%20na%3DFalse)%0A%20%20%20%20%20%20%20%20%5D%5B'flavor'%5D.apply(lambda%20x%3A%20re.sub(r'%5Cb'%20%2B%20re.escape(flavor)%20%2B%20r'%5Cb%2C%3F%5Cs*'%2C%20''%2C%20x).strip('%2C%20').strip())%0A%20%20%20%20%20%20%20%20for%20flavor%20in%20main_flavor_counts.index%0A%20%20%20%20%7D%0A%0A%20%20%20%20secondary_flavor_counts%20%3D%20%7Bflavor%3A%20secondary_flavor.value_counts()%20for%20flavor%2C%20secondary_flavor%20in%20secondary_flavor_data.items()%7D%0A%0A%20%20%20%20%23%20Prepare%20data%20for%20sunburst%20chart%0A%20%20%20%20sunburst_data%20%3D%20%5B%5D%0A%0A%20%20%20%20%23%20Iterate%20through%20each%20main%20flavor%20and%20its%20secondary%20flavors%0A%20%20%20%20for%20main_flavor%2C%20counts%20in%20secondary_flavor_counts.items()%3A%0A%20%20%20%20%20%20%20%20for%20secondary_flavor%2C%20count%20in%20counts.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Only%20add%20data%20if%20the%20secondary%20flavor%20is%20not%20the%20same%20as%20the%20main%20flavor%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20secondary_flavor%20!%3D%20main_flavor%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sunburst_data.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Main%20Flavor%22%3A%20main_flavor%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Secondary%20Flavor%22%3A%20secondary_flavor%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Count%22%3A%20count%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Name%22%3A%20secondary_flavor%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%0A%20%20%20%20%23%20Convert%20the%20list%20to%20a%20DataFrame%0A%20%20%20%20sunburst_df%20%3D%20pd.DataFrame(sunburst_data)%0A%0A%20%20%20%20%23%20Generate%20a%20color%20scale%20for%20main%20flavors%0A%20%20%20%20main_flavor_colors%20%3D%20%7B%0A%20%20%20%20%20%20%20%20flavor%3A%20px.colors.qualitative.Set1%5Bi%20%25%20len(px.colors.qualitative.Set1)%5D%20%20%23%20Map%20to%20a%20qualitative%20color%20palette%0A%20%20%20%20%20%20%20%20for%20i%2C%20flavor%20in%20enumerate(main_flavor_counts.index)%0A%20%20%20%20%7D%0A%0A%20%20%20%20%23%20Assign%20colors%20to%20cheeses%20based%20on%20their%20main%20flavor%0A%20%20%20%20sunburst_df%5B'Color'%5D%20%3D%20sunburst_df%5B'Main%20Flavor'%5D.map(main_flavor_colors)%0A%20%20%20%20print(main_flavor_colors%2C%20sunburst_df%5B'Color'%5D)%0A%20%20%20%20%23%20Create%20the%20sunburst%20chart%0A%20%20%20%20fig%20%3D%20px.sunburst(sunburst_df%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20path%3D%5B'Main%20Flavor'%2C%20'Secondary%20Flavor'%5D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20values%3D'Count'%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Delicious%20fractions%20of%20Spanish%20cheeses%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3D'Color'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color_discrete_map%3Dmain_flavor_colors%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20hover_data%3D%7B'Name'%3A%20True%7D)%0A%0A%20%20%20%20fig.update_layout(%0A%20%20%20%20%20%20%20%20hoverlabel%3Ddict(%0A%20%20%20%20%20%20%20%20%20%20%20%20bgcolor%3D%22white%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20font_size%3D16%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20font_family%3D%22Rockwell%22%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%23%20Add%20a%20custom%20legend%20for%20cheese%20names%20and%20corresponding%20main%20flavor%20colors%0A%20%20%20%20%20%20%20%20annotations%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20dict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3D1.1%2C%20%20%23%20Adjust%20position%20of%20the%20list%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%3D'%3Cb%3ECheese%20List%3C%2Fb%3E%3Cbr%3E'%20%2B%20'%3Cbr%3E'.join(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%3Cspan%20style%3D'color%3A'%23000000'%3B'%3E%7Bcheese%7D%3C%2Fspan%3E%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20cheese%2C%20main_flavor%20in%20zip(non_nan_cheeses%5B'cheese'%5D%2C%20non_nan_cheeses%5B'flavor'%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20showarrow%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20font%3Ddict(size%3D12)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20align%3D'left'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20xref%3D%22paper%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20yref%3D%22paper%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Show%20the%20chart%0A%20%20%20%20fig.show()%0A%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20count%2C%0A%20%20%20%20%20%20%20%20counts%2C%0A%20%20%20%20%20%20%20%20fig%2C%0A%20%20%20%20%20%20%20%20main_flavor%2C%0A%20%20%20%20%20%20%20%20main_flavor_colors%2C%0A%20%20%20%20%20%20%20%20main_flavor_counts%2C%0A%20%20%20%20%20%20%20%20px%2C%0A%20%20%20%20%20%20%20%20re%2C%0A%20%20%20%20%20%20%20%20secondary_flavor%2C%0A%20%20%20%20%20%20%20%20secondary_flavor_counts%2C%0A%20%20%20%20%20%20%20%20secondary_flavor_data%2C%0A%20%20%20%20%20%20%20%20sunburst_data%2C%0A%20%20%20%20%20%20%20%20sunburst_df%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
07ea79d751772e223ca7a6aae1b71aa9c82c85f34c58378ba7618426bb55d795