从一本词典中计算并绘制出年增长率

2024-04-27 00:06:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用下面的Python代码从CSV文件中绘制一个图形

import csv
import matplotlib.pyplot as plt

def population_dict(filename):
   """
   Reads the population from a CSV file, containing 
   years in column 2 and population / 1000 in column 3.

   @param filename: the filename to read the data from
   @return dictionary containing year -> population
   """
   dictionary = {}
   with open(filename, 'r') as f:
       reader = csv.reader(f)
       f.next()
       for row in reader:
           dictionary[row[2]] = row[3]
           return dictionary

           dict_for_plot = population_dict('population.csv')

           def plot_dict(dict_for_plot):

               x_list = []
               y_list = []
               for data in dict_for_plot:
                   x = data
                   y = dict_for_plot[data]
                   x_list.append(x)
                   y_list.append(y)
                   plt.plot(x_list, y_list, 'ro')
                   plt.ylabel('population')
                   plt.xlabel('year')
                   plt.show()

                   plot_dict(dict_for_plot)

                   def grow_rate(data_dict):
 # fill lists
 growth_rates = []
 x_list = []
 y_list = []
 for data in data_dict:
   x = data
   y = data_dict[data]
   x_list.append(x)
   y_list.append(y)

 # calc grow_rate
 for i in range(0, len(y_list)-1):
   var = float(y_list[i+1]) - float(y_list[i])
   var = var/y_list[i]
   print var
   growth_rates.append(var)

 # growth_rate_dict = dict(zip(years, growth_rates))


 grow_rate(dict_for_plot)

然而,我在执行这段代码时遇到了一个相当奇怪的错误

Traceback (most recent call last):
 File "/home/jharvard/Desktop/pyplot.py", line 71, in <module>
 grow_rate(dict_for_plot)
 File "/home/jharvard/Desktop/pyplot.py", line 64, in grow_rate
 var = var/y_list[i]
TypeError: unsupported operand type(s) for /: 'float' and 'str'

我一直在尝试不同的方法来强制转换y_list变量。例如,强制转换int

我怎样才能解决这个问题,这样我就可以得到这些年来增长率的百分比来绘制这个图。你知道吗


Tags: infordatadictionaryrateplotvarplt
1条回答
网友
1楼 · 发布于 2024-04-27 00:06:38

由于CSV文件是文本文件,您需要将它们转换为数字。很容易纠正语法错误。只是使用

var/float(y_list[i])

尽管这样做消除了语法错误,但仍有一个小错误更难发现,在某些情况下,它可能导致不正确的结果。主要原因是词典没有排序。i、 e.x和y值没有任何顺序。你的程序的缩进在我的电脑上似乎有点不对劲,所以我无法完全理解。但它的要点似乎是从文件中获取值(x和y值),然后找到序列

var[i] = (y[i+1] - y[i]) / y[i]

不幸的是,您的y_list[i]可能与CSV文件中的序列不同,因为它是从字典填充的。你知道吗

在你做的部分:

   for row in reader:
       dictionary[row[2]] = row[3]

最好是这样做来维持秩序

x, y = zip(*[ ( float(row[2]), float(row[3]) )  for row in reader])
x, y = map(numpy.array, [x, y])
return x, y

或者像这样的。。。你知道吗

然后,Numpy数组就有了更有效地处理问题的方法。然后您可以简单地执行以下操作:

growth_rates = numpy.diff(y) / y[:-1]

希望这有帮助。如果你有任何问题,请告诉我。你知道吗

最后,如果你真的走Numpy路线,我强烈推荐它自己的csv阅读器。在这里查看:http://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html

相关问题 更多 >