我有一个名为d
的无序列表,如下所示:
[0.0000, 123.9877,0.0000,9870.9876, ...]
我只想在Python中使用Matplotlib绘制基于此列表的cdf图。但不知道是否有任何我可以使用的功能
d = []
d_sorted = []
for line in fd.readlines():
(addr, videoid, userag, usertp, timeinterval) = line.split()
d.append(float(timeinterval))
d_sorted = sorted(d)
class discrete_cdf:
def __init__(data):
self._data = data # must be sorted
self._data_len = float(len(data))
def __call__(point):
return (len(self._data[:bisect_left(self._data, point)]) /
self._data_len)
cdf = discrete_cdf(d_sorted)
xvalues = range(0, max(d_sorted))
yvalues = [cdf(point) for point in xvalues]
plt.plot(xvalues, yvalues)
现在我正在使用此代码,但错误消息是:
Traceback (most recent call last):
File "hitratioparea_0117.py", line 43, in <module>
cdf = discrete_cdf(d_sorted)
TypeError: __init__() takes exactly 1 argument (2 given)
答案 0 :(得分:27)
答案 1 :(得分:19)
我知道我迟到了。但是,如果你只想要你的情节的cdf而不是将来的计算,那么有一种更简单的方法:
plt.hist(put_data_here, normed=True, cumulative=True, label='CDF',
histtype='step', alpha=0.8, color='k')
例如,生成one of these graphs的相关代码是:
plt.hist(dataset, bins=bins, normed=True, cumulative=True, label='CDF DATA',
histtype='step', alpha=0.55, color='purple')
# bins and (lognormal / normal) datasets are pre-defined
编辑:来自matplotlib文档的This example可能会更有帮助。
答案 2 :(得分:8)
计算累积总和cumsum
的numpy函数在这里很有用
In [1]: from numpy import cumsum
In [2]: cumsum([.2, .2, .2, .2, .2])
Out[2]: array([ 0.2, 0.4, 0.6, 0.8, 1. ])
答案 3 :(得分:0)
对于任意值集合,x:
def cdf(x, plot=True, *args, **kwargs):
x, y = sorted(x), np.arange(len(x)) / len(x)
return plt.plot(x, y, *args, **kwargs) if plot else (x, y)
(((如果您不熟悉python,则* args和** kwargs允许您传递参数和命名参数,而无需明确声明和管理它们)
答案 4 :(得分:0)
最适合我的是 pandas 的 quantile
函数。
假设我有 71 名参与者。每个参与者都有一定数量的中断。我想为参与者计算#interruptions 的 CDF 图。目标是能够知道有多少参与者至少进行了 30 次干预。
step=0.05
indices = np.arange(0,1+step,step)
num_interruptions_per_participant = [32,70,52,52,39,20,37,31,60,57,31,71,24,23,38,4,77,37,79,43,63,43,75,13
,45,31,57,28,61,29,30,52,65,11,76,37,65,28,33,73,65,43,50,33,45,40,50,44
,33,49,24,69,55,47,22,45,54,11,30,13,32,52,31,50,10,46,10,25,47,51,83]
CDF = pd.DataFrame({'dummy':num_interruptions_per_participant})['dummy'].quantile(indices)
plt.plot(CDF,indices,linewidth=9, label='#interventions', color='blue')
根据图表,几乎 25% 的参与者的干预次数少于 30。
您可以使用此统计数据进行进一步分析。例如,在我的情况下,我需要对每个参与者至少进行 30 次干预,以满足留一科目评估所需的最低样本要求。 CDF 告诉我,我对 25% 的参与者有问题。
答案 5 :(得分:-4)
import matplotlib.pyplot as plt
X=sorted(data)
Y=[]
l=len(X)
Y.append(float(1)/l)
for i in range(2,l+1):
Y.append(float(1)/l+Y[i-2])
plt.plot(X,Y,color=c,marker='o',label='xyz')