如何使用列表在CCDF中绘图?

时间:2014-10-15 17:28:41

标签: python arrays list numpy matplotlib

当数据在一列中时,我可以很好地绘制CDF和CCDF。但是当数据采用下面给出的格式时,我对如何绘制CDF或CCDF有点无能为力。圆括号()中的对是节点对。方括号[]中的值是出现值,其间的数字为:7是频率。我们没有考虑频率,只考虑发生值。

输入数据格式,它们是数百万行,方括号之间有很多值([])。

('4503', '656') 7 [2473.0, 35.0, 235.0, 157.0, 505.0, 45.0, 1303.0] 
('2105', '674') 1 [2584.0] 
('5139', '1086') 1 [1488.0] 
('3690', '2034') 6 [1009.0, 1108.0, 132.0, 447.0, 157.0, 466.0] 
('3867', '1982') 1 [1134.0] 

我必须将方形括号([])之间的数据的CCDF绘制在一起而不是单独绘制。我不明白如何读取方形括号之间的数据并绘制它。

2 个答案:

答案 0 :(得分:0)

您的问题主要是将输入数据设置为正确的格式:

  1. 步骤:解析所需数据的输入文件,即方括号之间的值:这可以使用python标准库中的re模块使用正则表达式轻松完成。将所有空格分别写入文本文件。

  2. 步骤:将所有这些值分配给快速numpy数组,并按照此处所述绘制它们:Read file and plot CDF in Python

答案 1 :(得分:0)

您可以通过简单地找到[]的索引,逐行切出数据并使用ast.literal_eval将其解析为列表并将其附加到列表来执行此操作主要清单。

import ast
import numpy as np
from pylab import *

file_data = """('4503', '656') 7 [2473.0, 35.0, 235.0, 157.0, 505.0, 45.0, 1303.0] 
('2105', '674') 1 [2584.0] 
('5139', '1086') 1 [1488.0] 
('3690', '2034') 6 [1009.0, 1108.0, 132.0, 447.0, 157.0, 466.0] 
('3867', '1982') 1 [1134.0] """

data = []

for line in file_data.splitlines():
    data += ast.literal_eval(line[line.find('['):line.find(']')+1])

完成上述操作后,您应该可以按如下方式绘制CDF:

# Building an array of uniform x points ranging from 0 to the max(data)
X  = np.arange(0,max(data), max(data) / len(Y))

# Convert data to a numpy array
Y  = np.array(sorted(data))

# Normalizing data to yield a proper PDF vector
Y /= Y.sum()

# CDF can be obtained by the `np.cumsum` method:
Yc = np.cumsum(Y)

# Plot Y vs X
plot(X,Y,color="green" )

# Plot the CDF
plot(X,Yc,color="red"   )

# Display the plot
show()

以上数据获得以下内容:

enter image description here