栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Matplotlib作业绘制

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Matplotlib作业绘制

动态柱状图的形式显示1.19-2.26时间内10个城市确诊病例的变化 
# 一
%matplotlib notebook
# 导入库函数
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib import animation

plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']

df = pd.read_excel('data_ncov_(1.19-2.26).xlsx')

city=['浙江省', '广东', '河南', '湖南', '安徽', '江西', '重庆市', '江苏', '四川省','上海市']
# 时间序列转换
df['date'] = df['date'].astype('str')     # 先将字段转化为字符串
df['date'] = pd.to_datetime(df['date'])   # 再进行时间序列转换
t_d=df['date'].iloc[0:39]

fig,ax=plt.subplots(figsize=(10,6))

colors = ["r", "b", "y", "c", "g", "m", "pink", "purple", "gray", "orange"]

def update(k): 
    t = str(t_d[k])
    t_m =t[0:10]
    data_new = df[df['date'] == t_d[k]]
    citys_data_new = data_new[(data_new['省市']=='浙江省')|(data_new['省市']=='广东')|
                           (data_new['省市']=='河南')|(data_new['省市']=='湖南')|
                           (data_new['省市']=='安徽')|(data_new['省市']=='江西')|
                           (data_new['省市']=='重庆市')|(data_new['省市']=='江苏')|
                           (data_new['省市']=='四川省')|(data_new['省市']=='上海市')]
    ax.cla()
    
    x = ['安徽','广东','河南','湖南','江苏','江西','上海市','四川省','浙江省','重庆市']
    y1 = citys_data_new['确诊']

    ax.set_ylim(0,1500)

    ax.bar(x,y1,width=0.5,color=colors,)

    for x,y in zip(x,y1):
        plt.text(x,y,'%d'% y,ha='center',va = 'bottom')

    ax.set_title(f'10个城市1月19日-2月26日的疫情确诊人数数据:{t_m}')

    return ax
    
def init():
    t = str(t_d[0])
    t_m =t[0:10]

    data_0119 = df[df['date'] == '2020-01-19']
    citys_data = data_0119[(data_0119['省市']=='浙江省')|(data_0119['省市']=='广东')|
                            (data_0119['省市']=='河南')|(data_0119['省市']=='湖南')|
                            (data_0119['省市']=='安徽')|(data_0119['省市']=='江西')|
                            (data_0119['省市']=='重庆市')|(data_0119['省市']=='江苏')|
                            (data_0119['省市']=='四川省')|(data_0119['省市']=='上海市')]
    
    x = ['安徽','广东','河南','湖南','江苏','江西','上海市','四川省','浙江省','重庆市']
    y1 = citys_data['确诊']

    ax.set_ylim(0,1500)

    ax.bar(x,y1,width=0.5,color=colors)

    for x,y in zip(x,y1):
        plt.text(x,y,'%d'% y,ha='center',va = 'bottom')

    ax.set_title(f'10个城市1月19日-2月26日的疫情确诊人数数据:{t_m}')
    return ax


ani = animation.FuncAnimation(fig=fig,func=update,frames=39,init_func=init,interval=500,repeat=True)

 绘制全国地图 
# 读取数据
import pandas as pd
import warnings
import matplotlib.pyplot as plt
import geopandas as gpd
warnings.filterwarnings('ignore')
# 设置不弹出警告
df = pd.read_excel('COVID-19_China_0410.xlsx')
plt.rcParams['font.sans-serif'] = ['Fangsong']
plt.rcParams['axes.unicode_minus'] = False


china_spatial = gpd.GeoDataFrame.from_file('chinadata.json')
# 查看数据基本情况
#china_spatial.info()

# 输出数据 省份	现存确诊
#china_spatial

import matplotlib.pyplot as plt
# 设置图表大小
plt.figure(figsize=(15,10))

# 设置图表标题
plt.title('全国地图')   

# 绘制空间数据
china_spatial.plot(ax=plt.subplot(1,1,1))

# 设置网格线
plt.grid(True)

图片

 2022-04-10 全国确诊病例疫情地图 
# 匹配数据
data_china0410 = pd.merge(china_spatial, df, left_on = 'name', right_on = '省份', how = 'left')

# 缺失值替换为0

data_china0410_new = data_china0410.fillna(0, inplace=False)
data_china0410_new
import mapclassify
# 设置图表大小及标题
plt.figure(figsize=(20,20))
plt.title('2022-04-10 全国确诊病例', fontsize = 20)

# 绘制疫情地图
data_china0410_new.plot(ax=plt.subplot(1,1,1), alpha=1,edgecolor='k', linewidth = 0.5,
                    legend=True, scheme = 'FisherJenks', column='现存确诊', cmap = 'Reds')
# 设置网格线
plt.grid(True,alpha=0.5)

# 添加省市信息
lst = data_china0410_new[['name','centerlng','centerlat','现存确诊']].to_dict(orient = 'record')
print(lst[:5])   # 查看输出结果

for i in lst:
    plt.text(i['centerlng'], i['centerlat'], i['name'] +':' + str(i['现存确诊']))
    

图片

可视化大屏 

电商用户行为数据可视化分析
import pandas as pd
import numpy as np
import pyecharts.options as opts
from pyecharts.charts import Line, Grid, Bar, Pie, Funnel, Page, Tab
# 数据加载
data_df = pd.read_csv('projct_dataset.csv')
# 数据预览
data_df.head()
# 检查重复值
data_df.duplicated().sum()
# 删除重复值
data_df.drop_duplicates(inplace=True)
# 删除无用列
data_df.drop(columns=['user_geohash'], inplace=True)
# 检查缺失值
data_df.isnull().sum()
# 预览清洗后的数据集
data_df.head()
# 添加行为类型描述列
behavior_type_dict = {1: '点击',
                      2: '收藏',
                      3: '加入购物车',
                      4: '支付'}
data_df['behavior_desc'] = data_df['behavior_type'].map(behavior_type_dict)
data_df.head()
# 处理时间列
data_df[['date', 'hour']] = data_df['time'].str.split(' ', expand=True)
data_df.head()
# 更改数据类型
data_df['date'] = pd.to_datetime(data_df['date'])
data_df['hour'] = data_df['hour'].astype('int')

data_df['date'].min()
data_df['date'].max()

# 按时间排序
data_df = data_df.sort_values(by=['date','hour'])
data_df.head(20)
# 保存清洗处理的数据集
data_df.to_csv('cln_proj_dataset.csv', index=False, encoding='utf-8')

子图制作

