我用python来分析巴西的新冠肺炎数据。联邦政府共享一份csv档案,记录该国的每一次疫苗接种情况。这个csv文件有170 csv以上。
对于我的研究,我需要查询这个csv文件,以获得按city和day分组的疫苗接种的city。在sql中,如下所示:
select city, day, Count(*)
from my_table
group by city, day如何从在线csv文件中提取这些信息,因为它太大了?
这个文件是每天更新的,因为新的人每天都要接种疫苗。这意味着每天都会将新行追加到文件中。
我想每天提取/更新柜台。是否有一种智能/快速的方法来检查csv文件中的新行并更新计数器?
我不能每天下载整个文件并将其导入数据库。
数据可以在这里获得:链接中的https://qsprod.saude.gov.br/extensions/covid-19_html/covid-19_html.html,Dados Completos,S3上的153468857093字节CSV。
输入文件示例在这里可用:https://drive.google.com/file/d/1LRVJMKeE0wzuGshmfsI7pnfpHA800iph/view?usp=sharing
发布于 2021-11-16 13:00:53
类似这样的事情似乎很有效(假设您有足够的内存和稳定的Internet连接来处理单个请求中的文件)。
Counter中的数据最终是。
Counter({
('BRASILIA', '2021-03-18'): 2,
('SAO PAULO', '2021-03-26'): 1,
('INDAIATUBA', '2021-08-09'): 1,
...
})当然,您需要删除islice()来处理超过100行的第一行。
import pickle
from collections import Counter
from itertools import islice
import requests
import csv
DATA_URL = "https://s3-sa-east-1.amazonaws.com/ckan.saude.gov.br/PNI/vacina/completo/2021-11-15/part-00000-d217d29f-9db0-4280-ad94-ff0afe3d8b11-c000.csv"
resp = requests.get(DATA_URL, stream=True)
resp.raise_for_status()
resp.encoding = "UTF-8"
counter = Counter()
for row in islice(
csv.DictReader(resp.iter_lines(decode_unicode=True), delimiter=";"), 100
):
key = (row.get("estabelecimento_municipio_nome"), row.get("vacina_dataaplicacao"))
counter[key] += 1
with open("data.pickle", "wb") as outf:
pickle.dump(counter, outf)对于任何更复杂的内容,我确实建议下载该文件并将其LOAD(例如,到PostgreSQL表中)。
https://stackoverflow.com/questions/69989082
复制相似问题