Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

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