zoukankan      html  css  js  c++  java
  • pandas

    pandas

    #有许多数据结构,比python多

    0 .panda的导入 以及df,Series

    导入pandas:

    import pandas as pd
    from pandas import DataFrame,Series
    import numpy as np

    一.Series

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

    • values:一组数据(ndarray类型)
    • index:相关的数据索引标签

    a.Series的创建

    两种创建方式:
    (1) 由列表创建
    默认索引为0到N-1的整数型索引
    

    使用列表创建Series

    Series(data=[1,2,3])

    1565615774441

    自带隐形索引

    可以通过设置index参数指定索引

    s = Series(data=[1,2,3],index=['a','b','c'])

    (2) 由numpy数组创建

    Series(data=np.random.randint(0,100,size=(3,)))

    1565615834007

    由numpy数组创建

    b.Series的索引和切片

    1565616135498

    c.Series的基本概念

    1查看去重相加

    s.head() : 查看前n个

    tail() : 查看后n个值

    s.unique() : Series元素进行去重

    当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况

    使得两个Series进行相加

    s1 = Series(data=[1,2,3,4],index=['a','b','c','d'])
    s2 = Series(data=[1,2,3,4],index=['a','b','e','d'])
    s = s1 + s2
    1565619955813

    2 使用函数检测缺失数据

    pd.isnull(),

    pd.notnull(),

    s.isnull(),

    notnull()

    1565620001583

    s[[True,True,False,False,True]] #如果将布尔值作为Serrise的索引,则只保留True对应的元素值 # 根据这一属性 后面提取符合条件的值 当有判断时, 作业里用到

    1565620021958

    s[s.notnull()]

    1565620096527

    3 Series之间的运算
    • 在运算中自动对齐不同索引的数据
    • 如果索引不对应,则补NaN

    二、DataFrame

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

    • 行索引:index
    • 列索引:columns
    • 值:values

    a. DataFrame的创建

    最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,以字典的值(一个数组)作为每一列。

    此外,DataFrame会自动加上每一行的索引。

    使用字典创建的DataFrame后,则columns参数将不可被使用。

    同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。

    1 由numpy数组创建

    DataFrame(data=np.random.randint(60,100,size=(3,4)))

    1565620335701

    多维的

    (1) 自定义索引

    df = DataFrame(data=np.random.randint(60,100,size=(3,4)),index=['A','B','C'],columns=['a','b','c','d'])

    1565620409879

    b.DataFrame属性

    values、columns、index、shape

    values

    array([[92, 67, 79, 68],
           [84, 66, 61, 66],
           [84, 79, 66, 82]])
    

    columns Index(['A', 'B', 'C'], dtype='object')

    index Index(['a', 'b', 'c', 'd'], dtype='object')

    shape (3, 4)

    c.字典格式

    dic = {
    '张三':[150,150,150,150],
    '李四':[0,0,0,0]
    }
    df = DataFrame(data=dic,index=['语文','数学','英语','理综'])
    df

    1565620565783

    d.DataFrame的索引

    1 对列进行索引
    - 通过类似字典的方式  df['q']
    - 通过属性的方式     df.q
    

    可以将DataFrame的列获取为一个Series。返回的Series拥有原DataFrame相同的索引,且name属性也已经设置好了,就是相应的列名。

    df = DataFrame(data=np.random.randint(60,100,size=(3,4)),index=['A','B','C'],columns=['a','b','c','d'])
    df

    1565620709069

    size(3,4) 必须和index 行 columns 列对应

    获取前两列

    df[['a','c']]

    (1) 修改列索引

    df.columns = ['a','c','b','d']
    df

    1565620721950

    2 对行进行索引
    - 使用.loc[]加index来进行行索引
    - 使用.iloc[]加整数来进行行索引
    

    同样返回一个Series,index为原来的columns。

    对第一行的索引:

    ​ df.iloc[0]
    ​ df.loc['A']

    1565620870046

    对第一二行的索引:

    ​ df.loc[['A','B']]

    1565620923891

    3 对元素索引的方法
    - 使用列索引
    - 使用行索引(iloc[3,1] or loc['C','q']) 行索引在前,列索引在后
    

    df.iloc[1,2] # 第二行第三列
    df.loc[['B','C'],'b'] # 第B到C行,第b列

    1565620979118

    e.DataFrame的切片:

    【注意】 直接用中括号时:

    • 索引表示的是列索引
    • 切片表示的是行切片

    df[0:2] 行
    df.iloc[:,0:2] 列
    在loc和iloc中使用切片(切列) : df.loc['B':'C','丙':'丁']

    1565621383696

    1565621392169

    1565621404994

    f.总结:

    • 索引:
      • 取行:df.loc['A']
      • 取列:df['a']
      • 取元素:df.iloc[1,2]
    • 切片:
      • 切行:df[0:2]
      • 切列:df.iloc[:,0:2]

    g.DataFrame的运算

    DataFrame之间的运算

    同Series一样:

    • 在运算中自动对齐不同索引的数据
    • 如果索引不对应,则补NaN
    • 1565621590924

    z. 小总结:

    索引默认是列,所以用行的话,除了索引取值,ddd['语文':'语文'] 用 loc['语文']

    切片默认是行 所以用列的话,除了取一列ddd['李四'],取多列,用loc[:,'张三':'李四']

    做题

    1565605299635

    ddd.loc[:,'张三':'刘二']+10

    1565605285987

    回想

    案例分析

    1. 收成比开始涨幅3%的股票
    
    2. 今日开比昨日收减幅2%的股票
    
    思路把 昨日收往下下滑一行
    shift[1]
    然后以日期为标识 
    riqi = [([open]-[close])/close<3%].index
    [riqi][]
    
    3. 从2010年每月第一个开买进1手,每年末的第一个月卖出所有,如果到今天,能赚多少
    
    dic['y']  = ['A'][-1]  # 去2019   显示问题还是对的
    dic['m']  = ['M'][:-1]['open'].sum * 100  # 每年每月的
    dic['L'] = ['M']['-1']['close']  # 每年最后一个月的
    dic['L'] * 1200 + dic['']	
    
    
    

    今日份错误:

    size 没有定义

    DataFrame(data=np.random.randint(60,100,size(3,4)))
    
    true:
    DataFrame(data=np.random.randint(60,100,size=(3,4)))
    

    作业

    作业1

    1 假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。

    ddd = DataFrame(data=np.random.randint(100,120,size=(4,4)),index=['语文','数学','英语','理综'],columns=['张三','李四','王五','刘二'])
    ddd2 = DataFrame(data=np.random.randint(100,120,size=(4,4)),index=['语文','数学','英语','理综'],columns=['张三','李四','王五','刘二'])
    ddd_avg = ddd+ddd2
    ddd_avg.mean()
    

    1565615322835

    2 假设张三期中考试数学被发现作弊,要记为0分,如何实现?

    # ddd[2,1] = 0  # 错误,属于直接加列
    ddd.drop(labels=(2,1),axis=1,inplace=True)
    
    
    ddd.loc['数学',['张三']] = 0
    

    1565615311253

    3 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?

    ddd['李四']+100

    1565615357986

    4 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?

    ddd.loc[:,'张三':'刘二']+10

    1565615363782

    作业2

    1查看一个股盘

    2输出该股票所有收盘比开盘上涨3%以上的日期。

    3输出该股票所有开盘比前日收盘跌幅超过2%的日期。

    4假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?

    下载tushare 包 : pip3 install tushare

    导入数据: 比如 茅台是 600519

    1数据的提取处理
    #使用tushare包获取某股票的历史行情数据。
    import tushare as ts
    df = ts.get_k_data(code='600519',start='2000-01-01')# 因为茅台是从2001年左右开始股   get_k_data(code='',start='')   股票号, 开始日期
    
    df.to_csv('./600519.csv') # 转成csv存储到本地
    
    #将date这一列作为源数据的行索引且将数据类型转成时间类型
    df = pd.read_csv('./600519.csv',index_col='date',parse_dates=['date']) 
    	#当做第一题,二题时,直接提取index即得到答案 , 还因为日期是惟一的也可以做索引
    df.drop(labels='Unnamed: 0',axis=1,inplace=True) # 删除多余的索引列
    df # 查看数据是否插入 4000多条
    
    1565614828260
    2输出该股票所有收盘比开盘上涨3%以上的日期。
    伪代码: (收盘-开盘)/开盘 > 3% 
    
    (df['close']-df['open'])/df['open'] > 0.03 
    
    #将上述表达式返回的布尔值作为df的行索引:取出了所有符合需求的行数据
    df.loc[(df['close']-df['open'])/df['open'] > 0.03]# 如果是正确的的,则loc会采纳得到所有的
    
    加上index就得到了日期   .index
    

    1565614886410

    以解析成时间格式的日期为index的数据

    1565615009654

    得到的日期格式

    3输出该股票所有开盘比前日收盘跌幅超过2%的日期。
    伪代码: (开盘-前日收盘)/前日收盘 < -2% 
    用到的知识点
    某一列.shift(1)  #选中的数据往下面移动1格  就可以对修改后的同行的数据操作open和close了   
    
    (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
    

    1565615079291

    4 赚了多少

    假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?

    从2010年开始 1月1日(只能表示年! 月日怎么表示?)# df['2010-09-10':'2019-09-10']? 
    df['2010':'2019']		
    

    1565615094874

    不一定从1月04开始的

    # 数据的重新取样
    df_monthly = df.resample('M').frist() # 每月第一个交易日买入1手股票 此为1股要*100
    df_yearly = df.resample('A').last()[:-1] # 每年最后一个交易日卖出, 最后一年还没过完,没法收盘  所以[:-1]
    
    
    recv_money = df_monthly['open'].sum()*100 # 求和乘100   #去开盘数据求和
    send_money = df_yearly['close'].sum()*1200 # 取收盘数据1年的12个月, 
    再加上  df['close'][-1]*800 #最后一个月,不是12月了,是8月的 而且只能df['close'] 取值
    相减即得股票盈利
    

    1565615172776

    1565615181039

  • 相关阅读:
    prototype.js超强的javascript类库
    MySQL Server Architecture
    Know more about RBA redo block address
    MySQL无处不在
    利用Oracle Enterprise Manager Cloud Control 12c创建DataGuard Standby
    LAMP Stack
    9i中DG remote archive可能导致Primary Database挂起
    Oracle数据库升级与补丁
    Oracle为何会发生归档日志archivelog大小远小于联机重做日志online redo log size的情况?
    Oracle Ksplice如何工作?How does Ksplice work?
  • 原文地址:https://www.cnblogs.com/Doner/p/11340987.html
Copyright © 2011-2022 走看看