通过获取城市天气数据,利用pyecharts进行展示。
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Line, Bar, Grid
from pyecharts.charts import Page
import datetime
now=datetime.datetime.now().strftime('%Y-%m-%d')
df=pd.read_html('http://www.tianqihoubao.com/weather/top/weifang.html',encoding='gbk',header=0)[0] #[0]为选择第1张table,
df=df.iloc[1:,:] #数据从第2行开始,因为表头有两行
df_rename=df.rename(columns={"白天": "白天天气状况","白天.1": "白天风力方向", "白天.2": "白天最高温度",
"夜间": "夜间天气状况", "夜间.1": "夜间风力方向", "夜间.2": "夜间最低温度"})
#print(df_rename)
df_rename['日期']=df_rename['日期'].str[0:10]
df_rename['白天—最高温度']=df_rename['白天最高温度'].str[:-1].astype(int) #新增‘白天—最高温度’列,并删除‘℃’取int类型数据
df_rename['黑夜—最低温度']=df_rename['夜间最低温度'].str[:-1].astype(int) #新增‘黑夜—最低温度’列,并删除‘℃’取int类型数据
#print(df_rename)
data0= df_rename.sort_values(by='日期') #先对数据按日期排序
# 保存到Excel
data0.to_excel(r'weifang_weather' + now + '.xlsx', index=0)
#print(data0) #测试数据情况
cate = data0['日期'].tolist() #用于将二维变为列表,用于pyecharts展示
data1 = data0['白天—最高温度'].tolist()
data2 = data0['黑夜—最低温度'].tolist()
#print(cate) #测试数据情况
#print(data1)
# print(df_rename['黑夜—最低温度'].describe())
#print(df_rename.describe()) #测试数据情况
page=Page() #运用page实现多个图例绘制在一张图
c1 = (
Bar()
.add_xaxis(df_rename.groupby(['白天天气状况'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['白天天气状况'].tolist())
.add_yaxis("天数",df_rename.groupby(['白天天气状况'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['日期'].tolist())
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="白天天气状况"),
#legend_opts=opts.LegendOpts(pos_right='30%',pos_top='55%')
)
#.render(r'.\Weifang_weather1.html')
)
c2 = (
Bar()
.add_xaxis(df_rename.groupby(['夜间天气状况'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['夜间天气状况'].tolist())
.add_yaxis("天数", df_rename.groupby(['夜间天气状况'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['日期'].tolist())
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="夜间天气状况",pos_left="60%"),
#legend_opts=opts.LegendOpts(pos_left='30%',pos_top='55%')
)
#.render(r'.\Weifang_weather2.html')
)
c3 = (
Bar()
.add_xaxis(df_rename.groupby(['白天风力方向'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['白天风力方向'].tolist())
.add_yaxis("天数", df_rename.groupby(['白天风力方向'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['日期'].tolist())
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="白天风力方向",pos_top='25%'),
#legend_opts=opts.LegendOpts(pos_left='30%',pos_bottom='55%')
)
#.render(r'.\Weifang_weather3.html')
)
c4 = (
Bar()
.add_xaxis(df_rename.groupby(['夜间风力方向'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['夜间风力方向'].tolist())
.add_yaxis("天数", df_rename.groupby(['夜间风力方向'])['日期'].count().reset_index().sort_values(by='日期',ascending=True)['日期'].tolist())
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="夜间风力方向",pos_left="60%",pos_top='25%'),
#legend_opts=opts.LegendOpts(pos_left='30%',pos_bottom='55%')
)
#.render(r'.\Weifang_weather4.html')
)
#一页显示多张图:一种方法是page添加图例
page.add(c1,c2,c3,c4)
page.render(r'.\Weifang_weather1234_page.html')
#一页显示多张图:另一种方法是用Grid添加图例
c5 = (
Line(init_opts=opts.InitOpts(width='1000px,height=500px'))
.add_xaxis(cate)
.add_yaxis('白天', data1,is_smooth=True,
# markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]) #可在后面set_series_opts中统一设置
)
.add_yaxis('黑夜', data2,is_smooth=True,
#可以自定义数据标签
#markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(name="自定义标记点", coord=[cate[8], data2[8]], value=data2[2])])
)
# 设置全局配置
.set_global_opts(title_opts=opts.TitleOpts(title="潍坊市气温折线图",
subtitle="取白天最高气温与黑夜最低气温",pos_top='0%'),#title在图表中的位置
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), #加十字提示光标
toolbox_opts = opts.ToolboxOpts(is_show = True), #加工具箱
datazoom_opts=opts.DataZoomOpts(range_start=70,range_end=100), #加水平滚动轴,开始于70%至最后
xaxis_opts=opts.AxisOpts(name='日期'),
yaxis_opts=opts.AxisOpts(name='气温')
)
# 设置系列配置
.set_series_opts(
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值")]),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average", name="平均值")]),
)
#.render(r'.\Weifang_weather5_line' + now + '.html')
#.render_notebook() #使用Jupyter时用该语句
)
grid=(
Grid()
.add(c1, grid_opts=opts.GridOpts(pos_right="60%",pos_bottom='80%'))
.add(c2, grid_opts=opts.GridOpts(pos_left="60%",pos_bottom='80%'))
.add(c3, grid_opts=opts.GridOpts(pos_right="60%",pos_top='30%',pos_bottom='55%'))
.add(c4, grid_opts=opts.GridOpts(pos_left="60%",pos_top='30%',pos_bottom='55%'))
.add(c5, grid_opts=opts.GridOpts(pos_top='65%'))
.render(r'.\Weifang_weather_grid' + now + '.html')
)