{"id":2997,"date":"2025-04-10T07:02:45","date_gmt":"2025-04-10T07:02:45","guid":{"rendered":"https:\/\/mailitics.com\/index.php\/2025\/04\/10\/time-series-forecasting-made-simple-part-1-decomposition-baseline-models\/"},"modified":"2025-04-10T07:02:45","modified_gmt":"2025-04-10T07:02:45","slug":"time-series-forecasting-made-simple-part-1-decomposition-baseline-models","status":"publish","type":"post","link":"https:\/\/mailitics.com\/index.php\/2025\/04\/10\/time-series-forecasting-made-simple-part-1-decomposition-baseline-models\/","title":{"rendered":"Time Series Forecasting Made Simple (Part 1): Decomposition and Baseline\u00a0Models"},"content":{"rendered":"<p>    Time Series Forecasting Made Simple (Part 1): Decomposition and Baseline\u00a0Models<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n    <!-- no image --><br \/>\n \t<BR><br \/>\n<BR><\/BR><\/p>\n<div>\n<p class=\"wp-block-paragraph\">I <mdspan datatext=\"el1744228303164\" class=\"mdspan-comment\">used<\/mdspan> to avoid time series analysis. Every time I took an online course, I\u2019d see a module titled <em>\u201cTime Series Analysis\u201d<\/em> with subtopics like Fourier Transforms, autocorrelation functions and other intimidating terms. I don\u2019t know why, but I always found a reason to avoid it.<\/p>\n<p class=\"wp-block-paragraph\">But here\u2019s what I\u2019ve learned: <strong>any complex topic becomes manageable when we start from the basics and focus on understanding the intuition<\/strong> behind it. That\u2019s exactly what this blog series is about\u200a:\u200amaking time series feel less like a maze and more like a conversation with your data over time.<\/p>\n<p class=\"wp-block-paragraph\">We understand complex topics much more easily when they\u2019re explained through real-world examples. That\u2019s exactly how I\u2019ll approach this series.<\/p>\n<p class=\"wp-block-paragraph\">In each post, we\u2019ll work with a simple dataset and explore what\u2019s needed from a time series perspective. We\u2019ll build intuition around each concept, understand why it matters, and implement it step by step on the data.<\/p>\n<p class=\"wp-block-paragraph\"><strong>Time Series Analysis is the process of understanding, modeling and <a href=\"https:\/\/towardsdatascience.com\/tag\/forecasting\/\" title=\"Forecasting\">Forecasting<\/a> data that is observed over time.<\/strong> It involves identifying patterns such as trends, seasonality and noise\u200ausing past observations to make informed predictions about future values.<\/p>\n<p class=\"wp-block-paragraph\">Let\u2019s start by considering a dataset named <a href=\"https:\/\/www.kaggle.com\/datasets\/paulbrabban\/daily-minimum-temperatures-in-melbourne\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Daily Minimum Temperatures in Melbourne<\/strong><\/a> (<mdspan datatext=\"el1744227543658\" class=\"mdspan-comment\">open license<\/mdspan>). This dataset contains <strong>daily records of the lowest temperature (in Celsius)<\/strong> observed in Melbourne, Australia, over a <strong>10-year period from 1981 to 1990<\/strong>. Each entry includes just two columns:<\/p>\n<p><strong>Date:<\/strong> The calendar day (from 1981-01-01 to 1990-12-31)<br \/><strong>Temp:<\/strong> The minimum temperature recorded on that day<\/p>\n<p class=\"wp-block-paragraph\">You\u2019ve probably heard of models like ARIMA, SARIMA or Exponential Smoothing. But before we go there, it\u2019s a good idea to try out some simple <strong>baseline models<\/strong> first, to see how well a basic approach performs on our data.<\/p>\n<p class=\"wp-block-paragraph\">While there are many types of baseline models used in time series forecasting, here we\u2019ll focus on the three most essential ones, which are simple, effective, and widely applicable across industries.<\/p>\n<p><strong>Naive Forecast: <\/strong>Assumes the next value will be the same as the last observed one.<br \/><strong>Seasonal Naive Forecast: <\/strong>Assumes the value will repeat from the same point last season (e.g., last week or last month).<br \/><strong>Moving Average: <\/strong>Takes the average of the last <em>n<\/em> points.<\/p>\n<p class=\"wp-block-paragraph\">You might be wondering, why use baseline models at all? Why not just go straight to the well-known forecasting methods like ARIMA or SARIMA?<\/p>\n<p class=\"wp-block-paragraph\">Let\u2019s consider a shop owner who wants to forecast next month\u2019s sales. By applying a <strong>moving average baseline model<\/strong>, they can estimate next month\u2019s sales as the <strong>average of previous months<\/strong>. This simple approach might already deliver around <strong>80% accuracy<\/strong>\u200a\u2014\u200agood enough for planning and inventory decisions.<\/p>\n<p class=\"wp-block-paragraph\">Now, if we switch to a more advanced model like <strong>ARIMA or SARIMA<\/strong>, we might increase accuracy to around <strong>85%<\/strong>. But the key question is: is that extra 5% worth the additional time, effort and resources? In this case, the <strong>baseline model does the job<\/strong>.<\/p>\n<p class=\"wp-block-paragraph\">In fact, in most everyday business scenarios, <strong>baseline models are sufficient<\/strong>. We typically turn to classical models like ARIMA or SARIMA in <strong>high-impact industries<\/strong> such as <strong>finance or energy<\/strong>, where even a small improvement in accuracy can have a significant financial or operational impact. Even then, a <strong>baseline model is usually applied first<\/strong>\u200a\u2014\u200anot only to provide quick insights but also to act as a <strong>benchmark<\/strong> that more complex models must outperform.<\/p>\n<p class=\"wp-block-paragraph\">Okay, now that we\u2019re ready to implement some baseline models, there\u2019s one key thing we need to understand first:<br \/><strong>Every time series is made up of three main components\u200a\u2014\u200atrend, seasonality and residuals.<\/strong><\/p>\n<p class=\"wp-block-paragraph\">Time series decomposition separates data into trend, seasonality and residuals (noise), helping us uncover the true patterns beneath the surface. This understanding guides the choice of forecasting models and improves accuracy. It\u2019s also a vital first step before building both simple and advanced forecasting solutions.<\/p>\n<p class=\"wp-block-paragraph\"><strong>Trend<\/strong><br \/>This is the overall direction your data is moving in over time\u200a\u2014\u200agoing up, down or staying flat.<br \/>Example: Steady decrease in monthly cigarette sales.<\/p>\n<p class=\"wp-block-paragraph\"><strong>Seasonality<br \/><\/strong>These are the patterns that repeat at regular intervals\u200a\u2014\u200adaily, weekly, monthly or yearly.<br \/>Example: Cool drinks sales in summer.<\/p>\n<p class=\"wp-block-paragraph\"><strong>Residuals (Noise)<br \/><\/strong>This is the random \u201cleftover\u201d part of the data, the unpredictable ups and downs that can\u2019t be explained by trend or seasonality.<br \/>Example: A one-time car purchase showing up in your monthly expense pattern.<\/p>\n<p class=\"wp-block-paragraph\">Now that we understand the key components of a time series, let\u2019s put that into practice using a real dataset: <strong>Daily Minimum Temperatures in Melbourne, Australia<\/strong>.<\/p>\n<p class=\"wp-block-paragraph\">We\u2019ll use <a href=\"https:\/\/towardsdatascience.com\/tag\/python\/\" title=\"Python\">Python<\/a> to <strong>decompose the time series<\/strong> into its trend, seasonality, and residual components so we can better understand its structure and choose an appropriate baseline model.<\/p>\n<p class=\"wp-block-paragraph\"><strong><mdspan datatext=\"el1744227674275\" class=\"mdspan-comment\">Code<\/mdspan>:<\/strong><\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\">import pandas as pd\nimport matplotlib.pyplot as plt\nfrom statsmodels.tsa.seasonal import seasonal_decompose\n\n# Load the dataset\ndf = pd.read_csv(\"minimum daily temperatures data.csv\")\n\n# Convert 'Date' to datetime and set as index\ndf['Date'] = pd.to_datetime(df['Date'], dayfirst=True)\ndf.set_index('Date', inplace=True)\n\n# Set a regular daily frequency and fill missing values using forward fill\ndf = df.asfreq('D')\ndf['Temp'].fillna(method='ffill', inplace=True)\n\n# Decompose the daily series (365-day seasonality for yearly patterns)\ndecomposition = seasonal_decompose(df['Temp'], model='additive', period=365)\n\n# Plot the decomposed components\ndecomposition.plot()\nplt.suptitle('Decomposition of Daily Minimum Temperatures (Daily)', fontsize=14)\nplt.tight_layout()\nplt.show()\n<\/code><\/pre>\n<p class=\"wp-block-paragraph\"><strong>Output:<\/strong><\/p>\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/decomposition.png?ssl=1\" alt=\"\" class=\"wp-image-601362\"><figcaption class=\"wp-element-caption\">Decomposition of daily temperatures showing trend, seasonal cycles and random fluctuations.<\/figcaption><\/figure>\n<p class=\"wp-block-paragraph\">The decomposition plot clearly shows a <strong>strong seasonal pattern<\/strong> that repeats each year, along with a <strong>mild trend<\/strong> that shifts over time. The residual component captures the random noise that isn\u2019t explained by trend or seasonality.<\/p>\n<p class=\"wp-block-paragraph\">In the code earlier, you might have noticed that I used an <strong>additive model<\/strong> for decomposing the <a href=\"https:\/\/towardsdatascience.com\/tag\/time-series\/\" title=\"Time Series\">Time Series<\/a>. But what exactly does that mean\u200a\u2014\u200aand why is it the right choice for this dataset?<\/p>\n<p class=\"wp-block-paragraph\">Let\u2019s break it down.<br \/>In an <strong>additive model<\/strong>, we assume Trend, Seasonality and Residuals (Noise) combine <strong>linearly<\/strong>, like this:<br \/>Y = T \u200b+ S \u200b+ R\u200b<\/p>\n<p class=\"wp-block-paragraph\">Where:<br \/>Y is the actual value at time t<br \/>T\u200b is the trend<br \/>S is the seasonal component<br \/>R is the residual (random noise)<\/p>\n<p class=\"wp-block-paragraph\">This means we\u2019re treating the observed value as the <strong>sum of the parts, <\/strong>each component contributes <strong>independently<\/strong> to the final output.<\/p>\n<p>I chose the <strong>additive model<\/strong> because when I looked at the pattern in daily minimum temperatures, I noticed something important:<\/p>\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" height=\"358\" width=\"1024\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/time-series-plot-1024x358.png?resize=1024%2C358&#038;ssl=1\" alt=\"\" class=\"wp-image-601363\"><\/figure>\n<p class=\"wp-block-paragraph\">The line plot above shows the daily minimum temperatures from 1981 to 1990. We can clearly see a strong <strong>seasonal cycle<\/strong> that repeats each year, colder temperatures in winter, warmer in summer.<\/p>\n<p>Importantly, the <strong>amplitude of these seasonal swings stays relatively consistent<\/strong> over the years. For example, the temperature difference between summer and winter doesn\u2019t appear to grow or shrink over time. This stability in seasonal variation is a key sign that the <strong>additive model<\/strong> is appropriate for decomposition, since the seasonal component appears to be <strong>independent of any trend<\/strong>.<\/p>\n<p>We use an <strong>additive model<\/strong> when the <strong>trend is relatively stable<\/strong> and <strong>does not amplify or distort the seasonal pattern<\/strong>, and when the <strong>seasonality stays within a consistent range<\/strong> over time, even if there are minor fluctuations.<\/p>\n<p>Now that we understand how the <strong>additive model<\/strong> works, let\u2019s explore the <strong>multiplicative model<\/strong>\u200a\u2014\u200awhich is often used when the <strong>seasonal effect scales with the trend <\/strong>which will also help us understand the additive model more clearly.<\/p>\n<p>Consider a household\u2019s <strong>electricity consumption<\/strong>. Suppose the household uses <strong>20% more<\/strong> electricity in summer compared to winter. That means the seasonal effect isn\u2019t a fixed number\u200a\u2014\u200ait\u2019s a <strong>proportion<\/strong> of their baseline usage.<\/p>\n<p>Let\u2019s see how this looks with real numbers:<\/p>\n<p class=\"wp-block-paragraph\">In 2021, the household used 300 kWh in winter and 360 kWh in summer (20% more than winter).<\/p>\n<p class=\"wp-block-paragraph\">In 2022, their winter consumption increased to 330 kWh, and summer usage rose to 396 kWh (still 20% more than winter).<\/p>\n<p class=\"wp-block-paragraph\">In both years, the seasonal difference <strong>grows with the trend<\/strong>\u200a \u200afrom +60 kWh in 2021 to +66 kWh in 2022\u200a \u200aeven though the <strong>percentage increase stays the same<\/strong>. This is exactly the kind of behavior that a <strong>multiplicative model captures<\/strong> well.<\/p>\n<p>In mathematical terms:<br \/>Y = T \u00d7S \u00d7R\u00a0<br \/>Where:<br \/>Y\u200b: Observed value<br \/>T: Trend component<br \/>S: Seasonal component<br \/>R\u200b: Residual (noise)<\/p>\n<p>By looking at the decomposition plot, we can figure out whether an additive or multiplicative model fits our data better.<\/p>\n<p>There are also other powerful decomposition tools available, which I\u2019ll be covering in one of my upcoming blog posts.Now that we have a clear understanding of additive and multiplicative models, let\u2019s shift our focus to applying a baseline model that fits this dataset.<\/p>\n<p>Based on the decomposition plot, we can see a strong seasonal pattern in the data, which suggests that a <strong>Seasonal Naive model<\/strong> might be a good fit for this time series.<\/p>\n<p>This model assumes that the value at a given time will be the <strong>same as it was in the same period of the previous season<\/strong>\u200a\u2014\u200amaking it a simple yet effective choice when seasonality is dominant and consistent. For example, if temperatures typically follow the same yearly cycle, then the forecast for July 1st, 1990, would simply be the temperature recorded on July 1st, 1989.<\/p>\n<p><strong>Code:<\/strong><\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-python\">import pandas as pd\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n# Load the dataset\ndf = pd.read_csv(\"minimum daily temperatures data.csv\")\n\n# Convert 'Date' column to datetime and set as index\ndf['Date'] = pd.to_datetime(df['Date'], dayfirst=True)\ndf.set_index('Date', inplace=True)\n\n# Ensure regular daily frequency and fill missing values\ndf = df.asfreq('D')\ndf['Temp'].fillna(method='ffill', inplace=True)\n\n# Step 1: Create the Seasonal Naive Forecast\nseasonal_period = 365  # Assuming yearly seasonality for daily data\n# Create the Seasonal Naive forecast by shifting the temperature values by 365 days\ndf['Seasonal_Naive'] = df['Temp'].shift(seasonal_period)\n\n# Step 2: Plot the actual vs forecasted values\n# Plot the last 2 years (730 days) of data to compare\nplt.figure(figsize=(12, 5))\nplt.plot(df['Temp'][-730:], label='Actual')\nplt.plot(df['Seasonal_Naive'][-730:], label='Seasonal Naive Forecast', linestyle='--')\nplt.title('Seasonal Naive Forecast vs Actual Temperatures')\nplt.xlabel('Date')\nplt.ylabel('Temperature (\u00b0C)')\nplt.legend()\nplt.tight_layout()\nplt.show()\n\n# Step 3: Evaluate using MAPE (Mean Absolute Percentage Error)\n# Use the last 365 days for testing\ntest = df[['Temp', 'Seasonal_Naive']].iloc[-365:].copy()\ntest.dropna(inplace=True)\n\n# MAPE Calculation\nmape = np.mean(np.abs((test['Temp'] - test['Seasonal_Naive']) \/ test['Temp'])) * 100\nprint(f\"MAPE (Seasonal Naive Forecast): {mape:.2f}%\")<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Output:<\/p>\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/contributor.insightmediagroup.io\/wp-content\/uploads\/2025\/04\/decomp1-1.png?ssl=1\" alt=\"\" class=\"wp-image-601367\"><figcaption class=\"wp-element-caption\">Seasonal Naive Forecast vs. Actual Temperatures (1989\u20131990)<\/figcaption><\/figure>\n<p class=\"has-text-align-left wp-block-paragraph\">To keep the visualization clear and focused, we\u2019ve plotted the <strong>last two years<\/strong> of the dataset (1989\u20131990) instead of all 10 years.<\/p>\n<p class=\"has-text-align-left wp-block-paragraph\">This plot compares the <strong>actual daily minimum temperatures<\/strong> in Melbourne with the values predicted by the <strong>Seasonal Naive model<\/strong>, which simply assumes that each day\u2019s temperature will be the same as it was on the <strong>same day one year ago<\/strong>.<\/p>\n<p class=\"has-text-align-left wp-block-paragraph\">As seen in the plot, the Seasonal Naive forecast captures the <strong>broad shape of the seasonal cycles<\/strong> quite well\u200a\u2014\u200ait mirrors the rise and fall of temperatures throughout the year. However, it doesn\u2019t capture day-to-day variations, nor does it respond to slight shifts in seasonal timing. This is expected, as the model is designed to repeat the previous year\u2019s pattern <strong>exactly<\/strong>, without adjusting for trend or noise.<\/p>\n<p class=\"has-text-align-left wp-block-paragraph\">To evaluate how well this model performs, we calculate the <strong>Mean Absolute Percentage Error (MAPE)<\/strong> over the final 365 days of the dataset (i.e., 1990). We only use this period because the Seasonal Naive forecast needs <strong>a full year of historical data<\/strong> before it can begin making predictions.<\/p>\n<p><strong>Mean Absolute Percentage Error (MAPE)<\/strong> is a commonly used metric to evaluate the accuracy of forecasting models. It measures the <strong>average absolute difference between the actual and predicted values<\/strong>, expressed as a <strong>percentage of the actual values<\/strong>.<\/p>\n<p>In time series forecasting, we typically evaluate model performance on the <strong>most recent or target time period<\/strong>\u200a\u2014\u200anot on the middle years. This reflects how forecasts are used in the real world: we build models on historical data to predict what\u2019s coming next.<\/p>\n<p>That\u2019s why we calculate MAPE only on the <strong>final 365 days<\/strong> of the dataset\u200a\u2014\u200athis simulates forecasting for a future and gives us a realistic measure of how well the model would perform in practice.<\/p>\n<p>A <strong>MAPE of 28.23%<\/strong>, which gives us a baseline level of forecasting error. Any model we build next\u200a\u2014\u200awhether it\u2019s customized or more advanced, should aim to outperform this benchmark.<\/p>\n<p class=\"has-text-align-left wp-block-paragraph\">A <strong>MAPE of 28.23%<\/strong> means that, on average, the model\u2019s predictions were <strong>28.23% off<\/strong> from the actual daily temperature values over the last year.<\/p>\n<p>In other words, if the true temperature on a given day was 10\u00b0C, the Seasonal Na\u00efve forecast might have been around 7.2\u00b0C or 12.8\u00b0C, reflecting a 28% deviation.<\/p>\n<p>I\u2019ll dive deeper into evaluation metrics in a future post.<\/p>\n<p>In this post, we laid the foundation for time series forecasting by understanding how real-world data can be broken down into <strong>trend<\/strong>, <strong>seasonality<\/strong>, and <strong>residuals<\/strong> through decomposition. We explored the difference between <strong>additive and multiplicative models<\/strong>, implemented the <strong>Seasonal Naive baseline forecast<\/strong> and evaluated its performance using <strong>MAPE<\/strong>.<\/p>\n<p>While the Seasonal Naive model is simple and intuitive, it comes with limitations especially for this dataset. It assumes that the temperature on any given day is identical to the same day last year. But as the plot and MAPE of <strong>28.23%<\/strong> showed, this assumption doesn\u2019t hold perfectly. The data displays slight shifts in seasonal patterns and long-term variations that the model fails to capture.<\/p>\n<p>In the next part of this series, we\u2019ll go further. We\u2019ll explore how to <strong>customize a baseline model<\/strong>, compare it to the Seasonal Naive approach and evaluate which one performs better using error metrics like <strong>MAPE<\/strong>, <strong>MAE<\/strong> and <strong>RMSE<\/strong>.<\/p>\n<p>We\u2019ll also begin building the foundation needed to understand more advanced models like <strong>ARIMA<\/strong> including key concepts such as:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\"><strong>Stationarity<\/strong><\/li>\n<li class=\"wp-block-list-item\"><strong>Autocorrelation and Partial Autocorrelation\u00a0<\/strong><\/li>\n<li class=\"wp-block-list-item\"><strong>Differencing<\/strong><\/li>\n<li class=\"wp-block-list-item\"><strong>Lag-based modeling (AR and MA terms)<\/strong><\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">Part 2 will dive into these topics in more detail,\u200astarting with custom baselines and ending with the foundations of ARIMA.<\/p>\n<p class=\"wp-block-paragraph\">Thanks for reading. \u200aI hope you found this post helpful and insightful.<\/p>\n<p>The post <a href=\"https:\/\/towardsdatascience.com\/time-series-forecasting-made-simple-part-1-decomposition-baseline-models\/\">Time Series Forecasting Made Simple (Part 1): Decomposition and Baseline\u00a0Models<\/a> appeared first on <a href=\"https:\/\/towardsdatascience.com\/\">Towards Data Science<\/a>.<\/p>\n<\/div>\n<p> \t<BR><br \/>\n <BR><\/BR><br \/>\n    Nikhil Dasari<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n<a href=\"https:\/\/towardsdatascience.com\/time-series-forecasting-made-simple-part-1-decomposition-baseline-models\/\">Go to original source<\/a><br \/>\n \t<BR><br \/>\n <BR><\/BR><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Time Series Forecasting Made Simple (Part 1): Decomposition and Baseline\u00a0Models I used to avoid time series analysis. Every time I took an online course, I\u2019d see a module titled \u201cTime Series Analysis\u201d with subtopics like Fourier Transforms, autocorrelation functions and other intimidating terms. I don\u2019t know why, but I always found a reason to avoid [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[62,83,82,2337,157,2338,354],"tags":[325,305,15],"class_list":["post-2997","post","type-post","status-publish","format-standard","hentry","category-aimldsaimlds","category-data-science","category-data-visualization","category-forecasting","category-python","category-time-series","category-time-series-analysis","tag-series","tag-simple","tag-time"],"_links":{"self":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts\/2997"}],"collection":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/comments?post=2997"}],"version-history":[{"count":0,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/posts\/2997\/revisions"}],"wp:attachment":[{"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/media?parent=2997"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/categories?post=2997"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mailitics.com\/index.php\/wp-json\/wp\/v2\/tags?post=2997"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}