数据分析—数据可视化

一、Matplotlib基本要点

1. matplotlib折线图(统计数量的增减变化)

from matplotlib import pyplot as plt # 导入pyplot

X = range(2,26,2) # 数据在x轴的位置,是一个可迭代的对象

Y = [15,13,14.5,17,20,25,26,26,24,22,18,15]
# 数据在y轴的位置,是一个可迭代的对象
# x轴和y轴的数据一起组成了所有要绘制出的坐标。分别是(2,15),(4,13),(6,15),(8,17)等
plt.plot(x,y)    # 传入x和y,通过plot绘制出折线图

plt.show()        #在执行程序的时候展示图形

一个图表内写入两个折线图:

plt.plot(x,y)  # 一行写入两个

WE CAN DO MORE

  1. 设置图片大小(想要一个高清无码大图)
  2. 保存到本地
  3. 描述信息,比如x轴和y轴表示什么,这个图表示什么
  4. 调整x或者y的刻度间距
  5. 线条的样式(比如颜色,透明度等)
  6. 标记出特殊的点(比如告诉别人最高点和最低点在哪里)
  7. 给图片添加一个水印(防伪,防止盗用)

1.1设置图片大小

import matplotlib.pyplot as plt

Fig = plt.figure(figsize=(20,8),dpi=80)
# figure图形图标的意思,这里指我们画的图
# 通过实例化一个figure并且传递参数,能够在后台自动使用该figure实例
# 在图像模糊的时候可以传dpi参数,让图片更清晰
x = range(2,26,2)
y = [15,13,14.5,17,20,25,26,26,24,22,18,15]

plt.plot(x,y)

plt.savefig(./t1.svg’) # 保存图片 可以保存为svg这种矢量图格式,放大不会有锯齿

plt.show()

2.1保存到本地

plt.savefig(./t1.svg’) # 保存图片
# 可以保存为**svg这种矢量图格式**,放大不会有锯齿

3.1添加描述信息

plt.xlabel(‘’)    # x轴的描述信息

Plt.ylabel(‘’)            # y轴的描述信息

Plt.title(‘’)            # 图表的描述信息

plt.legend(prop=my_font,loc=‘位置’)  # 图表中如果有多个折线图,添加标注每个折线图的title(图例)

位置有多个参数(传入字符串或者数字都可):

  1. best:0
  2. upper right:1
  3. upper lef:2
  4. lower left:3
  5. lower right:4
  6. right:5
  7. center left:6
  8. center right:7
  9. lower center:8
  10. upper center:9
  11. center:10

matpoltlib默认不能显示中文,使用中文的办法

from matplotlib import font_manager

my_fount = font_manager.FontProperties(fname=‘C:/Windows/Fonts/simsun.ttc’)

plt.xticks(_xtick_labels[::2],fontproperties=my_font)

4.1调整X或者Y轴上的刻度

_xtick_labels = [i/2 for i in range(4,49)]

plt.xticks(_xtick_labels)  # 设置x轴的刻度
plt.xticks(_xtick_labels[::2])

# 当刻度太密集的时候使用列表的步长(切片)来间隔取值解决,matplotlib会自动对应
plt.yticks(range(min(y),max(y)))

plt.show()

5.1线条的样式(比如颜色,透明度等)

# 设置图表中折线图的颜色、线条风格、线条粗细、透明度
plt.plot(x,y,color=‘颜色’,linestyle=‘:或-,linewidth=5,alpha=0.5)

6.1标记出特殊的点(比如告诉别人最高点和最低点在哪里)

plt.grid(alpha=0.4) # 图表内部出现网格,参数alpha=0.4(设置网格透明度) 

2.matplotlib散点图(统计离群点的分布规律)

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

plt.scatter(x,y) # 绘制散点图

plt.show()

matplotlib直方图(统计连续型数据的分布情况)

plt.hist(a,20)

plt.show() # 绘制直方图

一般来说:能够使用plt.hist方法的是那些没有统计过的数据。因为使用不了hist的方法,hist是根据统计前的原数据进行分组的。

matplotlib条形图(统计离散型各数据的数量)

plt.bar(range(len(a)),b) # 绘制条形图

plt.xtickes(range(len(a)),a)

plt.show()

plt.barh() # 绘制条形图

matplotlib常见问题总结

  1. 应选择哪种图形来呈现数据

  2. Matplotlib.plot(x,y)

  3. Matplotlib.bar(x,y)

  4. Matplotlib.scatter(x,y)

  5. Matplotlib.hist(data,bins.normed)

  6. xticks和yticks

  7. label和title.grid的设置

  8. 绘图的大小和保存图片

matplotlib使用的流程总结

  1. 明确问题

  2. 选择图形的呈现方式

  3. 准备数据

  4. 绘图和图形完善


二、Numpy

1.数组的形状

a.shape(x,y) # 查看数组的形状,x为行数y为列数

a.reshape(x,y) # 设置成二维数组的形状,x为行数y为列数

a.reshape(a,b,c) # 设置成三维数组的形状,a为有几块b为行数c为列数

a.flatten() # 将二维数组展开成一维数组

2. 数组的计算

两个数组相加:对应位置上的数据相加

两个数组相减:对应位置上的数据相减

两个数组相乘:对应位置上的数据相乘

两个数组相除:对应位置上的数据相除

广播原则

如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失或长度为1的维度上进行

行上数据数量是一样的就可以进行计算!!!

3. 为什么要学习numpy

  1. 快速
  2. 方便
  3. 科学计算的基础库

4. 什么是numpy

一个在python中做科学计算的基础库,重在数值计算,也是大部分python科学计算库的基础库,多用于在大型、多维数组上执行数值运算

5. numpy创建数组(矩阵)

import numpy as np # 创建数组

A = np.array([1,2,3,4,5])
B = np.array(range(1,6))
C = np.arange(1,6)
# 上面a,b,c内容相同,注意arange和range的区别

arange([start,stop[,step,]],dtype=None) # np.arange用法

6. numpy中常见的更多数据类型

类型 类型代码 说明
int8、unit8 i1、u1 有符号和无符号的8位(1个字节)整型
int16、unit16 i2、u2 有符号和无符号的16位(2个字节)整型
int32、unit32 i4、u4 有符号和无符号的32位(4个字节)整型
int64、unit64 i8、u8 有符号和无符号的64位(8个字节)整型
float16 f2 半精度浮点数
float32 f4或f 标准的单精度浮点数。与C的float兼容
float64 f8或d 标准的双精度浮点数。与C的double和python的float对象兼容
float128 f16或g 扩展精度浮点数
complex64、complex128、complex256 c8、c16、c32 分别用两个32位、64位或128位浮点数表示的复数
bool 存储True和False值的布尔类型
np.array([],dtype=类型代码) # 创建数组的数据类型

a.astype(类型代码) # 修改数组的数据类型

np.round(b,2) # 修改浮点型的小数位数

7. 轴(axis)

在numpy中可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2,3)),有0,1,2轴

8. numpy读取数据

参数 解释
frame 文件、字符串或产生器,可以使 .gz 或 bz2 压缩文件
dtype 数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认 np.float
delimiter 分隔字符串,默认是任何空格,改为逗号
skiprows 跳过前x行,一般跳过第一行表头
usecols 读取指定的列、索引,元组类型
unpacks 如果True,读入属性将分别写入不同数组变量,False读入数据只写入一个数组变量,默认False

delimiter:指定边界符号是什么,不指定会导致每行数据为一个整体的字符串而报错

dtype:默认情况下对于较大的数据会将其变为科学计数的方式

unpack:默认是False(0),默认情况下,有多少数据,就会有多少行。为True(1)的情况下,每一列的数据会组成一行,原始数据有多少列,加载出来的数据就会有多少行,相当于转置的效果。

转置→是一种变换,对于numpy中的数组来说,就是在对角线的方向交换数据

numpy中的转置

xxx.transpose()
xxx.T
xxx.swapaxes(1,0)
# 以上都是转置 转置:简单来说就是行和列进行变换

9. numpy索引和切片

取行:

t1 = np.array([])

t1[2] # 取索引为2的一行

t1[2] # 取索引为2开始的连续的多行

t1[2[2,8,10]] # 取索引为2开始的不连续的多行

取列:

t1 = np.array([])

t1[:,0] # 取索引为0的一列

t1[:,2:] # 取索引为0开始的连续的多列

t1[:,[0,2]] # 取索引为0和2的行

取行和列:

t1 = np.array([])

t1[2,3] # 取索引为2的行第3列的数

取多行和多列:

t1 = np.array([])

t1[2:5,1,4] # 取第3行到第5行,2行到4列

取多个不相邻的数:

t1 = np.array([])

t1[[0,2,2],[0,1,3]] # 取第1行第1个数、第3行第2个数、第3行第4个数

10. numpy中三元运算符

t1 = np.array([])

np.where(t<=3,100,300) # 数组中小于3替换成100,大于3替换300

np.clip(10,18) # 数组中小于10替换成10,大于18替换18

11. numpy中的数据拼接

t1 = np.array([])

t2 = np.array([])

np.vstack((t1,t2)) # 竖直拼接(每行拼接一起)

np.hstack((t1,t2)) # 水平拼接(每列拼接一起)

12. numpy中的行列交换

t1 = np.array([])

t[[1,2],:] = t[[2,1],:] # 行交换

t[:,[0,2]] = t[:,[2,0]] # 列交换

13. numpy更多好用的方法

  1. 获取最大值最小值的位置

     np.argmax(t1,axis=0) # 获取最大值位置
    
     np.argmin(t1,axis=1) # 获取最小值位置
  2. 创建一个全为0的数组

     np.zeros((3,4)) # 创建一个全为0的数组
  3. 创建一个全1的数组

     np.ones((3,4)) # 创建一个全1的数组
  4. 创建一个对角线为1的正方形数组(方阵)

     np.eye(3) # 创建一个对角线为1的正方形数组(方阵)

14. 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, (size)) 产生具有均匀分布的数组,low起始值,high结束值,size形状
.normal(loc, scale, (size)) 从指定正态分布中随机抽取样本,分布中心是loc(概率分布的均值),标准差是scale,形状是size
.seed(s) 随机数种子,s是给定的种子值。因为计算机生成的是伪随机数,所以通过设定相同的随机数种子,可以每次生成相同的随机数
t.random.randint(10,20,(4,5)) # 创建4行5列的整数数组,范围从10<=x<20

t.random.seed(10) # 生成随机种子,可以每次生成相同的随机数

15. numpy的注意点copy和view

a=b # 完全不复制,a和b相互影响
a=b[:], # 视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的
a=b.copy(), # 复制,a和b互不影响

16. numpy中的nan和inf

nan(NAN,Nan):not a number表示不是一个数字

什么时候numpy中会出现nan:

当我们读取本地文件为float的时候,如果有缺失,就会出现nan

当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)

inf(-inf,inf):infinity.inf表示正无穷,-inf表示负无穷

什么时候会出现inf包括(-ing,+inf)

比如一个数字除以0(python中会直接报错,num中是一个inf或者-inf)

如何指定一个nan或者inf?注意type类型:

17. numpy中nan的注意点

18.numpy中常用的统计函数

t.sum(axis=None) # 求和

t.mean(a,axis=None) # 均值,受离群点影响较大

np.median(t,axis=None) # 中值

t.max(axis=None) # 最大值

t.min(axis=None) # 最小值

np.ptp(t,axis=None) # 极差,即最大值和最小值之差

t.std(axis=None) # 标准差

默认返回多维数组的全部的统计结果,如果指定axis,则返回一个当前轴上的结果

标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间的差异较大;一个较小的标准差,代表这些数值较接近平均值。反映出数据的波动稳定情况,越大表示波动越大,越不稳定


三、Pandas

1.为什么要学习pandas

numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我们处理其他类型的数据

2.什么是pandas

高性能的,易用的数据结构和数据分析工具

3.pandas的常用数据类型

  1. Series 一维,带标签数组
  2. DataFrame 二维,Series容器

4.pandas之Series创建

import pandas as pd

pd.Series([1,23,2,2,1])  # pd.Series 生成类似enemuate()函数,第一列是索引,第二列是具体数据

import pandas as pd

t2 = pd.Series([1,23,2,2,1],index=list('abcde'))  # 指定索引0,1,2,3,4 变为 a,b,c,d,e

temp_dict = {'name':'xiaohong','age':30,'tel':10086}

t3 = pd.Series(temp_dict)  # 生成左列为键,右列为值的数据

temp_dict = {'name':'xiaohong','age':30,'tel':10086}

t3 = pd.Series(temp_dict)  # 生成左列为键,右列为值的数据

t3.astype('float') #修改数据类型,可防止数据为NaN

5.pandas之切片和索引

t3['age'] # 取索引为age的行
t3[1] # 取第一行
t3[2] # 取第二行
t3[:2] # 取前两行
t3[[1,2]] # 取不连续的两行
t3[['age','tel']] # 取键为age和tel的两行

t = pd.Series([0,1,2,3,4,5,6,7,8,9])

t[t>4] # 取值大于4的行

6.pandas之Series的索引和值

对于一个陌生的series类型,我们可以获取到他的索引和具体的值

Series对象本质上是由两个数组构成。一个数组构成对象的键(index,索引),一个数组构成对象的值(values),键 -> 值

ndarray(numpy形成的数组)的很多方法都可以运用于series类型,比如argmax,clip

series具有where方法,但是结果和ndarray(numpy形成的数组)不同

t3.index # 获取到t3里的所有索引

list(t3.index) # t3内的所有索引转为列表

list(t3.index)[:2] # 取t3内的索引列表中的前两个索引

t3.values # 获取到t3里的所有值

7.pandas之读取外部数据

import pandas as pd

df = pd.read_csv(路径) # pandas读取csv中的文件
pd.read_clipboard() # pandas读取剪贴板内的数据
pd.read_excel() # pandas读取excel内的数据
pd.read_json() # pandas读取json格式的数据
pd.read_sql(sql语句,链接) # pandas读取数据库
print(df)

那么,mongodb呢?

from pymongo import MongoClient
import pandas as pd

client = MongoClient()
collection = client['douban']['tv1']
data = list(collection.find())

t1 = data[0]
t1 = pd.Series(t1)
print(t1)

8.pandas之DataFrame

DataFrame既有行索引,又有列索引

行索引,表名不同行,横向索引,叫index,0轴,axis=0

列索引,表名不同列,纵向索引,叫columns,1轴,axis=1

import pandas as pd

t = pd.DataFrame(np.arange(12).reshape(3,4))
pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('WXYZ')) # 指定行索引为abc 列索引为WXYZ

# DataFrame传入字典数据
d1 = {'name':['xiaoming','xiaogang','age':[20,32],'tell':[10086,10010]]}
t1 = pd.DataFrame(d1)
print(t1)

d2 = [{'name':'xiaohong','age':32,'tell':10010},{'name':'xiaogang','tell':10010}]
t2 = pd.DataFrame(d2)
print(t2)

# 综上所述,DataFrame传入字典数据,数据可以字典里键对应的值为列表。或者列表里有多个字典
from pymongo import MongoClient
import pandas as pd

client = MongoClient()
collection = client['douban']['tv1']
data = collection.find()

#取出数据内不要的数据
data_list = []
for i in data:
    temp = {}
    temp['info'] = i['info']
    temp['rating_count'] = i['rating']['count']
    temp['rating_value'] = i['rating']['value']
    temp['title'] = i['title']
    temp['country'] = i['tv_category']
    temp['directors'] = i['directors']
    temp['actors'] = i['actors']
    data_list.append(temp)

df = pd.DataFrame(data)
print(df)

和一个ndarray一样,我们通过shape,ndim,dtype了解这个ndarray的基本信息,那么对于DataFrame我们有什么方法了解呢?

# 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() # 快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值

import pandas as pd

df = pd.read_csv('./dogNames2.csv')
print(df.head()) # 查看结构
print(df.info()) # 查看描述信息

# DataFrame中排序的方法
df.sort_values(by='Count_AnimalName',ascending=False)
print(df.head(5)) #查看前五行数据

重点:pandas的排序方法!!!!

df.sort_values(by='列索引') # pandas排序方法
df.sorted[:100] # 排序列中前一百行的数据

pandas取行或者取列的注意点

方括号写数组,表示取行,对行进行操作

方括号写字符串,表示的取列索引,对列进行操作

print(df[:20])
print(df['Row_Labels'])

9.pandas之loc和iloc

还有更多的经过pandas优化过的选择方式:

  1. df.loc 通过标签索引获取行数据
  2. df.iloc 通过位置获取行数据
import pandas as pd

t3 = pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('WXYZ'))

# df.loc
t3.loc['a','z']  # 取a行z列的数据
t3.loc['a',:] # 取a行的数据
t3.loc[:,'Y'] # 取Y列的数据
t3.loc[['a','c'],:] # 取a行和c行的数据
t3.loc[:,['W','Z']] # 取W列和C列的数据
t3.loc[['a','b'],['W','Z']] # 取a行和b行中的W列和Z列的数据

# df.iloc
t3.iloc[1,:] # 取第1行的数据
t3.iloc[:,2] # 取第3列的数据
t3.iloc[:,[2,1]] # 取不连续的多列,第2列和第1列的数据
t3.iloc[[0,2],[2,1]] # 取第0行和第2行中的第2列和第1列的数据
t3.iloc[1:,:2] # 取第一行后的每一行和倒数第二列前的每一列的数据

10.pandas之布尔索引

& 符号表示

| 符号表示
注意:使用 &| 时不同的条件需要括号括起来

import pandas as pd

df = pd.read_csv(',/dogNames2.csv')

df[(df['Count_AnimalName']>800)&(df['Count_AnimalName']<1000)] # 选Count_AnimalName列大于800并且小于1000的数据
df[(df['Count_AnimalName']>800)|(df['Count_AnimalName']<1000)] # 选Count_AnimalName列大于800或小于1000的数据

.tolist()方法:将有n行的矩阵或数组转化为只有1行的列表

.unique()方法:将所有数据自动形成一个列表

11.缺失数据的处理

对于NaN的数据,在numpy中我们是如何处理的?

在pandas中我们处理起来非常容易

判断数据是否为NaN:pd.isnull(df),pd.notnull(df)

处理方式1:删除NaN所在的行列dropna(axis=0,how=’any’,inplace=False)

处理方式2:填充数据,t.fillna(t.mean()),t.finallna(t.median()),t.fillna(0)

处理为0的数据:t[t==0] = np.nan

当然并不是每次为0的数据都需要处理

需要0变为NaN的原因是在计算平均值等情况,NaN是不参与计算的,但是0会,可以使数据更完美

处理方式1:

pd.isnull(t3) # 判断是否为NaN True则为NaN

t3[pd.notnull(t3['W'])] # 显示t3内W列中没有null的行

t3.dropna(axis=0) # 删除axis=0轴(x轴)中有NaN的行
t3.dropna(axis=0,how='all') # 删除axis=0轴(x轴)中全部都是NaN的行
t3.dropna(axis=0,how='any') # 删除axis=0轴(x轴)中有NaN的行

t3.dropna(axis=0,how='any',inplace=True) # inplace就地修改,默认为False,设置成True表示生成的数据覆盖原t3,即t3 = t3.dropna(axis=0,how='any',inplace=True)

处理方式2:

# 我们通常会在有NaN的位置填充平均数 要用到t.mean()
t2.fillna(t2.mean()) # 将t2内为NaN的数据填充为t2的平均,t2.mean()

注意:在numpy中如果数据中存在NaN,那么计算均值的时候结果就为NaN。但是在pandas中数据存在NaN,计算均值的时候仍然有结果,自动忽略NaN

11.数据合并之join

join:默认情况下它是把行索引相同的数据合并到一起

df1 = pd.DataFrame(np.ons((2,4)),index=['A','B'],columns=list('abcd'))
df2 = pd.DataFrame(np.ons((3,3)),index=['A','B','C'],columns=list('xyz'))

df1.join(df2) # 如果df2行数大于df1的行数,则df2的行数和df1的行数一样,即去掉df2中多于df1的行
# 如果df2行数小于df1的行数,则df2中多的一行的数据变为NaN
df2.join(df1)

12.数据合并之merge

merge:默认情况下它是把列索引相同的数据合并到一起

df3 = pd.DataFrame(np.zeros((3,3)),columns=list('fax'))
df1.merge(df3,on='a') #df3并到df1,根据列索引a去交集
df1.merge(df3,on='a',how='inner') #df3交到df1,根据列索引a,默认的内连接去交集
df1.merge(df3,on='a',how='outer') #df3并到df1,根据列索引a,外连接去并集
df1.merge(df3,on='a',how='left') #df3交到df1,根据列索引a,左连接去交集
df1.merge(df3,on='a',how='right') #df3交到df1,根据列索引a,右连接去交集

13.分组和聚合

在pandas中类似的分组的操作我们有很简单的方式来完成

df.groupby(by=’columns_name’)

import pandas as pd
import numpy as np

file_path = './starbucks_store.csv'

df = pd.read_csv(file_path)
# print(head(1))
# print(df.info())
grouped = df.groupby(by='Country')
# print(grouped) #输出是一个DataFrameGroupBy对象,可以进行遍历,调用聚合方法

#遍历
# for i,j in grouped:
#     print(i)
#     print(j)

#调用聚合方法
country_count = gouped['Brand'].count()
print(country_count['US'])
print(country_count['CN'])

china_data = df[df['Country'] == 'CN']
grouped = china_data.groupby(by='State/Province').count()['Brand']
print(grouped)

grouped = df.groupby(by=’columns_name’)

grouped是一个DataFrameGroupBy对象,是可迭代的

grouped中的每一个元素是一个元组

元组里面是(索引(分组的值),分组之后的DataFrame)

如果我们需要对国家和省份进行分组统计,应该怎么操作呢?

grouped = df.groupby(by=[df[‘Country’],df[‘State/Province’]])

很多时候我们只希望对获取分组之后的某一部分数据,或者说我们只希望对某几列数据进行分组,这个时候我们应该怎么办呢?

获取分组之后的某一部分数据

df.groupby(by=[‘Country’,’State/Province’])[‘Country’].count()

对某几列数据进行分组

df[‘Country’].groupby(by=[df[‘Country’].df[‘State/Province’]]).count()

14.索引和复合索引

简单的索引操作:

  • 获取index:df.index
  • 指定index:df.index = [‘x’,’y’]
  • 重新设置index:df.reindex(list(‘abcdef’))
  • 指定某一列作为index:df.set_index(‘Country’,drop=False)
  • 返回index的唯一值:df.set_index(‘Country’).index.unique()

15.总结

16.时间序列

不管在什么行业,时间序列都是一种非常重要的数据形式,很多统计数据以及数据的规律也都和时间序列有着非常重要的联系

而且在pandas中处理时间序列是非常简单的

pd.date_range(start=None,end=None,periods=None,freq=’D’)

start和end以及freq配合能够生成start和end范围内以频率freq的一组时间索引

start和periods以及freq配合能够生成从start开始的频率为freq的periods个时间索引

import pandas as pd

pd.date_range(start='20171230',end='20180131',freq='D') # D表示天,每隔一天输出一次
pd.date_range(start='20171230',end='20180131',freq='10D') # 10D表示天,每隔十天输出一次
pd.date_range(start='20171230',periods=10,freq='D') # 输出从2017.12.30开始往后的每一天
pd.date_range(start='20171230',periods=10,freq='M') # 输出从2017.12.30开始往后的每一月最后一天
pd.date_range(start='20171230',periods=10,freq='MS') # 输出从2017.12.30开始往后的每一个月的第一天

17.在DataFrame中使用时间序列

index = pd.date_range(‘20170101’,periods=10)

df = pd.DataFrame(np.random.rand(10),index=index)

回到最开始的数据案例中,我们可以使用pandas提供的方法把时间字符串转化为时间序列

df[‘timeStamp’] = pd.to_datetime(df[‘timeStamp’],format=‘ ‘)

format参数大部分情况下可以不用写,但是对于pandas无法格式化的时间字符串,我们可以使用该参数,比如包含中文

18.pandas重采样

重采样:指的是将时间序列从一个频率转化为另一个频率进行处理的过程,将高频率数据转化为低频率数据为降采样,低频率转化为高频率为升采样

pandas提供了一个resample的方法来帮助我们实现频率转化


  目录