56
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

PythonでExcelファイルを作成 + similarity matrix

はじめに

PythonでExcelファイルを作成するライブラリはいくつかあるが、XlsxWriterが次の理由でおすすめ。

  • .xlsxファイルを出力できる
  • 機能を出力のみに絞っているのでシンプルかつ強力

インストール

$ pip install xlsxwriter

基本的な使い方

公式サンプルを適当に日本語訳

こう書くと

xlsxwriter_demo.py
# 新しいファイルとワークシートを作成
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()

# 列Aの幅を変更
worksheet.set_column('A:A', 20)

# 太字にする書式を追加
bold = workbook.add_format({'bold': True})

# テキストの書き込み
worksheet.write('A1', 'Hello')

# テキストの書き込み・書式の適用
worksheet.write('A2', 'World', bold)

# 数値の書き込み(セル番地を数字で指定)
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)

# 画像を挿入
worksheet.insert_image('B5', 'logo.png')

workbook.close()

こうなる

demo.png

similarity matrixの作成

ここからただの個人的メモ。

  • カラースケールを使ってsimilarity matrix(こういうやつ)を作りたい
  • 色指定の際、最大値と最小値を自動調整したい
  • 対角要素は最大値・最小値の計算から除外しないといけない

たぶんnumpy, scipy, matplotlibとか使えばできるんだろうけど、とっさに思いついたのがxlsxwriterだった。
できたソースはこんな感じ。

sim_matrix.py
# -*- coding: utf-8 -*-
import xlsxwriter
from xlsxwriter.utility import xl_rowcol_to_cell, xl_range_abs

# ワークブックとワークシートを作成
wb = xlsxwriter.Workbook("sim_matrix.xlsx")
ws = wb.add_worksheet("similarity matrix")

# データセルのサイズを設定
for i in range(5):
    ws.set_row(i, 40.5)
    ws.set_column(i, i, 6.0)

# データ入力
data = [[1.00, 0.15, 0.09, 0.01, 0.02],
        [0.15, 1.00, 0.12, 0.06, 0.03],
        [0.09, 0.12, 1.00, 0.08, 0.01],
        [0.01, 0.06, 0.08, 1.00, 0.05],
        [0.02, 0.03, 0.01, 0.05, 1.00]]
for i in range(5):
    for j in range(5):
        ws.write_number(i, j, data[i][j])

# 配列数式を使って対角要素を除く最大値・最小値を求める
data_field = xl_range_abs(0, 0, 4, 4)
ws.write_string(0, 6, "max sim")
max_formula = '{{=MAX(IF(ROW({0})=COLUMN({0}),"",{0}))}}'.format(data_field)
ws.write_formula(0, 7, max_formula)
ws.write_string(1, 6, "min sim")
min_formula = '{{=MIN(IF(ROW({0})=COLUMN({0}),"",{0}))}}'.format(data_field)
ws.write_formula(1, 7, min_formula)

# 条件付き書式を使ってカラースケールを適用
max_cell = xl_rowcol_to_cell(0, 7, row_abs=True, col_abs=True)
min_cell = xl_rowcol_to_cell(1, 7, row_abs=True, col_abs=True)
props = {
    "type": "2_color_scale",
    "max_color": "#FF6347", # tomato
    "min_color": "#FFFFE0", # lightyellow
    "max_type": "formula",
    "min_type": "formula",
    "max_value": max_cell,
    "min_value": min_cell}
ws.conditional_format(0, 0, 4, 4, props)

# 書き込み
wb.close()

こんなファイルが出力される。

xlsxwriter_sim_matrix.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
56
Help us understand the problem. What are the problem?