COVID仪表板升级

我最近升级我之前构建的COVID Rails仪表板。 在这篇文章中,我描述了动机和升级的细节以及共享代码片段。

每天‬分享‬最新‬软件‬开发‬,Devops,敏捷‬,测试‬以及‬项目‬管理‬最新‬,最热门‬的‬文章‬,每天‬花‬3分钟‬学习‬何乐而不为‬,希望‬大家‬点赞‬,评论,加‬关注‬,你的‬支持‬是我‬最大‬的‬动力‬。



早在2020年, 我写了一个使用Rails 6.0.2和Ruby 2.5.1 COVID仪表板 。 给定一个日期范围,它显示一个线图的累积以及增量数据证实,死者,恢复情况。 其数据来源:

  1. COVID-19存储库的数据中心系统科学与工程(CSSE)约翰霍普金斯大学:这个GitHub库提供了一个CSV文件每天与国家层面的累积数据。
  2. 这个网站用来提供印度state-wise统计数据 但不幸的是已经停止操作。 国家级数据只有通过30 - 10月- 2021和可以获得通过REST API以JSON格式。

CSSE每天提供累积数据,而covid19india.org提供每日增量数据。
我最近升级应用程序。 在这篇文章中,我描述了动机和升级的细节以及共享代码片段。

目标

该系统有两个 Python 和 Ruby 脚本 生成CSV格式的数据集 。 数据插入到数据库,Rails仪表板访问。

四个生成器脚本:

  • gdc.py :环球数码创意代表全球每日累计。 脚本CSV文件作为命令行参数,提取每个国家的数据,并打印出来。 输出重定向到一个文件中 数据集/ global_daily_cumulative 文件夹中。 一个控制台的命令来运行它:
python3 gdc.py ../COVID-19/csse_covid_19_data/csse_covid_19_daily_reports/04-25-2020.csv > datasets/global_daily_cumulative/04-25-2020.csv


  • gdd.py :GDD代表全球每日三角洲。 脚本计算三角洲数字减去一天的前一天的累积的号码的那一天。 输出重定向到一个文件中 数据集/ global_daily_delta 文件夹中。 一个控制台的命令来运行它:
python3 gdd.py datasets/global_daily_cumulative/04-25-2020.csv > datasets/global_daily_delta/04-25-2020.csv


  • idd.rb :IDD代表印度日常三角洲。 脚本中提取的数据一天,日期作为命令行参数提供。 输出重定向到一个文件中 数据集/ india_daily_delta 文件夹中。 一个控制台的命令来运行它:
ruby idd.rb 25-Apr-20 > datasets/india_daily_delta/04-25-2020.csv


注意日期格式使用covid19india.org dd-month-yy。

  • idc.rb :IDC代表印度日常累积。 脚本计算通过添加那一天一天的累积数据的增量(δ)前一天累积的号码。 输出重定向到一个文件中 数据集/ india_daily_cumulative 文件夹中。 一个控制台的命令来运行它:
ruby idc.rb 04-25-2020 > datasets/india_daily_cumulative/04-25-2020.csv


daily_all。 rb程序读取所有CSV文件在每个数据集目录,使聚合数据文件整理文件的内容。 例如,在global_daily_cumulative文件夹中所有文件的内容是global_daily_cumulative.csv整理。 主文件中的每一行数据的日期作为第一个字段。 文件名称:

  • global_daily_cumulative.csv
  • global_daily_delta.csv
  • india_daily_cumulative.csv
  • india_daily_delta.csv

生成的日常文件和四个聚合数据文件都有相同的数据格式:日期,地点,确认,死亡,恢复。

问题是,我必须运行的四个程序一天的数据。 当然,我可以堆一组命令一个星期在脚本文件并运行文件,但它仍然需要手动工作准备。

我曾经将数据插入到PostgreSQL通过使用 psql 通过CSV文件作为参数。 一个典型的命令,如下所示(在Windows上):

PowerShell

"C:\Program Files\PostgreSQL\13\bin\psql.exe" -h localhost -U postgres -d covid19 -c "SET client_encoding TO 'UTF8';" -c "\copy global_daily_cumulative(date, place, confirmed, deaths, recovered) FROM 'E:\Code\Corona2020\covid19\global_daily_cumulative.csv' DELIMITER ',' CSV;"


在Linux上,命令是:

psql -d covid19 -c "SET client_encoding TO 'UTF8';" -c "\copy india_daily_delta(date, place, confirmed, deaths, recovered) FROM '/var/www/datasets/covid19/india_daily_delta.csv' DELIMITER ',' CSV;"  


完整的工作流程如下图所示:

COVID仪表板升级

有三个手动步骤。 我的目标是要做 的端到端自动化 。 的想法是只做一个git克隆或把我的电脑和运行一个Ruby文件。 就是这样。 同时,我也打算 升级的仪表板的技术堆栈 .

实现

我选择的语言肯定是Ruby,我移植两个Python程序Ruby。 四生成器脚本成为Ruby关联类的业务逻辑调用方法。 同样,我封装psql命令关联 InsertCovidDataInDb 。 global_daily_cumulative插入数据的文件。 csv, global_daily_delta。 csv, india_daily_cumulative。 csv和india_daily_delta。 csv表global_daily_cumulative, global_daily_delta india_daily_delta和india_daily_cumulative分别。

一个关联是一个Ruby类,包括关联的宝石,调用方法,编写业务逻辑。 没有创建一个类的对象,调用“叫”的方法来运行业务逻辑。 使用类似于Java静态方法。 环球数码创意的文件。 rb有很棒的课 GenerateGdcData gdd。 rb已经 GenerateGddData ,国际国内直拨电话。 rb已经 GenerateIddData 最后idc。 rb已经 GenerateIdcData 类。 例如,下面的代码 GenerateGdcData :

