

python のclassの書き方について質問させてください。

顧客の購入金額を集計し、その金額も基づいてランクを付与したく、クラスを作成（メソッドを２つ定義）してみました。メソッド１は想定通り動作しましたが、メソッド２の方が、どのように記述すればメソッドが実行できるか分からずにおります。（そもそもメソッドを分けない方がよいのか・・？）

※メソッド２では、メソッド１で返ってきた結果の”rev” 列に対して、適用したいと考えています。  
（結果は新しい列を作成して代入したい）

お気づきの点がありましたらアドバイスいただけますと幸いです。  
よろしくお願いいたします。

[code]

    # クラス定義
    class GetRank:
    　　# 初期化メソッドを定義
        def __init__(self, transaction_data, mst_customer):    
            self.transaction_data = transaction_data
            self.mst_customer = mst_customer
    
        # メソッド１：金額集計
        def summary(self):
            summary = self.transaction_data.groupby('cst_no', as_index=False).agg({'rev': 'sum'})
            return summary
    
        # メソッド２： 金額（rev）によって顧客ランク付与
        def rank(self, x):
            if 1 <= x <= 4999:
                return 'low'
            elif 5000 <= x <= 9999:
                return 'middle'
            elif x <= 10000:
                return 'high'
    
            cat_ord = ['low', 'middle', 'high']
    
    
    # クラスのインスタンス作成
    thisY = GetRank(trn_thisY, mst_cst_thisY)
    
    # メソッド１を実行
    s_thisY = thisY.summary()
    
    # メソッド２を実行
    ？？？？
    
[/code]


CC BY-SA 4.0
2022-02-15T08:25:15.680
86365
2022-02-15T10:06:07.180
47038
question
python
pythonのclassの書き方


質問に示されたソースコードでは、`int`や`float`のパラメータを指定して呼び出すと、パラメータの値によって `low`, `middle`,
`high` の文字列または `None` を返す単純な関数です。  
例えば以下のように：

[code]

    result = thisY.rank(1)
    print(result)
    # low が表示される
    
[/code]

質問のメソッド１を実行した結果が整数または浮動小数点数ならば、以下のように呼び出せば結果が得られるでしょう。

[code]

    result = thisY.rank(s_thisY)
    print(result)
    # s_thisY の値に応じたlow,middle,high,Noneのいずれかが表示される
    
[/code]

しかし文字列とか何かのオブジェクトをパラメータとして渡すとエラーになります。  
また、何の数値をパラメータとして渡しても、また何回呼び出しても、`thisY`オブジェクトには影響や変化はありません。

`（結果は新しい列を作成して代入したい）`ということの意味は、`thisY`オブジェクトは pandas の DataFrame
等を含んだ何かであり、`rank()`メソッドを呼び出すことでそのオブジェクトに列を増やしたいということでしょうか？

現在のソースコードにはそのような処理はありません。  
また何かそういう機能を追加しようとしても、どんなものをどのように処理してどのような結果を得たいか、についての情報が無いので助言や回答を得ることは難しいでしょう。  
それらの助言や回答が欲しいのならば、別の質問として新規に起こす方が良いでしょう。


CC BY-SA 4.0
2022-02-15T10:06:07.180
86368
2022-02-15T10:06:07.180
26370
86365
answer