很多Pythoner应该早就知道,Python核心团队将在2020年1月1日停止支持Python 2.7。


我们也看到了用于Python数据分析的各种神器也陆续公布了取消支持Python 2.7的计划。IPython是首批放弃对Python 2支持的工具之一,紧随其后的是Matplotlib和最近的NumPy。其他流行的库,如scikit-learn和SciPy,也将取消对Python 2的支持。


2019年1月25日,Pandas发布了0.24.0版本,在对Python 2.7的取消支持的计划里,提到了从0.24开始,所有的新功能将不在支持Python 2.7,全面转向只对Python 3的支持。


可以感觉到,从2019年开始,很多的Python包即将全面支持Python 3,请各位Python 初学者在选择Python版本的时候,各位Python老程序员依然还在考虑是否继续使用Python 2的时候,各位手里掌控了Python包目前只支持Python 2.7的并有不少用户的朋友,可以死心塌地的转向Python 3了。


Tushare SDK在很早前就同时支持Python 2和3,所以并不存在版本的问题,未来在发布新工具的时候,也会转向Python 3版本。


Pandas 0.24的变化


提升依赖包版本


Pandas 0.24对各依赖包的最低版本进行了调整,提升了一些版本号,我们可以从以下表格中查看到各依赖包的最低版本要求。

其实用户并不需要专门考虑各种依赖包的版本问题,不管是新安装也好,手动升级Pandas版本也好,安装程序会自行升级依赖包的版本。


但是,如果用户对这些依赖包的版本有特定要求的时候,请谨慎升级。


重要新增功能介绍


0.24版本做了一些功能增强,这里只介绍增加的几个新接口。


1、创建数组的新方法


新版本添加了一个新的顶级方法array()来创建一维数组,可用于创建任意扩展,扩展数组是从0.23版本开始的一个概念,用于实现扩展NumPy类型系统的数据类型和数组。用兴趣的用户,可以查询pandas官网获得更多信息。


In[1]:pd.array([1,2,np.nan],dtype='Int64')
Out[2]:
<IntegerArray>
[1,2,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数组的新方法


在老的pandas版本里,我们可以通过.values来提取Series或者DataFrame的数据数组,而从0.24版本开始,Pandas提供了两个新的方法.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类型,而如果数据是Pandas自定义的数据类型就无法实现。所以在新版里,如果你想获取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的方法,但官方强烈建议用.array.to_numpy()来替代.values。


3、read_html()功能改进

在之前的版本,如果是一个正常的html table,pandas的read_html方法可以快速的将表格数据读取为一个DataFrame。但是,如果html table带有colspanrowspan属性的合并字段情况下,pandas会读取错误。


比如,我们这里有一个表格:

html代码是:

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


老版本read_html读取到的数据格式为:

In[9]:result
Out[9]:
[ABC
012NaN]


而新版pandas读取到的结果是:

In[10]:result
Out[10]:
[ABC
0112

[1rowsx3columns]]


可以看出,实际上旧版读取出来的数据是错误,而0.24版本进行了改进。


新旧版本的不兼容问题


除了增加了新接口,在一些功能方面也做了一些调整,我只拿最重要的变化来举例,希望各位Pandas的重度用户注意一下这些变化。

1、时间周期对象的加减操作
对于时间类型的加减操作,在以前的版本,返回的是整形结果,比如说两个日期相减:

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

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

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


而在新版里,结果为DateOffset对象:

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

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

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



2、DataFrame广播运算的变化

对于DF的广播运算操作主要的变化有:
1)对于具有1行或1列的2维的DF运算操作,将以相同的ndarray方式进行广播。
2)DataFrame进行一个列表或元组运算,进行逐列操作,而不是行数全匹配。

来看一个实例:

In[87]:arr=np.arange(6).reshape(3,2)

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

In[89]:df
Out[89]:
01
001
123
245

[3rowsx2columns]


以前的方式,如果不匹配,会抛出ValueError

In[5]:df==arr[[0],:]
...:#comparisonpreviouslybroadcastwherearithmeticwouldraise
Out[5]:
01
0TrueTrue
1FalseFalse
2FalseFalse
In[6]:df+arr[[0],:]
...
ValueError:UnabletocoercetoDataFrame,shapemustbe(3,2):given(1,2)

In[7]:df==(1,2)
...:#lengthmatchesnumberofcolumns;
...:#comparisonpreviouslyraisedwherearithmeticwouldbroadcast
...
ValueError:Invalidbroadcastingcomparison[(1,2)]withblockvalues
In[8]:df+(1,2)
Out[8]:
01
013
135
257

In[9]:df==(1,2,3)
...:#lengthmatchesnumberofrows
...:#comparisonpreviouslybroadcastwherearithmeticwouldraise
Out[9]:
01
0FalseTrue
1TrueFalse
2FalseFalse
In[10]:df+(1,2,3)
...
ValueError:UnabletocoercetoSeries,lengthmustbe2:given3


在新版里,是这样的效果:

#Comparisonoperationsandarithmeticoperationsbothbroadcast.
In[90]:df==arr[[0],:]
Out[90]:
01
0TrueTrue
1FalseFalse
2FalseFalse

[3rowsx2columns]

In[91]:df+arr[[0],:]
Out[91]:
01
002
124
246

[3rowsx2columns]


#Comparisonoperationsandarithmeticoperationsbothbroadcast.
In[92]:df==(1,2)
Out[92]:
01
0FalseFalse
1FalseFalse
2FalseFalse

[3rowsx2columns]

In[93]:df+(1,2)
Out[93]:
01
013
135
257

[3rowsx2columns]


总结

除了上述一些变化以外,其实还有很多改进或者变动。总的来说,0.24.0版做了不少改进,也开启了pandas正式全面拥抱Python 3的进程,希望Pandas越来越好,也希望每一个用Pandas做数据分析的用户都能在数据里挖据出数据价值,同时实现自己的价值。