{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pandas 簡介"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas 是 Python 裡面被用來作資料分析及整理最常用的套件。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 這一份筆記主要說明以下重點:\n",
"\n",
"* 資料結構及其基本操作\n",
" - Series\n",
" - DataFrame\n",
"* 網路資料存取\n",
"* 資料視覺化\n",
"\n",
"參考資料:\n",
"\n",
"* [Python Data Analysis Library](http://pandas.pydata.org/)\n",
"* [Pandas Cookbook](http://pandas.pydata.org/pandas-docs/version/0.18.0/cookbook.html)\n",
"* [Pandas 入門介紹](https://github.com/Wei1234c/Introduction_to_Pandas)\n",
"* [Financial Time Series](https://github.com/yhilpisch/py4fi/blob/master/ipython3/06_Financial_Time_Series.ipynb)\n",
"* [Pandas API references](http://pandas.pydata.org/pandas-docs/stable/api.html#api-dataframe-stats)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.23.4'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"pd.__version__"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"from datetime import datetime"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas 的資料結構"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Series"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"1 2\n",
"2 3\n",
"3 4\n",
"4 5\n",
"dtype: int64"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s = pd.Series([1, 2, 3, 4, 5])\n",
"s"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"1 2\n",
"2 3\n",
"3 4\n",
"4 5\n",
"dtype: int64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u = pd.Series([1, 2, 3, 4, 5])\n",
"u"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 2\n",
"1 4\n",
"2 6\n",
"3 8\n",
"4 10\n",
"dtype: int64"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s+u"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Series 跟 ndarray 有什麼不同呢?"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3, 4, 5], dtype=int64)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s.values"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RangeIndex(start=0, stop=5, step=1)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s.index"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### index 可以在創建 Series 時指定"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"s = pd.Series(range(5), index=list('abcde'))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"a 0\n",
"b 1\n",
"c 2\n",
"d 3\n",
"e 4\n",
"dtype: int64"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"u.index = list('bcdef')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"b 1\n",
"c 2\n",
"d 3\n",
"e 4\n",
"f 5\n",
"dtype: int64"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"a NaN\n",
"b 2.0\n",
"c 4.0\n",
"d 6.0\n",
"e 8.0\n",
"f NaN\n",
"dtype: float64"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s+u"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### index 也可以在創建完 Series 後指定"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"f 0\n",
"g 1\n",
"h 2\n",
"i 3\n",
"j 4\n",
"dtype: int64"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s.index = list('fghij')\n",
"s"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 什麼是 reindex?"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"h 2.0\n",
"i 3.0\n",
"j 4.0\n",
"a NaN\n",
"b NaN\n",
"c NaN\n",
"d NaN\n",
"dtype: float64"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s.reindex(list('hijabcd'))"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"f 0\n",
"g 1\n",
"h 2\n",
"i 3\n",
"j 4\n",
"dtype: int64"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dtype('int64')"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s.dtype"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(5,)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s.shape"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s.ndim"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"f 0\n",
"g 1\n",
"h 2\n",
"i 3\n",
"j 4\n",
"dtype: int64"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s['i']"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"f 0\n",
"g 1\n",
"h 2\n",
"dtype: int64"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s['f':'h']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### DataFrame"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"data = np.random.randn(10, 4)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 0 | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.017341 | \n",
" -0.509292 | \n",
" 0.323202 | \n",
" 2.280254 | \n",
"
\n",
" \n",
" | 1 | \n",
" 0.667636 | \n",
" 0.771886 | \n",
" -1.021116 | \n",
" 0.592380 | \n",
"
\n",
" \n",
" | 2 | \n",
" -0.344540 | \n",
" 0.712854 | \n",
" -1.045454 | \n",
" -0.574233 | \n",
"
\n",
" \n",
" | 3 | \n",
" -1.219426 | \n",
" 2.261405 | \n",
" 0.614903 | \n",
" 1.392151 | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.442346 | \n",
" 1.658667 | \n",
" -0.814581 | \n",
" -0.404168 | \n",
"
\n",
" \n",
" | 5 | \n",
" 0.800603 | \n",
" 1.290343 | \n",
" -0.347460 | \n",
" -0.416515 | \n",
"
\n",
" \n",
" | 6 | \n",
" 0.403678 | \n",
" -0.550889 | \n",
" 1.800699 | \n",
" 1.266145 | \n",
"
\n",
" \n",
" | 7 | \n",
" 0.173590 | \n",
" 1.302377 | \n",
" 0.325026 | \n",
" -1.873474 | \n",
"
\n",
" \n",
" | 8 | \n",
" -0.072158 | \n",
" -0.471311 | \n",
" -0.149136 | \n",
" -0.313090 | \n",
"
\n",
" \n",
" | 9 | \n",
" 0.087755 | \n",
" -0.765110 | \n",
" 1.003228 | \n",
" -0.418311 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 0 1 2 3\n",
"0 0.017341 -0.509292 0.323202 2.280254\n",
"1 0.667636 0.771886 -1.021116 0.592380\n",
"2 -0.344540 0.712854 -1.045454 -0.574233\n",
"3 -1.219426 2.261405 0.614903 1.392151\n",
"4 0.442346 1.658667 -0.814581 -0.404168\n",
"5 0.800603 1.290343 -0.347460 -0.416515\n",
"6 0.403678 -0.550889 1.800699 1.266145\n",
"7 0.173590 1.302377 0.325026 -1.873474\n",
"8 -0.072158 -0.471311 -0.149136 -0.313090\n",
"9 0.087755 -0.765110 1.003228 -0.418311"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.DataFrame(data)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" No1 | \n",
" No2 | \n",
" No3 | \n",
" No4 | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 0.017341 | \n",
" -0.509292 | \n",
" 0.323202 | \n",
" 2.280254 | \n",
"
\n",
" \n",
" | 1 | \n",
" 0.667636 | \n",
" 0.771886 | \n",
" -1.021116 | \n",
" 0.592380 | \n",
"
\n",
" \n",
" | 2 | \n",
" -0.344540 | \n",
" 0.712854 | \n",
" -1.045454 | \n",
" -0.574233 | \n",
"
\n",
" \n",
" | 3 | \n",
" -1.219426 | \n",
" 2.261405 | \n",
" 0.614903 | \n",
" 1.392151 | \n",
"
\n",
" \n",
" | 4 | \n",
" 0.442346 | \n",
" 1.658667 | \n",
" -0.814581 | \n",
" -0.404168 | \n",
"
\n",
" \n",
" | 5 | \n",
" 0.800603 | \n",
" 1.290343 | \n",
" -0.347460 | \n",
" -0.416515 | \n",
"
\n",
" \n",
" | 6 | \n",
" 0.403678 | \n",
" -0.550889 | \n",
" 1.800699 | \n",
" 1.266145 | \n",
"
\n",
" \n",
" | 7 | \n",
" 0.173590 | \n",
" 1.302377 | \n",
" 0.325026 | \n",
" -1.873474 | \n",
"
\n",
" \n",
" | 8 | \n",
" -0.072158 | \n",
" -0.471311 | \n",
" -0.149136 | \n",
" -0.313090 | \n",
"
\n",
" \n",
" | 9 | \n",
" 0.087755 | \n",
" -0.765110 | \n",
" 1.003228 | \n",
" -0.418311 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" No1 No2 No3 No4\n",
"0 0.017341 -0.509292 0.323202 2.280254\n",
"1 0.667636 0.771886 -1.021116 0.592380\n",
"2 -0.344540 0.712854 -1.045454 -0.574233\n",
"3 -1.219426 2.261405 0.614903 1.392151\n",
"4 0.442346 1.658667 -0.814581 -0.404168\n",
"5 0.800603 1.290343 -0.347460 -0.416515\n",
"6 0.403678 -0.550889 1.800699 1.266145\n",
"7 0.173590 1.302377 0.325026 -1.873474\n",
"8 -0.072158 -0.471311 -0.149136 -0.313090\n",
"9 0.087755 -0.765110 1.003228 -0.418311"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.columns = ['No1', 'No2', 'No3', 'No4']\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" No1 | \n",
" No2 | \n",
" No3 | \n",
" No4 | \n",
"
\n",
" \n",
" \n",
" \n",
" | 2016-01-01 | \n",
" 0.017341 | \n",
" -0.509292 | \n",
" 0.323202 | \n",
" 2.280254 | \n",
"
\n",
" \n",
" | 2016-01-02 | \n",
" 0.667636 | \n",
" 0.771886 | \n",
" -1.021116 | \n",
" 0.592380 | \n",
"
\n",
" \n",
" | 2016-01-03 | \n",
" -0.344540 | \n",
" 0.712854 | \n",
" -1.045454 | \n",
" -0.574233 | \n",
"
\n",
" \n",
" | 2016-01-04 | \n",
" -1.219426 | \n",
" 2.261405 | \n",
" 0.614903 | \n",
" 1.392151 | \n",
"
\n",
" \n",
" | 2016-01-05 | \n",
" 0.442346 | \n",
" 1.658667 | \n",
" -0.814581 | \n",
" -0.404168 | \n",
"
\n",
" \n",
" | 2016-01-06 | \n",
" 0.800603 | \n",
" 1.290343 | \n",
" -0.347460 | \n",
" -0.416515 | \n",
"
\n",
" \n",
" | 2016-01-07 | \n",
" 0.403678 | \n",
" -0.550889 | \n",
" 1.800699 | \n",
" 1.266145 | \n",
"
\n",
" \n",
" | 2016-01-08 | \n",
" 0.173590 | \n",
" 1.302377 | \n",
" 0.325026 | \n",
" -1.873474 | \n",
"
\n",
" \n",
" | 2016-01-09 | \n",
" -0.072158 | \n",
" -0.471311 | \n",
" -0.149136 | \n",
" -0.313090 | \n",
"
\n",
" \n",
" | 2016-01-10 | \n",
" 0.087755 | \n",
" -0.765110 | \n",
" 1.003228 | \n",
" -0.418311 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" No1 No2 No3 No4\n",
"2016-01-01 0.017341 -0.509292 0.323202 2.280254\n",
"2016-01-02 0.667636 0.771886 -1.021116 0.592380\n",
"2016-01-03 -0.344540 0.712854 -1.045454 -0.574233\n",
"2016-01-04 -1.219426 2.261405 0.614903 1.392151\n",
"2016-01-05 0.442346 1.658667 -0.814581 -0.404168\n",
"2016-01-06 0.800603 1.290343 -0.347460 -0.416515\n",
"2016-01-07 0.403678 -0.550889 1.800699 1.266145\n",
"2016-01-08 0.173590 1.302377 0.325026 -1.873474\n",
"2016-01-09 -0.072158 -0.471311 -0.149136 -0.313090\n",
"2016-01-10 0.087755 -0.765110 1.003228 -0.418311"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.index = pd.date_range('2016-01-01', periods=10)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"No1 0.800603\n",
"No2 1.290343\n",
"No3 -0.347460\n",
"No4 -0.416515\n",
"Name: 2016-01-06 00:00:00, dtype: float64"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.loc['2016-01-06']"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" No1 | \n",
" No2 | \n",
" No3 | \n",
" No4 | \n",
"
\n",
" \n",
" \n",
" \n",
" | 2016-01-06 | \n",
" 0.800603 | \n",
" 1.290343 | \n",
" -0.347460 | \n",
" -0.416515 | \n",
"
\n",
" \n",
" | 2016-01-07 | \n",
" 0.403678 | \n",
" -0.550889 | \n",
" 1.800699 | \n",
" 1.266145 | \n",
"
\n",
" \n",
" | 2016-01-08 | \n",
" 0.173590 | \n",
" 1.302377 | \n",
" 0.325026 | \n",
" -1.873474 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" No1 No2 No3 No4\n",
"2016-01-06 0.800603 1.290343 -0.347460 -0.416515\n",
"2016-01-07 0.403678 -0.550889 1.800699 1.266145\n",
"2016-01-08 0.173590 1.302377 0.325026 -1.873474"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['2016-01-06':'2016-01-08']"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.drop(datetime(2016, 1, 3), inplace=True)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.index=range(9)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"No1 0.667636\n",
"No2 0.771886\n",
"No3 -1.021116\n",
"No4 0.592380\n",
"Name: 2016-01-02 00:00:00, dtype: float64"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.iloc[1]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.drop(4)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" No1 | \n",
" No2 | \n",
" No3 | \n",
" No4 | \n",
"
\n",
" \n",
" \n",
" \n",
" | 2016-01-01 | \n",
" 0.017341 | \n",
" -0.509292 | \n",
" 0.323202 | \n",
" 2.280254 | \n",
"
\n",
" \n",
" | 2016-01-02 | \n",
" 0.667636 | \n",
" 0.771886 | \n",
" -1.021116 | \n",
" 0.592380 | \n",
"
\n",
" \n",
" | 2016-01-03 | \n",
" -0.344540 | \n",
" 0.712854 | \n",
" -1.045454 | \n",
" -0.574233 | \n",
"
\n",
" \n",
" | 2016-01-04 | \n",
" -1.219426 | \n",
" 2.261405 | \n",
" 0.614903 | \n",
" 1.392151 | \n",
"
\n",
" \n",
" | 2016-01-05 | \n",
" 0.442346 | \n",
" 1.658667 | \n",
" -0.814581 | \n",
" -0.404168 | \n",
"
\n",
" \n",
" | 2016-01-06 | \n",
" 0.800603 | \n",
" 1.290343 | \n",
" -0.347460 | \n",
" -0.416515 | \n",
"
\n",
" \n",
" | 2016-01-07 | \n",
" 0.403678 | \n",
" -0.550889 | \n",
" 1.800699 | \n",
" 1.266145 | \n",
"
\n",
" \n",
" | 2016-01-08 | \n",
" 0.173590 | \n",
" 1.302377 | \n",
" 0.325026 | \n",
" -1.873474 | \n",
"
\n",
" \n",
" | 2016-01-09 | \n",
" -0.072158 | \n",
" -0.471311 | \n",
" -0.149136 | \n",
" -0.313090 | \n",
"
\n",
" \n",
" | 2016-01-10 | \n",
" 0.087755 | \n",
" -0.765110 | \n",
" 1.003228 | \n",
" -0.418311 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" No1 No2 No3 No4\n",
"2016-01-01 0.017341 -0.509292 0.323202 2.280254\n",
"2016-01-02 0.667636 0.771886 -1.021116 0.592380\n",
"2016-01-03 -0.344540 0.712854 -1.045454 -0.574233\n",
"2016-01-04 -1.219426 2.261405 0.614903 1.392151\n",
"2016-01-05 0.442346 1.658667 -0.814581 -0.404168\n",
"2016-01-06 0.800603 1.290343 -0.347460 -0.416515\n",
"2016-01-07 0.403678 -0.550889 1.800699 1.266145\n",
"2016-01-08 0.173590 1.302377 0.325026 -1.873474\n",
"2016-01-09 -0.072158 -0.471311 -0.149136 -0.313090\n",
"2016-01-10 0.087755 -0.765110 1.003228 -0.418311"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-01 0.017341\n",
"2016-01-02 0.667636\n",
"2016-01-03 -0.344540\n",
"2016-01-04 -1.219426\n",
"2016-01-05 0.442346\n",
"2016-01-06 0.800603\n",
"2016-01-07 0.403678\n",
"2016-01-08 0.173590\n",
"2016-01-09 -0.072158\n",
"2016-01-10 0.087755\n",
"Freq: D, Name: No1, dtype: float64"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['No1']"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" No1 | \n",
"
\n",
" \n",
" \n",
" \n",
" | 2016-01-01 | \n",
" 0.017341 | \n",
"
\n",
" \n",
" | 2016-01-02 | \n",
" 0.667636 | \n",
"
\n",
" \n",
" | 2016-01-03 | \n",
" -0.344540 | \n",
"
\n",
" \n",
" | 2016-01-04 | \n",
" -1.219426 | \n",
"
\n",
" \n",
" | 2016-01-05 | \n",
" 0.442346 | \n",
"
\n",
" \n",
" | 2016-01-06 | \n",
" 0.800603 | \n",
"
\n",
" \n",
" | 2016-01-07 | \n",
" 0.403678 | \n",
"
\n",
" \n",
" | 2016-01-08 | \n",
" 0.173590 | \n",
"
\n",
" \n",
" | 2016-01-09 | \n",
" -0.072158 | \n",
"
\n",
" \n",
" | 2016-01-10 | \n",
" 0.087755 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" No1\n",
"2016-01-01 0.017341\n",
"2016-01-02 0.667636\n",
"2016-01-03 -0.344540\n",
"2016-01-04 -1.219426\n",
"2016-01-05 0.442346\n",
"2016-01-06 0.800603\n",
"2016-01-07 0.403678\n",
"2016-01-08 0.173590\n",
"2016-01-09 -0.072158\n",
"2016-01-10 0.087755"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[['No1']]"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" No1 | \n",
" No3 | \n",
"
\n",
" \n",
" \n",
" \n",
" | 2016-01-01 | \n",
" 0.017341 | \n",
" 0.323202 | \n",
"
\n",
" \n",
" | 2016-01-02 | \n",
" 0.667636 | \n",
" -1.021116 | \n",
"
\n",
" \n",
" | 2016-01-03 | \n",
" -0.344540 | \n",
" -1.045454 | \n",
"
\n",
" \n",
" | 2016-01-04 | \n",
" -1.219426 | \n",
" 0.614903 | \n",
"
\n",
" \n",
" | 2016-01-05 | \n",
" 0.442346 | \n",
" -0.814581 | \n",
"
\n",
" \n",
" | 2016-01-06 | \n",
" 0.800603 | \n",
" -0.347460 | \n",
"
\n",
" \n",
" | 2016-01-07 | \n",
" 0.403678 | \n",
" 1.800699 | \n",
"
\n",
" \n",
" | 2016-01-08 | \n",
" 0.173590 | \n",
" 0.325026 | \n",
"
\n",
" \n",
" | 2016-01-09 | \n",
" -0.072158 | \n",
" -0.149136 | \n",
"
\n",
" \n",
" | 2016-01-10 | \n",
" 0.087755 | \n",
" 1.003228 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" No1 No3\n",
"2016-01-01 0.017341 0.323202\n",
"2016-01-02 0.667636 -1.021116\n",
"2016-01-03 -0.344540 -1.045454\n",
"2016-01-04 -1.219426 0.614903\n",
"2016-01-05 0.442346 -0.814581\n",
"2016-01-06 0.800603 -0.347460\n",
"2016-01-07 0.403678 1.800699\n",
"2016-01-08 0.173590 0.325026\n",
"2016-01-09 -0.072158 -0.149136\n",
"2016-01-10 0.087755 1.003228"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df[['No1','No3']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用 Pandas 作資料存取\n",
"\n",
"### 這一部分包括底下幾個重點:\n",
"\n",
"* read_csv() 的使用\n",
"* read_html() 的使用\n",
"* 如何抓取股市資訊?\n",
"\n",
"底下練習一下將 [台灣證券交易所 - 加權股價指數歷史資料](http://www.tse.com.tw/ch/trading/indices/MI_5MINS_HIST/MI_5MINS_HIST.php#) 的資料轉成 DataFrame。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 使用 read_csv() 讀取資料\n",
"\n",
"參考連結:[pandas.read_csv](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_csv(\"data/MI_5MINS_HIST10603.csv\", encoding=\"Big5\", header=1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.drop(df.index[len(df.index)-1], inplace=True)\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 使用 read_html() 讀取資料\n",
"\n",
"參考連結:[pandas.read_html](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_html.html)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import requests\n",
"from bs4 import BeautifulSoup"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"r = requests.get(\"http://www.tse.com.tw/ch/trading/indices/MI_5MINS_HIST/MI_5MINS_HIST.php\")\n",
"r.encoding = 'Big5'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"soup = BeautifulSoup(r.text, \"lxml\")\n",
"tables = soup.select(\"table.board_trad\")\n",
"tables"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"type(tables[0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df_list = pd.read_html(str(tables[0]), header=1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df_list[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 使用 Pandas 讀取股價資訊\n",
"\n",
"參考資料:[pandas-datareadre 說明文件](https://pandas-datareader.readthedocs.io/en/latest/)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [],
"source": [
"import pandas_datareader.data as web\n",
"from datetime import datetime"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" High | \n",
" Low | \n",
" Open | \n",
" Close | \n",
" Volume | \n",
" Adj Close | \n",
"
\n",
" \n",
" | Date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 2018-01-02 | \n",
" 322.109985 | \n",
" 311.000000 | \n",
" 312.000000 | \n",
" 320.529999 | \n",
" 4352200 | \n",
" 320.529999 | \n",
"
\n",
" \n",
" | 2018-01-03 | \n",
" 325.250000 | \n",
" 315.549988 | \n",
" 321.000000 | \n",
" 317.250000 | \n",
" 4521500 | \n",
" 317.250000 | \n",
"
\n",
" \n",
" | 2018-01-04 | \n",
" 318.549988 | \n",
" 305.679993 | \n",
" 312.869995 | \n",
" 314.619995 | \n",
" 9946300 | \n",
" 314.619995 | \n",
"
\n",
" \n",
" | 2018-01-05 | \n",
" 317.239990 | \n",
" 312.000000 | \n",
" 316.619995 | \n",
" 316.579987 | \n",
" 4591200 | \n",
" 316.579987 | \n",
"
\n",
" \n",
" | 2018-01-08 | \n",
" 337.019989 | \n",
" 315.500000 | \n",
" 316.000000 | \n",
" 336.410004 | \n",
" 9859400 | \n",
" 336.410004 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" High Low Open Close Volume \\\n",
"Date \n",
"2018-01-02 322.109985 311.000000 312.000000 320.529999 4352200 \n",
"2018-01-03 325.250000 315.549988 321.000000 317.250000 4521500 \n",
"2018-01-04 318.549988 305.679993 312.869995 314.619995 9946300 \n",
"2018-01-05 317.239990 312.000000 316.619995 316.579987 4591200 \n",
"2018-01-08 337.019989 315.500000 316.000000 336.410004 9859400 \n",
"\n",
" Adj Close \n",
"Date \n",
"2018-01-02 320.529999 \n",
"2018-01-03 317.250000 \n",
"2018-01-04 314.619995 \n",
"2018-01-05 316.579987 \n",
"2018-01-08 336.410004 "
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = web.DataReader(\"TSLA\", 'yahoo', datetime(2018,1,1))\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" High | \n",
" Low | \n",
" Open | \n",
" Close | \n",
" Volume | \n",
" Adj Close | \n",
"
\n",
" \n",
" | Date | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 2019-02-27 | \n",
" 316.299988 | \n",
" 300.549988 | \n",
" 301.779999 | \n",
" 314.739990 | \n",
" 11183900 | \n",
" 314.739990 | \n",
"
\n",
" \n",
" | 2019-02-28 | \n",
" 320.000000 | \n",
" 310.809998 | \n",
" 318.920013 | \n",
" 319.880005 | \n",
" 10520700 | \n",
" 319.880005 | \n",
"
\n",
" \n",
" | 2019-03-01 | \n",
" 307.130005 | \n",
" 291.899994 | \n",
" 306.940002 | \n",
" 294.790009 | \n",
" 22911400 | \n",
" 294.790009 | \n",
"
\n",
" \n",
" | 2019-03-04 | \n",
" 299.000000 | \n",
" 282.779999 | \n",
" 298.119995 | \n",
" 285.359985 | \n",
" 17096800 | \n",
" 285.359985 | \n",
"
\n",
" \n",
" | 2019-03-05 | \n",
" 284.000000 | \n",
" 270.100006 | \n",
" 282.000000 | \n",
" 276.540009 | \n",
" 18742000 | \n",
" 276.540009 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" High Low Open Close Volume \\\n",
"Date \n",
"2019-02-27 316.299988 300.549988 301.779999 314.739990 11183900 \n",
"2019-02-28 320.000000 310.809998 318.920013 319.880005 10520700 \n",
"2019-03-01 307.130005 291.899994 306.940002 294.790009 22911400 \n",
"2019-03-04 299.000000 282.779999 298.119995 285.359985 17096800 \n",
"2019-03-05 284.000000 270.100006 282.000000 276.540009 18742000 \n",
"\n",
" Adj Close \n",
"Date \n",
"2019-02-27 314.739990 \n",
"2019-02-28 319.880005 \n",
"2019-03-01 294.790009 \n",
"2019-03-04 285.359985 \n",
"2019-03-05 276.540009 "
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.tail()"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df['Close'].plot()"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" High | \n",
" Low | \n",
" Open | \n",
" Close | \n",
" Volume | \n",
" Adj Close | \n",
"
\n",
" \n",
" \n",
" \n",
" | count | \n",
" 294.000000 | \n",
" 294.000000 | \n",
" 294.000000 | \n",
" 294.000000 | \n",
" 2.940000e+02 | \n",
" 294.000000 | \n",
"
\n",
" \n",
" | mean | \n",
" 322.633844 | \n",
" 309.736734 | \n",
" 316.283537 | \n",
" 316.451361 | \n",
" 8.586550e+06 | \n",
" 316.451361 | \n",
"
\n",
" \n",
" | std | \n",
" 27.783457 | \n",
" 27.533607 | \n",
" 27.404674 | \n",
" 27.533084 | \n",
" 4.892061e+06 | \n",
" 27.533084 | \n",
"
\n",
" \n",
" | min | \n",
" 260.329987 | \n",
" 244.589996 | \n",
" 252.779999 | \n",
" 250.559998 | \n",
" 3.080700e+06 | \n",
" 250.559998 | \n",
"
\n",
" \n",
" | 25% | \n",
" 302.924995 | \n",
" 291.412491 | \n",
" 297.700012 | \n",
" 296.814995 | \n",
" 5.570000e+06 | \n",
" 296.814995 | \n",
"
\n",
" \n",
" | 50% | \n",
" 322.024994 | \n",
" 308.904999 | \n",
" 315.689987 | \n",
" 315.910004 | \n",
" 7.135900e+06 | \n",
" 315.910004 | \n",
"
\n",
" \n",
" | 75% | \n",
" 347.147499 | \n",
" 333.237511 | \n",
" 339.655006 | \n",
" 339.727501 | \n",
" 9.507275e+06 | \n",
" 339.727501 | \n",
"
\n",
" \n",
" | max | \n",
" 387.459991 | \n",
" 367.119995 | \n",
" 375.000000 | \n",
" 379.570007 | \n",
" 3.364970e+07 | \n",
" 379.570007 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" High Low Open Close Volume \\\n",
"count 294.000000 294.000000 294.000000 294.000000 2.940000e+02 \n",
"mean 322.633844 309.736734 316.283537 316.451361 8.586550e+06 \n",
"std 27.783457 27.533607 27.404674 27.533084 4.892061e+06 \n",
"min 260.329987 244.589996 252.779999 250.559998 3.080700e+06 \n",
"25% 302.924995 291.412491 297.700012 296.814995 5.570000e+06 \n",
"50% 322.024994 308.904999 315.689987 315.910004 7.135900e+06 \n",
"75% 347.147499 333.237511 339.655006 339.727501 9.507275e+06 \n",
"max 387.459991 367.119995 375.000000 379.570007 3.364970e+07 \n",
"\n",
" Adj Close \n",
"count 294.000000 \n",
"mean 316.451361 \n",
"std 27.533084 \n",
"min 250.559998 \n",
"25% 296.814995 \n",
"50% 315.910004 \n",
"75% 339.727501 \n",
"max 379.570007 "
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"DatetimeIndex: 294 entries, 2018-01-02 to 2019-03-05\n",
"Data columns (total 6 columns):\n",
"High 294 non-null float64\n",
"Low 294 non-null float64\n",
"Open 294 non-null float64\n",
"Close 294 non-null float64\n",
"Volume 294 non-null int64\n",
"Adj Close 294 non-null float64\n",
"dtypes: float64(5), int64(1)\n",
"memory usage: 16.1 KB\n"
]
}
],
"source": [
"df.info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 資料視覺化\n",
"\n",
"Series 跟 DataFrame 都附帶有一個產生各類圖表的 plot(),預設的情況下,它會產生線形圖。\n",
"\n",
"參考資料:[Pandas Plotting](http://pandas.pydata.org/pandas-docs/stable/visualization.html)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s = pd.Series(np.random.randn(10), index=np.arange(10))\n",
"s.plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s.plot(kind=\"bar\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))\n",
"df.plot()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"df.plot(kind='bar')"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}