Странное поведение пользовательской функции с агрегатом панд

Я использую следующую функцию в течение нескольких лет. И он работает нормально:

function timeDifference($timestamp)
{
    $otherDate=$timestamp;
    $now=@date("Y-m-d H:i:s");

    $secondDifference=@strtotime($now)-@strtotime($otherDate);
    $extra="";
    if ($secondDifference == 2592000) { 
    // months 
    $difference = $secondDifference/2592000; 
    $difference = round($difference,0); 
    if ($difference>1) { $extra="s"; } 
    $difference = $difference." month".$extra." ago"; 
}else if($secondDifference > 2592000)
    {$difference=timestamp($timestamp);} 
elseif ($secondDifference >= 604800) { 
    // weeks 
    $difference = $secondDifference/604800; 
    $difference = round($difference,0); 
    if ($difference>1) { $extra="s"; } 
    $difference = $difference." week".$extra." ago"; 
} 
elseif ($secondDifference >= 86400) { 
    // days 
    $difference = $secondDifference/86400; 
    $difference = round($difference,0); 
    if ($difference>1) { $extra="s"; } 
    $difference = $difference." day".$extra." ago"; 
} 
elseif ($secondDifference >= 3600) { 
    // hours 

    $difference = $secondDifference/3600; 
    $difference = round($difference,0); 
    if ($difference>1) { $extra="s"; } 
    $difference = $difference." hour".$extra." ago"; 
} 
elseif ($secondDifference < 3600) { 
    // hours 
    // for seconds (less than minute)
    if($secondDifference<=60)
    {       
        if($secondDifference==0)
        {
            $secondDifference=1;
        }
        if ($secondDifference>1) { $extra="s"; }
        $difference = $secondDifference." second".$extra." ago"; 

    }
    else
    {

$difference = $secondDifference/60; 
        if ($difference>1) { $extra="s"; }else{$extra="";}
        $difference = round($difference,0); 
        $difference = $difference." minute".$extra." ago"; 
    }
} 

$FinalDifference = $difference; 
return $FinalDifference;
}
1
задан Lorenz Walthert 11 March 2019 в 14:51
поделиться

1 ответ

TL; DR : Чтобы получить желаемый результат, вы можете просто сделать print(np.mean(df['purchase_amount'] ** 2))

<час>

Series.aggregate документы говорят:

< blockquote>

func: function, str, list или dict Функция, используемая для агрегирования данных. Если функция, то должна работать либо при передаче Series , либо при передаче в Series.apply .

Когда у вас есть len(x), оно вызывает исключение, когда m вызывается впервые (потому что x является float, а объекты с плавающей точкой не имеют len). Это исключение вызывает откат панд и повторный вызов m, на этот раз передавая его apply (как задокументировано).

Если мы исследуем Series.aggregate источник, мы можем увидеть это поведение:

...
result = None
if axis == 0:
    try:
        result, how = self._aggregate(func, axis=0, *args, **kwargs)
    except TypeError:
        pass
if result is None:
    return self.apply(func, axis=axis, args=args, **kwargs)
return result
0
ответ дан DeepSpace 11 March 2019 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: