# Скільки подій кожної години?
hourly = df.groupby('hour').size()
print("Активність по годинах:")
print(hourly)
# Пікова година
peak_hour = hourly.idxmax()
print(f"\nПікова година: {peak_hour}:00 ({hourly[peak_hour]} подій)")
# Чи є події в один і той самий час?
df['time_slot'] = df['timestamp'].dt.strftime('%H:%M')
# Які часові слоти повторюються?
recurring = df.groupby('time_slot').size()
recurring = recurring[recurring > 1].sort_values(ascending=False)
if len(recurring) > 0:
print("Повторювані часові слоти:")
print(recurring)
else:
print("Регулярних патернів не виявлено")
Аномальні інтервали
# Знаходимо незвично короткі або довгі інтервали
intervals = df_sorted['time_since_prev'].dropna()
# Порогові значення (можна налаштувати)
mean_interval = intervals.mean()
std_interval = intervals.std()
# Аномально короткі (< mean - 2*std)
short_threshold = mean_interval - 2 * std_interval
# Аномально довгі (> mean + 2*std)
long_threshold = mean_interval + 2 * std_interval
anomalies = df_sorted[
(df_sorted['time_since_prev'] < short_threshold) |
(df_sorted['time_since_prev'] > long_threshold)
]
print(f"Середній інтервал: {mean_interval}")
print(f"Аномально коротких: {len(anomalies[anomalies['time_since_prev'] < short_threshold])}")
print(f"Аномально довгих: {len(anomalies[anomalies['time_since_prev'] > long_threshold])}")
Практична задача
Повний аналіз часових патернів. Створи time_analysis.py:
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
# --- ЗАВАНТАЖЕННЯ ---
df = pd.read_csv('events.csv')
df['datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'])
df['hour'] = df['datetime'].dt.hour
print(f"Період: {df['datetime'].min()} — {df['datetime'].max()}")
print(f"Усього подій: {len(df)}")
# --- АНАЛІЗ ПО ГОДИНАХ ---
hourly = df.groupby('hour').size()
print(f"\nПікова година: {hourly.idxmax()}:00")
print(f"Найменша активність: {hourly.idxmin()}:00")
# --- АНАЛІЗ ПО ТИПАХ ---
print("\nПодії по типах та годинах:")
pivot = df.pivot_table(index='hour', columns='event_type', aggfunc='size', fill_value=0)
print(pivot)
# --- ІНТЕРВАЛИ ---
df_sorted = df.sort_values('datetime')
df_sorted['interval'] = df_sorted['datetime'].diff()
mean_int = df_sorted['interval'].mean()
print(f"\nСередній інтервал: {mean_int}")
# --- ГРАФІК ---
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# Гістограма по годинах
axes[0].bar(hourly.index, hourly.values, color='steelblue')
axes[0].set_xlabel('Година')
axes[0].set_ylabel('Кількість')
axes[0].set_title('Активність по годинах')
axes[0].set_xticks(range(0, 24, 2))
# Типи подій по годинах
pivot.plot(kind='bar', stacked=True, ax=axes[1], colormap='Set2')
axes[1].set_xlabel('Година')
axes[1].set_ylabel('Кількість')
axes[1].set_title('Типи подій по годинах')
axes[1].legend(title='Тип')
plt.tight_layout()
plt.savefig('time_analysis.png', dpi=150)
print("\nГрафіки збережено: time_analysis.png")
Якщо не працює
Помилка
Рішення
ValueError: time data does not match format
Формат дати не співпадає. Перевір strptime формат.
TypeError: unsupported operand for -
Один з операндів не datetime. Конвертуй через pd.to_datetime()
OutOfBoundsDatetime
Дата поза допустимим діапазоном (1677-2262). Перевір дані.
No module named 'matplotlib'
pip install matplotlib
Робота з AI
Є CSV з колонками: timestamp (формат YYYY-MM-DD HH:MM:SS), event_type, sector.
Напиши скрипт для аналізу часових патернів:
1. Розподіл подій по годинах та днях тижня
2. Теплова карта (години × дні)
3. Виявлення регулярних патернів (події в один час)
4. Пошук аномальних інтервалів (> 2 std від середнього)
5. Звіт у текстовий файл + графіки PNG
Українські підписи на графіках.
Чек-лист
☐
matplotlib встановлено
☐
Дати конвертуються в datetime
☐
Аналіз по годинах працює
☐
Інтервали розраховуються
☐
Графіки зберігаються в PNG
Самостійна практика
Ковзне середнє. Додай лінію тренду з rolling(7).mean()
Порівняння періодів. Порівняй активність: перша половина vs друга
Прогноз. На основі патернів спрогнозуй наступну пікову годину
Наступний урок
Урок 7: Текстовий аналіз та NLP
Аналіз тексту повідомлень, пошук ключових слів, класифікація.