0
$\begingroup$

I have already asked a simmilar question, but i thoguth that this was not phrased well and hence i am trying a new post were i ask a better question. Let me know if this is ok. Judging by some of the questions i find on this side, i think this might be of general interest.

I want to estmiate future prices of a specific workwear Product that exists in various iterations for a long time already. This Product is manufactured by many different Companies. I have the following problems:

  • The historic data is not evently spaced at all. Due to the fact that price were not collected regularly.

  • Since a new change in the Price point refelcts a well-considered decision off lets say a Pricing Manager to set a price at this specific point in time, i do not want to simply resample the data.

  • The relative movement of the Prices refelects the fact that there is actual competition between theses Products and Prices have a relation

  • Some manufacturer base their Prices on fixed rules it seems (they want to be roughly x percent way from the marked leader).

  • But there are a lot of irregularites and weird spikes

I have tried classical time-series forecasting methods like ARIMA and SARIMA but this hasn't worked out very well. I also tried XGBoost (trend was substracted) but that was also not a very good approach.

Here is some mock data i have made up which should refelct what i mean:

    data = [[46.973875522907306 0 Timestamp('2021-03-27 16:37:46.154145')]
             [44.35252088802274 0 Timestamp('2022-12-27 18:21:30.328597')]
             [68.21352717829075 1 Timestamp('2023-03-27 23:41:28.414013')]
             [71.17857662522553 1 Timestamp('2024-05-26 14:02:55.713708')]
             [73.63691230335472 1 Timestamp('2025-05-26 17:57:42.535576')]
             [49.83693332959583 0 Timestamp('2025-07-28 19:03:14.018437')]
             [41.907214364319955 2 Timestamp('2025-11-28 21:21:33.049803')]
             [72.29112351512151 1 Timestamp('2026-03-27 14:29:14.677564')]
             [42.5122040449943 2 Timestamp('2026-11-28 11:57:19.370834')]
             [73.16654172146661 1 Timestamp('2026-11-26 06:41:38.587692')]
             [40.10218751476946 2 Timestamp('2027-02-27 22:51:07.386227')]
             [73.69381611275628 1 Timestamp('2027-02-25 12:26:30.725602')]
             [43.75972091358219 2 Timestamp('2028-02-25 09:48:08.106932')]
             [76.36436699738304 1 Timestamp('2028-03-28 21:13:44.591403')]
             [78.52703760328819 1 Timestamp('2028-05-26 00:10:46.953340')]
             [51.8892700693659 0 Timestamp('2028-09-26 22:38:52.944749')]
             [45.425899965689375 0 Timestamp('2028-12-27 03:46:08.210155')]
             [77.9199863343448 1 Timestamp('2029-02-25 04:48:42.741950')]
             [73.99751031796518 1 Timestamp('2029-11-26 10:45:05.004740')]
             [41.57406664391081 2 Timestamp('2029-11-28 06:31:03.377883')]
             [47.25251952878873 0 Timestamp('2029-12-28 23:23:17.161067')]
             [65.62167039557808 1 Timestamp('2030-02-25 01:08:21.705227')]
             [43.896697654919784 2 Timestamp('2030-02-26 14:09:07.264185')]
             [46.37889683671621 0 Timestamp('2030-11-27 17:08:13.271654')]
             [49.08107903397994 0 Timestamp('2030-12-27 06:15:26.871337')]
             [70.67978622818958 0 Timestamp('2031-04-29 15:12:30.338581')]
             [46.782755985386395 2 Timestamp('2031-05-29 04:18:15.530916')]
             [46.95734884550723 2 Timestamp('2031-08-27 20:31:57.981432')]
             [64.64192432936557 0 Timestamp('2031-10-28 11:00:40.376479')]
             [70.27867414577389 1 Timestamp('2031-11-28 01:11:17.440942')]
             [46.24517460916999 0 Timestamp('2031-12-30 03:54:53.458656')]
             [46.38294760484696 0 Timestamp('2032-05-26 15:30:17.290844')]
             [48.69288430082989 0 Timestamp('2033-01-30 03:08:49.179457')]
             [73.70014060044196 1 Timestamp('2033-05-28 22:10:20.736444')]
             [47.098229970655424 0 Timestamp('2034-02-24 07:05:42.360137')]
             [53.917296116962206 2 Timestamp('2035-08-29 23:17:14.261876')]
             [47.06145863863456 0 Timestamp('2036-01-27 04:00:33.246190')]
             [67.68805788357842 1 Timestamp('2036-02-26 18:19:42.329297')]
             [52.96554572455424 0 Timestamp('2036-07-12 12:17:38.665539')]
             [28.61486794761162 0 Timestamp('2036-08-28 17:49:22.089019')]
             [54.03998534849586 0 Timestamp('2036-09-05 08:56:48.038756')]
             [26.85426831085534 0 Timestamp('2036-10-17 20:34:22.194252')]
             [72.16772600720459 1 Timestamp('2036-11-27 10:06:14.601262')]
             [52.03611868020452 0 Timestamp('2037-01-31 03:40:47.105633')]
             [58.13013601565125 2 Timestamp('2037-05-27 05:44:48.338077')]
             [56.405229198398715 0 Timestamp('2037-09-13 20:46:33.570763')]
             [77.21166201161871 1 Timestamp('2037-11-26 08:47:42.256874')]
             [83.10182462721393 1 Timestamp('2038-11-27 12:11:12.207872')]
             [56.41752906083321 0 Timestamp('2039-05-28 07:01:55.286433')]
             [63.68417115856966 2 Timestamp('2039-07-30 14:09:40.098011')]
             [86.7444660866586 1 Timestamp('2039-12-29 19:46:01.355680')]
             [57.514698270308884 0 Timestamp('2040-04-02 21:56:44.179670')]
             [71.03765512944545 2 Timestamp('2040-05-27 14:04:08.328799')]
             [87.59541350193352 1 Timestamp('2041-01-26 18:37:35.449018')]
             [57.50604733567312 0 Timestamp('2041-03-02 05:49:18.714669')]
             [63.41229225782287 0 Timestamp('2042-01-27 20:39:03.812432')]
             [83.13342093601007 2 Timestamp('2044-07-28 18:08:26.390386')]
             [70.74682263511946 1 Timestamp('2044-10-26 02:26:55.200576')]]

