溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Pandas 0.24發(fā)布,將放棄Python 2

發(fā)布時(shí)間:2020-08-13 15:32:24 來源:ITPUB博客 閱讀:462 作者:挖地兔訂閱號(hào) 欄目:編程語言

Pandas 0.24發(fā)布,將放棄Python 2

很多Pythoner應(yīng)該早就知道,Python核心團(tuán)隊(duì)將在2020年1月1日停止支持Python 2.7。


我們也看到了用于Python數(shù)據(jù)分析的各種神器也陸續(xù)公布了取消支持Python 2.7的計(jì)劃。IPython是首批放棄對(duì)Python 2支持的工具之一,緊隨其后的是Matplotlib和最近的NumPy。其他流行的庫,如scikit-learn和SciPy,也將取消對(duì)Python 2的支持。


2019年1月25日,Pandas發(fā)布了0.24.0版本,在對(duì)Python 2.7的取消支持的計(jì)劃里,提到了從0.24開始,所有的新功能將不在支持Python 2.7,全面轉(zhuǎn)向只對(duì)Python 3的支持。


可以感覺到,從2019年開始,很多的Python包即將全面支持Python 3,請(qǐng)各位Python 初學(xué)者在選擇Python版本的時(shí)候,各位Python老程序員依然還在考慮是否繼續(xù)使用Python 2的時(shí)候,各位手里掌控了Python包目前只支持Python 2.7的并有不少用戶的朋友,可以死心塌地的轉(zhuǎn)向Python 3了。


Tushare SDK在很早前就同時(shí)支持Python 2和3,所以并不存在版本的問題,未來在發(fā)布新工具的時(shí)候,也會(huì)轉(zhuǎn)向Python 3版本。


Pandas 0.24的變化


提升依賴包版本


Pandas 0.24對(duì)各依賴包的最低版本進(jìn)行了調(diào)整,提升了一些版本號(hào),我們可以從以下表格中查看到各依賴包的最低版本要求。

Pandas 0.24發(fā)布,將放棄Python 2

其實(shí)用戶并不需要專門考慮各種依賴包的版本問題,不管是新安裝也好,手動(dòng)升級(jí)Pandas版本也好,安裝程序會(huì)自行升級(jí)依賴包的版本。


但是,如果用戶對(duì)這些依賴包的版本有特定要求的時(shí)候,請(qǐng)謹(jǐn)慎升級(jí)。


重要新增功能介紹


0.24版本做了一些功能增強(qiáng),這里只介紹增加的幾個(gè)新接口。


1、創(chuàng)建數(shù)組的新方法


新版本添加了一個(gè)新的頂級(jí)方法array()來創(chuàng)建一維數(shù)組,可用于創(chuàng)建任意擴(kuò)展,擴(kuò)展數(shù)組是從0.23版本開始的一個(gè)概念,用于實(shí)現(xiàn)擴(kuò)展 NumPy類型系統(tǒng)的數(shù)據(jù)類型和數(shù)組。用興趣的用戶,可以查詢pandas官網(wǎng)獲得更多信息。


In [1]: pd.array([12, np.nan], dtype='Int64')
Out[2]: 
<IntegerArray>
[12, NaN]
Length: 3, dtype: Int64

In [2]: pd.array(['a''b''c'], dtype='category')
Out[2]: 
[a, b, c]
Categories (3, object): [a, b, c]


2、用于提取Series或Index數(shù)組的新方法


在老的pandas版本里,我們可以通過.values來提取Series或者DataFrame的數(shù)據(jù)數(shù)組,而從0.24版本開始,Pandas提供了兩個(gè)新的方法.array.to_numpy()。


In [3]: idx = pd.period_range('2000', periods=4)

In [4]: idx.array
Out[4]: 
<PeriodArray>
['2000-01-01''2000-01-02''2000-01-03''2000-01-04']
Length: 4, dtype: period[D]

In [5]: pd.Series(idx).array
Out[5]: 
<PeriodArray>
['2000-01-01''2000-01-02''2000-01-03''2000-01-04']
Length: 4, dtype: period[D]


老的方法每次返回的都是ndarray類型,而如果數(shù)據(jù)是Pandas自定義的數(shù)據(jù)類型就無法實(shí)現(xiàn)。所以在新版里,如果你想獲取NumPy的ndarry,可以使用新辦法:In [7]: idx.to_numpy()
Out[7]: 
array([Period('2000-01-01''D'), Period('2000-01-02''D'),
       Period('2000-01-03''D'), Period('2000-01-04''D')], dtype=object)

In [8]: pd.Series(idx).to_numpy()
Out[8]: 
array([Period('2000-01-01''D'), Period('2000-01-02''D'),
       Period('2000-01-03''D'), Period('2000-01-04''D')], dtype=object)


Pandas新版依然保留了.values的方法,但官方強(qiáng)烈建議用.array.to_numpy()來替代.values。


3、read_html()功能改進(jìn)

在之前的版本,如果是一個(gè)正常的html table,pandas的read_html方法可以快速的將表格數(shù)據(jù)讀取為一個(gè)DataFrame。但是,如果html table帶有colspanrowspan屬性的合并字段情況下,pandas會(huì)讀取錯(cuò)誤。


比如,我們這里有一個(gè)表格:

Pandas 0.24發(fā)布,將放棄Python 2

html代碼是:

In [8]: result = pd.read_html("""
   ....:   <table>
   ....:     <thead>
   ....:       <tr>
   ....:         <th>A</th><th>B</th><th>C</th>
   ....:       </tr>
   ....:     </thead>
   ....:     <tbody>
   ....:       <tr>
   ....:         <td colspan="2">1</td><td>2</td>
   ....:       </tr>
   ....:     </tbody>
   ....:   </table>"""
)
   ....:


老版本read_html讀取到的數(shù)據(jù)格式為:

In [9]: result
Out [9]:
[   A  B   C
 0  1  2 NaN]


而新版pandas讀取到的結(jié)果是:

In [10]: result
Out[10]: 
[   A  B  C
 0  1  1  2

 [1 rows x 3 columns]]


可以看出,實(shí)際上舊版讀取出來的數(shù)據(jù)是錯(cuò)誤,而0.24版本進(jìn)行了改進(jìn)。


新舊版本的不兼容問題


除了增加了新接口,在一些功能方面也做了一些調(diào)整,我只拿最重要的變化來舉例,希望各位Pandas的重度用戶注意一下這些變化。

1、時(shí)間周期對(duì)象的加減操作
對(duì)于時(shí)間類型的加減操作,在以前的版本,返回的是整形結(jié)果,比如說兩個(gè)日期相減:

In [12]: june = pd.Period('June 2018')

In [13]: april = pd.Period('April 2018')

In [14]: june - april
Out [14]: 2

而在新版里,結(jié)果為DateOffset對(duì)象:

In [16]: june = pd.Period('June 2018')

In [17]: april = pd.Period('April 2018')

In [18]: june - april
Out[18]: <2 * MonthEnds>


2、DataFrame廣播運(yùn)算的變化

對(duì)于DF的廣播運(yùn)算操作主要的變化有:
1)對(duì)于具有1行或1列的2維的DF運(yùn)算操作,將以相同的ndarray方式進(jìn)行廣播。
2)DataFrame進(jìn)行一個(gè)列表或元組運(yùn)算,進(jìn)行逐列操作,而不是行數(shù)全匹配。

來看一個(gè)實(shí)例:

In [87]: arr = np.arange(6).reshape(32)

In [88]: df = pd.DataFrame(arr)

In [89]: df
Out[89]: 
   0  1
0  0  1
1  2  3
2  4  5

[3 rows x 2 columns]


以前的方式,如果不匹配,會(huì)拋出ValueError

In [5]: df == arr[[0], :]
    ...: # comparison previously broadcast where arithmetic would raise
Out[5]:
       0      1
0   True   True
1  False  False
2  False  False
In [6]: df + arr[[0], :]
...
ValueError: Unable to coerce to DataFrame, shape must be (32): given (12)

In [7]: df == (12)
    ...: # length matches number of columns;
    ...: # comparison previously raised where arithmetic would broadcast
...
ValueError: Invalid broadcasting comparison [(12)] with block values
In [8]: df + (12)
Out[8]:
   0  1
0  1  3
1  3  5
2  5  7

In [9]: df == (123)
    ...:  # length matches number of rows
    ...:  # comparison previously broadcast where arithmetic would raise
Out[9]:
       0      1
0  False   True
1   True  False
2  False  False
In [10]: df + (123)
...
ValueError: Unable to coerce to Series, length must be 2: given 3

在新版里,是這樣的效果:
# Comparison operations and arithmetic operations both broadcast.
In [90]: df == arr[[0], :]
Out[90]: 
       0      1
0   True   True
1  False  False
2  False  False

[3 rows x 2 columns]

In [91]: df + arr[[0], :]
Out[91]: 
   0  1
0  0  2
1  2  4
2  4  6

[3 rows x 2 columns]

# Comparison operations and arithmetic operations both broadcast.
In [92]: df == (12)
Out[92]: 
       0      1
0  False  False
1  False  False
2  False  False

[3 rows x 2 columns]

In [93]: df + (12)
Out[93]: 
   0  1
0  1  3
1  3  5
2  5  7

[3 rows x 2 columns]

總結(jié)

除了上述一些變化以外,其實(shí)還有很多改進(jìn)或者變動(dòng)。總的來說,0.24.0版做了不少改進(jìn),也開啟了pandas正式全面擁抱Python 3的進(jìn)程,希望Pandas越來越好,也希望每一個(gè)用Pandas做數(shù)據(jù)分析的用戶都能在數(shù)據(jù)里挖據(jù)出數(shù)據(jù)價(jià)值,同時(shí)實(shí)現(xiàn)自己的價(jià)值。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI