Skip to content
Snippets Groups Projects
script_plot_mestrado.py 6.79 KiB
Newer Older
Your Name's avatar
Fix
Your Name committed
import pandas as pd
import matplotlib.pyplot as plt
import os 
import numpy as np
# Leitura do arquivo

main_folder = "./"

scenarios = [name for name in os.listdir(main_folder) if os.path.isdir(os.path.join(main_folder, name))]

Your Name's avatar
Your Name committed
scenarios = sorted(
    scenarios,
    key=lambda x: (
Your Name's avatar
Your Name committed
        x != "no_slicing", 
Your Name's avatar
Your Name committed
        int(x.split('_')[-1]) if x.startswith('scen_') and x.split('_')[-1].isdigit() else float('inf')
    )
)
Your Name's avatar
Fix
Your Name committed

ue_dataframes = {}

for scenario in scenarios:
    ue_dataframes[scenario] = {}
    scenario_path = main_folder + scenario
Your Name's avatar
Your Name committed
    cap_confs_list = [name for name in os.listdir(scenario_path) if os.path.isdir(os.path.join(scenario_path, name))]  
    for cap_conf_folder in cap_confs_list: 
        ue_dataframes[scenario][cap_conf_folder] = {}
        cap_path = scenario_path + '/' + cap_conf_folder
Your Name's avatar
Your Name committed
        ues = [name for name in os.listdir(cap_path) if os.path.isdir(os.path.join(cap_path, name))]
        for ue in ues: 
            data = []
            ue_path = cap_path + '/' + ue + '/' + 'job_1.txt'
            ##Organização do dataframe
Your Name's avatar
Fix
Your Name committed

Your Name's avatar
Your Name committed
            with open(ue_path, 'r') as file:
                count = 0
                data.append({
                                "Interval": 0,
                                "Transfer": 0,
                                "Bandwidth": 0,
                                "Jitter": 0,
Your Name's avatar
Your Name committed
                                "PacketsLost": 0,
                                "TotalPackets": 0
Your Name's avatar
Your Name committed
                            })
                for line in file:
                    if "[  3]" in line and "sec" in line and "MBytes" in line:
                        parts = line.split()
                        count += 1
                        if count < 10: 
                            data.append({
                                "Interval": count,
                                "Transfer": parts[5],
                                "Bandwidth": float(parts[7]),
                                "Jitter": parts[9] if len(parts) > 6 else None,
Your Name's avatar
Your Name committed
                                "PacketsLost": int(parts[-2].split("/")[0]) if "/" in parts[-2] else int(parts[-3].split("/")[0]),
                                "TotalPackets": int(parts[-2].split("/")[1]) if "/" in parts[-2] else int(parts[-2])
Your Name's avatar
Your Name committed
                            })
Your Name's avatar
Your Name committed
                        elif count < 60:
Your Name's avatar
Your Name committed
                            data.append({
                                "Interval": count,
                                "Transfer": parts[4],
                                "Bandwidth": float(parts[6]),
                                "Jitter": parts[8] if len(parts) > 6 else None,
Your Name's avatar
Your Name committed
                                "PacketsLost": int(parts[-2].split("/")[0]) if "/" in parts[-2] else int(parts[-3].split("/")[0]),
                                "TotalPackets": int(parts[-2].split("/")[1]) if "/" in parts[-2] else int(parts[-2])
Your Name's avatar
Your Name committed
                            })
                        else:
                            break
Your Name's avatar
Your Name committed
            ue_dataframes[scenario][cap_conf_folder][ue] = pd.DataFrame(data)
Your Name's avatar
Fix
Your Name committed

Your Name's avatar
Your Name committed
for scenario in scenarios:
Your Name's avatar
Your Name committed
    conf_list = []
Your Name's avatar
Your Name committed
    pl_ue1 = []
    pl_ue2 = []
Your Name's avatar
Your Name committed
    scenario_path = main_folder + scenario
Your Name's avatar
Your Name committed
    cap_confs_list = [name for name in os.listdir(scenario_path) if os.path.isdir(os.path.join(scenario_path, name))] ## Configuração da capacidade dos slices
    cap_confs_list = sorted(cap_confs_list, key=lambda x: (x == 'no_slicing', x))
    with open(os.path.join(scenario_path, "scenario_description.txt"), 'r') as file:
        scenario_file = file.read().split("\n")
    scenario_info = {item.split(':', 1)[0].strip(): item.split(':', 1)[1].strip() for item in scenario_file if item}
    for cap_conf_folder in cap_confs_list:
        cap_path = scenario_path + '/' + cap_conf_folder
        with open(os.path.join(cap_path, "cap_conf_description.txt"), 'r') as file:
            cap_conf_description = file.read().split("\n")
        cap_conf_info = {item.split(':', 1)[0].strip(): item.split(':', 1)[1].strip() for item in cap_conf_description if item}
Your Name's avatar
Your Name committed
        plt.plot(ue_dataframes[scenario][cap_conf_folder]['ue1']["Interval"], ue_dataframes[scenario][cap_conf_folder]['ue1']["Bandwidth"], marker="o", label=f"UE1 (Banda: {scenario_info['UE1_bandwidth']} Mbps)", color='#ff7f0e', linestyle="-")
        plt.plot(ue_dataframes[scenario][cap_conf_folder]['ue2']["Interval"], ue_dataframes[scenario][cap_conf_folder]['ue2']["Bandwidth"], marker="o", label=f"UE2 (Banda: {scenario_info['UE2_bandwidth']} Mbps)", color='#1f77b4', linestyle="--")
Your Name's avatar
Your Name committed
        y_ticks = np.arange(0, max(ue_dataframes[scenario][cap_conf_folder]['ue2']["Bandwidth"].max(),
                              ue_dataframes[scenario][cap_conf_folder]['ue1']["Bandwidth"].max()) + 10, 10)  # Intervalo de 2 Mbps
        plt.yticks(y_ticks)  # Define os valores do eixo Y com intervalos mais detalhados 
Your Name's avatar
Your Name committed
        # if cap_conf_info['UE1_slice'] != '-':
        #     plt.title(f"Taxa Efetiva de Usuários Móveis: UE1 no Slice 1 ({cap_conf_info['UE1_slice']}% dos Recursos) e UE2 no Slice 2 ({cap_conf_info['UE2_slice']}% dos Recursos)")
        # else:
        #     plt.title(f"Taxa Efetiva de Usuários sem configuração dos slices") 
Your Name's avatar
Your Name committed
        plt.xlabel("Tempo (s)")
Your Name's avatar
Your Name committed
        plt.ylabel("Taxa efetiva (Mbps)")
Your Name's avatar
Your Name committed
        plt.grid(which="both", linestyle="--", linewidth=0.5, alpha=0.7)  # Grelha mais sutil
        plt.tight_layout()  # Garante que todos os elementos estejam visíveis
Your Name's avatar
Your Name committed
        plt.legend()
Your Name's avatar
Your Name committed
        if cap_conf_info['UE1_slice'] != '-' and cap_conf_info['UE2_slice'] != '-':
            conf_list.append(f"Conf. {cap_conf_info['UE1_slice']}% / {cap_conf_info['UE2_slice']}%")
        else:
            conf_list.append(f'Conf. No slice')
Your Name's avatar
Your Name committed
        plt.tight_layout()
Your Name's avatar
Your Name committed
        pl_ue1.append((ue_dataframes[scenario][cap_conf_folder]['ue1']["PacketsLost"].sum()/ue_dataframes[scenario][cap_conf_folder]['ue1']["TotalPackets"].sum())*100)
        pl_ue2.append((ue_dataframes[scenario][cap_conf_folder]['ue2']["PacketsLost"].sum()/ue_dataframes[scenario][cap_conf_folder]['ue2']["TotalPackets"].sum())*100)
Your Name's avatar
Your Name committed
        plt.show()
    # Configurar a posição das barras no eixo x
Your Name's avatar
Your Name committed
    x = np.arange(len(conf_list))  # Posições das scenarios
Your Name's avatar
Your Name committed
    largura = 0.4  # Largura das barras
    # Criar as barras
Your Name's avatar
Your Name committed
    plt.bar(x - largura / 2, pl_ue1, width=largura, label=f"UE1 (Banda: {scenario_info['UE1_bandwidth']} Mbps)", color='#ff7f0e')  # Barras para UE1
    plt.bar(x + largura / 2, pl_ue2, width=largura, label=f"UE2 (Banda: {scenario_info['UE2_bandwidth']} Mbps)", color='#1f77b4')  # Barras para UE2
Your Name's avatar
Fix
Your Name committed

Your Name's avatar
Your Name committed
    # Adicionar rótulos e título
Your Name's avatar
Your Name committed
    plt.xlabel('Diferentes configurações de capacidade (Slice 1 / Slice 2)')
Your Name's avatar
Your Name committed
    plt.ylabel('Perda de pacote (%)')
Your Name's avatar
Your Name committed
    # plt.title('Perda de Pacotes (%) para Diferentes Configurações de Capacidade')
Your Name's avatar
Your Name committed
    plt.xticks(x, conf_list)  # Ajustar rótulos do eixo x
Your Name's avatar
Your Name committed
    plt.legend()  # Adicionar legenda
Your Name's avatar
Fix
Your Name committed

Your Name's avatar
Your Name committed
    # Exibir o gráfico
    plt.tight_layout()
Your Name's avatar
Fix
Your Name committed
    plt.show()