数据分析---3-2 pandas数据可视化具体案例

目录

 

 

例1、星巴克店铺统计

1、如果我想知道美国的星巴克数量和中国的哪个多?

2、 中国每个省份星巴克的数量的情况

3、国内星巴克数量排名前25的城市

此处注意一个区别!!!

4、使用matplotlib呈现出店铺总数排名前10的国家

例2:911紧急电话统计

1、请统计出出这些数据中不同类型的紧急情况的次数

2、统计出不同月份不同类型紧急电话的次数的变化情况

3、统计出不同月份不同类型的电话的次数的变化情况

例3 绘制出5个城市的PM2.5随时间的变化情况

例4 全球排名靠前的10000本书的数据

1、不同年份书的数量

2、不同年份书的平均评分情况


 

例1、星巴克店铺统计

现在我们有一组关于全球星巴克店铺的统计数据:

1、如果我想知道美国的星巴克数量和中国的哪个多?

2、中国每个省份星巴克的数量的情况, 应该怎么办?

3、国内星巴克数量排名前25的城市

4、使用matplotlib呈现出店铺总数排名前10的国家

 

1、如果我想知道美国的星巴克数量和中国的哪个多?

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

file_path = "./starbucks_store_worldwide.csv"

df = pd.read_csv(file_path)

grouped = df.groupby(by="Country")
# print(grouped)

# 数据格式=DataFrameGroupBy==可迭代、每个元素是一个元组
# 每个元组==(索引,索引值) 其中索引值==DataFrame(索引i,i对应数据)
# DataFrameGroupBy对象的方法:count、sum、mean、median(算术中位数)、std(标准差)、var(方差)、max、min
# 返回结果是:不同国家为1维度、2维度是DataFrame(对应国家内所有星巴克店铺)
# 遍历该DataFrameGroupBy对象
for i,j in grouped:
#     print(i)# 国家名称
#     print("-"*100)
#     print(j)#该国所有星巴克店铺

# # 美国星巴克的信息
# print(df[df["Country"]=="US"])
# # 中国星巴克的信息
# print(df[df["Country"]=="CN"])

# 以品牌聚合dataframe并统计星巴克数量
country_count = grouped["Brand"].count()
print("美国有{}家店".format(country_count["US"]))
print("中国有{}家店".format(country_count["CN"]))

2、 中国每个省份星巴克的数量的情况

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

file_path = "./starbucks_store_worldwide.csv"

df = pd.read_csv(file_path)
# 统计中国每个省份店铺的数量,返回1个Series
china_data = df[df["Country"]=="CN"]
# print(china_data)
grouped = china_data.groupby(by = "State/Province").count()["Brand"]
country={"11":"北京",'12':"天津", '13':"河北", '14':"山西", '15':"内蒙古", '21':"辽宁", '22':"吉林", '23':"哈尔滨", '31':"上海", '32':"江苏", '33':"杭州", '34':"安徽",
       '35':"福建", '36':"江西", '37':"山东", '41':"河南", '42':"湖北", '43':"湖南", '44':"广东", '45':"广西", '46':"海南", '50':"重庆", '51':"四川", '52':"贵阳",
       '53':"云南", '61':"陕西", '62':"甘肃", '63':"青海", '64':"宁夏", '91':"香港", '92':"澳门"}
_x = []
for i in grouped.index:
    _x.append(country[i])

_y = grouped.values
print(_x, len(_y))
plt.figure(figsize=(20,8), dpi=80)
plt.bar(range(len(_x)), _y)
plt.xticks(range(len(_x)), _x, rotation=45,fontproperties="SimHei")
plt.xlabel("省份", fontproperties="SimHei")
plt.ylabel("星巴克数量",fontproperties="SimHei")
plt.title("国内各省份星巴克数量统计",fontproperties="SimHei")
plt.show()
plt.savefig("./startbucks.png")

3、国内星巴克数量排名前25的城市


import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

file_path = "./starbucks_store_worldwide.csv"

df = pd.read_csv(file_path)
# 使用matplotlib呈现出中国每个城市的店铺数量

df = pd.read_csv(file_path)
df = df[df["Country"]=="CN"]

# 准备数据
data1 = df.groupby(by="City").count()["Brand"].sort_values(ascending=False)[:25]
# 参数ascending为True时,正向排序;为False时,反向排序
print(data1)

_x = data1.index
_y = data1.values

plt.figure(figsize=(20,12),dpi=80)
# plt.bar(range(len(_x)),_y,width=0.3,color="orange")
# plt.xticks(range(len(_x)),_x, fontproperties="SimHei")
# 发现竖着排列不好看,那就横着吧

plt.barh(range(len(_x)), _y, height=0.3, color="cyan")
plt.yticks(range(len(_x)),_x, fontproperties="SimHei")

plt.show()

此处注意一个区别!!!

# 注意!!!返回Series、DataFrame的区别在于:
# df["Brand"].groupby().count() #Series
# df[["Brand"]].groupby().count() #DataFrame

# 返回Series
grouped = df["Brand"].groupby(by=[df["Country"], df["State/Province"]]).count()
# 对原df的Brand列根据country、State分组后,返回Series对象
df["Country"].groupby(by=[df["Country"],df["State/Province"]]).count()
# 对Country列数据根据country、State分组,返回Serial对象
print(grouped)
print(type(grouped))

# 返回DataFrame
# grouped1 = df[["Brand"]].groupby(by=[df["Country"],df["State/Province"]]).count()
# grouped2= df.groupby(by=[df["Country"],df["State/Province"]])[["Brand"]].count()
# grouped3 = df.groupby(by=[df["Country"],df["State/Province"]]).count()[["Brand"]]
# print(grouped1,type(grouped1))
# print("*"*100)
# print(grouped2,type(grouped2))
# print("*"*100)
# print(grouped3,type(grouped3))

4、使用matplotlib呈现出店铺总数排名前10的国家

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

file_path = "./starbucks_store_worldwide.csv"

df = pd.read_csv(file_path)

# 使用matplotlib呈现出店铺总数排名前10的国家
# 准备数据
data1 = df.groupby(by="Country").count()["Brand"].sort_values(ascending=False)[:10]
print(data1.index)
print(data1.values)
_x=data1.index
_y=data1.values
print(len(_x))
print(len(_y))
# 画图
plt.figure(figsize=(20,8), dpi=80)
plt.bar(range(len(_x)), _y,color="cyan")
plt.xticks(range(len(_x)),_x)
plt.xlabel("国家",fontproperties="SimHei")
plt.ylabel("店铺数量",fontproperties="SimHei")
plt.title("店铺总数排名前10的国家",fontproperties="SimHei")
plt.show()

例2:911紧急电话统计

现在我们有2015到2017年25万条911的紧急电话的数据,

1、统计出这些数据中不同类型的紧急情况的次数

2、统计出不同月份紧急电话的次数的变化情况

3、统计出不同月份不同类型的电话的次数的变化情况

1、请统计出出这些数据中不同类型的紧急情况的次数

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# 1------请统计出出这些数据中不同类型的紧急情况的次数
df = pd.read_csv("./911.csv")
# print(df.head(3))
# 获取表格标签
# 获取分类
# print(df["title"].str.split(": "))

temp_list = df["title"].str.split(": ")
# temp_list--[[]]格式\[0]是报警类型--[1..n]是主要内容--
cate_list = list(set([i[0] for i in temp_list]))
# 遍历取值--set去重--列表化
# print(cate_list)

# 此处需要着重注意!!!
# 构造全0计数数组--行=n起电话--列=m种报警类型--全0矩阵==n*m
zeros_df = pd.DataFrame(np.zeros((df.shape[0], len(cate_list))), columns=cate_list)
# print(zeros_df)

# 赋值
for cate in cate_list:
    zeros_df[cate][df["title"].str.contains(cate)] = 1
# print(zeros_df)

# 逐列求和--该报警类型总共数量
sum_ret = zeros_df.sum(axis=0)
# print(sum_ret)

_x = sum_ret.index
_y = sum_ret.values

plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(_x)), _y,)

# x轴显示不在条形柱中间--手动右移调整显示
plt.xticks([i+0.4 for i in list(range(len(_x)))],_x)
plt.xlabel("报警类型",fontproperties="SimHei")
plt.ylabel("数量统计",fontproperties="SimHei")
plt.title("不同类型的紧急情况的呼叫次数",fontproperties="SimHei")

plt.show()

2、统计出不同月份不同类型紧急电话的次数的变化情况

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt


df = pd.read_csv("./911.csv")

# 统计出不同月份不同类型紧急电话的次数的变化情况,
# 使用DataFrame中的时间采样序列--把时间字符串转化为时间序列
# print(df["timeStamp"])
# Name: timeStamp, dtype: object

df["timeStamp"] = pd.to_datetime(df["timeStamp"])
# print(df["timeStamp"])
# Name: timeStamp, dtype: datetime64[ns]

# 设置时间序列为主索引
df.set_index("timeStamp", inplace=True)

# 统计不同月份电话次数
# 重采样:指的是将时间序列从一个频率转化为另一个频率进行处理的过程,将高频率数据转化为低频率数据为降采样,低频率转化为高频率为升采样
#
# pandas提供了一个resample的方法来帮助我们实现频率转化
# 以月份来统计数量并获取到"title"
count_by_month = df.resample("M").count()["title"]
# print(count_by_month)

# 画图
_x = count_by_month.index
_y = count_by_month.values

# http://www.runoob.com/python/att-time-strftime.html
# time.strftime(format[, t])
# format -- 格式字符串、t -- 可选的参数t是一个struct_time对象。
# %Y 四位数的年份表示(000-9999)%m 月份(01-12)%d 月内中的一天(0-31)
_x = [i.strftime("%Y%m%d") for i in _x]
# print(_x)

plt.figure(figsize=(20,8), dpi=80)
plt.plot(range(len(_x)),_y)
plt.xticks(range(len(_x)),_x,rotation=45)
plt.xlabel("月份",fontproperties="SimHei")
plt.ylabel("呼叫电话次数统计",fontproperties="SimHei")
plt.title("每月紧急电话呼叫次数统计",fontproperties="SimHei")
plt.show()

3、统计出不同月份不同类型的电话的次数的变化情况


import pandas as pd
import numpy as np
from matplotlib import pyplot as plt


df = pd.read_csv("./911.csv")
# 统计出不同月份不同类型的电话的次数的变化情况
# 将时间字符串转为时间类型设置为索引
df["timeStamp"] = pd.to_datetime(df["timeStamp"])

# 获取报警类型,同上2
temp_list = df["title"].str.split(": ").tolist()
cate_list = [i[0] for i in temp_list]
# print(cate_list)
# # cate_list--1*N--转化为N*1
# print(np.array(cate_list).reshape((df.shape[0],1)))
df["cate"] = pd.DataFrame(np.array(cate_list).reshape((df.shape[0],1)))

# 新增1列、标签为cate
# print(df.head(5))

# 设置timeStamp为主索引
df.set_index("timeStamp", inplace=True)
# print(df.head(5))

# 画图
plt.figure(figsize=(20,8), dpi=80)

# 分组绘图
for group_name, group_data in df.groupby(by="cate"):
    # 根据报警类型进行分类
    # 对不同的分类都进行绘图
    count_by_month = group_data.resample("M").count()["title"]
    # print(count_by_month)
    # 画图
    _x = count_by_month.index
    _y = count_by_month.values

    _x = [i.strftime("%Y%m%d") for i in _x]
    plt.plot(range(len(_x)), _y, label=group_name)

plt.xticks(range(len(_x)), _x, rotation=45)
plt.legend(loc="best")

plt.xlabel("月份",fontproperties="SimHei")
plt.ylabel("呼叫电话次数统计",fontproperties="SimHei")
plt.title("紧急电话类型/月呼叫次数统计",fontproperties="SimHei")
plt.show()

例3 绘制出5个城市的PM2.5随时间的变化情况

北上广、深圳、和沈阳5个城市空气质量数据,请绘制出5个城市的PM2.5随时间的变化情况

观察这组数据中的时间结构,并不是字符串, 这个时候我们应该怎么办?

例4 全球排名靠前的10000本书的数据

1、不同年份书的数量

2、不同年份书的平均评分情况

1、不同年份书的数量

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

file_path = "./books.csv"
df = pd.read_csv(file_path)
# 先查看数据有哪些标签
# print(df.head(2))
# print(df.info())

data1 = df[pd.notnull(df["original_publication_year"])]
grouped1 = data1.groupby(by="original_publication_year").count()["title"]
print(grouped1)
# 出版时间为负,可能是公元前出版的

_x = grouped1.index
_y = grouped1.values

plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)), _y)
# 画点时可按原有数据,xticks标点时,必须一一对应
print(len(_x))

# 原有出版时间太过密集,X设置步长
plt.xticks(list(range(len(_x)))[::10],_x[::10].astype(int), rotation = 45)
plt.xlabel("出版时间", fontproperties="SimHei")
plt.ylabel("书本数量",fontproperties="SimHei")
plt.title("不同年份出版书本数量情况统计", fontproperties="SimHei")
plt.show()

2、不同年份书的平均评分情况



import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

file_path = "./books.csv"
df = pd.read_csv(file_path)

# original_publication_year部分书本存在数据缺失--去除nan行
data2= df[pd.notnull(df["original_publication_year"])]
print(len(data2.values))
# 查看是否去除了nan信息

grouped2 = data2["average_rating"].groupby(by=data2["original_publication_year"]).mean()
print(grouped2)

_x = grouped2.index
_y = grouped2.values

plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)), _y)
# 画点时可按原有数据,xticks标点时,必须一一对应
print(len(_x))

# 原有出版时间太过密集,X设置步长
plt.xticks(list(range(len(_x)))[::10],_x[::10].astype(int), rotation = 45)
plt.xlabel("出版时间", fontproperties="SimHei")
plt.ylabel("书本评分",fontproperties="SimHei")
plt.title("不同年份出版书本平均评分的情况", fontproperties="SimHei")
plt.show()

发布了92 篇原创文章 · 获赞 23 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Pit3369/article/details/89070653