## Pandas
### Series 和 DataFrame
```
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
```
* Series 序列 列和行索引,相當于一維數組
* DataFrame 數據幀 列和行 行索引和列標簽 相當于二維數組
* 自動對齊 時間序列 缺失補全
* 1 創建序列
* 創建序列
* 創建序列指定索引
* 指定索引名
```
s1 = Series([1, 2, 3, 4, 5])
s1
s2 = Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
s2
s2.index.name = 'index'
s2.index
```
* rand 0-1 隨機均勻分布
* randn 標準狀態分布 均值0 方差1
* 2 創建數據幀
* 指定索引 指定標簽
* 查看索引
* 查看標簽
```
df = DataFrame(np.random.rand(4, 4), index=['a', 'b', 'c', 'd'], columns=['A', 'B', 'C', 'D'])
df
df.index
df.columns
```
### 選擇
* 3 序列選擇
* 通過序列索引
* 通過自定義索引
* 通過序列索引切片
* 通過自定義索引切片
* 通過序列.iloc(序列索引)
* 通過序列.loc(自定義索引)
```
s2 = Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
s2
s2[0]
s2['a']
s2[0:3]
s2['a':'c']
s2.iloc[0:3]
s2.loc['a':'c']
```
* 4 數據幀獲取列
* 獲取數據幀某列 數據幀.列標簽
* 獲取數據幀多列 數據幀[數據幀.columns[index]]
```
df
df.A
df['A']
df[df.columns[0:2]]
```
* 5 數據幀獲取多行
* 獲取數據幀某行 數據幀.loc[行自定義索引]
* 獲取數據幀某行 數據幀.iloc[行索引]
* 獲取數據幀多行 數據幀.loc[自定義索引:]
```
df
df.loc['a']
df.loc['a':'b']
df.iloc[0]
```
* 6 數據幀獲取多列
* 獲取數據幀多列 數據幀.loc[:,自定義列標簽]
* 獲取數據幀某個具體位置值 數據幀.loc[行索引,列標簽]
* 獲取數據幀部分 數據幀.loc[行索引:,列標簽:]
```
df.loc[:, ['B', 'C', 'D']]
df
df.loc['a', 'A']
df.loc['b':'c', 'B':'C']
```
### 缺失值和數據自動對齊
* 7 序列缺失值
* 產生缺失值 兩個序列索引不一樣運算產生缺失值
* 求和時 缺失值補全
```
s1 = Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
s1
s2 = Series([2, 3, 4, 5], index=['b', 'c', 'd', 'e'])
s2
s1 + s2
s1.add(s2,fill_value=0)
```
* 8 數據幀缺失值
* 產生缺失值 兩個數據幀 形狀 行索引 列標簽不一樣產生缺失值
* 求和時 缺失值補全
```
df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc'))
df2 = DataFrame(np.arange(12).reshape(3,4), columns=list('ABDE'), index=list('bcd'))
df1
df2
df1 + df2
df1.add(df2, fill_value=0)
```
### 常用運算
* `apply()` 作用于一維向量上
* `applymap()` 作用于所有元素上
* 9 數據幀運算
* 數據幀應用匿名函數列應用
* 數據幀應用匿名函數行應用
```
df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc'))
df1
f = lambda x: x.max() - x.min()
df1.apply(f)
df1.apply(f, axis=1)
```
* 10 數據幀運算
* 數據幀應用匿名函數作用所有元素
```
df1.applymap(lambda x: x+1)
```
### 常用統計
* 11 數據幀統計運算
* 列元素求和
* 行元素求和
* 求平均
* 查看統計元素
```
df1 = DataFrame(np.arange(9).reshape(3,3), columns=list('ABC'), index=list('abc'))
df1
df1.sum()
df1.mean()
df1.sum(axis=1)
df1.describe()
```
### 數據合并和分組
* 12 數據幀
* 兩個數據幀拼接
```
df1 = DataFrame(np.random.randn(3, 3))
df2 = DataFrame(np.random.randn(3, 3), index=[5, 6, 7])
df1
df2
pd.concat([df1, df2])
```
* 13 數據幀
* 兩個數據幀合并
```
df1 = DataFrame({'user_id': [5348, 13], 'course': [12, 45], 'minutes': [9, 36]})
df2 = DataFrame({'course': [12, 45], 'name': ['Linux 基礎入門', '數據分析']})
df1
df2
pd.merge(df1, df2)
```
* 14 數據幀數據統計
* 指定標簽值 標簽值求和
* 找出指定id,minutes標簽值求和
```
df = DataFrame({'user_id': [5348, 13, 5348], 'course': [12, 45, 23], 'minutes': [9, 36, 45]})
df
df[df['user_id'] == 5348]['minutes']
df[df['user_id'] == 5348]
df[df['user_id'] == 5348]['minutes'].sum()
```
* 15 數據幀數據統計
* 過來列id,minute 通過id分組求和
```
df[['user_id', 'minutes']]
df[['user_id', 'minutes']].groupby('user_id').sum()
```
### 時間序列處理
* datetime.datetime 代表時間對象
* datetime.date 代表某一天
* datetime.timedelta 時間差
* 16 時間對象
* 創建時間對象 datetime(年,月,日)
* 加上時間間隔
```
from datetime import datetime, timedelta
d1 = datetime(2017, 8, 1)
d1
delta = timedelta(days=10)
d1 + delta
```
* 17 創建序列
* 創建序列加上時間索引
* 查看序列索引
```
from datetime import datetime
dates = [datetime(2018, 1, 1), datetime(2018, 1, 2), datetime(2018, 1, 3), datetime(2018, 1,4)]
ts = Series(np.random.randn(4), index=dates)
ts
ts.index
ts.index[0]
```
* 18 時間序列索引使用
* 通過時間序列索引找對應的值
```
ts.index[0]
ts[ts.index[0]]
ts['2018-01-01']
ts['2018/01/01']
ts['1/1/2018']
ts[datetime(2018, 1, 1)]
```
* 19 使用pandas生成日期索引
* date_range(起始,結束,freq頻率)
```
pd.date_range('2018-1-1', '2019', freq='M')
pd.date_range('2018-1-1', '2018-12-1', freq='MS')
```
* 20 生成時間索引序列
* 使用date_range生成時間索引 頻率為小時
* 使用Series生成時間日期序列
```
dates = pd.date_range('2018-1-1', '2018-1-2 23:00:00', freq='H')
ts = Series(np.arange(len(dates)), index=dates)
ts.size
ts.head(5)
ts.tail(5)
```
* 21 高低頻統計轉化
* 高頻轉為低頻H轉為D,求和
* 高頻轉為低頻,求平均
* 高頻轉低頻求平均再轉高頻求平均
* 高頻轉低頻求平均再轉高頻求平均無效填充
```
ts.resample('D').sum()
ts.resample('D').mean()
ts.resample('D').mean().resample('H').mean()
ts.resample('D').mean().resample('H').ffill()
```