Quick start
Installation
Install package with pip.
pip install traffic-weaver
Minimal processing example
Importing Traffic Weaver.
import traffic_weaver
To obtain the same results, set numpy seed to 0.
# setting random seed to 0
from numpy import random
random.seed(0)
To load one of the local exemplary datasets, use
# load example dataset containing average measurements over 1 hour
data = traffic_weaver.datasets.load_dataset('sandvine_tiktok')
print(data.T)
which outputs
[[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ]
[ 0.45 0.4 0.45 0.2 0.3 0.9 0.9 1.3 1.65 1.15 1.6 1.6 1.5 2.1 1.45 1.6 1.45 2.55 1.4 2.45 1.6 1. 1.35 1.05]]
The traffic_weaver
provides Weaver
class that serves as an API to other processing
capabilities. :code: Weaver.from_2d_array(data) factory takes time series of independent and
dependent variables as 2D array.
# create Weaver instance
wv = traffic_weaver.Weaver.from_2d_array(data)
Further signal processing is applied through Weaver methods. Most of the methods return instance to the Weaver itself, allowing for chaining processing commands.
# process it creating samples every minute
wv.oversample(60).integral_match().smooth(1.0).noise(snr=30)
To obtain created new time series call either Weaver.get()
or
Weaver.to_function()
. The former one returns list of created points, and
the latter one spline function created based on those points and allow to sample any point.
x, y = wv.get()
print(x)
print(y)
[0.000e+00 1.667e-02 3.333e-02 ... 2.297e+01 2.298e+01 2.300e+01]
[0.504 0.447 0.477 ... 1.047 1.044 1.065]
f = wv.to_function()
print(f(0.01))
0.45616116907018994
To visualize time series, matplotlib library is required.
import matplotlib.pyplot as plt
# plot original signal
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(14, 4))
axes[0].plot(*wv.get_original(), drawstyle="steps-post")
# plot modified signal
axes[1].plot(*wv.get())
# plot averaged signal
x, y = traffic_weaver.process.average(*wv.get(), 60)
axes[2].plot(x, y, drawstyle="steps-post")
axes[0].set_title("a) Original", loc="left")
axes[1].set_title("b) Processed", loc="left")
axes[2].set_title("c) Averaged", loc="left")
plt.show()
Above code produces the following figures.
It is possible to check if integrals actually match between original and processed function.
# compare integrals of original and modified signal
print("original function integral={}".format(sum(traffic_weaver.sorted_array_utils.integral(*(wv.get_original()), method='rectangle'))))
print("modified function integral={}".format(sum(traffic_weaver.sorted_array_utils.integral(wv.x, wv.y, method='trapezoid'))))
Resulting in:
original function integral=29.35
modified function integral=29.327691841128036
The small difference in integral value is a result of smoothing and adding noise.
Further processing examples
Traffic Weaver provides further methods to process time series.
import traffic_weaver
import matplotlib.pyplot as plt
import math
from numpy import random
random.seed(0)
# load example dataset containing average measurements over 1 hour
x, y = traffic_weaver.datasets.load_dataset('sandvine_tiktok', unpack_dataset_columns=True)
wv = traffic_weaver.Weaver(x, y)
# add one sample to the end to make it first sample of next day
wv.append_one_sample(make_periodic=True)
wv.recreate_from_average(60).integral_match().repeat(14).smooth(1.0).trend(
lambda x: 2 * x + 1 / 2 * math.sin(math.pi * x * 7), normalized=True).noise(snr=35)
# visualize
fig, axes = plt.subplots(figsize=(12, 4))
axes.plot(*wv.get())
plt.tight_layout()
plt.show()