编程语言热度十年变迁一览图

发表时间: 2021-02-20 15:49

作者 | 叶庭云 责编 | 张文

前言

TIOBE 排行榜是根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube 统计出排名数据,只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。

TIOBE 开发语言排行榜每月更新一次,依据的指数是基于世界范围内的资深软件工程师和第三方供应商提供,其结果作为当前业内程序开发语言的流行使用程度的有效指标。

该指数可以用来检阅开发者的编程技能能否跟上趋势,或是否有必要作出战略改变,以及什么编程语言是应该及时掌握的。观察认为,该指数反应的虽并非当前最流行或应用最广的语言,但对世界范围内开发语言的走势仍具有重要参考意义。

2020 年,Python 再次获得年度编程语言荣誉。Python 在人工智能和数据科学领域的应用越来越来广泛,且在过去的一年里,Python 在处理疫情数据和舆情数据也发挥了巨大作用。至此,Python 已经第四次获得年度编程语言荣誉。

获取数据

获取 TIOBE 官网里历年编程语言热度数据,目标URL:
https://www.tiobe.com/tiobe-index/

分析网页源代码可以找到我们想要的数据,利用正则表达式提取出数据,并保存到 Excel 中,便于后续数据处理和可视化。

爬虫代码如下:

# -*- coding: UTF-8 -*-"""@Author :叶庭云@公众号 :修炼Python@CSDN :https://yetingyun.blog.csdn.net/"""import requestsimport reimport openpyxlimport logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"}
wb = openpyxl.Workbook # 创建工作簿对象sheet = wb.active # 获取活动的工作表# 编程语言 时间 热度sheet.append(['Programing', 'Date', 'data_per'])
url = 'https://www.tiobe.com/tiobe-index/'rep = requests.get(url, headers=headers).text
# 正则匹配提取数据data = re.findall('{name : (.*?),data : (.*?)}', rep)programing = [eval(k[0]) for k in data] # 编程语言dates = [i[1] for i in data]
# 正则表达式处理 提取出想要的数据for x in range(len(dates)): name = programing[x] datas = re.findall(r'\[Date.UTC(.*?)]', dates[x], re.DOTALL) for m in datas: date1 = re.findall(r'\d+', m) # 正则提取出数字 date2 = '-'.join(date1[:3]) # 拼接得到时间 data_per = '.'.join(date1[-2:]) # 得到热度数据 sheet.append([name, date2, data_per]) logging.info([name, date2, data_per])
wb.save('language_data.xlsx')

结果如下:

成功提取出数据,并保存到Excel,在 jupyter notebook 环境中查看数据:

import pandas as pd
df = pd.read_excel('language_data.xlsx')df.sample(10)
df['Programing'].unique
df.info

数据可视化

利用 pyecharts 绘制时间轮播图数据可视化,展示现在热度排 Top10 的编程语言 2011-2020 年这十年里平均热度变化。

# -*- coding: UTF-8 -*-"""@Author :叶庭云@公众号 :修炼Python@CSDN :https://yetingyun.blog.csdn.net/"""import pandas as pdimport xlrdimport pyecharts.options as optsfrom pyecharts.charts import Timeline, Barfrom pyecharts.globals import CurrentConfig, ThemeType

CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
# 提取现在的Top10编程语言name = list(pd.read_excel('language_data.xlsx')['Programing'].unique)
data = xlrd.open_workbook('language_data.xlsx')table = data.sheets[0]
dic1 = {k: for k in name}# 各编程语言对应每年里不同时间的热度for i in range(1, table.nrows): x = table.row_values(i) dic1[x[0]].append((x[1], x[2]))
# 与编程语言顺序对应 每年编程语言对应的不同时间的热度data_per = {k: [[] for x in range(10)] for k in range(2001, 2022)}print(data_per)
count = 0for k, v in dic1.items: print(k, v) for j in v: # v (时间,热度) 热度数据添加进各年对应的列表里 data_per[int(j[0][:4])][count].append(eval(j[1])) # 一年里各编程语言不同时间时的热度 对应 count += 1
# print(data_per)data_per1 = {k: for k in list(data_per.keys)}
for k, v in list(data_per.items): for x in v: if len(x) == 0: # 这一年里该语言没有热度数据 data_per1[k].append(0) else: avg = sum(x) / len(x) data_per1[k].append(round(avg, 2)) # 这一年里的平均热度
# 得到TOBIE现在排Top10的编程语言从2001年开始每年的平均热度print(data_per1)

def get_year_overlap_chart(year) -> Bar: sum_info = [(m, n) for m, n in zip(name, data_per1[year])] # 编程语言按每年平均热度排序 sum_info.sort(key=lambda z: z[1]) name_ = [m[0] for m in sum_info] datas = [m[1] for m in sum_info] # 每根柱子的颜色列表 colors = ['#00BFFF', '#0000CD', '#000000', '#008000', '#FF1493', '#FFD700', '#FF4500', '#00FA9A', '#191970', '#9932CC'] data_1 = for item in range(10): data_1.append( opts.BarItem( name=name_[item], value=datas[item], itemstyle_opts=opts.ItemStyleOpts(color=colors[item]) # 设置每根柱子的颜色 ) ) # 绘制柱形图 bar = Bar bar.add_xaxis(name_) bar.add_yaxis(series_name='热度', yaxis_data=data_1, is_selected=True, label_opts=opts.LabelOpts(is_show=False)) bar.reversal_axis bar.set_global_opts(title_opts=opts.TitleOpts( title="2011-2020年编程语言热度变化"), tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", axis_pointer_type="shadow"), xaxis_opts=opts.AxisOpts(name='平均热度'), yaxis_opts=opts.AxisOpts(name='编程语言'), ) return bar

# 生成时间轴的图timeline = Timeline(init_opts=opts.InitOpts(theme=ThemeType.MACARONS, width="1200px", height="600px"))for y in range(2011, 2021): timeline.add(get_year_overlap_chart(y), time_point=str(y))
timeline.add_schema(is_auto_play=True, play_interval=1000)timeline.render("language_2011_2020.html")

结果如下:

解决有时候 pyecharts 绘制的图形渲染在网页上无法加载 js 文件的问题

  • 根据网站资源引用说明:pyecharts 使用的所有静态资源文件存放于 pyecharts-assets 项目中

  • 这个文件默认挂载在
    https://assets.pyecharts.org/assets/,因为默认优先从远程引用资源,这就导致有的时候无法加载 js 文件,图表显示不出来。

解决办法:下载所需 js 文件到本地,修改资源引用地址,Github地址:
https://github.com/pyecharts/pyecharts-assets看网站的介绍,pyecharts提供了更改全局 HOST 的快捷方式

from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/' # 本地保存 js 资源的路径