Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
18 / 18
Imputer
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
4 / 4
10
100.00% covered (success)
100.00%
18 / 18
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 preprocess
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 preprocessSample
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
4 / 4
 getAxis
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
7 / 7
<?php
declare (strict_types = 1);
namespace Phpml\Preprocessing;
use Phpml\Preprocessing\Imputer\Strategy;
class Imputer implements Preprocessor
{
    const AXIS_COLUMN = 0;
    const AXIS_ROW = 1;
    /**
     * @var mixed
     */
    private $missingValue;
    /**
     * @var Strategy
     */
    private $strategy;
    /**
     * @var int
     */
    private $axis;
    /**
     * @param mixed    $missingValue
     * @param Strategy $strategy
     * @param int      $axis
     */
    public function __construct($missingValue = null, Strategy $strategy, int $axis = self::AXIS_COLUMN)
    {
        $this->missingValue = $missingValue;
        $this->strategy = $strategy;
        $this->axis = $axis;
    }
    /**
     * @param array $samples
     */
    public function preprocess(array &$samples)
    {
        foreach ($samples as &$sample) {
            $this->preprocessSample($sample, $samples);
        }
    }
    /**
     * @param array $sample
     * @param array $samples
     */
    private function preprocessSample(array &$sample, array $samples)
    {
        foreach ($sample as $column => &$value) {
            if ($value === $this->missingValue) {
                $value = $this->strategy->replaceValue($this->getAxis($column, $sample, $samples));
            }
        }
    }
    /**
     * @param int   $column
     * @param array $currentSample
     * @param array $samples
     * 
     * @return array
     */
    private function getAxis(int $column, array $currentSample, array $samples): array
    {
        if (self::AXIS_ROW === $this->axis) {
            return array_diff($currentSample, [$this->missingValue]);
        }
        $axis = [];
        foreach ($samples as $sample) {
            if ($sample[$column] !== $this->missingValue) {
                $axis[] = $sample[$column];
            }
        }
        return $axis;
    }
}