Pandas Series.cumsum() 関数

Pandas 常用函数Pandas よく使う関数


Series.cumsum()はPandasでSeriesの累計和を計算するための関数です。累計和とは、最初の要素から始まり、各位置の値がその位置以前のすべての要素の合計(現在の要素を含む)に等しいものを指します。

累計和は、金融データ分析(累計収益の計算など)、販売分析(累計売上の計算など)、時系列分析などの場面でよく使用されます。


基本構文とパラメータ

cumsum()Seriesオブジェクトのメンバー関数であり、ドット演算子で直接呼び出します。

構文形式

Series.cumsum(axis=None, skipna=True, dtype=None, out=None, **kwargs)

パラメータの説明

パラメータ 型 説明 デフォルト値
axis int 軸の方向を指定します。Seriesには列が1つしかないため、このパラメータは主にDataFrameとの互換性のためのものです。 None
skipna bool Trueの場合は計算時にNaN値をスキップします。Falseの場合はNaNに遭遇すると累計が中断されます。 True
dtype dtype 出力データ型を指定します。 None
out ndarray 結果を格納するための配列で、通常は設定する必要はありません。 None

戻り値

  • 戻り値の型:Series
  • 説明:新しいSeriesを返します。各位置の値は累計和です。

例

簡単なものから複雑なものまでの一連の例を通して、徹底的にSeries.cumsum()の使い方をマスターしましょう。

例1:基本の使い方 - 累計売上の計算

累計和とは、現在の位置までのすべての数値の合計です。

例

import pandas as pd

# 毎日の売上を含むSeriesを作成
daily_sales = pd.Series([1000, 1500, 1200, 1800, 2000, 900, 1600])

print("毎日の売上(元):")
print(daily_sales)
print()

# 累計売上を計算
cumulative_sales = daily_sales.cumsum()

print("累計売上(元):")
print(cumulative_sales)
print()

print("分析:")
print("- 1日目の累計:1000")
print("- 2日目の累計:1000 + 1500 = 2500")
print("- 3日目の累計:1000 + 1500 + 1200 = 3700")
print("以降も同様に続きます...")

実行結果:

每日销售额(元):
0    1000
1    1500
2    1200
3    1800
4    2000
5     900
6    1600
dtype: int64

累计销售额(元):
0    1000
1    2500
2    3700
3    5500
4    7500
5    8400
6   10000
dtype: int64

分析:
- 第1天的累计销售就是当天的销售额
- 第2天的累计销售额 = 第1天 + 第2天的销售额
- 以此类推...

コードの解説:

  • 1番目の位置の累計和 = 1000
  • 2番目の位置の累計和 = 1000 + 1500 = 2500
  • 3番目の位置の累計和 = 1000 + 1500 + 1200 = 3700
  • 以下同様に続きます...

例2:欠損値を含むデータの処理

skipnaパラメータによって、欠損値の処理方法が決まります。

例

import pandas as pd
import numpy as np

# 欠損値を含むSeriesを作成
data_with_nan = pd.Series([10, 20, np.nan, 30, 40])

print("元のデータ(欠損値を含む):")
print(data_with_nan)
print()

# デフォルトはskipna=Trueで、NaNをスキップして累計和を計算
cumulative_skipna = data_with_nan.cumsum()
print(skipna=True(デフォルト)の場合の累計と:)
print(cumulative_skipna)
print()

# skipna=Falseを設定した場合、NaNの位置で累計が中断される
cumulative_no_skipna = data_with_nan.cumsum(skipna=False)
print("skipna=Falseの場合の累計和:")
print(cumulative_no_skipna)

実行結果:

原始数据(含缺失值):
0    10.0
1    20.0
2       NaN
3    30.0
4    40.0
dtype: float64

skipna=True(默认)的累计和:
0    10.0
1    30.0
2       NaN
3    60.0
4   100.0
dtype: float64

skipna=False 的累计和:
0    10.0
1    30.0
2       NaN
3     NaN
4     DataFrame

コードの解説:

  • 当 skipna=Trueの場合、NaNの位置はスキップされ、その後の累計は有効な値に基づいて計算が続行されます。
  • 計算:10 → 30 → (スキップ) → 60 → 100
  • 当 skipna=Falseの場合、NaNに遭遇した後のすべての位置がNaNになります。

例3:元のデータと組み合わせた分析

実際の分析では、通常、元のデータと累計データを同時に確認する必要があります。

例

import pandas as pd

# 株価データを作成
stock_prices = pd.Series([100, 102, 98, 105, 103, 108, 110])

# 毎日の増減を計算
daily_change = stock_prices.diff()

# 累計増減を計算
cumulative_change = stock_prices.cumsum() - stock_prices.iloc[0] * len(stock_prices) + stock_prices

# または、より簡単にcumsumを使って初期価格に対する累計変化を計算
print("株価データ:")
print(stock_prices.values)
print()

