用python pandas 分析新冠数据教程1

之前说到过,和同事们做了一个免费开源的新冠数据访问接口项目:COVID-19-Data-API。今天开始我们用 Python 、jupyter notebook、pandas等来进行数据分析的一个教程。

疫情过后,有人说剩下来的都是数字化的企业了,数据分析能力也已经是一项必备技能了,有太多的工具可以进行数据分析,前几年可能excel 还是很多人认为最有效的数据分析工具,现在可以选择面太广了,免费工具里面,Python+pandas 肯定还是最佳选择之一。准备一套完整的 Python 的入门教材+Python数据分析教程,并且用现在时髦的视频方式录制。所以先准备好教材。

下面的代码从接口处获得数据,经过简单的整理,输出。
具体来说,是获得意大利在2020年3月24日的疫情感染数据。

1 设置API的地址,调用token
2 设置headers、payload等需要调用的参数
3 通过 requests 的 get 方法来访问数据
4 通过 pandas 来简单处理数据
5 显示数据

# demo for infection/region
# input region, start_date, get data
# 接口:感染/国家地区

import requests
import pandas as pd

# API url
url = 'https://covid-19.adapay.tech/api/v1/'
# token, can call register function get the API token
token = '497115d0c2ff9586bf0fe03088cfdbe2'

# region or country
region='Italy'

# headers, need the API token
headers = {
    'token': token
}

# the params
payload = {
    'region': region,
    'start_date':'2020-03-24'
}

# call requets to load 
r = requests.get(url+'infection/region', params=payload, headers=headers)

data = r.json()

# use pandas to get the data
df = pd.DataFrame.from_dict(data['data']['region'][region])
print(df)
print('---')

通过requests 获得数据,然后pandas 整理。输出结果如下:

               2020-03-24
confirmed           69176
confirmed_add        5249
deaths               6820
deaths_add            743
recovered            8326
recovered_add         894

即便你对Python不太懂,或者一知半解,相信看到上面的代码也能够猜的七七八八,Python的可读性非常好。

要运行上面代码,最简单的方式是通过 jupyter-notebook,然后推荐下载安装 anaconda,最强的 Python 扩展程序,下载安装 anaconda 之后,直接运行 jupyter-notebook,就可以在notebook 里面的 cell 单元格中输入上面的代码。 已经有很多教程关于怎么使用 Python 下的 jupyter-notebook,可以先网上搜索一下,这里就不赘述了。

下面的例子读取一段时间范围内的数据,并对行列进行交换,便于分析和制图。基础代码延续之前的例子,所以要在上面运行的基础上继续。

# demo for infection/region
# input region, start_date, end_date, get data

# the params
payload = {
'region': region,
'start_date': '2020-03-24',
'end_date': '2020-03-31'
}

# call requets to load
r = requests.get(url+'infection/region', params=payload, headers=headers)

data = r.json()

# use pandas to get the data
df = pd.DataFrame.from_dict(data['data']['region'][region])
print(df)
print('---')

我们可以得到下面的结果:

               2020-03-24  2020-03-25  2020-03-26  2020-03-27  2020-03-28  \
confirmed_add        5249        5210        6203        5909        5974   
deaths_add            743         683         712         919         889   
recovered_add         894        1036         999         589        1434   
confirmed           69176       74386       80589       86498       92472   
deaths               6820        7503        8215        9134       10023   
recovered            8326        9362       10361       10950       12384   

               2020-03-29  2020-03-30  2020-03-31  
confirmed_add        5217        4050        4053  
deaths_add            756         812         837  
recovered_add         646        1590        1109  
confirmed           97689      101739      105792  
deaths              10779       11591       12428  
recovered           13030       14620       15729  

我们把日期和确证等交换一下行列,便于制图

# demo for infection/region
# input region, start_date, end_date, get data
# exchange the row and column by Pandas, the row index is date
# 交换数据的行和列

df = df.T
print(df)
print('---')

可以得到下面的结果:

            confirmed_add  deaths_add  recovered_add  confirmed  deaths  \
2020-03-24           5249         743            894      69176    6820   
2020-03-25           5210         683           1036      74386    7503   
2020-03-26           6203         712            999      80589    8215   
2020-03-27           5909         919            589      86498    9134   
2020-03-28           5974         889           1434      92472   10023   
2020-03-29           5217         756            646      97689   10779   
2020-03-30           4050         812           1590     101739   11591   
2020-03-31           4053         837           1109     105792   12428   

            recovered  
2020-03-24       8326  
2020-03-25       9362  
2020-03-26      10361  
2020-03-27      10950  
2020-03-28      12384  
2020-03-29      13030  
2020-03-30      14620  
2020-03-31      15729  

技术的温度-新冠疫情数据开源项目

1-2月份,这次新冠疫情来临的时候,看着每天跳跃的确诊和疑似人数,感到很无助。我们不是医生,捐钱捐物在当时也比较困难。我们这些只会开发项目、写写程序、弄弄云计算的技术直男能做些什么呢?


首先我们想到的是有什么可以帮到公司,当时公司复工在即,诸如保洁安保等很多外部服务公司的员工的健康情况要每天征集,正好团队有一个问卷系统,不管是微信还是钉钉,都能使用,每天所有填表人员的信息就自动汇总好了,疫情情况多变,增加修改问题也很方便。然后行政mm在组织复工后的订餐又碰到问题了,怎么让员工可以在公司指定的快餐供应商这里下单,然后第二天中午送到每层指定的地方,订餐么总还是要有一些仪式感,各类照片等等。正好之前团队在做一个手机在线商城项目,于是拿来修改一下,外卖菜单更新、员工下单和支付、统计数量等都不需要繁琐的人工统计工作。


技术是有温度的。在家办公的时候,虽比不上逆行者救死扶伤,原来自己的技术能力还是可以为防疫做些事情的。于是有一个想法冒了出来,数据处理分析能力也是我们强项啊,当时要查自己的航班火车是否有新冠确诊者比较麻烦,要自己每天输入。于是数据中心的小伙伴一边写了一个检查行程并自动推送信息的小程序,一边将各类行程信息在后台数据整理好。难能可贵的是这些并不是他们的本职工作,几个通宵,前后端联手,再经过几次迭代更新,能够方便到需要的朋友,就很满足。


最近大家知道,中国国内的疫情是控制住了,可是世界范围又开始爆发了,看到很多分析文章,我们数据分析团队的小朋友又坐不住了,因为我们发现并没有很好的疫情数据的接口。我们可以看到很多的数据播报,但是几乎没有什么自动获得的方式可以得到这些数据。大型新闻网站等有自己的接口,不对外开放,有一些公司提供接口,要收取费用。国内的很多爱好者们纷纷用爬虫等技术来获得数据,这样又不够准确。
美国约翰霍布金斯大学汇聚了全球各个疾控组织的数据,有静态的数据和官方提供的分析看板,不能直接访问数据源做更多的自主分析。我们的技术直男们又出手了,分成两个小组,一个小组将每天更新几次的静态数据自动汇总到数据库,一个小组开发接口,让任何有兴趣的研究者可以用任何编程语言来访问接口得到数据,开展自己的分析。白天工作非常忙碌,我们用了两周的晚上时间,终于基本完成。这个项目提供查询公开的全世界各个国家地区的新冠确诊、治愈、死亡等数字,有些国家地区可以挖掘到省份城市和州县,包括所有日期,并且最新的数据每天根据CDC更新而自动更新。这几天清明假期,大家更是不眠不休,终于完成了第一个版本。


复杂的数据清洗和整理,友好的数据接口包括支持自动联调,基于github的项目管理,高效的DevOps开发流水线,云计算的弹性能力,正是这些平时练就的本领,让这个新冠数据项目可以走到今天,相信这些数据对于需要的研究人员是有价值的。我们也会不断完善和改进。


技术让数字不再冰冷,程序员心中也是充满了热情。每个人的自律和努力,疫情一定早日退散!


COVID-19 Data API 地址: https://covid-19.adapay.tech

文档和自动联调地址: https://covid-19.adapay.tech/docs

访问API需要API Key,之后可以使用电子邮件自助申请,目前可以用:497115d0c2ff9586bf0fe03088cfdbe2

上面这个API Key可能会关闭,建议使用 register 接口来免费获得API Key。

有任何问题可以在这里留言,

电子邮件:国内 130730311@qq.com 国外 wingfish@gmail.com

