数据分析02 /pandas基础、股票分析案例

数据分析02 /pandas基础、股票分析案例

1. pandas简介

  • numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类型的数据(字符串,时间序列),那么pandas就可以帮我们很好的处理除了数值型的其他数据!

  • pandas中的两个常用的类:Series/DataFrame

2. Series

  • 定义:

    Series是一种类似一维数组的对象,由下面两个部分组成:

    values:一组数据(ndarray类型)

    index:相关的数据索引标签

  • Series的创建

    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这个数据结构中存储的数据一定得是一个维度
  • Series的索引

    1.隐式索引:数值型,默认是隐式索引

    2.显式所用:自定义(字符串),提高数据的可读性

    代码示例:

    # index指定显式索引
    s4 = Series(data=[1,2,3],index=['数学','英语','理综'])
  • Series的索引和切片

    1.索引操作

    # 隐式索引操作
    s4[0]
    # 显示索引操作
    s4['数学']
    s4.数学

    2.切片

    s4[0:2]
  • Series的常用属性

    • shape:形状; 例:s4.shape
    • size:大小; 例:s4.size
    • index:行索引; 例:s4.index
    • values:列索引; 例:s4.values
  • Series的常用方法

    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()]

3. DataFrame

  • DataFrame简介

    DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。

    • 行索引:index
    • 列索引:columns
    • 值:values
  • 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
  • DataFrame的属性

    • df.values:所有的值
    • df.shape:形状
    • df.index:行索引
    • df.columns:列索引
  • DataFrame索引操作

    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]  # 隐式索引操作
  • DataFrame的切片操作

    1.对行进行切片

    # 切行
    df[0:2]

    2.对列进行切片

    # 切列
    df.iloc[:,0:2]
  • DataFrame的运算:和Series是一样

    元素对应的行列索引保持一致,则元素间可以进行算数运算,否则补空

  • 查看df的数据的数据类型

    df.dtypes
  • 时间数据类型的转换:pd.to_datetime(col)

    示例:

    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]类型相关的操作
  • 将某一列设置为行索引:df.set_index()

    示例:

    # 将time这一列作为原数据的行索引
    df.set_index(df['time'],inplace=True)   # inplace将原索引替换成time索引
    
    # 将之前的time列删掉
    df.drop(labels='time',axis=1,inplace=True)  # drop函数中axis的0行,1列

4. 利用DataFrame对股票进行分析

  • 需求:股票分析
    • 使用tushare包获取某股票的历史行情数据。
      • tushare:财经数据接口包
      • pip install tushare
    • 输出该股票所有收盘比开盘上涨3%以上的日期。
    • 输出该股票所有开盘比前日收盘跌幅超过2%的日期。
    • 假如我从2010年1月1日开始,每月第一个交易日买入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

猜你喜欢

转载自www.cnblogs.com/liubing8/p/12025163.html