情况如下:
我遇到的第一个问题是从CSV文件中获取信息。我正在编写的代码的目的是获取大量有关ZCTA(邮政编码)的信息,用于许多不同的同类群组(目前有六种目前正在使用,但代码是灵活的,可以有任意数量的队列)。一个文件包含每个ZCTA的群组。对于每个ZCTA,另一个文件具有每个群组的“病例”(观察到癌症的病例)的数量。另一份文件的每个队列的粗略率,对于爱荷华州(本研究的重点),人们可以“预期”通过队列“看到”人口癌症人数的比率。还有其他一些文件,但这些都是重点,因为这是展示我的问题的地方。
我的代码最初的作用是读取填充文件并通过ZCTA获取每个群组的人口。每个ZCTA和信息都存储在一个列表中,然后列表存储在包含所有ZCTA的列表(嵌套)列表中。然后代码获得原始利率。然后,对于每个ZCTA,将原始速率乘以适当的队列,并与每个ZCTA内的所有其他队列相加,以得到每个ZCTA我们可以预期患有癌症的总人数。人口也总结了。此信息存储在另一个列表中,以及包含所有ZCTA的列表中。这些信息将成为焦点(所有ZCTA的清单,每个ZCTA包含总人口和预期病例总数)。
所以,问题是我需要获取这个新获得的列表并获取OBSERVED个案的数量,对于每个队列,将它们加在一起,将其附加到适当的ZCTA并将其写入新文件。我已经实现了这样做的代码,除了底部22个左右的ZCTA没有得到观察到的案例数量。我不知道它是代码还是什么,但它适用于所有其他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 :(得分:0)
所以,我最终通过打开每个ZCTA计算的文件来计算观察到的以及预期和人口来“解决”这个问题。这并没有真正解决我正在处理的问题,而是找到了解决问题的方法。我有点失望,因为更多的人没有看到和/或回应这个问题。如果有人想出实际问题的答案,请务必在此处发布。 -Mike