精华内容
下载资源
问答
  • 至此,我们就完全使用python对疫情数据进行了一次动态可视化,回顾整个过程其实并没有太多过于复杂的步骤,更多的是关于pandas和pyecharts基础功能的使用,最后还是要说一句,疫情仍未散去,大家要继续做好防护!...

    看到一共采集到了7584条数据,由于脏数据比较多,所以这一部分的工作量是比较大的,因此我们不在这里使用太多篇幅去讲如何一步一步提取出我们想要的数据,会单独写一篇数据处理过程的文章,不过还是来看看经历了哪些过程与代码吧!这样看起来就舒服多了,但是还是不可以使用,因为API每天会采集很多次数据,所以里面有很多重复数据和异常数据,所以接下来重点处理这一部分。对于重复数据我们只保留最新一个,对于空数据我们选择前一天的数据填充。

     

    其实用python实现并不难,简单来说就分为三步:

    • 获取数据(requests)

    • 数据清洗(pandas)

    • 数据可视化(pyecharts)

    疫情数据获取并不是很难,在目前互联网上已经有许多提供数据的网站,比如丁香园、腾讯新闻、百度新闻等,为了省事直接GitHub上找找看有没有现成的接口,很轻松就找到了丁香园数据的API。

    data = requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')
    data = data.json()

    很明显这样的数据是没有办法去做分析的,所以接下来的重点就是如何清洗这一堆数据,主要又分为下面两块:

    • 数据整理:原始数据整理,由 json格式转换为方便分析的dataframe格式

    • 数据清洗:原数据由于API采集的机制。包含大量重复数据、无效数据、缺失数据所以需要对这些数据进行处理

    先来看下数据量

     

     

    可以看到一共采集到了7584条数据,由于脏数据比较多,所以这一部分的工作量是比较大的,因此我们不在这里使用太多篇幅去讲如何一步一步提取出我们想要的数据,会单独写一篇数据处理过程的文章,不过还是来看看经历了哪些过程与代码吧!

    首先要将所有数据从字典提取出来并对时间戳进行转换,然后将数据保存到pandas里

    data = requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')
    data = data.json()
    res = data['results']
    df = pd.DataFrame(res)
    def time_c(timeNum):
        timeTemp = float(timeNum/1000)
        tupTime = time.localtime(timeTemp)
        stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
        return stadardTime
    
    for i in range(len(df)):
    
        df.iloc[i,16] = time_c(df.iloc[i,16])
    
    for i in range(len(df)):
    
        df.iloc[i,16] = df.iloc[i,16][5:10]

     

    这样看起来就舒服多了,但是还是不可以使用,因为API每天会采集很多次数据,所以里面有很多重复数据和异常数据,所以接下来重点处理这一部分。对于重复数据我们只保留最新一个,对于空数据我们选择前一天的数据填充。

    #去重部分代码
    tem = df1[df1['updateTime'] == '03-02']
    tem = tem.drop_duplicates(['provinceShortName'], keep='last')
    for i in date[1:41]:
        tem1 = df1[df1['updateTime'] == i]
        tem1 = tem1.drop_duplicates(['provinceName'], keep='last')
        tem = tem.append(tem1)
    
    tem = tem.reset_index(drop=True)
    tem

    由于篇幅原因,就不再贴出更多的代码,我们来看下最终处理完的数据

     

     

    数据可视化,我们依旧选择之前讲解过很多次的pyecharts,主要使用的就是里面的Timeline:时间线轮播多图,简单来说就是在每一个时间点生成一张图然后滚动播放,有点像小时候的手绘小人书一样,所以我们的数据就需要是时间序列数据,那么具体关于怎样使用,参数如何调整请关注后续单独的可视化讲解文章,直接看代码与分析吧。首先是国内外疫情趋势

    from pyecharts.faker import Faker
    from pyecharts import options as opts
    from pyecharts.charts import Bar, Page, Pie, Timeline,Grid
    
    
    def timeline_bar() -> Timeline:
        x = ['国内','国外']
        tl = Timeline()
        tl = Timeline()
        tl.add_schema(is_auto_play = True,
        play_interval = 500,
        is_loop_play = False)
        k= 0
        for i in date:
            bar = (
                Line()
                .add_xaxis(date)
                .add_yaxis("国内", hs(c1,k))
                .add_yaxis("国外", hs(c,k))
                .extend_axis(
                yaxis=opts.AxisOpts(
                )
            )
                .set_series_opts(
                areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
                label_opts=opts.LabelOpts(is_show=False),
            )
                .set_global_opts(title_opts=opts.TitleOpts("{}国内外疫情趋势".format(i)))
            )
            tl.add(bar, "{}".format(i))
            k = k + 1
        return tl
    timeline_bar().render_notebook()

    可以看出,国内的增长已经处于平缓状态,而国外自二月底来突然爆发,目前还处于上升期,这也是为什么现在要严防境外输入病例。再来看看国外具体的病例占比吧

    可以看出在最近几天韩国、日本、意大利突然爆发,这三个国家的病例数量就占到了约75%。最后再来看看全球疫情的变化趋势吧!

    至此,我们就完全使用python对疫情数据进行了一次动态可视化,回顾整个过程其实并没有太多过于复杂的步骤,更多的是关于pandas和pyecharts基础功能的使用,最后还是要说一句,疫情仍未散去,大家要继续做好防护!中国加油!

    展开全文
  • Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨周萝卜来源丨萝卜大杂烩关于动态图表,相信大家都或...

    Python实战社群

    Java实战社群

    长按识别下方二维码,按需求添加

    扫码关注添加客服

    进Python社群▲

    扫码关注添加客服

    进Java社群

    作者丨周萝卜

    来源丨萝卜大杂烩

    关于动态图表,相信大家都或多或少的接触过一些,如果是代码水平比较不错的,可以选择 Matplotlib,当然也可以使用 pyecharts 的相关功能,不过这些工具都专注于图表的制作,也就是对于图表的数据,你是需要自行转换的。而今天介绍的这个可视化图库,完美的结合了 Pandas 数据格式,又辅以 Matplotlib 的强大功能,使得我们制作动图变得容易的多了。

    图库简介

    这款给力的可视化图库,就是 pandas_alive,虽然当前在 GitHub 上的 star 数量不是很高,但是相信凭借其强大的功能,崭露头角也是迟早的事情

    项目地址:

    https://github.com/JackMcKew/pandas_alive

    项目安装:
    与一般的 Python 库一样,直接使用 pip 安装即可,这里有一点需要注意,就是由于是通过 Matplotlib 来制作动图,所以需要手动安装下 Matplotlib 的依赖工具 imagemagick,这是一个图片处理工具,感兴趣的同学可以自行查看下

    项目功能:
    这款可视化图库,可以支持的图表类型是非常多的,包括动态条形图、动态曲线图、气泡图、饼状图以及地图等等,这些图表差不多可以满足我们日常的使用了

    制图简介

    这里我们就来简单看一下该如何制作动态图表吧,首先是动态条形图,基本4行代码搞定,有两行还是 import

    import pandas_alive
    import pandas as pd
    
    covid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])
    
    covid_df.diff().fillna(0).plot_animated(filename='line_chart.gif',kind='line',period_label={'x':0.25,'y':0.9})
    

    怎么样,是不是超级方便呢

    下面我们就来看看其他图表的制作方法吧!

    01 动态条形图

    import pandas_alive
    import pandas as pd
    
    covid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])
    
    covid_df.plot_animated(filename='examples/perpendicular-example.gif',perpendicular_bar_func='mean')
    

    02 动态柱状图

    import pandas_alive
    
    import pandas as pd
    
    covid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])
    
    covid_df.plot_animated(filename='examples/example-barv-chart.gif',orientation='v')
    

    03 动态曲线图

    import pandas_alive
    
    import pandas as pd
    
    covid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])
    
    covid_df.diff().fillna(0).plot_animated(filename='examples/example-line-chart.gif',kind='line',period_label={'x':0.25,'y':0.9})
    

    04 动态面积图

    import pandas_alive
    
    import pandas as pd
    
    covid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])
    
    covid_df.sum(axis=1).fillna(0).plot_animated(filename='examples/example-bar-chart.gif',kind='bar',
            period_label={'x':0.1,'y':0.9},
            enable_progress_bar=True, steps_per_period=2, interpolate_period=True, period_length=200
    )
    

    05 动态散点图

    import pandas as pd
    import pandas_alive
    
    max_temp_df = pd.read_csv(
        "data/Newcastle_Australia_Max_Temps.csv",
        parse_dates={"Timestamp": ["Year", "Month", "Day"]},
    )
    min_temp_df = pd.read_csv(
        "data/Newcastle_Australia_Min_Temps.csv",
        parse_dates={"Timestamp": ["Year", "Month", "Day"]},
    )
    
    merged_temp_df = pd.merge_asof(max_temp_df, min_temp_df, on="Timestamp")
    
    merged_temp_df.index = pd.to_datetime(merged_temp_df["Timestamp"].dt.strftime('%Y/%m/%d'))
    
    keep_columns = ["Minimum temperature (Degree C)", "Maximum temperature (Degree C)"]
    
    merged_temp_df[keep_columns].resample("Y").mean().plot_animated(filename='examples/example-scatter-chart.gif',kind="scatter",title='Max & Min Temperature Newcastle, Australia')
    

    06 动态饼图

    import pandas_alive
    
    import pandas as pd
    
    covid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])
    
    covid_df.plot_animated(filename='examples/example-pie-chart.gif',kind="pie",rotatelabels=True,period_label={'x':0,'y':0})
    

    07 动态气泡图

    import pandas_alive
    
    multi_index_df = pd.read_csv("data/multi.csv", header=[0, 1], index_col=0)
    
    multi_index_df.index = pd.to_datetime(multi_index_df.index,dayfirst=True)
    
    map_chart = multi_index_df.plot_animated(
        kind="bubble",
        filename="examples/example-bubble-chart.gif",
        x_data_label="Longitude",
        y_data_label="Latitude",
        size_data_label="Cases",
        color_data_label="Cases",
        vmax=5, steps_per_period=3, interpolate_period=True, period_length=500,
        dpi=100
    )
    

    08 动态地理图表

    import geopandas
    import pandas_alive
    import contextily
    
    gdf = geopandas.read_file('data/nsw-covid19-cases-by-postcode.gpkg')
    gdf.index = gdf.postcode
    gdf = gdf.drop('postcode',axis=1)
    
    map_chart = gdf.plot_animated(filename='examples/example-geo-point-chart.gif',basemap_format={'source':contextily.providers.Stamen.Terrain})
    

    09 行政区域动图

    import geopandas
    import pandas_alive
    import contextily
    
    gdf = geopandas.read_file('data/italy-covid-region.gpkg')
    gdf.index = gdf.region
    gdf = gdf.drop('region',axis=1)
    
    map_chart = gdf.plot_animated(filename='examples/example-geo-polygon-chart.gif',basemap_format={'source':contextily.providers.Stamen.Terrain})
    

    10 多动图组合

    import pandas_alive
    
    import pandas as pd
    
    covid_df = pd.read_csv('covid19.csv', index_col=0, parse_dates=[0])
    
    animated_line_chart = covid_df.diff().fillna(0).plot_animated(kind='line',period_label=False,add_legend=False)
    
    animated_bar_chart = covid_df.plot_animated(n_visible=10)
    
    pandas_alive.animate_multiple_plots('examples/example-bar-and-line-chart.gif',[animated_bar_chart,animated_line_chart],
        enable_progress_bar=True)
    

    11 城市人口变化

    import pandas_alive
    
    urban_df = pandas_alive.load_dataset("urban_pop")
    
    animated_line_chart = (
        urban_df.sum(axis=1)
        .pct_change()
        .fillna(method='bfill')
        .mul(100)
        .plot_animated(kind="line", title="Total % Change in Population",period_label=False,add_legend=False)
    )
    
    animated_bar_chart = urban_df.plot_animated(n_visible=10,title='Top 10 Populous Countries',period_fmt="%Y")
    
    pandas_alive.animate_multiple_plots('examples/example-bar-and-line-urban-chart.gif',[animated_bar_chart,animated_line_chart],
        title='Urban Population 1977 - 2018', adjust_subplot_top=0.85, enable_progress_bar=True)
    

    12 意大利疫情

    import geopandas
    import pandas as pd
    import pandas_alive
    import contextily
    import matplotlib.pyplot as plt
    
    
    region_gdf = geopandas.read_file('data\geo-data\italy-with-regions')
    region_gdf.NOME_REG = region_gdf.NOME_REG.str.lower().str.title()
    region_gdf = region_gdf.replace('Trentino-Alto Adige/Sudtirol','Trentino-Alto Adige')
    region_gdf = region_gdf.replace("Valle D'Aosta/Vallée D'Aoste\r\nValle D'Aosta/Vallée D'Aoste","Valle d'Aosta")
    
    italy_df = pd.read_csv('data\Regional Data - Sheet1.csv',index_col=0,header=1,parse_dates=[0])
    
    italy_df = italy_df[italy_df['Region'] != 'NA']
    
    cases_df = italy_df.iloc[:,:3]
    cases_df['Date'] = cases_df.index
    pivoted = cases_df.pivot(values='New positives',index='Date',columns='Region')
    pivoted.columns = pivoted.columns.astype(str)
    pivoted = pivoted.rename(columns={'nan':'Unknown Region'})
    
    cases_gdf = pivoted.T
    cases_gdf['geometry'] = cases_gdf.index.map(region_gdf.set_index('NOME_REG')['geometry'].to_dict())
    
    cases_gdf = cases_gdf[cases_gdf['geometry'].notna()]
    
    cases_gdf = geopandas.GeoDataFrame(cases_gdf, crs=region_gdf.crs, geometry=cases_gdf.geometry)
    
    gdf = cases_gdf
    
    map_chart = gdf.plot_animated(basemap_format={'source':contextily.providers.Stamen.Terrain},cmap='viridis')
    
    cases_df = pivoted
    
    from datetime import datetime
    
    bar_chart = cases_df.sum(axis=1).plot_animated(
        kind='line',
        label_events={
            'Schools Close':datetime.strptime("4/03/2020", "%d/%m/%Y"),
            'Phase I Lockdown':datetime.strptime("11/03/2020", "%d/%m/%Y"),
            '1M Global Cases':datetime.strptime("02/04/2020", "%d/%m/%Y"),
            '100k Global Deaths':datetime.strptime("10/04/2020", "%d/%m/%Y"),
            'Manufacturing Reopens':datetime.strptime("26/04/2020", "%d/%m/%Y"),
            'Phase II Lockdown':datetime.strptime("4/05/2020", "%d/%m/%Y"),
    
        },
        fill_under_line_color="blue",
        add_legend=False
    )
    
    map_chart.ax.set_title('Cases by Location')
    
    line_chart = (
        cases_df.sum(axis=1)
        .cumsum()
        .fillna(0)
        .plot_animated(kind="line", period_label=False, title="Cumulative Total Cases",add_legend=False)
    )
    
    
    def current_total(values):
        total = values.sum()
        s = f'Total : {int(total)}'
        return {'x': .85, 'y': .1, 's': s, 'ha': 'right', 'size': 11}
    
    race_chart = cases_df.cumsum().plot_animated(
        n_visible=5, title="Cases by Region", period_label=False,period_summary_func=current_total
    )
    
    import time
    
    timestr = time.strftime("%d/%m/%Y")
    
    plots = [bar_chart, race_chart, map_chart, line_chart]
    
    # Otherwise titles overlap and adjust_subplot does nothing
    from matplotlib import rcParams
    from matplotlib.animation import FuncAnimation
    
    rcParams.update({"figure.autolayout": False})
    # make sure figures are `Figure()` instances
    figs = plt.Figure()
    gs = figs.add_gridspec(2, 3, hspace=0.5)
    f3_ax1 = figs.add_subplot(gs[0, :])
    f3_ax1.set_title(bar_chart.title)
    bar_chart.ax = f3_ax1
    
    f3_ax2 = figs.add_subplot(gs[1, 0])
    f3_ax2.set_title(race_chart.title)
    race_chart.ax = f3_ax2
    
    f3_ax3 = figs.add_subplot(gs[1, 1])
    f3_ax3.set_title(map_chart.title)
    map_chart.ax = f3_ax3
    
    f3_ax4 = figs.add_subplot(gs[1, 2])
    f3_ax4.set_title(line_chart.title)
    line_chart.ax = f3_ax4
    
    axes = [f3_ax1, f3_ax2, f3_ax3, f3_ax4]
    timestr = cases_df.index.max().strftime("%d/%m/%Y")
    figs.suptitle(f"Italy COVID-19 Confirmed Cases up to {timestr}")
    
    pandas_alive.animate_multiple_plots(
        'examples/italy-covid.gif',
        plots,
        figs,
        enable_progress_bar=True
    )
    

    怎么样,是不是心动了,那就快行动吧!

    原创不易,给个“在看”再走吧!

    程序员专栏 扫码关注填加客服 长按识别下方二维码进群
    
    

    近期精彩内容推荐:  

     10年巨变,我女神成了我老婆...

     一个程序员的水平能差到什么程度?

     在一个公司死磕5-10年的程序员都怎么样了?

     史上最污技术解读,我竟然秒懂了


    在看点这里好文分享给更多人↓↓

    展开全文
  • 作者 |刘早起早起责编 | 屠敏前言最近国内疫情已经有所好转,但是国外的情况不容乐观,那么怎样用Python制作动态图表来看全球疫情变化趋势呢?比如...

    作者 | 刘早起早起

    责编 | 屠敏


    前言

    最近国内疫情已经有所好转,但是国外的情况不容乐观,那么怎样用Python去制作动态图表来看全球疫情变化趋势呢?比如下面的国内外疫情发展趋势:

    还是全球疫情发展趋势⬇️

    其实用Python实现并不难,简单来说就分为三步:

    • 获取数据(requests)

    • 数据清洗(pandas)

    • 数据可视化(pyecharts)

    那么我们就来一点一点讲解吧!

    数据获取与处理

    疫情数据获取并不是很难,在目前互联网上已经有许多提供数据的网站,比如丁香园、腾讯新闻、百度新闻等,为了省事直接GitHub上找找看有没有现成的接口,很轻松就找到了丁香园数据的API:

    接下来两行命令就能拿下所有历史数据

    data = requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')
    data = data.json()

    来看下数据:

    很明显这样的数据是没有办法去做分析的,所以接下来的重点就是如何清洗这一堆数据,主要又分为下面两块:

    • 数据整理:原始数据整理,由 json格式转换为方便分析的dataframe格式

    • 数据清洗:原数据由于API采集的机制。包含大量重复数据、无效数据、缺失数据所以需要对这些数据进行处理

    先来看下数据量

    可以看到一共采集到了7584条数据,由于脏数据比较多,所以这一部分的工作量是比较大的,因此我们不在这里使用太多篇幅去讲如何一步一步提取出我们想要的数据,会单独写一篇数据处理过程的文章,不过还是来看看经历了哪些过程与代码吧!

    首先要将所有数据从字典提取出来并对时间戳进行转换,然后将数据保存到pandas里

    data = requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')
    data = data.json()
    res = data['results']
    df = pd.DataFrame(res)
    def time_c(timeNum):
        timeTemp = float(timeNum/1000)
        tupTime = time.localtime(timeTemp)
        stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
        return stadardTime
    
    for i in range(len(df)):
    
        df.iloc[i,16] = time_c(df.iloc[i,16])
    
    for i in range(len(df)):
    
        df.iloc[i,16] = df.iloc[i,16][5:10]

    现在数据就成了这样

    这样看起来就舒服多了,但是还是不可以使用,因为API每天会采集很多次数据,所以里面有很多重复数据和异常数据,所以接下来重点处理这一部分。对于重复数据我们只保留最新一个,对于空数据我们选择前一天的数据填充。

    #去重部分代码
    tem = df1[df1['updateTime'] == '03-02']
    tem = tem.drop_duplicates(['provinceShortName'], keep='last')
    for i in date[1:41]:
        tem1 = df1[df1['updateTime'] == i]
        tem1 = tem1.drop_duplicates(['provinceName'], keep='last')
        tem = tem.append(tem1)
    
    tem = tem.reset_index(drop=True)
    tem

    由于篇幅原因,就不再贴出更多的代码,我们来看下最终处理完的数据

    数据可视化

    数据可视化,我们依旧选择之前讲解过很多次的pyecharts,主要使用的就是里面的Timeline:时间线轮播多图,简单来说就是在每一个时间点生成一张图然后滚动播放,有点像小时候的手绘小人书一样,所以我们的数据就需要是时间序列数据,那么具体关于怎样使用,参数如何调整请关注后续单独的可视化讲解文章,直接看代码与分析吧。首先是国内外疫情趋势

    public class MyActivity extends AppCompatActivity from pyecharts.faker import Faker
    from pyecharts import options as opts
    from pyecharts.charts import Bar, Page, Pie, Timeline,Grid
    
    
    def timeline_bar() -> Timeline:
        x = ['国内','国外']
        tl = Timeline()
        tl = Timeline()
        tl.add_schema(is_auto_play = True,
        play_interval = 500,
        is_loop_play = False)
        k= 0
        for i in date:
            bar = (
                Line()
                .add_xaxis(date)
                .add_yaxis("国内", hs(c1,k))
                .add_yaxis("国外", hs(c,k))
                .extend_axis(
                yaxis=opts.AxisOpts(
                )
            )
                .set_series_opts(
                areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
                label_opts=opts.LabelOpts(is_show=False),
            )
                .set_global_opts(title_opts=opts.TitleOpts("{}国内外疫情趋势".format(i)))
            )
            tl.add(bar, "{}".format(i))
            k = k + 1
        return tl
    timeline_bar().render_notebook()

    可以看出,国内的增长已经处于平缓状态,而国外自二月底来突然爆发,目前还处于上升期,这也是为什么现在要严防境外输入病例。再来看看国外具体的病例占比吧(微信GIF只能上传5M所以有点糊):

    可以看出在最近几天韩国、日本、意大利突然爆发,这三个国家的病例数量就占到了约75%。最后再来看看全球疫情的变化趋势吧!

    结束语

    至此,我们就完全使用Python对疫情数据进行了一次动态可视化,回顾整个过程其实并没有太多过于复杂的步骤,更多的是关于pandas和pyecharts基础功能的使用,如果想了解全部的数据清洗过程可以关注早起python后续的技术分享文章,需要直接拿数据去可视化的朋友也可以直接在早起python公众号内获取,最后还是要说一句,疫情仍未散去,大家要继续做好防护!中国加油!

    【End】

    推荐阅读 

    拿着 22 万美元年薪,混得还不如实习生?

    比特币最主流,以太坊大跌,区块链技术“万金油”红利已结束 | 区块链开发者年度报告

    如何用Jupyter Notebook制作新冠病毒疫情追踪器?

    出生小镇、高考不顺、复旦执教、闯荡硅谷,59 岁陆奇为何如此“幸运”?

    DevOps 转型时如何安全融入?对企业产出有何影响?2019年 DevOps 最新现状研究报告解读 | 原力计划

    比特币最主流,以太坊大跌,区块链技术“万金油”红利已结束 | 区块链开发者年度报告

    你点的每一个在看,我认真当成了喜欢

    展开全文
  • 既然有了Python这个制作动态条形图工具,缺的那便是数据了。 先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕。 用什么来衡量手游的热门程度呢,答案便是百度指数。 同样我...

    相信很多人都看到了用python写动态条形图的文章了吧?

    既然有了Python这个制作动态条形图工具,缺的那便是数据了。

    先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕。

    用什么来衡量手游的热门程度呢,答案便是百度指数

    同样我使用的也是百度指数,百度指数是以百度海量网民行为数据为基础的数据分享平台。

    所以本期就来聊一聊可视化视频的数据获取,主要是「百度指数」和「微博指数」。

    本来想加上「微信指数」的,发现电脑的抓包软件出了问题,所以就没有加上。

    01. 百度指数

    获取百度指数,首先需要登陆你的百度账号。

     

    以关键词「王者荣耀」为例,时间自定义为2020-10-01~2020-10-10。

     

    通过开发者工具,我们就能看到曲线图的数据接口。

     

    然而一看请求得到的结果,发现并没有数据,原因是这里使用了JS加密

     

    这可碰到小F的知识盲区了,果断选择去找度娘,各位有兴趣的同学也可自行百度。

     

    最终找到解决方法,成功实现爬取,代码如下~

    import time
    import json
    import execjs
    import datetime
    import requests
    from urllib.parse import urlencode
    
    
    def get_data(keywords, startDate, endDate, area):
        """
        获取加密的参数数据
        """
        # data_url = "http://index.baidu.com/api/SearchApi/index?area=0&word=[[%7B%22name%22:%22%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80%22,%22wordType%22:1%7D]]&startDate=2020-10-01&endDate=2020-10-10"
        params = {
            'word': json.dumps([[{'name': keyword, 'wordType': 1}] for keyword in keywords]),
            'startDate': startDate,
            'endDate': endDate,
            'area': area
        }
        data_url = 'http://index.baidu.com/api/SearchApi/index?' + urlencode(params)
        # print(data_url)
        headers = {
            # 复制登录后的cookie
            "Cookie": '你的cookie',
            "Referer": "http://index.baidu.com/v2/main/index.html",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
        }
    
        # 获取data和uniqid
        res = requests.get(url=data_url, headers=headers).json()
        data = res["data"]["userIndexes"][0]["all"]["data"]
        uniqid = res["data"]["uniqid"]
    
        # 获取js函数中的参数t = "ev-fxk9T8V1lwAL6,51348+.9270-%"
        t_url = "http://index.baidu.com/Interface/ptbk?uniqid={}".format(uniqid)
        rep = requests.get(url=t_url, headers=headers).json()
        t = rep["data"]
        return {"data": data, "t": t}
    
    
    def get_search_index(word, startDate, endDate, area):
        """
        获取最终数据
        """
        word = word
        startDate = startDate
        endDate = endDate
        # 调用get_data获取data和uniqid
        res = get_data(word, startDate, endDate, area)
        e = res["data"]
        t = res["t"]
    
        # 读取js文件
        with open('parsing_data_function.js', encoding='utf-8') as f:
            js = f.read()
    
        # 通过compile命令转成一个js对象
        docjs = execjs.compile(js)
    
        # 调用function方法,得到指数数值
        res = docjs.call('decrypt', t, e)
        # print(res)
        return res
    
    
    def get_date_list(begin_date, end_date):
        """
        获取时间列表
        """
        dates = []
        dt = datetime.datetime.strptime(begin_date, "%Y-%m-%d")
        date = begin_date[:]
        while date <= end_date:
            dates.append(date)
            dt += datetime.timedelta(days=1)
            date = dt.strftime("%Y-%m-%d")
        return dates
    
    
    def get_area():
        areas = {"901": "山东", "902": "贵州", "903": "江西", "904": "重庆", "905": "内蒙古", "906": "湖北", "907": "辽宁", "908": "湖南", "909": "福建", "910": "上海", "911": "北京", "912": "广西", "913": "广东", "914": "四川", "915": "云南", "916": "江苏", "917": "浙江", "918": "青海", "919": "宁夏", "920": "河北", "921": "黑龙江", "922": "吉林", "923": "天津", "924": "陕西", "925": "甘肃", "926": "新疆", "927": "河南", "928": "安徽", "929": "山西", "930": "海南", "931": "台湾", "932": "西藏", "933": "香港", "934": "澳门"}
        for value in areas.keys():
            try:
                word = ['王者荣耀']
                time.sleep(1)
                startDate = '2020-10-01'
                endDate = '2020-10-10'
                area = value
                res = get_search_index(word, startDate, endDate, area)
                result = res.split(',')
                dates = get_date_list(startDate, endDate)
                for num, date in zip(result, dates):
                    print(areas[value], num, date)
                    with open('area.csv', 'a+', encoding='utf-8') as f:
                        f.write(areas[value] + ',' + str(num) + ',' + date + '\n')
            except:
                pass
    
    
    def get_word():
        words = ['诸葛大力', '张伟', '胡一菲', '吕子乔', '陈美嘉', '赵海棠', '咖喱酱', '曾小贤', '秦羽墨']
        for word in words:
            try:
                time.sleep(2)
                startDate = '2020-10-01'
                endDate = '2020-10-10'
                area = 0
                res = get_search_index(word, startDate, endDate, area)
                result = res.split(',')
                dates = get_date_list(startDate, endDate)
                for num, date in zip(result, dates):
                    print(word, num, date)
                    with open('word.csv', 'a+', encoding='utf-8') as f:
                        f.write(word + ',' + str(num) + ',' + date + '\n')
            except:
                pass
    
    
    get_area()

    得到的CSV文件结果如下,有两种形式的数据。

     

    一种是多个关键词每日指数数据,另一种是一个关键词各省市每日指数数据。

    有了数据就可以用Python制作动图啦。

    import pandas as pd
    import bar_chart_race as bcr
    
    # 读取数据
    # df = pd.read_csv('word.csv', encoding='utf-8', header=None, names=['name', 'number', 'day'])
    df = pd.read_csv('area.csv', encoding='utf-8', header=None, names=['name', 'number', 'day'])
    
    # 数据处理,数据透视表
    df_result = pd.pivot_table(df, values='number', index=['day'], columns=['name'], fill_value=0)
    
    # 生成GIF
    # bcr.bar_chart_race(df_result, filename='word.gif', title='爱情公寓5演职人员热度排行')
    bcr.bar_chart_race(df_result, filename='area.gif', title='国内各省市王者荣耀热度排行')

     5行Python代码,来看一下效果如何。

    是成功实现了,就是配色有那么点渣,这个可自行修改颜色配置文件,让你的动图变得好看。

    另外我建立了一个Python学习圈子:1156465813。在彼此的沟通可以我们可以得到很多学习经验,积累知识,群内有2020最新的python学习资料,大家可以一起讨论问题,共同进步。

    展开全文
  • 在读技术博客的过程中,我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法。数据暴增的年...
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。...这篇文章就介绍了 Python 中一种简单的动态图表制作方法。 数据暴增的年代,数
  • 来源:机器之心原文链接:https://towardsdatascience.com/learn-how-to-create-animated-graphs-in-python-fce7...
  • 选自TowardsDataScience作者:Costas Andreou机器之心编译参与:Jamin、张倩在读技术博客的过程中,我们会发现那些能够把知识、成果讲透的博主很多都会做动态图...
  • 效果 教程请访问Python可视化动态图表,基于Python环境,使用jupyter notebook编辑ipynb文件,基于pyecharts生成Sankey的桑基图HTML制作
  • 通常大家做出来的图表,绝大部分都是静态的,有时会显得不够吸引人。今天给大家介绍一下,如何用Python绘制动态图表。主要是使用到Matplotlib+imageio,其中Matplotli...
  • 如何才能在短时间内制作漂亮的可视化地图呢,我觉得Python+可视化工具是不错的选择。 以下动态可视化地图就是J哥亲手绘制,展现了一段时间内广州市企事业单位在网上商城采购商品的分布及随时间的变化。 接下来,将...
  • d3.js制作动态图表

    2018-08-06 17:17:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 其实我们还能让可视化图形逼格更高一些,今天就分享一下如何让可视化秀起来:用Python和matplotlib制作GIF图表。假如电脑上没有安装ImageMagick,先去这里按照自己的电脑系统下载对应版本,大家也可以通过脚本之家...
  • 第一章内容发布在(使用Python制作疫情数据分析可视化图表(一))https://blog.csdn.net/yue__yang/article/details/104538235,请自行食用。 二、时间序列与区域划分 1、数据类型转换为时间序列 在数据中,有一个...
  • 大家可能已经习惯了用Matplotlib和seaborn来制作不同的图表,但是今天要介绍一个非常酷的Python手绘风格的可视化包:cutecharts。 这个包可以用来生成以下几种看起来像手绘的图表,在某些场景下效果可能更好。...
  • python小白,在“一心学”公众号学习了一点疫情数据分析可视化的课程,记录下来,供小白参考。 目录 一、基本数据的查看和初步...第一、二章内容发布在(使用Python制作疫情数据分析可视化图表(一),https://blo...
  • 来源 | 法纳斯特(ID:walker398)刷爆全网的动态条形图,原来5行Python代码就能实现!这是小F在国庆之前写的一篇文章,既然有了Python这个制作动态条形图工具,缺的那便...
  • 关注上方“数据不吹牛”,选择星标, 关键时间,第一时间送达! 转自:法纳瑞斯既然有了Python这个制作动态条形图工具,缺的那便是数据了。先看一下B站2019年「数据可视化」版块的情况...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

python制作动态图表

python 订阅