{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# pandas 学习教程简介" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 创建对象" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用传递的值列表序列来创建序列, 让 pandas 创建默认整数索引" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "s = pd.Series([1, 3, 5, np.nan, 6, 8])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1.0\n", "1 3.0\n", "2 5.0\n", "3 NaN\n", "4 6.0\n", "5 8.0\n", "dtype: float64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用传递的numpy数组创建数据帧,并使用日期索引和标记列:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dates = pd.date_range('20130101', periods=6)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',\n", " '2013-01-05', '2013-01-06'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-010.8309880.211301-0.926818-0.613411
2013-01-02-1.3149920.5329771.192366-1.106847
2013-01-030.890640-1.036566-2.189510-0.397050
2013-01-041.565294-0.9015781.1482670.287584
2013-01-050.1808902.301889-0.0030750.478628
2013-01-06-0.050440-0.840614-0.547810-0.396750
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 0.830988 0.211301 -0.926818 -0.613411\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628\n", "2013-01-06 -0.050440 -0.840614 -0.547810 -0.396750" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用传递的可转换序列的字典对象创建数据帧:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df2 = pd.DataFrame({\n", " 'A': 1.,\n", " 'B': pd.Timestamp('20130101'),\n", " 'C': pd.Series(1, index=list(range(4)), dtype='float32'),\n", " 'D': np.array([3] * 4, dtype='int32'),\n", " 'E': pd.Categorical(['test', 'train', 'test', 'train']),\n", " 'F': 'foo'\n", "})" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDEF
01.02013-01-011.03testfoo
11.02013-01-011.03trainfoo
21.02013-01-011.03testfoo
31.02013-01-011.03trainfoo
\n", "
" ], "text/plain": [ " A B C D E F\n", "0 1.0 2013-01-01 1.0 3 test foo\n", "1 1.0 2013-01-01 1.0 3 train foo\n", "2 1.0 2013-01-01 1.0 3 test foo\n", "3 1.0 2013-01-01 1.0 3 train foo" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 所有明确类型:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A float64\n", "B datetime64[ns]\n", "C float32\n", "D int32\n", "E category\n", "F object\n", "dtype: object" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 输出某个子集:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 test\n", "1 train\n", "2 test\n", "3 train\n", "Name: E, dtype: category\n", "Categories (2, object): [test, train]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.E" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 查看数据" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 查看帧顶部和底部的行:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-010.8309880.211301-0.926818-0.613411
2013-01-02-1.3149920.5329771.192366-1.106847
2013-01-030.890640-1.036566-2.189510-0.397050
2013-01-041.565294-0.9015781.1482670.287584
2013-01-050.1808902.301889-0.0030750.478628
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 0.830988 0.211301 -0.926818 -0.613411\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-041.565294-0.9015781.1482670.287584
2013-01-050.1808902.301889-0.0030750.478628
2013-01-06-0.050440-0.840614-0.547810-0.396750
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628\n", "2013-01-06 -0.050440 -0.840614 -0.547810 -0.396750" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 显示索引, 列, 和底层的 numpy 数据:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',\n", " '2013-01-05', '2013-01-06'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.index" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index([u'A', u'B', u'C', u'D'], dtype='object')" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.83098768, 0.21130117, -0.92681805, -0.61341131],\n", " [-1.31499226, 0.53297706, 1.19236594, -1.10684677],\n", " [ 0.89064029, -1.03656616, -2.18951045, -0.39705036],\n", " [ 1.56529377, -0.90157838, 1.14826665, 0.28758407],\n", " [ 0.18088986, 2.3018887 , -0.00307499, 0.47862784],\n", " [-0.05043964, -0.84061391, -0.54780954, -0.39674995]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 描述显示数据快速统计摘要:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
count6.0000006.0000006.0000006.000000
mean0.3503970.044568-0.221097-0.291308
std0.9961651.2813611.2961480.586357
min-1.314992-1.036566-2.189510-1.106847
25%0.007393-0.886337-0.832066-0.559321
50%0.505939-0.314656-0.275442-0.396900
75%0.8757270.4525580.8604310.116501
max1.5652942.3018891.1923660.478628
\n", "
" ], "text/plain": [ " A B C D\n", "count 6.000000 6.000000 6.000000 6.000000\n", "mean 0.350397 0.044568 -0.221097 -0.291308\n", "std 0.996165 1.281361 1.296148 0.586357\n", "min -1.314992 -1.036566 -2.189510 -1.106847\n", "25% 0.007393 -0.886337 -0.832066 -0.559321\n", "50% 0.505939 -0.314656 -0.275442 -0.396900\n", "75% 0.875727 0.452558 0.860431 0.116501\n", "max 1.565294 2.301889 1.192366 0.478628" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 转置数据:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
2013-01-01 00:00:002013-01-02 00:00:002013-01-03 00:00:002013-01-04 00:00:002013-01-05 00:00:002013-01-06 00:00:00
A0.830988-1.3149920.8906401.5652940.180890-0.050440
B0.2113010.532977-1.036566-0.9015782.301889-0.840614
C-0.9268181.192366-2.1895101.148267-0.003075-0.547810
D-0.613411-1.106847-0.3970500.2875840.478628-0.396750
\n", "
" ], "text/plain": [ " 2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06\n", "A 0.830988 -1.314992 0.890640 1.565294 0.180890 -0.050440\n", "B 0.211301 0.532977 -1.036566 -0.901578 2.301889 -0.840614\n", "C -0.926818 1.192366 -2.189510 1.148267 -0.003075 -0.547810\n", "D -0.613411 -1.106847 -0.397050 0.287584 0.478628 -0.396750" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 按轴排序:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DCBA
2013-01-01-0.613411-0.9268180.2113010.830988
2013-01-02-1.1068471.1923660.532977-1.314992
2013-01-03-0.397050-2.189510-1.0365660.890640
2013-01-040.2875841.148267-0.9015781.565294
2013-01-050.478628-0.0030752.3018890.180890
2013-01-06-0.396750-0.547810-0.840614-0.050440
\n", "
" ], "text/plain": [ " D C B A\n", "2013-01-01 -0.613411 -0.926818 0.211301 0.830988\n", "2013-01-02 -1.106847 1.192366 0.532977 -1.314992\n", "2013-01-03 -0.397050 -2.189510 -1.036566 0.890640\n", "2013-01-04 0.287584 1.148267 -0.901578 1.565294\n", "2013-01-05 0.478628 -0.003075 2.301889 0.180890\n", "2013-01-06 -0.396750 -0.547810 -0.840614 -0.050440" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_index(axis=1, ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 按值排序:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-030.890640-1.036566-2.189510-0.397050
2013-01-041.565294-0.9015781.1482670.287584
2013-01-06-0.050440-0.840614-0.547810-0.396750
2013-01-010.8309880.211301-0.926818-0.613411
2013-01-02-1.3149920.5329771.192366-1.106847
2013-01-050.1808902.301889-0.0030750.478628
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584\n", "2013-01-06 -0.050440 -0.840614 -0.547810 -0.396750\n", "2013-01-01 0.830988 0.211301 -0.926818 -0.613411\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by='B')" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-030.890640-1.036566-2.189510-0.397050
2013-01-010.8309880.211301-0.926818-0.613411
2013-01-06-0.050440-0.840614-0.547810-0.396750
2013-01-050.1808902.301889-0.0030750.478628
2013-01-041.565294-0.9015781.1482670.287584
2013-01-02-1.3149920.5329771.192366-1.106847
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050\n", "2013-01-01 0.830988 0.211301 -0.926818 -0.613411\n", "2013-01-06 -0.050440 -0.840614 -0.547810 -0.396750\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by=['C', 'B'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 选择器" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 读取" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 选择单列, 这会产生一个序列, 等价于 df.A:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2013-01-01 0.830988\n", "2013-01-02 -1.314992\n", "2013-01-03 0.890640\n", "2013-01-04 1.565294\n", "2013-01-05 0.180890\n", "2013-01-06 -0.050440\n", "Freq: D, Name: A, dtype: float64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用 [] 选择行的片断:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-010.8309880.211301-0.926818-0.613411
2013-01-02-1.3149920.5329771.192366-1.106847
2013-01-030.890640-1.036566-2.189510-0.397050
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 0.830988 0.211301 -0.926818 -0.613411\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[0:3]" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-02-1.3149920.5329771.192366-1.106847
2013-01-030.890640-1.036566-2.189510-0.397050
2013-01-041.565294-0.9015781.1482670.287584
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['20130102': '20130104']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 使用标签选择" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用标签获取横截面:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 0.830988\n", "B 0.211301\n", "C -0.926818\n", "D -0.613411\n", "Name: 2013-01-01 00:00:00, dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[dates[0]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用标签选择多轴:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2013-01-010.8309880.211301
2013-01-02-1.3149920.532977
2013-01-030.890640-1.036566
2013-01-041.565294-0.901578
2013-01-050.1808902.301889
2013-01-06-0.050440-0.840614
\n", "
" ], "text/plain": [ " A B\n", "2013-01-01 0.830988 0.211301\n", "2013-01-02 -1.314992 0.532977\n", "2013-01-03 0.890640 -1.036566\n", "2013-01-04 1.565294 -0.901578\n", "2013-01-05 0.180890 2.301889\n", "2013-01-06 -0.050440 -0.840614" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:, ['A', 'B']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 显示标签切片, 包含两个端点:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2013-01-02-1.3149920.532977
2013-01-030.890640-1.036566
2013-01-041.565294-0.901578
\n", "
" ], "text/plain": [ " A B\n", "2013-01-02 -1.314992 0.532977\n", "2013-01-03 0.890640 -1.036566\n", "2013-01-04 1.565294 -0.901578" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['20130102': '20130104', ['A', 'B']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 降低返回对象维度:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A -1.314992\n", "B 0.532977\n", "Name: 2013-01-02 00:00:00, dtype: float64" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['20130102', ['A', 'B']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 获取标量值:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.83098767923609629" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[dates[0], 'A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 快速访问并获取标量数据(等价上面的方法):" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.83098767923609629" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.at[dates[0], 'A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 按位置选择" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 传递整数选择位置" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 1.565294\n", "B -0.901578\n", "C 1.148267\n", "D 0.287584\n", "Name: 2013-01-04 00:00:00, dtype: float64" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用整数片断, 效果类似 numpy/python:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2013-01-041.565294-0.901578
2013-01-050.1808902.301889
\n", "
" ], "text/plain": [ " A B\n", "2013-01-04 1.565294 -0.901578\n", "2013-01-05 0.180890 2.301889" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[3:5, 0:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用整数偏移定位列表, 效果类似 numpy/python 样式:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AC
2013-01-02-1.3149921.192366
2013-01-030.890640-2.189510
2013-01-050.180890-0.003075
\n", "
" ], "text/plain": [ " A C\n", "2013-01-02 -1.314992 1.192366\n", "2013-01-03 0.890640 -2.189510\n", "2013-01-05 0.180890 -0.003075" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[[1, 2, 4], [0, 2]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 显示行切片:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-02-1.3149920.5329771.192366-1.106847
2013-01-030.890640-1.036566-2.189510-0.397050
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[1:3, :]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 显示列切片:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BC
2013-01-010.211301-0.926818
2013-01-020.5329771.192366
2013-01-03-1.036566-2.189510
2013-01-04-0.9015781.148267
2013-01-052.301889-0.003075
2013-01-06-0.840614-0.547810
\n", "
" ], "text/plain": [ " B C\n", "2013-01-01 0.211301 -0.926818\n", "2013-01-02 0.532977 1.192366\n", "2013-01-03 -1.036566 -2.189510\n", "2013-01-04 -0.901578 1.148267\n", "2013-01-05 2.301889 -0.003075\n", "2013-01-06 -0.840614 -0.547810" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[:, 1:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 显式获取一个值:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.53297705530790285" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[1, 1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 快速访问一个标量(等同上个方法):" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.53297705530790285" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iat[1, 1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 布尔索引" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用单个列的值选择数据:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-010.8309880.211301-0.926818-0.613411
2013-01-030.890640-1.036566-2.189510-0.397050
2013-01-041.565294-0.9015781.1482670.287584
2013-01-050.1808902.301889-0.0030750.478628
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 0.830988 0.211301 -0.926818 -0.613411\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.A > 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### where 操作:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-010.8309880.211301NaNNaN
2013-01-02NaN0.5329771.192366NaN
2013-01-030.890640NaNNaNNaN
2013-01-041.565294NaN1.1482670.287584
2013-01-050.1808902.301889NaN0.478628
2013-01-06NaNNaNNaNNaN
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 0.830988 0.211301 NaN NaN\n", "2013-01-02 NaN 0.532977 1.192366 NaN\n", "2013-01-03 0.890640 NaN NaN NaN\n", "2013-01-04 1.565294 NaN 1.148267 0.287584\n", "2013-01-05 0.180890 2.301889 NaN 0.478628\n", "2013-01-06 NaN NaN NaN NaN" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df > 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用 isin() 筛选:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df2 = df.copy()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three']" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
2013-01-010.8309880.211301-0.926818-0.613411one
2013-01-02-1.3149920.5329771.192366-1.106847one
2013-01-030.890640-1.036566-2.189510-0.397050two
2013-01-041.565294-0.9015781.1482670.287584three
2013-01-050.1808902.301889-0.0030750.478628four
2013-01-06-0.050440-0.840614-0.547810-0.396750three
\n", "
" ], "text/plain": [ " A B C D E\n", "2013-01-01 0.830988 0.211301 -0.926818 -0.613411 one\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847 one\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050 two\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584 three\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628 four\n", "2013-01-06 -0.050440 -0.840614 -0.547810 -0.396750 three" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
2013-01-030.89064-1.036566-2.189510-0.397050two
2013-01-050.180892.301889-0.0030750.478628four
\n", "
" ], "text/plain": [ " A B C D E\n", "2013-01-03 0.89064 -1.036566 -2.189510 -0.397050 two\n", "2013-01-05 0.18089 2.301889 -0.003075 0.478628 four" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2[df2['E'].isin(['two', 'four'])]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 赋值" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 赋值一个新列, 通过索引自动对齐数据:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": true }, "outputs": [], "source": [ "s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range('20130102', periods=6))" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2013-01-02 1\n", "2013-01-03 2\n", "2013-01-04 3\n", "2013-01-05 4\n", "2013-01-06 5\n", "2013-01-07 6\n", "Freq: D, dtype: int64" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df['F'] = s1" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.8309880.211301-0.926818-0.613411NaN
2013-01-02-1.3149920.5329771.192366-1.1068471.0
2013-01-030.890640-1.036566-2.189510-0.3970502.0
2013-01-041.565294-0.9015781.1482670.2875843.0
2013-01-050.1808902.301889-0.0030750.4786284.0
2013-01-06-0.050440-0.840614-0.547810-0.3967505.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.830988 0.211301 -0.926818 -0.613411 NaN\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847 1.0\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050 2.0\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584 3.0\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628 4.0\n", "2013-01-06 -0.050440 -0.840614 -0.547810 -0.396750 5.0" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 按标签赋值:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.at[dates[0], 'A'] = 0" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.211301-0.926818-0.613411NaN
2013-01-02-1.3149920.5329771.192366-1.1068471.0
2013-01-030.890640-1.036566-2.189510-0.3970502.0
2013-01-041.565294-0.9015781.1482670.2875843.0
2013-01-050.1808902.301889-0.0030750.4786284.0
2013-01-06-0.050440-0.840614-0.547810-0.3967505.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.211301 -0.926818 -0.613411 NaN\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847 1.0\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050 2.0\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584 3.0\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628 4.0\n", "2013-01-06 -0.050440 -0.840614 -0.547810 -0.396750 5.0" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 按位置赋值:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.iat[0, 1] = 0" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.000000-0.926818-0.613411NaN
2013-01-02-1.3149920.5329771.192366-1.1068471.0
2013-01-030.890640-1.036566-2.189510-0.3970502.0
2013-01-041.565294-0.9015781.1482670.2875843.0
2013-01-050.1808902.301889-0.0030750.4786284.0
2013-01-06-0.050440-0.840614-0.547810-0.3967505.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.926818 -0.613411 NaN\n", "2013-01-02 -1.314992 0.532977 1.192366 -1.106847 1.0\n", "2013-01-03 0.890640 -1.036566 -2.189510 -0.397050 2.0\n", "2013-01-04 1.565294 -0.901578 1.148267 0.287584 3.0\n", "2013-01-05 0.180890 2.301889 -0.003075 0.478628 4.0\n", "2013-01-06 -0.050440 -0.840614 -0.547810 -0.396750 5.0" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 通过 numpy 数组分配赋值:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.loc[:, 'D'] = np.array([5] * len(df))" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.000000-0.9268185NaN
2013-01-02-1.3149920.5329771.19236651.0
2013-01-030.890640-1.036566-2.18951052.0
2013-01-041.565294-0.9015781.14826753.0
2013-01-050.1808902.301889-0.00307554.0
2013-01-06-0.050440-0.840614-0.54781055.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.926818 5 NaN\n", "2013-01-02 -1.314992 0.532977 1.192366 5 1.0\n", "2013-01-03 0.890640 -1.036566 -2.189510 5 2.0\n", "2013-01-04 1.565294 -0.901578 1.148267 5 3.0\n", "2013-01-05 0.180890 2.301889 -0.003075 5 4.0\n", "2013-01-06 -0.050440 -0.840614 -0.547810 5 5.0" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### where 操作赋值:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df2 = df.copy()" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df2[df2 > 0] = -df2" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.000000-0.926818-5NaN
2013-01-02-1.314992-0.532977-1.192366-5-1.0
2013-01-03-0.890640-1.036566-2.189510-5-2.0
2013-01-04-1.565294-0.901578-1.148267-5-3.0
2013-01-05-0.180890-2.301889-0.003075-5-4.0
2013-01-06-0.050440-0.840614-0.547810-5-5.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.926818 -5 NaN\n", "2013-01-02 -1.314992 -0.532977 -1.192366 -5 -1.0\n", "2013-01-03 -0.890640 -1.036566 -2.189510 -5 -2.0\n", "2013-01-04 -1.565294 -0.901578 -1.148267 -5 -3.0\n", "2013-01-05 -0.180890 -2.301889 -0.003075 -5 -4.0\n", "2013-01-06 -0.050440 -0.840614 -0.547810 -5 -5.0" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 丢失的数据" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandas 主要使用 np.nan 替换丢失的数据. 默认情况下它并不包含在计算中." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 重建索引允许 更改/添加/删除 指定指定轴索引, 并返回数据副本:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df1.loc[dates[0]: dates[1], 'E'] = 1" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2013-01-010.0000000.000000-0.9268185NaN1.0
2013-01-02-1.3149920.5329771.19236651.01.0
2013-01-030.890640-1.036566-2.18951052.0NaN
2013-01-041.565294-0.9015781.14826753.0NaN
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.926818 5 NaN 1.0\n", "2013-01-02 -1.314992 0.532977 1.192366 5 1.0 1.0\n", "2013-01-03 0.890640 -1.036566 -2.189510 5 2.0 NaN\n", "2013-01-04 1.565294 -0.901578 1.148267 5 3.0 NaN" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 删除任何有丢失数据的行:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2013-01-02-1.3149920.5329771.19236651.01.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-02 -1.314992 0.532977 1.192366 5 1.0 1.0" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.dropna(how='any')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 填充丢失数据:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2013-01-010.0000000.000000-0.92681855.01.0
2013-01-02-1.3149920.5329771.19236651.01.0
2013-01-030.890640-1.036566-2.18951052.05.0
2013-01-041.565294-0.9015781.14826753.05.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.926818 5 5.0 1.0\n", "2013-01-02 -1.314992 0.532977 1.192366 5 1.0 1.0\n", "2013-01-03 0.890640 -1.036566 -2.189510 5 2.0 5.0\n", "2013-01-04 1.565294 -0.901578 1.148267 5 3.0 5.0" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.fillna(value=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 获取值是否为 nan 的布尔标记:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2013-01-01FalseFalseFalseFalseTrueFalse
2013-01-02FalseFalseFalseFalseFalseFalse
2013-01-03FalseFalseFalseFalseFalseTrue
2013-01-04FalseFalseFalseFalseFalseTrue
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 False False False False True False\n", "2013-01-02 False False False False False False\n", "2013-01-03 False False False False False True\n", "2013-01-04 False False False False False True" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ " pd.isnull(df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 运算" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 统计\n", "计算时一般不包括丢失的数据" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 在 index 轴上计算均值:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 0.211899\n", "B 0.009351\n", "C -0.221097\n", "D 5.000000\n", "F 3.000000\n", "dtype: float64" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean() # axis参数默认为0, 表示 index 轴" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 在 column 轴上计算均值:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2013-01-01 1.018295\n", "2013-01-02 1.282070\n", "2013-01-03 0.932913\n", "2013-01-04 1.962396\n", "2013-01-05 2.295941\n", "2013-01-06 1.712227\n", "Freq: D, dtype: float64" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean(axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 用于运算的对象有不同维度并需要对齐. 除此之外, pandas 会自动沿着指定维度计算:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": true }, "outputs": [], "source": [ "s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2013-01-01 NaN\n", "2013-01-02 NaN\n", "2013-01-03 1.0\n", "2013-01-04 3.0\n", "2013-01-05 5.0\n", "2013-01-06 NaN\n", "Freq: D, dtype: float64" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.000000-0.9268185NaN
2013-01-02-1.3149920.5329771.19236651.0
2013-01-030.890640-1.036566-2.18951052.0
2013-01-041.565294-0.9015781.14826753.0
2013-01-050.1808902.301889-0.00307554.0
2013-01-06-0.050440-0.840614-0.54781055.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.926818 5 NaN\n", "2013-01-02 -1.314992 0.532977 1.192366 5 1.0\n", "2013-01-03 0.890640 -1.036566 -2.189510 5 2.0\n", "2013-01-04 1.565294 -0.901578 1.148267 5 3.0\n", "2013-01-05 0.180890 2.301889 -0.003075 5 4.0\n", "2013-01-06 -0.050440 -0.840614 -0.547810 5 5.0" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-01NaNNaNNaNNaNNaN
2013-01-02NaNNaNNaNNaNNaN
2013-01-03-0.109360-2.036566-3.1895104.01.0
2013-01-04-1.434706-3.901578-1.8517332.00.0
2013-01-05-4.819110-2.698111-5.0030750.0-1.0
2013-01-06NaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 NaN NaN NaN NaN NaN\n", "2013-01-02 NaN NaN NaN NaN NaN\n", "2013-01-03 -0.109360 -2.036566 -3.189510 4.0 1.0\n", "2013-01-04 -1.434706 -3.901578 -1.851733 2.0 0.0\n", "2013-01-05 -4.819110 -2.698111 -5.003075 0.0 -1.0\n", "2013-01-06 NaN NaN NaN NaN NaN" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sub(s, axis=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Apply" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 在数据上使用函数:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.000000-0.9268185NaN
2013-01-02-1.3149920.5329770.265548101.0
2013-01-03-0.424352-0.503589-1.923963153.0
2013-01-041.140942-1.405167-0.775696206.0
2013-01-051.3218320.896721-0.7787712510.0
2013-01-061.2713920.056107-1.3265803015.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.926818 5 NaN\n", "2013-01-02 -1.314992 0.532977 0.265548 10 1.0\n", "2013-01-03 -0.424352 -0.503589 -1.923963 15 3.0\n", "2013-01-04 1.140942 -1.405167 -0.775696 20 6.0\n", "2013-01-05 1.321832 0.896721 -0.778771 25 10.0\n", "2013-01-06 1.271392 0.056107 -1.326580 30 15.0" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(np.cumsum)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 2.880286\n", "B 3.338455\n", "C 3.381876\n", "D 0.000000\n", "F 4.000000\n", "dtype: float64" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(lambda x: x.max() - x.min())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 直方图" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": true }, "outputs": [], "source": [ "s = pd.Series(np.random.randint(0, 7, size=10))" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 3\n", "1 0\n", "2 6\n", "3 6\n", "4 1\n", "5 3\n", "6 4\n", "7 2\n", "8 5\n", "9 4\n", "dtype: int64" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6 2\n", "4 2\n", "3 2\n", "5 1\n", "2 1\n", "1 1\n", "0 1\n", "dtype: int64" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 字符串方法" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 序列可以使用一些字符串处理方法, 很轻易操作数据组中的每个元素, 比如以下代码片断.\n", "### 注意: 字符匹配方法默认情况下, 通常使用正则表达式(并且大多数时候都如此)." ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": true }, "outputs": [], "source": [ "s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 a\n", "1 b\n", "2 c\n", "3 aaba\n", "4 baca\n", "5 NaN\n", "6 caba\n", "7 dog\n", "8 cat\n", "dtype: object" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.str.lower()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 合并" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandas 提供各种工具以简便合并序列, 数据帧, 和组合对象. 在 连接/合并 类型操作中, 使用多种类型索引和相关数学函数." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 把 pandas 对象连接到一起:" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame(np.random.randn(10, 4))" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
01.1981390.255351-2.163206-0.546918
1-0.7579480.7194860.9449350.961493
2-1.231672-0.3012890.0158390.183131
31.0053500.0405371.3478310.562388
4-1.5607310.1276162.6065170.994567
51.243707-0.5229600.0734430.483926
61.6514480.2541950.295707-2.312916
7-0.208332-1.1972742.7388470.038823
8-0.295732-0.2110620.1817270.827109
91.2476130.318213-0.5256240.119192
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 1.198139 0.255351 -2.163206 -0.546918\n", "1 -0.757948 0.719486 0.944935 0.961493\n", "2 -1.231672 -0.301289 0.015839 0.183131\n", "3 1.005350 0.040537 1.347831 0.562388\n", "4 -1.560731 0.127616 2.606517 0.994567\n", "5 1.243707 -0.522960 0.073443 0.483926\n", "6 1.651448 0.254195 0.295707 -2.312916\n", "7 -0.208332 -1.197274 2.738847 0.038823\n", "8 -0.295732 -0.211062 0.181727 0.827109\n", "9 1.247613 0.318213 -0.525624 0.119192" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": true }, "outputs": [], "source": [ "pieces = [df[:3], df[3:7], df[7:]]" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[ 0 1 2 3\n", " 0 1.198139 0.255351 -2.163206 -0.546918\n", " 1 -0.757948 0.719486 0.944935 0.961493\n", " 2 -1.231672 -0.301289 0.015839 0.183131,\n", " 0 1 2 3\n", " 3 1.005350 0.040537 1.347831 0.562388\n", " 4 -1.560731 0.127616 2.606517 0.994567\n", " 5 1.243707 -0.522960 0.073443 0.483926\n", " 6 1.651448 0.254195 0.295707 -2.312916,\n", " 0 1 2 3\n", " 7 -0.208332 -1.197274 2.738847 0.038823\n", " 8 -0.295732 -0.211062 0.181727 0.827109\n", " 9 1.247613 0.318213 -0.525624 0.119192]" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pieces" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
01.1981390.255351-2.163206-0.546918
1-0.7579480.7194860.9449350.961493
2-1.231672-0.3012890.0158390.183131
31.0053500.0405371.3478310.562388
4-1.5607310.1276162.6065170.994567
51.243707-0.5229600.0734430.483926
61.6514480.2541950.295707-2.312916
7-0.208332-1.1972742.7388470.038823
8-0.295732-0.2110620.1817270.827109
91.2476130.318213-0.5256240.119192
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 1.198139 0.255351 -2.163206 -0.546918\n", "1 -0.757948 0.719486 0.944935 0.961493\n", "2 -1.231672 -0.301289 0.015839 0.183131\n", "3 1.005350 0.040537 1.347831 0.562388\n", "4 -1.560731 0.127616 2.606517 0.994567\n", "5 1.243707 -0.522960 0.073443 0.483926\n", "6 1.651448 0.254195 0.295707 -2.312916\n", "7 -0.208332 -1.197274 2.738847 0.038823\n", "8 -0.295732 -0.211062 0.181727 0.827109\n", "9 1.247613 0.318213 -0.525624 0.119192" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat(pieces)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 连接" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### SQL 样式合并:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": true }, "outputs": [], "source": [ "left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": true }, "outputs": [], "source": [ "right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keylval
0foo1
1foo2
\n", "
" ], "text/plain": [ " key lval\n", "0 foo 1\n", "1 foo 2" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "left" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyrval
0foo4
1foo5
\n", "
" ], "text/plain": [ " key rval\n", "0 foo 4\n", "1 foo 5" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "right" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keylvalrval
0foo14
1foo15
2foo24
3foo25
\n", "
" ], "text/plain": [ " key lval rval\n", "0 foo 1 4\n", "1 foo 1 5\n", "2 foo 2 4\n", "3 foo 2 5" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left, right, on='key')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 添加" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 添加行到数据帧:" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0-1.1145720.0975310.0222820.219714
11.040871-2.641861-0.197795-0.430224
21.064996-0.8155162.375643-2.706566
30.2081410.107715-0.1630680.252386
40.921251-0.3369590.5027000.802547
50.0472862.0259580.9542831.381018
60.518963-1.5399090.0215471.477309
7-0.1068940.862488-0.828176-0.815590
\n", "
" ], "text/plain": [ " A B C D\n", "0 -1.114572 0.097531 0.022282 0.219714\n", "1 1.040871 -2.641861 -0.197795 -0.430224\n", "2 1.064996 -0.815516 2.375643 -2.706566\n", "3 0.208141 0.107715 -0.163068 0.252386\n", "4 0.921251 -0.336959 0.502700 0.802547\n", "5 0.047286 2.025958 0.954283 1.381018\n", "6 0.518963 -1.539909 0.021547 1.477309\n", "7 -0.106894 0.862488 -0.828176 -0.815590" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": true }, "outputs": [], "source": [ "s = df.iloc[3]" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0-1.1145720.0975310.0222820.219714
11.040871-2.641861-0.197795-0.430224
21.064996-0.8155162.375643-2.706566
30.2081410.107715-0.1630680.252386
40.921251-0.3369590.5027000.802547
50.0472862.0259580.9542831.381018
60.518963-1.5399090.0215471.477309
7-0.1068940.862488-0.828176-0.815590
80.2081410.107715-0.1630680.252386
\n", "
" ], "text/plain": [ " A B C D\n", "0 -1.114572 0.097531 0.022282 0.219714\n", "1 1.040871 -2.641861 -0.197795 -0.430224\n", "2 1.064996 -0.815516 2.375643 -2.706566\n", "3 0.208141 0.107715 -0.163068 0.252386\n", "4 0.921251 -0.336959 0.502700 0.802547\n", "5 0.047286 2.025958 0.954283 1.381018\n", "6 0.518963 -1.539909 0.021547 1.477309\n", "7 -0.106894 0.862488 -0.828176 -0.815590\n", "8 0.208141 0.107715 -0.163068 0.252386" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.append(s, ignore_index=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 分组" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于 \"group by\" 指的是以下一个或多个处理:\n", "- 将数据按某些标准分割为不同的组\n", "- 在每个独立组上应用函数\n", "- 组合结果为一个数据结构" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'bar'],\n", " 'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],\n", " 'C': np.random.randn(8),\n", " 'D': np.random.randn(8)})" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0fooone-0.3220290.593835
1barone-1.4852720.700787
2footwo0.9144290.699238
3barthree-1.552597-0.003782
4footwo3.0255110.586944
5bartwo0.4998080.383772
6fooone-0.263149-0.431824
7barthree0.9677520.946886
\n", "
" ], "text/plain": [ " A B C D\n", "0 foo one -0.322029 0.593835\n", "1 bar one -1.485272 0.700787\n", "2 foo two 0.914429 0.699238\n", "3 bar three -1.552597 -0.003782\n", "4 foo two 3.025511 0.586944\n", "5 bar two 0.499808 0.383772\n", "6 foo one -0.263149 -0.431824\n", "7 bar three 0.967752 0.946886" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 分组, 然后应用函数统计总和, 存放到结果组:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CD
A
bar-1.5703082.027663
foo3.3547631.448194
\n", "
" ], "text/plain": [ " C D\n", "A \n", "bar -1.570308 2.027663\n", "foo 3.354763 1.448194" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('A').sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 按多列分组为层次索引, 然后应用函数:" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CD
AB
barone-1.4852720.700787
three-0.5848450.943104
two0.4998080.383772
fooone-0.5851780.162011
two3.9399401.286183
\n", "
" ], "text/plain": [ " C D\n", "A B \n", "bar one -1.485272 0.700787\n", " three -0.584845 0.943104\n", " two 0.499808 0.383772\n", "foo one -0.585178 0.162011\n", " two 3.939940 1.286183" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby(['A', 'B']).sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 重塑" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 堆叠" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('bar', 'one'),\n", " ('bar', 'two'),\n", " ('baz', 'one'),\n", " ('baz', 'two'),\n", " ('foo', 'one'),\n", " ('foo', 'two'),\n", " ('qux', 'one'),\n", " ('qux', 'two')]" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tuples = list(zip(*[['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],\n", " ['one', 'two', 'one', 'two','one', 'two', 'one', 'two']]))\n", "tuples" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "collapsed": true }, "outputs": [], "source": [ "index = pd.MultiIndex.from_tuples(tuples, names=['first', 'seconds'])" ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
firstseconds
barone-0.5586950.105423
two0.271188-0.217300
bazone0.093175-0.225239
two-0.093316-0.791467
fooone-0.1454130.126640
two1.1205561.117124
quxone-1.304878-1.166168
two0.5227160.857816
\n", "
" ], "text/plain": [ " A B\n", "first seconds \n", "bar one -0.558695 0.105423\n", " two 0.271188 -0.217300\n", "baz one 0.093175 -0.225239\n", " two -0.093316 -0.791467\n", "foo one -0.145413 0.126640\n", " two 1.120556 1.117124\n", "qux one -1.304878 -1.166168\n", " two 0.522716 0.857816" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df2 = df[:4]" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
firstseconds
barone-0.5586950.105423
two0.271188-0.217300
bazone0.093175-0.225239
two-0.093316-0.791467
\n", "
" ], "text/plain": [ " A B\n", "first seconds \n", "bar one -0.558695 0.105423\n", " two 0.271188 -0.217300\n", "baz one 0.093175 -0.225239\n", " two -0.093316 -0.791467" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 堆叠函数, \"压缩\" 数据帧的列一个级别:" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": true }, "outputs": [], "source": [ "stacked = df2.stack()" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "first seconds \n", "bar one A -0.558695\n", " B 0.105423\n", " two A 0.271188\n", " B -0.217300\n", "baz one A 0.093175\n", " B -0.225239\n", " two A -0.093316\n", " B -0.791467\n", "dtype: float64" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 被 \"堆叠\" 数据帧或序列(有多个索引作为索引), 其堆叠的反向操作为取消堆叠, 上面的数据默认反堆叠到上一级别:" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
firstseconds
barone-0.5586950.105423
two0.271188-0.217300
bazone0.093175-0.225239
two-0.093316-0.791467
\n", "
" ], "text/plain": [ " A B\n", "first seconds \n", "bar one -0.558695 0.105423\n", " two 0.271188 -0.217300\n", "baz one 0.093175 -0.225239\n", " two -0.093316 -0.791467" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack()" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
secondsonetwo
first
barA-0.5586950.271188
B0.105423-0.217300
bazA0.093175-0.093316
B-0.225239-0.791467
\n", "
" ], "text/plain": [ "seconds one two\n", "first \n", "bar A -0.558695 0.271188\n", " B 0.105423 -0.217300\n", "baz A 0.093175 -0.093316\n", " B -0.225239 -0.791467" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack(level=1)" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
firstbarbaz
seconds
oneA-0.5586950.093175
B0.105423-0.225239
twoA0.271188-0.093316
B-0.217300-0.791467
\n", "
" ], "text/plain": [ "first bar baz\n", "seconds \n", "one A -0.558695 0.093175\n", " B 0.105423 -0.225239\n", "two A 0.271188 -0.093316\n", " B -0.217300 -0.791467" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack(level=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数据透视表" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 查看数据透视表" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3,\n", " 'B': ['A', 'B', 'C'] * 4,\n", " 'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,\n", " 'D': np.random.randn(12),\n", " 'E': np.random.randn(12)})" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
0oneAfoo1.894734-2.293275
1oneBfoo-1.362782-0.130090
2twoCfoo0.8438210.649588
3threeAbar0.496000-0.623999
4oneBbar0.457438-0.495746
5oneCbar-0.645673-0.517788
6twoAfoo-1.2472290.242816
7threeBfoo1.6669031.620036
8oneCfoo-0.585036-0.344293
9oneAbar0.2778020.688129
10twoBbar0.9883460.868884
11threeCbar-2.2026650.232460
\n", "
" ], "text/plain": [ " A B C D E\n", "0 one A foo 1.894734 -2.293275\n", "1 one B foo -1.362782 -0.130090\n", "2 two C foo 0.843821 0.649588\n", "3 three A bar 0.496000 -0.623999\n", "4 one B bar 0.457438 -0.495746\n", "5 one C bar -0.645673 -0.517788\n", "6 two A foo -1.247229 0.242816\n", "7 three B foo 1.666903 1.620036\n", "8 one C foo -0.585036 -0.344293\n", "9 one A bar 0.277802 0.688129\n", "10 two B bar 0.988346 0.868884\n", "11 three C bar -2.202665 0.232460" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 我们可以从上面的数据中, 非常容易的产生数据透视表:" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cbarfoo
AB
oneA0.2778021.894734
B0.457438-1.362782
C-0.645673-0.585036
threeA0.496000NaN
BNaN1.666903
C-2.202665NaN
twoANaN-1.247229
B0.988346NaN
CNaN0.843821
\n", "
" ], "text/plain": [ "C bar foo\n", "A B \n", "one A 0.277802 1.894734\n", " B 0.457438 -1.362782\n", " C -0.645673 -0.585036\n", "three A 0.496000 NaN\n", " B NaN 1.666903\n", " C -2.202665 NaN\n", "two A NaN -1.247229\n", " B 0.988346 NaN\n", " C NaN 0.843821" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 时间序列" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandas 有易用, 强大且高效的函数用于高频数据重采样转换操作(例如: 转换秒数据到5分钟数据). \n", "这是很普通的情况, 但不局限于金融应用." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 重新采样:" ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": true }, "outputs": [], "source": [ "rng = pd.date_range('1/1/2012', periods=100, freq='S')" ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-01-01 21689\n", "Freq: 5T, dtype: int64" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.resample('5MIN').sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 时区表示:" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "collapsed": true }, "outputs": [], "source": [ "rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D')" ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ts = pd.Series(np.random.randn(len(rng)), index=rng)" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-03-06 -0.766239\n", "2012-03-07 0.453263\n", "2012-03-08 -0.490956\n", "2012-03-09 -1.291874\n", "2012-03-10 -0.463390\n", "Freq: D, dtype: float64" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ts_utc = ts.tz_localize('UTC')" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-03-06 00:00:00+00:00 -0.766239\n", "2012-03-07 00:00:00+00:00 0.453263\n", "2012-03-08 00:00:00+00:00 -0.490956\n", "2012-03-09 00:00:00+00:00 -1.291874\n", "2012-03-10 00:00:00+00:00 -0.463390\n", "Freq: D, dtype: float64" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts_utc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 转换到其它时区:" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-03-05 19:00:00-05:00 -0.766239\n", "2012-03-06 19:00:00-05:00 0.453263\n", "2012-03-07 19:00:00-05:00 -0.490956\n", "2012-03-08 19:00:00-05:00 -1.291874\n", "2012-03-09 19:00:00-05:00 -0.463390\n", "Freq: D, dtype: float64" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts_utc.tz_convert('US/Eastern')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 转换不同的时间跨度:" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": true }, "outputs": [], "source": [ "rng = pd.date_range('1/1/2012', periods=5, freq='M')" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ts = pd.Series(np.random.randn(len(rng)), index=rng)" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-01-31 0.095301\n", "2012-02-29 0.408777\n", "2012-03-31 -0.790425\n", "2012-04-30 0.090653\n", "2012-05-31 0.317007\n", "Freq: M, dtype: float64" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ps = ts.to_period()" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-01 0.095301\n", "2012-02 0.408777\n", "2012-03 -0.790425\n", "2012-04 0.090653\n", "2012-05 0.317007\n", "Freq: M, dtype: float64" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-01-01 0.095301\n", "2012-02-01 0.408777\n", "2012-03-01 -0.790425\n", "2012-04-01 0.090653\n", "2012-05-01 0.317007\n", "Freq: MS, dtype: float64" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps.to_timestamp()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 转换时段, 并且使用一些运算函数. 下例中, 我们转换年报11月到季度结束每日上午9点的数据:" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "collapsed": true }, "outputs": [], "source": [ "prng = pd.period_range('1990Q1', '2004Q4', freq='Q-NOV')" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ts = pd.Series(np.random.randn(len(prng)), index=prng)" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1990Q1 1.795697\n", "1990Q2 0.311190\n", "1990Q3 0.626286\n", "1990Q4 -3.022472\n", "1991Q1 0.482668\n", "Freq: Q-NOV, dtype: float64" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.head()" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1990-03-01 09:00 1.795697\n", "1990-06-01 09:00 0.311190\n", "1990-09-01 09:00 0.626286\n", "1990-12-01 09:00 -3.022472\n", "1991-03-01 09:00 0.482668\n", "Freq: H, dtype: float64" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 分类" ] }, { "cell_type": "code", "execution_count": 128, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame({'id': [1, 2, 3, 4, 5, 6], 'raw_grade': ['a', 'b', 'b', 'a', 'a', 'e']})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 转换原始类别为分类数据类型:" ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df['grade'] = df['raw_grade'].astype('category')" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 a\n", "1 b\n", "2 b\n", "3 a\n", "4 a\n", "5 e\n", "Name: grade, dtype: category\n", "Categories (3, object): [a, b, e]" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['grade']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 重命名分类为更有意义的名称(分配到 Series.cat.categories 对应位置):" ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df['grade'].cat.categories = ['very good', 'good', 'very bad']" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 very good\n", "1 good\n", "2 good\n", "3 very good\n", "4 very good\n", "5 very bad\n", "Name: grade, dtype: category\n", "Categories (3, object): [very good, good, very bad]" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['grade']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 重排顺分类, 同时添加缺少的分类(序列 .cat 方法下返回新默认序列):" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df['grade'] = df['grade'].cat.set_categories(['very bad', 'bad', 'medium', 'good', 'very good'])" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 very good\n", "1 good\n", "2 good\n", "3 very good\n", "4 very good\n", "5 very bad\n", "Name: grade, dtype: category\n", "Categories (5, object): [very bad, bad, medium, good, very good]" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['grade']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 排列分类中的顺序(不是按词汇排列):" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idraw_gradegrade
56every bad
12bgood
23bgood
01avery good
34avery good
45avery good
\n", "
" ], "text/plain": [ " id raw_grade grade\n", "5 6 e very bad\n", "1 2 b good\n", "2 3 b good\n", "0 1 a very good\n", "3 4 a very good\n", "4 5 a very good" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values('grade')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 类别列分组, 并且也显示空类别:" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "grade\n", "very bad 1\n", "bad 0\n", "medium 0\n", "good 2\n", "very good 3\n", "dtype: int64" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('grade').size()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 绘画" ] }, { "cell_type": "code", "execution_count": 137, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))" ] }, { "cell_type": "code", "execution_count": 138, "metadata": { "collapsed": true }, "outputs": [], "source": [ "ts = ts.cumsum()" ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.plot()" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 在数据帧中, 可以很方便的绘制带标签列:" ] }, { "cell_type": "code", "execution_count": 141, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=['A', 'B', 'C', 'D'])" ] }, { "cell_type": "code", "execution_count": 142, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = df.cumsum()" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plt.figure()\n", "df.plot()\n", "plt.legend(loc='best')" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 获取数据输入/输出" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## CSV" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 写入 csv 文件:" ] }, { "cell_type": "code", "execution_count": 145, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.to_csv('temp_file_foo.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 读取 csv 文件:" ] }, { "cell_type": "code", "execution_count": 146, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0ABCD
02000-01-01-1.1993951.387735-1.798714-0.633652
12000-01-02-0.9083961.301464-2.751684-0.756612
22000-01-03-1.2146371.722991-2.878235-1.103410
32000-01-04-1.4448171.526782-1.434901-0.878478
42000-01-05-2.3365660.7921540.702733-1.161456
52000-01-06-1.141497-0.1239910.006881-0.231437
62000-01-07-0.903127-0.106136-0.1053360.636556
72000-01-08-0.3636280.4843800.6040742.070136
82000-01-09-2.381704-1.3284552.261637-0.153917
92000-01-10-2.071101-1.5127073.693099-0.840669
102000-01-11-2.5653540.1301821.843764-1.024025
112000-01-12-2.319995-0.4956541.5029850.329354
122000-01-13-3.597537-0.9414852.3162600.292277
132000-01-14-2.936507-1.3046601.6233782.056469
142000-01-15-3.434638-0.5578513.0052932.351642
152000-01-16-4.416633-0.2639223.2175991.910207
162000-01-17-3.6206882.5763293.6665973.099960
172000-01-18-2.7819632.6653564.3509623.136723
182000-01-19-3.1034942.2068802.8007513.927562
192000-01-20-4.7477673.5658853.3287535.492230
202000-01-21-3.9597433.5677640.6689384.408660
212000-01-22-4.3074524.3138450.2680824.341462
222000-01-23-4.8205933.535090-0.2371963.653925
232000-01-24-4.3435033.3131420.1964623.228989
242000-01-25-4.0122442.340642-0.2392192.294877
252000-01-26-5.5844962.627301-0.9334132.826616
262000-01-27-5.3496541.431231-1.7473973.038043
272000-01-28-7.2748302.160869-1.5336473.606827
282000-01-29-7.4857181.098004-1.0623773.421171
292000-01-30-6.304430-0.640919-1.3609752.629127
..................
9702002-08-28-91.161762-18.28355212.647657-18.508526
9712002-08-29-89.573510-18.50444114.460417-17.223896
9722002-08-30-88.798781-16.76599316.420495-18.875415
9732002-08-31-88.407509-17.37946216.765101-20.467720
9742002-09-01-89.670998-16.86872415.976802-20.654874
9752002-09-02-87.923717-18.77003016.433847-18.946714
9762002-09-03-85.777104-20.93877717.576698-19.501421
9772002-09-04-85.720509-19.31557715.530183-18.799975
9782002-09-05-86.116354-19.41372813.943714-18.217563
9792002-09-06-86.582680-20.14105914.162898-17.635551
9802002-09-07-86.085200-19.33393613.006658-18.078151
9812002-09-08-84.737067-18.05893214.705133-17.673837
9822002-09-09-84.024475-17.71186015.487204-16.985294
9832002-09-10-83.368774-17.53542816.391717-16.527879
9842002-09-11-84.670374-18.16791816.634557-16.062619
9852002-09-12-85.539085-17.90205016.435134-16.825358
9862002-09-13-85.822989-17.39682615.872258-16.078469
9872002-09-14-86.006952-18.92576515.711982-15.066963
9882002-09-15-84.027412-18.77792917.269961-14.160437
9892002-09-16-84.371619-20.11841415.642104-15.423790
9902002-09-17-85.164808-19.81707613.001907-15.164830
9912002-09-18-84.218649-19.54637715.276487-15.387791
9922002-09-19-83.044203-19.22863015.735577-14.381051
9932002-09-20-85.338968-20.11277015.090700-15.749164
9942002-09-21-85.016944-19.63080714.161316-17.186947
9952002-09-22-86.204378-20.59355714.169823-18.647361
9962002-09-23-87.236501-19.62412913.717445-18.860626
9972002-09-24-85.017293-18.79662012.349552-19.443635
9982002-09-25-82.876770-19.97432113.262328-22.083206
9992002-09-26-83.219573-20.51867114.674183-21.022386
\n", "

1000 rows × 5 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 A B C D\n", "0 2000-01-01 -1.199395 1.387735 -1.798714 -0.633652\n", "1 2000-01-02 -0.908396 1.301464 -2.751684 -0.756612\n", "2 2000-01-03 -1.214637 1.722991 -2.878235 -1.103410\n", "3 2000-01-04 -1.444817 1.526782 -1.434901 -0.878478\n", "4 2000-01-05 -2.336566 0.792154 0.702733 -1.161456\n", "5 2000-01-06 -1.141497 -0.123991 0.006881 -0.231437\n", "6 2000-01-07 -0.903127 -0.106136 -0.105336 0.636556\n", "7 2000-01-08 -0.363628 0.484380 0.604074 2.070136\n", "8 2000-01-09 -2.381704 -1.328455 2.261637 -0.153917\n", "9 2000-01-10 -2.071101 -1.512707 3.693099 -0.840669\n", "10 2000-01-11 -2.565354 0.130182 1.843764 -1.024025\n", "11 2000-01-12 -2.319995 -0.495654 1.502985 0.329354\n", "12 2000-01-13 -3.597537 -0.941485 2.316260 0.292277\n", "13 2000-01-14 -2.936507 -1.304660 1.623378 2.056469\n", "14 2000-01-15 -3.434638 -0.557851 3.005293 2.351642\n", "15 2000-01-16 -4.416633 -0.263922 3.217599 1.910207\n", "16 2000-01-17 -3.620688 2.576329 3.666597 3.099960\n", "17 2000-01-18 -2.781963 2.665356 4.350962 3.136723\n", "18 2000-01-19 -3.103494 2.206880 2.800751 3.927562\n", "19 2000-01-20 -4.747767 3.565885 3.328753 5.492230\n", "20 2000-01-21 -3.959743 3.567764 0.668938 4.408660\n", "21 2000-01-22 -4.307452 4.313845 0.268082 4.341462\n", "22 2000-01-23 -4.820593 3.535090 -0.237196 3.653925\n", "23 2000-01-24 -4.343503 3.313142 0.196462 3.228989\n", "24 2000-01-25 -4.012244 2.340642 -0.239219 2.294877\n", "25 2000-01-26 -5.584496 2.627301 -0.933413 2.826616\n", "26 2000-01-27 -5.349654 1.431231 -1.747397 3.038043\n", "27 2000-01-28 -7.274830 2.160869 -1.533647 3.606827\n", "28 2000-01-29 -7.485718 1.098004 -1.062377 3.421171\n", "29 2000-01-30 -6.304430 -0.640919 -1.360975 2.629127\n", ".. ... ... ... ... ...\n", "970 2002-08-28 -91.161762 -18.283552 12.647657 -18.508526\n", "971 2002-08-29 -89.573510 -18.504441 14.460417 -17.223896\n", "972 2002-08-30 -88.798781 -16.765993 16.420495 -18.875415\n", "973 2002-08-31 -88.407509 -17.379462 16.765101 -20.467720\n", "974 2002-09-01 -89.670998 -16.868724 15.976802 -20.654874\n", "975 2002-09-02 -87.923717 -18.770030 16.433847 -18.946714\n", "976 2002-09-03 -85.777104 -20.938777 17.576698 -19.501421\n", "977 2002-09-04 -85.720509 -19.315577 15.530183 -18.799975\n", "978 2002-09-05 -86.116354 -19.413728 13.943714 -18.217563\n", "979 2002-09-06 -86.582680 -20.141059 14.162898 -17.635551\n", "980 2002-09-07 -86.085200 -19.333936 13.006658 -18.078151\n", "981 2002-09-08 -84.737067 -18.058932 14.705133 -17.673837\n", "982 2002-09-09 -84.024475 -17.711860 15.487204 -16.985294\n", "983 2002-09-10 -83.368774 -17.535428 16.391717 -16.527879\n", "984 2002-09-11 -84.670374 -18.167918 16.634557 -16.062619\n", "985 2002-09-12 -85.539085 -17.902050 16.435134 -16.825358\n", "986 2002-09-13 -85.822989 -17.396826 15.872258 -16.078469\n", "987 2002-09-14 -86.006952 -18.925765 15.711982 -15.066963\n", "988 2002-09-15 -84.027412 -18.777929 17.269961 -14.160437\n", "989 2002-09-16 -84.371619 -20.118414 15.642104 -15.423790\n", "990 2002-09-17 -85.164808 -19.817076 13.001907 -15.164830\n", "991 2002-09-18 -84.218649 -19.546377 15.276487 -15.387791\n", "992 2002-09-19 -83.044203 -19.228630 15.735577 -14.381051\n", "993 2002-09-20 -85.338968 -20.112770 15.090700 -15.749164\n", "994 2002-09-21 -85.016944 -19.630807 14.161316 -17.186947\n", "995 2002-09-22 -86.204378 -20.593557 14.169823 -18.647361\n", "996 2002-09-23 -87.236501 -19.624129 13.717445 -18.860626\n", "997 2002-09-24 -85.017293 -18.796620 12.349552 -19.443635\n", "998 2002-09-25 -82.876770 -19.974321 13.262328 -22.083206\n", "999 2002-09-26 -83.219573 -20.518671 14.674183 -21.022386\n", "\n", "[1000 rows x 5 columns]" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_csv('temp_file_foo.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## HDF5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 写入 HDF 存储:" ] }, { "cell_type": "code", "execution_count": 147, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.to_hdf('temp_file_foo.h5', key='df')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 读取 HDF 存储:" ] }, { "cell_type": "code", "execution_count": 148, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2000-01-01-1.1993951.387735-1.798714-0.633652
2000-01-02-0.9083961.301464-2.751684-0.756612
2000-01-03-1.2146371.722991-2.878235-1.103410
2000-01-04-1.4448171.526782-1.434901-0.878478
2000-01-05-2.3365660.7921540.702733-1.161456
2000-01-06-1.141497-0.1239910.006881-0.231437
2000-01-07-0.903127-0.106136-0.1053360.636556
2000-01-08-0.3636280.4843800.6040742.070136
2000-01-09-2.381704-1.3284552.261637-0.153917
2000-01-10-2.071101-1.5127073.693099-0.840669
2000-01-11-2.5653540.1301821.843764-1.024025
2000-01-12-2.319995-0.4956541.5029850.329354
2000-01-13-3.597537-0.9414852.3162600.292277
2000-01-14-2.936507-1.3046601.6233782.056469
2000-01-15-3.434638-0.5578513.0052932.351642
2000-01-16-4.416633-0.2639223.2175991.910207
2000-01-17-3.6206882.5763293.6665973.099960
2000-01-18-2.7819632.6653564.3509623.136723
2000-01-19-3.1034942.2068802.8007513.927562
2000-01-20-4.7477673.5658853.3287535.492230
2000-01-21-3.9597433.5677640.6689384.408660
2000-01-22-4.3074524.3138450.2680824.341462
2000-01-23-4.8205933.535090-0.2371963.653925
2000-01-24-4.3435033.3131420.1964623.228989
2000-01-25-4.0122442.340642-0.2392192.294877
2000-01-26-5.5844962.627301-0.9334132.826616
2000-01-27-5.3496541.431231-1.7473973.038043
2000-01-28-7.2748302.160869-1.5336473.606827
2000-01-29-7.4857181.098004-1.0623773.421171
2000-01-30-6.304430-0.640919-1.3609752.629127
...............
2002-08-28-91.161762-18.28355212.647657-18.508526
2002-08-29-89.573510-18.50444114.460417-17.223896
2002-08-30-88.798781-16.76599316.420495-18.875415
2002-08-31-88.407509-17.37946216.765101-20.467720
2002-09-01-89.670998-16.86872415.976802-20.654874
2002-09-02-87.923717-18.77003016.433847-18.946714
2002-09-03-85.777104-20.93877717.576698-19.501421
2002-09-04-85.720509-19.31557715.530183-18.799975
2002-09-05-86.116354-19.41372813.943714-18.217563
2002-09-06-86.582680-20.14105914.162898-17.635551
2002-09-07-86.085200-19.33393613.006658-18.078151
2002-09-08-84.737067-18.05893214.705133-17.673837
2002-09-09-84.024475-17.71186015.487204-16.985294
2002-09-10-83.368774-17.53542816.391717-16.527879
2002-09-11-84.670374-18.16791816.634557-16.062619
2002-09-12-85.539085-17.90205016.435134-16.825358
2002-09-13-85.822989-17.39682615.872258-16.078469
2002-09-14-86.006952-18.92576515.711982-15.066963
2002-09-15-84.027412-18.77792917.269961-14.160437
2002-09-16-84.371619-20.11841415.642104-15.423790
2002-09-17-85.164808-19.81707613.001907-15.164830
2002-09-18-84.218649-19.54637715.276487-15.387791
2002-09-19-83.044203-19.22863015.735577-14.381051
2002-09-20-85.338968-20.11277015.090700-15.749164
2002-09-21-85.016944-19.63080714.161316-17.186947
2002-09-22-86.204378-20.59355714.169823-18.647361
2002-09-23-87.236501-19.62412913.717445-18.860626
2002-09-24-85.017293-18.79662012.349553-19.443635
2002-09-25-82.876770-19.97432113.262328-22.083206
2002-09-26-83.219573-20.51867114.674183-21.022386
\n", "

1000 rows × 4 columns

\n", "
" ], "text/plain": [ " A B C D\n", "2000-01-01 -1.199395 1.387735 -1.798714 -0.633652\n", "2000-01-02 -0.908396 1.301464 -2.751684 -0.756612\n", "2000-01-03 -1.214637 1.722991 -2.878235 -1.103410\n", "2000-01-04 -1.444817 1.526782 -1.434901 -0.878478\n", "2000-01-05 -2.336566 0.792154 0.702733 -1.161456\n", "2000-01-06 -1.141497 -0.123991 0.006881 -0.231437\n", "2000-01-07 -0.903127 -0.106136 -0.105336 0.636556\n", "2000-01-08 -0.363628 0.484380 0.604074 2.070136\n", "2000-01-09 -2.381704 -1.328455 2.261637 -0.153917\n", "2000-01-10 -2.071101 -1.512707 3.693099 -0.840669\n", "2000-01-11 -2.565354 0.130182 1.843764 -1.024025\n", "2000-01-12 -2.319995 -0.495654 1.502985 0.329354\n", "2000-01-13 -3.597537 -0.941485 2.316260 0.292277\n", "2000-01-14 -2.936507 -1.304660 1.623378 2.056469\n", "2000-01-15 -3.434638 -0.557851 3.005293 2.351642\n", "2000-01-16 -4.416633 -0.263922 3.217599 1.910207\n", "2000-01-17 -3.620688 2.576329 3.666597 3.099960\n", "2000-01-18 -2.781963 2.665356 4.350962 3.136723\n", "2000-01-19 -3.103494 2.206880 2.800751 3.927562\n", "2000-01-20 -4.747767 3.565885 3.328753 5.492230\n", "2000-01-21 -3.959743 3.567764 0.668938 4.408660\n", "2000-01-22 -4.307452 4.313845 0.268082 4.341462\n", "2000-01-23 -4.820593 3.535090 -0.237196 3.653925\n", "2000-01-24 -4.343503 3.313142 0.196462 3.228989\n", "2000-01-25 -4.012244 2.340642 -0.239219 2.294877\n", "2000-01-26 -5.584496 2.627301 -0.933413 2.826616\n", "2000-01-27 -5.349654 1.431231 -1.747397 3.038043\n", "2000-01-28 -7.274830 2.160869 -1.533647 3.606827\n", "2000-01-29 -7.485718 1.098004 -1.062377 3.421171\n", "2000-01-30 -6.304430 -0.640919 -1.360975 2.629127\n", "... ... ... ... ...\n", "2002-08-28 -91.161762 -18.283552 12.647657 -18.508526\n", "2002-08-29 -89.573510 -18.504441 14.460417 -17.223896\n", "2002-08-30 -88.798781 -16.765993 16.420495 -18.875415\n", "2002-08-31 -88.407509 -17.379462 16.765101 -20.467720\n", "2002-09-01 -89.670998 -16.868724 15.976802 -20.654874\n", "2002-09-02 -87.923717 -18.770030 16.433847 -18.946714\n", "2002-09-03 -85.777104 -20.938777 17.576698 -19.501421\n", "2002-09-04 -85.720509 -19.315577 15.530183 -18.799975\n", "2002-09-05 -86.116354 -19.413728 13.943714 -18.217563\n", "2002-09-06 -86.582680 -20.141059 14.162898 -17.635551\n", "2002-09-07 -86.085200 -19.333936 13.006658 -18.078151\n", "2002-09-08 -84.737067 -18.058932 14.705133 -17.673837\n", "2002-09-09 -84.024475 -17.711860 15.487204 -16.985294\n", "2002-09-10 -83.368774 -17.535428 16.391717 -16.527879\n", "2002-09-11 -84.670374 -18.167918 16.634557 -16.062619\n", "2002-09-12 -85.539085 -17.902050 16.435134 -16.825358\n", "2002-09-13 -85.822989 -17.396826 15.872258 -16.078469\n", "2002-09-14 -86.006952 -18.925765 15.711982 -15.066963\n", "2002-09-15 -84.027412 -18.777929 17.269961 -14.160437\n", "2002-09-16 -84.371619 -20.118414 15.642104 -15.423790\n", "2002-09-17 -85.164808 -19.817076 13.001907 -15.164830\n", "2002-09-18 -84.218649 -19.546377 15.276487 -15.387791\n", "2002-09-19 -83.044203 -19.228630 15.735577 -14.381051\n", "2002-09-20 -85.338968 -20.112770 15.090700 -15.749164\n", "2002-09-21 -85.016944 -19.630807 14.161316 -17.186947\n", "2002-09-22 -86.204378 -20.593557 14.169823 -18.647361\n", "2002-09-23 -87.236501 -19.624129 13.717445 -18.860626\n", "2002-09-24 -85.017293 -18.796620 12.349553 -19.443635\n", "2002-09-25 -82.876770 -19.974321 13.262328 -22.083206\n", "2002-09-26 -83.219573 -20.518671 14.674183 -21.022386\n", "\n", "[1000 rows x 4 columns]" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_hdf('temp_file_foo.h5', key='df')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Excel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 写入 excel 文件:" ] }, { "cell_type": "code", "execution_count": 149, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df.to_excel('temp_file_foo.xlsx', sheet_name='Sheet1')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 读取 excel 文件:" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2000-01-01-1.1993951.387735-1.798714-0.633652
2000-01-02-0.9083961.301464-2.751684-0.756612
2000-01-03-1.2146371.722991-2.878235-1.103410
2000-01-04-1.4448171.526782-1.434901-0.878478
2000-01-05-2.3365660.7921540.702733-1.161456
2000-01-06-1.141497-0.1239910.006881-0.231437
2000-01-07-0.903127-0.106136-0.1053360.636556
2000-01-08-0.3636280.4843800.6040742.070136
2000-01-09-2.381704-1.3284552.261637-0.153917
2000-01-10-2.071101-1.5127073.693099-0.840669
2000-01-11-2.5653540.1301821.843764-1.024025
2000-01-12-2.319995-0.4956541.5029850.329354
2000-01-13-3.597537-0.9414852.3162600.292277
2000-01-14-2.936507-1.3046601.6233782.056469
2000-01-15-3.434638-0.5578513.0052932.351642
2000-01-16-4.416633-0.2639223.2175991.910207
2000-01-17-3.6206882.5763293.6665973.099960
2000-01-18-2.7819632.6653564.3509623.136723
2000-01-19-3.1034942.2068802.8007513.927562
2000-01-20-4.7477673.5658853.3287535.492230
2000-01-21-3.9597433.5677640.6689384.408660
2000-01-22-4.3074524.3138450.2680824.341462
2000-01-23-4.8205933.535090-0.2371963.653925
2000-01-24-4.3435033.3131420.1964623.228989
2000-01-25-4.0122442.340642-0.2392192.294877
2000-01-26-5.5844962.627301-0.9334132.826616
2000-01-27-5.3496541.431231-1.7473973.038043
2000-01-28-7.2748302.160869-1.5336473.606827
2000-01-29-7.4857181.098004-1.0623773.421171
2000-01-30-6.304430-0.640919-1.3609752.629127
...............
2002-08-28-91.161762-18.28355212.647657-18.508526
2002-08-29-89.573510-18.50444114.460417-17.223896
2002-08-30-88.798781-16.76599316.420495-18.875415
2002-08-31-88.407509-17.37946216.765101-20.467720
2002-09-01-89.670998-16.86872415.976802-20.654874
2002-09-02-87.923717-18.77003016.433847-18.946714
2002-09-03-85.777104-20.93877717.576698-19.501421
2002-09-04-85.720509-19.31557715.530183-18.799975
2002-09-05-86.116354-19.41372813.943714-18.217563
2002-09-06-86.582680-20.14105914.162898-17.635551
2002-09-07-86.085200-19.33393613.006658-18.078151
2002-09-08-84.737067-18.05893214.705133-17.673837
2002-09-09-84.024475-17.71186015.487204-16.985294
2002-09-10-83.368774-17.53542816.391717-16.527879
2002-09-11-84.670374-18.16791816.634557-16.062619
2002-09-12-85.539085-17.90205016.435134-16.825358
2002-09-13-85.822989-17.39682615.872258-16.078469
2002-09-14-86.006952-18.92576515.711982-15.066963
2002-09-15-84.027412-18.77792917.269961-14.160437
2002-09-16-84.371619-20.11841415.642104-15.423790
2002-09-17-85.164808-19.81707613.001907-15.164830
2002-09-18-84.218649-19.54637715.276487-15.387791
2002-09-19-83.044203-19.22863015.735577-14.381051
2002-09-20-85.338968-20.11277015.090700-15.749164
2002-09-21-85.016944-19.63080714.161316-17.186947
2002-09-22-86.204378-20.59355714.169823-18.647361
2002-09-23-87.236501-19.62412913.717445-18.860626
2002-09-24-85.017293-18.79662012.349553-19.443635
2002-09-25-82.876770-19.97432113.262328-22.083206
2002-09-26-83.219573-20.51867114.674183-21.022386
\n", "

1000 rows × 4 columns

\n", "
" ], "text/plain": [ " A B C D\n", "2000-01-01 -1.199395 1.387735 -1.798714 -0.633652\n", "2000-01-02 -0.908396 1.301464 -2.751684 -0.756612\n", "2000-01-03 -1.214637 1.722991 -2.878235 -1.103410\n", "2000-01-04 -1.444817 1.526782 -1.434901 -0.878478\n", "2000-01-05 -2.336566 0.792154 0.702733 -1.161456\n", "2000-01-06 -1.141497 -0.123991 0.006881 -0.231437\n", "2000-01-07 -0.903127 -0.106136 -0.105336 0.636556\n", "2000-01-08 -0.363628 0.484380 0.604074 2.070136\n", "2000-01-09 -2.381704 -1.328455 2.261637 -0.153917\n", "2000-01-10 -2.071101 -1.512707 3.693099 -0.840669\n", "2000-01-11 -2.565354 0.130182 1.843764 -1.024025\n", "2000-01-12 -2.319995 -0.495654 1.502985 0.329354\n", "2000-01-13 -3.597537 -0.941485 2.316260 0.292277\n", "2000-01-14 -2.936507 -1.304660 1.623378 2.056469\n", "2000-01-15 -3.434638 -0.557851 3.005293 2.351642\n", "2000-01-16 -4.416633 -0.263922 3.217599 1.910207\n", "2000-01-17 -3.620688 2.576329 3.666597 3.099960\n", "2000-01-18 -2.781963 2.665356 4.350962 3.136723\n", "2000-01-19 -3.103494 2.206880 2.800751 3.927562\n", "2000-01-20 -4.747767 3.565885 3.328753 5.492230\n", "2000-01-21 -3.959743 3.567764 0.668938 4.408660\n", "2000-01-22 -4.307452 4.313845 0.268082 4.341462\n", "2000-01-23 -4.820593 3.535090 -0.237196 3.653925\n", "2000-01-24 -4.343503 3.313142 0.196462 3.228989\n", "2000-01-25 -4.012244 2.340642 -0.239219 2.294877\n", "2000-01-26 -5.584496 2.627301 -0.933413 2.826616\n", "2000-01-27 -5.349654 1.431231 -1.747397 3.038043\n", "2000-01-28 -7.274830 2.160869 -1.533647 3.606827\n", "2000-01-29 -7.485718 1.098004 -1.062377 3.421171\n", "2000-01-30 -6.304430 -0.640919 -1.360975 2.629127\n", "... ... ... ... ...\n", "2002-08-28 -91.161762 -18.283552 12.647657 -18.508526\n", "2002-08-29 -89.573510 -18.504441 14.460417 -17.223896\n", "2002-08-30 -88.798781 -16.765993 16.420495 -18.875415\n", "2002-08-31 -88.407509 -17.379462 16.765101 -20.467720\n", "2002-09-01 -89.670998 -16.868724 15.976802 -20.654874\n", "2002-09-02 -87.923717 -18.770030 16.433847 -18.946714\n", "2002-09-03 -85.777104 -20.938777 17.576698 -19.501421\n", "2002-09-04 -85.720509 -19.315577 15.530183 -18.799975\n", "2002-09-05 -86.116354 -19.413728 13.943714 -18.217563\n", "2002-09-06 -86.582680 -20.141059 14.162898 -17.635551\n", "2002-09-07 -86.085200 -19.333936 13.006658 -18.078151\n", "2002-09-08 -84.737067 -18.058932 14.705133 -17.673837\n", "2002-09-09 -84.024475 -17.711860 15.487204 -16.985294\n", "2002-09-10 -83.368774 -17.535428 16.391717 -16.527879\n", "2002-09-11 -84.670374 -18.167918 16.634557 -16.062619\n", "2002-09-12 -85.539085 -17.902050 16.435134 -16.825358\n", "2002-09-13 -85.822989 -17.396826 15.872258 -16.078469\n", "2002-09-14 -86.006952 -18.925765 15.711982 -15.066963\n", "2002-09-15 -84.027412 -18.777929 17.269961 -14.160437\n", "2002-09-16 -84.371619 -20.118414 15.642104 -15.423790\n", "2002-09-17 -85.164808 -19.817076 13.001907 -15.164830\n", "2002-09-18 -84.218649 -19.546377 15.276487 -15.387791\n", "2002-09-19 -83.044203 -19.228630 15.735577 -14.381051\n", "2002-09-20 -85.338968 -20.112770 15.090700 -15.749164\n", "2002-09-21 -85.016944 -19.630807 14.161316 -17.186947\n", "2002-09-22 -86.204378 -20.593557 14.169823 -18.647361\n", "2002-09-23 -87.236501 -19.624129 13.717445 -18.860626\n", "2002-09-24 -85.017293 -18.796620 12.349553 -19.443635\n", "2002-09-25 -82.876770 -19.974321 13.262328 -22.083206\n", "2002-09-26 -83.219573 -20.518671 14.674183 -21.022386\n", "\n", "[1000 rows x 4 columns]" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_excel('temp_file_foo.xlsx', sheetname='Sheet1', index_col=None, na_values=['NA'])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 }