PythonによるExcel業務の自動化を体感
はじめに
本記事では、複数のスペクトル生データ(csvファイル)を集約し、エクセルに書き出して、さらにグラフを描画するまでの作業を自動化したプログラムを解説します。
そのまま使えるサンプルプログラムを配布しています。
「Pythonでどんな作業が自動化できるの?」と、まだイメージが湧いていない初学者向けの記事です。
本記事を読めば、ご自身の業務で自動化できそうなものをイメージできるようになります!
体感用プログラムのダウンロード
サンプルプログラムに沿って解説していきますので、以下リンクよりzipファイルをダウンロードしてください。
zipファイルの中身
- スペクトル生データ3つ(csvファイル)
- サンプルプログラム(Jupyter Lab用 ipynbファイル)
zipファイル解凍後に、csvファイルはデスクトップ上にフォルダを新規作成して、そこに入れておいてください。
ipynbファイルはJupyter Lab導入済みの方は、Jupyter Lab用のフォルダに移しておけばOKです。
※Jupyter Lab未導入の方も、実際のコードを書いていくのでそちらをご自身の環境でコピペしながら体感できます!
PythonとJupyter Labをインストールして開発環境を構築しよう! はじめに Pythonは手軽に使えて強力な機能を備えたプログラミング言語として、化学者や研究開発担当者の間で注目を集めています。本[…]
まずは自動作業を体感しよう!
プログラムの実行
早速、自動化プログラムを実行してみましょう。
Jupyter Labを使用している方、それ以外の方でそれぞれ方法を説明します。
- Jupyter Labを使用している方
—
ipynbファイルをJupyter Labで開いて、「すべてのセルを実行」ボタンを押してください。—
—
— - それ以外の方
—
こちらのソースコードをご自身の環境で実行してください。
—
プログラムの体感
プログラムを実行すると、生データのcsvファイルを置いているフォルダを選択するウィンドウが出てくるので、csvファイルのみを保存したフォルダを選択してください。
作業はこれだけです!
csvファイルを置いているフォルダに新たにエクセルファイルが作成されており、こちらを開くとデータ集約とグラフ描画までされているかと思います。
初めて自動化に触れた方は、「こんなことができるのか」と感じられたのではないでしょうか。
以降では今回のサンプルプログラムについて、詳しく解説していきます。
サンプルプログラムの概要
化学研究の現場ではHPLCやUV、NMR、IR測定など、実験で得られるスペクトル生データが多数存在します。
これらの生データを報告のためにグラフ描画する作業は定型作業の代表例です。
そこで今回、複数生データの集約、エクセル上でのグラフ描画を自動で実現するプログラムを開発しました。
プログラムの概要は下図の通りです。
各ステップに記載している英字は使用するライブラリ名です。
サンプルコードの詳説
ライブラリのインポート
コードは必要なライブラリをインポートするところから始まります。
Pythonはライブラリ無しでは成り立ちません。
ファイル操作やエクセル操作にはそれぞれ適切なライブラリが必要です。
import os
import tkinter as tk
from tkinter import filedialog
from tkinter.filedialog import askdirectory
import openpyxl
import pandas as pd
from openpyxl.chart import Reference, ScatterChart, Series
一括インストールから用途別に徹底解説 はじめに 化学研究や実験データ解析、さらには自動化や機械学習による開発加速が求められる中、Pythonはこうした業務を大幅に効率化するための強力なツールです。 本記事では、化学[…]
生データが入ったフォルダ選択
プログラムを実行すると、生データのcsvファイル保管フォルダを選択するウィンドウが出てきました。
これを実現しているのが以下のコードです。
tkinterというGUIツールを扱うための標準ライブラリを使用しています。
標準ライブラリなのでpipなどでのインストールは不要です。
# フォルダ選択
root = tk.Tk() # 新しいTkinterウィンドウを作成
root.attributes("-topmost", True) # ウィンドウを常に最前面に表示するように設定
root.withdraw() # ウィンドウを非表示にします(ファイルダイアログだけを表示)
# フォルダ選択ダイアログを表示
folder_path = askdirectory(title="csvファイルの入ったフォルダを選択してください")
print(folder_path)
生データファイルをリスト化
選択したフォルダに入っている生データcsvファイルをリストアップします。
このようにリストアップすることで、後ほど複数のファイルに対して同様の操作を繰り返し処理することができます。
「繰り返し処理」というのが自動化と相性が良い作業になります。
osというディレクトリ操作のための標準ライブラリを使用しています。
標準ライブラリなのでpipなどでのインストールは不要です。
# フォルダ内のCSVファイルを取得
csv_files = [f for f in os.listdir(folder_path) if f.endswith(".csv")]
print(csv_files)
データを間引いて一つの表に集約
ここから自動化の花形である繰り返し操作に入っていきます。
スペクトル生データは行数が多いことが特徴です(今回のサンプルは1万行)。
これらをすべて抜き出してグラフ化するとエクセルが非常に重くなるため、データを間引くことが一般的です。
今回、5行おきにデータを間引いて、繰り返し処理によって3つの生データを一つに集約しています。
これをエクセルで実施しようとすると、関数を使って間引いて、コピペで集約、という手作業を毎回しなければいけません。
表形式のデータの処理にはpandasというサードパーティライブラリを使用します。
こちらは自動化の必須ライブラリなのでインストール推奨です。
# 集約データを保存するためのデータフレームを作成
combined_df = pd.DataFrame()
# csvファイルのデータを間引いてデータフレームに集約
# for文で3つのファイルを順番に処理
for file in csv_files:
file_path = os.path.join(folder_path, file)
# CSVファイルを読み込み、5行おきにデータを抜き出す
df = pd.read_csv(file_path)
df_reduced = df.iloc[::5, :]
# ファイル名を列名に追加して集約データフレームに追加
df_reduced.columns = ["Wavelength (nm)", file]
if combined_df.empty:
combined_df = df_reduced
else:
combined_df = pd.merge(
combined_df, df_reduced, on="Wavelength (nm)", how="outer"
)
print(combined_df)
表を新しいエクセルファイルに保存
集約したデータを新しいエクセルファイルに保存します。
pandasは作成した表をそのままエクセルに変換できるところが便利です。
この時点で新たなエクセルファイルが作成されています。
# 集約データを新しいExcelファイルに保存
combined_file_path = os.path.join(folder_path, "combined_spectrum_data.xlsx")
combined_df.to_excel(combined_file_path, index=False)
エクセルでグラフを描画
最後に、新たに作成したエクセルファイル上でグラフを描画します。
グラフ描画はエクセル上の操作になるため、openpyxlというサードパーティライブラリを使用します。
こちらも自動化の必須ライブラリなのでインストール推奨です。
ここでも繰り返し処理によって、3つのグラフの重ね書きを一瞬で実行しています。
# Excelファイルを開いてグラフを描画
wb = openpyxl.load_workbook(combined_file_path)
ws = wb.active
# 散布図を作成
chart = ScatterChart()
chart.title = "Spectrum Data"
chart.x_axis.title = "Wavelength (nm)" # x軸のタイトル
chart.y_axis.title = "Intensity" # y軸のタイトル
# for文で各サンプルのデータをグラフに追加
for i in range(2, len(csv_files) + 2):
xvalues = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)
yvalues = Reference(ws, min_col=i, min_row=1, max_row=ws.max_row)
series = Series(yvalues, xvalues, title_from_data=True)
chart.series.append(series)
# 作ったグラフをE5セルに追加
ws.add_chart(chart, "E5")
# エクセルファイルを保存
wb.save(combined_file_path)
# これで処理完了!
print("処理が完了しました。")
ソースコード
import os
import tkinter as tk
from tkinter import filedialog
from tkinter.filedialog import askdirectory
import openpyxl
import pandas as pd
from openpyxl.chart import Reference, ScatterChart, Series
# フォルダ選択
root = tk.Tk() # 新しいTkinterウィンドウを作成
root.attributes("-topmost", True) # ウィンドウを常に最前面に表示するように設定
root.withdraw() # ウィンドウを非表示にします(ファイルダイアログだけを表示)
# フォルダ選択ダイアログを表示
folder_path = askdirectory(title="csvファイルの入ったフォルダを選択してください")
print(folder_path)
# フォルダ内のCSVファイルを取得
csv_files = [f for f in os.listdir(folder_path) if f.endswith(".csv")]
print(csv_files)
# 集約データを保存するためのデータフレームを作成
combined_df = pd.DataFrame()
# csvファイルのデータを間引いてデータフレームに集約
# for文で3つのファイルを順番に処理
for file in csv_files:
file_path = os.path.join(folder_path, file)
# CSVファイルを読み込み、5行おきにデータを抜き出す
df = pd.read_csv(file_path)
df_reduced = df.iloc[::5, :]
# ファイル名を列名に追加して集約データフレームに追加
df_reduced.columns = ["Wavelength (nm)", file]
if combined_df.empty:
combined_df = df_reduced
else:
combined_df = pd.merge(
combined_df, df_reduced, on="Wavelength (nm)", how="outer"
)
print(combined_df)
# 集約データを新しいExcelファイルに保存
combined_file_path = os.path.join(folder_path, "combined_spectrum_data.xlsx")
combined_df.to_excel(combined_file_path, index=False)
# Excelファイルを開いてグラフを描画
wb = openpyxl.load_workbook(combined_file_path)
ws = wb.active
# 散布図を作成
chart = ScatterChart()
chart.title = "Spectrum Data"
chart.x_axis.title = "Wavelength (nm)" # x軸のタイトル
chart.y_axis.title = "Intensity" # y軸のタイトル
# for文で各サンプルのデータをグラフに追加
for i in range(2, len(csv_files) + 2):
xvalues = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)
yvalues = Reference(ws, min_col=i, min_row=1, max_row=ws.max_row)
series = Series(yvalues, xvalues, title_from_data=True)
chart.series.append(series)
# 作ったグラフをE5セルに追加
ws.add_chart(chart, "E5")
# エクセルファイルを保存
wb.save(combined_file_path)
# これで処理完了!
print("処理が完了しました。")
おわりに
今回、化学研究者の定番の定型作業である、スペクトル生データの集約・グラフ描画を自動化するプログラムを例に、業務自動化を体感していただきました。
Python学習の初期は基礎文法が退屈で、Pythonで何ができるのかがイメージできないまま挫折する方がほとんどです。
本記事のサンプルプログラムによって、自動化の素晴らしさを実感したり、ご自身の業務に落とし込んだイメージが湧くようになれば幸いです。