1. 综述

数据分析

  • 数据分析:用适当的方法对收集来的大量数据进行分析,帮助人们做出判断,以便采取行动。
  • 数据分析的流程:提出问题—准备数据—分析数据—获得结论—成果可视化

jupyter和conda使用

jupyter的使用

  • 终端中输入:Jupyter Netbook可自动打开浏览器。注意保持不关闭终端,关闭终端后会断开本地服务器的链接,则无法进行任何操作。
  • 启动服务器但不打开浏览器:jupyter notebook --no-browser。当你需要启动浏览器页面时,只需要复制链接,并粘贴在浏览器的地址栏中,轻按回车变转到了你的Jupyter Notebook页面。

2.matplotlib

  • matplotlib好处:将数据可视化,更直观的呈现;使数据更加客观、更具说服力。
  • matplotlib:python底层绘图库,主要做数据可视化图表

matplotlib基本要点

  • axis轴:x轴或y轴
  • 绘制折线图:
    from matplotlib import pyplot as plt
    -plt.plot(x,y)
    -plt.show()
  • 设置图形大小:
    fig=plt.figure(figsize=(20,8),dpi=80) #figure即图形图标,通过实例化一个figure并传递参数,能在后台自动使用figure实例。dpi即每英寸点数。
  • 保存图片:
    plt.savefig("./picture.png") #可以保存为svg矢量图格式,放大不会有锯齿
  • 描述信息
    -plt.xticks(x) #设置x轴的刻度
    -plt.yticks(y) #设置y轴的刻度
#设置x轴的刻度
_xticks_labels=[i/2 for i in range(2,49)]
plt.xticks(_xticks_lables)
  • 调整x或y的刻度间距:当刻度太密集或稀疏时使用列表的步长(间隔取值)解决xticks(a,b) 若未定义_xticks_labels或者需改变位置时,可用b去覆盖a;若定义或不需改变则可只传入a。
    _xticks_labels=[i/2 for i in range(2,49)]
    plt.xticks(_xticks_labels[::4])
  • 设置中文显示:matplotlib不支持中文字符。<mac相关操作>
    -通过fc-list查看支持的字体或者fc-list :lang=zh查看支持的中文(冒号前面有空格)
from matplotlib import font_manager
my_front=font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc')

#使用时调用:fontproperties=my_front
  • 添加描述信息
    -设置坐标轴名称:plt.xlabel()或plt.ylabel()
    -设置标题名称:plt.title()
  • 修改线条:plt.plot()里面添加
    -color=“red” 即修改线条颜色 r红色 g绿色 b蓝色 w白色 c青色 m洋红 y黄色 k黑色 <或百度搜索颜色的十六进制>
    -linestyle="–" 即修改线条风格 -实线 --虚线 -.点折线 :点虚线 留空即无线条
    -linewidth=5 即修改线条粗细
    -alpha=0.5 即修改线条透明度
#例子一
from matplotlib import pyplot as plt #导入pyplot
x=range(2,26,2)
y=[15,13,14,17,20,25,26,26,23,22,18,15]

#设置图片的大小
plt.figure(figsize=(20,8),dpi=80)
#绘图
plt.plot(x,y) #传入x和y,通过plot绘制出折线图
#显示图形
plt.show()   #在执行过程的时候展示图形

#例子二
import matplotlib.pyplot as plt
import random

from matplotlib import font_manager
my_front=font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc')

x=range(120)
y=[random.randint(20,35) for i in range(120)]


plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)

_xticks_lables=["10点{}分".format(i) for i in range(60)]
_xticks_lables+=["11点{}分".format(i) for i in range(60)]
plt.xticks(x[::4],_xticks_lables[::4],rotation=45,fontproperties=my_front)
plt.yticks(range(min(y),max(y)+1))
plt.xlabel("时间",fontproperties=my_front) #设置x轴名称
plt.ylabel("温度",fontproperties=my_front) #设置y轴名称
plt.title("10点到12点温度变化情况",fontproperties=my_front) #设置标题名称

plt.show()

