import pandas as pd
import numpy as np
dfccc = pd.read_csv("C:\\Users\\Atsushi Nakajima\\Dropbox\\大菌輪_CCC\\daikinrin_CCC_dataset_version1.2\\ccclist_daikinrin_ccc_ver._1.2_for_informal_or_mining_use_only.csv")
cccdictej = dict(zip("<"+dfccc["CCC"]+">",dfccc["CCC_JP"]))
#↓の保存場所は各自のPCに合わせたものを指定してください
#今回は担子菌のデータを使います
df = pd.read_csv("C:\\Users\\Atsushi Nakajima\\Dropbox\\大菌輪_CCC\\daikinrin_CCC_dataset_version1.2\\basidiomycota_daikinrin_ccc_ver._1.2_for_informal_or_mining_use_only.csv")
print(df.shape)
ccclist = list(df.columns)[5:]
#3249行×264列のデータを読み込みました
(3249, 264)
C:\Users\Atsushi Nakajima\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:2717: DtypeWarning: Columns (257,263) have mixed types. Specify dtype option on import or set low_memory=False. interactivity=interactivity, compiler=compiler, result=result)
#まずどんなCCCがあるのか確認します(とりあえず20件表示)
print(ccclist[:20])
['<pileus_length=under_10mm>', '<pileus_length=10-30mm>', '<pileus_length=30-50mm>', '<pileus_length=50-100mm>', '<pileus_length=100-150mm>', '<pileus_length=150-200mm>', '<pileus_length=over_200mm>', '<pileus_color=whitish_to_greyish_cream>', '<pileus_color=greyish>', '<pileus_color=yellowish>', '<pileus_color=pinkish_to_rose>', '<pileus_color=orange_to_red>', '<pileus_color=greenish>', '<pileus_color=purple_to_blueish>', '<pileus_color=brownish>', '<pileus_color=blackish_brown_to_black>', '<pileus_shape=ellipsoidal_to_oval>', '<pileus_shape=conical>', '<pileus_shape=globose_to_subglobose>', '<pileus_shape=cylindric_to_clavate>']
#「<pileus_color=pinkish_to_rose>」を持つ分類群の一覧を出力します
i = "<pileus_color=pinkish_to_rose>"
#本データセットではヒットなしの欄には「【0】[]」の値が入っています
#「~」の記号を先頭に加えることで「【0】」を除外しています
df2 = df[~df[i].str.contains("【0】")][["和名","学名",i]]
print(df2.shape[0],"件hit!")
#383件もヒットしたので、最初の5つを表示してみます
df2.head()
424 件hit!
和名 | 学名 | <pileus_color=pinkish_to_rose> | |
---|---|---|---|
0 | ニクウチワタケ | Abortiporus biennis | 【1】[11354] |
6 | シロオオハラタケ | Agaricus arvensis | 【1】[2980] |
8 | (和名なし) | Agaricus augustus | 【1】[6017] |
12 | ツクリタケ | Agaricus bisporus | 【1】[6009] |
22 | (和名なし) | Agaricus devoniensis | 【1】[1098] |
#和名があるものに絞り込みたい時は
df2 = df[(~df["和名"].str.contains("和名なし"))&(~df[i].str.contains("【0】"))][["和名","学名",i]]
print(df2.shape[0],"件hit!")
df2.head()
156 件hit!
和名 | 学名 | <pileus_color=pinkish_to_rose> | |
---|---|---|---|
0 | ニクウチワタケ | Abortiporus biennis | 【1】[11354] |
6 | シロオオハラタケ | Agaricus arvensis | 【1】[2980] |
12 | ツクリタケ | Agaricus bisporus | 【1】[6009] |
37 | ナカグロモリノカサ | Agaricus moelleri | 【1】[6012] |
109 | ササクレシロオニタケ | Amanita eijii | 【1】[10543] |
#「傘が灰色系で円筒形~棍棒形」など、複数のCCCで絞り込む場合も同じ要領です
#<pileus_color=greyish>かつ<pileus_shape=cylindric_to_clavate>
i1 ="<pileus_color=greyish>"
i2 = "<pileus_shape=cylindric_to_clavate>"
df2 = df[(~df["和名"].str.contains("和名なし"))&(~df[i1].str.contains("【0】"))&(~df[i2].str.contains("【0】"))][["和名","学名"]]
print(df2.shape[0],"件hit!")
print(sorted(list(df2["和名"])))
#13の分類群が「傘が灰色系」かつ「傘が円筒形~棍棒形」ということが分かりました
#想定通り、ヒトヨタケの仲間が得られています
18 件hit! ['ウシグソヒトヨタケ', 'クズヒトヨタケ', 'コガネキヌカラカサタケ', 'コナヒトヨタケ', 'ザラエノヒトヨタケ', 'トフンヒトヨタケ', 'ナカグロヒガサタケ', 'ニオイコナヒトヨタケ', 'ネナガノヒトヨタケ', 'バフンヒトヨタケ', 'ヒトヨタケ', 'ヒメクズヒトヨタケ', 'ヒメコナヒトヨタケ', 'ヒメヒガサヒトヨタケ', 'ホソネヒトヨタケ', 'マルミザラエノヒトヨタケ', 'ユバリヒトヨタケ', 'ワタヒトヨタケ']
from ipywidgets import *
wameilist = sorted([a for a in list(df["和名"]) if "和名なし" not in a])
wameiselect = Dropdown(description="好きなきのこを選んでね", options=wameilist)
wameiselect
q = wameiselect.value
#「.T」で転置するのがポイント。CCCの部分だけを[5:]でスライスしている
df3 = df[df["和名"]==q].T[5:]
df3.columns = [q]
df3[q] = df3[q].astype(str)
df3 = df3[df3[q].str.contains("【[1-9]")].sort_index()
print(df3.shape[0],"件hit!")
df3.index = [cccdictej[a] for a in df3.index]
df3.sort_index(inplace=True)
df3
50 件hit!
クロハツ | |
---|---|
つば_有無_無 | 【3】[1616, 6549, 8129] |
つぼ_有無_無 | 【3】[1616, 6549, 8129] |
傘_形状_凸形 | 【2】[1616, 6549] |
傘_形状_凹形 | 【3】[1616, 6549, 8129] |
傘_形状_扁平 | 【1】[6549] |
傘_直径_100-150mm | 【3】[1616, 6549, 8129] |
傘_直径_150-200mm | 【2】[1616, 8129] |
傘_直径_200mm以上 | 【1】[1616] |
傘_直径_30-50mm | 【2】[1616, 6549] |
傘_直径_50-100mm | 【3】[1616, 6549, 8129] |
傘_色_桃 | 【1】[1616] |
傘_色_橙赤 | 【1】[6549] |
傘_色_灰 | 【2】[6549, 8129] |
傘_色_白 | 【3】[1616, 6549, 8129] |
傘_色_褐 | 【3】[1616, 6549, 8129] |
傘_色_黒 | 【3】[1616, 6549, 8129] |
傘_表面_乾性 | 【1】[1616] |
傘_表面_亀裂 | 【2】[6549, 8129] |
傘_表面_湿性 | 【1】[6549] |
傘_表面_粘性 | 【2】[6549, 8129] |
子実層托_位置_上生 | 【1】[6549] |
子実層托_位置_垂生 | 【1】[6549] |
子実層托_位置_直生 | 【1】[1616] |
子実層托_厚さ_厚 | 【2】[1616, 8129] |
子実層托_型_襞 | 【3】[1616, 6549, 8129] |
子実層托_色_桃 | 【1】[1616] |
子実層托_色_橙赤 | 【1】[8129] |
子実層托_色_灰 | 【1】[1616] |
子実層托_色_緑 | 【1】[1616] |
子実層托_色_黄 | 【2】[1616, 8129] |
子実層托_色_黒 | 【1】[1616] |
子実層托_間隔_疎 | 【3】[1616, 6549, 8129] |
担子胞子_幅_5-7.5µm | 【2】[1616, 6549] |
担子胞子_形状_楕円 | 【2】[1616, 6549] |
担子胞子_表面_畝 | 【1】[6549] |
担子胞子_表面_疣状 | 【2】[1616, 6549] |
担子胞子_表面_網目 | 【2】[1616, 6549] |
担子胞子_長さ_5-7.5µm | 【2】[1616, 6549] |
担子胞子_長さ_7.5-10µm | 【2】[1616, 6549] |
担子胞子_隔壁_無 | 【2】[1616, 6549] |
柄_幅_10-30mm | 【1】[6549] |
柄_幅_30-50mm | 【1】[6549] |
柄_形状_先細/棍棒状 | 【1】[6549] |
柄_形状_円筒 | 【1】[6549] |
柄_色_橙赤 | 【3】[1616, 6549, 8129] |
柄_色_白 | 【3】[1616, 6549, 8129] |
柄_色_褐 | 【2】[1616, 8129] |
柄_色_黒 | 【3】[1616, 6549, 8129] |
柄_長さ_50-100mm | 【1】[6549] |
胞子紋_色_白 | 【3】[1616, 6549, 8129] |
wameiselects = [Dropdown(description="和名"+str(i+1), options=wameilist) for i in range(3)]
print("傘の色を比較するきのこを3つ選んでね")
VBox([HBox([wameiselects[0], wameiselects[1], wameiselects[2]])])
傘の色を比較するきのこを3つ選んでね
#3種の選んだきのこの傘の色を比べてみます
q = [wameiselects[0].value,wameiselects[1].value,wameiselects[2].value]
wameidict = dict(zip(df.index,df.iloc[:,1]))
#リスト形式で指定し、str.containsではなくisinを使います
df3 = df[df["和名"].isin(q)].T[5:]
df3 = df3.rename(columns={df3.columns[0]: wameidict[df3.columns[0]], df3.columns[1]: wameidict[df3.columns[1]], df3.columns[2]: wameidict[df3.columns[2]]})
df3 = df3[df3.index.str.contains("pileus_color")]
df3 = df3.where(df3!="【0】[]", np.nan)
df3.index = [cccdictej[a] for a in df3.index]
df3.sort_index(inplace=True)
df3 = df3.style.highlight_null("grey")
df3
アイゾメヒカゲタケ | ワライタケ | センボンサイギョウガサ | |
---|---|---|---|
傘_色_桃 | 【1】[7789] | 【1】[7795] | 【1】[7792] |
傘_色_橙赤 | nan | nan | 【2】[97, 2130] |
傘_色_灰 | 【1】[94] | 【6】[99, 2129, 7794, 7795, 7796, 8835] | 【1】[97] |
傘_色_白 | 【2】[101, 7789] | 【3】[99, 2125, 8835] | nan |
傘_色_緑 | nan | 【1】[7796] | nan |
傘_色_褐 | 【2】[94, 3197] | 【7】[99, 2125, 2129, 7794, 7795, 7796, 8835] | 【3】[97, 2130, 7792] |
傘_色_青紫 | 【2】[94, 101] | 【1】[99] | 【1】[97] |
傘_色_黄 | 【2】[94, 3197] | 【5】[99, 2125, 2129, 7795, 7796] | 【2】[2130, 7792] |
傘_色_黒 | nan | 【3】[2129, 7796, 8835] | nan |
#次に選んだきのこに最も似ている分類群を調べてみます(少し実行に時間がかかる)
wameiselect = Dropdown(description="好きなきのこを選んでね", options=wameilist)
wameiselect
q1 = wameiselect.value
from tqdm import tqdm
print(q1+"と似ているきのこを探索中…(少し時間がかかる)")
df5 = pd.DataFrame()
for wamei in tqdm(list(df[(~df["和名"].str.contains("和名なし"))]["和名"])):
q2 = wamei
df4 = df.T.iloc[5:,:].dropna()
df4.columns = df.T.iloc[1,:]
df4 = df4[[q1,q2]]
c = df4[(~df4.iloc[:,0].str.contains("【0】"))&(~df4.iloc[:,1].str.contains("【0】"))].shape[0]
a = df4[(~df4.iloc[:,0].str.contains("【0】"))].shape[0]
b = df4[(~df4.iloc[:,1].str.contains("【0】"))].shape[0]
jaccard = np.round(c/(a+b-c),2)
dfbuf = pd.DataFrame(np.array([wamei,jaccard])).T
df5 = pd.concat([df5,dfbuf])
df5.columns = ["和名","類似度(Jaccard係数)"]
df5 = df5.sort_values("類似度(Jaccard係数)",ascending=False).iloc[0:11,:]
df5.reset_index().drop("index",axis=1)
#上位10件を表示。
ニセショウロ と似ているきのこを探索中…(少し時間がかかる)
100%|██████████████████████████████████████████████████████████████████████████████| 1101/1101 [01:53<00:00, 9.71it/s] 0%| | 1/1101 [00:00<01:54, 9.58it/s]
和名 | 類似度(Jaccard係数) | |
---|---|---|
0 | ニセショウロ | 1.0 |
1 | ハマニセショウロ | 0.6 |
2 | タマネギモドキ | 0.58 |
3 | シロニセショウロ | 0.55 |
4 | ツチグリカタカワタケ | 0.54 |
5 | ヒメカタショウロ | 0.54 |
6 | コツブタケ | 0.48 |
7 | ツチグリ | 0.48 |
8 | ザラツキカタカワタケ | 0.45 |
9 | アミメツチダンゴ | 0.35 |
10 | エリマキツチグリ | 0.34 |
今後データを拡充していきます。解析の方法次第で色々な可能性があると思いますので、ぜひ楽しんでみてください。