python制作分布图

Python021

python制作分布图,第1张

制作分布图类似密度图,在python中利用pandas来提取分布数据是比较方便的。主要用到pandas的cut和groupby等函数。

官方文档链接

主要参数为x和bins。

x为数据源,数组格式的都支持,list,numpy.narray, pandas.Series。

bins可以为int,也可以为序列。

我们定义bins为一个序列,默认为左开右闭的区间:

对言值列按cats做groupby,然后调用get_stats统计函数,再用unstack函数将层次化的行索引“展开”为列。

G2在之前的文章中有介绍,文章 《python结合G2绘制精美图形》 。

一句话绘制出来,但具体的区间段难以区分出来。

bokeh是python的一个优秀的绘图工具包,与pandas结合的比较好。 bokeh文档

作者原文链接: python制作分布图

一般是根据分析目的,将数据进行分组,研究各组别分布规律的一种分析方法。数据分组方式有两种:等距或不等距分组。

分布分析在实际的数据分析实践中应用非常广泛,常见的有用户性别分布,用户年龄分布,用户消费分布等等。

本文将进行如下知识点讲解:

1.数据类型的修改

2.新字段生成方法

3.数据有效性校验

4.性别与年龄分布

分布分析

1.导入相关库包

import pandas as pd

import matplotlib.pyplot as plt

import math

2.数据处理

>>>df = pd.read_csv('UserInfo.csv')

>>>df.info()

RangeIndex: 1000000 entries, 0 to 999999

Data columns (total 4 columns):

UserId 1000000 non-null int64

CardId 1000000 non-null int64

LoginTime 1000000 non-null object

DeviceType 1000000 non-null object

dtypes: int64(2), object(2)

memory usage: 30.5+ MB

由于接下来我们需要做年龄分布分析,但是从源数据info()方法可知,并无年龄字段,需要自己生成。

# 查看年龄区间,进行分区

>>>df['Age'].max(),df['Age'].min()

# (45, 18)

>>>bins = [0,18,25,30,35,40,100]

>>>labels = ['18岁及以下','19岁到25岁','26岁到30岁','31岁到35岁','36岁到40岁','41岁及以上']

>>>df['年龄分层'] = pd.cut(df['Age'],bins, labels = labels)

3.计算年龄

由于数据来源于线下,并未进行数据有效性验证,在进行年龄计算前,先针对数据进行识别,验证。

# 提取出生日期:月和日

>>>df[['month','day']] = df['DateofBirth'].str.split('-',expand=True).loc[:,1:2]

# 提取小月,查看是否有31号

>>>df_small_month = df[df['month'].isin(['02','04','06','09','11'])]

# 无效数据,如图所示

>>>df_small_month[df_small_month['day']=='31']

# 统统删除,均为无效数据

>>>df.drop(df_small_month[df_small_month['day']=='31'].index,inplace=True)

# 同理,校验2月

>>>df_2 = df[df['month']=='02']

# 2月份的校验大家可以做的仔细点儿,先判断是否润年再进行删减

>>>df_2[df_2['day'].isin(['29','30','31'])]

# 统统删除

>>>df.drop(df_2[df_2['day'].isin(['29','30','31'])].index,inplace=True)

# 计算年龄

# 方法一

>>>df['Age'] = df['DateofBirth'].apply(lambda x : math.floor((pd.datetime.now() - pd.to_datetime(x)).days/365))

# 方法二

>>>df['DateofBirth'].apply(lambda x : pd.datetime.now().year - pd.to_datetime(x).year)

4.年龄分布

# 查看年龄区间,进行分区

>>>df['Age'].max(),df['Age'].min()

# (45, 18)

>>>bins = [0,18,25,30,35,40,100]

>>>labels = ['18岁及以下','19岁到25岁','26岁到30岁','31岁到35岁','36岁到40岁','41岁及以上']

>>>df['年龄分层'] = pd.cut(df['Age'],bins, labels = labels)

由于该数据记录的是用户登录信息,所以必定有重复数据。而Python如此强大,一个nunique()方法就可以进行去重统计了。

# 查看是否有重复值

>>>df.duplicated('UserId').sum() #47681

# 数据总条目

>>>df.count() #980954

分组后用count()方法虽然也能够计算分布情况,但是仅限于无重复数据的情况。而Python这么无敌,提供了nunique()方法可用于计算含重复值的情况

问题原因:import scapy后执行脚本调用scapy模块中(默认自动加了.py后缀)优先找了当前目录的man.py,因为两文件不一样(一个是我们引入别人写好的库文件,一个是我们自己创建的文件),所以就报错了。

一、如果一个错误出现后没有被捕获(捕获是什么先不管,现在就理解为出现了一个错误),它就一直被往上抛,最终将被Python解释器捕获。然后就在本该输出结果的地方打印一大串错误信息,然后程序退出。示例代码如下:

二、示例代码执行后结果如下:

三、解读错误信息就可以定位错误:

四、更换python版本3.6.1,pandas版本依然为0.20.2,不过python版本不一样代码略有不同。

1、去Chrome网页链接,下载解压后,将chromedriver.exe 放到Python的安装目录即可。

五、修改mv scapy.py abc.py问题解决。

1、转换cmd命令:chcp 65001,也就是将cmd转化为utf-8。