Планируется, что в базу будут попадать цифры.
Простой пример
3
6
2
8
11
3
5
9
15
8
1
Можно ли создать условие, чтобы засечь максимальное движение цифр в одну сторону на убывание или наооброт на восхождение.
т.е. идея тренда
Например мне нужно четкое движение в одну строну более чем на 9 едениц.
Я выделил жирным.
Как создать условие ??
Буду рад любым советам и идеям.)
Спустя 1 час, 5 минут, 34 секунды (26.03.2011 - 17:59) panacea написал(а):
Распределение Гаусса чтоли?
Спустя 2 часа, 14 минут, 28 секунд (26.03.2011 - 20:13) dima4321 написал(а):
panacea
Да хрен знает как это называется.))
Нужно определение тренда
Да хрен знает как это называется.))
Нужно определение тренда
Спустя 16 минут, 18 секунд (26.03.2011 - 20:29) Trianon написал(а):
чем 3 5 9 15 не подошло?
Спустя 2 часа, 37 минут, 37 секунд (26.03.2011 - 23:07) dima4321 написал(а):
Trianon
Подошло )) Спасибо не заметил.
Есть идеи как реализовать
Чтобы было понятней:
2 6 14 ---это подьем вверх на 12 едениц (14-2=12)
1 3 5 7 это подъем вверх на 6 едениц (7-1=6)
вот набор 1- 3 -8-2 -16 -5- 7 -25-23-20-22
Здесь самый лучший восходящий тренд 5-7-25 ( берем крайние точки и получаем 25-5=20)
Подошло )) Спасибо не заметил.
Есть идеи как реализовать
Чтобы было понятней:
2 6 14 ---это подьем вверх на 12 едениц (14-2=12)
1 3 5 7 это подъем вверх на 6 едениц (7-1=6)
вот набор 1- 3 -8-2 -16 -5- 7 -25-23-20-22
Здесь самый лучший восходящий тренд 5-7-25 ( берем крайние точки и получаем 25-5=20)
Т.е. мне нужен скрипт который будет ловить например 10 едениц
2-8-12-3-1-6-16
подходят эти тренды
2-8-12
6-16
Спустя 55 минут, 18 секунд (27.03.2011 - 00:02) panacea написал(а):
Ну и вычитай $arr[$a]-$arr[$b]
где $b=$a-10
где $b=$a-10
Спустя 43 минуты, 41 секунда (27.03.2011 - 00:46) Trianon написал(а):
а в ряду 1 3 5 5 5 7 3 1
Что должно найти?
Что должно найти?
Спустя 9 часов, 54 минуты, 54 секунды (27.03.2011 - 09:41) dima4321 написал(а):
Trianon
1 3 5 5 5 7---восходящий тренд на 6 единиц вверх
если бы искали еще и нисходящий тренд то в твоем примере подходит
7 3 1 низходящий тренд на 6 едениц
Жду предложений как и что в какую сторону копать
panacea не совсем тебя понял. Можно чуть подробней ))??
1 3 5 5 5 7---восходящий тренд на 6 единиц вверх
если бы искали еще и нисходящий тренд то в твоем примере подходит
7 3 1 низходящий тренд на 6 едениц
Жду предложений как и что в какую сторону копать
panacea не совсем тебя понял. Можно чуть подробней ))??
Спустя 54 минуты, 19 секунд (27.03.2011 - 10:35) quickxyan написал(а):
Цитата (dima4321 @ 26.03.2011 - 20:07) |
Т.е. мне нужен скрипт который будет ловить например 10 едениц 2-8-12-3-1-6-16 подходят эти тренды 2-8-12 6-16 |
а почему 6-16, а не 1-6-16 - если я правильно понял логику!
ну я не понимаю в чем собственно проблема.
есть у тебя масив чисел. перебираешь каждое и если первое число больше второго, то это уже твой тренд. можна записать в новый массив, а еще один массив можно записать где начинается тренд и где когчается. если в одном масиве их будет несколько, то ты не будеш по новой проверки делать, а просто брать позиции с другого масива.
Спустя 5 минут, 48 секунд (27.03.2011 - 10:41) kirik написал(а):
Задача интересна :)
Естественно нужно дорабатывать немного :)
UPD
Поправлен баг..
вот моё "индорешение" для восходящих
// $ns = array(1,3,1,3,4,5,7,2,6,2);
// $ns = array(2,8,12,3,1,6,16);
$ns = array(1,3,8,2,16,5,7,25,23,20,22);
$trands = array();
$up_t = array();
// $down_t = array();
$pn = 0;
$tn = 1;
foreach($ns as $n) {
if($n < $pn) {
$tn++;
}
$trands[$tn][] = $n;
$up_t[$tn] = end($trands[$tn]) - $trands[$tn][0];
$pn = $n;
}
// print_r($trands); // наборы трэндов
// print_r($up_t); // на сколько восходят
arsort($up_t);
reset($up_t);
$k = key($up_t);
echo "\n<br />лучший трэнд:<br />\n";
echo str_replace(implode(',', $trands[$k]), '<b style="color:red">' . implode(',', $trands[$k]) . '</b>', implode(',', $ns)) . ' c разницей в ' . $up_t[$k];
Естественно нужно дорабатывать немного :)
UPD
Поправлен баг..
Спустя 31 минута, 15 секунд (27.03.2011 - 11:12) Trianon написал(а):
получившийся код...
<pre>
<?php
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
$list = array(1,3,5,5,5,7,3,1,1,3, 8, 2,16, 5, 7,25,23,20,22);
for($tr = array(), $v = 0, $c = $list[$s=$e=0], $i = 1, $n = count($list);
$i < $n;
$c = $list[$i++])
{
$x = $list[$i];
if($v < 0 && $x > $c || $v > 0 && $x < $c)
{
if($e > $s+1)
{
$t = array('start' => $s, 'end' => $e, 'trend' => $list[$e]-$list[$s] );
$tr[] = $t;
}
$c = $list[$s = $i-1];
$v = $x - $c;
}
if(!$v) $v = $x - $c;
if($x != $c) $e = $i;
}
print_r($tr);
?>
пример и отклик:
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
//1,3,5,5,5,7,3,1,1,3, 8, 2,16, 5, 7,25,23,20,22
Array (
[0] => Array ( [start] => 0 [end] => 5 [trend] => 6 )
[1] => Array ( [start] => 5 [end] => 7 [trend] => -6 )
[2] => Array ( [start] => 8 [end] => 10 [trend] => 7 )
[3] => Array ( [start] => 13 [end] => 15 [trend] => 20 )
[4] => Array ( [start] => 15 [end] => 17 [trend] => -5 )
)
собственно код не причесан. Только для иллюстрации логики.
Спустя 2 дня, 2 часа, 6 минут, 40 секунд (29.03.2011 - 13:19) dima4321 написал(а):
Вот, что получилось у меня ))
<?php
// тренд вверх
$array = array(3, 6,9,10,12, 2, 8, 11, 3, 5, 9, 15, 8, 1);
$cmax['last']=0;
for($i = 0; $i < count($array); $i++){
if($array[$i] > $cmax['last'])
{
$cmax['last'] = $array[$i];
$new[]=$array[$i]."-";
if(count($new)>3)
{
echo "<pre>";
print_r($new);
echo "</pre>";
}
}
else
{
unset($new);
$cmax['last'] = $array[$i];
$new[]=$array[$i]."-";
}
}
?>
_____________
Работаю за еду ! __))
И за плюсики !