2013年十月的某天

年纪大了就开始回忆,想起2013年10月,差不多是人生最迷茫的时刻了。

我们总是觉得眼前有很多过不去的坎,实际上人生一直在被挑战,就看你是什么心态。有时候觉得如果到了某个level、某个位置、过了某个时间点就好了,其实哪有那么简单。

读大学的时候,觉得读书太无聊了,快点工作,然后结婚生子,肯定就很开心。后来才发现,自己太天真了。

2002年,升职,销售总监,当时意气风发,结果也就9个月,黯然收场。

2013年10月,在古美路的街头,12号地铁还在修,看着宽阔的马路,但是显着杂乱。那一刻,是完全不知道未来会发生什么的。

很难有人相信,这几年经历了什么。之前亏欠太多,花费了太多,无论是心力,还是精力。将生活、工作都慢慢带入正规。然而,身体还是受到一定的影响。

在街头的时候,自己评估了能力,发现写作和编程还是自己最强的能力,其他都不值一提,所以聚焦于此,猛攻之。这几年,出版了两本书,算是自己勤奋的成果,当时自然也不会想到引起了某些同事的巨大惊慌,而我的情商还有很多不足,于是职业生涯也是多多挫折。好在如今的我,还是认为自己能力有限,必须发挥优势。我可以学习python、人工智能、云计算等,还可以继续学习啊,python这两年发展的越来越快,还有继续提升,IT领域的有趣技术层出不穷,不怕没东西研究。和情商高的小人共事,本身是一种磨练。这世界上的每个人都不是好人坏人那么简单的。既然是为了一些自己抱负和理想,也就像这几年所经历的一样,继续放弃,继续淡定。

上周出版社说样书马上寄到,高兴之余,想起六年前的那个下午,那刻,我迷茫无助的思想。吃亏是福,多寿多福!

每天编程:非常好用的 python 路径文件处理库 pathlib

的确,我之前也是习惯用 os.path.join ,倒是也没有觉得有什么不好,直到我看到了 pathlib,应该是 python 3.x 时代引入的新的专门更加优雅的处理比较麻烦的路径拼接、文件是否存在、路径是否存在等操作系统文件路径相关的Python 官方函数。

比如你可以用 path1 / path2 / filename 这样的简单直观的方法来完成路径和文件名的拼接,通过 PurePosixPath 和 PureWindowsPath 的类显式的兼容多操作系统。

原来的 os 库发展太久了,如同 python 的日期时间库一样,在长时间的进化中包和其函数的结构越来越混乱了。从下面的 os 和 pathlib 的函数比较可见一斑:

os and os.pathpathlib
os.path.abspath()Path.resolve()
os.chmod()Path.chmod()
os.mkdir()Path.mkdir()
os.rename()Path.rename()
os.replace()Path.replace()
os.rmdir()Path.rmdir()
os.remove()os.unlink()Path.unlink()
os.getcwd()Path.cwd()
os.path.exists()Path.exists()
os.path.expanduser()Path.expanduser() and Path.home()
os.path.isdir()Path.is_dir()
os.path.isfile()Path.is_file()
os.path.islink()Path.is_symlink()
os.stat()Path.stat()Path.owner(),Path.group()
os.path.isabs()PurePath.is_absolute()
os.path.join()PurePath.joinpath()
os.path.basename()PurePath.name
os.path.dirname()PurePath.parent
os.path.samefile()Path.samefile()
os.path.splitext()PurePath.suffix

Pathlib 非常完美的体现了 Python 的优雅,更多信息可以参考官方文档。打算将 fishbase 中的一些封装的文件处理函数逐步更换为对 Pathlib 的封装,Python 2.7 实在没有必要支持了。

Python 3.6 时代终将结束 迎接 3.7.x

今天看到

“Python 3.6.8 is planned to be the last bugfix release of Python 3.6. Per our support policy, we plan to provide security fixes for Python 3.6 as needed through 2021, five years following its initial release.”

Python 3.6.8 作为 3.6.x 的最后一个错误修订版本了,之后 Python 将全面转向 3.7.x。我觉得影响不是很大,Python 3.7 系列是完全兼容 3.6的,并且很多地方有了提升,一些新特性也不错。

每天编程:jupyter notebook 安装错误问题解决

