:D

音や画像が入ったPandasのDataFrame(html)を作る

はじめましての方ははじめまして. sqrt4kaidoです.

pandasにおけるDataFrameの可視化についての小ネタを1つ紹介します.
DataFrameをhtml化することで,音や画像を一緒に可視化する方法です.

方法

pandasにはto_html()というメソッドがあり,任意のDataFrameをhtmlの形式にすることが出来ます.
生成したhtmlは,IPythonのdisplayモジュールを用いてjupyter lab上でプレビューすることが出来ます. ここに,音や画像のタグを埋め込んでしまおうという作戦です.

では早速,音と画像を組み込んだDataFrameを生成する,htmlに変換するまでのコードの一例です.

path_wavs = ['wav/01.flac', 'wav/02.flac', 'wav/03.flac']
path_imgs = ['img/01.png', 'img/02.png', 'img/03.png']

audio_raw = []
for i in tqdm(range(len(path_wavs))):
    name = path_wavs[i].split('/')[-1]
    audio_html = f'<audio controls><source src="{path_wavs[i]}"></audio>'  ## audioタグをつける
    img_html = f'<img src="{path_imgs[i]}">'  ## imgタグをつける
    audio_raw.append([name, audio_html, img_html])
    
audio_df = pd.DataFrame(audio_raw, columns=['name', 'audio', 'mel'])
audio_html = audio_df.to_html(classes=["table", "table-bordered", "table-hover"], escape=False)  ## htmlに変換.Bootstrapで少し見た目を整えている

ポイントは,表示したい音へのパスをaudioタグで囲むことと,表示したい画像へのパスにimgタグをつけることです. to_htmlを行うときは,画像がエスケープされてしまうのを防ぐため、to_htmlの引数でescape=Falseを指定します.

これでプレビューしてみると,以下のように音と画像が入ったDataFrameを可視化することが出来ます.

f:id:sqrt4kaido:20210719234800p:plain

ちなみに,このhtmlをprintしてみると,ちゃんとhtmlが生成されていることがわかります.

<table border="1" class="dataframe table table-bordered table-hover">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>name</th>
      <th>audio</th>
      <th>mel</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>01.flac</td>
      <td><audio controls><source src="wav/01.flac"></audio></td>
      <td><img src="img/01.png"></td>
    </tr>
    <tr>
      <th>1</th>
      <td>02.flac</td>
      <td><audio controls><source src="wav/02.flac"></audio></td>
      <td><img src="img/02.png"></td>
    </tr>
    <tr>
      <th>2</th>
      <td>03.flac</td>
      <td><audio controls><source src="wav/03.flac"></audio></td>
      <td><img src="img/03.png"></td>
    </tr>
  </tbody>

感想

音と,生成したスペクトログラムを可視化,比較するときなどに便利.

4. 参考

qiita.com