2016-08-03 217 views
1

作爲一個較大項目的一部分,我寫了一個函數,它接受一個int整數的字典並返回一個字典,每個「外」鍵鏈接到一個元組的平均值和標準該子字典的偏差(即(mean(dict[key1]), stdev(dict[key1])))。我在一個大型數據集上運行(源文件是一個2.8 GB的csv文件),並在計算其中一個子字典的標準偏差時得到一個斷言錯誤。AssertionError:負方差的總和

雖然我會(現在正在追蹤)導致以下錯誤的子字典,但我對一般情況會導致該錯誤感到好奇,因此如果它進一步發生在我的數據集中,我可以嘗試避免它。

我收到的錯誤消息是:

AssertionError: negative sum of square deviations: -3734262324235.697754

從代碼:

import statistics as stat 

try: #Check for single value error 
    std = stat.stdev(val) 
except stat.StatisticsError: 
    std = 0 
+0

我假設你使用的是Pythonś3統計模塊(並編輯了你的問題) - 如果不是這種情況,請糾正它。 – jsbueno

+0

這是正確的,我忘記指定 –

+0

這個函數def在這裏是第608行:https://hg.python.org/cpython/file/3.5/Lib/statistics.py - 錯誤來自「 493行的'_ss'''函數。我會說這看起來像檢查錯誤的數據或錯誤的意思。 – wwii

回答

2

statiscs.py的代碼是純Python - 你似乎是一個奇怪的溢出錯誤的犧牲品在Fraction類中,當處理內部的「quares」時)statistics._ss函數。

I th墨水現在您可以做的最好的事情是在statistics.py文件本身中使用_ss函數,並使用「if」和致pdb.set_trace來調用以交互方式查找哪些數據導致錯誤(在代碼中有一個註釋,該部分是受四捨五入錯誤影響)。它計算shuld爲零的分數 - 但是對於舍入誤差以及分數的平方。但是在平方時,已經很大的分母就會自行排列 - 這可能會觸發Python分數內的一個bug,並且當它接近於零時返回一個非常大的值。

這樣的「if」子句可以讓您(1)繞過錯誤條件並將代碼運行到最後,當發現錯誤時強制值爲零; (2)記下導致錯誤的值,並將其作爲Python語言本身的錯誤報告。