(1)流量指标
  • PV (Page View):访问量,即页面浏览量或点击量,用户每次刷新即被计算一次。
  • UV (Unique Visitor):独立访客,一台终端为一个访客,是指通过互联网访问、浏览这个网页的自然人。
    • 日PV
    • 日UV
    • 小时PV
    • 小时UV
      # 加载处理的数据集
      data_df = pd.read_csv('cln_proj_dataset.csv')
      data_df['date'] = pd.to_datetime(data_df['date'])
      data_df.head()
      
      # 日流量指标
      # 日 PV
      daily_pv = data_df[data_df['behavior_desc'] == '点击'].groupby('date').count()['user_id'].reset_index().rename(columns = {'user_id': 'pv'})
      daily_pv.head()
      
      # 日 UV
      daily_uv = data_df[data_df['behavior_desc'] == '点击'].groupby('date').nunique()['user_id'].reset_index().rename(columns={'user_id': 'uv'})
      daily_uv.head()
      
      # 可视化日
      daily_pv_line = (
          Line(init_opts=opts.InitOpts(width='600px',height='300px'))
          .add_xaxis(xaxis_data=daily_pv['date'].tolist())
          .add_yaxis(
              series_name='日PV',
              y_axis = daily_pv['pv'].tolist(),
              is_symbol_show=True,
              label_opts=opts.LabelOpts(is_show=False)
          )
          .extend_axis(
              yaxis=opts.AxisOpts(
                  name="日UV",
                  type_= "value",
                  min_=0,
                  max_= 80000
              )
          )
          .set_global_opts(
              title_opts=opts.TitleOpts(title='用户日流量指标'),
              tooltip_opts=opts.TooltipOpts(
                  trigger='axis',
                  axis_pointer_type='line'),
              xaxis_opts=opts.AxisOpts(
                  type_= 'time',
                  name= '日期'
              ),
              yaxis_opts = opts.AxisOpts(
                  type_='value',
                  name='日PV'
              )
          )
      )
      daily_uv_line = (
          Line()
          .add_xaxis(xaxis_data=daily_uv['date'].tolist())
          .add_yaxis(
              series_name="日UV",
              y_axis=daily_uv['uv'].tolist(),
              is_symbol_show=True,
              label_opts=opts.LabelOpts(is_show=False),
              yaxis_index=1
          )
      )
      daily_pv_line.overlap(daily_uv_line)
      daily_pv_line.render_notebook()

      用户流量指标可视化
      # 小时流量指标
      # 小时PV
      hourly_pv = data_df[data_df['behavior_desc'] == '点击'].groupby('hour').count()['user_id'].reset_index().rename(columns={'user_id': 'pv'})
      hourly_pv.head()
      
      # 小时UV
      hourly_uv = data_df[data_df['behavior_desc'] == '点击'].groupby('hour').nunique()['user_id'].reset_index().rename(columns={'user_id': 'uv'})
      hourly_uv.head()
      
      # 可视化小时
      hourly_pv_line = (
          Line(init_opts=opts.InitOpts(width='600px',height='300px'))
          .add_xaxis(xaxis_data=hourly_pv['hour'].tolist())
          .add_yaxis(
              series_name='小时PV',
              y_axis = daily_pv['pv'].tolist(),
              is_symbol_show=True,
              label_opts=opts.LabelOpts(is_show=False)
          )
          .extend_axis(
              yaxis=opts.AxisOpts(
                  name="小时UV",
                  type_= "value",
                  min_=0,
                  max_= 10000
              )
          )
          .set_global_opts(
              title_opts=opts.TitleOpts(title='用户小时流指标'),
              tooltip_opts=opts.TooltipOpts(
                  trigger='axis',
                  axis_pointer_type='line'),
           
              yaxis_opts = opts.AxisOpts(
                  type_='value',
                  name='小时PV'
              )
          )
      )
      hourly_uv_line = (
          Line()
          .add_xaxis(xaxis_data=hourly_uv['hour'].tolist())
          .add_yaxis(
              series_name="小时UV",
              y_axis=hourly_uv['uv'].tolist(),
              is_symbol_show=True,
              label_opts=opts.LabelOpts(is_show=False),
              yaxis_index=1
          )
      )
      hourly_pv_line.overlap(hourly_uv_line)
      hourly_pv_line.render_notebook()

      用户购买次数分布
      # 用户购买次数分布
      user_buy_time = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id').size()
      buy_hist,bins = np.histogram(user_buy_time.values, bins=10, range=[0, 100])
      buy_hist
      
      bins
      
      buy_time_category = [str(int(a)) + '-' + str(int(b)) for a, b in zip(bins[:-1], bins[1:])]
      buy_time_category
      
      buy_hist_bar = (
          Bar(init_opts=opts.InitOpts(width='400px',height='300px'))
          .add_xaxis(buy_time_category)
          .add_yaxis(
              series_name="",
              y_axis=buy_hist.tolist(),
              category_gap=0.2
          )
          .set_global_opts(
              title_opts=opts.TitleOpts(title='用户购买次数分布')
          )
      )
      buy_hist_bar.render_notebook()

      热门商品和类别分析
      # 点击量排名前10的商品种类
      top_item_categories = data_df.groupby('item_category')['user_id'].count().sort_values(ascending=False).head(10)
      top_item_categories.name = 'Count'
      top_item_cat_df = top_item_categories.to_frame().reset_index()
      top_item_cat_df
      
      top_cat_pie = (
          Pie(init_opts=opts.InitOpts(width='500px'))
          .add("",top_item_cat_df.values.tolist())
          .set_global_opts(
              title_opts=opts.TitleOpts(title="Top10 商品类别"),
              legend_opts=opts.LegendOpts(is_show=False)
          )
          .set_series_opts(label_opts=opts.LabelOpts(formatter="{d}%"))
      )
      
      top_cat_pie.render_notebook()
      # 点击量排名前10的商品
      top_items = data_df.groupby('item_id')['user_id'].count().sort_values(ascending=False).head(10)
      top_items.name = 'Count'
      top_item_df = top_items.to_frame().reset_index()
      top_item_df
      
      top_item_pie = (
          Pie(init_opts=opts.InitOpts(width='500px'))
          .add("",top_item_df.values.tolist())
          .set_global_opts(
              title_opts=opts.TitleOpts(title="Top10 商品"),
              legend_opts=opts.LegendOpts(is_show=False)
          )
          .set_series_opts(label_opts=opts.LabelOpts(formatter="{d}%"))
      )
      top_item_pie.render_notebook()

      用户行为漏斗分析
      behavior_count = data_df.groupby('behavior_desc').size()
      behavior_count
      
      pv = behavior_count['点击']
      favor = behavior_count['收藏']
      cart = behavior_count['加入购物车']
      buy = behavior_count['支付']
      
      # 点击转化率计算
      print('点击 —— 收藏转化率:{:.2%}'.format(favor / pv))
      print('点击 —— 购物车转化率:{:.2%}'.format(cart / pv))
      print('点击 —— 支付转化率:{:.2%}'.format(buy / pv))
      
      # 收藏+购物车转化率
      print('收藏 —— 支付转化率:{:.2%}'.format(buy / (favor + cart)))
      
      # 漏斗图
      behavior_category = ['点击','收藏/加入购物车','支付']
      rates = [1*100,(favor + cart)/ pv * 100, buy / pv * 100]
      format_rates = [round(r,2) for r in rates]
      
      funnel = (
          Funnel(init_opts=opts.InitOpts(width='400px'))
          .add(
              series_name='用户行为',
              data_pair=[i for i in zip(behavior_category, format_rates)],
              tooltip_opts=opts.TooltipOpts(
                  trigger='item',
                  formatter='{b}:{c}%',
                  is_show=True
              ),
              label_opts=opts.LabelOpts(
                  is_show=True,
                  position='outside'
              )
          )
          .set_global_opts(
              title_opts=opts.TitleOpts(title='用户行为漏斗分析'),
              legend_opts=opts.LegendOpts(is_show=False)
          )
      )
      
      funnel.render_notebook()

      用户价值分类

    • 用户RFM模型分析:

    • R (Recency) 最近一次消费时间:表示用户最近一次消费距离现在的时间。消费时间越近的客户价值越大。1年前消费过的用户肯定没有1周前消费过的用户价值大。
    • F (Frequency) 消费频率:指用户在统计周期内购买商品的次数,经常购买的用户也就是熟客,价值肯定比偶尔来一次的客户价值大。
    • M (Monetary) 消费金额:指用户在统计周期内消费的总金额,体现了消费者为企业创利的多少,自然是消费越多的用户价值越大。
      # 构造R值
      last_time = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id').max()['date']
      recency = (data_df['date'].max() - last_time).dt.days.copy()
      median_recency = recency.median()
      recency[recency <= median_recency] = 1
      recency[recency > median_recency] = 0
      recency.name = 'R'
      recency.head(20)
      # 构建F值
      frequency = data_df[data_df['behavior_desc'] == '支付'].groupby('user_id')['item_id'].size()
      median_freq = frequency.median()
      frequency[frequency <= median_freq] = 0
      frequency[frequency > median_freq] = 1
      frequency.name = 'F'
      frequency.head(20)
      rfm = pd.merge(recency, frequency, on='user_id', how='inner')
      rfm = rfm[['R','F']].astype('str')
      rfm['RF'] = rfm['R'] + rfm['F']
      rfm.head()
      user_tag_dict = {
          '11': '重要价值客户',
          '10': '重要发展客户',
          '01': '重要保持客户',
          '00': '重要挽留客户'
      }
      rfm['user_tag'] = rfm['RF'].map(user_tag_dict)
      rfm.head()
      # 统计分层客户数量
      user_tag_count = rfm.groupby('user_tag').size()
      user_tag_count
      user_tag_count.index
      # 可视化统计分层客户数量
      user_tag_pie = (
          Pie(init_opts=opts.InitOpts(width='400px'))
          .set_global_opts(
              legend_opts=opts.LegendOpts(is_show=False)
          )
          .add(
              series_name='购买次数占比',
              data_pair=[list(z) for z in zip(user_tag_count.index.tolist(), user_tag_count.values.tolist())],
              radius=['30%', '70%'],
              label_opts=opts.LabelOpts(
                  is_show=True, 
                  position='outside'),
          )
          .set_series_opts(
              tooltip_opts=opts.TooltipOpts(
                  trigger='item', 
                  formatter='{b}: {d}%')
          )
      )
      
      user_tag_pie.render_notebook()
      # 可视化大屏制作
      page_behaviour = (
          Page(layout= Page.DraggablePageLayout)
          .add(daily_pv_line)
          .add(hourly_pv_line)
          .add(buy_hist_bar)
          .add(top_cat_pie)
          .add(top_item_pie)
          .add(funnel)
          .add(user_tag_pie)
      )
      
      page_behaviour.render('page_behaviour.html')
 效果图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982063.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号