diff --git a/plot_transmission_timeline.py b/plot_transmission_timeline.py index a8eddef..33fec9d 100755 --- a/plot_transmission_timeline.py +++ b/plot_transmission_timeline.py @@ -44,6 +44,24 @@ def chunk(it, size): return iter(lambda: tuple(islice(it, size)), ()) +def plot_cdf(dataframe, column_name): + stats_df = dataframe \ + .groupby(column_name) \ + [column_name] \ + .agg("count") \ + .pipe(pd.DataFrame) \ + .rename(columns={column_name: "frequency"}) + + # PDF + stats_df["pdf"] = stats_df["frequency"] / sum(stats_df["frequency"]) + + # CDF + stats_df["cdf"] = stats_df["pdf"].cumsum() + stats_df = stats_df.reset_index() + + stats_df.plot(x=column_name, y=["cdf"], grid=True) + + if __name__ == "__main__": parser = ArgumentParser() parser.add_argument("-f", "--gps_file", required=True, help="GPS csv file.") @@ -126,7 +144,16 @@ if __name__ == "__main__": transmission_df = transmission_df.sort_index() print("Calculate goodput...") - transmission_df["goodput"] = transmission_df["payload_size"].rolling("{}s".format(args.interval)).sum() + + range_start_time = transmission_df["datetime"].min() + range_sum_interval = "{}s".format(args.interval) + + # create timedelta range with maximum timedelta + time_range = pd.timedelta_range(pd.Timedelta(range_start_time), transmission_df["datetime"].max(), freq=range_sum_interval) + + # create bins by pd.cut, aggregate sum + transmission_df = transmission_df.groupby(pd.cut(transmission_df["datetime"], bins=time_range, labels=time_range[:-1]))["goodput"].sum().reset_index() + #transmission_df["goodput"] = transmission_df["payload_size"].rolling("{}s".format(args.interval)).sum() transmission_df["goodput"] = transmission_df["goodput"].apply( lambda x: ((x * 8) / args.interval) / 10**6 ) @@ -191,26 +218,9 @@ if __name__ == "__main__": plt.clf() print("Calculate and polt CDF...") - # Get the frequency, PDF and CDF for each value in the series - - # Frequency - stats_df = transmission_df \ - .groupby("goodput") \ - ["goodput"] \ - .agg("count") \ - .pipe(pd.DataFrame) \ - .rename(columns={"goodput": "frequency"}) - - # PDF - stats_df["pdf"] = stats_df["frequency"] / sum(stats_df["frequency"]) - - # CDF - stats_df["cdf"] = stats_df["pdf"].cumsum() - stats_df = stats_df.reset_index() - - stats_df.plot(x="goodput", y=["cdf"], grid=True) + plot_cdf(transmission_df, "goodput") if args.save: - plt.savefig("{}cdf_plot.pdf".format(args.save)) + plt.savefig("{}{}_cdf_plot.pdf".format(args.save, "goodput")) else: plt.show() \ No newline at end of file