No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

195 líneas
7.3KB

  1. #!/usr/bin/env python3
  2. import math
  3. import multiprocessing
  4. import os
  5. from argparse import ArgumentParser
  6. import matplotlib
  7. import pandas as pd
  8. import matplotlib.pyplot as plt
  9. # Using seaborn's style
  10. #plt.style.use('seaborn')
  11. tex_fonts = {
  12. "pgf.texsystem": "lualatex",
  13. # "legend.fontsize": "x-large",
  14. # "figure.figsize": (15, 5),
  15. "axes.labelsize": 15, # "small",
  16. # "axes.titlesize": "x-large",
  17. "xtick.labelsize": 15, # "small",
  18. "ytick.labelsize": 15, # "small",
  19. "legend.fontsize": 15,
  20. "axes.formatter.use_mathtext": True,
  21. "mathtext.fontset": "dejavusans",
  22. }
  23. #plt.rcParams.update(tex_fonts)
  24. if __name__ == "__main__":
  25. parser = ArgumentParser()
  26. parser.add_argument("-s", "--serial_file", required=True, help="Serial csv file.")
  27. parser.add_argument("-p", "--pcap_csv_folder", required=True, help="PCAP csv folder.")
  28. parser.add_argument("--save", required=True, help="Location to save pdf file.")
  29. parser.add_argument(
  30. "-i",
  31. "--interval",
  32. default=10,
  33. type=int,
  34. help="Time interval for rolling window.",
  35. )
  36. args = parser.parse_args()
  37. pcap_csv_list = list()
  38. for filename in os.listdir(args.pcap_csv_folder):
  39. if filename.endswith(".csv") and "tcp" in filename:
  40. pcap_csv_list.append(filename)
  41. counter = 1
  42. if len(pcap_csv_list) == 0:
  43. print("No CSV files found.")
  44. pcap_csv_list.sort(key=lambda x: int(x.split("_")[-1].replace(".csv", "")))
  45. for csv in pcap_csv_list:
  46. print("\rProcessing {} out of {} CSVs.\t({}%)\t".format(counter, len(pcap_csv_list), math.floor(counter/len(pcap_csv_list))))
  47. #try:
  48. transmission_df = pd.read_csv(
  49. "{}{}".format(args.pcap_csv_folder, csv),
  50. dtype=dict(is_retranmission=bool, is_dup_ack=bool),
  51. )
  52. transmission_df["datetime"] = pd.to_datetime(transmission_df["datetime"]) - pd.Timedelta(hours=1)
  53. transmission_df = transmission_df.set_index("datetime")
  54. transmission_df.index = pd.to_datetime(transmission_df.index)
  55. transmission_df = transmission_df.sort_index()
  56. # srtt to [s]
  57. transmission_df["srtt"] = transmission_df["srtt"].apply(lambda x: x / 10**6)
  58. # key for columns and level for index
  59. transmission_df["goodput"] = transmission_df["payload_size"].groupby(pd.Grouper(level="datetime", freq="{}s".format(args.interval))).transform("sum")
  60. transmission_df["goodput"] = transmission_df["goodput"].apply(
  61. lambda x: ((x * 8) / args.interval) / 10**6
  62. )
  63. transmission_df["goodput_rolling"] = transmission_df["payload_size"].rolling("{}s".format(args.interval)).sum()
  64. transmission_df["goodput_rolling"] = transmission_df["goodput_rolling"].apply(
  65. lambda x: ((x * 8) / args.interval) / 10 ** 6
  66. )
  67. # set meta values and remove all not needed columns
  68. cc_algo = transmission_df["congestion_control"].iloc[0]
  69. cc_algo = cc_algo.upper()
  70. transmission_direction = transmission_df["direction"].iloc[0]
  71. #transmission_df = transmission_df.filter(["goodput", "datetime", "ack_rtt", "goodput_rolling", "snd_cwnd"])
  72. # read serial csv
  73. serial_df = pd.read_csv(args.serial_file, dtype=dict(Cell_ID=str),)
  74. serial_df["datetime"] = pd.to_datetime(serial_df["datetime"]) - pd.Timedelta(hours=1)
  75. serial_df = serial_df.set_index("datetime")
  76. serial_df.index = pd.to_datetime(serial_df.index)
  77. serial_df.sort_index()
  78. serial_df["Cell_ID"] = serial_df["Cell_ID"].apply(
  79. lambda x: int(x.split(" ")[-1].replace("(", "").replace(")", "")))
  80. # sum bandwidth
  81. # columns: LTE_bw, LTE_SCC2_bw, LTE_SCC3_bw, LTE_SCC4_bw, SCC1_NR5G_bw, NR5G_dl_bw, NR5G_ul_bw, LTE_SCC1_bw, NR5G_bw
  82. serial_df["bw_sum"] = serial_df["LTE_bw"].dropna() + serial_df["LTE_SCC2_bw"].dropna() \
  83. + serial_df["LTE_SCC3_bw"].dropna() + serial_df["LTE_SCC4_bw"].dropna() \
  84. + serial_df["SCC1_NR5G_bw"].dropna() + serial_df["NR5G_dl_bw"].dropna() \
  85. + serial_df["LTE_SCC1_bw"].dropna()
  86. #serial_df["bw_sum"] = serial_df["bw_sum"].apply(lambda x: int(x))
  87. print(serial_df["bw_sum"])
  88. transmission_df = pd.merge_asof(
  89. transmission_df,
  90. serial_df,
  91. tolerance=pd.Timedelta("1s"),
  92. right_index=True,
  93. left_index=True,
  94. )
  95. transmission_df.index = transmission_df["arrival_time"]
  96. # transmission timeline
  97. scaley = 1.5
  98. scalex = 1.0
  99. plt.title("{} with {}".format(transmission_direction, cc_algo))
  100. fig, ax = plt.subplots(2, 1, figsize=[6.4 * scaley, 4.8 * scalex])
  101. fig.subplots_adjust(right=0.75)
  102. fig.suptitle("{} with {}".format(transmission_direction, cc_algo))
  103. ax0 = ax[0]
  104. ax1 = ax0.twinx()
  105. ax2 = ax0.twinx()
  106. #ax2.spines.right.set_position(("axes", 1.22))
  107. ax00 = ax[1]
  108. ax01 = ax00.twinx()
  109. ax02 = ax00.twinx()
  110. ax02.spines.right.set_position(("axes", 1.10))
  111. # Plot vertical lines
  112. first = True
  113. lte_handovers = transmission_df["Cell_ID"].diff().dropna()
  114. for index, value in lte_handovers.items():
  115. if value > 0:
  116. if first:
  117. ax00.axvline(index, ymin=0, ymax=1, color="skyblue", label="4G Handover")
  118. first = False
  119. else:
  120. ax00.axvline(index, ymin=0, ymax=1, color="skyblue")
  121. first = True
  122. nr_handovers = transmission_df["NR5G_Cell_ID"].diff().dropna()
  123. for index, value in nr_handovers.items():
  124. if value > 0:
  125. if first:
  126. ax00.axvline(index, ymin=0, ymax=1, color="greenyellow", label="5G Handover")
  127. first = False
  128. else:
  129. ax00.axvline(index, ymin=0, ymax=1, color="greenyellow")
  130. ax0.plot(transmission_df["snd_cwnd"].dropna(), color="lime", linestyle="dashed", label="cwnd")
  131. ax1.plot(transmission_df["srtt"].dropna(), color="red", linestyle="dashdot", label="sRTT")
  132. ax2.plot(transmission_df["goodput_rolling"], color="blue", linestyle="solid", label="goodput")
  133. ax00.plot(transmission_df["NR5G_RSRQ_(dB)"].dropna(), color="magenta", linestyle="dotted", label="NR RSRQ")
  134. ax01.plot(transmission_df["bw_sum"].dropna(), color="peru", linestyle="dotted", label="bandwidth")
  135. ax02.plot(transmission_df["RSRQ_(dB)"].dropna(), color="purple", linestyle="dotted", label="LTE RSRQ")
  136. ax2.spines.right.set_position(("axes", 1.1))
  137. ax0.set_ylim(0, 5000)
  138. ax1.set_ylim(0, 0.3)
  139. ax2.set_ylim(0, 500)
  140. ax00.set_ylim(-25, -5)
  141. ax01.set_ylim(0, 400)
  142. ax02.set_ylim(-25, -5)
  143. ax00.set_xlabel("arrival time [s]")
  144. ax2.set_ylabel("Goodput [mbps]")
  145. ax00.set_ylabel("NR RSRQ [dB]")
  146. ax02.set_ylabel("LTE RSRQ [dB]")
  147. ax1.set_ylabel("sRTT [s]")
  148. ax0.set_ylabel("cwnd")
  149. ax01.set_ylabel("Bandwidth [MHz]")
  150. fig.legend(loc="lower right")
  151. plt.savefig("{}{}_plot.pdf".format(args.save, csv.replace(".csv", "")))
  152. #except Exception as e:
  153. # print("Error processing file: {}".format(csv))
  154. # print(str(e))
  155. counter += 1
  156. plt.close(fig)
  157. plt.clf()