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