欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python-100-Days之 数据分析 Day66

程序员文章站 2022-04-02 10:46:58
Day66 数据分析 之数据可视化模拟数据分析真实项目流程明确问题:明确数据分析的真实需求理解数据:数据获取和数据探索数据清洗:一个数据分析项目大部分时间花在了数据清洗上数据分析和可视化:对清洗后的数据进行分析,并且通过可视化展示出结果结论和建议:对结果进行解读,得出有价值的结论并且提出相关建议matplotlib应用–用pygal实现数据可视化之掷骰子die=Die()results=[]for i in range(1000):#掷100次 result=die.roll...

Day66 数据分析 之数据可视化

模拟数据分析真实项目流程
明确问题:明确数据分析的真实需求
理解数据:数据获取和数据探索
数据清洗:一个数据分析项目大部分时间花在了数据清洗上
数据分析和可视化:对清洗后的数据进行分析,并且通过可视化展示出结果
结论和建议:对结果进行解读,得出有价值的结论并且提出相关建议

matplotlib应用

–用pygal实现数据可视化之掷骰子

die=Die()
results=[]
for i in range(1000):#掷100次
    result=die.roll()
    results.append(result)

#print(results)
frequencies=[]   #数在1000次中每个面出现了几次
sides=die.num_sides
for value in range(1,sides+1):
    frequency=results.count(value)
    frequencies.append(frequency)

print(frequencies)

import pygal
graph=pygal.Bar()   #调用条形图
graph.title="Results of rolling one D6 1000 times"
graph.xlabels=['1','2','3','4','5','6']
graph.x_title="Result"
graph.y_title="Frequency of result"
graph.add("D6",frequencies)
graph.render_to_file("die.svg") #创立一个svg文件然后打开

#output:[164, 163, 175, 154, 173, 171]

Python-100-Days之 数据分析 Day66

同时掷两个面数相同的骰子、

from random import randint
class Die():

    def __init__(self,num_sides=6):
        """骰子默认为6面"""
        self.num_sides=num_sides

    def roll(self):
        """"返回一个位于1和骰子面数之间的随机值"""
        return randint(1,self.num_sides)


#掷两个面数相同的骰子
die_1=Die()
die_2=Die()
results=[]
for i in range(1000):#掷100次
    result=die_1.roll()+die_2.roll()
    results.append(result)

#print(results)
frequencies=[]   #数在1000次中每个面出现了几次
sides=die_1.num_sides+die_2.num_sides   #上限应该是2个数相加的所有值中的最大值12
for value in range(2,sides+1):
    frequency=results.count(value)
    frequencies.append(frequency)

print(frequencies)

import pygal
graph=pygal.Bar()   #调用条形图
graph.title="Results of rolling one D6 1000 times"
graph.xlabels=[2,3,4,5,6,7,8,9,10,11,12]   #2个数相加,最少是2,最多是12,X标签要根据结果变动
graph.x_title="Result"
graph.y_title="Frequency of result"
graph.add("2*D6",frequencies)
graph.render_to_file("die_1+die_2.svg") #创立一个svg文件然后打开

Python-100-Days之 数据分析 Day66
同时掷两个面数不同的骰子

–CSV文件格式

import csv
from matplotlib import pyplot as plt
from datetime import datetime

filename="sitka_weather_07-2018_simple.csv"
with open(filename) as f:
    reader=csv.reader(f)
    #reader处理文件中以逗号分隔的第一行数据,并将每项数据都作为一个元素存储在列表中。
    header_row=next(reader)
    #数next(),调用它并将阅读器对象传递给它时,它将返回文件中的下一行
    # print(header_row)

    # for index,column_header in enumerate(header_row):
    #     print(index,column_header)

#提取存储在第2列的日期和第5列的最高气温
    dates,maxtems=[],[]
    for row in reader:
        date=datetime.strptime(row[2],"%Y-%m-%d")
        dates.append(date)

        maxtem=int(row[5])
        # 取出来的字符串列表 转化为数字 方便matplotlib读取
        maxtems.append(maxtem)

    print(maxtems,dates)

figure=plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,maxtems,c='red') #plot接收列表

plt.title("Daily max temperatures in 07-2018 in sitka",fontsize=25)
plt.xlabel('',fontsize=16)
figure.autofmt_xdate()  #绘制斜的日期标签,以免它们彼此重叠。
plt.ylabel("Temperature",fontsize=16)
plt.tick_params(axis="both",which='major',labelsize=16)

plt.show()

Python-100-Days之 数据分析 Day66

更改文件源,使用全年数据
Python-100-Days之 数据分析 Day66
在上图基础上再添加最低气温

import csv
from matplotlib import pyplot as plt
from datetime import datetime

filename="sitka_weather_2018_simple.csv"
"""全年最高温度与最低温度展示"""
with open(filename) as f:
    reader=csv.reader(f)
    #reader处理文件中以逗号分隔的第一行数据,并将每项数据都作为一个元素存储在列表中。
    header_row=next(reader)
    #数next(),调用它并将阅读器对象传递给它时,它将返回文件中的下一行
    #print(header_row)

    for index,column_header in enumerate(header_row):
        print(index,column_header)
    # 提取存储在第2列的日期和第5列的最高气温

    dates,maxtems,mintems=[],[],[]
    for row in reader:
        date=datetime.strptime(row[2],"%Y-%m-%d")
        dates.append(date)

        maxtem=int(row[5])
        # 取出来的字符串列表 转化为数字 方便matplotlib读取
        maxtems.append(maxtem)

        mintem=int(row[6])
        mintems.append(mintem)

    print(maxtems,mintems)



