Tutorial¶
The following notebook provides a demonstration how the ts2g2 library can be used to convert time series into graphs and graphs into time series. To that end, we use a dataset with the history of daily prices of Amazon stock (AMZN) and Apple stock (APPLE). All the column desinpiptions are provided. Currency is USD.
import os
import sys
nb_dir = os.path.split(os.getcwd())[0]
if nb_dir not in sys.path:
sys.path.append(nb_dir)
from core.model import Timeseries, TimeseriesPreprocessing, TimeseriesPreprocessingSegmentation, TimeseriesPreprocessingSlidingWindow, TimeseriesPreprocessingComposite, TimeseriesView, TimeGraph, ToSequenceVisitorSlidingWindow, ToSequenceVisitor
from tsg_io.input import CsvFile
from from_graph.strategy_to_time_sequence import StrategyNextValueInNodeRandom, StrategyNextValueInNodeRandomForSlidingWindow, StrategyNextValueInNodeRoundRobin, StrategyNextValueInNodeRoundRobinForSlidingWindow, StrategySelectNextNodeRandomlyAcrossGraphs, StrategySelectNextNodeRandomlyFromFirstGraph
from to_graph.strategy_linking_graph import StrategyLinkingGraphByValueWithinRange, LinkNodesWithinGraph
from to_graph.strategy_linking_multi_graphs import LinkGraphs
from to_graph.strategy_to_graph import BuildTimeseriesToGraphNaturalVisibilityStrategy, BuildTimeseriesToGraphHorizontalVisibilityStrategy
import warnings
warnings.filterwarnings('ignore')
Accessing data¶
We first get path to the data.
amazon_path = os.path.join(os.getcwd(), "tutorial_data", "AMZN.csv")
apple_path = os.path.join(os.getcwd(), "tutorial_data", "APPLE.csv")
Converting time series to graph¶
Here are two examples of conversion of data from time serie to graph. Second one is inpeated using sliding window mechanism. That means its nodes are smaller graphs inpeated based on a segments of data (length = 5).
timegraph_1 = Timeseries(CsvFile(amazon_path, "Close").from_csv())\
.with_preprocessing(TimeseriesPreprocessingSegmentation(60, 90))\
.to_graph(BuildTimeseriesToGraphNaturalVisibilityStrategy().with_limit(1).get_strategy())\
.add_edge(0,2)\
.add_edge(13, 21, weight = 17)\
.link(LinkNodesWithinGraph().by_value(StrategyLinkingGraphByValueWithinRange(2)).seasonalities(15))\
.draw("blue")
timegraph_2 = Timeseries(CsvFile(apple_path, "Close").from_csv())\
.with_preprocessing(TimeseriesPreprocessingComposite()\
.add(TimeseriesPreprocessingSegmentation(60, 120))\
.add(TimeseriesPreprocessingSlidingWindow(5)))\
.to_graph(BuildTimeseriesToGraphNaturalVisibilityStrategy().get_strategy())\
.link(LinkGraphs().sliding_window())\
.combine_identical_subgraphs()\
.draw("red")
Combining multiple graphs¶
We can store and combine multiple of already inpeated objects TimeSeriesToGraph into one object MultivariateTimeSeriesToGraph
timegraph_3 = Timeseries(CsvFile(apple_path, "Close").from_csv())\
.with_preprocessing(TimeseriesPreprocessingSegmentation(60, 90))\
.add(Timeseries(CsvFile(apple_path, "Close").from_csv())\
.with_preprocessing(TimeseriesPreprocessingSegmentation(90, 120)))\
.add(Timeseries(CsvFile(apple_path, "Close").from_csv())\
.with_preprocessing(TimeseriesPreprocessingSegmentation(150, 180)))\
.to_graph(BuildTimeseriesToGraphNaturalVisibilityStrategy().with_limit(1).get_strategy())\
.link(LinkGraphs().time_cooccurrence())\
.link(LinkNodesWithinGraph().by_value(StrategyLinkingGraphByValueWithinRange(0.5)))\
.combine_identical_nodes()\
.draw("brown")
timegraph_4 = Timeseries(CsvFile(apple_path, "Close").from_csv())\
.with_preprocessing(TimeseriesPreprocessingComposite()\
.add(TimeseriesPreprocessingSegmentation(60, 110))\
.add(TimeseriesPreprocessingSlidingWindow(5)))\
.add(Timeseries(CsvFile(apple_path, "Close").from_csv())\
.with_preprocessing(TimeseriesPreprocessingComposite()\
.add(TimeseriesPreprocessingSegmentation(120, 170))\
.add(TimeseriesPreprocessingSlidingWindow(5)))\
.add(Timeseries(CsvFile(apple_path, "Close").from_csv())\
.with_preprocessing(TimeseriesPreprocessingComposite()\
.add(TimeseriesPreprocessingSegmentation(190, 240))\
.add(TimeseriesPreprocessingSlidingWindow(5)))))\
.to_graph(BuildTimeseriesToGraphNaturalVisibilityStrategy().get_strategy())\
.link(LinkGraphs().sliding_window().time_cooccurrence())\
.combine_identical_subgraphs()\
.link(LinkNodesWithinGraph().seasonalities(15))\
.draw("green")
Back to time series¶
We can convert existing graphs back to time series based on our strategy.
timegraph_1.to_sequence(ToSequenceVisitor()\
.next_node_strategy(StrategySelectNextNodeRandomlyAcrossGraphs())\
.next_value_strategy(StrategyNextValueInNodeRoundRobin().skip_every_x_steps(1))\
.ts_length(100))\
.draw_sequence()
<core.model.TimeGraph at 0x25ab0f4d880>
timegraph_2.to_sequence(ToSequenceVisitorSlidingWindow()\
.next_node_strategy(StrategySelectNextNodeRandomlyFromFirstGraph())\
.next_value_strategy(StrategyNextValueInNodeRandomForSlidingWindow().skip_every_x_steps(1))\
.ts_length(50))\
.draw_sequence()
<core.model.TimeGraph at 0x25ab13455e0>
We can also convert our multivriate graphs back to multiple time series.
timegraph_3.to_sequence(ToSequenceVisitor()\
.next_node_strategy(StrategySelectNextNodeRandomlyAcrossGraphs().change_graphs_every_x_steps(2))\
.next_value_strategy(StrategyNextValueInNodeRoundRobin().skip_every_x_steps(1))\
.ts_length(50))\
.draw_sequence()
<core.model.TimeGraph at 0x25a9fed7a40>
timegraph_4.to_sequence(ToSequenceVisitorSlidingWindow()\
.next_node_strategy(StrategySelectNextNodeRandomlyFromFirstGraph())\
.next_value_strategy(StrategyNextValueInNodeRoundRobinForSlidingWindow())\
.ts_length(100))\
.draw_sequence()
<core.model.TimeGraph at 0x25ab13b7ce0>