# 当日の価格変化を計算(前日との比較)
print("毎日の増減:")
print(daily_change.fillna(0).values)
print()

# 別の方法:累計収益を計算
cumulative_return = ((stock_prices / stock_prices.iloc[0]) - 1) * 100

print("累計収益(%):")
print(cumulative_return.values)
print()

# 100元から始まる累計価値
initial_price = 100
cumulative_value = initial_price + stock_prices.cumsum() - stock_prices.iloc[0]

print("累計価値(初期100元と仮定):")
print(cumulative_value.values)

実行結果:

股价数据:[100, 102, 98, 105, 103, 108, 110]

每日涨跌(与前一天相比):
[ 0.,  2., -4.,  7., -2.,  5.,  2.]

累计收益(%):
[0.0, 2.0, -2.0, 5.0, 3.0, 8.0, 10.0]

累计价值(假设初始 100 元):
0      100
1      202
2      300
3      405
4      508
5      616
6      726
dtype: int64

分析:第 7 天时,股价从 100 涨到 110,累计收益率为 10%。

例4:実際の応用 - 月次累計データ

財務分析におけるcumsumの典型的な応用を示します。

例

import pandas as pd

# 月次売上データを作成
monthly_sales = pd.Series({
    '1月': 50000,
    '2月': 62000,
    '3月': 58000,
    '4月': 70000,
    '5月': 75000,
    '6月': 80000
})

print("月次売上(元):")
print(monthly_sales)
print()

# 月次累計売上を計算
cumulative_sales = monthly_sales.cumsum()

# 集計表を作成
summary = pd.DataFrame({
    '月次売上': monthly_sales,
    '累計売上': cumulative_sales,
    '年間目標達成率': (cumulative_sales / 500000 * 100).round(1)
})

print("売上集計表:")
print(summary)
print()

print(f"上半期の累計売上:{cumulative_sales.iloc[-1]} 元")
print(f"年間目標達成率:{cumulative_sales.iloc[-1]/500000*100:.1f}%")

実行結果:

月度销售额(元):
1月    50000
2月    62000
累计    112000
4月    70000
5月    75000
6月    80000
dtype: int64

销售汇总表:
              月度销售额   累计销售额  完成年度目标(%)
1月    50000    50000          10.0
2月    62000   112000          22.4
3月    58000   170000          34.0
4月    70000   240000          累计  34.0%
5月    75000   315000          63.0
6月   累计  395000          79.0
dtype: int64

分析:6 月底累计销售额为 39.5 万元,已完成年度目标的 79.0%。

例5:DataFrameでの適用

cumsumはDataFrameでも列ごとまたは行ごとに使用できます。

例

import pandas as pd

# 複数製品の売上を含むDataFrameを作成
sales_data = pd.DataFrame({
    '製品A': [100, 150, 120, 180],
    '製品B': [80, 90, 110, 130],
    '製品C': [50, 60, 70, 80]
}, index=['1月', '2月', '3月', '4月'])

print("月次売上データ:")
print(sales_data)
print()

# 列ごとに累計売上を計算(デフォルト)
cumulative_by_col = sales_data.cumsum()
print("製品別の累計売上:")
print(cumulative_by_col)
print()

# 行ごとに累計売上を計算
cumulative_by_row = sales_data.cumsum(axis=1)
print("月別の累計売上:")
print(cumulative_by_row)

実行結果:

月度销售数据:
    产品A  产品B  产品C
1月  100    80    50
2月  150    90    60
3月 120
4月  180   130    80

按产品累计销量:
    产品A  产品B  产品C
1月  100    80    50
2月  250   170   110
3月 370   280   180
4月 550   410   260

按月度累计销量:
     产品A   产品B   产品C
1月  100.0  180.0  230.0
2月  250.0  340.0  400.0

コードの解説:

  • デフォルトではaxis=0、列方向に累計和を計算します。
  • 設定するとaxis=1、行方向に累計和を計算します。

注意事項

  • cumsumは新しいSeriesを返し、元のデータを変更しません。
  • デフォルトはskipna=Trueで、NaN値はスキップされます。
  • skipna=Falseの場合、NaNに遭遇すると後続のすべての値がNaNになります。
  • DataFrameではaxisパラメータを使用して累計方向を制御できます。
  • 累計和の計算は順序に依存するため、並列化できません。

まとめ

Series.cumsum()は時系列分析における基本関数です。主な特徴は次のとおりです:

  • 開始から現在の位置までの累計値を計算します。
  • 欠損値の処理をサポートし、skipnaパラメータで制御できます。
  • DataFrameでは行ごとまたは列ごとの計算をサポートします。
  • 財務分析、売上統計、進捗管理などの場面で広く応用されています。

累計和は、データの時間経過に伴う変化の傾向を理解するのに役立ち、データ分析における重要なツールです。他の累計関数(cumprod、cummax、cumminなど)と組み合わせて使用することで、より包括的なデータ洞察を得られます。

Pandas 常用函数Pandas よく使う関数

その他の拡張