<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">On Tue, Jan 8, 2019 at 11:57 PM Tim Peters <<a href="mailto:tim.peters@gmail.com">tim.peters@gmail.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I'd like to see internal consistency across the central-tendency<br>
statistics in the presence of NaNs.  What happens now:<br></blockquote><div><br></div><div>I think consistent NaN-poisoning would be excellent behavior.  It will always make sense for median (and its variants).</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">>>> statistics.mode([2, 2, nan, nan, nan])<br>
nan<br>>>> statistics.mode([2, 2, inf - inf, inf - inf, inf - inf])<br>
2<br></blockquote><div><br></div><div>But in the mode case, I'm not sure we should ALWAYS treat a NaN as poisoning the result.  If NaN means "missing value" then sometimes it could change things, and we shouldn't guess.  But what if it cannot?</div><div><br></div><div>    >>> statistics.mode([9, 9, 9, 9, nan1, nan2, nan3])</div><div><br></div><div>No matter what missing value we take those nans to maybe-possibly represent, 9 is still the most common element.  This is only true when the most common thing occurs at least as often as the 2nd most common thing PLUS the number of all NaNs.  But in that case, 9 really is the mode.</div><div><br></div><div>We have one example of non-poisoning NaN in basic operations:</div><div><br></div><div>    >>> nan**0</div><div>    1.0</div><div><br></div><div>So if the NaN "cannot possibly change the answer" then its reasonable to produce a non-NaN answer IMO.  Except we don't really get that with 0**nan or 0*nan already... so a NaN-poisoning mode wouldn't actually offend my sensibilities that much. :-).  </div><div><br></div><div>I guess you could argue that NaN "could be inf".  In that case 0*nan being nan makes sense.  But this still feels hard to slightly odd:</div><div><br></div><div><div>    >>> 0**inf</div><div>    0.0</div><div>    >>> 0**nan</div><div>    nan</div></div></div><div><br></div><div>I guess it's supported by:</div><div><br></div><div><div>    >>> 0**-1</div><div>    ZeroDivisionError: 0.0 cannot be raised to a negative power<br></div></div><div><br></div><div>A *missing value* could be a negative one.</div>-- <br><div dir="ltr" class="gmail_signature">Keeping medicines from the bloodstreams of the sick; food <br>from the bellies of the hungry; books from the hands of the <br>uneducated; technology from the underdeveloped; and putting <br>advocates of freedom in prisons.  Intellectual property is<br>to the 21st century what the slave trade was to the 16th.<br></div></div></div></div></div>