zoukankan      html  css  js  c++  java
  • Python Pandas 二维数据处理与 TSQL 对应关系

    Pandas 是 python的一个数据分析包,它提供了大量的数据模型型和函数库,对数据处理很方便。DataFrame 是一个二维表格数据结构,可以当做数据库中的一张关系表。Pandas 可以实现 SQL 中的语句,对 DataFrame 的操作相当于对二维表操作一样。

    还是以股票某天的分笔记录为例。之前数据进行处理已经导入数据库。

    import numpy as np
    import pandas as pd
    from pandas import Series, DataFrame
    
    import tushare as ts
    df = ts.get_tick_data('600543',date='2017-12-29')

    当前都在命令行窗口测试。为了使数据与数据库中的一直(当前几个字段没有),进行以下处理。

    #查看类型
    print(type(df))
    
    #【更新列】,替换掉无效字符
    df['change'] = df['change'].replace('--', '')  
    
    #【添加列】,所有值一样 (两种方法)
    df['code'] = '600543'
    df['date'] = '2017-12-29'  
    
    df = df.assign(code= '600543', date='2017-12-29')
    
    #【删除列】
    df.pop('pchange')
    del df['change']
    
    #查看列名
    list(df.columns.values)
    
    #调整列的位置,即重新赋值(三种方法)
    df = df[['code', 'date', 'time', 'price', 'change', 'volume', 'amount', 'type']]
    df = df.reindex_axis([ 'code', 'date', 'time', 'price', 'change', 'volume', 'amount', 'type'], axis=1)
    df = df.reindex(columns=[ 'code', 'date', 'time', 'price', 'change', 'volume', 'amount', 'type'])

    基本的查询对照语句:

    T-SQL

    Pnadas 脚本

    select *from [Fenbi600543]

    df

    select code from [Fenbi600543]

    df.code

    select code,datefrom [Fenbi600543]

    df[['code', 'date']]

    select top(10)* from [Fenbi600543]

    df.head(10)

    select *from [Fenbi600543]

    where type='买盘'

    df[(df['type'] == '买盘')]

    select *from [Fenbi600543]

    where volume=0

    df[(df['volume']==0)]

    select *from [Fenbi600543]

    where volume>=100

    df[(df['volume']>=100)]

    select *from [Fenbi600543]

    where volume<10

    df[(df['volume']<10)]

    select *from [Fenbi600543]

    where volume >=100 and volume<=200

    df[(df['volume']>=100)&(df['volume']<=200)]

    select *from [Fenbi600543]

    where volume =0 or volume>=200

    df[(df['volume']==0)|(df['volume']>=200)]

    select *from [Fenbi600543]

    where volume in(15,25)

    df[df.volume.isin([15,25])]

    select *from [Fenbi600543]

    where volume not in(15,25)

    df[~df.volume.isin([15,25])]

    select *from [Fenbi600543]

     where typelike '%中性%'

    df[df['type'].str.contains("中性")]

    select *from [Fenbi600543]

    order by volumedesc

    df.sort_values('volume', ascending=False)

    select *from [Fenbi600543]

    order by volumeasc,price desc

    df.sort_values(['volume', 'price'], ascending=[True, False])

    select code as mycode,volume asmyvolume

    from [Fenbi600543]

    df[['code', 'volume']].rename(columns={'code':'mycode', 'volume':'myvolume'})

    select distinct code,typefrom[Fenbi600543]

    df[['code', 'type']].drop_duplicates()

    统计函数:

    #每列都统计总数
    df.count()
    
    #每列平均值(只统计数值型)
    df.mean()
    
    #每列都统计汇总数(数值型则汇总,字符型则连接成一行)
    df.sum()
    
    #每列的最大值或最小值
    df.max()
    df.min()
    
    #只显示一列(如 volume)的数值统计【还有 各种方差、标准差、等计算】
    #更多参考 http://pandas.pydata.org/pandas-docs/stable/api.html#api-dataframe-stats
    df["volume"].count()
    df["volume"].mean()
    df["volume"].sum()
    df["volume"].max()
    df["volume"].min()
    
    
    #只显示一列(如 volume)的数值统计及类型
    df[['volume']].apply(sum)
    df[['volume']].apply(max)
    df[['volume']].apply(min)
    
    
    #按 type 分组,显示所有列的数值统计
    df.groupby('type').count()
    df.groupby('type').mean()
    df.groupby('type').sum()
    df.groupby('type').max()
    df.groupby('type').min()
    
    df.groupby('type')['volume','amount'].sum() #取指定列,如 'volume','amount'
    
    
    #按 volume 分组,每个分组取第一行数据
    df.groupby('volume').first()
    
    #按 volume 分组,每个分组取最后一行数据
    df.groupby('volume').last()
    
    #按 type 分组,每个分组取前5行数据
    df.groupby('type').head()

    分组统计对比:

    T-SQL

    Pnadas 脚本

    select count(volume),sum(volume),avg(volume)

    ,max(volume),min(volume)

    from [Fenbi600543]

    df.agg({'volume': ['count', 'sum', 'mean', 'max', 'min']})

    select sum(volume),sum(amount)from [Fenbi600543]

    df.agg({'volume': ['sum'],'amount': ['sum']})

    select [type],sum(volume)from [Fenbi600543] groupby[type]

    df[[ 'type','volume']].groupby('type').sum()

    select [type],count(volume),sum(volume),max(volume)

    from [Fenbi600543] group by [type]

    df.groupby(['type']).agg({'volume':['count', 'sum', 'max']})

    select code,[type],count(volume),sum(volume),max(volume)

    from [Fenbi600543]

    group by code,[type]

    df.groupby(['code','type']).agg({'volume':['count', 'sum', 'max']})

    索引相关:

    #查看索引(默认为递增整数序列)
    df.index
    
    #设置索引,将列转为索引(df.index 此时为时间顺序的一维数组)
    df.set_index('time', inplace=True)
    
    #此时再查询时间“time”列则报错,“time”变为索引,不存在列“time”了
    df.time
    df[['time', 'date']]
    
    #恢复,将索引转为列(此时默认序列将成为索引)
    df = df.reset_index() 
    
    
    #或者重新添加列,使其和索引值一样。
    df['time'] = df.index
    
    #如果列已经存在,重置索引时,不需要将其转为列,而是直接删除
    df = df.reset_index(drop=True)

    行定位查询(如获取分页数据等)

    默认的,DataFrame 的索引为自增序列。
    
    #取某一行记录(如第100行 index=99)
    df.loc[99]
    df.iloc[99]
    
    #选择 0~2行记录,如 [0,3)
    df[0:3]
    
    #查询前10行记录
    df.loc[:10]
    df.iloc[:10]
    df.head(10)
    
    #查询 3 列数据
    df.loc[:,['type','volume','amount']]
    df[['type','volume','amount']]
    
    #查询前 50~60 行记录,取其中3列
    df.loc[50:60,['type','volume','amount']]
    df.loc[50:60][['type','volume','amount']]
    
    #取第一列或第二列数据
    df.iloc[:,[0]]  
    df.iloc[:,[0,1]]  

    更多参考: http://pandas.pydata.org/pandas-docs/stable/api.html#api-dataframe-stats

  • 相关阅读:
    Permutation Sequence
    Anagrams
    Unique Binary Search Trees II
    Interleaving String
    Longest Substring Without Repeating Characters
    Sqrt(x)
    Maximum Product Subarray
    Jump Game II
    Container With Most Water
    C结构体的初始化和赋值
  • 原文地址:https://www.cnblogs.com/hzc2012/p/8276469.html
Copyright © 2011-2022 走看看