Функция Pandas Series.cumsum()

Pandas 常用函数Часто используемые функции Pandas


Series.cumsum()является функцией Pandas, используемой для вычисления кумулятивной суммы Series. Кумулятивная сумма означает, что начиная с первого элемента значение в каждой позиции равно сумме всех элементов до этой позиции (включая текущий элемент).

Кумулятивные суммы часто используются в анализе финансовых данных (например, при расчёте кумулятивной доходности), анализе продаж (например, при расчёте кумулятивного объёма продаж), анализе временных рядов и других сценариях.


Базовый синтаксис и параметры

cumsum()является методом объекта Series, вызываемым напрямую через оператор точка.

Синтаксис

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

Описание параметра

Параметр Type Описание Значение по умолчанию
axis int Задаёт ось; у Series только один столбец, поэтому этот параметр в основном предназначен для совместимости с DataFrame. Отсутствует
skipna bool Если True, значения NaN пропускаются при вычислении; если False, при обнаружении NaN кумулятивная сумма прерывается. True
dtype dtype Указывает тип выходных данных. Отсутствует
out ndarray Массив, используемый для хранения результата; обычно его не нужно задавать. Отсутствует

Возвращаемое значение

  • Тип возвращаемого значения:Series
  • Описание: Возвращает новый Series, где значение в каждой позиции — накопленная сумма.

Примеры

На серии примеров от простого к сложному давайте тщательно освоимSeries.cumsum()использование.

Пример 1: Базовое использование — вычисление накопленных продаж

Накопленная сумма — это сумма всех значений до текущей позиции включительно.

Пример

import pandas as pd

# Создание Series, содержащего ежедневные продажи
daily_sales = pd.Series([1000, 1500, 1200, 1800, 2000, 900, 1600])

print("Ежедневные продажи (yuan):")
print(daily_sales)
print()

# Вычисление накопленных продаж
cumulative_sales = daily_sales.cumsum()

print("Накопленные продажи (yuan):")
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Если установлено значение True, позиции NaN пропускаются, а последующие кумулятивные суммы продолжают вычисляться на основе допустимых значений.
  • Вычисление: 10 → 30 → (пропуск) → 60 → 100
  • Когдаskipna=FalseЕсли установлено значение 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 yuan
initial_price = 100
cumulative_value = initial_price + stock_prices.cumsum() - stock_prices.iloc[0]

print("Накопленная стоимость (при начальной сумме 100 yuan):")
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({
    'Январь': 50000,
    'Февраль': 62000,
    'Март': 58000,
    'Апрель': 70000,
    'Май': 75000,
    'Июнь': 80000
})

print("Месячные продажи (yuan):")
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]} yuan")
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=['Январь', 'Февраль', 'Март', 'Апрель'])

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

Другие расширения