numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类型的数据(字符串,时间序列),那么pandas就可以帮我们很好的处理除了数值型的其他数据!
pandas中的两个常用的类:Series/DataFrame
Series是一种类似一维数组的对象,由下面两个部分组成:
values:一组数据(ndarray类型)
index:相关的数据索引标签
1.由列表或numpy数组创建
2.由字典创建
代码示例:
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
# 方式一:
s1 = Series(data=[1,2,3,4,5])
# 方式二:
s2 = Series(data=np.random.randint(0,100,size=(4,)))
# 方式三:
dic = {
'a':1,
'b':2,
'c':3
}
# Series的索引可以为字符串
s3 = Series(data=dic)
# Series这个数据结构中存储的数据一定得是一个维度
1.隐式索引:数值型,默认是隐式索引
2.显式所用:自定义(字符串),提高数据的可读性
代码示例:
# index指定显式索引
s4 = Series(data=[1,2,3],index=['数学','英语','理综'])
1.索引操作
# 隐式索引操作
s4[0]
# 显示索引操作
s4['数学']
s4.数学
2.切片
s4[0:2]
1.head(),tail()
s4.head(2) # 显式前n条数据
s4.tail(2) # 显式后n条数据
2.unique()
s = Series(data=[1,1,2,2,3,4,5,6,6,6,6,6,6,7,8])
s.unique() # 对Series进行去重
3.add() sub() mul() div() /Series的算术运算
s + s 相当于 s.add(s)
算数运算的法则:索引与之匹配的值进行算数运算,否则补空
s1 = Series(data=[1,2,3,4])
s2 = Series(data=[5,6,7])
s1 + s2
# 结果:
0 6.0
1 8.0
2 10.0
3 NaN
dtype: float64
4.isnull(),notnull()/应用:清洗Series中的空值
s1 = Series(data=[1,2,3,4],index=['a','b','c','e'])
s2 = Series(data=[1,2,3,4],index=['a','d','c','f'])
s = s1 + s2
s
# 结果:
a 2.0
b NaN
c 6.0
d NaN
e NaN
f NaN
dtype: float64
# 清洗结果的空值:boolean可以作为索引取值
s[s.notnull()]
DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
1.ndarray创建
2.字典创建
示例:
df = DataFrame(data=np.random.randint(0,100,size=(5,6)))
df
dic = {
'name':['zhangsan','lisi','wangwu'],
'salary':[10000,15000,10000]
}
df = DataFrame(data=dic,index=['a','b','c'])
df
1.对列进行索引
# 索引取单列
df['name']
# 索引取多列
df[['age','name']]
2.对行进行索引
# 索引取单行
df.loc['a'] # 显示索引操作
df.iloc[0] # 隐式索引操作
# 索引取多行
df.loc[['a','c']] # 显示索引操作
df.iloc[[0,2]] # 隐式索引操作
3.取单个元素
df.loc['b','salary'] # 显示索引操作
df.iloc[1,1] # 隐式索引操作
4.取多个元素值
df.loc[['b','c'],'salary'] # 显示索引操作
df.iloc[[1,2],1] # 隐式索引操作
1.对行进行切片
# 切行
df[0:2]
2.对列进行切片
# 切列
df.iloc[:,0:2]
元素对应的行列索引保持一致,则元素间可以进行算数运算,否则补空
df.dtypes
示例:
dic = {
'time':['2019-01-09','2011-11-11','2018-09-22'],
'salary':[1111,2222,3333]
}
df = DataFrame(data=dic)
# 将time列转换成时间序列类型
df['time'] = pd.to_datetime(df['time'])
# 转换前time的类型是:object
# 转换后time的类型是:datetime64[ns]
# 转换后可以进行datetime64[ns]类型相关的操作
示例:
# 将time这一列作为原数据的行索引
df.set_index(df['time'],inplace=True) # inplace将原索引替换成time索引
# 将之前的time列删掉
df.drop(labels='time',axis=1,inplace=True) # drop函数中axis的0行,1列
代码实现:
1.使用tushare包获取某股票的历史行情数据
import tushare as ts
import pandas as pd
from pandas import Series,DataFrame
# 使用tushare包获取某股票的历史行情数据
df = ts.get_k_data('600519',start='1988-01-01')
# 将获取的数据写入到本地进行持久化存储
df.to_csv('./maotai.csv')
# 将本地文本文件中的数据读取加载到DataFrame中
df = pd.read_csv('./maotai.csv')
df.head(10)
# 将Unnamed: 0为无用的列删除
df.drop(labels='Unnamed: 0',axis=1,inplace=True)
df.head(5) # 显示前五条,不写5默认也是显示的前5条
# 将date列转成时间序列类型
df['date'] = pd.to_datetime(df['date'])
# 将date列作为元数据的行索引
df.set_index(df['date'],inplace=True)
# 删除原date列
df.drop(labels='date',axis=1,inplace=True)
df.head()
2.输出该股票所有收盘比开盘上涨3%以上的日期。
# 伪代码:(收盘-开盘)/开盘 > 0.03
(df['close'] - df['open'])/df['open'] > 0.03
# boolean可以作为df的行索引
df.loc[[True,False,True]]
df.loc[(df['close'] - df['open'])/df['open'] > 0.03]
df.loc[(df['close'] - df['open'])/df['open'] > 0.03].index
3.输出该股票所有开盘比前日收盘跌幅超过2%的日期
#伪代码:(开盘-前日收盘)/前日收盘 < -0.02
# 将收盘/close列下移一位,这样可以将open和close作用到一行,方便比较
(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02
# boolean作为df的行索引
df.loc[(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02]
df.loc[(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02].index
# shift(1):可以让一个Series中的数据整体下移一位
4.假如从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,收益如何?
分析:
买入:一个完整的年需要买12次股票,一次买入一手(100支),一个完整的年需要买入1200支股票
卖出:一个完整的年卖一次,一次卖出1200只股票
代码实现:
# 将2010-1-1 - 今天对应的交易数据取出
data = df['2010':'2019']
data.head()
# 数据的重新取样,将每个月第一个交易日的数据拿到
data_monthly = data.resample('M').first()
# 一共花了多少钱
cost_money = (data_monthly['open']*100).sum()
# 卖出股票入手多少钱,将每年的最后一个交易日的数据拿到
data_yeasly = data.resample('A').last()[:-1]
recv_money = (data_yeasly['open']*1200).sum()
# 19年手里剩余股票的价值也要计算到收益中
last_money = 1200*data['close'][-1]
# 最后总收益如下:
last_monry + recv_money - cost_monry
原文:https://www.cnblogs.com/liubing8/p/12025163.html