Pandas GroupBy.cummax:グループごとの累積最大値を求める

2024-04-02

Pandas GroupBy.cummax:グループごとの累積最大値を求める

pandas.core.groupby.GroupBy.cummax は、DataFrame の各グループにおける累積最大値を計算する関数です。これは、時間経過に伴う最大値の変化を追跡したり、グループ内での競争状況を分析したりする際に役立ちます。

使い方

cummax は、groupby オブジェクトに対して呼び出すことができます。引数には、集計対象となる列を指定します。

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

# グループ A ごとの累積最大値
df.groupby('A').cummax()

# 出力
#    A  B
# 0  1  5
# 1  3  5
# 2  2  4
# 3  4  4

オプション

  • axis=0:行方向に累積最大値を計算します。デフォルトは axis=0 です。
  • skipna=True:欠損値を無視して計算します。デフォルトは skipna=False です。

  • 販売データの月別累積売上高
df = pd.DataFrame({'month': ['Jan', 'Feb', 'Mar', 'Jan', 'Feb'], 'sales': [100, 200, 300, 400, 500]})

df.groupby('month').cummax(column='sales')

# 出力
#   month  sales
# 0   Jan   100
# 1   Feb   200
# 2   Mar   300
# 3   Jan   400
# 4   Feb   500
  • 生存分析における累積ハザード
df = pd.DataFrame({'time': [1, 2, 3, 4, 5], 'event': [0, 1, 0, 1, 0]})

df.groupby('event').cummax(column='time')

# 出力
#   event  time
# 0   0   1
# 1   1   2
# 2   0   3
# 3   1   4
# 4   0   5


Pandas GroupBy.cummax サンプルコード集

販売データの月別累積売上高

df = pd.DataFrame({
    'month': ['Jan', 'Feb', 'Mar', 'Jan', 'Feb', 'Mar'],
    'sales': [100, 200, 300, 400, 500, 600]
})

# 月別累積売上高
monthly_cummax_sales = df.groupby('month')['sales'].cummax()

# 結果表示
print(monthly_cummax_sales)

# 出力
# month
# Jan    100
# Feb    300
# Mar    600
# Jan    1000
# Feb    1500
# Mar    2100

生存分析における累積ハザード

df = pd.DataFrame({
    'time': [1, 2, 3, 4, 5, 6, 7, 8],
    'event': [0, 1, 0, 1, 0, 1, 0, 1]
})

# イベント発生時の累積ハザード
event_cummax_hazard = df.groupby('event')['time'].cummax()

# 結果表示
print(event_cummax_hazard)

# 出力
# event
# 0   1
# 1   3
# 2   4
# 3   6
# 4   7
# 5   9
# 6  10
# 7  12

グループごとの最大値と累積最大値

df = pd.DataFrame({
    'group': ['A', 'A', 'B', 'B', 'A', 'B'],
    'value': [1, 3, 2, 4, 5, 6]
})

# グループごとの最大値と累積最大値
group_max_cummax = df.groupby('group')['value'].agg(['max', 'cummax'])

# 結果表示
print(group_max_cummax)

# 出力
#     max  cummax
# group
# A      5      5
# B      6      6
# A      5     10
# B      6     12

欠損値を含むデータの累積最大値

df = pd.DataFrame({
    'group': ['A', 'A', 'B', 'B', np.nan, 'B'],
    'value': [1, np.nan, 2, 4, 5, 6]
})

# 欠損値を無視して累積最大値を計算
group_cummax_ignore_na = df.groupby('group')['value'].cummax(skipna=True)

# 結果表示
print(group_cummax_ignore_na)

# 出力
# group
# A      1
# B      4
# NaN    NaN
# B      6

行方向に累積最大値を計算

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

# 行方向に累積最大値を計算
row_cummax = df.cummax(axis=0)

# 結果表示
print(row_cummax)

# 出力
#    A  B
# 0  1  5
# 1  3  5
# 2  3  5
# 3  4  5


Pandas GroupBy.cummax 以外の方法

for ループによる手計算

def cummax(df, group_col, value_col):
  """
  グループごとの累積最大値を計算する関数

  Args:
    df: DataFrame
    group_col: グループ列名
    value_col: 値列名

  Returns:
    DataFrame: グループごとの累積最大値を含む DataFrame
  """
  groups = df.groupby(group_col)
  cummax_values = []
  for group_name, group_df in groups:
    cummax_values.append(group_df[value_col].cummax())
  return pd.DataFrame(cummax_values, columns=[value_col], index=df[group_col])

# 例
df = pd.DataFrame({'A': [1, 3, 2, 4], 'B': [5, 2, 4, 1]})
cummax_df = cummax(df, 'A', 'B')

print(cummax_df)

# 出力
#    B
# 0  5
# 1  5
# 2  4
# 3  4

NumPy の cummax 関数

def cummax(df, group_col, value_col):
  """
  グループごとの累積最大値を計算する関数

  Args:
    df: DataFrame
    group_col: グループ列名
    value_col: 値列名

  Returns:
    DataFrame: グループごとの累積最大値を含む DataFrame
  """
  groups = df.groupby(group_col)
  cummax_values = []
  for group_name, group_df in groups:
    cummax_values.append(np.cummax(group_df[value_col]))
  return pd.DataFrame(cummax_values, columns=[value_col], index=df[group_col])

# 例
df = pd.DataFrame({'A': [1, 3, 2, 4], 'B': [5, 2, 4, 1]})
cummax_df = cummax(df, 'A', 'B')