figure = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates,maxtems,c='red') #plot接收列表
plt.plot(dates,mintems,c='blue')  #添加第二条折线,dates重复用
plt.title("Daily temperatures in 2018 in sitka",fontsize=26)
plt.xlabel('',fontsize=10)
figure.autofmt_xdate()  #绘制斜的日期标签,以免它们彼此重叠。
plt.ylabel("Temperature",fontsize=16)
plt.tick_params(axis="both",which='major',labelsize=16)
plt.show()

Python-100-Days之 数据分析 Day66

当csv文件中出现空值时:数据表中有空值时,用try-except-else执行

    for row in reader:
        try:
            date=datetime.strptime(row[2],"%Y-%m-%d")
            maxtem = int(row[5])
            mintem = int(row[6])
        except ValueError:
            print(date,"missing data")
        else:
            dates.append(date)
            # 取出来的字符串列表 转化为数字 方便matplotlib读取
            maxtems.append(maxtem)
            mintems.append(mintem)

输出为:

2018-02-18 00:00:00 missing data

修改X轴,Y轴坐标上下限:plt.axis()
修改X轴上下限:plt.xlim()
修改Y轴上下限:plt.ylim()

–JSON格式

国家–人口–年份组成的json格式文件,通过包里的pygal_maps_world中的国别码——国家 对应关系组成的字典来进行查询

from pygal_maps_world import i18n
#i18n里的COUNTRIES字典包含的键和值分别为两个字母的国别码和国家名。

dict=i18n.COUNTRIES
for country_code in sorted(dict.keys()): #country_code存储键,也就是国别码
    print(country_code,dict[country_code])
import json
from pygal_maps_world import i18n


dict=i18n.COUNTRIES
def get_country_code(country_title):
    """根据指定的国家,返回pygal使用的两个字母的国别码"""
    for code, name in dict.items():
        # 遍历字典键,值
        if name == country_title:
            return code


filename = 'population_data.json'
with open(filename)as f:
    world_maps = json.load(f)
    # 函数json.load()将数据转换为Python能够处理的格式,这里是一个列表。

    for world_map in world_maps:
        """需要每个国家的名字口,国别码与人口数量"""
        if world_map['Year'] == '2010':
            # 需要2010年每个国家的人口数量
            country_name = world_map['Country Name']
            population = int(float(world_map['Value']))
            # print(country_name + ": " + str(population))  # 打印时人口int型要转化为str型

            code=get_country_code(country_name)
            #国别码中简称与国名一一对应,但是json中的世界人口就不一定了,需要检测。
            if code:
                print(country_name+":"+code+":"+str(population))
            else:
                print('Error--'+country_name)

#并非所有人口数量对应的都是国家,有些人口数量
# 对应的是地区(阿拉伯世界)和经济类群(所有收入水平)。其次,有些统计数据使用了不同的
# 完整国家名(如Yemen, Rep.,而不是Yemen)。

制作世界地图

import pygal
wm = pygal.maps.world.World()
wm.title = 'North, Central, and South America'
wm.add('North America', ['ca', 'mx', 'us'])
wm.add('Central America', ['bz', 'cr', 'gt', 'hn', 'ni', 'pa', 'sv'])
wm.add('South America', ['ar', 'bo', 'br', 'cl', 'co', 'ec', 'gf',
 'gy', 'pe', 'py', 'sr', 'uy', 've'])
wm.render_to_file('americas.svg')

绘制世界地

import json 
import pygal 
from world_map_json import get_country_code
from pygal.style import RotateStyle  #颜色样式
# 将数据加载到列表中


filename = 'population_data.json'
with open(filename)as f:
    world_maps = json.load(f)
    # 函数json.load()将数据转换为Python能够处理的格式,这里是一个列表。


# 创建一个国别码:人口的字典
cc_populations = {}
for pop_dict in world_maps: #列表循环
    if pop_dict['Year'] == '2010':
        country=pop_dict['Country Name']
        population=int(float(pop_dict['Value']))
        code=get_country_code(country)
        if code:
            cc_populations[code] = population

#根据人口数量将国家进行分组,以颜色深浅区分
cc_1,cc_2,cc_3={},{},{}
for cc,population in cc_populations.items():
    if population>=1000000000:
        cc_1[cc]=population
    elif population<10000000:
        cc_3[cc]=population
    else:
        cc_2[cc]=population
# print(len(cc_1),len(cc_2),len(cc_3))

wm_style=RotateStyle("#447722")
wm = pygal.maps.world.World(style=wm_style)        #创建世界地图实例
wm.title = 'World Population in 2010, by Country'
wm.add('>1bn', cc_1)   #传递由国别码和人口建成的字典
wm.add('10m-1bn', cc_2)
wm.add('0-10m', cc_3)

wm.render_to_file('world_population.svg')

Python-100-Days之 数据分析 Day66
测试断言类:
assertEqual(a, b) 核实a == b
assertNotEqual(a, b) 核实a != b
assertTrue(x) 核实x为True
assertFalse(x) 核实x为False
assertIn(item, list) 核实item在list中
assertNotIn(item, list) 核实item不在list中

本文地址:https://blog.csdn.net/marpleaaa/article/details/110674572

相关标签: python