今年食ったサバ缶をまとめるためのPythonスクリプト
はじまり


Pythonでtsvをまとめて記事にする。
僕は、個人的に日常的に食べているサバ缶をGoogleスプレッドシートに記録しています。そんな書き溜めてきたサバ缶のレビュー記事を楽に作ろうと思いました。
そこで、PythonのPandas等でデータを整理して、レビュー記事を出力するスクリプトを作る過程を紹介したいと思います。
ちなみに、2024年版のサバ缶のまとめの記事はこちらになります。

スプレッドシートにあるデータをtsvにする。
まずは、スプレッドシートにあるデータをtsvファイルにします。スプレッドシートからコピーしたデータをメモ帳に貼り付けると、基本的にはtsv形式で貼り付けられるので、そのままメモ帳の内容をtsvファイルとして保存します。

Google Colabで開発する。
今回のPythonの開発には、まずはGoogle Colabを使いました。Colabに先程保存したtsvファイルをアップロードします。

そして、Google Colab上にGeminiだかGemmaだか分かりませんが何かいるので、スクリプトを作ってもらいます。

Google Colabにいる生成AIは、tsvファイルの中身を全く確認していないようです。不整合な部分を自分で直します。

とりあえず動きそうです。

Pandasで整理する。
今回は、Pandasを使ってtsv形式のデータをデータフレームとして整理していきます。
そして、このように整理しました。dates.tsvにはmackerelのフィールドが最低限必要です。
# prompt: dates.tsvからmackerelの一覧を取得して、mackerels.tsvにある情報を付け加えて、サバ缶のレビュー記事を書きたい。from typing import Unionimport pandas as pd
# load data from dates.tsvdates_df = pd.read_csv("dates.tsv", sep="\t")
# load data from mackrels.tsvmackerels_df = pd.read_csv("mackerels.tsv", sep="\t")mackerels_df = mackerels_df.rename(columns={"No": "mackerel"})print(dates_df)print(mackerels_df)
# mackerelの情報を取得dates_df = dates_df.query("mackerel != 0")dates_df.drop_duplicates(subset="mackerel")dates_df.dropna(subset=["mackerel"], inplace=True)mackerel_info = pd.merge(dates_df, mackerels_df, on="mackerel", how="left")
# Create Heading 2def generate_h2(row: Union[pd.Series, pd.DataFrame]) -> str: """ Generates a level 2 heading for a mackerel review article.
:param row: A pandas Series containing the data for the review. It should have columns "number_for_article", "品名", and "メーカー". :type row: pd.Series :raises TypeError: if row is not a pd.Series :raises KeyError: if row is missing any of the required columns :returns: The level 2 heading string. :rtype: str
:Example: >>> generate_h2(pd.Series({'number_for_article': 1, '品名': 'サバ缶', 'メーカー': 'メーカーA'})) '## 1. サバ缶(メーカーA)' """ if not isinstance(row, pd.Series): raise TypeError("row must be a pandas Series") number_for_article = row["number_for_article"] name = row["品名"] brand = row["メーカー"] return f"## {number_for_article}. {name}({brand})"
# レビューを作成def generate_review(row: Union[pd.Series, pd.DataFrame]) -> str: """Generates a review article for canned mackerel.
:param row: Data used to create the review article. :type row: Union[pd.Series, pd.DataFrame] :raises TypeError: if row is not a pd.Series or pd.DataFrame :returns: The review article. :rtype: str
:Example: >>> generate_review(pd.Series({'date': '2023-10-27', 'name': 'Canned Mackerel', 'brand': 'Maker'})) '## 1. Canned Mackerel (Maker)\\n\\n![]()\\n\\nEaten on 2023-10-27, "Canned Mackerel" made by Maker.\\nThe fish is...\\n' """ if not isinstance(row, (pd.Series, pd.DataFrame)): raise TypeError("row must be a pandas Series or DataFrame") date = row["date"] name = row["品名"] brand = row["メーカー"] fish_category = row["魚種"] flavor = row["風味"] can_color = row["缶の色"] delicious = row["美味さ"] dha = row["DHA_content(mg)"] epa = row["EPA_content(mg)"] ease_of_open = "開けやすい" if row["開け易い"] else "開けにくい" comment = row["コメント"]
review = f"{date}に食べた{brand}製の「{name}」です。\n魚は{fish_category}で、{flavor}な風味と{can_color}の缶の色が特徴です。{delicious}で、缶は{ease_of_open}です。\nオメガ3脂肪酸の含有量の目安としては、DHAが{dha}mgで、EPAが{epa}mgでした。\n{comment}" h2 = row["h2"] image = "![]()" review = f"{h2}\n\n{image}\n\n{review}" return review
mackerel_info["number_for_article"] = range(1, len(mackerel_info.index) + 1)mackerel_info["h2"] = mackerel_info.apply(generate_h2, axis=1)mackerel_info["review"] = mackerel_info.apply(generate_review, axis=1)mackerel_info["md_item"] = mackerel_info.apply(generate_review, axis=1)
# 結果を出力print("micsellanious info of mackerel_info is the following...")print(mackerel_info[["number_for_article", "date", "name", "h2", "review"]])print("mackerel_info_image is the following...")print(mackerel_info["画像"])レビュー記事の内容をNotionに投稿する。
レビュー記事の内容が出来上がったら、次にその内容を簡単に貼り付けられるようにします。
Markdownのまま(Markdownの文字列)で貼り付けても、Heading 2の要素に出来なかったりするので、Notionの Append block children APIを使って全ての要素を貼り付けられるようにします。


そして、Notion から WordPress のエディタの方に貼り付けて下記の記事が出来上がりました。

まとめ
今回は、Googleスプレッドシート上にあるデータをtsvファイルにして、PythonとPandasでtsvデータを整理して、Notionのページに反映する処理を実装しました。
今回作った処理を完全に自動化して、月次の記事も作れるようにしてみたいですね。
おしまい


以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!