/
Nick_Wern
/
Kursovaya1
Обзор
Документация
Войти
/
Nick_Wern
/
Kursovaya1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/script2.py
127 строк
6 KB
NickWern
upload
09 июн 2026, 10:10
09 июн 2026, 10:10
63300c2
Код
Авторство
О чём код?
import json import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # Настройка стиля sns.set_style("whitegrid") plt.rcParams['figure.figsize'] = (10, 6) # 1. Загрузка данных (укажите путь к вашему JSON-файлу) with open('datasets/dataset2/train.json', 'r', encoding='utf-8') as f: data = json.load(f) # 2. Извлечение информации video_ids = [] durations = [] num_events = [] event_lengths = [] sentence_lengths = [] coverage_ratios = [] overlap_count = 0 for video_id, video_info in data.items(): duration = video_info['duration'] timestamps = video_info['timestamps'] # список списков [start, end] sentences = video_info['sentences'] # список строк video_ids.append(video_id) durations.append(duration) num_events.append(len(timestamps)) # Обработка каждого события for (start, end), sent in zip(timestamps, sentences): event_len = end - start event_lengths.append(event_len) sent_len = len(sent.split()) sentence_lengths.append(sent_len) # Покрытие видео событиями total_event_dur = sum(end - start for start, end in timestamps) coverage = total_event_dur / duration if duration > 0 else 0 coverage_ratios.append(coverage) # Поиск перекрывающихся событий overlap_found = False for i in range(len(timestamps)): for j in range(i+1, len(timestamps)): s1, e1 = timestamps[i] s2, e2 = timestamps[j] if max(s1, s2) < min(e1, e2): overlap_found = True break if overlap_found: break if overlap_found: overlap_count += 1 # 3. Создание DataFrame df_video = pd.DataFrame({ 'video_id': video_ids, 'duration': durations, 'num_events': num_events, 'coverage': coverage_ratios }) # 4. Вывод статистик print("=== Статистики датасета ===") print(f"Количество видео: {len(df_video)}") print(f"Общая длительность (часов): {df_video['duration'].sum() / 3600:.1f}") print(f"Средняя длительность видео (сек): {df_video['duration'].mean():.1f} +- {df_video['duration'].std():.1f}") print(f"Среднее число событий на видео: {df_video['num_events'].mean():.2f} +- {df_video['num_events'].std():.2f}") print(f"Общее количество событий: {len(event_lengths)}") print(f"Средняя длительность события (сек): {np.mean(event_lengths):.1f} +- {np.std(event_lengths):.1f}") print(f"Средняя длина описания (слов): {np.mean(sentence_lengths):.2f} +- {np.std(sentence_lengths):.2f}") print(f"Среднее покрытие видео (%): {np.mean(coverage_ratios)*100:.1f}") print(f"Доля видео с перекрывающимися событиями (%): {overlap_count / len(df_video) * 100:.1f}") # 5. Графики # Гистограмма длительности видео plt.figure() sns.histplot(df_video['duration'], bins=50, kde=True, color='steelblue') plt.xlabel('Длительность видео (секунды)') plt.ylabel('Частота') plt.title('Распределение длительности видео') plt.axvline(df_video['duration'].mean(), color='red', linestyle='--', label=f'Среднее = {df_video["duration"].mean():.0f} с') plt.legend() plt.tight_layout() plt.savefig('src/imgs2/fig1.png', dpi=150) # Количество событий на видео plt.figure() sns.histplot(df_video['num_events'], bins=range(1, max(df_video['num_events'])+2), discrete=True, color='darkgreen') plt.xlabel('Количество событий на видео') plt.ylabel('Количество видео') plt.title('Распределение числа событий на видео') plt.axvline(df_video['num_events'].mean(), color='red', linestyle='--', label=f'Среднее = {df_video["num_events"].mean():.2f}') plt.legend() plt.tight_layout() plt.savefig('src/imgs2/fig2.png', dpi=150) # Зависимость длины описания от числа событий df_video['avg_sent_len'] = [np.mean([len(s.split()) for s in data[vid]['sentences']]) for vid in video_ids] plt.figure() sns.barplot(x=pd.cut(df_video['num_events'], bins=[0,2,4,6,10,50]), y='avg_sent_len', data=df_video, palette='Set2', errorbar=None) plt.xlabel('Количество событий на видео (группы)') plt.ylabel('Средняя длина описания (слова)') plt.title('Зависимость длины описания от числа событий') plt.tight_layout() plt.savefig('src/imgs2/fig3.png', dpi=150) # Корреляция длительности видео и числа событий plt.figure() sns.scatterplot(x='duration', y='num_events', data=df_video, alpha=0.3, color='coral') sns.regplot(x='duration', y='num_events', data=df_video, scatter=False, color='blue') plt.xlabel('Длительность видео (секунды)') plt.ylabel('Количество событий') plt.title('Корреляция длительности видео и числа событий') corr = df_video['duration'].corr(df_video['num_events']) plt.tight_layout() plt.savefig('src/imgs2/fig4.png', dpi=150) print("\nГрафики сохранены успешно")