Ruby

require 'interactor'brrequire 'date'brrequire 'csv'brbr$indexes_to_read = {}br$indexes_to_read['format1'] = [1,3,4,5]br$indexes_to_read['format2'] = [3,7,8,9]br   brclass GenerateGdcDatabr    include Interactorbr           br    def callbr        country_data_hash = {}br        Dir[context.folder + '/*.csv'].each do |file_path|br            file_name = File.basename(file_path, ".*")br           br            # if file_name is before 03-22-2020, file_format = format1 else format2br            file_date     = Date.new(file_name[6..9].to_i, file_name[0..1].to_i, file_name[3..4].to_i)br            file_format   = file_date < Date.new(2020, 03, 22) ? "format1" : "format2"br            file_date_str = file_date.to_sbr           br            country_index     = $indexes_to_read[file_format][0]br            confirmed_index   = $indexes_to_read[file_format][1]br            deaths_index      = $indexes_to_read[file_format][2]br            recovered_index   = $indexes_to_read[file_format][3]brbr            CSV.foreach(file_path, headers: true) do |row|br                country = row[country_index]br                if country == "Mainland China"br                    country = "China"br                elsif country == "Korea, North"br                    country = "South Korea"br                elsif country == "Korea, South"br                    country = "South Korea"br                elsif country == "Gambia, The"br                    country = "Gambia"br                elsif country == "Bahamas, The"br                    country = "Bahamas"br                elsif country == "The Bahamas"br                    country = "Bahamas"br                elsif country == "Gambia, The"br                    country = "Gambia"br                elsif country == "The Gambia"br                    country = "Gambia"br                endbrbr                row[confirmed_index] = row[confirmed_index] ? row[confirmed_index] : 0br                row[deaths_index]    = row[deaths_index]    ? row[deaths_index]    : 0br                row[recovered_index] = row[recovered_index] ? row[recovered_index] : 0br               br                confirmed = row[confirmed_index].to_ibr                deaths    = row[deaths_index].to_ibr                recovered = row[recovered_index].to_ibr               br                if file_format == "format2"br                    row[0] = row[0] ? row[0] : 0br                    row[5] = row[5] ? row[5] : 0.0br                    row[6] = row[6] ? row[6] : 0.0br                endbrbr                if country_data_hash.has_key? [file_date,country]br                    country_data_hash[[file_date_str,country]][0] += confirmed if confirmedbr                    country_data_hash[[file_date_str,country]][1] += deaths if deathsbr                    country_data_hash[[file_date_str,country]][2] += recovered if recoveredbr                elsebr                    country_data_hash[[file_date_str,country]] = [confirmed, deaths, recovered]br                endbr            endbr        endbr        context.gdc = country_data_hashbr    endbrend


主程序是在一个新的文件,generate_covid19_data.rb。 它的功能很简单:叫五个扶少团团员。

COVID仪表板升级

随着自动化升级,我升级堆栈:即。 从2.5.1 Ruby红宝石3.1.1; Rails从6.0.2 7.0.2.3 importmap + 顺风 ; 4.1.3 Chartkick从3.4.2; 最后,从12到14 PostgreSQL。

每当我现有的应用程序升级到Rails 7,我的方法是生成一个示例应用程序和非功能性文件复制到现有的应用程序。 具体地说,这些都是本、自由和app / javascript文件夹。 从那里我做其他的变化取决于哪种包装方法我选择。 在这种情况下,我改变了 webpacker importmap 的,所以我需要确保文件bin / importmap。 rb在场并在application.html.erb javascript_importmap_tags。

如何运行

克隆CSSE GitHub回购。

$ git clone https://github.com/CSSEGISandData/COVID-19.git


克隆存储库。


$ git clone https://github.com/mh-github/covid19.git


创建一个名为covid19在PostgreSQL数据库的数据库。 创建四个表。 的命令是 可以在GitHub从92行开始 .
rails更新covid19 / /仪表板/ config /数据库。 yml与数据库用户名、密码和端口号。 在文件insert_covid_data_in_db输入相同的值。 rb。
到项目根目录:


$ cd covid19


你需要ruby-3.1.1。 如果你使用数位视讯,安装这个版本和使用。


$ rvm install 3.1.1br$ rvm use 3.1.1


安装 httparty pg , 很棒的 宝石,如果你没有在你的系统。


$ gem install httparty pg interactor


插入数据到数据库中。


$ ruby generate_covid19_data.rb path/to/COVID-19


去仪表板文件夹:

$ cd rails/dashboard


切换到ruby 3.1.1。

$ rvm use 3.1.1


安装所需的宝石。

$ bundle install


运行服务器。

$ rails s


在浏览器中访问仪表盘http://locahost: 3000。 这是澳大利亚的截图显示的图表。

COVID仪表板升级

我把代码捕获数据插入时间。 psql似乎非常快。 以下数字:

表格

时间(秒)

global_daily_cumulative

171502年

3.09

global_daily_delta

171502年

3.087

india_daily_cumulative

21677

0.335

india_daily_delta

21195年

0.323

这些都不是坏的考虑到我的基础设施是我的桌面PC与i5 - 4570 CPU @ 3.20 ghz处理器,20 GB RAM, Windows 10 Pro v21H1, WSL2。 我PostgreSQL在Windows上运行,在WSL-Ubuntu主程序。

结论

无论项目大小,总会有机会的 重构 和自动化。 即使你的程序是一个基本教程类型,其技术堆栈升级到最新版本给实践和学习,你可以应用到你的工作的应用程序

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章