Функция Pandas Series.cumsum()
Часто используемые функции 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: Базовое использование — вычисление накопленных продаж
Накопленная сумма — это сумма всех значений до текущей позиции включительно.
Пример
# Создание 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 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: Совместный анализ с исходными данными
В практическом анализе часто необходимо одновременно просматривать как исходные данные, так и кумулятивные данные.
Пример
# Создание данных о ценах акций
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 в финансовом анализе.
Пример
# Создать данные о месячных продажах
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 по столбцам или по строкам.
Пример
# Создать 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) она может обеспечить более полное понимание данных.
Другие расширения