- Home »

Функция cumsum в Numpy для Python: использование и примеры
Функция cumsum в Numpy — это один из тех инструментов, которые кажутся простыми на первый взгляд, но открывают массу возможностей для анализа данных и автоматизации задач. Если вы работаете с мониторингом серверов, анализом логов или автоматизацией процессов, то cumsum станет вашим верным спутником. Эта функция вычисляет кумулятивную сумму элементов массива, что особенно полезно для отслеживания накопительных метрик, анализа трендов и создания динамических дашбордов.
Что такое cumsum и как она работает?
Cumsum (cumulative sum) — это операция, которая для каждого элемента массива возвращает сумму всех предыдущих элементов включая текущий. Звучит просто, но практические применения впечатляют. Представьте, что вы анализируете нагрузку на сервер по часам — cumsum покажет вам общую накопленную нагрузку за период.
import numpy as np
# Простейший пример
arr = np.array([1, 2, 3, 4, 5])
result = np.cumsum(arr)
print(result) # [1 3 6 10 15]
# Для серверных метрик
cpu_usage = np.array([20, 35, 45, 30, 25]) # CPU usage по часам
total_usage = np.cumsum(cpu_usage)
print(total_usage) # [20 55 100 130 155]
Быстрая настройка и первые шаги
Для работы с cumsum вам понадобится установленный Numpy. Если работаете на VPS или выделенном сервере, процесс стандартный:
# Установка Numpy
pip install numpy
# Импорт в скрипт
import numpy as np
# Проверка версии
print(np.__version__)
Основные параметры функции cumsum:
- axis — по какой оси вычислять сумму (для многомерных массивов)
- dtype — тип данных результата
- out — массив для записи результата
Практические примеры и кейсы
Давайте рассмотрим реальные сценарии использования cumsum в серверном окружении:
Анализ логов и метрик
# Анализ трафика по дням
daily_traffic = np.array([1024, 2048, 1500, 3000, 2500]) # MB
cumulative_traffic = np.cumsum(daily_traffic)
print("Ежедневный трафик:", daily_traffic)
print("Накопительный трафик:", cumulative_traffic)
# Для поиска аномалий
threshold = 8000
if cumulative_traffic[-1] > threshold:
print("Превышен лимит трафика!")
Мониторинг ресурсов
# Отслеживание использования памяти
memory_usage = np.array([512, 256, 128, 1024, 768]) # MB
cumulative_memory = np.cumsum(memory_usage)
# Создание отчета
for i, (daily, total) in enumerate(zip(memory_usage, cumulative_memory)):
print(f"День {i+1}: {daily}MB (+{total}MB всего)")
Работа с многомерными данными
# Матрица серверных метрик (строки - серверы, столбцы - часы)
server_metrics = np.array([
[10, 20, 30, 15], # Server 1
[25, 15, 40, 20], # Server 2
[30, 25, 35, 25] # Server 3
])
# Накопительная сумма по времени (axis=1)
time_cumsum = np.cumsum(server_metrics, axis=1)
print("Накопительная нагрузка по времени:")
print(time_cumsum)
# Накопительная сумма по серверам (axis=0)
server_cumsum = np.cumsum(server_metrics, axis=0)
print("Накопительная нагрузка по серверам:")
print(server_cumsum)
Сравнение с альтернативными подходами
Метод | Производительность | Простота | Функциональность |
---|---|---|---|
np.cumsum() | Высокая | Очень простая | Базовая кумулятивная сумма |
pandas.cumsum() | Средняя | Простая | Работа с временными рядами |
Циклы Python | Низкая | Сложная | Полная кастомизация |
SQL SUM() OVER() | Зависит от БД | Средняя | Работа с базами данных |
Интеграция с другими пакетами
Cumsum отлично работает в связке с другими инструментами:
# С matplotlib для визуализации
import matplotlib.pyplot as plt
data = np.array([100, 150, 200, 120, 180])
cumulative_data = np.cumsum(data)
plt.plot(data, label='Ежедневные значения')
plt.plot(cumulative_data, label='Накопительные значения')
plt.legend()
plt.show()
# С pandas для временных рядов
import pandas as pd
dates = pd.date_range('2024-01-01', periods=5, freq='D')
df = pd.DataFrame({'values': data, 'cumsum': cumulative_data}, index=dates)
print(df)
Нестандартные способы использования
Вот несколько творческих применений cumsum:
Создание весовых коэффициентов
# Генерация весов для балансировки нагрузки
weights = np.array([0.1, 0.2, 0.3, 0.4])
cumulative_weights = np.cumsum(weights)
print("Кумулятивные веса для round-robin:", cumulative_weights)
Поиск индексов по пороговым значениям
# Поиск момента превышения лимита
limits = np.array([100, 150, 200, 300, 250])
cumulative_limits = np.cumsum(limits)
threshold = 500
# Первый индекс, где превышен порог
exceeding_index = np.where(cumulative_limits > threshold)[0]
if len(exceeding_index) > 0:
print(f"Лимит превышен на позиции: {exceeding_index[0]}")
Анализ скользящих окон
# Эффективное вычисление скользящих сумм
def rolling_sum(arr, window):
# Добавляем нули в начало для удобства
padded = np.concatenate([[0], arr])
cumsum_arr = np.cumsum(padded)
# Вычисляем скользящую сумму
rolling = cumsum_arr[window:] - cumsum_arr[:-window]
return rolling
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
window_size = 3
result = rolling_sum(data, window_size)
print("Скользящая сумма:", result)
Автоматизация и скрипты
Cumsum открывает новые возможности для автоматизации:
# Скрипт для мониторинга дискового пространства
import subprocess
import numpy as np
from datetime import datetime
def monitor_disk_usage():
# Получение данных о диске (пример для Linux)
result = subprocess.run(['df', '-h'], capture_output=True, text=True)
# Парсинг и анализ (упрощенный пример)
usage_data = np.array([80, 85, 90, 88, 92]) # Процент использования
cumulative_growth = np.cumsum(np.diff(usage_data))
if cumulative_growth[-1] > 20:
print("Внимание: быстрый рост использования диска!")
return True
return False
# Запуск мониторинга
if monitor_disk_usage():
# Отправка уведомления или выполнение действий
pass
Оптимизация производительности
Несколько советов для эффективного использования cumsum:
- Указывайте dtype заранее — избегайте лишних преобразований типов
- Используйте out параметр — для экономии памяти при больших массивах
- Работайте с подходящими типами данных — int64 для больших чисел, float32 для экономии памяти
# Оптимизированный пример
large_array = np.random.randint(0, 100, size=1000000)
result = np.empty_like(large_array, dtype=np.int64)
# Использование out для экономии памяти
np.cumsum(large_array, out=result, dtype=np.int64)
Обработка ошибок и крайних случаев
Важно учитывать потенциальные проблемы:
# Обработка пустых массивов
def safe_cumsum(arr):
if len(arr) == 0:
return np.array([])
# Проверка на переполнение
if arr.dtype == np.int32 and np.max(arr) > 1000000:
print("Внимание: возможно переполнение, используем int64")
arr = arr.astype(np.int64)
return np.cumsum(arr)
# Пример использования
test_array = np.array([999999999, 999999999], dtype=np.int32)
result = safe_cumsum(test_array)
print(result)
Интеграция с мониторингом и логированием
Cumsum отлично подходит для интеграции с системами мониторинга:
# Пример для интеграции с логированием
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def analyze_server_metrics(metrics):
cumulative = np.cumsum(metrics)
# Логирование результатов
logger.info(f"Текущие метрики: {metrics}")
logger.info(f"Накопительные метрики: {cumulative}")
# Проверка аномалий
if cumulative[-1] > np.mean(cumulative) * 2:
logger.warning("Обнаружена аномалия в метриках!")
return cumulative
Заключение и рекомендации
Функция cumsum в Numpy — это мощный инструмент для анализа накопительных данных, который должен быть в арсенале каждого системного администратора и DevOps-инженера. Она особенно полезна для:
- Мониторинга серверных ресурсов — отслеживание накопительного использования CPU, памяти, диска
- Анализа логов — поиск трендов и аномалий в данных
- Автоматизации процессов — создание интеллектуальных скриптов для управления инфраструктурой
- Построения дашбордов — визуализация динамики изменения метрик
Рекомендую использовать cumsum в связке с другими инструментами экосистемы Python — pandas для временных рядов, matplotlib для визуализации, и интегрировать в системы мониторинга типа Prometheus или Grafana. Помните о производительности при работе с большими массивами данных и всегда учитывайте типы данных для избежания переполнения.
Полная документация доступна на официальном сайте Numpy.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.