1. 程式人生 > >Python Pandas 二維資料處理與 T-SQL 對應關係

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

[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,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