情况如下:
我遇到的第一个问题是从 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
and进行一些有趣的使用.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]))`
此外,我不知道如何将方法着色为蓝色,变量着色为红色,就像该站点的一些更出色的用户所做的那样。我会非常有兴趣学习如何在以后的帖子中做到这一点。
如果有人需要更多信息或任何澄清以帮助回答/制定解决方案,请务必询问!感谢您花时间阅读!