【发布时间】:2017-03-13 03:59:25
【问题描述】:
我被分配的一项任务难住了,该任务要求我输出从 CSV 文件中读取的数据集...
...根据本福德定律,得到如下条形图:
Benford 条形图示例
这是我目前得到的代码:
import matplotlib.pyplot as plt
import math
import csv
import locale
with open("immigrants.csv", newline='') as csvfile:
immidata = csv.reader(csvfile)
X_labels = []
Y = []
for row in immidata:
X_labels.append(row[0])
Y.append(locale.atoi(row[1]))
numbers = [float(n) for n in range(1, 10)]
benford = [math.log10(1 + 1 / d) for d in numbers]
plt.plot(numbers, benford, 'ro', label = "Benford's Law")
plt.bar(numbers, range(1, 11), align = 'left', normed = True,
rwidth = 0.7, label = "Actual data")
plt.bar(benford, range(1, 11), align = 'left', normed = True,
rwidth = 0.7, label = "Predicted data")
plt.title("Immigrants in countries")
plt.xlabel("Digit")
plt.ylabel("Probability")
plt.grid(True)
plt.xlim(0, 10)
plt.xticks(numbers)
plt.legend()
plt.show()
以下是 CSV 文件中的一些信息,其中显示了每个国家/地区的移民人数(分别为国家、移民人数、世界移民总数的百分比和移民占全国人口的百分比):
United States,"45,785,090",19.8,14.3
Russia,"11,048,064",4.8,7.7
Germany,"9,845,244",4.3,11.9
Saudi Arabia,"9,060,433",3.9,31.4
United Arab Emirates,"7,826,981",3.4,83.7
United Kingdom,"7,824,131",3.4,12.4
我现在的输出:
line 19, in <module>
Y.append(locale.atoi(row[1]))
line 321, in atoi
return int(delocalize(string))
ValueError: invalid literal for int() with base 10: 'Number of
immigrants'
Process finished with exit code 1
我对此还比较陌生,因此非常感谢任何有助于我获得输出的建议!
谢谢!
需要看起来像样本的输出。
【问题讨论】:
-
该行中有多个逗号,因此
split(",")返回超过 2 个项目。您可能需要查看csv模块,该模块提供了对 csv 文件的适当处理。 -
我以前从未使用过 csv 模块...在我的情况下我将如何使用它?
-
尝试阅读我链接到的文档 - 特别是查看
csv.reader。如果您遇到困难,请回到 SO 来解决问题。如果您证明您已经尝试过,您将获得更多帮助。 -
我有。亲自尝试后,我打印了整个文件,但每个单词后面都加了逗号。
-
这个问题是关于绘制或读取数据还是关于本福德定律?
标签: python csv matplotlib plot bar-chart