# pandas Foundations
###### tags: `Datacamp` `python` `panda` `data science` `Data Manipulation with Python`
>**作者:何彥南**
>Datacamp 課程: [pandas Foundations](https://www.datacamp.com/courses/pandas-foundations)
**注意:**
1. df 為 pandas 的 DataFrame 的縮寫。
2. pd 為 panda 套件的縮寫。
3. 請以官方文件 [panda doc](https://pandas.pydata.org/pandas-docs/stable/) 為主。
4. 注意panda 的版本,有些功能可能在新版無法使用。
5. 程式碼內`#`標記的地方為 output。
[toc]
---
# [CH1] Data ingestion & inspection
## 1.What is pandas?
> 有以下幾點特性
![](https://i.imgur.com/rCp3pwO.png)
### pandas DataFrames
>這邊我們使用[(AAPL.csv)](https://www.kaggle.com/khoongweihao/aaplcsv#AAPL.csv) 的資料做基本介紹。
![](https://i.imgur.com/08ZyRyG.png)
* panda 最基礎的資料型態就是 DataFrame,簡單來說就是一個table。
### Indexes and columns | shape、columns、index
>在資料分析前,最重要的就是**觀察資料長怎樣**,而panda提供了很完善的function。
>首先由index和column,他們是組成dataframe的基礎。
* index: 由左至右,也就是row的標籤,**他代表那一列資料**。
* column: 由上而下,簡單來說**每行資料就是一個變數,代表每筆資料的其中一個特徵**。
![](https://i.imgur.com/90xVh45.png)
* type(): 可以看到它的資料類型,是panda下的dataframe。
* df.shape: 可以知道df的(列,行),也就是有幾筆資料和變數。
* df.columns: 可以知道有那些columns,輸出是index 型態的每個行名(column name)。
![](https://i.imgur.com/xdM3Tf3.png)
* df.index: 會輸出所有列標籤(index)的列表。
### Slicing | iloc[ ]、head()、tail()、info()
> 在panda 裡面我們可以輕易地對資料進行切分。
* df.iloc[row_index, column_index] ([doc](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html))
* 我們可以透過設定 row 和 column 的 index(位置)來獲取我們想要的部分資料。
* 其中第一個就是 **0** 最後一個就是 **-1**,而 **:** 就是所有的意思
* 這邊我們示範如何立用iloc[] 抓取前五筆和後五筆資料。
![](https://i.imgur.com/6N15SzP.png)
> 下面 head() 和tail()可以達到一樣的效果。
* df.head()
![](https://i.imgur.com/OWyydq4.png)
* df.tail()
![](https://i.imgur.com/QGzQGBu.png)
>我們還可以使用 info()看到更多資料。
* df.info()
![](https://i.imgur.com/08ybiwx.png)
### Broadcasting | iloc[ ::3,-1]
> 廣播功能,就是對多個值做一樣的動作的意思。
![](https://i.imgur.com/srvpRME.png)
* 這邊我們在 iloc[] 裡面使用 **::3** 他代表的就是抓取每第三個資料(可被3除,包含0)
* 下面我們嘗試使用這個特性對多個值進行 np.nan 的動作。
![](https://i.imgur.com/Zc0O9Eb.png)
* 使用 info() 我們可以清楚的看到在 ADJ Close 這行我們填入了兩千多筆nan。
![](https://i.imgur.com/vFSkUOj.png)
### Series | values
> Series 和 dataframe 在panda裡是兩個主要的資料型態,當你指定dataframe 裡的一行時他就是 Series 的型態。
![](https://i.imgur.com/neFsOTA.png)
* df.values : 能將 dataframe 轉成 numpy 的 array 形式
---
## 2. Building DataFrames from scratch
### DataFrames from CSV files | read_csv()
> 首先我們從載入資料開始
* df.read_csv() [(panda doc)](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)
* 除了 csv檔以外 panda 還支援取多其他的資料格式。
![](https://i.imgur.com/RgNh76N.png)
### DataFrames from dict | pd.DataFrame()、zip()、list()、dict()
> 從 dict 轉入 dataframe
![](https://i.imgur.com/QP4tewk.png)
>zip(): 可以交多個 list 合併。
![](https://i.imgur.com/etOhVKA.png)
> 接著我們用 dict() 將其轉為 dict 的格式,並匯入dataframe。
![](https://i.imgur.com/WZKc79r.png)
### Broadcasting | df[column]、df.column
![](https://i.imgur.com/gc8uYMj.png)
* 也可以使用 df.column_name
* df[['column_name','column_name']] 可以同時呼叫多行。
### Broadcasting with a dict | index=[ ]、columns=[ ]
>我們也可以利用dict的匯入dataframe時的特性,獲取一行一樣的值。
![](https://i.imgur.com/gmn6tSS.png)
> 我們可以使用df.columns和df.index 直接設定 index_lable 和 column_lable。
![](https://i.imgur.com/w5uRKh1.png)
## 3.Importing & exporting data
### Datasets from CSV files
> 範例資料 [ISSN_D_tot.csv](https://www.kaggle.com/arasandt/sunspot)
![](https://i.imgur.com/mjbvlCY.png)
![](https://i.imgur.com/K7sMzQ0.png)
### Using header keyword | read_csv(header=None)
>當資料沒有表頭的時候,設定header=None,column 的名稱就會變成數字(0、1、2 ...)
![](https://i.imgur.com/54BCA7u.png)
### Using names keyword | read_csv(names=[ ])
> 設定 names 這個參數,可以以list的格式設定column_name。
![](https://i.imgur.com/xPcdMzC.png)
### Using na_values keyword | read_csv(na_values=' ')
> 設定 na_values 參數,可以在載入資料時,將指定值改成nan。
![](https://i.imgur.com/m8TG9Hd.png)
> 也可以只鎖定定行做更改。
![](https://i.imgur.com/NS5ipju.png)
### Using parse_dates keyword |read_csv(parse_dates=[ ])、index=df[column]
> 使用 parse_dates 參數時,會將list裡指定的行合併載入成datetime的形式。
* 注意必須是可解析的資料
![](https://i.imgur.com/P7T5JLh.png)
> 這邊我們可以看到載入的資料格式是datetime64
![](https://i.imgur.com/TUWLugZ.png)
> 使用df.index 可以指定行為index
![](https://i.imgur.com/P4NTMLm.png)
### Trimming redundant columns | df[[col1,col2]]
> 用 list 的方式可以抓取多行
![](https://i.imgur.com/G7cOjor.png)
### Writing files | to_csv()
> 最後是資料存取的部分
* df.to_csv() [panda doc](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html)
![](https://i.imgur.com/q5RjQXz.png)
## 4. Plotting with pandas (用 panda 和 matplotlib 作圖)
### AAPL stock data | plot()
>這邊我們使用[(AAPL.csv)](https://www.kaggle.com/khoongweihao/aaplcsv#AAPL.csv) 的資料做基本介紹。
* 視覺化:
* matplotlib.pyplot.plot() [doc](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.plot.html)
* df.plot() [doc](https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html)
![](https://i.imgur.com/KOvesf9.png)
### Plotting arrays (matplotlib) | plt.plot(df[column])、plt.show()
> 這邊是使用 values 轉成 arrays的格式,在繪圖。
![](https://i.imgur.com/xyFchp1.png)
![](https://i.imgur.com/kwnOt6y.png)
>也可以直接使用series的格式
![](https://i.imgur.com/T5X8rQ3.png)
![](https://i.imgur.com/LPw3NoV.png)
>可以直接使用dataframe的格式
![](https://i.imgur.com/46PHh0B.png)
![](https://i.imgur.com/2ZRW8ca.png)
### Plotting Series (pandas) | Series.plot()
> panda 也可以直接使用series.plot()
![](https://i.imgur.com/BILOhjL.png)
![](https://i.imgur.com/PMb6HRE.png)
> 也支援 dataframe的格式
![](https://i.imgur.com/NjbC7yn.png)
![](https://i.imgur.com/2b9uecE.png)
### Fixing scales | plt.yscale()
![](https://i.imgur.com/Uy5Z6e1.png)
![](https://i.imgur.com/oFs4b4G.png)
> 還有許多客製化的設定
![](https://i.imgur.com/jQZLC04.png)
![](https://i.imgur.com/8C0DWRb.png)
### Saving plots | plt.savefig(' ')
>儲存圖片
![](https://i.imgur.com/9QofIJG.png)
![](https://i.imgur.com/FM032py.png)
# [CH2] Exploratory data analysis
## 1. Visual exploratory data analysis (各種視覺化圖形)
### The iris data set
> 這邊我們使用[iris.csv](https://www.kaggle.com/saurabh00007/iriscsv)這個資料,介紹不同的視覺化圖案。
![](https://i.imgur.com/9DXnWwP.png)
### Data import
>載入資料
![](https://i.imgur.com/qUvvvW5.png)
### Line plot | plot(x=,y=)
> panda 的 plot()可以直接指定兩行為x、y 軸,注意: 每個點代表每一筆資料。
![](https://i.imgur.com/LK13e7W.png)
![](https://i.imgur.com/9lYLPLO.png)
### Scatter plot
> 散佈圖
![](https://i.imgur.com/DwA5xrd.png)
![](https://i.imgur.com/ULJ0guK.png)
### Box plot
> 箱型圖
![](https://i.imgur.com/AHCg7n4.png)
![](https://i.imgur.com/3jwwVUQ.png)
### Histogram | plot(bins=,range=,normed=)
>直方圖
![](https://i.imgur.com/n9GotsD.png)
![](https://i.imgur.com/GxNrkAC.png)
* 也可以使用 plot.hist() 的方式
> 各種參數
* bins (integer): number of intervals or bins
* range (tuple): extrema of bins (minimum, maximum)
* normed (boolean): whether to normalize to one
* cumulative (boolean): compute Cumulative Distribution Function (CDF)
* … more Matplotlib customizations
![](https://i.imgur.com/eGsT3jg.png)
![](https://i.imgur.com/OpM63wh.png)
![](https://i.imgur.com/PoToU8r.png)
![](https://i.imgur.com/K0os9zf.png)
### Word of warning | plot(kind=‘hist’)、plt.hist()、hist()
>還有許多方式
* Three different DataFrame plot idioms
* iris.plot(kind=‘hist’)
* iris.plt.hist()
* iris.hist()
* Syntax/results differ!
* Pandas API still evolving: check documentation!
## 2. Statistical exploratory data analysis (統計分析)
### Summarizing with describe() | describe()
> 使用describe()可以看到每一行數值型資料的各種基本統計資料。
![](https://i.imgur.com/6uLegTg.png)
* count: number of entries
* mean: average of entries
* std: standard deviation
* min: minimum entry
* 25%: first quartile
* 50%: median or second quartile
* 75%: third quartile
* max: maximum entry
### Counts | count()
> count() 可以數有幾個。
![](https://i.imgur.com/XKnIFkC.png)
### Averages | mean()
> mean() 可以知道平均
![](https://i.imgur.com/aSlqmQ4.png)
### Standard deviations | std()
> std() 可以知道標準差
![](https://i.imgur.com/pdLiFww.png)
### Medians | median()
> median() 可以知道中位數
![](https://i.imgur.com/53hVohu.png)
### Medians & 0.5 quantiles | quantiles()
>中位數相當於 0.5 quantiles(四分位數)
![](https://i.imgur.com/g4WCdwf.png)
> 使用 quantiles()也可以抓取四分位數的相對資料
![](https://i.imgur.com/rdS2s8r.png)
### Ranges | max()、min()
> max() 和 min()
![](https://i.imgur.com/3PoGYun.png)
### Box plots
>盒鬚圖
![](https://i.imgur.com/I9JRr7L.png)
![](https://i.imgur.com/3BobmDK.png)
### Percentiles as quantiles
> describe() 下也有百分位數和四分位數的資料。
![](https://i.imgur.com/sN6QIxZ.png)
## 3. Separating populations
### Describe species column
> 也可以只對單行用 describe()觀察
![](https://i.imgur.com/u17uk5q.png)
![](https://i.imgur.com/u3r2ADY.png)
### Unique & factors | unique()
> unique() 可以知道該行有哪些不同的值
![](https://i.imgur.com/Lq1QRkL.png)
* 這邊我們知道在species 這行裡面有三種不一樣的分類。
> 依特定條件選取篩選dataframe | df[column]==' '
![](https://i.imgur.com/lgaNAud.png)
* 分成三個df之後,我們會發現 unique() 的結果都只又一個值。
![](https://i.imgur.com/QjJzqcW.png)
* 從 index 地方我們可以發現,每筆資料在原本表的位置。
![](https://i.imgur.com/thHpceX.png)
### Visual EDA
> 這邊我們將所有資料一起視覺化,會顯得有些雜亂。
![](https://i.imgur.com/JgxLdvc.png)
![](https://i.imgur.com/grsQtoj.png)
> 於是我們將資料分開來視覺化,看起來就好多了。
![](https://i.imgur.com/ADdXuq0.png)
![](https://i.imgur.com/ZcVQnPZ.png)
![](https://i.imgur.com/ZM5sKO1.png)
![](https://i.imgur.com/WLMr798.png)
> 使用 describe(),我們也可以將不同品種分開來觀察,在各種特徵上的統計數值。
![](https://i.imgur.com/l2PkjqR.png)
### Computing errors
![](https://i.imgur.com/naKmJ7F.png)
### Viewing errors
![](https://i.imgur.com/ZESeOB0.png)
# [CH3] Time series in pandas
## 1. Indexing time series | 時間序列索引做為索引
### Using pandas to read datetime objects
* read_csv() function
* 接受輸入字串轉datetime
* 需要可以被datetime解析
* 當有無法解析的時候,請read_csv() 之後再使用 pd.to_datetime 進行轉換。
* ISO 8601 format
* yyyy-mm-dd hh:mm:ss
### Product sales CSV
> 這邊我們使用 [Product sales.csv](https://github.com/johnashu/datacamp/blob/master/Sales/sales-feb-2015.csv)
![](https://i.imgur.com/PgiBvXz.png)
### Parse dates | read_csv(parse_dates=,index_col=)、loc[ ]
>在使用 read_csv() 時我們可以直接使用,parse_dates 去讀取時間資料,並將時間資料設為index。
![](https://i.imgur.com/T4BYnKQ.png)
> 下面我們可以看到,將date 設為index 後的狀態。
![](https://i.imgur.com/GG2nuib.png)
![](https://i.imgur.com/cDwZjpj.png)
> 將date 設為index 後我們就可以直接用 loc[]去抓取特定的資料
* loc[ ]: 是使用 lable 就是以名字為主,通常為字串。
* iloc[ ]: 則是使用 index 也就是位置,為數字。
![](https://i.imgur.com/X3xI3J4.png)
![](https://i.imgur.com/CCHKlHW.png)
### Partial datetime string selection | datetime 資料的選取
> datetime 型態下的資料可以用以下方是選取特定資料。
* Alternative formats:
* sales.loc[‘February 5, 2015’]
* sales.loc[‘2015-Feb-5’]
* Whole month: sales.loc[‘2015-2’]
* Whole year: sales.loc[‘2015’]
> 選取整個月
![](https://i.imgur.com/AvgkAAY.png)
>也可以選與一段時間內的資料
![](https://i.imgur.com/CBeasUu.png)
### Convert strings to datetime
> 使用 pd.to_datetime() [doc](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html)
![](https://i.imgur.com/JC5V5eT.png)
### Reindexing DataFrame | reindex()
> df.reindex() [doc](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reindex.html)
* 他可以更改dataframe 的 column_index 或 row_index(預設)
* 下面我們將前面的evening_2_11 做為新的 index
![](https://i.imgur.com/Ex66ggp.png)
> 此外reindex() 還有填補空值的功能。ffill 就是使用前一個有觀測值來填補。而bfill 就是使用下一個有效的觀測值來填補。
![](https://i.imgur.com/9wbjN9O.png)
## 2. Resampling time series data
### Sales data
>這邊我們使用 [Product sales.csv](https://github.com/johnashu/datacamp/blob/master/Sales/sales-feb-2015.csv)
![](https://i.imgur.com/LcTm18k.png)
### Resampling (重新取樣)
* Statistical methods over different time intervals
* mean(), sum(), count(), etc.
* Down-sampling
* reduce datetime rows to slower frequency
* Up-sampling
* increase datetime rows to faster frequency
### Aggregating means | resample()
> 時間資料的重碩,將 datetime 資料轉成你要的時間range
* df.resample() [doc](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html)
* 在datetime的形式下,他可以做到對指定的時間區間內的值,同時做一個運算動作。
* 下面他是以一天('D')為時區,將每筆同一天內的資料取平均值。
* 其他像'3T'代表每三分鐘,'30S'代表每30秒。
![](https://i.imgur.com/wZPVoGL.png)
> 同樣的事,如果我們用一般的方式,會比較麻煩。
![](https://i.imgur.com/f9937wR.png)
> 也可以加入sum()和 max()
![](https://i.imgur.com/Rsfpxkh.png)
![](https://i.imgur.com/SoBL0d2.png)
> 對字串可以用 count() 看次數
>
![](https://i.imgur.com/VQgeOSv.png)
>各種代號對應的時間
![](https://i.imgur.com/7lcE0xC.png)
>兩周為一個間格
![](https://i.imgur.com/W6nO6kP.png)
>先抓出指定兩個時間點之間的資料
![](https://i.imgur.com/r692iXl.png)
>在切成4小時一個資料,空的填補前一個值
![](https://i.imgur.com/mC9sU9B.png)
## 3. Manipulating time series data
### Sales data
>這邊我們使用 [Product sales.csv](https://github.com/johnashu/datacamp/blob/master/Sales/sales-feb-2015.csv)
![](https://i.imgur.com/uaWc82f.png)
### String methods | .str
> panda 裡 .str (string)的處理方法
* df[column].str [doc](https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html) [doc_細](https://pandas.pydata.org/pandas-docs/stable/reference/series.html#api-series-str)
![](https://i.imgur.com/iid74Wh.png)
> str.contain() 可以判斷是否含有指定的字串。
![](https://i.imgur.com/NsO8mVG.png)
### Boolean arithmetic
> 布林值的規則
![](https://i.imgur.com/f3rXgnH.png)
* 可以知道 True 代表1 false 代表0,利用此特性可以知道有幾個true。
![](https://i.imgur.com/7tbxgIt.png)
### Datetime methods | .dt
> panda 下的 .dt(datetime) 處理方法
* df[column].dt [doc](https://pandas.pydata.org/pandas-docs/stable/reference/series.html#api-series-dt)
![](https://i.imgur.com/7XrmvJc.png)
> 設定時區
![](https://i.imgur.com/1XDKOf4.png)
> 轉換時區
![](https://i.imgur.com/xOROqSX.png)
> 利用 python 的特性,可以連著用,但是前後順序一樣。
![](https://i.imgur.com/7xM6aOx.png)
### World Population
>這邊我們用 [world_population.csv](https://github.com/johnashu/datacamp/blob/master/world_population.csv),統整一下上面所學的方法。
![](https://i.imgur.com/b75h8sx.png)
>resample() 重新定義時間區間
![](https://i.imgur.com/P6wX5Ve.png)
>用線性的方式填補空值
* interpolate() [doc](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.interpolate.html)
![](https://i.imgur.com/lOuw5T4.png)
## 4. Time series visualization
> 時間序列的視覺化
### S&P 500 Data
> [sp500.csv](https://github.com/johnashu/datacamp/blob/master/sp500.csv)
![](https://i.imgur.com/8uzAwOH.png)
### Pandas plot
> 折線圖
![](https://i.imgur.com/7kxD5Qf.png)
![](https://i.imgur.com/s9gCkWU.png)
> 標題和x、y軸標籤
![](https://i.imgur.com/NBjfdHU.png)
![](https://i.imgur.com/cHjJMxw.png)
### One week
![](https://i.imgur.com/jTzE8JC.png)
![](https://i.imgur.com/ZFjGABV.png)
### Plot styles | plot(style=' ')
![](https://i.imgur.com/g0sIULh.png)
![](https://i.imgur.com/3Pn131A.png)
> 其他風格
* Style format string
* color (k: black)
* marker (. : dot)
* line type (-: solid)
![](https://i.imgur.com/SLEVOvL.png)
### Area plot
> 面積圖
![](https://i.imgur.com/dIQ160f.png)
![](https://i.imgur.com/chKcUwA.png)
### Multiple columns
> 多變數(同個圖)
![](https://i.imgur.com/EkLJAQo.png)
![](https://i.imgur.com/6gTriSS.png)
### Subplots
> 多變數(多個圖)
![](https://i.imgur.com/nHOyFs5.png)
![](https://i.imgur.com/vT1WqzZ.png)