2013-03-31 50 views
0

这里的情况是:的Python - CSV模块,获取信息从一个文件

我遇到的第一个问题是从一个CSV文件获取信息。我正在编写的代码的目的是为了获得ZCTAs(邮政编码)上的大量信息,对于许多不同的群组(目前有六个正在使用,但代码旨在灵活地拥有任意数量的队列)。一个文件包含每个ZCTA的群体。对于每个ZCTA,另一个文件具有每个队列的“病例”(观察到癌症的病例)的数量。另一份文件对于每个人群,对于爱荷华州(这项研究的重点),都具有粗略的比率,人们可以“期望”看到癌症人群的人数。还有一些其他文件,但这些是重点,因为这是我展示问题的地方。

我的代码做什么,首先是阅读人口的文件,并得到由ZCTA每个队列的人口。每个ZCTA和信息都存储在一个列表中,然后存储在列表(嵌套)列表中,其中包含所有ZCTA。该代码然后获得原油价格。然后,根据每个ZCTA的适当队列乘以原始速率,并与每个ZCTA内的所有其他队列进行总结,以获得每个ZCTA我们可以预期看到患有癌症的总人数。人口也被总结。该信息存储在另一个列表中,以及包含所有ZCTA的列表。该信息将成为焦点(所有ZCTA列表,每个ZCTA包含总人口和预期病例总数)。

因此,问题是我需要采取这个新获得的列表,并获得观察情况的数量,对于每个队列,将这些总和相加,将它们附加到适当的ZCTA并将其写入新文件。我的代码实现了这一点,除了最底层的22个ZCTAs没有得到观察到的病例数。我不知道这是否是代码,或什么,但它适用于所有其他的906,但没有得到底部22

读者会发现我已经讨论过的文件样本数据(观察到的情况下,文件和输出文件)在:Gist

这里是我使用的代码:

`expectedcsv = open('ExpectedCases.csv', 'w', newline= '') 
expectedwriter = csv.writer(expectedcsv, delimiter = ',') 
expectedHeader = ['zcta', 'expected', 'pop', 'observed'] 
thecasesreader = csv.reader(thecasescsv, delimiter = ',') 
for zcta in zctaPop: 
    caseCounter = 0 
    thecasescsv = open('NewCaseFile.csv', 'r', newline = '') 
    thecasesreader = csv.reader(thecasescsv, delimiter = ',') 
    for case in thecasesreader: 
     if case[0] == zcta[0]: 
     for i in range(3, len(case)): 
      caseCounter += int(case[i]) 
    zcta.append(caseCounter) 
    expectedwriter.writerow(zcta) 
expectedcsv.close() 
thecasescsv.close()` 

别的东西,我也想提出的是,在稍后的代码,所有这些的实际目的是为每个网格点创建一个SMR过滤器。网格点在某种程度上是任意的,它们被放置在整个爱荷华州上(通过坐标)。 SMR是观察到的数量除以预期病例的数量。阈值,即特定过滤器的预期个案数量,由用户设定。因此,如果用户想要在150个预期情况下(对于每个网格点)创建过滤器,则代码会遍历每个ZCTA,总结预期情况,直到发现超过150个为止。到最后一个ZCTA的距离是过滤器的“半径”。

要做到这一点,我建立了一个距离矩阵(从每个网格点的每一个ZCTA的距离),然后进行排序的,最接近最远。由于文件的大小(2300 X 930),我必须逐行阅读这个文件,并从其他文件中获取所有信息。因此,从最近的ZCTA开始,我得到了人群,预期病例和观察病例(上面讨论了这个文件的问题),并将它们分别添加到它们各自的计数器(一个用于人群,一个用于观察,另一个用于预期) 。然后进入下一个最接近的ZCTA并执行相同操作,直到超出阈值。

这里的问题是,我不能使用CSV模块读取这些文件,因为我已经从另一个文件中读取和索引会丢失。所以,我不得不使用普通的filename.read(),然后需要一些有趣的使用maketrans.translate。我不确定它的效率或者效果很好。一切似乎都很好,但如果没有解决上述问题,就无法说清楚。我已经包含下面的代码,但想知道是否有人有更好的想法/建议?

`expectedCSV = open('ExpectedCases.csv', 'r', newline = '') 
table = str.maketrans('\r', ' ') 
content = expectedCSV.read() 
expectedCSV.close() 
content = content.translate(table) 
content = content.split(sep = '\n') 
newContent = [] 
for item in content: 
    newContent.append((item.split(sep= ','))) 
content = ' ' 
for item in newContent: 
    if item[0] == currentZcta: 
      expectedTotal += (float(item[1])) 
      totalPop += (float(item[2])) 
      totalObservedCount += (float(item[3]))` 

另外,我无法弄清楚如何变蓝色的方法和变量红色,一些本网站的更多真棒用户做。我非常希望学习如何为将来的职位做到这一点。

如果有人需要澄清,以帮助解答更多信息或任何/制定解决方案,请通过各种手段,请教!感谢您花时间阅读!

回答

0

所以,我最终通过计算与预期和人口沿观察,通过开放计算的每个ZCTA文件“解决”这一点。这并没有真正解决我正在处理的问题,而是找到了解决方法。我有些失望,更多的人没有看到和/或回应。如果有人想出一个解决实际问题的办法,无论如何,请将其发布到此处。 -Mike