用新的 wordpress 5.0 的编辑器进行编辑,还有点不习惯,感觉功能很强大的样子。之前还在担心 wordpress 那么多年江郎才尽,完全不需要,就如同我们在思考微信还能玩出什么花样,人家的 7.0 开始玩 vlog,整体界面的设计又更加好看,或者不同了。

jupyter notebook 是我们用来学习和教学 Python 时候非常好的工具,python 这几年的流行推广离不开 jupyter 在背后的功劳,其他语言中都没有看到过这么强大的交互工具,即便 Apple 当年推出 swift 时候的 playground 都略逊一筹。

只是不知道什么时候开始,大约是我在我的笔记本上安装过的 python 版本太多了缘故,不知道什么开始,jupyter nootbook 就不能正常启动了。

解决方法试了很多种,如果你得到的报错结果也是诸如 image not found,并且是从 zmq 这里出问题的话,删除你安装的 pyzmq 和 zmq,然后重新安装,就可以了。如果万一还没有好,所有相关 python 目录,比如你是用 anaconda 安装的话,就把不同的 python 环境下的这些包都删除,再重新安装。

从 WordPress 5.0 已经发布开始遐想

其实记不清是从 WordPress 哪个版本开始使用的,这么多年来,WordPress 也像 Office 一样,其实功能够用了,加上其无比强大的插件体系。可是 WordPress 依然在努力的改进和更新。

未必是看到自己的不足,却看到更好的未来。

这样的大局观,让我很钦佩。

最近几年一直在做一些技术创新,很艰难,很多时候选择了放弃,很多时候不得不放弃。现在想想,却不必自怨自艾。很多事情要坚持,总不会太差。

智商和情商以及种种,在职业上已经让我很难突破,但是谁都不可以阻碍我对电脑技术的热爱。2015年,学习 Python,为了考验自己的 Python 能力,先是2016 年做了一年业余的 Python 老师,然后2017年和同事一起写了 Python 的书;2017年年底开始接触阿里云的技术,顿感惊讶,仿佛看到另外一个世界,于是2018年的半年多业余时间,又是奋笔疾书,能力不够就靠勤奋来补,这本“冲上云霄”2019年年初应该可以付梓吧。而今年,在工作实践中,几方面的探索都让我倍感欣慰,DevOps 的实践探索,开发管理的精细化,Python 的进击,复杂 IT 项目的管理艺术。

这样想想,也很开心。虽然怀念在天目路上海银行的时候,并无人管我具体技术工作,一个人可以开开心心的研究各类开发项目。现在,背负的责任重了很多,很多无奈,很多无法平衡的平衡,但是,舞台却更大了。

舞台大了,心也需要更大。

明年要不要继续写作的节奏,是浸淫多年的 IT 项目管理,还是 DevOps ?哈哈!人生需要一些疯狂。

PyCharm 2018.1 新版本发布

PyCharm 2018.1 新版本如期而至。

对于 Python 3.7 的支持,比如 dataclasses。

更加智能的代码提示。

对单元测试更好的边栏支持。

科学研究模式可以运行部分指定的代码。

通过 conda 环境来支持建立一个科学数据研究项目。

Flask CLI 的支持。(Flask 在目前版本支持 Click 的命令行功能,现在 PyCharm 直接支持 Flask CLI 的调试了)

对于 TypeScript 2.7 的完整支持。

版本管理支持部分提交、更好的 rebase 支持。

远程开发方面支持更容易配置的基于 SSH 的 Python 调试器,提高了对于 Docker Compose 3.3 的支持。

PyCharm 包含了 JetBrainstorm DataGrip 的所有功能。

一直感觉,PyCharm 已经是非常完美的工具,甚至觉得它的功能太多了,已经复杂的很,没想到,依然继续提升,继续跟进所有的技术开发潮流。佩服!

Python 机器学习实战 终于出版

更新:京东购买本书的链接: https://item.jd.com/12289823.html


经过了半年的折腾,书终于出版了,因为春节缘故影响物流,京东等要购买的话需要到3月初。

自己再看写的内容,实在有点惭愧,感觉很多问题没有说清楚,有些可以写得更好。整个目录结构也不尽合理。有机会出第二版再修订吧。

总的来说,还算不容易,完成了一个小小的梦想。