Python Pandas 二維資料處理與 T-SQL 對應關係
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 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,pricedesc |
df.sort_values(['volume', 'price'], ascending=[True, False]) |
select code as mycode,volume as myvolume 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.ix[50:60,[1,2]]
df.ix[50:60,['age','MonthlyIncome']]
df.ix[50:60,]
df.ix[:,['age','MonthlyIncome']]
#取第一列或第二列資料
df.iloc[:,[0]]
df.iloc[:,[0,1]]
更多參考: http://pandas.pydata.org/pandas-docs/stable/api.html#api-dataframe-stats