对比常用统计图

  • 折线图:以折线的上升或下降表示统计数量的增减变化的统计图
    -特点:能显示数据的变化趋势,反映事物的变化情况(变化)
  • 直方图:有一系列高度不等的纵向条纹或线段表示数据分布的情况
    -特点:绘制连续性的数据,展示一组或多组数据的分布状况(统计)
  • 条形图:排列在工作表的行或列中的数据可以绘制在条形图中
    -特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别(统计)
  • 散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式
    -特点:判断变量之间是否存在数量关联的趋势,展示离群点(分布规律)

散点图

  • 技术要点:plt.scatter(x,y)
  • 添加图例,prop指定图例的字体, loc参数可以查看源码
    plt.legend(loc=“upper left”,prop=my_font) #注意此处中文示例与其他的区别
  • 散点图的更多情况:不同条件(维度)之间的内在关联关系、观察数据的离散聚合程度
import matplotlib.pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname='/System/Library/Fonts/PingFang.ttc')

y_3=[11,12,16,11,12,11,12,6,6,7,12,17,18,21,16,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y_10=[26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]


x_3=range(1,32)
x_10=range(51,82)

#调整图形大小
plt.figure(figsize=(20,8),dpi=80)

plt.scatter(x_3,y_3,label="3月份")
plt.scatter(x_10,y_10,label="10月份")

#设置x轴刻度
_x=list(x_3)+list(x_10)
x_tickslable=["3月{}日".format(i) for i in x_3]
x_tickslable+=["10月{}日".format(i) for i in x_10]
plt.xticks(_x[::10],x_tickslable[::10],fontproperties=my_font)

#添加图例,prop指定图例的字体, loc参数可以查看源码
plt.legend(loc="upper left",prop=my_font) 

#添加描述信息
plt.xlabel("月份",fontproperties=my_font)
plt.ylabel("温度",fontproperties=my_font)
plt.title("3月和10月的温度情况",fontproperties=my_font)

plt.show()

条形图

  • 条形图:绘制没有关系
  • 横向plt.bar(),通过width控制宽度
  • 竖向plt.barh(),通过height控制宽度
  • 多个对比时注意偏移以及偏移量!!!

直方图

  • 绘制直方图:
bin_width=3 #设置组距
num_bins=int((max(a)-min(a))/bin_width) #分为多少组
plt.hist(a,num_bins) #传入统计的数据以及组数
plt.hist(a,[min(a)+i*bin_width for i in range(num_bins)]) #传入列表,长度为组数,值为分组依据,当组距离不均匀时使用
plt.hist(a,num_bins,normed=1) #normed:bool是否绘制频率直方图,默认为频数直方图
  • 直方图:只适用于未统计的数据,统计好的数据绘制直方图只能通过条形图。
  • 应用场景:用户的年龄分布状态、一段时间内用户点击次数分布状态、用户活跃时间的分布状态

更多的画图工具

-matplotlib使用流程总结:明确问题、选择图形的呈现方式、准备数据、绘图和图形完善

  • 百度ECharts、plotly<交互>、seaborn
  • matplotlib常见问题总结:
    -应该选择哪种图形呈现数据
    -matplotlib.plot(x,y)
    -matplotlib.bar(x,y)
    -matplotlib.scatter(x,y)
    -matplotlib.hist(data, bins,normed)
    -xticks\yticks的设置
    -label和title,grid的设置
    -绘图的大小和保存图片

numpy

numpy基础

  • numpy:快速、方便、科学计算基础库
  • numpy:科学计算的基础库,重在数值计算,多用于大型、多维数组上执行数值运算

numpy基础!

  • 导入numpy模块:import numpy as np
  • 创建数组(矩阵)
    -创建数组:以下三种形式,注意range与arange
    a=np.array([1,2,3,4,5])
    b=np.array(range(1,6))
    c=np.arange(1,6)
    -数组的类名:type(a) 输出即<class ‘numpy.ndarray’>
    -数组的类型:a.dtype 输出即int64
    numpy中常见的数据类型:int8/16/32/64<有符号8/16/32/64位整型> uint8/16/32/64<无符号8/16/32/64位整型> float16/32/64/128<半精度/单精度/双精度/扩展精度浮点数> complex64/128/256<用两个32/64/128位的浮点数表示的复数> bool存储TureFalse值的布尔类型
  • 数据类型的操作
    -指定创建的数组的数据类型:a=np.array([0,1,0,2],dtype=np.bool)
    -修改数组的数据类型:
    a.astype(“int8”)
    -修改浮点型的小数位数:np.round(b,2)
  • 数组的形状
    -查看数组的形状 a.shape
    -修改数组的形状 a.reshape(3,4) #numpy有返回值,故对本身不改变;若进行原地修改则不会返回值
    -将数组降维到一维
    c=a.reshape(1,12)
    c=a.flatten()
  • 数组组数的计算
    -加法运算/乘法运算:广播机制造成,即加减乘除的值被广播到所有的元素上。
    -广播原则:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长相符或者其中一方的长度为1,即认为他们是广播兼容的。广播会在缺失和长度为1的维度上进行
    -axis:可以理解为方向,对于1维数组只有1轴,对于二维数组有0轴和1轴。
  • numpy读取数据
    -csv:逗号分隔文件。显示<表格状态>
    -np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
    frame:文件、字符串或生成器
    dtype:数据类型
    delimiter:分割字符串,默认空格
    skiprows:跳过前x行,一般跳过表头
    usecols:读取指定的列、索引、元组类型
    unpack:如果Ture则独如属性将分别写入不同数组的变量,False读入数据只写入一个数组变量,默认False
    -常用delimeter、dtype、unpack
  • numpy中转置:转置即在对角线方向交换数据,为了更方便去处理数据
    -t.transpose()、t.T、t.swapaxes(1,0)三种方法
  • numpy索引和切片
#读取数组
a=np.arange(24).reshape(4,6)
#取第二行
print(a[1])
#取连续多行
print(a[1:])
#取不连续的多行
print(a[[0,2,3]])

#取第三列
print(a[:,2])
#取连续的多列
print(a[:,2:])
#取不连续的多列
print(a[:,[0,2]])

#取行和列,取第三行第四列的值
print(a[2,3])
#取多行和多列,取第一行到第三行、第二列到第四列
print(a[0:3,1:3])
#取多个不相邻的点
print(a[[0,2],[2,4]])

#修改数组
a=np.arange(24).reshape(4,6)
#numpy中数值修改
a[0:2,2:3]=0

a[a<10]=10

#numpy中三元运算符
a=np.arange(24).reshape(4,6)
np.where(a<10,0,10)

#numpy中clip裁剪
a=np.arange(24).reshape(4,6)
a.clip(10,18) #将小于10替换成10,将大于18替换成18
  • numpy中的nan和inf
    -nan(NAN,Nan):not a number表示不是一个数字。nan是一个float类型。当读取本地文件为float的时候,就会出现nan或不合适的计算。
    -inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷。比如一个数字除以0,python会直接报错,numpy会出现-inf或inf
    -两个nan之间不相等;np.nan!=np.nan Ture;利用上述特性判断数组中nan的个数np.count_nonzero(t!=t) #count_nonzero统计非零的个数;判断当前值是否为nan,通过np.islan(a);nan和任何值计算结构都是nan
    -通过np.isnan(a)可将nan进行替换
    -通常不能直接将nan替换成0,因为会使平均值发生变化,替换前平均值大于0则均值变小,替换前平均值小于0则均值变大,所以通常讲缺失的数值替换成均值或终止或者直接删除有缺失值的一行。
  • numpy中常用统计函数
    1)求和:t.sum(axis=None)
    -np.sum(a) :计算a的和,若其中包含nan则输出为nan
    -np.sum(a,axis=0):每一行相加的结果,若axis=1则每一列相加的结果
    -a.sum():求和
    2)均值:t.mean(a,axis=None) #受离群点影响较大
    3)中值:np.median(a,axis=None)
    4)最大值:t.max(axis=None)
    5)最小值:t.min(axis=None)
    6)极值:np.ptp(a,axis=None),即最大值和最小值的差
    7)标准差:t.std(axis=None)
  • 小结
    1)如何选择一行或多行数据
    2)如何给选取的行或者列赋值
    3)如何把大于10的值替换成10
    4)np.where的使用
    5)np.clip的使用
    6)如何转置(交换轴)
    7)读取和保存数据为csv
    8)np.nan和np.inf的含义
    9)常用的统计函数
    10)标准差反映出数据的哪些信息
  • 数组的拼接
    np.vstack((t1,t2)) #竖直拼接
    np.hstack((t1,t2)) #水平拼接
  • 数组的行列交换
    t[[1,2],:]=t[[2,1],:] #行交换
    t[:,[1,2]]=t[:,[2,1]] #列交换
  • numpy更多好用的方法:
    -获取最大值和最小值的位置:np.argmax(t,axis=0) np.argmin(t,axis=0)
    -创建全为0的数组:np.zeros((3,4))
    -创建全为1的数组:np.ones((3,4))
    -创建一个对角线为1的正方形数组(方针):np.eye(3)
  • numpy生成随机数:
    -.rand(d0,d1…dn):创建d0-dn维度的均匀分布的随机数数组,浮点数,范围从0到1
    -.randn(d0,d1…dn):创建d0-dn维度的标准正态分布随机数,浮点数,平均数0,标准差1
    -.randint(low,high,(shape)):从给定上下限范围选取随机数整数,范围是low,high,形状是shape
    -.uniform(low,high,(shape)):产生具有均匀分布的数组,low是起始值,high是结束值,形状是shape
    -.normal(loc,scale,(size)):从指定正态分布中随机抽取样本,分布中心是loc,标准差是scale,形状是size
    -.seed(s):随机数种子,s是给定的种子值,因为计算机生成的伪随机数,所以通过设定相同的随机数种子,可以每次生成相同的随机数
  • numpy的注意点copy和view:
    1)a=b,完全不复制,a和b相互影响
    2)a=b[:],试图的操作,一种切片会创建新的对象a,但是a的数据由b保管,他们的数据变化是一致
    3)a=b.copy(),复制,a和b之间互不影响

