2017-09-20 20 views
1

パンダSeriesDataFramesに新しいメソッドと属性を追加したいと思います。ここでは非常に単純化した例である:Python pandas:サブクラスシリーズとデータフレーム

:私は、行と前のものとの違いは、ここで

1ない時間数をカウントする方法は、私はパンダのオブジェクトをサブクラス化により、これまで持っていたものである必要

import pandas as pd 

class Serie(pd.Series): 

    def gaps(self): 
     return (self.diff().fillna(1) != 1).sum() 

class DataSet(pd.DataFrame): 

    _constructor_sliced = Serie 

しかしthis answerに基づいて、私が代わりにこれを行うことができますようだ:

def gaps(self): 
    return (self.diff().fillna(1) != 1).sum() 

pd.Series.gaps = gaps 

同様にうまく動作するようです!

In[1]: df = pd.DataFrame({'A':[1,2,4], 'B':[3,2,1]}) 
In[2]: df.A.gaps() 
Out[2]: 1 

ここで、そのような状況のベストプラクティスは何ですか? 2番目のオプションは、サブクラス化よりもはるかに簡単ですが、私は何かを見逃しているかもしれません...それは警告がありますか?あるいは、私が忘れた他の選択肢があります。

答えて

0

非常に簡単な解決策は、あまりにも自分のgaps機能のような機能を使用しますが、「セリエ」と「自己」の名前を変更することになります。

def gaps(serie): 
    return (serie.diff().fillna(1) != 1).sum() 

それは懸念きれいに分離(パンダコード対あなたのコード)を保持します。

読みやすくなっています。どのように動作するかを理解するために多くのことを理解する必要はありません。それは単なる単純です。

あなたのチームのデベロッパーは、ファンダスシリーズのドキュメントでgap()のドキュメントを検索して見つけようとしないで、数時間後に誰か(あなた)のサルがそれをパッチした。

これは最短の解決方法です。

_constructor_slicedのような "private"メンバーの使用は避けられます。この名前は将来変更され、実装が中断される可能性があります。

今後の競合を避ける:次のリリースのpandasでは、Seriesオブジェクトにgapメソッドが含まれていますか?それは直接壊れることはありませんが、私はあなたのチームの開発者を傷つけ、 "よく知られている.gap()"を使い、 "変更した"ことを認識せず、ドキュメントに従って作業してください。

関連する問題