アウトプットの要件
すべてのExcelファイル
ゼロ数式エラー
- すべてのExcelモデルは、数式エラー(#REF!、#DIV/0!、#VALUE!、#N/A、#NAME?)がゼロの状態で提供される必要があります。
既存テンプレートの維持(テンプレート更新時)
- ファイルを変更する際は、既存の書式、スタイル、慣例を学習し、正確に一致させてください。
- 確立されたパターンを持つファイルに、標準化された書式を押し付けてはいけません。
- 既存のテンプレートの慣例が、これらのガイドラインよりも常に優先されます。
財務モデル
カラーコーディング基準
ユーザーまたは既存のテンプレートから特に指示がない限り
業界標準の色の慣例
- 青色テキスト(RGB: 0,0,255):ハードコードされた入力値、およびユーザーがシナリオごとに変更する数値
- 黒色テキスト(RGB: 0,0,0):すべての数式と計算
- 緑色テキスト(RGB: 0,128,0):同じワークブック内の他のワークシートからのリンク
- 赤色テキスト(RGB: 255,0,0):他のファイルへの外部リンク
- 黄色の背景(RGB: 255,255,0):注意が必要な主要な前提条件、または更新が必要なセル
数値書式設定基準
必須の書式ルール
- 年:テキスト文字列として書式設定(例:「2024」、'2,024'ではない)
- 通貨:$#,##0 書式を使用。ヘッダーに常に単位を明記(「収益($mm)」)
- ゼロ:すべてのゼロを「-」として表示する数値書式を使用(パーセンテージも含む。例:「$#,##0;($#,##0);-」)
- パーセンテージ:デフォルトで0.0%書式(小数点1桁)
- 倍率:バリュエーション倍率(EV/EBITDA、P/E)は 0.0x で書式設定
- 負の数:括弧を使用 (123)、マイナス記号 -123 は使用しない
数式構築ルール
前提条件の配置
- すべての前提条件(成長率、マージン、倍率など)は、別の前提条件セルに配置する
- 数式内ではハードコードされた値ではなく、セル参照を使用する
- 例:=B51.05 ではなく =B5(1+$B$6) を使用
数式エラー防止
- すべてのセル参照が正しいことを確認する
- 範囲のオフバイワンエラーをチェックする
- すべての予測期間で数式が一貫していることを確認する
- エッジケース(ゼロ値、負の数)でテストする
- 意図しない循環参照がないことを確認する
ハードコード値のドキュメント化要件
- セル内またはセルの隣(表の末尾の場合)にコメントを付ける。書式:「出典:[システム/文書]、[日付]、[具体的な参照]、[該当する場合はURL]」
- 例:
- 「出典:Company 10-K、FY2024、45ページ、収益注記、[SEC EDGAR URL]」
- 「出典:Company 10-Q、Q2 2025、別紙99.1、[SEC EDGAR URL]」
- 「出典:Bloomberg Terminal、2025/8/15、AAPL US Equity」
- 「出典:FactSet、2025/8/20、コンセンサス推計画面」
XLSXの作成、編集、分析
概要
ユーザーから.xlsxファイルの作成、編集、または内容の分析を依頼される場合があります。タスクごとに利用可能な異なるツールとワークフローがあります。
重要な要件
数式再計算にはLibreOfficeが必要:LibreOfficeがインストールされており、recalc.pyスクリプトを使用して数式値を再計算できることを前提としています。このスクリプトは初回実行時に自動的にLibreOfficeを設定します
データの読み取りと分析
pandasを使用したデータ分析
データ分析、可視化、および基本操作には、強力なデータ操作機能を提供するpandasを使用します。
import pandas as pd
# Excelを読み込む
df = pd.read_excel('file.xlsx') # デフォルト:最初のシート
all_sheets = pd.read_excel('file.xlsx', sheet_name=None) # すべてのシートを辞書として取得
# 分析
df.head() # データの先頭を表示
df.info() # 列情報を表示
df.describe() # 基本統計量を表示
# Excelに書き出す
df.to_excel('output.xlsx', index=False)
Excelファイルのワークフロー
重要:数式を使用し、値をハードコードしない
Pythonで値を計算してハードコードするのではなく、常にExcelの数式を使用してください。 これにより、スプレッドシートが動的で更新可能な状態を維持できます。
❌ 誤り - 計算値をハードコード
# 悪い例:Pythonで計算して結果をハードコード
total = df['Sales'].sum()
sheet['B10'] = total # 5000をハードコード
# 悪い例:成長率をPythonで計算
growth = (df.iloc[-1]['Revenue'] - df.iloc[0]['Revenue']) / df.iloc[0]['Revenue']
sheet['C5'] = growth # 0.15をハードコード
# 悪い例:平均をPythonで計算
avg = sum(values) / len(values)
sheet['D20'] = avg # 42.5をハードコード
✅ 正しい - Excel数式を使用
# 良い例:Excelに合計を計算させる
sheet['B10'] = '=SUM(B2:B9)'
# 良い例:成長率をExcel数式として
sheet['C5'] = '=(C4-C2)/C2'
# 良い例:平均をExcel関数を使用
sheet['D20'] = '=AVERAGE(D2:D19)'
これは、合計、パーセンテージ、比率、差異など、すべての計算に適用されます。ソースデータが変更されたときにスプレッドシートが再計算できる必要があります。
一般的なワークフロー
- ツールを選択:データにはpandas、数式/書式設定にはopenpyxl
- 作成/読み込み:新しいワークブックを作成するか、既存のファイルを読み込む
- 変更:データ、数式、書式を追加/編集する
- 保存:ファイルに書き出す
- 数式を再計算(数式を使用する場合は必須):recalc.pyスクリプトを使用する
python recalc.py output.xlsx - エラーを確認して修正する:
- スクリプトはエラーの詳細を含むJSONを返します
statusがerrors_foundの場合、error_summaryで特定のエラーの種類と場所を確認します- 特定されたエラーを修正し、再度再計算します
- 修正すべき一般的なエラー:
#REF!:無効なセル参照#DIV/0!:ゼロによる除算#VALUE!:数式内のデータ型の誤り#NAME?:認識されない数式名
新しいExcelファイルの作成
# 数式と書式設定にはopenpyxlを使用
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
sheet = wb.active
# データを追加
sheet['A1'] = 'Hello'
sheet['B1'] = 'World'
sheet.append(['Row', 'of', 'data'])
# 数式を追加
sheet['B2'] = '=SUM(A1:A10)'
# 書式設定
sheet['A1'].font = Font(bold=True, color='FF0000')
sheet['A1'].fill = PatternFill('solid', start_color='FFFF00')
sheet['A1'].alignment = Alignment(horizontal='center')
# 列幅
sheet.column_dimensions['A'].width = 20
wb.save('output.xlsx')
既存のExcelファイルの編集
# 数式と書式を維持するにはopenpyxlを使用
from openpyxl import load_workbook
# 既存のファイルを読み込む
wb = load_workbook('existing.xlsx')
sheet = wb.active # または特定のシートの場合は wb['SheetName']
# 複数のシートを操作
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
print(f"Sheet: {sheet_name}")
# セルを変更
sheet['A1'] = 'New Value'
sheet.insert_rows(2) # 2行目に行を挿入
sheet.delete_cols(3) # 3列目を削除
# 新しいシートを追加
new_sheet = wb.create_sheet('NewSheet')
new_sheet['A1'] = 'Data'
wb.save('modified.xlsx')
数式の再計算
openpyxlで作成または変更されたExcelファイルには、数式が文字列として含まれていますが、計算値は含まれていません。提供されているrecalc.pyスクリプトを使用して数式を再計算します。
python recalc.py <excel_file> [timeout_seconds]
例:
python recalc.py output.xlsx 30
スクリプトは:
- 初回実行時に自動的にLibreOfficeマクロを設定します
- すべてのシートのすべての数式を再計算します
- Excelエラー(#REF!、#DIV/0!など)がないかすべてのセルをスキャンします
- エラーの場所と件数の詳細を含むJSONを返します
- LinuxとmacOSの両方で動作します
数式確認チェックリスト
数式が正しく機能することを確認するためのクイックチェック:
必須の確認事項
- 2~3のサンプル参照をテスト:本モデルを構築する前に、正しい値を取得していることを確認する
- 列マッピングの確認:Excelの列が一致することを確認する(例:64列目 = BL、BKではない)
- 行オフセット:Excelの行は1から始まることに注意(DataFrameの行5 = Excelの行6)
よくある落とし穴
- NaN処理:
pd.notna()でnull値を確認する - 右端の列:FYデータは多くの場合50列目以降にある
- 複数の一致:最初の出現だけでなく、すべての出現を検索する
- ゼロによる除算:数式で
/を使用する前に分母を確認する(#DIV/0!) - 誤った参照:すべてのセル参照が意図したセルを指していることを確認する(#REF!)
- シート間参照:シートをリンクするには正しい書式(Sheet1!A1)を使用する
数式テスト戦略
- 小さく始める:広く適用する前に、2~3個のセルで数式をテストする
- 依存関係を確認する:数式で参照されているすべてのセルが存在することを確認する
- エッジケースをテストする:ゼロ、負の値、非常に大きな値を含める
recalc.py出力の解釈
スクリプトはエラーの詳細を含むJSONを返します:
{
"status": "success",
"total_errors": 0,
"total_formulas": 42,
"error_summary": {
"#REF!": {
"count": 2,
"locations": ["Sheet1!B5", "Sheet1!C10"]
}
}
}
ベストプラクティス
ライブラリの選択
- pandas:データ分析、一括操作、単純なデータエクスポートに最適
- openpyxl:複雑な書式設定、数式、Excel固有の機能に最適
openpyxlの操作
- セルインデックスは1から始まります(row=1、column=1はセルA1を参照)
- 計算値を読み取るには
data_only=Trueを使用:load_workbook('file.xlsx', data_only=True) - 警告:
data_only=Trueで開いて保存すると、数式は値に置き換えられ、完全に失われます - 大規模なファイルの場合:読み取りには
read_only=True、書き込みにはwrite_only=Trueを使用 - 数式は保持されますが評価されません - 値を更新するにはrecalc.pyを使用してください
pandasの操作
- データ型を指定して推論の問題を回避:
pd.read_excel('file.xlsx', dtype={'id': str}) - 大規模なファイルの場合、特定の列のみを読み取り:
pd.read_excel('file.xlsx', usecols=['A', 'C', 'E']) - 日付を適切に処理:
pd.read_excel('file.xlsx', parse_dates=['date_column'])
コードスタイルガイドライン
重要:Excel操作用のPythonコードを生成する場合:
- 不要なコメントなしで、最小限で簡潔なPythonコードを記述する
- 冗長な変数名や不必要な操作を避ける
- 不要なprint文を避ける
Excelファイル自体については:
- 複雑な数式や重要な前提条件があるセルにコメントを追加する
- ハードコードされた値のデータソースを文書化する
- 主要な計算やモデルセクションに関する注記を含める