pandas

  • pandas:除了处理数值(基于numpy)、还能处理其他类型的数据

pandas的常用数据类型:

  • 常见数据类型:
    -Series:一维,带标签数组
    -DataFrame二维,Series容器

Series的相关操作

  • Series创建:
    1)通过可迭代对象创建
    2)通过字典创建
import
#创建series
t1=pd.Series([1,3,2,4,6,5],index=list('abcdef'))
temp_dict={"name":'hzh','age':20,'tel':12345678}
t2=pd.Series(temp_dict) #t2.dtype输出为‘o’即对象
t1.astype(float) #可修改类型
  • Series切片和索引
    -索引:通过传入序号或者index
    -切片:直接传入start end或步长即可
    -若超出索引取值会得到nan
    -通过t.index和t.values可获取索引和值,Series对象本质由两个数组构成,一个数组构成对象的键(index<索引>),一个数组构成对象的值(values)
    -Series的where与ndarry的结果不相同
temp_dict={"name":'hzh','age':20,'tel':12345678}
t2=pd.Series(temp_dict) 
print(t2)

#切片和索引
print(t2["name"])
print(t2[0]) #两者相同

print(t2[:2]) #取连续多行
print(t2[[0,2]])  #取不连续多行
print(t2[["name","tel"]]) #与上面效果相同

#以及布尔取值
for i in t2.index: #t.index:获取索引。下面操作适用于t.values
    print(i)
print(type(t2.index)) #'pandas.core.indexes.base.Index'
print(list(t2.index))
print(len(t2.index))

for i in t2.values: #t.values:获取值
    print(i)
print(type(t2.values)) #numpy.ndarray
print(list(t2.values))
print(len(t2.values))

DataFrame相关操作

  • DataFrame对象既有行索引又有列索引
    t=pd.DataFrame(np.arange(12).reshape((3,4)))
    -行索引即表明不同的行,横向索引即index,0轴,axis=0
    -列索引即表明不同的列,纵向索引即columns,1轴,axis=1
  • DataFrame的基础属性
    -df.shape #行数列数
    -df.dtypes #列数据类型
    -df.ndim #数据维度
    -df.index #行索引
    -df.columns #列索引
    -df.values #对象值,二维ndarray数组
  • DataFrame整体情况查询
    -df.head(3) #显示头部几行,默认5行
    -df.tail(3) #显示末尾几行,默认5行
    -df.info() #相关信息概览:行数、列数、列索引、列非空值个数、列类型、内存占用
    -df.describe() #快速综合统计结果:计数、均值、标准差、最大值、四分位数、最小值
  • DataFrame中排序的方法
    -df=df.sort_values(by=‘score’,ascend=False)#默认升序即Ture
    #print(df.head(5)) #选取排序前5的数据,但不是切片的方法
    -pandas取行或列的注意点:1)方括号写数组表示取行,对行进行操作;2)方括号写字符串表示取列,对列进行操作
    df[:20] #对前20行取值
    df[‘name’] #对名字进行取值,只含一列则变成Series
    df[:20][‘name’]
  • pandas之loc
    -df.loc:通过标签索引行数据 若使用冒号注意与数组的区别,因为冒号在loc中闭合,会选择到冒号后面的数据
    -df.iloc:通过位置获取行数据:冒号不闭合
    -可通过上述操作赋值更改数据
  • pandas的布尔索引
    -df[df[‘count’]>30]
    -df[(df[‘count’]>30)&(df[‘count’]<200)] 不能直接合并在一起,通过&|等进行判断,不同的条件之间用括号链接
    -df[‘info’].str.split("/").tolist()
  • 缺失数据的处理
    -缺失数据分为两部分:0和nan
    -判断数据是否nan:pd.isnull(df),pd.notnnull(df)
    -处理办法:1)删除nan所在的行列dropna(axis=0,how=‘any’,inplace=False),how=‘any’任意出现即删除,how=‘all’即整行或列均是nan删除,inplace即是否原地修改;2)填充数据t.fillna(t.mean()),t.fillna(t.median()),t.fillna(0)
    -处理为0的数据:t[t==0]=np.nan,不是每次为0的数据都需要处理,计算平均值情况nan不参与计算,但是0会参与

