如何使用CSV DictReader、Matplotlib和Numpy创建概率密度函数图形?

4

我正在尝试使用csv dictreader、matplotlib和numpy从csv文件的一列数据创建简单的概率密度函数(pdf)图表...

是否有一种简单的方法将CSV DictReader与numpy数组结合使用?以下是不起作用的代码。错误消息是TypeError: len() of unsized object,我猜测这与我的数据不是numpy数组格式有关?此外,我的数据有负数和正数。提前感谢您的帮助!

import easygui
import csv
import scipy.stats
from numpy import*
from pylab import*


filename= easygui.fileopenbox(msg='Altitude outlier graph', title='select file',  filetypes=['*.csv'], default='X:\\')
alt_file=open(filename)    

x=[]
for row in csv.DictReader(alt_file):
    x.append(float(row['Dist_90m(nmi)']))

a=scipy.stats.pdf_moments(x)

prob, bins, patches= hist(a, 10,align='left',facecolor='green')

ylabel('probability density function')
show()

1
错误信息包含了回溯信息,它会显示出代码的具体行数。请提供完整的错误信息,包括回溯信息和失败的代码行数。 - S.Lott
2个回答

4

这行代码

a=scipy.stats.pdf_moments(x)

“根据中心矩(第一个为平均值),返回高斯扩展的概率密度函数。”

也就是说,a 是一个函数,你必须以某种方式获取它的值。

所以我修改了这行代码:

prob, bins, patches= hist([a(i/100.0) for i in xrange(0,100,1)], 10, align='left', facecolor='green')

我用我的样本数据生成了这个图表。

现在我的统计知识有些生疏,我不确定你是否通常会使用0-1的pdf,但你可以从中推断出来。

如果您确实需要浮点数范围,那么rangexrange不会产生浮点数,因此一个简单的解决方法是生成大量数字并进行除法运算;因此使用a(i/100.0)而不是 a(i) for i in xrange(0, 1, 0.01)

sample


1
很好,但对于你提到的最后一个问题,请使用numpy.arange - 它在处理浮点数方面也表现得非常出色!-) - Alex Martelli
你也可以使用 numpy.r_,例如 r_[2:3:5j] -> array([ 2. , 2.25, 2.5 , 2.75, 3. ]),所以在你的情况下是 r_[:1:100j] - jfs

0
感谢所有的帮助!!下面的代码可以生成概率密度函数图:我仍然有一些格式问题,但我认为这是一个不错的起点。
import easygui
import csv
import scipy.stats
import numpy
from pylab import*

filename= easygui.fileopenbox(msg='Altitude outlier graph', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\')
alt_file=open(filename)    

a=[]
for row in csv.DictReader(alt_file):
    a.append(row['Dist_90m(nmi)'])
y= numpy.array(a, float)    

pdf, bins, patches=hist(y, bins=6, align='left',range=None, normed=True)
ylabel('probability density function')
xlabel('Distance from 90m contour line(nm)')
ylim([0,1])
show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接