<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 量化分析師的Python日記【第6天:數據處理的瑞士軍刀pandas下篇 > 來源:https://uqer.io/community/share/5514bb11f9f06c12790415b2 ## 第二篇:快速進階 在上一篇中我們介紹了如何創建并訪問`pandas`的`Series`和`DataFrame`型的數據,本篇將介紹如何對`pandas`數據進行操作,掌握這些操作之后,基本可以處理大多數的數據了。首先,導入本篇中使用到的模塊: ```py import numpy as np import pandas as pd from pandas import Series, DataFrame ``` 為了看數據方便一些,我們設置一下輸出屏幕的寬度 ```py pd.set_option('display.width', 200) ``` ## 一、數據創建的其他方式 數據結構的創建不止是上篇中介紹的標準形式,本篇再介紹幾種。例如,我們可以創建一個以日期為元素的`Series`: ```py dates = pd.date_range('20150101', periods=5) print dates <class 'pandas.tseries.index.DatetimeIndex'> [2015-01-01, ..., 2015-01-05] Length: 5, Freq: D, Timezone: None ``` 將這個日期`Series`作為索引賦給一個`DataFrame`: ```py df = pd.DataFrame(np.random.randn(5, 4),index=dates,columns=list('ABCD')) print df A B C D 2015-01-01 -0.168870 0.191945 -0.906788 -1.295211 2015-01-02 -0.985849 0.312378 -1.513870 -0.876869 2015-01-03 -0.241945 1.437763 0.209494 0.061032 2015-01-04 0.139199 0.124118 -0.204801 -1.745327 2015-01-05 0.243644 -0.373126 0.333583 2.640955 ``` 只要是能轉換成`Series`的對象,都可以用于創建`DataFrame`: ```py df2 = pd.DataFrame({ 'A' : 1., 'B': pd.Timestamp('20150214'), 'C': pd.Series(1.6,index=list(range(4)),dtype='float64'), 'D' : np.array([4] * 4, dtype='int64'), 'E' : 'hello pandas!' }) print df2 A B C D E 0 1 2015-02-14 1.6 4 hello pandas! 1 1 2015-02-14 1.6 4 hello pandas! 2 1 2015-02-14 1.6 4 hello pandas! 3 1 2015-02-14 1.6 4 hello pandas! ``` ## 二、數據的查看 在多數情況下,數據并不由分析數據的人員生成,而是通過數據接口、外部文件或者其他方式獲取。這里我們通過量化實驗室的數據接口獲取一份數據作為示例: ```py stock_list = ['000001.XSHE', '000002.XSHE', '000568.XSHE', '000625.XSHE', '000768.XSHE', '600028.XSHG', '600030.XSHG', '601111.XSHG', '601390.XSHG', '601998.XSHG'] raw_data = DataAPI.MktEqudGet(secID=stock_list, beginDate='20150101', endDate='20150131', pandas='1') df = raw_data[['secID', 'tradeDate', 'secShortName', 'openPrice', 'highestPrice', 'lowestPrice', 'closePrice', 'turnoverVol']] ``` 以上代碼獲取了2015年一月份全部的交易日內十支股票的日行情信息,首先我們來看一下數據的大小: ```py print df.shape (200, 8) ``` 我們可以看到有200行,表示我們獲取到了200條記錄,每條記錄有8個字段,現在預覽一下數據,`dataframe.head()`和`dataframe.tail()`可以查看數據的頭五行和尾五行,若需要改變行數,可在括號內指定: ```py print "Head of this DataFrame:" print df.head() print "Tail of this DataFrame:" print df.tail(3) Head of this DataFrame: secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 0 000001.XSHE 2015-01-05 平安銀行 15.99 16.28 15.60 16.02 286043643 1 000001.XSHE 2015-01-06 平安銀行 15.85 16.39 15.55 15.78 216642140 2 000001.XSHE 2015-01-07 平安銀行 15.56 15.83 15.30 15.48 170012067 3 000001.XSHE 2015-01-08 平安銀行 15.50 15.57 14.90 14.96 140771421 4 000001.XSHE 2015-01-09 平安銀行 14.90 15.87 14.71 15.08 250850023 Tail of this DataFrame: secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 197 601998.XSHG 2015-01-28 中信銀行 7.04 7.32 6.95 7.15 163146128 198 601998.XSHG 2015-01-29 中信銀行 6.97 7.05 6.90 7.01 93003445 199 601998.XSHG 2015-01-30 中信銀行 7.10 7.14 6.92 6.95 68146718 ``` `dataframe.describe()`提供了`DataFrame`中純數值數據的統計信息: ```py print df.describe() openPrice highestPrice lowestPrice closePrice turnoverVol count 200.00000 200.000000 200.00000 200.000000 2.000000e+02 mean 15.17095 15.634000 14.86545 15.242750 2.384811e+08 std 7.72807 7.997345 7.56136 7.772184 2.330510e+08 min 6.14000 6.170000 6.02000 6.030000 1.242183e+07 25% 8.09500 8.250000 7.98750 8.127500 7.357002e+07 50% 13.96000 14.335000 13.75500 13.925000 1.554569e+08 75% 19.95000 20.500000 19.46250 20.012500 3.358617e+08 max 36.40000 37.250000 34.68000 36.150000 1.310855e+09 ``` 對數據的排序將便利我們觀察數據,`DataFrame`提供了兩種形式的排序。一種是按行列排序,即按照索引(行名)或者列名進行排序,可調用`dataframe.sort_index`,指定`axis=0`表示按索引(行名)排序,`axis=1`表示按列名排序,并可指定升序或者降序: ```py print "Order by column names, descending:" print df.sort_index(axis=1, ascending=False).head() Order by column names, descending: turnoverVol tradeDate secShortName secID openPrice lowestPrice highestPrice closePrice 0 286043643 2015-01-05 平安銀行 000001.XSHE 15.99 15.60 16.28 16.02 1 216642140 2015-01-06 平安銀行 000001.XSHE 15.85 15.55 16.39 15.78 2 170012067 2015-01-07 平安銀行 000001.XSHE 15.56 15.30 15.83 15.48 3 140771421 2015-01-08 平安銀行 000001.XSHE 15.50 14.90 15.57 14.96 4 250850023 2015-01-09 平安銀行 000001.XSHE 14.90 14.71 15.87 15.08 ``` 第二種排序是按值排序,可指定列名和排序方式,默認的是升序排序: ```py print "Order by column value, ascending:" print df.sort(columns='tradeDate').head() print "Order by multiple columns value:" df = df.sort(columns=['tradeDate', 'secID'], ascending=[False, True]) print df.head() Order by column value, ascending: secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 0 000001.XSHE 2015-01-05 平安銀行 15.99 16.28 15.60 16.02 286043643 20 000002.XSHE 2015-01-05 萬科A 14.39 15.29 14.22 14.91 656083570 40 000568.XSHE 2015-01-05 瀘州老窖 20.50 21.99 20.32 21.90 59304755 60 000625.XSHE 2015-01-05 長安汽車 16.40 18.07 16.32 18.07 82087982 80 000768.XSHE 2015-01-05 中航飛機 18.76 19.88 18.41 19.33 84199357 Order by multiple columns value: secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安銀行 13.93 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 萬科A 13.09 13.49 12.80 13.12 209624706 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飛機 25.38 25.65 24.28 24.60 59550293 ``` ## 三、數據的訪問和操作 ### 3.1 再談數據的訪問 上篇中已經介紹了使用`loc`、`iloc`、`at`、`iat`、`ix`以及`[]`訪問`DataFrame`數據的幾種方式,這里再介紹一種方法,使用`:`來獲取部行或者全部列: ```py print df.iloc[1:4][:] secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 39 000002.XSHE 2015-01-30 萬科A 13.09 13.49 12.80 13.12 209624706 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 ``` 我們可以擴展上篇介紹的使用布爾類型的向量獲取數據的方法,可以很方便地過濾數據,例如,我們要選出收盤價在均值以上的數據: ```py print df[df.closePrice > df.closePrice.mean()].head() secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飛機 25.38 25.65 24.28 24.60 59550293 139 600030.XSHG 2015-01-30 中信證券 28.50 28.72 27.78 27.86 304218245 58 000568.XSHE 2015-01-29 瀘州老窖 19.04 19.23 19.00 19.15 12421826 ``` `isin()`函數可方便地過濾`DataFrame`中的數據: ```py print df[df['secID'].isin(['601628.XSHG', '000001.XSHE', '600030.XSHG'])].head() print df.shape secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安銀行 13.93 14.12 13.76 13.93 93011669 139 600030.XSHG 2015-01-30 中信證券 28.50 28.72 27.78 27.86 304218245 18 000001.XSHE 2015-01-29 平安銀行 13.82 14.01 13.75 13.90 101675329 138 600030.XSHG 2015-01-29 中信證券 28.10 28.58 27.81 28.18 386310957 17 000001.XSHE 2015-01-28 平安銀行 13.87 14.30 13.80 14.06 124087755 (200, 8) ``` ### 3.2 處理缺失數據 在訪問數據的基礎上,我們可以更改數據,例如,修改某些元素為缺失值: ```py df['openPrice'][df['secID'] == '000001.XSHE'] = np.nan df['highestPrice'][df['secID'] == '601111.XSHG'] = np.nan df['lowestPrice'][df['secID'] == '601111.XSHG'] = np.nan df['closePrice'][df['secID'] == '000002.XSHE'] = np.nan df['turnoverVol'][df['secID'] == '601111.XSHG'] = np.nan print df.head(10) secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安銀行 NaN 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 萬科A 13.09 13.49 12.80 NaN 209624706 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飛機 25.38 25.65 24.28 24.60 59550293 119 600028.XSHG 2015-01-30 中國石化 6.14 6.17 6.02 6.03 502445638 139 600030.XSHG 2015-01-30 中信證券 28.50 28.72 27.78 27.86 304218245 159 601111.XSHG 2015-01-30 中國國航 7.92 NaN NaN 7.69 NaN 179 601390.XSHG 2015-01-30 中國中鐵 8.69 8.69 8.12 8.14 352357431 199 601998.XSHG 2015-01-30 中信銀行 7.10 7.14 6.92 6.95 68146718 ``` 原始數據的中很可能存在一些數據的缺失,就如同現在處理的這個樣例數據一樣,處理缺失數據有多種方式。通常使用`dataframe.dropna()`,`dataframe.dropna()`可以按行丟棄帶有`nan`的數據;若指定`how='all'`(默認是`'any'`),則只在整行全部是`nan`時丟棄數據;若指定`thresh`,則表示當某行數據非缺失列數超過指定數值時才保留;要指定根據某列丟棄可以通過`subset`完成。 ```py print "Data size before filtering:" print df.shape print "Drop all rows that have any NaN values:" print "Data size after filtering:" print df.dropna().shape print df.dropna().head(10) print "Drop only if all columns are NaN:" print "Data size after filtering:" print df.dropna(how='all').shape print df.dropna(how='all').head(10) print "Drop rows who do not have at least six values that are not NaN" print "Data size after filtering:" print df.dropna(thresh=6).shape print df.dropna(thresh=6).head(10) print "Drop only if NaN in specific column:" print "Data size after filtering:" print df.dropna(subset=['closePrice']).shape print df.dropna(subset=['closePrice']).head(10) Data size before filtering: (200, 8) Drop all rows that have any NaN values: Data size after filtering: (140, 8) secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飛機 25.38 25.65 24.28 24.60 59550293 119 600028.XSHG 2015-01-30 中國石化 6.14 6.17 6.02 6.03 502445638 139 600030.XSHG 2015-01-30 中信證券 28.50 28.72 27.78 27.86 304218245 179 601390.XSHG 2015-01-30 中國中鐵 8.69 8.69 8.12 8.14 352357431 199 601998.XSHG 2015-01-30 中信銀行 7.10 7.14 6.92 6.95 68146718 58 000568.XSHE 2015-01-29 瀘州老窖 19.04 19.23 19.00 19.15 12421826 78 000625.XSHE 2015-01-29 長安汽車 19.60 19.64 18.90 19.24 25546060 98 000768.XSHE 2015-01-29 中航飛機 24.65 25.63 24.53 24.98 67095945 Drop only if all columns are NaN: Data size after filtering: (200, 8) secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安銀行 NaN 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 萬科A 13.09 13.49 12.80 NaN 209624706 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飛機 25.38 25.65 24.28 24.60 59550293 119 600028.XSHG 2015-01-30 中國石化 6.14 6.17 6.02 6.03 502445638 139 600030.XSHG 2015-01-30 中信證券 28.50 28.72 27.78 27.86 304218245 159 601111.XSHG 2015-01-30 中國國航 7.92 NaN NaN 7.69 NaN 179 601390.XSHG 2015-01-30 中國中鐵 8.69 8.69 8.12 8.14 352357431 199 601998.XSHG 2015-01-30 中信銀行 7.10 7.14 6.92 6.95 68146718 Drop rows who do not have at least six values that are not NaN Data size after filtering: (180, 8) secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安銀行 NaN 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 萬科A 13.09 13.49 12.80 NaN 209624706 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飛機 25.38 25.65 24.28 24.60 59550293 119 600028.XSHG 2015-01-30 中國石化 6.14 6.17 6.02 6.03 502445638 139 600030.XSHG 2015-01-30 中信證券 28.50 28.72 27.78 27.86 304218245 179 601390.XSHG 2015-01-30 中國中鐵 8.69 8.69 8.12 8.14 352357431 199 601998.XSHG 2015-01-30 中信銀行 7.10 7.14 6.92 6.95 68146718 18 000001.XSHE 2015-01-29 平安銀行 NaN 14.01 13.75 13.90 101675329 Drop only if NaN in specific column: Data size after filtering: (180, 8) secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安銀行 NaN 14.12 13.76 13.93 93011669 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飛機 25.38 25.65 24.28 24.60 59550293 119 600028.XSHG 2015-01-30 中國石化 6.14 6.17 6.02 6.03 502445638 139 600030.XSHG 2015-01-30 中信證券 28.50 28.72 27.78 27.86 304218245 159 601111.XSHG 2015-01-30 中國國航 7.92 NaN NaN 7.69 NaN 179 601390.XSHG 2015-01-30 中國中鐵 8.69 8.69 8.12 8.14 352357431 199 601998.XSHG 2015-01-30 中信銀行 7.10 7.14 6.92 6.95 68146718 18 000001.XSHE 2015-01-29 平安銀行 NaN 14.01 13.75 13.90 101675329 ``` 有數據缺失時也未必是全部丟棄,`dataframe.fillna(value=value)`可以指定填補缺失值的數值 ```py print df.fillna(value=20150101).head() secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安銀行 20150101.00 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 萬科A 13.09 13.49 12.80 20150101.00 209624706 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飛機 25.38 25.65 24.28 24.60 59550293 ``` ### 3.3 數據操作 `Series`和`DataFrame`的類函數提供了一些函數,如`mean()`、`sum()`等,指定0按列進行,指定1按行進行: ```py df = raw_data[['secID', 'tradeDate', 'secShortName', 'openPrice', 'highestPrice', 'lowestPrice', 'closePrice', 'turnoverVol']] print df.mean(0) openPrice 1.517095e+01 highestPrice 1.563400e+01 lowestPrice 1.486545e+01 closePrice 1.524275e+01 turnoverVol 2.384811e+08 dtype: float64 ``` `value_counts`函數可以方便地統計頻數: ```py print df['closePrice'].value_counts().head() 6.58 3 13.12 2 9.13 2 8.58 2 6.93 2 dtype: int64 ``` 在`panda`中,`Series`可以調用`map`函數來對每個元素應用一個函數,`DataFrame`可以調用`apply`函數對每一列(行)應用一個函數,`applymap`對每個元素應用一個函數。這里面的函數可以是用戶自定義的一個lambda函數,也可以是已有的其他函數。下例展示了將收盤價調整到`[0, 1]`區間: ```py print df[['closePrice']].apply(lambda x: (x - x.min()) / (x.max() - x.min())).head() closePrice 0 0.331673 1 0.323705 2 0.313745 3 0.296481 4 0.300465 ``` 使用`append`可以在`Series`后添加元素,以及在`DataFrame`尾部添加一行: ```py dat1 = df[['secID', 'tradeDate', 'closePrice']].head() dat2 = df[['secID', 'tradeDate', 'closePrice']].iloc[2] print "Before appending:" print dat1 dat = dat1.append(dat2, ignore_index=True) print "After appending:" print dat Before appending: secID tradeDate closePrice 0 000001.XSHE 2015-01-05 16.02 1 000001.XSHE 2015-01-06 15.78 2 000001.XSHE 2015-01-07 15.48 3 000001.XSHE 2015-01-08 14.96 4 000001.XSHE 2015-01-09 15.08 After appending: secID tradeDate closePrice 0 000001.XSHE 2015-01-05 16.02 1 000001.XSHE 2015-01-06 15.78 2 000001.XSHE 2015-01-07 15.48 3 000001.XSHE 2015-01-08 14.96 4 000001.XSHE 2015-01-09 15.08 5 000001.XSHE 2015-01-07 15.48 ``` `DataFrame`可以像在SQL中一樣進行合并,在上篇中,我們介紹了使用`concat`函數創建`DataFrame`,這就是一種合并的方式。另外一種方式使用`merge`函數,需要指定依照哪些列進行合并,下例展示了如何根據security ID和交易日合并數據: ```py dat1 = df[['secID', 'tradeDate', 'closePrice']] dat2 = df[['secID', 'tradeDate', 'turnoverVol']] dat = dat1.merge(dat2, on=['secID', 'tradeDate']) print "The first DataFrame:" print dat1.head() print "The second DataFrame:" print dat2.head() print "Merged DataFrame:" print dat.head() The first DataFrame: secID tradeDate closePrice 0 000001.XSHE 2015-01-05 16.02 1 000001.XSHE 2015-01-06 15.78 2 000001.XSHE 2015-01-07 15.48 3 000001.XSHE 2015-01-08 14.96 4 000001.XSHE 2015-01-09 15.08 The second DataFrame: secID tradeDate turnoverVol 0 000001.XSHE 2015-01-05 286043643 1 000001.XSHE 2015-01-06 216642140 2 000001.XSHE 2015-01-07 170012067 3 000001.XSHE 2015-01-08 140771421 4 000001.XSHE 2015-01-09 250850023 Merged DataFrame: secID tradeDate closePrice turnoverVol 0 000001.XSHE 2015-01-05 16.02 286043643 1 000001.XSHE 2015-01-06 15.78 216642140 2 000001.XSHE 2015-01-07 15.48 170012067 3 000001.XSHE 2015-01-08 14.96 140771421 4 000001.XSHE 2015-01-09 15.08 250850023 ``` `DataFrame`另一個強大的函數是`groupby`,可以十分方便地對數據分組處理,我們對2015年一月內十支股票的開盤價,最高價,最低價,收盤價和成交量求平均值: ```py df_grp = df.groupby('secID') grp_mean = df_grp.mean() print grp_mean openPrice highestPrice lowestPrice closePrice turnoverVol secID 000001.XSHE 14.6550 14.9840 14.4330 14.6650 154710615 000002.XSHE 13.3815 13.7530 13.0575 13.4100 277459431 000568.XSHE 19.7220 20.1015 19.4990 19.7935 29199107 000625.XSHE 19.4915 20.2275 19.1040 19.7170 42633332 000768.XSHE 22.4345 23.4625 21.8830 22.6905 92781199 600028.XSHG 6.6060 6.7885 6.4715 6.6240 531966632 600030.XSHG 31.1505 32.0825 30.4950 31.2325 611544509 601111.XSHG 8.4320 8.6520 8.2330 8.4505 104143358 601390.XSHG 8.4060 8.6625 8.2005 8.4100 362831455 601998.XSHG 7.4305 7.6260 7.2780 7.4345 177541066 ``` 如果希望取每只股票的最新數據,應該怎么操作呢?`drop_duplicates`可以實現這個功能,首先對數據按日期排序,再按security ID去重: ```py df2 = df.sort(columns=['secID', 'tradeDate'], ascending=[True, False]) print df2.drop_duplicates(subset='secID') secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 19 000001.XSHE 2015-01-30 平安銀行 13.93 14.12 13.76 13.93 93011669 39 000002.XSHE 2015-01-30 萬科A 13.09 13.49 12.80 13.12 209624706 59 000568.XSHE 2015-01-30 瀘州老窖 19.15 19.51 19.11 19.12 14177179 79 000625.XSHE 2015-01-30 長安汽車 19.16 19.45 18.92 19.18 21233495 99 000768.XSHE 2015-01-30 中航飛機 25.38 25.65 24.28 24.60 59550293 119 600028.XSHG 2015-01-30 中國石化 6.14 6.17 6.02 6.03 502445638 139 600030.XSHG 2015-01-30 中信證券 28.50 28.72 27.78 27.86 304218245 159 601111.XSHG 2015-01-30 中國國航 7.92 8.03 7.65 7.69 61877792 179 601390.XSHG 2015-01-30 中國中鐵 8.69 8.69 8.12 8.14 352357431 199 601998.XSHG 2015-01-30 中信銀行 7.10 7.14 6.92 6.95 68146718 ``` 若想要保留最老的數據,可以在降序排列后取最后一個記錄,通過指定`take_last=True`(默認值為`False`,取第一條記錄)可以實現: ```py print df2.drop_duplicates(subset='secID', take_last=True) secID tradeDate secShortName openPrice highestPrice lowestPrice closePrice turnoverVol 0 000001.XSHE 2015-01-05 平安銀行 15.99 16.28 15.60 16.02 286043643 20 000002.XSHE 2015-01-05 萬科A 14.39 15.29 14.22 14.91 656083570 40 000568.XSHE 2015-01-05 瀘州老窖 20.50 21.99 20.32 21.90 59304755 60 000625.XSHE 2015-01-05 長安汽車 16.40 18.07 16.32 18.07 82087982 80 000768.XSHE 2015-01-05 中航飛機 18.76 19.88 18.41 19.33 84199357 100 600028.XSHG 2015-01-05 中國石化 6.59 7.14 6.45 7.14 1186499645 120 600030.XSHG 2015-01-05 中信證券 33.90 35.25 33.01 34.66 698627215 140 601111.XSHG 2015-01-05 中國國航 7.98 8.62 7.98 8.62 231611758 160 601390.XSHG 2015-01-05 中國中鐵 9.37 9.37 8.90 9.13 469902172 180 601998.XSHG 2015-01-05 中信銀行 8.15 8.33 7.91 8.16 337368242 ``` ## 四、數據可視化 `pandas`數據直接可以繪圖查看,下例中我們采用中國石化一月的收盤價進行繪圖,其中`set_index('tradeDate')['closePrice']`表示將`DataFrame`的`'tradeDate'`這一列作為索引,將`'closePrice'`這一列作為`Series`的值,返回一個`Series`對象,隨后調用`plot`函數繪圖,更多的參數可以在`matplotlib`的文檔中查看。 ```py dat = df[df['secID'] == '600028.XSHG'].set_index('tradeDate')['closePrice'] dat.plot(title="Close Price of SINOPEC (600028) during Jan, 2015") <matplotlib.axes.AxesSubplot at 0x49b6510> ``` ![](https://box.kancloud.cn/2016-07-30_579cb72f01b49.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看