Skip to content

Commit 157ffd7

Browse files
committed
Docs: Fix Python deduplication and precision details, PostgreSQL WHERE and index plan context
1 parent 145df53 commit 157ffd7

2 files changed

Lines changed: 32 additions & 38 deletions

File tree

SQL/Leetcode/Basic select/1211. Queries Quality and Percentage/Claude Sonnet 4.6 Extended/Queries_Quality_and_Percentage_pandas.md

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ step5: 63 / 100 = 0.63 ✅
5656

5757
---
5858

59-
## 3) 修正版実装(指定シグネチャ厳守
59+
## 3) 参考実装(初期方針・非推奨
6060

61-
> **原則: `notna + copy → float 除算 → groupby.agg → ROUND_HALF_UP`**
61+
> **初期方針: 直感的な手順だがパフォーマンス面で非推奨**
6262
6363
```python
6464
# Analyze Complexity
@@ -108,7 +108,7 @@ def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
108108

109109
---
110110

111-
## 4) 修正前 vs 修正後 — 差分
111+
## 4) 修正前 vs 修正後(参考実装において) — 差分
112112

113113
```diff
114114
- agg["quality"] = agg["quality"].round(2)
@@ -120,7 +120,7 @@ def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
120120

121121
---
122122

123-
## 5) アルゴリズム説明
123+
## 5) アルゴリズム説明(参考実装)
124124

125125
| API / 手法 | 役割 |
126126
| ------------------------------------------- | ---------------------------------------------------- |
@@ -142,7 +142,7 @@ def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
142142

143143
---
144144

145-
## 6) 計算量(概算
145+
## 6) 計算量概算(参考実装
146146

147147
| 処理 | 計算量 | 備考 |
148148
| -------------- | -------- | -------------------------- |
@@ -154,7 +154,7 @@ def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
154154

155155
---
156156

157-
## 7) 図解Mermaid)
157+
## 7) 図解 Mermaid(参考実装
158158

