Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

186 lines
6.7KB

  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. transmission_df = pd.merge_asof(
  81. transmission_df,
  82. serial_df,
  83. tolerance=pd.Timedelta("1s"),
  84. right_index=True,
  85. left_index=True,
  86. )
  87. transmission_df.index = transmission_df["arrival_time"]
  88. # transmission timeline
  89. scaley = 1.5
  90. scalex = 1.0
  91. plt.title("{} with {}".format(transmission_direction, cc_algo))
  92. fig, ax = plt.subplots(2, 1, figsize=[6.4 * scaley, 4.8 * scalex])
  93. fig.subplots_adjust(right=0.75)
  94. fig.suptitle("{} with {}".format(transmission_direction, cc_algo))
  95. ax0 = ax[0]
  96. ax1 = ax0.twinx()
  97. ax2 = ax0.twinx()
  98. #ax2.spines.right.set_position(("axes", 1.22))
  99. ax00 = ax[1]
  100. ax01 = ax00.twinx()
  101. ax02 = ax00.twinx()
  102. # Plot vertical lines
  103. first = True
  104. lte_handovers = transmission_df["Cell_ID"].diff().dropna()
  105. for index, value in lte_handovers.items():
  106. if value > 0:
  107. if first:
  108. ax00.axvline(index, ymin=0, ymax=1, color="skyblue", label="4G Handover")
  109. first = False
  110. else:
  111. ax00.axvline(index, ymin=0, ymax=1, color="skyblue")
  112. first = True
  113. nr_handovers = transmission_df["NR5G_Cell_ID"].diff().dropna()
  114. for index, value in nr_handovers.items():
  115. if value > 0:
  116. if first:
  117. ax00.axvline(index, ymin=0, ymax=1, color="greenyellow", label="5G Handover")
  118. first = False
  119. else:
  120. ax00.axvline(index, ymin=0, ymax=1, color="greenyellow")
  121. ax0.plot(transmission_df["snd_cwnd"].dropna(), color="lime", linestyle="dashed", label="cwnd")
  122. ax1.plot(transmission_df["srtt"].dropna(), color="red", linestyle="dashdot", label="sRTT")
  123. ax2.plot(transmission_df["goodput_rolling"], color="blue", linestyle="solid", label="goodput")
  124. ax00.plot(transmission_df["NR5G_RSRQ_(dB)"].dropna(), color="magenta", linestyle="dotted", label="NR RSRQ")
  125. ax01.plot(transmission_df["bw_sum"].dropna(), color="peru", linestyle="solid", label="bandwidth")
  126. ax02.plot(transmission_df["RSRQ_(dB)"].dropna(), color="purple", linestyle="dotted", label="LTE RSRQ")
  127. ax2.spines.right.set_position(("axes", 1.1))
  128. ax02.spines.right.set_position(("axes", 1.1))
  129. ax0.set_ylim(0, 5000)
  130. ax1.set_ylim(0, 0.3)
  131. ax2.set_ylim(0, 500)
  132. ax00.set_ylim(-25, 0)
  133. ax01.set_ylim(0, 400)
  134. ax02.set_ylim(-25, 0)
  135. ax00.set_xlabel("arrival time [s]")
  136. ax2.set_ylabel("Goodput [mbps]")
  137. ax00.set_ylabel("NR RSRQ [dB]")
  138. ax02.set_ylabel("LTE RSRQ [dB]")
  139. ax1.set_ylabel("sRTT [s]")
  140. ax0.set_ylabel("cwnd")
  141. ax01.set_ylabel("Bandwidth [MHz]")
  142. fig.legend(loc="lower right")
  143. plt.savefig("{}{}_plot.pdf".format(args.save, csv.replace(".csv", "")))
  144. #except Exception as e:
  145. # print("Error processing file: {}".format(csv))
  146. # print(str(e))
  147. counter += 1
  148. plt.close(fig)
  149. plt.clf()