Pandas Series.cumsum() 関数
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("以降も同様に続きます...")
# 毎日の売上を含む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)
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)
# 株価データを作成
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}%")
# 月次売上データを作成
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)
# 複数製品の売上を含む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 よく使う関数