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

  • 相关阅读:
    02-自定义CALayer
    01-CALayer的基本操作
    抽屉效果
    手势识别
    事件响应
    寻找最合适的view
    hitTest方法与PointInside方法
    02-事件的产生与传递
    OC图标+启动图
    OC多线程操作
  • 原文地址:https://www.cnblogs.com/Doner/p/11340987.html
Copyright © 2011-2022 走看看