Skip to content

Phase 4: データ取り込み(ドラッグ&ドロップ・貼り付け・シート・読込設定・日時軸・複数ファイル) - #4

Merged
mioupa merged 18 commits into
mainfrom
phase4-data
Oct 8, 2026
Merged

mioupa merged 18 commits into
mainfrom
phase4-data

Conversation

@mioupa

@mioupa mioupa commented Oct 8, 2026

Copy link
Copy Markdown
Owner

要件定義書9章の Phase 4(データ取り込み。D1–D6)を実装しました。あわせて、Phase 2 で決めた「X が数値でない列のときは ax.set_xscale("linear") を入れる」扱いを、D5(日時軸)に合わせて見直しています。

変更内容

ドラッグ&ドロップと貼り付け(D1)

  • ファイルはページ全体で受け付ける。ブラウザがファイルを開いてアプリから離れることもなくなった。データを読み込み済みのときは、「置き換えて読み込む」「追加して読み込む」のどちらにドロップするかで選ぶ。
  • Excel などでコピーした表は「表を貼り付け」欄(#pasteArea)に貼り付けて読み込む。データが無いときは、ページ上での Ctrl/Cmd+V でも読み込む。読込済みのときは、データを確認なしで置き換えないよう、欄に貼るよう案内する。
  • 貼り付けたデータは pasted_data.tsv というファイルとして扱う。生成コードはこのファイルを読み、「貼り付けたデータを保存」で同じ内容を保存できる(データはスクリプトに埋め込まない)。これに合わせて .tsv を対応する拡張子に加えた。

シートの選択(D2)

  • xlsx のシートを選べる(既定は先頭のシート)。切り替えたら、そのファイルだけを読み直す。開いた ExcelFile は同じファイルの間だけ使い回し、切り替えを速くした。
  • 生成コードには sheet_name="…" と、ファイル内のシートの一覧(コメント)を書く。

ヘッダより前の読み飛ばし行数(D3)

  • 「ヘッダより前に読み飛ばす行数」を「データ読み込み」の区分に置いた。「描画から除外する先頭行数」(「系列」の区分)とは、何を数えるかを補足で区別している。
  • 読み飛ばした行は、データ確認タブの表の上に枠で囲んで表示する(グレー表示とは別の見た目)。列数が揃わないエラーでは、この設定を案内する。

桁区切り・小数点・コメント記号(D4)

  • pandas の thousands / decimal / comment で読む。生成コードの読込部は、すべての読込引数を1行に1つ、既定値も含めて明記する形にした(loader と同じ引数の定義から作る)。
  • 1,234 などが数値に変換できずに除外されたときの警告に、「桁区切りをカンマに」などのヒントを添える。小数点と区切り文字が同じ記号のときと、区切り文字の指定漏れが疑われるとき(1列しか読めない)も警告する。

日時の列と日時軸(D5)

  • 年が先頭の書式(2026-01-31、2026/01/31 13:45、2026年1月31日、ISO 8601 のタイムゾーン付きなど)の列を、自動で日時と認識する。数値の列、A-001 のような ID、月日の順が曖昧な書式などは認識しない。読めない値は欠損にして警告する。Excel の日付セルは常に日時として扱う。
  • 生成コードの読込部に、書式を明記した pd.to_datetime(..., format=...) を書く。
  • X 軸は自動(AutoDateLocator と ConciseDateFormatter)か、指定した書式(DateFormatter。例 %m月%d日)。棒グラフでは日時を表示書式の文字列にして並べる。
  • Phase 2 の ax.set_xscale("linear") をやめた。 日時の列は日時軸にする(今までは Excel の日付が日数の数値で表示されていた)。それ以外の文字列の列は、目盛に値を出す(25個を超えるときは間引く)。

複数ファイル(D6)

  • 「+ ファイルを追加」、ドロップ、複数選択で、10 個まで読み込める。系列ごとに「データ元」を選ぶ(列は「データ元+列番号」で指定)。データ確認タブはファイルを切り替えて表示する。
  • 読込設定は全ファイル共通で、シートだけファイルごと。棒グラフは単一のデータ元のときだけ描ける。同じ名前のファイルは置き換えになる。
  • 生成コードは、1ファイルなら今までどおり DATA_FILE / df。2つ以上なら、使うファイルだけを DATA_FILE_1 / df1 … と書く。
  • 一部のファイルの読込に失敗しても、ほかのファイルは使える。

そのほか

  • 設定スキーマを v3 にした。v2 からの移行では、日時の自動認識を false にする(v2 までの出力を保つため)。
  • GUI 同期で、エラーのため最新の設定のコードを作れなかったときは、コードタブに「最新の設定を反映していません」と表示する。Phase 3 で保存設定について見つかった、コードが古いまま残る問題と同じ種類の漏れへの対策。
  • 区切り文字のエスケープの解釈で無視する警告を、DeprecationWarning(invalid escape sequence)だけに絞った(AGENTS.md §8)。
  • Phase 3 の手動確認の結果を AGENTS.md に記録した(Illustrator での PDF の文字の編集、Safari / Firefox の実機でのコピー)。

計測値(docs/PERFORMANCE.md「Phase 4 後」)

項目(ms、中央値) Phase 3 後 Phase 4 後 比較
コールド起動 3,564 3,605 同等
ウォーム起動 3,441 3,429 同等
初回ファイル読込 → 最初のプロット 177 178 同等
設定変更 → プロット更新(デバウンス込み) 471 465 同等
保存(PNG、300 dpi) 405 384 同等
初回 .xlsx 読込 → 最初のプロット 329 325 同等
編集モードでの実行 579 571 同等
貼り付け(10,000 行)→ 最初のプロット – 180 –
xlsx のシート切り替え → プロット更新 – 465 –
日時の列を含む 10,000 行の読込 → 最初のプロット – 238 –
同、X = 日時で設定変更 → プロット更新(5系列) – 478 –
2ファイルの読込 → 最初のプロット – 208 –

既存の項目で悪くなったものは無い。10,000 行 × 5 系列で設定変更から 1 秒以内という要件は、X が日時でも満たしている。

オーナーが決めたこと(2026-10-08。AGENTS.md §13.3、要件定義書 §2.4 に記録)

  • D6 を Phase 4 に含める(読込設定は共通、シートはファイルごと、棒グラフは単一のデータ元、同名は置き換え、上限 10)。
  • v2 からの移行では parseDates を false にする。貼り付けたデータは pasted_data.tsv として保存してもらい、.tsv を対応する拡張子に加える。
  • 文字列の X は目盛に値を出す(25個を超えたら間引く)。日時の X では、軸の対数と範囲の指定はエラーで案内する。
  • 最新でないコードをコードタブに表示する。
  • レビュー後の判断: 小数点と区切り文字が同じ記号のときはエラーではなく警告にした(引用符付きの "1,5" は読めるため)。ページ上の貼り付けは、読込済みのデータを置き換えない。最後のファイルを削除したら、画面を初期状態に戻す。

テスト

  • 単体テスト: 661 passed(uv run pytest)
  • E2E: 137 passed(uv run pytest tests/e2e)
  • 生成コードの一致確認に7ケースを追加した: xlsx の2枚目のシート、前置き行付き CSV、桁区切り・小数点カンマ、貼り付け、日時軸、xlsx の日時、2ファイル
  • loader と生成コードの読込部の結果が一致することを、新しいテストデータすべてについて assert_frame_equal で確認した
  • コード注入のテストを追加した(シート名、コメント記号、日時の書式、貼り付けたデータ、複数のファイル名)
  • 日時の端の値(年をまたぐ範囲、欠損、同じタイムゾーン・混在したタイムゾーン、90% の境界)をテストした
  • Safari と Firefox の実機での、ドラッグ&ドロップと貼り付け(自動テストは Chromium のみ)

注意点

  • 実フォントを jsDelivr から取得する E2E があり、インターネット接続が必要。E2E の全体は約 13 分かかる。

🤖 Generated with Claude Code

mioupa and others added 18 commits October 8, 2026 18:13
…hecks

_decode_escapes ignored every warning while decoding delimiter escapes.
Only the DeprecationWarning for invalid escape sequences is actually
raised there, so ignore just that one and document it in AGENTS.md §8.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…der and generated read section

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…note to the UI

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd consistency tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ted scripts

Adds string-date recognition (fixed year-first formats, 100-value sample and
90% rules, strip/UTC handling), column kinds in the load result, datetime X
handling in dataprep and codegen, and drops set_xscale("linear") for string X
in favour of category tick labels with thinning above 25 categories.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g) with E2E and consistency tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t 100 values

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rce resolution, per-source plan and generated read blocks

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ile list, preview switch, drop zones

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le loads

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… in skip-rows error

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…real loads, show batch notes once, keep series cards when columns are unchanged

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…m sticking when dragleave has no types

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@mioupa
mioupa merged commit 21c91df into main Oct 8, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant