Python数据挖掘(二)之Pandas

一、pandas介绍

  • panel+data+analysis

二、DataFrame

1、结构:既有行索引,又有列索引的二维数组

import numpy as np
import pandas as pd

# 创建一个符合正态分布的10个股票5天的涨幅数据
stock_change = np.random.normal(0,1,(10,5))

# 添加行索引index
stock = ['股票{}'.format(i) for i in range(10)]
# 添加列索引columns
date = pd.date_range(start = '20180101',periods=5,freq='B')
# pd.date_range(start=None,end=None,periods=None,freq='B')用于生成一组连续的时间序列,
# freq:递进单位,默认1天,'B'默认略过周末
data = pd.DataFrame(stock_change,index=stock,columns=date)

在这里插入图片描述

2、属性:shape、index、columns、values、T

data.shape # (10,5)
data.index # Index(['股票0', '股票1', '股票2', '股票3', '股票4', '股票5', '股票6', '股票7', '股票8', '股票9'], dtype='object')
data.columns # DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04','2018-01-05'],dtype='datetime64[ns]', freq='B')
data.values # 值
data.T   # 转置

3、方法:head()、tail()等

data.head()  #默认显示前五行
data.tail()  #默认显示后五行

在这里插入图片描述
4、DataFrame索引的设置

  • 修改行列索引值
# data.index[2] = '股票_2' 不能单独修改索引
stock_ = ['股票_{}'.format(i) for i in range(10)]
data.index = stock_
data.head()

在这里插入图片描述

  • 重设索引
    • reset_index(drop = False)
    • 重新设置新的下标索引
    • drop:默认为False,不删除原来索引,如果为True,则删除原来索引
#重设索引,不删除和删除原来索引
data.reset_index().head()
data.reset_index(drop=True).head()

在这里插入图片描述

在这里插入图片描述

  • 设置新索引
  • 以某列值设置为新的索引
    • set_index(keys,drop=True)
      • keys:列索引名或者列索引名称的列表
      • drop:True当做新的索引,删除原来的列,False则保留
df = pd.DataFrame({'month':[1,4,7,10],
                  'year':[2012,2014,2013,2014],
                  'sale':[55,40,84,31]})

在这里插入图片描述

#以月份设置新的索引
df.set_index('month')
#设置多个索引以年和月份
df_new = df.set_index(['year','month'])

在这里插入图片描述
在这里插入图片描述

df_new.index

在这里插入图片描述
注:通过刚才的设置,这样DateFrame变成了一个具有Multilndex的DataFrame,可以存储三维数据

三、Multilndex与Panel

1、Multilndex

多级或分层索引对象

  • index属性
    • names:levels的名称
    • levels:每个level的元组值
df_new.index.names # FrozenList(['year', 'month'])
df_new.index.levels # FrozenList([[2012, 2013, 2014], [1, 4, 7, 10]])

2、Panel

  • pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None,copy=False,dtype=None)
    • 存储3维数组的Panel结构
p = pd.Panel(np.arange(24).reshape(4,3,2),
             items=list('ABCD'),
             major_axis=pd.date_range('20130101',periods=3),
             minor_axis=['first','second'])
           
结果显示:
<class 'pandas.core.panel.Panel'>
Dimensions: 4 (items) x 3 (major_axis) x 2 (minor_axis)
Items axis: A to D
Major_axis axis: 2013-01-01 00:00:00 to 2013-01-03 00:00:00
Minor_axis axis: first to second

# 从Panel中看DataFrame
p['A']
p.major_xs('2013-01-01')

在这里插入图片描述
在这里插入图片描述
四、Series

  • 结构:带索引的一维数组

1、创建Series

# 指定内容,默认索引
pd.Series(np.arange(3,9,2))
# 指定索引
pd.Series([6.7,5.4,2,4,5],index=[1,2,3,4,5])
# 通过字典数据创建
pd.Series({'red':100,'blue':200,'green':500,'yellow':1000})

2、Series获取索引和值

  • 属性:index、values
sr.index # DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04','2018-01-05'],dtype='datetime64[ns]', freq='B')
sr.values # array([ 1.95877474, -1.05435874, -0.16035102,  0.19338938,  0.64992306])

DataFrame是Series的容器,Panel是DataFrame的容器

五、基本数据操作

import pandas as pd
data = pd.read_csv('stock_day.csv')

#删除一些列,让数据更简单些,再去做后面的操作
data = data.drop(['ma5','ma10','ma20','v_ma5','v_ma10','v_ma20'],axis=1)

在这里插入图片描述

1、索引操作

# 1、直接索引,先列后行
data['open']['2018-02-26']  # 22.8

# 2、按名字索引
data.loc['2018-02-26']['open']   # 22.8
# 或者 data.loc['2018-02-26','open']

# 3、按数字索引
data.iloc[1,0]  # 22.8

# 4、组合索引
# 获取行第一天到第四天,['open','close','high','low']这四个指标的结果
data.ix[:4,['open','close','high','low']]  

data.loc[data.index[0:4],['open','close','high','low']]

data.iloc[:4,data.columns.get_indexer(['open','close','high','low'])]

2、赋值操作

# 获取open列
data['open'] # 或者data.open

#赋值操作
data.open = 100 # open列整列变成100
data.iloc[1,0] = 222

3、排序

  • DataFrame

    • 使用df.sort_values(by= ,ascending= ) 对内容进行排序
      • 单个键或者多个键进行排序,默认升序
      • ascending=False降序\True升序
    • 使用df.sort_index(ascending=) 对索引进行排序
  • Series

    • 使用 sr.sort_values(ascending=) 对内容进行排序
    • 使用 sr.sort_index(ascending=) 对索引进行排序
# 对内容排序
data.sort_values(by='high',ascending=False)
data.sort_values(by=['high','p_change'],ascending=False) # high相同时,看p_change

# 对索引排序
data.sort_index()

六、DataFrame运算

1、算数运算

# 算数运算(运算符和运算函数)
data['open'].add(3)
data['open'].sub(3)
data + 1

close = data['close']
open1 = data['open']
data['m_price_change']=close.sub(open1)
data.head()

在这里插入图片描述
2、逻辑运算

# 逻辑运算符(>,<,|,&)
# 筛选p_change>2的日期数据
data[data['p_change'] > 2]

# 筛选p_change>2并且low>15的日期数据
data[(data['p_change'] > 2) & (data['low'] > 15)]

# 逻辑运算函数(query,isin)
# 筛选p_change>2的日期数据
data.query('p_change > 2')

# 筛选p_change>2并且low>15的日期数据
data.query('p_change > 2 & low > 15')

# 判断'turnover'是否有4.19,2.39
data['turnover'].isin([4.19,2.39])
data[data['turnover'].isin([4.19,2.39])]

在这里插入图片描述
3、统计运算

  • describe()
  • 综合分析:能够得出很多统计结果,count,mena,std,min,max等

在这里插入图片描述

  • 统计函数
  • sum,mean,median,min,max,mode,abs,prod,std,var,idxmax,idxmin
data.max()   #默认按列
data.max(axis=1) # 按行取最大值
  • 累计统计函数
函数作用
cumsum计算前1/2/3/…/n个数的和
cummax计算前1/2/3/…/n个数的最大值
cummin计算前1/2/3/…/n个数的最小值
cumprod计算前1/2/3/…/n个数的积
data['p_change'].sort_index().cumsum(),plot()
# 想画的好看,用matplotlib

在这里插入图片描述
4、自定义运算

  • apply(func,axis=0)
    • func:自定义函数
    • axis=0:默认是列,axis=1为行进行运算
data.apply(lambda x:x.max() - x.min(),axis=0)
结果显示:
open                  22.74
high                  23.68
close                 22.85
low                   21.81
volume            500757.29
price_change           6.55
p_change              20.06
turnover              12.52
m_price_change         6.71
dtype: float6

七、Pandas画图

  • pandas.DataFrame.plot(x=None,y=None,kind=‘line’)
    • kind:‘line’,‘bar’,‘barh’,‘hist’,‘pie’,‘scatter’
data.sort_index().plot(x='p_change',y='turnover',kind='scatter')

在这里插入图片描述

data.sort_index().p_change.plot()

在这里插入图片描述
八、文件读取与存储

  • csv文件的读取与存储
    • pd.read_csv(path,names=name)
    • dataframe.to_csv(path)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值