当数据在一列中时,我可以很好地绘制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绘制在一起而不是单独绘制。我不明白如何读取方形括号之间的数据并绘制它。
答案 0 :(得分:0)
您的问题主要是将输入数据设置为正确的格式:
步骤:解析所需数据的输入文件,即方括号之间的值:这可以使用python标准库中的re模块使用正则表达式轻松完成。将所有空格分别写入文本文件。
步骤:将所有这些值分配给快速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()
以上数据获得以下内容: