PDEP-1: 目的とガイドライン
- 作成日: 2022年8月3日
- ステータス: 承認済み
- ディスカッション: #47444, #51417
- 作成者: Marc Garcia, Noa Tamir
- 改訂版: 2
PDEPの定義、目的、範囲
PDEP (pandas enhancement proposal) は、PythonのPEPやNumPyのNEPと同様に、pandasにおける**主要な**変更提案です。
バグ修正や概念的に小さな変更(例:関数にパラメータを追加する)は、PDEPの範囲外です。PDEPは、すぐに明らかではなく、pandasコミュニティ全体が今後の変更の可能性を認識する必要がある変更に使用されるべきです。このような変更は、実装前に詳細なドキュメントが必要であり、多くの場合、コミュニティ内で大規模な議論につながります。
PDEPは、ユーザー向けの変更、内部的な変更、重要な議論に適しています。PDEPに値するトピックの例としては、APIの大幅な変更、動作の破壊的変更、pandasから別のリポジトリへのモジュールの移動、またはpandasブロックマネージャーのリファクタリングなどがあります。どの問題がPDEPプロセス全体を必要とするだけの範囲を持っているかを判断することは、常に容易ではありません。コアチーム間で十分なコンセンサスがあり、コミュニティへの影響が最小限の単純なAPI変更もあります。一方、問題が物議を醸す場合、つまり大規模な議論を生じた場合、議論を形式化し文書化して、より広いコミュニティが参加しやすくなるように、PDEPを開くことを提案できます。文脈として、PDEPであった可能性のある問題のリストを参照してください。
PDEPガイドライン
対象読者
PDEPは誰でも利用できる公開文書ですが、PDEPを作成する際に考慮すべき主な利害関係者は以下のとおりです。
- PDEPの承認または拒否に関する最終決定を行うコア開発チーム
- pandasおよび関連プロジェクトへのコントリビューターと経験豊富なユーザー。彼らのフィードバックは、すべての観点を考慮するために非常に奨励され、高く評価されています。
- より広いpandasコミュニティ、特に提案に関するフィードバックがある場合とない場合の両方を含むユーザー。彼らはプロジェクトの将来の方向性を理解する必要があります。
PDEP作成者
誰でもPDEPを提案できますが、コアメンバーは、コアコントリビューター以外による提案について助言するために関与する必要があります。コミュニティメンバーとしてPDEPを提出するには、issueでPDEPの概念を提案し、協力するpandasチームメンバーを見つけてください。彼らはPDEPプロセスについてアドバイスし、PDEPリポジトリに提出された際にはPDEPのアドバイザーとしてリストされる必要があります。
ワークフロー
PDEPの可能な状態は以下のとおりです。
- 議論中
- 承認済み
- 実装済み
- 拒否済み
次に、PDEPが従うことができるワークフローについて説明します。
PDEPの提出
PDEPを提案するには、`web/pdeps/`に新しいファイルを追加するPRを作成します。ファイルはマークダウンファイルで、`web/pdeps/0001.md`を期待される形式の参照として使用できます。
PDEPの初期ステータスは`Status: 議論中`になります。PDEPの準備が整い、コアチームの承認を得たら、`Status: 承認済み`に変更されます。
承認済みPDEP
PDEPは、提案が実装する価値があると判断された場合のみ、コア開発チームによって承認できます。決定は、pandasガバナンス文書に詳述されているプロセスに基づいて行われます。一般的に、PRがマージされる前に、複数の承認が必要です。そして、マージ時に`変更を要求する`レビューがあってはいけません。
PDEPが承認されると、期限のない完了タイムラインで、PDEPの実装に向けて任意の貢献を行うことができます。pandasへのコントリビューターが、異なる優先順位を持つ異なるソースから支払われたボランティアと開発者の混合であるため、pandasの開発は理解し予測するのが困難です。PDEPの実装に興味がある企業、機関、または個人、またはpandasのロードマップへの進捗状況を一般的に見たい場合は、コントリビューションページで支援方法を確認してください。
実装済みPDEP
PDEPが実装され、pandasのメインブランチで使用可能になると、そのステータスは`Status: 実装済み`に変更されます。これにより、PDEPがロードマップや将来の計画の一部ではなく、すでに発生した変更であることが視覚的にわかります。PDEP実装が利用可能な最初のpandasバージョンも、例として`Implemented: v2.0.0`を使用してPDEPヘッダーに含まれます。
拒否済みPDEP
最終的な決定が、その実装がプロジェクトの最善の利益にならない場合、PDEPは拒否される可能性があります。拒否されたPDEPは、承認されたPDEPと同じくらい役に立ちます。なぜなら、価値のある議論があり、pandasへの変更に関する決定が行われるからです。それらは`Status: 拒否済み`でマージされるため、何が議論され、議論の結果がどうなるかがわかります。PDEPは、例えば、下位互換性のない良いアイデアや、破壊的な変更が実装する価値がないと判断された場合など、さまざまな理由で拒否される可能性があります。
無効なPDEP
適切なドキュメントが含まれていない、範囲外である、またはその他の理由でコミュニティにとって役に立たない提出されたPDEPについては、拒否としてマージする代わりに、作成者との議論の後、PRが閉じられます。これは、承認されたPDEPと同じくらい良いドキュメントを含むべきである拒否されたPDEPのリストにノイズを追加しないためです。ただし、最終的な決定は変更を実装しないことでした。
PDEPの進化
ほとんどのPDEPは、承認された後も変更されることは想定されていません。変更に合意し、実装されると、PDEPは開発が行われた理由と議論の詳細を理解するためにのみ役立ちます。
しかし、いくつかのケースでは、PDEPを更新できます。たとえば、このPDEP(PDEP-1)のような手順またはポリシーを定義するPDEP。または、実装を試みた後、元のPDEPを無効にする新しい知識が得られ、変更が必要になった場合。元のPDEPに特定の変更を加える必要がある場合は、編集され、その`Revision: X`ラベルが1つ増え、`PDEP-N履歴`セクションにメモが追加されます。これにより、読者はPDEPが変更されたことを理解し、混乱を避けることができます。
文脈のための、PDEPであった可能性のある問題のリスト
潜在的なPDEPの明確な例
- 多くの既存のメソッドに新しいパラメータを追加するか、多くの場所で1つを非推奨にすること。例えば
- `numeric_only`の非推奨化(GH-28900)は多くのメソッドに影響を与え、PDEPであった可能性があります。
- 新しいデータ型を追加すると、データ型を処理する必要があるさまざまな場所に影響を与えます。そのような広範な影響には、PDEPが必要です。例えば
- `Categorical` (GH-7217, GH-8074)、`StringDtype` (GH-8640)、`ArrowDtype`
- 既存の動作における重要な(破壊的な)変更。例えば
- コピー/ビューの変更(GH-36195)
- プロジェクトに広範な影響を与える新しいPython機能のサポート。例えば
- pandas内の型付けのサポートと`pandas-stubs`の作成(GH-43197, GH-45253)
- 新しい必須依存関係。
- プロジェクトからモジュールを削除するか、別のリポジトリに分割すること
- あまり使用されていないI/Oコネクタを別々のリポジトリに移動する GH-28409
- コントリビューターのプロセスの重要な変更は、ユーザーに影響を与えませんが、コントリビューター間の構造化された議論から恩恵を受けます。例えば
- ビルドシステムをmesonに変更する(GH-49115)
境界線上の例
`DataFrame`や`Series`などのコア機能への小さな変更は、ユーザーに大きな影響を与える可能性があるため、常にPDEP候補として考慮する必要があります。しかし、他の機能における同じ種類の変更は、良いPDEP候補にはなりません。つまり、変更がどれほど小さくても、物議を醸す議論はPDEP候補です。より多くの注意と/または正式な意思決定プロセスが役立つかどうかを検討してください。以下は、私たちの意図を明確にするのに役立つと思われるいくつかの例です。
- APIの破壊的な変更、またはその議論は、PDEPである可能性があります。例えば
- `value_counts`の結果の名前変更(GH-49497)。範囲は最初はPDEPを正当化しませんが、後で破壊的な変更として実行するかどうか、または非推奨化で実行するかどうかについての議論が出てきます。これはPDEPプロセスから恩恵を受ける可能性があります。
- 既存のメソッドに新しいメソッドまたはパラメータを追加することは、通常、非コア機能の場合はPDEPを必要としません。例えば
- `dropna(percentage)`(GH-35299)と`Timestamp.normalize()`(GH-8794)の両方とも、PDEPを必要としませんでした。
- 一方、`DataFrame.assign()`はそうかもしれません。下位互換性の問題がない単一のメソッドですが、コア機能でもあり、議論は非常に目立つはずです。
- 単一のメソッドを非推奨にするか削除しても、ほとんどの場合、PDEPは必要ありません。
- つまり、`DataFrame.append`(GH-35407)は、PDEPの良い候補となるコア機能の非推奨化の例です。
- コアpandasメソッドのパラメータのデフォルト値を変更することは、もう1つの境界線上のケースです。例えば
- `DataFrame.groupby`と`Series.groupby`の`dropna`に対するこのような変更は、PDEPになる可能性があります。
- 新しいトップレベルモジュールや内部クラスの公開。例えば
- `pandas.api.typing`の追加(GH-48577)は比較的小さく、必ずしもPDEPを必要としません。