数据读取外部数据

  • 数据存在csv中,直接使用pd.read_csv
  • 数据库例如mysql或者mongodb中数据中读取
    -pd.read_sql(sql_Sentence,connection)
    -import pandas as pd
    from pymongo import MongoClient
    client=MongoClient()
    collection=client[“douban”][“tv1”]
    data=list(collection.find())

pandas常用统计方法

  • 评分的平均分:rating_mean=df[“rating”].mean()
  • 导演人数:
    -方法一
    len(set(df[‘director’].tolist())))
    -方法二
    df[‘director’].unique() #即返回不重叠的新列表
  • 演员人数
    temp_list=df[‘director’].str.split(",").tolist()
    nums=set([i for j in temp_list for I in j])
  • 电影时长的最大值最小值
    max_runtime=df[“runtime(minutes)”].max()
    max_runtime_index=df[“runtime(minutes)”].argmax()
    min_runtime=df[“runtime(minutes)”].min()
    min_runtime_index=df[“runtime(minutes)”].argmin()
    runtime_median=df[“runtime(minutes)”].median()

数组合并与分组聚合

数据合并

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
df=pd.read_csv(file_path)
#统计分类的列表
temp_list=df['Genre'].str.split(',').tolist() #[[],[],[]]
genre_list=list(set([i for j in temp_list for i in j]))

#构造全为0的数组
zeros_df=pd.DataFrame(np.zeros(df.shape[0],len(genre_list)),columns=genre_list)

#给每个电影出现分类的位置赋值1
for i in range(df.shape[0]):
	zeros_df.loc[i,temp_list[i]]=1
#统计每个分类的电影的数量和
genre_count=zeros_df.sum(axis=0)
print(genre_count)

#排序
genre_count=genre_count.sort_values()
_x=genre_count.index()
_y=genre_count.values()

#绘图
plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(_x)),_y)
plt.xticks(range(len(_x)),_x)
plt.show()
  • 数组合并之join
    -join:默认情况下把行索引相同的数据合并在一起
#数据合并之join
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.ones((2,4)),index=['A','B'],columns=list('abcd'))
#      a    b    c    d
# A  1.0  1.0  1.0  1.0
# B  1.0  1.0  1.0  1.0
df2=pd.DataFrame(np.zeros((3,3)),index=['A','B','C'],columns=list('xyz'))
#      x    y    z
# A  0.0  0.0  0.0
# B  0.0  0.0  0.0
# C  0.0  0.0  0.0
df2.join(df1) #若不存在则会nan
#     x    y     z   a   b   c   d
# A	0.0	0.0	0.0	1.0	1.0	1.0	1.0
# B	0.0	0.0	0.0	1.0	1.0	1.0	1.0
# C	0.0	0.0	0.0	NaN	NaN	NaN	NaN
df1.join(df2)
#    a   b   c    d    x   y    z
# A	1.0	1.0	1.0	1.0	0.0	0.0	0.0
# B	1.0	1.0	1.0	1.0	0.0	0.0	0.0
  • 数据合并之merge
    -merge:按照指定的列将数据按照一定的方式合并在一起
    -默认的合并方式
    1)inner:交集
    2)merge outer:并集,Nan补全
    3)merge left:左边为准,Nan补全
    4)merge right:右边为准,Nan补全
#数据合并之merge
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.ones((2,4)),index=['A','B'],columns=list('abcd'))
#      a    b    c    d
# A  1.0  1.0  1.0  1.0
# B  1.0  1.0  1.0  1.0

df3=pd.DataFrame(np.zeros((3,3)),columns=list('fax'))
#      f    a    x
# 0  0.0  0.0  0.0
# 1  0.0  0.0  0.0
# 2  0.0  0.0  0.0
df1.merge(df3,on='a') #因为不相同故无法操作,默认情况取并集inner故输出空列表
# Empty DataFrame
# Columns: [a, b, c, d, f, x]
# Index: []
df3.loc[1,'a']=1
df1.merge(df3,on='a')
#      a    b    c    d    f    x
# 0  1.0  1.0  1.0  1.0  0.0  0.0
# 1  1.0  1.0  1.0  1.0  0.0  0.0
df3=pd.DataFrame(np.arange(9).reshape(3,3),columns=list('fax'))
#    f  a  x
# 0  0  1  2
# 1  3  4  5
# 2  6  7  8
df1.merge(df3,on='a')
#      a    b    c    d  f  x
# 0  1.0  1.0  1.0  1.0  0  2
# 1  1.0  1.0  1.0  1.0  0  2

df1.merge(df3,on='a',how='left')
#    a    b    c    d  f  x
# 0  1.0  1.0  1.0  1.0  0  2
# 1  1.0  1.0  1.0  1.0  0  2
df1.merge(df3,on='a',how='right')
#     a    b    c    d  f  x
# 0  1.0  1.0  1.0  1.0  0  2
# 1  1.0  1.0  1.0  1.0  0  2
# 2  4.0  NaN  NaN  NaN  3  5
# 3  7.0  NaN  NaN  NaN  6  8
df1.merge(df3,on='a',how='outer') 
#      a    b    c    d  f  x
# 0  1.0  1.0  1.0  1.0  0  2
# 1  1.0  1.0  1.0  1.0  0  2
# 2  4.0  NaN  NaN  NaN  3  5
# 3  7.0  NaN  NaN  NaN  6  8

数据分组聚合

  • 分组:grouped=df.groupby(by=‘group_name’)
    -grouped是一个DataFrameGroupBy对象,是可迭代的。其中每一个元素是一个元组,元组里面是(索引(分组的值),分组之后的DataFrame)
  • 一些优化方法:
    -count:分组中非na值的数量
    -sum:非na值的和
    -mean:非na值的平均数
    -median:非na值的算术中位数
    -std、var:无偏(分母为n-1)标准差和方差
    -min、max:非na值的最小值、最大值
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
df=pd.read_csv(file_path)

grouped=df.groupby(by='country')
#统计每个国家的数量,比较中国和美国的数量
country_count=rouped['brand'].count()
print(country_count['CN'])
print(country_count['US'])
#统计中国每个省份的数量
china_data=df[df['country']=='CN']
gouped=china_date.groupby(by='state').count()['brand']
print(grouped)

#数据按照多个条件进行分组,返回Series类型
grouped=df['brand'].groupby(by=[df['country'],df['state']]).count()
print(grouped) #输出为Series类型,前面两列是索引,值只有一列
#获取分组后某一部分的数据
df.groupby(by=[df['country'],df['state']])['brand'].count()


#数据按照多个条件进行分组,返回DataFrame类型,即使用嵌套方括号使用
grouped=df[['brand']].groupby(by=[df['country'],df['state']]).count()
grouped=df.groupby(by=[df['country'],df['state']])[['brand']].count()
grouped=df.groupby(by=[df['country'],df['state']]).count()[['brand']]

索引和复合索引

  • 简单的索引操作
    -获取inedx:df.index
    -指定index:df.index=[‘x’,‘y’]
    -重新设置index:df.reindex(list(‘abcdef’)) #注意不是替换索引,而是与当前索引进行对比,若不存在则该行全为nan
    -指定某一列作为index:df.set_index(‘countre’,drop=False) #drop默认Ture即将某一列替换成索引后在DataFrame中消失,若drop=False则保留该列
    -返回index的唯一值:df.set_index(‘countre’).index.unique()
  • DataFrame中索引可重复,可通过unique()
  • 当df.set_index([‘c’,‘o’,‘t’],drop=False)即可设置多个索引MultiIndex
  • 若存在多个索引可通过df.swaplevel()将索引内外层替换,方便从内层取值
  • 注意数据类型,属于Series可直接方括号取值即可,属于DataFrame需要通过loc[标签名]进行取值
#不同类型紧急情况的次数
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
df=pd.read_csv("file_path")

##方法一
#获取分类
temp_list=df['title'].str.split(':').tolist()
cate_list=list(set([i[0] for i in temp_list]))

#构造全为0的数组
zeros_df=pd.DataFrame(np.zeros(df.shape[0],len(temp_list)),columns=cate_list)
#遍历赋值
for cate in cate_list:
	zeros_df[cate][df['title'].str.contains(cate)]=1
#方法二<效率较低>
#for i in range(df.shape[0]):
#	zeros_df.loc[i,temp_list[i][0]]=1
sum_ret=zeros_df.sum(axis=0)
print(sum_ret)

##方法二
temp_list=df['title'].str.split(':').tolist()
cate_list=[i[0] for i in temp_list]
df['cate']=pd.DataFrame(np.array(cate_list).reshape((df.shape[0],1))) #添加新列
df.grouped(by='cate').count()['title']

pandas中时间序列

  • 生成一段时间范围pd.date_range(start=None,end=None,periods=None,freq=‘D’)
    -start和end以及freq配合使用生成start和end范围内以频率freq的一组时间索引
    -start和periods以及freq配合使用生成从start开始的频率为freq的periods个时间索引
    -类型:DateTimeIndex
  • 关于频率的更多缩写
    -D:Day,每日历日
    -B:BusinessDay,每工作日
    -H:Hour,每小时
    -T或min:Minute,每分
    -S:Second,每秒
    -L或ms:Milli,每毫秒(即每千分之一秒)
    -U:Micro,每微秒(即每百万分之一秒)
    -M:MonthEnd,每月最后一个日历日
    -BM:BusinessMonthEnd,每月最后一个工作日
    -MS:MonthBegin,每月第一个日历日
    -BMS:BusinessMonthBegin,每月第一个工作日
  • 在DataFrame中使用时间序列
index=pd.data_range('20170101',periods=10)
df=pd.DataFrame(np.random.rand(10),index=index)
#使用pandas将时间字符串转换为时间序列
df['timestamp']=pd.to_datetime(df['timestamp'],format='')
#format大部分情况下不需要填写,但对于pandas无法格式化的时间字符串,可以使用该参数,比如包含中文
  • pandas重采样
    -重采样:时间序列从一个频率转化为另一个频率进行处理的过程,将高频率数据转化为低频率进行处理的过程,低频率转化为高频率的升采样
    -可采用resample的方法实现频率转化
#练习:北上广深圳沈阳五个城市的空气质量数据,绘制5个城市的PM2.5随时间的变化情况
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
df=pd.read_csv("file_path")

#把分开的时间字符串通过periodindex方法转化为pandas的时间类型
priod=pd.PeriodIndex(year=df['year'],month=df['month'],day=['day'],hour=df['hour'],freq='H')
df['datetime']=period

#把datetime设置为索引
df.set_index('datetime',inplace=Ture)

#进行降采样
df=df.resample('7D').mean()

#处理缺失数据,删除缺失数据
#data=df[PM_US Post].dropna() 
_x=data.index
_x=[i.strftime('%Y%m%d') for i in _x]
_y=data.values

#绘图
plt.figure(figsize=(20,8),dpi=80)
plt.plot(range(len(_x)),_y)
plt.xticks(range(0,len(_x),10),list(_x)[::10],rotation=45)
plt.show()