本福德的法律计划

时间:2013-04-27 03:43:48

标签: python benfords-law

我必须编写一个程序,证明Benford的法律有两个数据列表。我认为我的代码大部分都没有,但我认为我错过了一些小错误。我很抱歉,如果这不是该网站应该如何使用,但我真的需要帮助。这是我的代码。

def getData(fileName):

    data = []
    f = open(fileName,'r')
    for line in f:
        data.append(line)
    f.close()

    return data

def getLeadDigitCounts(data):

    counts = [0,0,0,0,0,0,0,0,0]

    for i in data:
        pop = i[1]
        digits = pop[0]
        int(digits)
        counts[digits-1] += 1

    return counts

def showResults(counts):

    percentage = 0
    Sum = 0
    num = 0
    Total = 0

    for i in counts:
        Total += i

    print"number of data points:",Sum
    print
    print"digit number percentage"
    for i in counts:
        Sum += i
        percentage = counts[i]/float(Sum)
        num = counts[i]
        print"5%d 6%d %f"%(i,num,percentage)


def showLeadingDigits(digit,data):

    print"Showing data with a leading",digit
    for i in data:
        if digit == i[i][1]:
            print i

def processFile(name):

    data = getData(name)
    counts = getLeadDigitCounts(data)
    showResults(counts)

    digit = input('Enter leading digit: ')
    showLeadingDigits(digit, data)

def main():

    processFile('TexasCountyPop2010.txt')
    processFile('MilesofTexasRoad.txt')

main()

再次抱歉,如果这不是我应该如何使用这个网站。另外,我只能使用教授向我们展示的编程技巧,如果你能给我建议清理代码,我会非常感激。

此外,以下是我的数据中的几行。

Anderson County     58458
Andrews County  14786
Angelina County     86771
Aransas County  23158
Archer County   9054
Armstrong County    1901

3 个答案:

答案 0 :(得分:1)

您的错误来自此行:

int(digits)

这实际上并没有对digits做任何事情。如果要将digits转换为整数,则必须重新设置变量:

digits = int(digits)

另外,为了正确解析数据,我会做这样的事情:

for line in data:
    place, digits = line.rsplit(None, 1)
    digits = int(digits)
    counts[digits - 1] += 1

答案 1 :(得分:0)

让我们走一段代码,我想你会看到问题所在。我将在这里使用此文件来获取数据

An, 10, 22
In, 33, 44
Out, 3, 99

现在getData返回:

["An, 10, 22",
"In, 33, 44",
"Out, 3, 99"]

现在看看第一次通过循环:

for i in data:
    # i = "An, 10, 22"
    pop = i[1]
    # pop = 'n', the second character of i
    digits = pop[0]
    # digits = 'n', the first character of pop
    int(digits)
    # Error here, but you probably wanted digits = int(digits)
    counts[digits-1] += 1

根据数据的结构,您需要找出逻辑来提取您希望从文件中获取的数字。这个逻辑在getData函数中可能会做得更好,但它主要取决于数据的具体情况。

答案 2 :(得分:0)

只需在此处共享一个不同的(也许更多的逐步说明)代码即可。是红宝石。

The thing is, Benford's Law doesn't apply when you have a specific range of random data to extract from. The maximum number of the data set that you are extracting random information from must be undetermined, or infinite.

In other words, say, you used a computer number generator that had a 'set' or specific range from which to extract the numbers, eg. 1-100. You would undoubtedly end up with a random dataset of numbers, yes, but the number 1 would appear as a first digit as often as the number 9 or any other number.

**The interesting** part, actually, happens when you let a computer (or nature) decide randomly, and on each instance, how large you want the random number to potentially be. Then you get a nice, bi-dimensional random dataset, that perfectly attains to Benford's Law. I have generated this RUBY code for you, which will neatly prove that, to our fascination as Mathematicians, Benford's Law works each and every single time!

Take a look at this bit of code I've put together for you!
It's a bit WET, but I'm sure it'll explain.

<-下方的红宝石代码->

dataset = []

999.times do
  random = rand(999)
  dataset << rand(random)
end

startwith1 = []
startwith2 = []
startwith3 = []
startwith4 = []
startwith5 = []
startwith6 = []
startwith7 = []
startwith8 = []
startwith9 = []

dataset.each do |element|
  case element.to_s.split('')[0].to_i
  when 1 then startwith1 << element
  when 2 then startwith2 << element
  when 3 then startwith3 << element
  when 4 then startwith4 << element
  when 5 then startwith5 << element
  when 6 then startwith6 << element
  when 7 then startwith7 << element
  when 8 then startwith8 << element
  when 9 then startwith9 << element
  end
end

a = startwith1.length
b = startwith2.length
c = startwith3.length
d = startwith4.length
e = startwith5.length
f = startwith6.length
g = startwith7.length
h = startwith8.length
i = startwith9.length

sum = a + b + c + d + e + f + g + h + i

p "#{a} times first digit = 1; equating #{(a * 100) / sum}%"
p "#{b} times first digit = 2; equating #{(b * 100) / sum}%"
p "#{c} times first digit = 3; equating #{(c * 100) / sum}%"
p "#{d} times first digit = 4; equating #{(d * 100) / sum}%"
p "#{e} times first digit = 5; equating #{(e * 100) / sum}%"
p "#{f} times first digit = 6; equating #{(f * 100) / sum}%"
p "#{g} times first digit = 7; equating #{(g * 100) / sum}%"
p "#{h} times first digit = 8; equating #{(h * 100) / sum}%"
p "#{i} times first digit = 9; equating #{(i * 100) / sum}%"