【问题标题】:PHP: Price range / average calculation based on historical dataPHP:基于历史数据的价格范围/平均值计算
【发布时间】:2017-03-20 01:23:55
【问题描述】:

我正在构建一个小应用程序,用于分析 ebay 已售商品的历史价格 对于某些关键字/项目,范围非常广泛,因为搜索范围太广或根本错误,被不正确相关的项目感染

例如。

iphone 的搜索价格结果包括手机,但 还有掺假价格数据的充电器和配件/无关物品... 所以我有一个范围,一个充电器 5 美元,一个充电器 500 美元 手机

所以,鉴于我将尝试改进我这边的搜索,我想知道是否有数学计算来排除异常值

说我有

$1200
$549
$399
$519
$9
$599
$549
$9
$499 
$399
$519
$99
$5
$5

我如何将价格范围设为 300-600 美元而不是 10-800 美元左右...

她在当前使用的 php 之下...不确定是否是最好的

    function remove_outliers($dataset, $magnitude = 1)
{
    $count     = count($dataset);
    $mean      = array_sum($dataset) / $count;                                                                                             // Calculate the mean
    $deviation = sqrt(array_sum(array_map("sd_square", $dataset, array_fill(0, $count, $mean))) / $count) * $magnitude;                    // Calculate standard deviation and times by magnitude
    return array_filter($dataset, function ($x) use ($mean, $deviation) {return ($x <= $mean + $deviation && $x >= $mean - $deviation);}); // Return filtered array of values that lie within $mean +- $deviation.
}

function sd_square($x, $mean)
{
    return pow($x - $mean, 2);
}

function calculate_median($arr)
{
    sort($arr);
    $count     = count($arr);             
    $middleval = floor(($count - 1) / 2);  
    if ($count % 2) { 
        $median = $arr[$middleval];
    } else { 
        $low    = $arr[$middleval];
        $high   = $arr[$middleval + 1];
        $median = (($low + $high) / 2);
    }
    return $median;
}

 $prices = remove_outliers($prices); //$prices is the array with all the prices stored
 $trend  = calculate_median($prices);
$trend  = round(($trend));
$min    = round(min($prices));
$max    = round(max($prices));

【问题讨论】:

  • 您无法确定大部分项目都在合理范围内。这就是为什么您的计算会提供结果,但您绝对无法判断该结果是否有意义。在事先不知道估计范围的情况下,您无法进行此类计算。
  • 如何将范围与我确定的新商品的当前价格进行比较,具体商品的价格如何?可以作为中心点吗?
  • 是的,这是可能的,但前提是您知道这个价格实际上在预期范围内。这只会将问题转移到您是否有可靠的主要来源。
  • 当范围太宽(从 1 美元到 1000 美元),或者范围有太多值而不是相同范围内的值时,如何检测/排除?我不是数学家,所以我只是猜测......
  • 在不知道数据点拓扑的情况下尝试过滤某些内容是不可能的。

标签: php average median


【解决方案1】:

我觉得这个功能很有用。 $cleaness 变量将提供粒度

/**
* Returns an average value from a dirt list of numbers.
*
* @require
* 
* $numbers  = an array of numbers
* $cleaness = a percentage value
* 
* @return integer
*   an average value from a cleaner list.
*/  

public function CleanAverage ( $numbers, $cleaness )  {

  
  // A 
  $extremes_to_remove = floor(count($numbers)/100*$cleaness);
  if ($extremes_to_remove < 2) {$extremes_to_remove = 2;}
        
  
  // B 
  sort ($numbers)         ; 
  
  
  // C
  //remove $extremes from top
  for ($i = 0; $i < ($extremes_to_remove/2); $i++)  {
    array_pop($numbers);
  }
  
  
  // D
  // revers order
  rsort($numbers);      
  
  
  // E
  //remove $extremes from top
  for ( $i = 0; $i < ($extremes_to_remove/2); $i++ ) {
    array_pop($numbers);
  }
  
  
  // F
  // average
  $average = array_sum($numbers)/count($numbers);
  return $average;

 } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2021-08-01
    相关资源
    最近更新 更多