# 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)