Прогноз продаж (что можно выжать из метода наименьших квадратов)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

27 Comments

  1. Поручик

    Мощно. Сейчас пробую и видно не дождусь результата. 😀

    Reply
  2. RayCon

    Молодец! Побольше бы таких концептуальных решений!

    Reply
  3. Поручик

    Я бы добавил обработку прерывания. Так и не дождался результата на группе 1.500 позиций.

    Reply
  4. V_V_V

    Шоб я сдох… Великолепная работа!

    Правда ничего не понял… 😀

    Если б описание методики поподробнее увидеть…

    Reply
  5. CheBurator

    угумс.. и подтверждение гипотезы что анализируемые продажи — случайный процесс (?).

    каковы минимальные длины выборок?

    как работает на малой статистике?

    где описание методики? — сделать качественное — и продавать за деньги!!!

    .

    вопрос сообществу: вы много знаете своих клиентов/людей которые будут использовать данный продукт осознанно, а не в качестве чернйо коробочки?

    Reply
  6. Поручик

    (4) Присоединяюсь. Честно прогнал по немалой базе, нихрена не понял, хоть и изучал в своё время упомянутые умные буквы.

    (5) ответ: знаю по меньшей мере одного.

    Reply
  7. CheBurator

    (6) по (5) — одного из скольки?

    Reply
  8. Поручик

    Примерно десяток. Это те, кто активно работает с торговлей.

    Reply
  9. yurigural
    {Форма.Форма(501)}: Индекс находится за границами массива

    знч = табТМЦ[индексСтроки-индексВеса].Расход;

    ДЛЯ каждого дп ИЗ мДА Цикл
    стр = СтрокаТабТМЦ(табТМЦ, дп);
    стр.ЛРФ = 0;
    индексСтроки = табТМЦ.Индекс(стр);
    индексВеса = 0;
    ДЛЯ каждого вес ИЗ весаФормулы Цикл
    индексВеса = индексВеса+1;
    знч = табТМЦ[индексСтроки-индексВеса].Расход;
    стр.ЛРФ = стр.ЛРФ+вес[0]*знч;
    КонецЦикла;
    …
    

    Показать

    индексСтроки = 0

    индексВеса = 1

    не доработка однако.

    Reply
  10. Mikeware

    Интересно. Делал аналогичное, но «не взлетело» из-за вариативности поставок (т.е. много аналогов, при поставках заменяется товар другим товаром в пределах одной группы. Причем группы явно не формализованы )

    Reply
  11. adapter

    (6) Думаю что тому одному из многих хватит и стандартной надстройки в Ексель 😉

    Reply
  12. Михаил Козлов

    (3) 1500 много, конечно. Обработку прерывания поставить можно.

    (9) Было такое при периодичности Декада, вроде исправил (в Вашем случае может и не в этом дело).

    По поводу практической пользы. Я тоже сильно сомневаюсь, что есть реальный интерес. К тому же, можно выгрузить данные и пользоваться пакетами технического анализа. Хотя, по-моему, и от них будет не много прока.

    Мне понравился метод «гусеница» (SSA) (http://www.gistatgroup.com/gus/), хотел сделать его, скачал демку, погонял на реальных данных (несколько десятков рядов). Совпадения на анализируемом периоде можно добиться изумительного, а вот в части прогноза — 50/50.

    Цель публикации не столько предложение пользоваться этими методами, сколько дать готовый «инструмент» для выяснения: есть ли смысл ими пользоваться.

    Reply
  13. V_V_V

    (12) Просто дать «инструмент» мало — нужно еще уметь им пользоваться или хотя бы понимать принцип его действия. Вот с этим будет проблема у многих…

    Совпадения на анализируемом периоде можно добиться изумительного

    Имеется ввиду, что метод восстанавливает с большой точностью пропущенные значения? И при этом слаб на прогноз?

    Reply
  14. Михаил Козлов

    (13) Имеется в виду совпадение фактических данных и данных аппроксимации.

    В части прогноза по просчитанным примерам совпадение прогноза с фактическими данными было не очень. Да Вы скачайте демку. Идея метода: анализ матрицы автокорреляции и выделение в ней «главных» компонент (закономерностей). Фактические данные можно грузить из Экселя.

    Reply
  15. ildarovich

    Поставил плюс, хотя считаю, что прогнозирование продаж по историческим данным — не результативный способ. Дело в том, что продажи прошлых периодов — не такие уж значимые факторы по сравнению с известными (и, возможно, имеющимися в БД) параметрами воронки продаж: затратами на рекламу, рекламным покрытием, числом «интересов», числом принятых заказов и т.п. Потом есть цена, день недели, сезон, объем запасов покупателей и другие факторы. Ради интереса попробуйте спрогнозировать тем же методом погоду, курс доллара или акций. Думаю, точность прогноза по тем же причинам будет похожей (низкой).

    Без знания «физики», то есть без достоверной модели зависимостей, определение коэффициентов этих зависимостей не имеет смысла.

    Reply
  16. Арчибальд

    (15) Согласен, что прогноз «от истории» будет слабо коррелировать с последующим фактом. Тем не менее, заслуживает всяческого внимания и развития принципиальное осознание необходимости математических методов в бизнесе. Когда-то на этом поприще мы были «впререди планеты всей» — имеется в виду Василий Леонтьев. Теперь не то уж…

    Reply
  17. Sun_AIG

    Круто, у меня от прочтения описания уже мозг вскипел 🙂 попробую на базе. Однознчано ПЛЮС

    Reply
  18. igyo

    Тут надо еще книжку приложить, чтоб понять как этим делом пользоваться! Очень умно! +

    Reply
  19. Arvend

    Глючит однако, еще глюк не выкупил попробую подправить и без бутылки с функционалом тут не разобраться, хотелось бы хелпа. 🙂

    Reply
  20. Шёпот теней

    … прогнозирование на основании статистических данных … делается не для расчёта «будущих продаж» а для расчёта вероятности такого события и для дополнительных расчётов …

    … сезонность … эластичность … к тому же не совпадение расчетной величины с реальной — говорит нам о прохождении экстремума … изменении рынка и т.д. и т.п. …

    после экстремумов — можно рассчитывать длинну и пропорции трендов, например … а их изменения, в свою очередь, говорят о динамике ожиданий … равновесности рынка … и куче ещё чего …

    один параметр — ничего не значит … только совокупность … изменения нескольких парметров — уже говорит о многом … уже диагноз … !

    … вот …

    п.с. тенденции важнее абсолютных значений … ! … ОДНОЗНАЧНО … !

    Reply
  21. ArtfulCrom

    (20) да уж… видеть сквозь цифры тенденции — это и есть тот инструмент который позволяет сколотить состояния. Обычно те кто умеют — инструменты используют самые простые. А ТЕ КТО НЕ УМЕЮТ — ИМ даже такие мега-перфораторы не помогают…

    но мы уже как то об этом говорили 🙂

    Reply
  22. Шёпот теней

    (21) … ))) …

    … хм … к сожалению есть ещё понятие «конкуренция» и «конкурентная среда» … отсутствие таких полей в области «экономическоая деятельность» приводит к тому , что устраняется и сам механизм принятие «экономических решений» и сама — «экономическая деятельность» …

    … поэтому на поговорку: «если такой умный, то почему такой бедный» есть ответ — «сам дурак» …

    … вот …

    Reply
  23. ArtfulCrom

    (22) ну не хочется поднимать вопрос о курице и яйце, но все таки. Что первично в успешном бизнесе? Мозг или инструмент принятия решений? Вот в моей личной практике — я обычно приходил к людям которые и так на «чутье» всегда принимали более/менее точные решение. И когда ты им рассказывал про эффективность, оборачиваемость и прочий АВСХУЗ и они это понимали, давал инструмент…. — вот тогда бизнес взлетал.

    А бывает придешь… втираешь-втираешь про оптимизацию… на тебя смотрят… типа … ты чё? учить нас вздумал? кхе… и катятся по накатанной схеме уже лет 10 ничего не меняя и тоже ведь не дохнут гады.. хотя внутри нифига такого нет 🙂

    Reply
  24. Шёпот теней

    (22) … ))) …

    … ммм … хм … ? … Вы спросили или Вы ответили … ? …!

    … вот …

    Reply
  25. Шёпот теней

    (22) … принимать «на чутье» … это профессионализмь выше среднего …

    … но любая автоматизация — бЬёт любую попытку «массового» профессионалиЬма …

    … «кадры» решают ВСЁ …

    … излишняя автоматизация «убивает» передовые технологии …

    … излишняя «стандартизация» есть Погибель …

    … вопрос «золотой середины» … в исскустве существует «золотое сечение» кто сказал что исскуство не повторяет жизнь … ? … ! …

    … если НЕТ течения — то получается болото …

    … уффф …

    п.с. так или иначе «сегодня» выгоднее банально-воровать чем индуктивно-производить … следовательно система состоит из уравнений с одним неизвестным — т.е. имеет … однозначные ур»о/а»внения … т.е., по факту не является системой уравнений а является набором «простых» уравнений …

    … такГДЕжеКОНКУРЕНЦИЯвот …

    п.с.2. глубина и ширина «ВЫ»ставляемых обществом или производством задачЪ — требуют соотвествущих инструментов и методов а так же требуют определённую категорию выполняющих … выводы соответствующие …

    п.с.3 … от военных пришло (или наоборот … ) — чем больше ложных целей выдал противнику — тем эффективнее и эффектнее победа … манёвр — самое эффективное оружие … гыыы … кажется НИоЧЁМ — но на самом деле экономика — есть оружие и в ней манёвр как и централизация — сверхВажное оружие

    … вотМИКРОскопВОТ …

    Reply
  26. Vanillavera

    Мхм…Михаил, разве метод Холта-Винтерса не предполагает сглаживание с тремя параметрами?

    Еще должны учитываться сезонные колебания?

    Reply
  27. anreko

    Да, математика это сила.

    Вещь стоящая, но для склада сложность не нужна.

    Нужно учитывать стоимость хранения, сезонную зависимость покупки.

    А так МНК — это конечно тема.

    Очень надеюсь на развитие со складским уклоном, там статистику ABC прикрутить и взлетит.

    Также сглаживания в складском учете не очень интересно, лучше как раз скачки анализировать, а то далеко от реальности получится.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *