数据采集-流式采集

  • 旧版本半自动采集流程(背景)
  • 现版本流式采集流程
    • 采用的技术&实现的功能
    • 采集流程图----采集策略
    • 代码实现
    • 程序代码中的部分内容提取

旧版本半自动采集流程(背景)

这里的旧版本采集流程仅代表本人数据采集过程的旧版本,雨女无瓜。
由于本人智力的低下以及为了赶进度,在初始采集数据时采用的是手动和代码采集共同进行的方式,具体如下:
  1. 手动的将原始csv文件重命名为.xlsx类型的excel文件。
  2. 利用excel的行列转置功能手动的将文件内部的数据进行行列转置。
  3. 手动整合含有多个省(州)的国家数据。
    弊端/劣势分析:
    手动操作和代码共同执行的操作本身就是下策,而由于原始数据不断更新,使用旧版本的采集流程也就代表着每一次的数据更新就需要有一个人花费同样的时间做着手动整合的操作,比较浪费时间和人力资源。

现版本流式采集流程

采用的技术&实现的功能

说多了都是扯淡,这篇文章主要还是为了记录一下各部分功能实现的方式及过程。
1. python实现对文件的重命名
2. python实现对文件(xls)内部数据进行行列转置
3. python创建包含多个sheet页的xlsx文件,并将其他的xlsx文件的数据分别保存到这些sheet页中
4. python通过字典及其他方式实现对xls文件内部数据的整合,并将整合的数据写入其他的xls文件。

采集流程图----采集策略

数据采集思路:


①-1
看一下原始数据文件的格式
首先介绍一下本次的主题,本次的目的是做一个关于全球新冠疫情的数据分析的项目。原始数据为GitHub上某位哥哥分享的数据,原始数据为3个csv文件,分别是包含全球各个国家和地区的确诊人数、治愈人数以及死亡人数的数据文件。原始数据文件内部数据格式如下图所示:


简单观察后对原始文件进行简单的概括总结:
原始数据中第一行的Province/State,Country/Region,Lat,Long这几个字段分别代表着省(州)、国家(地区),经度和纬度。后面的就是依次增长的时间。
①-2
对于本次项目采集后的数据,我们的预期是要将数据导入到Hive表中,然后通过Spark进行数据分析。
第一点:原始数据中包含的列超过400,创建一个超过400个字段的表本身就是很离谱的一件事。
第二点:而且对于建表而言,每一列的字段名应当是对于一类数据的总结和概括的名称。本次的原始数据第一行从Long后就是依次增长的时间,这样的时间并不能作为创建表时的列名(字段名)。
第三点:在本人目前使用过的向hive表load数据–Hive所支持的数据类型有.txt以及.csv。通过行列转置的方式将数据转置后,所呈现除的数据格式是满足于向Hive表导入数据的格式,但是同样的因为列数过多(超过200),我们不能将转置后的数据直接作为load data to table的原始数据,可以看一下行列转置后的数据格式:

基于上述原因,现指定数据采集的策略:

代码实现

from pandas.io.excel import ExcelWriter
import pandas as pd
import os
import openpyxl
import time
import xlrd# 1.原始数据文件是csv文件,为了后面更加方便的操作和采集,先将csv文件转化为excel文件
# 确诊原始数据
if os.path.exists(r'./confirmed.xlsx'):print("原始确诊文件早就转换成xlsx惹>_<")
else:print("来喽,开始转换确诊文件类型喽^^")with ExcelWriter('confirmed.xlsx') as ew:pd.read_csv("confirmed.csv").to_excel(ew, sheet_name="确诊", index=False)# file_Name = os.path.splitext('confirmed.xlsx')  # 文件和格式分开print("成功将确诊csv文件转换为.xlsx文件")# 治愈原始数据
if os.path.exists(r'./recovered.xlsx'):print("治愈文件早就转换成xlsx惹>_<")
else:print("来喽,开始转换治愈文件类型喽^^")with ExcelWriter('recovered.xlsx') as ew:pd.read_csv("recovered.csv").to_excel(ew, sheet_name="治愈", index=False)# file_Name = os.path.splitext('confirmed.xlsx')  # 文件和格式分开print("成功将治愈csv文件转换为.xlsx文件")# 死亡原始数据
if os.path.exists(r'./deaths.xlsx'):print("死亡文件早就转换成xlsx惹>_<")
else:print("来喽,死亡开始转换文件类型喽^^")with ExcelWriter('deaths.xlsx') as ew:pd.read_csv("deaths.csv").to_excel(ew, sheet_name="死亡", index=False)# file_Name = os.path.splitext('confirmed.xlsx')  # 文件和格式分开print("成功将死亡csv文件转换为.xlsx文件")
# 2.在文件格式转换完成后,.xlsx文件内部的数据进行行列转置
# 转置确诊文件
if os.path.exists(r'./Exconfirmed.xls'):print("确诊文件行列转置早就执行过辣")
else:print("开始进行确诊文件行列转置")df = pd.read_excel(r'./confirmed.xlsx', index_col=0)df = df.T  # 转置df.to_excel(r'./Exconfirmed.xlsx')print("确诊文件行列转置执行成功")# 转置治愈文件
if os.path.exists(r'./Exrecovered.xls'):print("治愈文件行列转置早就执行过辣")
else:print("治愈文件开始进行行列转置")df = pd.read_excel(r'./recovered.xlsx', index_col=0)df = df.T  # 转置df.to_excel(r'./Exrecovered.xlsx')print("治愈文件行列转置执行成功")# 转置死亡文件
if os.path.exists(r'./Exdeaths.xls'):print("死亡文件行列转置早就执行过辣")
else:print("死亡文件开始进行行列转置")df = pd.read_excel(r'./deaths.xlsx', index_col=0)df = df.T  # 转置df.to_excel(r'./Exdeaths.xlsx')print("死亡文件行列转置执行成功")
# 3.之前是将确诊、治愈、死亡人数的数据保存在同一个xls文件的3个不同的sheet页中,现决定使用同样的方式保存数据
# 现创建包含3个sheet的工作表
# 这部分不是必须的了。step4实现了创建excel并在excel中建立不同的sheet页。并写入数据
if os.path.exists(r'./wd.xlsx'):print('wd.xlsx已经创建好了')pass
else:shename = 'Sheet'buck = openpyxl.Workbook()buck.create_sheet('确诊')buck.create_sheet('治愈')buck.create_sheet('死亡')buck.save('wd.xlsx')ww = buck['Sheet']buck.remove(ww)buck.save('wd.xlsx')
# 4.将治愈原始数据文件、确诊原始数据文件以及死亡原始数据文件的的数据分别保存到3个不同的sheet页中
if os.path.exists(r'test.xlsx'):print('包含3个sheet页的文件已经创建好且数据已存储完成')
else:writer = pd.ExcelWriter('test.xlsx')bidList = []# 读取第一列L = list(range(274))print(L)print(len(L))# df = pd.read_excel('./Exconfirmed.xlsx', sheet_name='Sheet1', usecols=[0])df = pd.read_excel('./Exconfirmed.xlsx', sheet_name='Sheet1', usecols=L, index_col=0)df2 = pd.read_excel('./Exrecovered.xlsx', sheet_name='Sheet1', usecols=L, index_col=0)df3 = pd.read_excel('./Exdeaths.xlsx', sheet_name='Sheet1', usecols=L, index_col=0)ppf = pd.DataFrame(df)ppf2 = pd.DataFrame(df2)ppf3 = pd.DataFrame(df3)print(ppf, ppf2, ppf3)# 到这里最终生成的excel比原本的采集程序的excel多了第一列时间列,初始的采集程序的时间列是硬加上的,这里可对初始的采集程序进行调整ppf.to_excel(writer, sheet_name='确诊', header=False)ppf2.to_excel(writer, sheet_name='治愈', header=False)ppf3.to_excel(writer, sheet_name='死亡', header=False)# writer.save()writer.close()
if os.path.exists(r'./test.xls'):print('已经将包含3个sheet页数据的文件转换为xls格式')
else:with open('./test.xlsx', 'rb') as fp1:b1 = fp1.read()with open('./test.xls', 'wb') as fp2:fp2.write(b1)
# 5.这里实现生成以国家名为为文件名前缀的各个国家的xlsx文件。
work_book = xlrd.open_workbook("./test.xls")
list1 = []
newlist00 = []
newlist1 = []
newlist2 = []
newlist3 = []
namelist = []
plus_list = []
min_list = []
combine_list = []
sheets_name = work_book.sheet_names()
# 按sheet页的名称获取各个sheet页
sheet_confirm = work_book.sheet_by_name('确诊')
sheet_death = work_book.sheet_by_name('死亡')
sheet_cure = work_book.sheet_by_name('治愈')
# 获取3个sheet页各个sheet页的列数
col_con_sum = sheet_confirm.ncols
col_dea_sum = sheet_death.ncols
col_cur_sum = sheet_cure.ncols
# 获取每个sheet页的第一行数据,第一行是国家名称,国家名称最终将作为采集后各个文件的文件名前缀
row_con_0_value = sheet_confirm.row_values(0)
row_dea_0_value = sheet_death.row_values(0)
row_cur_0_value = sheet_cure.row_values(0)
fircol = sheet_confirm.col_values(1)
# 下面一行的3个变量貌似是没有用到
for item1 in row_con_0_value:item1 = str(item1)item1.replace(' ', '')if 'wan*' in item1:item1 = 'Taiwan'list1.append(item1)
print(list1)
# in this place,the job we do is to get the first-column value,and the data we want is begin at number3--the 4th line
for item2 in fircol:plus_list.append(item2)
print(plus_list)# list1 = row_con_0_value, list2 = row_con_0_value, list3 = row_cur_0_value
# 这块注意第一列的时间列,这里把第一列的第一个单元格的元素在新保存的数组中 ''删除了。需注意;同样删除的还有不属于日期的任何单元格的值
while '' in plus_list:plus_list.remove('')plus_list.remove('Country/Region')plus_list.remove('Lat')plus_list.remove('Long')
# while remove such 3 values, the first value of minn_list is the real value,
# and the len(min_list) is shorter than plus_list,in other words, the min_list is not a whole column
min_list = plus_list
list1.remove('Country/Region')
print(list1)
new_lis = list(dict.fromkeys(list1))
for item in new_lis:if 'wan*' in item:item = 'Taiwan'item1 = item + ".xlsx"namelist.append(item1)
print(namelist)
print(len(namelist))
# 下面是生成excel的代码,在表格生成后就注释了。
if os.path.exists(r'./data/Zimbabwe.xlsx'):print('excel工作表已经生成过了^^')
else:print("现在要创建全套的excel表喽...")for iy in range(0, len(namelist)):buk = openpyxl.Workbook()nasaname = namelist[iy]final_name = nasaname + ".xlsx"buk.save('./data/' + final_name)# txtname = (str(final_name)).replace('xlsx', 'txt')# 这块可以用于当数据采集完成时将.xlsx文件转换为(另存为).txt格式。如果成功将避免使用了额外的VBA代码进行文件格式转换# with open('./data/'+final_name, 'rb') as fp11:#     b11 = fp11.read()# with open('./data/'+txtname, 'wb') as fp22:#     fp22.write(b11)print(final_name + "生成完成")res_len = len(namelist)res_len = str(res_len)print('=============================全部' + res_len + '个' + 'excel文件全部生成完成=============================')
# aqa芭蕾,eqe亏内,代表着伤心代表着悲伤
# 这个脚本文件的代码是全部数据采用根据字典key求和的方式读取全部的数据
# r = 0;d = dict()
reslist = []
wb = xlrd.open_workbook('test.xls')
# 获取3个不同名称的sheet页
ws = wb.sheet_by_name('确诊')
ws2 = wb.sheet_by_name('治愈')
ws3 = wb.sheet_by_name('死亡')
# 3个sheet页的行数是一样的,这部分可以验证,也非常不必要进行验证,所以3个sheet也的行数就用一个就行(主要的原因是在同一个循环体内)
rcount = ws.nrows
rmidcount = ws2.ncols
rc = int(rcount)
print(rcount, rc)listhalf = []
min_list = plus_list
for i in range(1, len(list1) + 1):# for i in range(2, len(list1) + 2):z = len(list1) - len(new_lis)fivename = namelist[i - 1 - z]data = xlrd.open_workbook('./test.xls')fsname = 'D:\\nginx-1.20.2\\html\douban_flask\\PickProgram\Data\\' + fivename# data2 = xlrd.open_workbook('./data/' + fivename)data2 = xlrd.open_workbook(fsname)sheet_1 = data.sheet_by_name(u'确诊')sheet_11 = data.sheet_by_name(u'治愈')sheet_111 = data.sheet_by_name(u'死亡')sheet_2 = data2.sheet_by_name('Sheet')# for g in range(1, len(list1) + 1):# for j in range(4, len(plus_list)+1):# for j in range(4, len(min_list) + 1):for j in range(4, len(min_list) + 1):con_dat_value = sheet_confirm.col_values(0)[3:]# bg = openpyxl.load_workbook('./data/' + fivename)bg = openpyxl.load_workbook(fsname)shuit = bg.activeif i < len(list1) and sheet_1.cell(0, i).value == sheet_1.cell(0, i + 1).value or sheet_1.cell(0,i).value == sheet_1.cell(0,i - 1).value:passelse:# con_dat_value = sheet_confirm.col_values(0)col_con_value = sheet_confirm.col_values(i)col_dea_value = sheet_death.col_values(i)col_cur_value = sheet_cure.col_values(i)newlist00 = con_dat_valuenewlist11 = col_con_valuenewlist22 = col_dea_valuenewlist33 = col_cur_value# shuit.cell(row=j, column=1, value=newlist00[j])shuit.cell(row=j - 3, column=2, value=newlist11[j - 1])shuit.cell(row=j - 3, column=3, value=newlist22[j - 1])shuit.cell(row=j - 3, column=6, value=newlist33[j - 1])halfname = str(sheet_1.cell(0, i).value)print(halfname)listhalf.append(halfname)listhalf = list(dict.fromkeys(listhalf))print(i, j, j, i)bg.save(fsname)
print("====================================")
print(listhalf)
print("====================================")
for jj in range(3, rc):start_time = time.time()r = 0r2 = 0d = dict()d2 = dict()d3 = dict()while r < ws.ncols - 1:# if rmidcount < 261:r += 1# 这个key是一直不变的,不随j和r的变化而变化key = ws.cell_value(0, r)if 'wan*' in key:key = 'Taiwan'val = ws.cell_value(jj, r)if key in d.keys():d[key] += valelse:# d[key] = vald[key] = val# 对于治愈sheet的操作# key = ws.cell_value(0, r)# key2 = ws2.cell_value(0, r)if r < 260:key = ws2.cell_value(0, r)if 'wan*' in key:key = 'Taiwan'val2 = ws2.cell_value(jj, r)if key in d2.keys():d2[key] += val2else:# d[key] = vald2[key] = val2else:pass# 对于死亡sheet的操作# key3 = ws3.cell_value(0, r)key = ws.cell_value(0, r)if 'wan*' in key:key = 'Taiwan'val3 = ws3.cell_value(jj, r)if key in d3.keys():d3[key] += val3else:# d[key] = vald3[key] = val3# 通过字典的方式---对数据的整合for k in d:if k not in listhalf:# 以下是获取文件名以及打开文件(使文件的状态为active)filename = k + '.xlsx'reslist.append(filename)# cur_name = reslist[]source_name = 'D:\\nginx-1.20.2\\html\douban_flask\\PickProgram\Data\\' + filenamebug = openpyxl.load_workbook(source_name)sht = bug.activesht.cell(row=jj - 2, column=2, value=d[k])# if r < 261:sht.cell(row=jj - 2, column=3, value=d2[k])# else:passsht.cell(row=jj - 2, column=6, value=d3[k])bug.save(source_name)end_time = time.time()print(d)print(jj, start_time, end_time, f"It took {end_time - start_time:.2f} seconds to compute")

程序代码中的部分内容提取

  1. 判断文件是否存在 if os.path.exists(r'./confirmed.xlsx'):
  2. csv文件转xlsx文件:
# 这里的index部分,不过不设置为false,那么会在转换为xlsx后的首行出现index(每列的编号/索引)
with ExcelWriter('confirmed.xlsx') as ew:pd.read_csv("confirmed.csv").to_excel(ew, sheet_name="确诊", index=False)
  1. 对于xlsx文件内部数据格式进行行列转置
    df = pd.read_excel(r'./confirmed.xlsx', index_col=0)df = df.T  # 转置df.to_excel(r'./Exconfirmed.xlsx')
  1. range的范围是左到右不到
  2. 文件另存为的实现:目前已知的可实现xlsx->xls,xls->txt。另存为过程中不该变文件内部的结构(如文件内部字段间的分隔符)
    with open('./test.xlsx', 'rb') as fp1:b1 = fp1.read()with open('./test.xls', 'wb') as fp2:fp2.write(b1)

本来勾巴已经写了16000+的字了,结果闪退了,编辑的内容都无了,

【疫情分析--数据采集】相关推荐

  1. 阿里云数据库快速搭建疫情分析系统最佳实践

    简介:疫情降临,疫情态势分析和防控任务迫在眉睫,如果快速搭建高效的疫情态势分析系统是众多部门和单位的难题,阿里云RDS PG+Ganos解决方案可在极短时间内完成分析系统搭建,有效助力疫情防控. 直达 ...

  2. 2019年7月勒索病毒疫情分析

    勒索病毒的蔓延,给企业和个人都带来了严重的安全威胁.360安全大脑针对勒索病毒进行了全方位的监控与防御.从本月数据来看,反勒索服务反馈量有小幅度上升,其中Stop是反馈量上升最大的一个家族. 360解 ...

  3. 教育行业疫情分析研判报告撰写格式与模板详解

    要写好一份每日疫情研判报告的前提是需要做好大量的数据梳理分析.所以小编就来为各位分享一些疫情舆情数据快速整理分析的方法以及提供了一份教育疫情舆情分析报告格式模板,供各位参考. 疫情舆情数据快速整理分析 ...

  4. Python数据分析:实时更新全国全球疫情分析

    实时更新全国全球疫情分析 简介 步骤流程 准备数据集(获取数据集) 国内数据集 国外数据集 国内分析 生成网页版 国外分析 生成网页版 后记 简介 运用到Python爬虫request库,Excel ...

  5. FineBI04:【案例】稍微复杂的案例:全球疫情分析--南丁格尔玫瑰图

    一.目标 在上一个文档,我们讲了一个简单的案例,下面我们根据上一个案例做一个稍微复杂的案例:生成一个南丁格尔玫瑰图. 二.数据准备 下载地址: 链接:https://pan.baidu.com/s/1 ...

  6. 用Python进行新型冠状病毒(COVID-19/2019-nCoV)疫情分析

    新型冠状病毒(COVID-19/2019-nCoV)疫情分析 祈LHL 重要说明 分析文档:完成度:代码质量 3:5:2 其中分析文档是指你数据分析的过程中,对各问题分析的思路.对结果的解释.说明(要 ...

  7. 数据挖掘之对河南省的疫情分析

    对河南省的疫情进行分析 import numpy as np import pandas as pd import matplotlib.pyplot as plt import requests#请 ...

  8. drop table可以删除多张表吗_python全球疫情分析,告诉你海外疫情到底有多严峻 | 附290行代码...

    点击蓝字关注!设置星标!每天都有进步 作者:数据小斑马 | 数据分析师 CSDN博客专家 本文通过python,对全球疫情进行分析,除了总结疫情现状外,重点讲解 串联爬虫.数据库和数据分析的基础知识点 ...

  9. React实战开发-----一个有关兰州疫情分析的软件,本人负责前端开发,本博客记录整个开发的流程,供大家参考

    目录 前言 react介绍(觉得这些官方介绍啰嗦的直接看个人总结) 一.React的起源和发展 二.React的出发点 三.Recat与传统MVC的关系 四.React高性能的体现:虚拟DOM 五.R ...

最新文章

  1. 数字孪生等前沿技术,将如何解码未来交通?
  2. 读----------空乏的估算
  3. oracle里面有emp表么,Oracle自带表(EMP)SQL语句练习
  4. 基于条件随机场的命名实体识别
  5. 【leetcode】109. Convert Sorted List to Binary Search Tree
  6. 3月第4周全球域名商TOP15:万网第四 涨幅居亚
  7. mysql jion 实现原理_MySQL-join的实现原理、优化及NLJ算法
  8. ECMAScript 2015~2020 语法全解析
  9. js获取的值传到java_使用GraalVM从javascript将变量参数传递给java函数
  10. 华为哪个是鸿蒙,华为系统是鸿蒙还是安卓?有什么区别
  11. 大白话讲解如何给github上项目贡献代码
  12. 如何查看cudnn当前版本_当前版本的花木兰,如何成为边路战神?
  13. 反思-我们真的初老了么?
  14. 视觉Prompt新方法:超越所有微调方法,参数量大幅减少
  15. UEFI下的Gmac驱动实现
  16. 0320-复利计算器代码
  17. 单片机C51复习题(课后习题及答案)
  18. 推荐系统经典算法之协同过滤
  19. android+自定义键盘之汉字,android自定义键盘(解决弹出提示的字体颜色问题)
  20. 在FL Studio中如何制作人声切片(Vocal Chops)

热门文章

  1. 用计算机弹了,如何用计算器弹奏流行歌曲(图文教学),你需要学习了
  2. 小米手表S1、华为的WATCH GT3、OPPOWatch2和魅族智能手表。
  3. 怎样修复计算机系统声音,电脑没声音了如何恢复?电脑突然没声音修复方法汇总...
  4. ros_hostname与ros_ip
  5. 1分钟快速了解MindMapper 与MindManager间的不同点
  6. java set子集_Java程序来检查一个集合是否是另一个集合的子集
  7. Qt图形视图QGraphicsItem类
  8. pymol配体平移与旋转
  9. php pdo oracle 乱码,php pdo 乱码怎么办
  10. Java使用Spire.Pdf或Aspose-Words实现Word转换Pdf在Linux服务器上的中文乱码问题