159159
```mermaid
160160
flowchart TD
@@ -178,7 +178,7 @@ flowchart TD
178178

179179
---
180180

181-
## 8) 検証トレース(バグ再現 + 修正確認)
181+
## 8) 検証トレース(参考実装・バグ再現 + 修正確認)
182182

183183
```python
184184
# テストケース: quality = 0.625 (float64 で正確に表現される → 丸め方式の差が出る)
@@ -206,17 +206,11 @@ queries2 = pd.DataFrame({
206206
# Cat: poor_% = 1/3*100 = 33.33 ✅
207207
```
208208

209-
## 2) Pandas 2.2.2 — パフォーマンス改善版
209+
## 9) 最終提出版(最適化実装)
210210

211-
## 0) 前提2
211+
> **原則: `to_numpy()[mask] → float 除算 → groupby.mean() → ROUND_HALF_UP`**
212212
213-
- 環境: **Python 3.10.15 / pandas 2.2.2**
214-
- **指定シグネチャ厳守**(関数名 `queries_stats`・引数 `queries`・返却列・順序)
215-
- I/O 禁止、不要な `print``sort_values` 禁止
216-
217-
---
218-
219-
## 1) ボトルネック分析
213+
### ボトルネック分析
220214

221215
```
222216
Runtime 332ms / Beats 35.40%
@@ -246,7 +240,7 @@ df["poor"] = (df["rating"] < 3).astype("float64")
246240

247241
---
248242

249-
## 2) 改善戦略
243+
## 10) 改善戦略
250244

251245
| 戦略 | 手法 | 効果 |
252246
| ------------------------------------ | --------------------------------------------------- | ----------------------------- |
@@ -257,12 +251,12 @@ df["poor"] = (df["rating"] < 3).astype("float64")
257251

258252
```
259253
float32(0.07) = 0.07000000029802322... ← 精度落ちで丸めが狂う ❌
260-
float64(0.07) = 0.07000000000000000... ← 安全
254+
float64(0.07) 0.07000000000000000666... ← 近似ではあるが、本問の ROUND_HALF_UP(小数2桁丸め)には十分な精度を持ち実用上安全
261255
```
262256

263257
---
264258

265-
## 3) 最適化版実装
259+
## 11) 最適化版実装(指定シグネチャ厳守)
266260

267261
```python
268262
# Analyze Complexity
@@ -311,7 +305,7 @@ def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
311305

312306
---
313307

314-
## 4) 変更差分
308+
## 12) 変更差分(参考実装から最適化版へ)
315309

316310
```diff
317311
- df = queries[queries["query_name"].notna()].copy() # 全列コピー(result含む)
@@ -342,7 +336,7 @@ def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
342336

343337
---
344338

345-
## 5) アルゴリズム説明2
339+
## 13) アルゴリズム説明(最適化版)
346340

347341
| API / 手法 | 役割 | 最適化ポイント |
348342
| -------------------------- | ------------------------------- | ----------------------------- |
@@ -363,7 +357,7 @@ def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
363357

364358
---
365359

366-
## 6) 計算量
360+
## 14) 計算量(最適化版)
367361

368362
| 処理 | 計算量 | 備考 |
369363
| --------------------------- | -------- | -------------------------- |
@@ -375,7 +369,7 @@ def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
375369

376370
---
377371

378-
## 7) ベンチマーク(N=100,000行、500クエリ名)
372+
## 15) ベンチマーク(N=100,000行、500クエリ名)
379373

380374
```
381375
Runtime Peak Memory
@@ -389,7 +383,7 @@ final : 22.7 ms 7.97 MB ← result 列スキップ + copy=False
389383
390384
---
391385

392-
## 8) 図解Mermaid)
386+
## 16) 図解 Mermaid(最適化版
393387

394388
```mermaid
395389
flowchart TD
@@ -418,7 +412,7 @@ flowchart TD
418412

419413
---
420414

421-
## 9) 検証
415+
## 17) 検証
422416

423417
```python
424418
# 例題

SQL/Leetcode/Basic select/1211. Queries Quality and Percentage/Claude Sonnet 4.6 Extended/Queries_Quality_and_Percentage_postgresql.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ SELECT
4747
2
4848
) AS poor_query_percentage
4949
FROM Queries
50-
WHERE query_name IS NOT NULL -- NULLクエリ名は除外(重複行対策)
50+
WHERE query_name IS NOT NULL -- NULL値による独立したNULLグループの生成を防ぐためにNULLを除外する
5151
GROUP BY query_name;
5252
```
5353

@@ -108,23 +108,23 @@ GROUP BY g.query_name;
108108

109109
## 3) 要点解説
110110

111-
| ポイント | 詳細 |
112-
| ---------------------------------- | ------------------------------------------------------------------- |
113-
| **`rating::NUMERIC / position`** | `INT / INT` は整数除算になるため、`::NUMERIC` で明示キャスト |
114-
| **`FILTER (WHERE rating < 3)`** | PostgreSQL 独自の条件付き集計。`SUM(CASE WHEN...)` より高速・簡潔 |
115-
| **`AVG(is_poor) * 100.0`** | is_poor を 0/1 にすると `AVG = 割合``* 100` でパーセント変換 |
116-
| **`ROUND(..., 2)`** | `NUMERIC` 型に対して正確に小数2桁を保証(`FLOAT` は誤差あり) |
117-
| **`WHERE query_name IS NOT NULL`** | 重複行が許容されるテーブルのため、NULL の query_name を防御的に除外 |
111+
| ポイント | 詳細 |
112+
| ---------------------------------- | --------------------------------------------------------------------------------------- |
113+
| **`rating::NUMERIC / position`** | `INT / INT` は整数除算になるため、`::NUMERIC` で明示キャスト |
114+
| **`FILTER (WHERE rating < 3)`** | PostgreSQL 独自の条件付き集計。`SUM(CASE WHEN...)` より高速・簡潔 |
115+
| **`AVG(is_poor) * 100.0`** | is_poor を 0/1 にすると `AVG = 割合``* 100` でパーセント変換 |
116+
| **`ROUND(..., 2)`** | `NUMERIC` 型に対して正確に小数2桁を保証(`FLOAT` は誤差あり) |
117+
| **`WHERE query_name IS NOT NULL`** | 重複行ではなく、`GROUP BY` により独立したNULLグループが生成されるのを防ぐために除外する |
118118

119119
---
120120

121121
## 4) 計算量(概算)
122122

123-
| 処理 | 計算量 |
124-
| --------------------- | ------------------------------------------------------------------------------ |
125-
| フルスキャン | **O(N)**(N = Queries の総行数) |
126-
| GROUP BY ハッシュ集計 | **O(N)** 平均(ハッシュが収まる場合) |
127-
| インデックス利用時 | `query_name` に B-tree インデックスがあれば **Index Scan → O(N log N)** に近似 |
123+
| 処理 | 計算量 |
124+
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
125+
| フルスキャン | **O(N)**(N = Queries の総行数) |
126+
| GROUP BY ハッシュ集計 | **O(N)** 平均(ハッシュが収まる場合) |
127+
| インデックス利用時 | **実行計画依存**: `query_name` に B-tree インデックスがある場合、`work_mem``n_distinct` などの統計情報・コストモデルに基づき、**O(N)** (`HashAggregate`) または **O(N log N)** に近似 (`Index Scan` 経由の `GroupAggregate` / `SortAggregate`) のいずれかが選択されます。 |
128128

129129
---
130130

0 commit comments

Comments
 (0)