状況は次のとおりです。
私が抱えている最初の問題は、CSV ファイルから情報を取得することです。私が書いているコードの目的は、多くの異なるコホート (現在 6 つが使用されていますが、コードは任意の数を持つことができるように柔軟であることを意図しています) の ZCTA (郵便番号) に関する多くの情報を取得することです。コホート)。1 つのファイルには、各 ZCTA のコホートごとの母集団が含まれています。別のファイルには、各コホート、各 ZCTA の「ケース」(観察された癌のケース) の数があります。別のファイルには、各コホート、アイオワ州 (この研究の焦点) の粗率があり、コホートごとに、人口のがん患者数を「期待」できる割合が示されています。他にもいくつかのファイルがありますが、ここに私の問題が示されているため、これらに焦点を当てています。
私のコードが最初に行うことは、人口ファイルを読み取り、ZCTA によって各コホートの人口を取得することです。各 ZCTA と情報はリストに格納され、リストはすべての ZCTA を含む (ネストされた) リストのリストに格納されます。次に、コードは原油レートを取得します。次に、ZCTAごとに粗率に適切なコホートを掛け、各ZCTA内の他のすべてのコホートと合計して、ZCTAごとに癌にかかると予想できる人の総数を取得します. 人口も集計されます。この情報は、すべての ZCTA を含むリストだけでなく、別のリストにも保存されます。この情報が焦点になります (それぞれが総人口と予想される症例の総数を含む、すべての ZCTA のリスト)。
したがって、問題は、この新しく取得したリストを取得して、各コホートの OBSERVED ケースの数を取得し、それらを合計して、適切な ZCTA に追加し、新しいファイルに書き込む必要があることです。下位22程度のZCTAが観察されたケースの数を取得しないことを除いて、これをうまく行うコードを実装しました。それがコードなのか何なのかはわかりませんが、他のすべての 906 で機能しますが、下位の 22 は得られません。
読者は、私が説明したファイル (観察されたケース ファイルと出力ファイル) のサンプル データを次の場所で見つけることができます。
私が使用しているコードは次のとおりです。
`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) のため、このファイルを 1 行ずつ読み取り、他のファイルからすべての情報を取得する必要があります。したがって、最も近い 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]))`
また、このサイトの優れたユーザーの何人かが行っているように、メソッドを青色に、変数を赤色にする方法がわかりませんでした。将来の投稿でそれを行う方法を学ぶことに非常に興味があります。
解決策の回答/定式化を支援するために、より多くの情報や明確な情報が必要な場合は、ぜひお尋ねください! 読んでくれてありがとう!