{"id":14977294,"url":"https://github.com/chanmenglin/datascience","last_synced_at":"2025-10-05T08:53:15.880Z","repository":{"id":171593548,"uuid":"160123223","full_name":"ChanMenglin/DataScience","owner":"ChanMenglin","description":"Data-Science(数据科学)","archived":false,"fork":false,"pushed_at":"2021-08-03T06:34:29.000Z","size":7940,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-01T10:41:38.338Z","etag":null,"topics":["anaconda","charts","data-analysis","data-charts","data-frame","data-science","data-view","ipynb","jupyter","matplotlib","numpy","pandas","pandas-dataframe","pandas-series","python","scikit-learn","seaborn","series-dataframe"],"latest_commit_sha":null,"homepage":"https://chanmenglin.github.io/DataScience/","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ChanMenglin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-12-03T02:49:12.000Z","updated_at":"2022-07-19T05:56:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"7543b0cb-be6e-4164-9fab-906a1c979fb8","html_url":"https://github.com/ChanMenglin/DataScience","commit_stats":null,"previous_names":["chanmenglin/datascience"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChanMenglin%2FDataScience","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChanMenglin%2FDataScience/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChanMenglin%2FDataScience/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChanMenglin%2FDataScience/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ChanMenglin","download_url":"https://codeload.github.com/ChanMenglin/DataScience/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238590593,"owners_count":19497351,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anaconda","charts","data-analysis","data-charts","data-frame","data-science","data-view","ipynb","jupyter","matplotlib","numpy","pandas","pandas-dataframe","pandas-series","python","scikit-learn","seaborn","series-dataframe"],"created_at":"2024-09-24T13:55:25.052Z","updated_at":"2025-10-05T08:53:10.851Z","avatar_url":"https://github.com/ChanMenglin.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 数据科学(Data Science)\n\n\u003e 本仓库的代码全部在 Anaconda 的 [jupyter NoteBook](http://nbviewer.jupyter.org) 中编写\n\n\u003e 数据科学工作流\n\u003e 1. Inquire：通过数据获取什么信息，解决什么问题\n\u003e 2. Obtain：数据如何获取（[Python](https://www.python.org/)）\n\u003e 3. Scrub：数据的清理、整理和分析（[pandas](https://pandas.pydata.org)、[NumPy](http://www.numpy.org)）\n\u003e 4. Explore：展示数据、数据可视化（[MatPlotLib](https://matplotlib.org)、[Seaborn](http://seaborn.pydata.org/#)）\n\u003e 5. Model：通过数据分析和机器学习对数据进行进一步分析和训练（[SciKit-learn](http://scikit-learn.org/)、[SciPy](https://www.scipy.org)、[TensorFlow](https://tensorflow.google.cn)）\n\u003e 6. iNterpret：最终结果展示（[BOKEH](https://bokeh.pydata.org/en/latest/)、[D3.js](https://d3js.org)）\n\n# 目录（Contents）\n\n* [1. 环境搭建](#1-环境搭建)\n* [2. NumPy 入门](#2-numpy-入门)\n    * [2.1 NumPy 中创建数组及访问数组的元素](#21-numpy-中创建数组及访问数组的元素)\n        * [2.1.1 创建数组](#211-创建数组)\n        * [2.1.2 访问数组元素](#212-访问数组元素)\n        * [2.1.3 创建矩阵](#213-创建矩阵)\n    * [2.2 数组和矩阵运算](#22-数组和矩阵运算)\n        * [2.2.1 数组的运算](#221-数组的运算)\n        * [2.2.2 矩阵的运算](#222-矩阵的运算)\n    * [2.3 Array 的 input 和 output](#23-array-的-input-和-output)\n        * [2.3.1 使用 pickle 序列化 numpy array](#231-使用-pickle-序列化-numpy-array)\n        * [2.3.2 使用 numpy 序列化 numpy array](#232-使用-numpy-序列化-numpy-array)\n* [3. pandas 入门](#3-pandas-入门)\n    * [3.1 pandas 中的 Series](#31-pandas-中的-series)\n        * [3.1.1 创建 Series](#311-创建-series)\n        * [3.1.2 Series 操作](#312-series-操作)\n    * [3.2 pandas 中的 DataFrame](#32-pandas-中的-dataframe)\n        * [3.2.1 创建 DataFrame](#321-创建-dataframe)\n        * [3.2.2 DataFrame 操作](#322-dataframe-操作)\n    * [3.3 深入理解 Series 和 DataFrame](#33-深入理解-series-和-dataframe)\n    * [3.4 DataFrame IO](#34-dataframe-io)\n    * [3.5 DataFrame(Selecting 和 Indexing)](#35-dataframeselecting-和-indexing)\n    * [3.6 Reindexing Series 和 DataFrame](#36-reindexing-series-和-dataframe)\n    * [3.7 Mapping 和 Replace](#37-mapping-和-replace)\n    * [3.8 NaN - Not a Number](#38-nan---not-a-number)\n    * [3.9 多级 index](#39-多级-index)\n* [4. pandas 玩转数据](#4-pandas-玩转数据)\n    * [4.1 Series 和 DataFrame 的简单数学运算](#41-series-和-dataframe-的简单数学运算)\n        * [4.1.1 Series 的数学运算](#411-series-的数学运算)\n        * [4.1.2 DataFrame 的数学运算](#412-dataframe-的数学运算)\n    * [4.2 Series 和 DataFrame 的排序](#42-series-和-dataframe-的排序)\n    * [4.3 重命名 DataFrame 的 index](#43-重命名-dataframe-的-index)\n    * [4.4 DataFrame 的 merge 操作](#44-dataframe-的-merge-操作)\n    * [4.5 Concatenate 和 Combine](#45-concatenate-和-combine)\n        * [4.5.1 Concatenate](#451-concatenate)\n        * [4.5.2 Concat](#452-concat)\n        * [4.5.3 Combine](#453-combine)\n    * [4.6 时间序列的操作基础](#46-时间序列的操作基础)\n    * [4.7 其他方法](#47-其他方法)\n        * [4.7.1 数据处理](#471-数据处理)\n        * [4.7.2 数据清洗](#472-数据清洗)\n* [5. 绘图与可视化-MatPlotLib](#5-绘图与可视化-matplotlib)\n    * [5.1 MatPlotLib-线性图](#51-matplotlib-线性图)\n    * [5.2 MatPlotLib-直方图](#52-matplotlib-直方图)\n    * [5.3 MatPlotLib-密度图](#53-matplotlib-密度图)\n    * [5.4 pandas 的 Series 绘图](#54-pandas-的-series-绘图)\n    * [5.5 pandas 的 DataFrame 绘图](#55-pandas-的-dataframe-绘图)\n* [6. 绘图与可视化-SeaBorn](#6-绘图与可视化-seaborn)\n    * [6.1 Seaborn-直方图和密度图](#61-seaborn-直方图和密度图)\n    * [6.2 Seaborn-柱状图和热力图](#62-seaborn-柱状图和热力图)\n    * [6.3 Seaborn-设置图形显示的效果](#63-seaborn-设置图形显示的效果)\n    * [6.4 Seaborn-强大的调色功能](#64-seaborn-强大的调色功能)\n* [7. 数据分析项目实战](#7-数据分析项目实战)\n\n---\n\n* [附录](#附录)\n    * [1. 数据可续领域5个组建 Python 库](#1-数据科学领域5个组建-python-库)\n    * [2. 数学基础-矩阵运算](#2-数学基础-矩阵运算)\n    * [3. 工具使用 Jupyter Notebook](#3-工具使用-jupyter-notebook)\n    * [4. 数据可视化工具](#4-数据可视化工具)\n\n---\n\n## 1. 环境搭建\n\n各种平台使用 [Anaconda](https://www.anaconda.com/download/#macos) 搭建数据分析开发环境\n\n环境搭建可参考 \t\nTimothy老师的 [搭建开发环境，跨平台原理](http://sa.mentorx.net/course/54/task/321/show)\n\n## 2. NumPy 入门\n\n高效的数据结构 Array（数组）介绍，是学习其他高级数据结构的基础\n\n[NumPy Docs](https://docs.scipy.org/doc/numpy/user/quickstart.html)\n\n### 2.1 NumPy 中创建数组及访问数组的元素\n\n[NumPy 中创建数组及访问数组的元素](Code/1-NumPy/NumPy中创建数组及访问数组的元素.ipynb)  \n\n#### 2.1.1 创建数组\n\n```python\nimport numpy as np\n\n# 创建一维数组\n# 通过 python list 创建\nlist_1 = [1, 2, 3, 4] # [1, 2, 3, 4]\narray_1 = np.array(list_1) # array([1, 2, 3, 4])\n\n# 创建二维数组\nlist_2 = [5, 6, 7, 8]\narray_2 = np.array([list_1, list_2])\n# array([[1, 2, 3, 4],\n#      [5, 6, 7, 8]])\n\n# array_1 是一个一维数组\n# array_2 是一个二维数组\n\n# 其他创建数组的方法\n# 快速创建一个 1-10（不含10）的数组，间隔默认为1\narray_4 = np.arange(1, 10) # array([1, 2, 3, 4, 5, 6, 7, 8, 9])\n\n# 参数依次为：起始值（包含），结束值（不包含），间隔\narray_4 = np.arange(1, 10, 2) # array([1, 3, 5, 7, 9])\n\n# 快速创建数组\n# 创建一个随机元素的 10 位一维数组（元素符合正态分布）\nnp.random.randn(10)\n\n# 返回一个 10 以内的 int 型 随机数\nnp.random.randint(10)\n\n# 返回一个 10 以内的 int 型 2 乘 3 的二维数组\nnp.random.randint(10, size=(2, 3))\n\n# 返回一个 10 以内的 int 型 20 位的一维数组\nnp.random.randint(10, size=20)\n\n# 将一个 10 以内的 int 型 20 位的一维数组，转换为一个 4 乘 5 的二维数组\nnp.random.randint(10, size=20).reshape(4, 5)\n```\n\n#### 2.1.2 访问数组元素\n\n```python\nimport numpy as np\n\n\n# 获取数组属性\n\n# array_2\n# array([[1, 2, 3, 4],\n#      [5, 6, 7, 8]])\n\n# 获取元祖\narray_2.shape # (2, 4) 表示为一个 2 行 4 列的数组\n\n# 获取数组中元素的个数\narray_2.size # 8\n\n# 返回数组中元素的数据类型\n# 当数组中元素的数据类型不一致时会返回范围最广的那个\narray_2.dtype # dtype('int64')\n\n# a\n# array([1, 2, 3, 4, 5, 6, 7, 8, 9])\n\n# a 的第 0 位\na[0] # 1\n\n# a 的 第 1 位到第 4 位\na[1:5] # array([2, 3, 4, 5])\n\n# b\n# array([[1, 2, 3],\n#        [4, 5, 6]])\n\n# b 的第 1 行第 0 个元素\nb[1][0] # 4\n\n# b 的第 1 行第 0 个元素\nb[1, 0] # 4 等同于 b[1][0]\n\n#\b c\n# array([[1, 2, 3],\n#        [4, 5, 6],\n#        [7, 8, 9]])\n\n# 取 c 的第 0、1 行第 1、2 列\nc[:2 ,1:]\n# array([[2, 3],\n#        [5, 6]])\n\n# \bc\n# \barray([[1, 2, 2, 6, 8],\n# \b       [0, 4, 4, 6, 8],\n# \b       [7, 8, 1, 0, 8],\n# \b       [7, 2, 4, 0, 5]])\n\n# 返回 c 中 唯一的（不重复）的值\nnp.unique(c) # array([0, 1, 2, 4, 5, 6, 7, 8])\n\n# 求和，多维数组所有列的和\nsum(c) # array([15, 16, 11, 12, 29])\n\n# 求和，多维数组第 0 行的和\nsum(c[0]) # 19\n\n# 求和，多维数组第 0 列的和\nsum(c[:, 0]) # 15\n\n# 数组中的最大值\nc.max() # 8\n```\n\n#### 2.1.3 创建矩阵\n\n```python\nimport numpy as np\n\n# 创建特殊矩阵\n\n# 创建一维全0矩阵，5 为位数\nnp.zeros(5) # array([0., 0., 0., 0., 0.])\n\n# 创建二维矩阵全0矩阵\nnp.zeros([2, 3]) \n# array([[0., 0., 0.],\n#        [0., 0., 0.]])\n\n# 创建单位矩阵 5 乘 5\nnp.eye(5) \n# array([[1., 0., 0., 0., 0.],\n#        [0., 1., 0., 0., 0.],\n#        [0., 0., 1., 0., 0.],\n#        [0., 0., 0., 1., 0.],\n#        [0., 0., 0., 0., 1.]])\n\n# 创建矩阵\n\n# np.mat([[1, 2, 3], [4, 5, 6]])\n# matrix([[1, 2, 3],\n#         [4, 5, 6]])\n\n# 将数组 a 转换成矩阵（数组可转换为矩阵）\nnp.mat(a)\n```\n\n### 2.2 数组和矩阵运算\n\n[数组和矩阵运算](Code/1-NumPy/数组和矩阵运算.ipynb)\n\n#### 2.2.1 数组的运算\n\n```python\nimport numpy as np\n\n# 数组的运算\n\n# a\n# array([[6, 5, 5, 8, 4],\n#        [8, 4, 6, 8, 1],\n#        [5, 7, 1, 5, 8],\n#        [0, 5, 4, 1, 2]])\n# b\n# array([[3, 8, 8, 2, 6],\n#        [8, 1, 2, 5, 1],\n#        [4, 4, 3, 1, 7],\n#        [4, 8, 4, 1, 3]])\n\n# 数组的加法\n# 对应元素的和\na + b\n# array([[ 9, 13, 13, 10, 10],\n#        [16,  5,  8, 13,  2],\n#        [ 9, 11,  4,  6, 15],\n#        [ 4, 13,  8,  2,  5]])\n\n# 数组的减法\n# 对应元素的差\na - b\n# array([[ 3, -3, -3,  6, -2],\n#        [ 0,  3,  4,  3,  0],\n#        [ 1,  3, -2,  4,  1],\n#        [-4, -3,  0,  0, -1]])\n\n# 数组的乘法\n# 对应元素的积\na * b\n# array([[18, 40, 40, 16, 24],\n#        [64,  4, 12, 40,  1],\n#        [20, 28,  3,  5, 56],\n#        [ 0, 40, 16,  1,  6]])\n\n# 数组的除法\n# 对应元素的商（当除数为 0 时，会有警告，结果以 inf 表示）\na / b\n# array([[2.        , 0.625     , 0.625     , 4.        , 0.66666667],\n#        [1.        , 4.        , 3.        , 1.6       , 1.        ],\n#        [1.25      , 1.75      , 0.33333333, 5.        , 1.14285714],\n#        [0.        , 0.625     , 1.        , 1.        , 0.66666667]])\n```\n\n#### 2.2.2 矩阵的运算\n\n```python\nimport numpy as np\n\n# 矩阵的运算\n\n# A\n# matrix([[6, 5, 5, 8, 4],\n#         [8, 4, 6, 8, 1],\n#         [5, 7, 1, 5, 8],\n#         [0, 5, 4, 1, 2]])\n# B\n# matrix([[3, 8, 8, 2, 6],\n#         [8, 1, 2, 5, 1],\n#         [4, 4, 3, 1, 7],\n#         [4, 8, 4, 1, 3]])\n\n# 矩阵的加法\n# 矩阵的加法为对应元素的和\nA + B\n# matrix([[ 9, 13, 13, 10, 10],\n#         [16,  5,  8, 13,  2],\n#         [ 9, 11,  4,  6, 15],\n#         [ 4, 13,  8,  2,  5]])\n\n# 矩阵的减法\n# 矩阵的减法为对应元素的差\nA - B\n# matrix([[ 3, -3, -3,  6, -2],\n#         [ 0,  3,  4,  3,  0],\n#         [ 1,  3, -2,  4,  1],\n#         [-4, -3,  0,  0, -1]])\n\n# 矩阵的乘法\n# 会报错\nA * B\n\n--------\nA = np.mat(np.random.randint(10, size=20).reshape(4, 5))\n# A （A 为 4 乘 5 的矩阵）\n# matrix([[9, 0, 3, 8, 6],\n#         [4, 0, 7, 1, 8],\n#         [4, 7, 2, 2, 7],\n#         [2, 4, 2, 1, 5]])\nB = np.mat(np.random.randint(10, size=20).reshape(5, 4))\n# B （B 为 5 乘 4 的矩阵）\n# matrix([[2, 0, 7, 0],\n#         [4, 7, 3, 6],\n#         [9, 9, 0, 9],\n#         [7, 4, 9, 3],\n#         [2, 1, 4, 4]])\n\n# 4 乘 5 的矩阵与 5 乘 4 的矩阵的积为一个 4 乘 4 的矩阵 \nA * B\n# matrix([[113,  65, 159,  75],\n#         [ 94,  75,  69,  98],\n#         [ 82,  82,  95,  94],\n#         [ 55,  55,  55,  65]])\n\n\n```\n\n### 2.3 Array 的 input 和 output\n\n[Array 的 input 和 output](Code/1-NumPy/Array的input和output.ipynb)\n\n#### 2.3.1 使用 pickle 序列化 numpy array\n\n```python\nimport pickle\nimport numpy as np\n\n# 查看当前目录的文件\n!ls\n\n# 使用 pickle 序列化 numpy array\n# x\n# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])\n\n# 使用 pickle 序列化\nf = open('x.pki', 'wb') # 写二进制文件\npickle.dump(x, f)\n\nf = open('x.pki', 'rb') # 读二进制文件\npickle.load(f)\n\n```\n\n#### 2.3.2 使用 numpy 序列化 numpy array\n\n```python\nimport numpy as np\n\n# 使用 numpy 序列化 numpy array\nnp.save('one_array', x) # 写二进制文件\nnp.load('one_array.npy') # 读二进制文件\n\n# 同时序列化多个数组\nnp.savez('two_array.npz', a=x, b=y) # x、y 均为数组，a、b 分别为 x、y 的别名\n\n# 读多个序列化数组的文件\nc = np.load('two_array.npz')\nc['a'] # 读 a\nc['b'] # 读 b\n```\n\n## 3. pandas 入门\n\n[pandas API](https://pandas.pydata.org/pandas-docs/stable/api.html#)  \npandas 中两种重要的数据结构：[Series](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html#pandas.Series) 和 [DataFrame](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html#pandas.DataFrame)  \n此处可参考我的另一个库：[PandasVersusExcel(Python)](https://chanmenglin.github.io/PandasVersusExcel/) | [Github](https://github.com/ChanMenglin/PandasVersusExcel)\n\n### 3.1 pandas 中的 Series\n\n[pandas 中的 Series](Code/2-pandas/pandas中的Series.ipynb)\n\n#### 3.1.1 创建 Series\n\n```python\nimport numpy as np\nimport pandas as pd\n\n# 创建 Series\n# 通过 list 创建\ns1 = pd.Series([1, 2, 3, 4])\ns1\n# 0    1\n# 1    2\n# 2    3\n# 3    4\n# dtype: int64\n\n# 通过 NumPy 的 Array 创建\ns2 = pd.Series(np.arange(3))\ns2\n# 0    0\n# 1    1\n# 2    2\n# dtype: int64\n\n# 通过 字典 创建\ns3 = pd.Series({'1': 1, '2': 2, '3': 3})\ns3\n# 1    1\n# 2    2\n# 3    3\n# dtype: int64\n\n# 通过其他 Series 创建，当新的 Series 比原先的长时，多出的值为 NaN\nindex_1 = ['A', 'B', 'C', 'D', 'E']\ns5 = pd.Series(s4, index=index_1)\n# s5\n# A    1.0\n# B    2.0\n# C    3.0\n# D    4.0\n# E    NaN\n# dtype: float64\n```\n\n#### 3.1.2 Series 操作\n\n```python\nimport numpy as np\nimport pandas as pd\n\n# Series 操作\n\n# s1\n# 0    1\n# 1    2\n# 2    3\n# 3    4\n# dtype: int64\n\n# 查看 Series 的数据（数据为 array）\ns1.values # array([1, 2, 3, 4])\n\n# 查案 Series 的索引\ns1.index # RangeIndex(start=0, stop=4, step=1)\n\n# 指定 Series 的 index\ns4 = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C', 'D'])\ns4\n# A    1\n# B    2\n# C    3\n# D    4\n# dtype: int64\n\n# 获取 s4 中索引为 A 的元素\ns4['A'] # 1\n\n# 获取 s4 中元素的值大于 2 的数据\ns4[s4\u003e2]\n# C    3\n# D    4\n# dtype: int64\n\n# 将 Series 转换为 字典\ns4.to_dict() # {'A': 1, 'B': 2, 'C': 3, 'D': 4}\n\n--------------------\n# s5\n# A    1.0\n# B    2.0\n# C    3.0\n# D    4.0\n# E    NaN\n# dtype: float64\n\n# 判断空值\npd.isnull(s5)\n# A    False\n# B    False\n# C    False\n# D    False\n# E     True\n# dtype: bool\n\n# 判断非空值\npd.notnull(s5)\n# A     True\n# B     True\n# C     True\n# D     True\n# E    False\n# dtype: bool\n\n# 为 Series 添加名称\ns5.name = 'demo'\n\n# 为 Series 的 index 添加名称\ns5.index.name = 'demo index'\ns5.index # Index(['A', 'B', 'C', 'D', 'E'], dtype='object', name='demo index')\n```\n\n### 3.2 pandas 中的 DataFrame\n\n[pandas 中的 DataFrame](Code/2-pandas/pandas中的DataFrame.ipynb)\n\n\n#### 3.2.1 创建 DataFrame\n\n```python\nimport numpy as np\nimport pandas as pd\nfrom pandas import Series, DataFrame\n\n# 创建 DataFrame\n\n# 通过 webbrowser 打开一个网页\nimport webbrowser\nlink = 'https://www.tiobe.com/tiobe-index/'\nwebbrowser.open(link) # 打开一个网页\n\n# 通过 粘贴板 导入\n# 先复制一个表格（此处为 https://www.tiobe.com/tiobe-index/ 中的编程语言排行榜）\ndf = pd.read_clipboard() # 读取粘贴板并解析，再转换为一个 DataFrame （此处一定要先复制表格后执行）\ndf\n'''\n    Dec 2018\tDec 2017\tChange\tProgramming Language\tRatings\tChange.1\n0\t1\t        1\t NaN\t    Java\t        15.932%\t+2.66%\n1\t2\t        2\t NaN\t    C\t                14.282%\t+4.12%\n2\t3\t        4\tchange\t    Python\t        8.376%\t+4.60%\n3\t4\t        3\tchange\t    C++\t                7.562%\t+2.84%\n4\t5\t        7\tchange\t    Visual Basic .NET\t7.127%\t+4.66%\n'''\n\n# 查看 df 的数据类型\ntype(df) # pandas.core.frame.DataFrame\n```\n\n#### 3.2.2 DataFrame 操作\n\n```python\nimport numpy as np\nimport pandas as pd\nfrom pandas import Series, DataFrame\n\n# DataFrame 操作\n\n# df\n'''\n    Dec 2018\tDec 2017\tChange\tProgramming Language\tRatings\tChange.1\n0\t1\t    1\t        NaN\t    Java\t        15.932%\t+2.66%\n1\t2\t    2\t        NaN\t    C\t                14.282%\t+4.12%\n2\t3\t    4\t        change\t    Python\t        8.376%\t+4.60%\n3\t4\t    3\t        change\t    C++\t                7.562%\t+2.84%\n4\t5\t    7\t        change\t    Visual Basic .NET\t7.127%\t+4.66%\n'''\n\n# 读取 DataFrame 的列名\ndf.columns\n'''\nIndex(['Dec 2018', 'Dec 2017', 'Change', 'Programming Language', 'Ratings',\n       'Change.1'],\n      dtype='object')\n'''\n\n# 获取莫一列的值\ndf.Ratings # 列名\n'''\n0    15.932%\n1    14.282%\n2     8.376%\n3     7.562%\n4     7.127%\nName: Ratings, dtype: object\n'''\n\n# 获取莫一列的值\ndf['Programming Language']\n'''\n0                 Java\n1                    C\n2               Python\n3                  C++\n4    Visual Basic .NET\nName: Programming Language, dtype: object\n'''\n\n# 放回的类型为 Series\ntype(df['Programming Language']) # pandas.core.series.Series\n\n# 数据过滤\ndf_new = pd.DataFrame(df, columns=[ 'Programming Language', 'Dec 2018' ] )\ndf_new\n'''\n\n    Programming Language\tDec 2018\n0\tJava\t                    1\n1\tC\t                    2\n2\tPython\t                    3\n3\tC++\t                    4\n4\tVisual Basic .NET\t    5\n'''\n\n# 当通过之前的 DataFrame 生成新的 DataFrame 且有一列在 原 DataFrame 不存在时（此处为 'Dec 2019'）\ndf_new = pd.DataFrame(df, columns=[ 'Programming Language', 'Dec 2018', 'Dec 2019' ] )\ndf_new\n'''\n\tProgramming Language\tDec 2018\tDec 2019\n0\t    Java\t            1\t        NaN\n1\t    C\t                    2\t        NaN\n2\t    Python\t            3\t        NaN\n3\t    C++\t                    4\t        NaN\n4\t    Visual Basic .NET\t    5\t        NaN\n'''\n\n# 修改 DataFrame 列的值 方法一 通过 list 修改\ndf_new['Dec 2019'] = range(0, 5)\n\n# 修改 DataFrame 列的值 方法二 通过 array 修改\ndf_new['Dec 2019'] = np.arange(0, 5)\n\n# 修改 DataFrame 列的值 方法三 通过 Sreies 修改\ndf_new['Dec 2019'] = pd.Series(np.arange(0, 5))\ndf_new\n# 方法一、方法二、方法三的结果均相同\n'''\n\tProgramming Language\tDec 2018\tDec 2019\n0\t    Java\t            1\t            0\n1\t    C\t                    2\t            1\n2\t    Python\t            3\t            2\n3\t    C++\t                    4\t            3\n4\t    Visual Basic .NET\t    5\t            4\n'''\n\n# 修改 DataFrame 列的指定行值 方法四 通过 Sreies 指定 index 修改(为指定的行默认为 NaN)\ndf_new['Dec 2019'] = pd.Series([100, 200], index=[1, 2])\ndf_new\n'''\n\tProgramming Language\tDec 2018\tDec 2019\n0\t        Java\t            1\t        NaN\n1\t        C\t            2\t        100.0\n2\t        Python\t            3\t        200.0\n3\t        C++\t            4\t        NaN\n4\t        Visual Basic .NET   5\t        NaN\n\n'''\n```\n\n### 3.3 深入理解 Series 和 DataFrame\n\n[深入理解 Series 和 DataFrame](Code/2-pandas/深入理解Series和DataFrame.ipynb)\n\n```python\nimport numpy as np\nimport pandas as pd\n\n# 深入理解 Series 和 DataFrame\n\n# 定义基础数据，后面的实例均基于此基础数据\ndata = {'Country': ['Belgium', 'India', 'Brazil'], \n       'Capital': ['Brussels', 'New Delhi', 'Brasilia'], \n       'Population': [11190846, 1303171035, 207847528]}\n\n# Series\n\b# 通过字典创建 Series\ns1 = pd.Series(data['Country'], index=['A', 'B', 'C'])\n# s1\n# A    Belgium\n# B      India\n# C     Brazil\n# dtype: object\n\ns1.values # array(['Belgium', 'India', 'Brazil'], dtype=object)\ns1.index # Index(['A', 'B', 'C'], dtype='object')\n\n# DataFrame\n\b# 通过字典创建 DataFrame\ndf1 = pd.DataFrame(data)\n'''\ndf1\n        Country\t    Capital\tPopulation\n0\tBelgium\t    Brussels\t11190846\n1\tIndia\t    New Delhi\t1303171035\n2\tBrazil\t    Brasilia\t207847528\n'''\n\ndf1['Country']\n# 0    Belgium\n# 1      India\n# 2     Brazil\n# Name: Country, dtype: object\n\ntype(df1['Country']) #  pandas.core.series.Series\n\ndf1.iterrows() # \u003cgenerator object DataFrame.iterrows at 0x11e5db258\u003e\n\nfor row in df1.iterrows():\n    print('行：'), print(row), \n    print('行的类型：'), print(type(row)), \n    print('行的长度：'), print(len(row)), \n    print('行的第一部分：'), print(row[0]),  \n    print('行的第二部分：'), print(row[1]), \n    print('行的第一部分的类型：'), print(type(row[0])),  \n    print('行的第二部分的类型：'), print(type(row[1]))\n    break\n'''\n行：\n(0, Country        Belgium\nCapital       Brussels\nPopulation    11190846\nName: 0, dtype: object)\n行的类型：\n\u003cclass 'tuple'\u003e\n行的长度：\n2\n行的第一部分：\n0\n行的第二部分：\nCountry        Belgium\nCapital       Brussels\nPopulation    11190846\nName: 0, dtype: object\n行的第一部分的类型：\n\u003cclass 'int'\u003e\n行的第二部分的类型：\n\u003cclass 'pandas.core.series.Series'\u003e\n'''\n# 从上面的结果可以看出 DataFrame 的行由 Series 组成，因此可以使用 Series 创建 DataFrame\ns1 = pd.Series(data['Capital'])\ns2 = pd.Series(data['Country'])\ns3 = pd.Series(data['Population'])\ndf_new = pd.DataFrame([s1, s2, s3], index=['Capital', 'Country', 'Population'])\ndf_new\n'''\n            0               1\t        2\nCapital\t    Brussels\tNew Delhi\tBrasilia\nCountry\t    Belgium     India\t        Brazil\nPopulation  11190846\t1303171035\t207847528\n'''\n\n# 行列转换\ndf_new = df_new.T\ndf_new\n‘’‘\n        Capital\t        Country\tPopulation\n0\tBrussels\tBelgium\t11190846\n1\tNew Delhi\tIndia\t1303171035\n2\tBrasilia\tBrazil\t207847528\n’‘’\n```\n\n### 3.4 DataFrame IO\n\n[官方文档](http://pandas.pydata.org/pandas-docs/stable/io.html)  \n[PandasVersusExcel(Python)](https://chanmenglin.github.io/PandasVersusExcel/) 中  \n\n* [2 - 读取文件](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/2-ReadExcel/ReadExcel.py)  \n* [22 - 读取CSV、TSV、TXT文件中的数据](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/22-ReadData/ReadData.py)\n\n\n### 3.5 DataFrame(Selecting 和 Indexing)\n\n[官方文档](http://pandas.pydata.org/pandas-docs/stable/indexing.html)  \n[PandasVersusExcel(Python)](https://chanmenglin.github.io/PandasVersusExcel/) 中  \n\n* [3 - 行、列、单元格](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/3-Rows\u0026Clumns\u0026Cell/Rows\u0026Clumns\u0026Cell.py)\n* [4\u00265 - 数据区域的读取，填充整数、文字,填充日期序列](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/4%265-ReadData\u0026BaseInput/ReadData\u0026BaseInput.py)\n* [27 - 行操作集锦](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/27-RowOperation/RowOperation.py)\n* [28 - 列操作集锦](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/28-ColOperation/ColOperation.py)\n\n### 3.6 Reindexing Series 和 DataFrame\n\n[Reindexing Series\u0026DataFrame](Code/2-pandas/ReindexingSeriesDataFrame.ipynb)  \n\n```python\nimport numpy as np\nimport pandas as pd\n\n# Reindexing Series and DataFrame\n\n# Series reindex\n\ns1 = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C', 'D'])\n# s1\n# A    1\n# B    2\n# C    3\n# D    4\n# dtype: int64\n\n# 按住 Shift + Tab 可以查看帮助\ns1.reindex(index=['A', 'B', 'C', 'D', 'E'])\n# A    1.0\n# B    2.0\n# C    3.0\n# D    4.0\n# E    NaN\n# dtype: float64\n\ns1.reindex(index=['A', 'B', 'C', 'D', 'E'], fill_value=10)\n# A     1\n# B     2\n# C     3\n# D     4\n# E    10\n# dtype: int64\n\ns2 = pd.Series(['A', 'B', 'C'], index=[1, 3, 5])\n# s2\n# 1    A\n# 3    B\n# 5    C\n# dtype: object\n\ns2.reindex(index=range(7))\n# 0    NaN\n# 1      A\n# 2    NaN\n# 3      B\n# 4    NaN\n# 5      C\n# 6    NaN\n# dtype: object\n\n# method='ffill' 表示根据已有的值自动填充为 NaN 的值\ns2.reindex(index=range(7), method='ffill')\n# 0    NaN\n# 1      A\n# 2      A\n# 3      B\n# 4      B\n# 5      C\n# 6      C\n# dtype: object\n\n# DataFrame reindex\n\ndf1 = pd.DataFrame(np.random.rand(25).reshape([5, 5]), index=['A', 'B', 'D', 'E', 'F'], columns=['c1', 'c2', 'c3', 'c4', 'c5'])\ndf1\n'''\n        c1\t        c2\t        c3\t        c4\t        c5\nA\t0.919411\t0.238651\t0.088673\t0.830227\t0.284514\nB\t0.334756\t0.652239\t0.913840\t0.053076\t0.375364\nD\t0.811720\t0.760921\t0.860246\t0.727191\t0.009915\nE\t0.282364\t0.246554\t0.743932\t0.445262\t0.339246\nF\t0.438870\t0.930862\t0.817973\t0.861525\t0.550942\n'''\n\ndf1.reindex(index=[['A', 'B', 'C', 'D', 'E']], columns=['c1', 'c2', 'c3', 'c4', 'c5', 'c6'])\n'''\n        c1\tc2\tc3\tc4\tc5\tc6\nA\tNaN\tNaN\tNaN\tNaN\tNaN\tNaN\nB\tNaN\tNaN\tNaN\tNaN\tNaN\tNaN\nC\tNaN\tNaN\tNaN\tNaN\tNaN\tNaN\nD\tNaN\tNaN\tNaN\tNaN\tNaN\tNaN\nE\tNaN\tNaN\tNaN\tNaN\tNaN\tNaN\n'''\n\ns1.reindex(index=['C', 'D'])\n# C    3\n# D    4\n# dtype: int64\n\ndf1.reindex(index=['A', 'B'])\n'''\n        c1\t        c2\t        c3\t        c4\t        c5\nA\t0.352591\t0.437914\t0.131892\t0.273035\t0.463063\nB\t0.367352\t0.245098\t0.081478\t0.744348\t0.990410\n'''\n\ns1.drop('A')\n# B    2\n# C    3\n# D    4\n# dtype: int64\n\n# axis 表示行和列\n# 0 表示行\n# 1 表示列\ndf1.drop('A', axis=0)\n'''\n        c1\t        c2\t        c3\t        c4\t        c5\nB\t0.367352\t0.245098\t0.081478\t0.744348\t0.990410\nD\t0.364244\t0.751367\t0.782257\t0.443011\t0.688876\nE\t0.615851\t0.725409\t0.741932\t0.791803\t0.576622\nF\t0.599175\t0.543432\t0.443125\t0.471929\t0.436654\n'''\n```\n\n### 3.7 Mapping 和 Replace\n\n[Mapping\u0026Replace](Code/2-pandas/MappingReplace.ipynb)  \n\n```python\nimport numpy as np\nimport pandas as pd\n\n# Mapping\ndf1 = pd.DataFrame({'城市': ['北京', '上海', '广州'], '人口': [1000, 2000, 1500]}, index=['A', 'B', 'C'])\n# df1\n'''\n        城市\t人口\nA\t北京\t1000\nB\t上海\t2000\nC\t广州\t1500\n'''\n\ndf1['GDP'] = pd.Series([1000, 2000, 1500])\ndf1\n'''\n\t城市\t人口\tGDP\nA\t北京\t1000\tNaN\nB\t上海\t2000\tNaN\nC\t广州\t1500\tNaN\n'''\n\ngdp_map = {'北京': 1100, '上海': 2100, '广州': 1600}\ndf1['GDP'] = df1['城市'].map(gdp_map)\ndf1\n'''\n        城市\t人口\tGDP\nA\t北京\t1000\t1100\nB\t上海\t2000\t2100\nC\t广州\t1500\t1600\n'''\n\ndf1['GDP'] = pd.Series([1000, 2000, 1500], index=['A', 'B', 'C'])\ndf1\n'''\n        城市\t人口\tGDP\nA\t北京\t1000\t1000\nB\t上海\t2000\t2000\nC\t广州\t1500\t1500\n'''\n\ns1 = pd.Series(np.arange(5))\n# s1\n# 0    0\n# 1    1\n# 2    2\n# 3    3\n# 4    4\n# dtype: int64\n\ns1.replace(1, np.nan)\n# 0    0.0\n# 1    NaN\n# 2    2.0\n# 3    3.0\n# 4    4.0\n# dtype: float64\n\ns1.replace([1, 2, 3], [10, 20, 30])\n# 0     0\n# 1    10\n# 2    20\n# 3    30\n# 4     4\n# dtype: int64\n```\n\n### 3.8 NaN - Not a Number\n\n[Not a Number](Code/2-pandas/NaN.ipynb)  \n\n```python\nimport numpy as np\nimport pandas as pd\n\n# NaN - Not a Number\n\nn = np.nan\ntype(n) # float\n\n# 任何数值（整数、浮点数、0）与 NaN 作运算结果都是 NaN\nm = 1\nm + n # nan\n\n# NaN in Series\ns1 = pd.Series([1, 2, np.nan, 3, 4], index=['A', 'B', 'C', 'D', 'E'])\n# s1\n# A    1.0\n# B    2.0\n# C    NaN\n# D    3.0\n# E    4.0\n# dtype: float64\n\n# 判断 Series 中的值是否是 NaN\ns1.isnull()\n# A    False\n# B    False\n# C     True\n# D    False\n# E    False\n# dtype: bool\n\n# 判断 Series 中的值是否不是 NaN\ns1.notnull()\n# A     True\n# B     True\n# C    False\n# D     True\n# E     True\n# dtype: bool\n\n# 删除 Series 中的值是 NaN 的数据\ns1.dropna()\n# A    1.0\n# B    2.0\n# D    3.0\n# E    4.0\n# dtype: float64\n\n# Nan in DataFrame\ndf1 = pd.DataFrame([[1, 2, 3], [np.nan, 5, 6], [7, np.nan, 9], [np.nan, np.nan, np.nan]])\ndf1\n'''\n        0\t1\t2\n0\t1.0\t2.0\t3.0\n1\tNaN\t5.0\t6.0\n2\t7.0\tNaN\t9.0\n3\tNaN\tNaN\tNaN\n'''\n\ndf1.isnull()\n'''\n        0\t1\t2\n0\tFalse\tFalse\tFalse\n1\tTrue\tFalse\tFalse\n2\tFalse\tTrue\tFalse\n3\tTrue\tTrue\tTrue\n'''\n\ndf1.notnull()\n'''\n        0\t1\t2\n0\tTrue\tTrue\tTrue\n1\tFalse\tTrue\tTrue\n2\tTrue\tFalse\tTrue\n3\tFalse\tFalse\tFalse\n'''\n\ndf1.dropna(axis=0)\n'''\n        0\t1\t2\n0\t1.0\t2.0\t3.0\n'''\n\ndf1.dropna(axis=1)\n'''\n0\n1\n2\n3\n'''\n\ndf1.dropna(how='all')\n'''\n        0\t1\t2\n0\t1.0\t2.0\t3.0\n1\tNaN\t5.0\t6.0\n2\t7.0\tNaN\t9.0\n'''\n\ndf2 = pd.DataFrame([[np.nan, 5, 6], [7, np.nan, np.nan], [np.nan, np.nan, np.nan]])\n# df2\n'''\n        0\t1\t2\n0\tNaN\t5.0\t6.0\n1\t7.0\tNaN\tNaN\n2\tNaN\tNaN\tNaN\n'''\n\n# thresh 表示范围 删除少于 2 个非 NaN 值的行或列\ndf2.dropna(thresh=2)\n'''\n        0\t1\t2\n0\tNaN\t5.0\t6.0\n'''\n\n# 替换值为 NaN 的值\ndf2.fillna(value=1)\n'''\n        0\t1\t2\n0\t1.0\t5.0\t6.0\n1\t7.0\t1.0\t1.0\n2\t1.0\t1.0\t1.0\n'''\n\n# 按列替换值为 NaN 的值\ndf2.fillna(value={0:0, 1:1, 2:2})\n'''\n        0\t1\t2\n0\t0.0\t5.0\t6.0\n1\t7.0\t1.0\t2.0\n2\t0.0\t1.0\t2.0\n'''\n```\n\n### 3.9 多级 index\n\n[多级 index](Code/2-pandas/多级index.ipynb)  \n\n```python\nimport numpy as np\nimport pandas as pd\n\n# 多级 index\n\n# 创建一个两级的 Series\ns1 = pd.Series(np.random.randn(6), index=[[1, 1, 1, 2, 2, 2], ['a', 'b', 'c', 'a', 'b', 'c']])\ns1\n# 1  a   -0.610026\n#    b    1.649775\n#    c    0.835034\n# 2  a    0.899401\n#    b   -0.685298\n#    c   -1.846341\n# dtype: float64\n\ns1[1]\n# a   -0.610026\n# b    1.649775\n# c    0.835034\n# dtype: float64\n\ns1[1]['a'] # -0.6100255133809527\n\ns1[:, 'a']\n# 1    1.042715\n# 2    1.460387\n# dtype: float64\n\n# 多级 Series 转换为 Da taFrame\ndf1 = s1.unstack()\n# df1\n'''\n        a\t        b\t        c\n1\t-0.610026\t1.649775\t0.835034\n2\t0.899401\t-0.685298\t-1.846341\n\n'''\n\ndf2 = pd.DataFrame([s1[1], s1[2]])\n# df2\n'''\n        a\t        b\t        c\n0\t-0.610026\t1.649775\t0.835034\n1\t0.899401\t-0.685298\t-1.846341\n'''\n\n# DataFrame 转换为多级 Series\ns2 = df1.T.unstack()\n# s2\n# 1  a   -0.610026\n#    b    1.649775\n#    c    0.835034\n# 2  a    0.899401\n#    b   -0.685298\n#    c   -1.846341\n# dtype: float64\n\n# 创建多级 index 的 Da taFrame\ndf = pd.DataFrame(np.arange(16).reshape(4, 4), index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]], columns=[['bj', 'bj', 'sh', 'gz'], [8, 9, 8, 8]])\n# df\n'''\n        bj\t        sh\t        gz\n        8\t9\t8\t8\na\t1\t0\t1\t2\t3\n        2\t4\t5\t6\t7\nb\t1\t8\t9\t10\t11\n        2\t12\t13\t14\t15\n'''\n\ndf['bj']\n'''\n                8\t9\na\t1\t0\t1\n        2\t4\t5\nb\t1\t8\t9\n        2\t12\t13\n'''\n\ndf['bj'][8]\n# a  1     0\n#    2     4\n# b  1     8\n#    2    12\n```\n\n## 4. pandas 玩转数据\n\npandas 进阶，学习数据清洗、排序、采样技术、封箱技术、Group By、聚合技术、透视表等\n\n### 4.1 Series 和 DataFrame 的简单数学运算\n\n[Series 和 DataFrame 的简单数学运算](Code/3-pandas玩转数据/1-Series和DataFrame的简单数学运算.ipynb) \n\n#### 4.1.1 Series 的[数学运算](http://pandas.pydata.org/pandas-docs/stable/api.html#computations-descriptive-stats)\n\nSeries 的运算为对应 index 的值的运算的集合\n\n```python\nimport numpy as np\nimport pandas as pd\n\ns1 = pd.Series([1, 2, 3], index=['A', 'B', 'C'])\ns2 = pd.Series([4, 5, 6, 7], index=['B','C', 'D', 'E'])\n\n# Series 的运算为对应 index 的值的运算的集合\ns1 + s2\n# A    NaN\n# B    6.0\n# C    8.0\n# D    NaN\n# E    NaN\n# dtype: float64\n```\n\n#### 4.1.2 DataFrame 的[数学运算](https://pandas.pydata.org/pandas-docs/stable/api.html#computations-descriptive-stats)\n\n* DataFrame 的运算为对应 元素 的值的运算的集合\n* [**sum()**](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sum.html) 计算每一列的和（NaN 会被忽略）放回一个 Series。axis=1 参数可以求每一行的值\n* [**min()**](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.min.html) 计算每一列的最小值（NaN 会被忽略）放回一个 Series，axis=1 参数可以求每一行的值\n* [**max()**](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.max.html) 计算每一列的最大值（NaN 会被忽略）放回一个 Series，axis=1 参数可以求每一行的值\n* [**describe()**](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.describe.html) 统计 \n\n```python\ndf1 = pd.DataFrame(np.arange(4).reshape(2, 2), index=['A', 'B'], columns=['BJ', 'SH'])\ndf2 = pd.DataFrame(np.arange(9).reshape(3, 3), index=['A', 'B', 'C'], columns=['BJ', 'SH', 'GZ'])\n\n# DataFrame 的运算为对应 元素 的值的运算的集合\ndf1 + df2\n'''\n        BJ\tGZ\tSH\nA\t0.0\tNaN\t2.0\nB\t5.0\tNaN\t7.0\nC\tNaN\tNaN\tNaN\n'''\n```\n\n### 4.2 Series 和 DataFrame 的排序\n\n[Series 和 DataFrame 的排序](Code/3-pandas玩转数据/2-Series和DataFrame的排序.ipynb)  \n\n[Series Reshaping, sorting(重塑和排序)](https://pandas.pydata.org/pandas-docs/stable/api.html#reshaping-sorting)  \n[DataFrame Reshaping, sorting, transposing((重塑\\排序\\变换))](https://pandas.pydata.org/pandas-docs/stable/api.html#reshaping-sorting-transposing)\n* [**s.sort_values()**](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.sort_values.html) Series 按 value 升序排序（默认 ascending=True，ascending=False 表示降序排序）\n* [**s.sort_index()**](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.sort_index.html#pandas.Series.sort_index) Series 按 index 升序排序（默认 ascending=True，ascending=False 表示降序排序）\n* [**df.sort_values('A')**](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_values.html) DataFrame 以列 'A' 按 value 升序排序（默认 ascending=True，ascending=False 表示降序排序）\n* [**df.sort_index()**](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_index.html) DataFrame 按 index 升序排序（默认 ascending=True，ascending=False 表示降序排序）\n\n### 4.3 重命名 DataFrame 的 index\n\n[重命名 DataFrame 的 index](Code/3-pandas玩转数据/3-重命名DataFrame的index.ipynb) \n\n```python\n# 修改 DataFrame 的 index 和 columns\ndf.rename(index=str.lower, columns=str.lower)\ndf.rename(index={'BJ': 'beijing'})\ndf.index.map(str.upper)\n```\n\n[**map()**](http://book.pythontips.com/en/latest/map_filter.html#map) 方法\n```python\n# 将 list1 = [1, 2, 3, 4] 转换成 list2 = ['1', '2', '3', '4']\nlist1 = [1, 2, 3, 4]\n# 方法一\n[str(x) for x in list1] # ['1', '2', '3', '4']\n\n# 方法二\nlist(map(str, list1)) # ['1', '2', '3', '4']\n```\n\n### 4.4 DataFrame 的 [merge](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html) 操作\n\n[DataFrame 的 merge 操作](Code/3-pandas玩转数据/4-DataFrame的merge操作.ipynb) \n\n```python\ndf1 = pd.DataFrame({'Key': ['X', 'Y', 'Z'], 'data_set_1': [1, 2, 3]})\ndf2 = pd.DataFrame({'Key': ['X', 'B', 'C'], 'data_set_2': [4, 5, 6]})\n\n# 合并（类似于 SQL中的 join 操作）\npd.merge(df1, df2)\n'''\nKey\tdata_set_1\tdata_set_2\n0\tX\t1\t4\n1\tX\t2\t4\n'''\n```\n\n### 4.5 Concatenate 和 Combine\n\n[Concatenate 和 Combine](Code/3-pandas玩转数据/5-Concatenate和Combine.ipynb)   \n\nNumPy [concatenate](https://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html)  \npandas [Merge, join, and concatenate](https://pandas.pydata.org/pandas-docs/stable/merging.html)  \npandas [concat](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html#pandas.concat)  \npandas [Series.str.cat](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.cat.html#pandas.Series.str.cat)  \npandas [Series.combine_first](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.combine_first.html)  \npandas [DataFrame.combine_first](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.combine_first.html#pandas-dataframe-combine-first)\n\n#### 4.5.1 Concatenate\n\n```python\narr1 = np.arange(9).reshape(3, 3)\narr2 = np.arange(9).reshape(3, 3)\n\nnp.concatenate([arr1, arr2])\n# array([[0, 1, 2],\n#        [3, 4, 5],\n#        [6, 7, 8],\n#        [0, 1, 2],\n#        [3, 4, 5],\n#        [6, 7, 8]])\n```\n\n#### 4.5.2 Concat\n\n```python\ns1 = pd.Series([1, 2, 3], index=['X', 'Y', 'Z'])\ns2 = pd.Series([1, 2], index=['A', 'B'])\n\npd.concat([s1, s2], axis=1, sort=True)\n'''\n        0\t1\nA\tNaN\t1.0\nB\tNaN\t2.0\nX\t1.0\tNaN\nY\t2.0\tNaN\nZ\t3.0\tNaN\n'''\n\ndf1 = pd.DataFrame(np.random.randn(4, 3), columns=['X', 'Y', 'Z'])\ndf2 =  pd.DataFrame(np.random.randn(3, 3), columns=['X', 'Y', 'A'])\n\npd.concat([df1, df2],sort=True)\n'''\n        X\t        Y\t        Z\t        X\t        Y\t        A\n0\t-0.150725\t-2.251965\t-0.916322\t1.721364\t0.310061\t-0.165037\n1\t-1.841673\t3.361009\t0.132322\t-1.621575\t0.284105\t-0.488211\n2\t-0.705189\t-0.884906\t-0.456689\t1.356419\t0.776563\t0.920558\n3\t0.862066\t-0.575394\t0.915041\tNaN\tNaN\tNaN\n'''\n```\n\n#### 4.5.3 Combine\n\n```python\ns1 = pd.Series([2, np.nan, 4, np.nan], index=['A', 'B', 'C', 'D'])\ns2 = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C',  'D'])\n\n# 使用 s2 填充 S1\ns1.combine_first(s2)\n# A    2.0\n# B    2.0\n# C    4.0\n# D    4.0\n# dtype: float64\n\ndf1 = pd.DataFrame({\n    'x': [1, np.nan, 3, np.nan], \n    'y': [5, np.nan, 7, np.nan], \n    'z': [9, np.nan, 11, np.nan], \n})\ndf2 = pd.DataFrame({\n    'z': [np.nan, 10, np.nan, 12], \n    'a': [1, 2, 3, 4], \n})\ndf1.combine_first(df2)\n'''\n        a\tx\ty\tz\n0\t1.0\t1.0\t5.0\t9.0\n1\t2.0\tNaN\tNaN\t10.0\n2\t3.0\t3.0\t7.0\t11.0\n3\t4.0\tNaN\tNaN\t12.0\n'''\n```\n\n### 4.6 时间序列的操作基础\n\n[时间序列的操作基础](Code/3-pandas玩转数据/6-时间序列的操作基础.ipynb)  \n\n[Python datetime](https://docs.python.org/2/library/datetime.html)  \n[pandas datetime](https://pandas.pydata.org/pandas-docs/stable/api.html#datetimeindex)  \n[pandas.to_datetime](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_datetime.html)  \n[Series datetime](https://pandas.pydata.org/pandas-docs/stable/api.html#datetimelike-properties)\n\n```python\n# 创建一个 DateTime 的对象\nt1 = dt.datetime(2018, 10, 20)\nt1 # datetime.datetime(2018, 10, 20, 0, 0)\n\ndate_list = [\n    dt.datetime(2017, 10, 20), \n    dt.datetime(2018, 10, 21), \n    dt.datetime(2018, 11, 22), \n    dt.datetime(2018, 12, 23), \n    dt.datetime(2019, 1, 24), \n]\ns1 = pd.Series(np.random.rand(5), index=date_list)\n# s1\n# 2017-10-20    0.467958\n# 2018-10-21    0.170206\n# 2018-11-22    0.349676\n# 2018-12-23    0.609425\n# 2019-01-24    0.543507\n# dtype: float64\n\ns1['2018-10'] \n# 2018-10-21    0.170206\n# dtype: float64\n\nd2 = pd.date_range('2018-1-1', '2018-12-30')\n# d2\n# DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',\n#                '2018-01-05', '2018-01-06', '2018-01-07', '2018-01-08',\n#                '2018-01-09', '2018-01-10',\n#                ...\n#                '2018-12-21', '2018-12-22', '2018-12-23', '2018-12-24',\n#                '2018-12-25', '2018-12-26', '2018-12-27', '2018-12-28',\n#                '2018-12-29', '2018-12-30'],\n#               dtype='datetime64[ns]', length=364, freq='D')\n\ns2 = pd.Series(np.random.rand(len(d2)), index=d2)\ns2\n\ns2.resample('M').mean() \n# 参考 ：https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample.html\n```\n\n### 4.7 其他方法\n\n#### 4.7.1 数据处理\n\n[Series.apply](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html)  \n[DataFrame.apply](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html) \n\n#### 4.7.2 数据清洗\n\n[Data manipulations](https://pandas.pydata.org/pandas-docs/stable/api.html#data-manipulations)  \n\n* 去重  \n[Series.duplicated](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.duplicated.html)  \n[Series.drop_duplicated](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.duplicated.html#)  \n[DataFrame.duplicates](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.duplicated.html)  \n[DataFrame.drop_duplicates](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html)  \n\n* 数据分箱技术  \n[cut](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html)  \n\n* 数据分组技术  \n[GroupBy](https://pandas.pydata.org/pandas-docs/stable/api.html#groupby)  \n[Series.groupby](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.groupby.html)  \n[DataFrame.group](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html)  \n\n* 数据聚合技术  \n[Series.agg](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.agg.html)  \n[Series.aggregate](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.aggregate.html)  \n[DataFrame.agg](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.agg.html)  \n[DataFrame.aggregate](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.aggregate.html)  \n\n* 透视表  \n[pivot_table](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.pivot_table.html)  \n[DataFrame.pivot_table](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.pivot_table.html)  \n\n## 5. 绘图与可视化-MatPlotLib\n\n数据展示 这里只会以几种最常用的图例\b作为示例进行讲解，更多的图例的使用请参考[官方文档](https://matplotlib.org/gallery/index.html#)\n\n[官网](https://matplotlib.org/index.html)  \n[example](https://matplotlib.org/gallery/index.html#)  \n[Matplotlib PDF](https://matplotlib.org/Matplotlib.pdf)  \n[Matlotlib Tutorials](https://pythonspot.com/matplotlib/)  \n\n此处可参考我的另一个库：[PandasVersusExcel(Python)](https://chanmenglin.github.io/PandasVersusExcel/) | [Github](https://github.com/ChanMenglin/PandasVersusExcel)\n\n* [9 - 柱状图](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/9-Histogram/Histogram.py)\n* [10 - 绘制分组柱图，深度优化图表](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/10-GroupedHistogran\u0026DepthOptimizationChart/GroupedHistogran\u0026DepthOptimizationChart.py)\n* [11 - 绘制分组柱图，深度优化图表](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/11-SuperimposedHistogram\u0026HorizontalHistogram/SuperimposedHistogram\u0026HorizontalHistogram.py)\n* [12 - 绘制饼图](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/12-PieChart/PieChart.py)\n* [13 - 绘制折线趋势图、叠加区域图](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/13-PolylineTrendChart\u0026OverlayAreaMap/PolylineTrendChart\u0026OverlayAreaMap.py)\n* [14%15 - 散点图，直方图，密度图,密度图，数据相关性](https://github.com/ChanMenglin/PandasVersusExcel/blob/master/14%2615-ScatterPlot\u0026Histogram\u0026DensityMap/ScatterPlot\u0026Histogram\u0026DensityMap.py)\n\n### 5.1 MatPlotLib-线性图\n\n[MatPlotLib-线性图](Code/4-MatPlotLib/1-MatPlotLib-线性图.ipynb)  \n\n[plot](https://matplotlib.org/api/pyplot_api.html)  \n\n```python\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# 线性图\na = [1, 2, 3]\nb = [4, 5, 6]\nplt.plot(a, b)\nplt.show()\n```\n![图 1-1](Code/4-MatPlotLib/img/1-1.png)  \n\n```python\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# 线性图\nx = np.linspace(0.0, 5.0)\ny1 = np.sin(np.pi*x)\ny2 = np.sin(np.pi*2*x)\nplt.plot(x, y1,'b--', label='sin(pi*x)')\nplt.ylabel('y1 value')\nplt.plot(x, y2,'r--', label='sin(pi*2x)')\nplt.ylabel('y2 value')\nplt.xlabel('x value')\nplt.title('this is a x-y value')\nplt.legend()\nplt.show()\n```\n![图 1-2](Code/4-MatPlotLib/img/1-2.png)  \n\n[subplot - 子图](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplot.html)  \n\n```python\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# subplot 子图\nx = np.linspace(0.0, 5.0)\ny1 = np.sin(np.pi*x)\ny2 = np.sin(np.pi*2*x)\n\n# 子图一（‘2, 1, 1’ 等同于‘211’ 表示 两行一列第一个图）\nplt.subplot(2, 1, 1)\nplt.plot(x, y1, 'b--')\nplt.ylabel('y1')\nplt.xlabel('x')\n#（‘2, 1, 2’ 等同于‘212’表示 两行一列第二个图）\nplt.subplot(212)\nplt.plot(x, y2, 'r--')\nplt.ylabel('y2')\nplt.xlabel('x')\nplt.show()\n```\n![图 1-3](Code/4-MatPlotLib/img/1-3.png)  \n\n[subplots - 子图](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplots.html)  \n\n```python\n# 子图二（‘2, 2’ 表示两行两列）\nfigure, ax = plt.subplots(2, 2)\nax[0][0].plot(x, y1)\nax[0][1].plot(x, y2)\n# 此处只填充了 ax[0][0]、ax[0][1]，ax[1][0]、ax[1][1] 未填充\nplt.show()\n```\n![图 1-4](Code/4-MatPlotLib/img/1-4.png)  \n\n### 5.2 MatPlotLib-直方图\n\n[MatPlotLib-直方图](Code/4-MatPlotLib/4-MatPlotLib-直方图.ipynb)  \n\n[hist](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hist.html)  \n[Matplotlib Histogram](https://pythonspot.com/matplotlib-histogram/)  \n\n```python\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\n# MatPlotLib-直方图\ns = pd.Series(np.random.randn(1000))\n# 直方图（rwidth 为宽度，bins 为分割区间，默认10） \nplt.hist(s, rwidth=0.9, bins=30)\nplt.show()\n```\n![图 2-1](Code/4-MatPlotLib/img/2-1.png)  \n\n### 5.3 MatPlotLib-密度图\n\n[MatPlotLib-密度图](Code/4-MatPlotLib/5-MatPlotLib-密度图.ipynb)  \n\n```python\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\n# MatPlotLib-密度图\ns = pd.Series(np.random.randn(1000))\n# 密度图\ns.plot(kind='kde')\nplt.show()\n```\n![图 3-1](Code/4-MatPlotLib/img/3-1.png)  \n\n### 5.4 pandas 的 Series 绘图\n\n[pandas 的 Series 绘图](Code/4-MatPlotLib/2-pandas之Series绘图.ipynb)  \n\n[Series plotting](https://pandas.pydata.org/pandas-docs/stable/api.html#plotting)  \n[Series.plot](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.plot.html)  \n\n```python\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\n# pandas 的 Series 绘图\ns1 = pd.Series(np.random.randn(1000)).cumsum()\ns1.plot(kind='line', grid=True, label='s1', title='this is Series line')\nplt.legend()\nplt.show\n```\n![图 4-1](Code/4-MatPlotLib/img/4-1.png)  \n\n```python\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\n# pandas 的 Series 绘图\ns1 = pd.Series(np.random.randn(1000)).cumsum()\ns2 = pd.Series(np.random.randn(1000)).cumsum()\ns1.plot(kind='line', label='s1')\ns2.plot(label='s2')\nplt.legend()\nplt.show()\n```\n![图 4-2](Code/4-MatPlotLib/img/4-2.png)  \n\n```python\n# pandas 的 Series 绘图 - 子图\ns1 = pd.Series(np.random.randn(1000)).cumsum()\ns2 = pd.Series(np.random.randn(1000)).cumsum()\nfig, ax = plt.subplots(2, 1)\nax[0].plot(s1)\nax[1].plot(s2)\nplt.show()\n```\n![图 4-3](Code/4-MatPlotLib/img/4-3.png)  \n\n```python\n# pandas 的 Series 绘图 - 子图\ns1 = pd.Series(np.random.randn(1000)).cumsum()\ns2 = pd.Series(np.random.randn(1000)).cumsum()\nfig, ax =plt.subplots(2, 1)\ns1[0: 10].plot(ax=ax[0], kind='bar')\ns2.plot(ax=ax[1])\nplt.show()\n```\n![图 4-4](Code/4-MatPlotLib/img/4-4.png)  \n\n### 5.5 pandas 的 DataFrame 绘图\n\n[pandas 的 DataFrame 绘图](Code/4-MatPlotLib/3-pandas之DataFrame绘图.ipynb)  \n\n[DataFrame plotting](https://pandas.pydata.org/pandas-docs/stable/api.html#api-dataframe-plotting)  \n[DataFrame.plot](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html)  \n\n```python\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\n# pandas 的 DataFrame 绘图\ndf = pd.DataFrame(\n    np.random.randint(1, 10, 40).reshape(10, 4),\n    columns=['A', 'B', 'C', 'D']\n)\ndf.plot()\nplt.show()\n```\n![图 5-1](Code/4-MatPlotLib/img/5-1.png)  \n\n```python\n# 按行（index）画图\ndf.iloc[5].plot()\nplt.show()\n```\n![图 5-2](Code/4-MatPlotLib/img/5-2.png)  \n\n```python\n# 按行（index）画图\nfor i in df.index:\n    df.iloc[i].plot(label=str(i))\nplt.legend()\nplt.show()\n# 同上\ndf.T.plot()\nplt.show()\n```\n![图 5-3](Code/4-MatPlotLib/img/5-3.png)  \n\n```python\n# 按列（columns）画图\nfor i in df.columns:\n    df[i].plot(label=str(i))\nplt.legend()\nplt.show()\n```\n![图 5-4](Code/4-MatPlotLib/img/5-4.png)  \n\n## 6. 绘图与可视化-SeaBorn\n\n[官网](http://seaborn.pydata.org)  \n[example](http://seaborn.pydata.org/examples/index.html)  \n[API](http://seaborn.pydata.org/api.html#)  \n[教程](http://seaborn.pydata.org/tutorial.html#)  \n\n### 6.1 Seaborn-直方图和密度图\n\n[Seaborn-直方图和密度图](Code/5-Seaborn/1-Seaborn-直方图和密度图.ipynb)  \n\n[seaborn.distplot](http://seaborn.pydata.org/generated/seaborn.distplot.html)\n\n```python\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\ns1 = pd.Series(np.random.randn(1000))\n```\n\n```python\n# pandas 直方图\nplt.hist(s1)\n```\n![图 1-1](Code/5-Seaborn/img/1-1.png)  \n\n```python\n# pandas 密度图\ns1.plot(kind='kde')\n```\n![图 1-2](Code/5-Seaborn/img/1-2.png)  \n\n```python\n# Seaborn-直方图和密度图\nsns.distplot(s1, rug=True)\n```\n![图 1-3](Code/5-Seaborn/img/1-3.png)  \n\n```python\n# Seaborn-密度图\nsns.kdeplot(s1)\n```\n![图 1-4](Code/5-Seaborn/img/1-4.png)  \n\n### 6.2 Seaborn-柱状图和热力图\n\n[Seaborn-柱状图和热力图](Code/5-Seaborn/2-Seaborn-柱状图和热力图.ipynb)  \n\n[seaborn.heatmap](https://seaborn.pydata.org/generated/seaborn.heatmap.html)  \n\n```python\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plp\nimport seaborn as sns\n\n# 使用 Seaborn 生成测试数据\ndf1 = sns.load_dataset('flights')\ndf = df1.pivot(index='month', columns='year', values='passengers')\n```\n\n\u003e [load_dataset](https://seaborn.pydata.org/generated/seaborn.load_dataset.html) 为 Seaborn 提供的测试数据的获取方法（需要网络）。  \n\u003e 数据地址：[seaborn-data](https://github.com/mwaskom/seaborn-data)\n\n```python\n# Seaborn-热力图\nsns.heatmap(df)\n```\n![图 2-1](Code/5-Seaborn/img/2-1.png)  \n\n```python\n# pandas-曲线图\b\ndf.plot()\n```\n![图 2-2](Code/5-Seaborn/img/2-2.png)  \n\n```python\n# pandas-柱状图\ns.plot(kind='bar')\n```\n![图 2-3](Code/5-Seaborn/img/2-3.png)  \n\n```python\n# Seaborn-柱状图\ns = df.sum()\nsns.barplot(x=s.index, y=s.values)\n```\n![图 2-4](Code/5-Seaborn/img/2-4.png)  \n\n### 6.3 Seaborn-设置图形显示的效果\n\n[Seaborn-设置图形显示的效果](Code/5-Seaborn/3-Seaborn-设置图形显示的效果.ipynb)  \n\n[Style control](http://seaborn.pydata.org/api.html#style-control)  \n设置当前风格设置：[seaborn.set_style](http://seaborn.pydata.org/generated/seaborn.set_style.html)  \n查看当前风格设置：[seaborn.axes_style](http://seaborn.pydata.org/generated/seaborn.axes_style.html#seaborn.axes_style)  \n更改当前图利属性：[seaborn.set_context](http://seaborn.pydata.org/generated/seaborn.set_context.html)  \n查看当前图利属性：[seaborn.plotting_context](http://seaborn.pydata.org/generated/seaborn.plotting_context.html#seaborn.plotting_context)  \n取消个性化设置 [seaborn.set](http://seaborn.pydata.org/generated/seaborn.set.html)  \n\n```python\n# Seaborn 绘图风格\nstyle = ['darkgrid', 'dark', 'white', 'whitegrid', 'ticks']\n# set_style 设置当前风格设置 第二个参数可进行个性化设置\nsns.set_style(style[3])\n# 查看当前风格设置\nsns.axes_style()\n\n# 更改当前图利属性\ncontext = ['paper', 'notebook', 'talk', 'poster']\nsns.set_context('paper')\n# 查看当前图利属性\nsns.plotting_context()\n```\n\n### 6.4 Seaborn-强大的调色功能\n\n[Seaborn-强大的调色功能](Code/5-Seaborn/4-Seaborn-强大的调色功能.ipynb)  \n\n[Color palettes](http://seaborn.pydata.org/api.html#color-palettes)  \n[Choosing color palettes](https://seaborn.pydata.org/tutorial/color_palettes.html)  \n查看当前色板（RGB）：[seaborn.color_palette](https://seaborn.pydata.org/generated/seaborn.color_palette.html)  \n设置当前色板（RGB）：[seaborn.set_palette](http://seaborn.pydata.org/generated/seaborn.set_palette.html)  \n\n```python\n# 查看当前色板（RGB）\nsns.color_palette()\n\n# 默认色板\npal_style = ['deep', 'muted', 'pastel', 'bright', 'dark', 'colorblind']\n\n# 显示当前色板（RGB）\nsns.palplot(sns.color_palette(pal_style[0]))\n```\n![图 4-1](Code/5-Seaborn/img/4-1.png)  \n\n```python\n# 设置色板\nsns.set_palette()\n\n# 设置临时风格(with 语句外会恢复默认色板)\nwith sns.color_palette('dark'):\n    sinplot() # 绘图方法\n\n# 定义自定义色板('hls' 为固定值，8 表示生成8种颜色)\nsns.color_palette('hls', 8)\nsns.color_palette([(0.1, 0.2, 0.3), (...)])\n```\n\n## 7. 数据分析项目实战\n\n以股票市场为例从 数据获取-导入-分析-可视化 完整流程\n\n[数据分析和挖掘有哪些公开的数据来源？ - 知乎](https://www.zhihu.com/question/19969760)  \n\n获取yahoo 股票数据：[pandas-datareader](https://pandas-datareader.readthedocs.io/en/latest/)  \n\n```bash\n# anaconda 安装 pandas-datareader\nconda install -c anaconda pandas-datareader\n```\n\n[实战](Code/6-实战/)\n\n数据获取的方法：\n\n1. 爬虫\n2. API\n\n\n---\n\n# 附录\n\n## 1. 数据科学领域5个组建 Python 库\n\n[NumPy](http://www.numpy.org)  \n\n* N维数组（矩阵）：快速高效、矢量数学运算\n* 高效的 Index，不需要循环\n* 开源免费，运行效率高（基于 C 语言），可媲美 [Matlab](https://ww2.mathworks.cn/products/matlab.html)\n\n[SciPy](https://www.scipy.org)  \n\n* 依赖于 NumPy\n* 专为科学和工程设计\n* 实现了多种常用科学计算：[线性代数](https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0)、[傅里叶变换](https://zh.wikipedia.org/wiki/%E5%82%85%E9%87%8C%E5%8F%B6%E5%8F%98%E6%8D%A2)、信号和图像处理\n\n[pandas](https://pandas.pydata.org)  \n\n* 结构化数据分析利器（依赖 NumPy）\n* 提供多种高级数据结构：Time-Series(时间序列)、DataFrame、Panel\n* 强大的数据索引和处理能力\n\n[MatPlotLib](https://matplotlib.org)  \n\n* Python 2D绘图领域使用最广泛的套件\n* 基本能取代 Matlab 的绘图功能（柱形图、散点图、曲线图等）\n* 通过 mplot3d 可绘制精美的3D图\n\n[SciKit-learn](http://scikit-learn.org/)  \n\n* 机器学习 Python 模块\n* 建立在 SciPy 之上，提供了常用的机器学习算法：[聚类](https://zh.wikipedia.org/wiki/%E8%81%9A%E7%B1%BB%E5%88%86%E6%9E%90)、[回归](https://zh.wikipedia.org/wiki/%E8%BF%B4%E6%AD%B8%E5%88%86%E6%9E%90)\n* 简单浴血的API接口\n\n## 2. 数学基础-[矩阵运算](https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%98%B5)\n\n### 2.1 基本概念\n\n* 矩阵：矩形的数组，即二维数组。其中向量和标量都是矩阵的特点\n* 向量：是指 1×n 或者 n×1 的矩阵\n* 标量：1×1 的矩阵\n* 数组：N味的数组，是矩阵的延伸\n\n### 2.2 特殊的矩阵\n\n* 全0全1矩阵：矩阵中所有的元素都是0或都是1\n* 单位矩阵\n    * 为 n×n 的矩阵\n    * 对角线上的元素都是1\n    * 任何矩阵乘以单位矩阵，结果为原先的矩阵（类似于任何数乘以1）\n\n![\b特殊的矩阵](img/JZ01.png)\n\n### 2.3 矩阵的加减运算\n\n* 相加、相减的矩阵必须要有相同的列数和行数\n* 行和列对应元素相加减\n\n![矩阵的加减运算](img/JZ02.png)\n\n### 2.4 数组的乘法（点乘）\n\n* 数组乘法（点乘）是对应元素之间的乘法（类似矩阵的加减法）\n\n![数组的乘法（点乘）](img/JZ03.png)\n\n### 矩阵的乘法\n\n* 设 A 为 m×p 的矩阵，B 为 p×m 的矩阵，m×n 矩阵 C 为 A 与 B 的乘积，记为 C=AB，其中矩阵 C 的第 i 行第 j 列元素可标示为：\n\n![矩阵的乘法](img/JZ04.png)\n\n参考：清华大学出版社的线性代数 http://bs.szu.edu.cn/sljr/Up/day_110824/201108240409437707.pdf\n\n## 3. 工具使用 Jupyter Notebook\n\n[Jupyter 官网](https://jupyter.org)  \n[Docs](https://jupyter-notebook.readthedocs.io/en/stable/)  \n[nbviewer](https://nbviewer.jupyter.org)  \n[Jupyter Magic functions](https://www.dummies.com/programming/python/common-jupyter-notebook-magic-functions/)  \n\n* %matplotlib inline：matplotlib 中不用显式调用 show() 方法即可显示图形\n* %timeit + 语句：可查看语句的执行时间及运行次数\n\n## 4. 数据可视化工具\n~\n[下载高清大图](img/数据可视化工具.png)(5.2M)\n\n![数据可视化工具](img/数据可视化工具.jpg)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchanmenglin%2Fdatascience","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchanmenglin%2Fdatascience","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchanmenglin%2Fdatascience/lists"}