df = pd.DataFrame({'Price': data[:, 0], 'ID': data[:, 1],'Timestamp': data[:, 2]})

This should look like this:

enter image description here

In princeple i could argue that the data is only irregular spaced since the price which were collected manualy have not been checked often enough. So I could assume that they are the same until the next price change happend and simply resample them.

df_ID1 = df.loc[shoe_Price['ID'] == 1]
df_ID1_resampled = df_ID1.set_index('Timestamp').resample('M').pad()
df_ID1_resampled.sort_index()

This looks slighty better for forecasting... but i am still really unsure what to try

enter image description here

As i said classical time-series forecasting methods i konw of have not worked so far. I tried to use XGBoost based on a Kaggle i found but it did not work any better.

Any pointer would be appreciated!

$\endgroup$
1
  • 1
    $\begingroup$ That look much better! posters here need to think that there are around 100 new questions each day, and only around 50% get answered. Think about the title as your first level of marketing! $\endgroup$ Commented Feb 3, 2022 at 15:05

1 Answer 1

0
$\begingroup$

My advice:

  1. Create regularly-spaced time series. Start with monthly. In some cases, there may be multiple price changes during the month and you can only use the last one. In other cases, there may be no price change in a month so its value will be the same as the previous month. This is all OK. Can do the same but with a weekly time series.
  2. Put aside xgboost for now and use and exponential time smoothing method that is able to select and fit terms for level, trend, and seasonality. I don't really recommend ARIMA. For the weekly time series, seasonality is a little more complex and you can try TBATS.
  3. Take a step back and decide if forecasting prices accomplishes what you need, and if you can provide alternative or additional value forecasting sales, or forecasting for a larger portfolio of products. Perspective and scope are critical.
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.