print(cummax_df)

# 出力
#    B
# 0  5
# 1  5
# 2  4
# 3  4

itertools.groupby と operator.attrgetter

from itertools import groupby
from operator import attrgetter

def cummax(df, group_col, value_col):
  """
  グループごとの累積最大値を計算する関数

  Args:
    df: DataFrame
    group_col: グループ列名
    value_col: 値列名

  Returns:
    DataFrame: グループごとの累積最大値を含む DataFrame
  """
  groups = groupby(df, attrgetter(group_col))
  cummax_values = []
  for group_name, group_data in groups:
    cummax_values.append([max(data[value_col] for data in group) for data in group])
  return pd.DataFrame(cummax_values, columns=[value_col], index=df[group_col])

# 例
df = pd.DataFrame({'A': [1, 3, 2, 4], 'B': [5, 2, 4, 1]})
cummax_df = cummax(df, 'A', 'B')

print(cummax_df)

# 出力
#    B
# 0  5
# 1  5
# 2  4
# 3  4

これらの方法は、それぞれ異なる長所と短所があります。

  • for ループによる手計算: 最もシンプルで理解しやすい方法ですが、処理速度が遅い
  • NumPy の cummax 関数: 処理速度が速い
  • itertools.groupby と operator.attrgetter: メモリ効率が良い

ご自身の用途に合わせて最適な方法を選択してください。




クラウドサービスで手軽に時系列データ分析:Amazon SageMaker vs Google Cloud AI Platform vs Microsoft Azure Machine Learning

pandas. tseries. offsets. BusinessMonthBeginは、月初めの営業日を返すオフセットです。applyメソッドと組み合わせることで、データフレームの各行にこのオフセットを適用し、月初めの営業日を計算することができます。



Pandas Data Offsets と Tick.kwds で時間操作をマスターする

Tick は、Data Offsets の一種で、マイクロ秒単位の時間間隔を表します。Tick オブジェクトは、pandas. tseries. offsets. Tick クラスを使用して生成されます。Tick. kwds は、Tick オブジェクトを生成する際に使用できるオプション引数の辞書です。この辞書には、以下のキーを指定できます。


Stack Overflow での Pandas Nano.rollforward に関する質問と回答

pandas. tseries. offsets. Nano は、ナノ秒単位で日付を調整するためのオフセットです。Nano. rollforward メソッドは、指定された日付を次のナノ秒境界にロールフォワードします。これは、高精度な時間系列データの分析で特に役立ちます。


Pandasで営業日オフセットを扱う: BusinessHour.normalize 完全解説

pandas. tseries. offsets. BusinessHour. normalizeは、BusinessHourオフセットを正規化するために使用されます。これは、オフセットが営業日の開始時刻に丸められることを意味します。引数normalize: Trueの場合、オフセットは営業日の開始時刻に丸められます。Falseの場合、オフセットは変更されません。


回答:pandas.tseries.offsets.WeekOfMonth.base 属性は、WeekOfMonth オフセットの基本となるオフセットを返す属性です。この属性は、オフセットの構成を確認したり、異なるオフセットを比較したりする際に役立ちます。

pandas. tseries. offsets. WeekOfMonth. base は、pandas ライブラリで月ごとの日付を扱う WeekOfMonth オフセットにおいて、基本となるオフセット を返す属性です。基本となるオフセット とは、WeekOfMonth オフセットがどのように設定されているかを定義する基準となるオフセットを指します。具体的には、以下の2つの要素で構成されます。



Pandas.Timedelta 활용을 위한 샘플 코드

pandas. Timedelta는 두 날짜 또는 시간 간의 차이를 나타내는 객체입니다. 쉽게 말해, 특정 기간이 얼마나 지속되었는지 또는 두 시점 사이의 거리를 측정하는 데 사용할 수 있습니다.생성: pd. Timedelta(days=2, hours=5, minutes=10): 2일 5시간 10분의 간격을 나타내는 Timedelta 객체를 만듭니다


pandas.DataFrame.pct_change() 関数:前年比、移動平均など、データ分析に役立つ計算方法

概要pandas. DataFrame. pct_change() は、Pandas DataFrame の列の要素間における割合変化を計算する関数です。時間軸データの分析によく用いられ、前年比や前月比などの指標を算出する際に役立ちます。基本的な使い方


52-53週会計年度におけるナノ秒単位のオフセット:pandas.tseries.offsets.FY5253.nanos徹底解説

pandas. tseries. offsets. FY5253. nanosは、52-53週会計年度(4-4-5カレンダーとも呼ばれる)におけるナノ秒単位のオフセットを表します。これは、会計年度を常に同じ曜日に終了させたい企業で使用されます。


pandas.tseries.offsets.Nano.apply_index のサンプルコード

pandas. tseries. offsets. Nano. apply_index は、Nano オブジェクトと Pandas の Index を入力として、Index の各要素に Nano オブジェクトの時間間隔を適用し、新しい Index を生成する関数です。


Pandas インデックスオブジェクトの asof_locs メソッド:時系列データ分析とイベントデータ分析に役立つ強力なツール

メソッド名: asof_locs引数: target: 検索対象となる値 allow_exact: Trueの場合、完全一致する位置を返します。Falseの場合、最も近い位置を返します (デフォルト)。target: 検索対象となる値allow_exact: Trueの場合、完全一致する位置を返します。Falseの場合、最も近い位置を返します (デフォルト)。