人工智能之Numpy与Pandas培训文档
创建时间:2018-09-09  访问量:3273  4  0

人工智能之Numpy与Pandas培训文档

数据可视化

pandas使用matplatlib进行数据库可视化展示的。使用pandas将数据分析后的结果用图表展示出来。

首先,按照约定引用matplotlib.plot的画图库

In [1]: import matplotlib.pyplot as plt

这个最好使用jupyter notebook进行学习,图表会以内联的形式显示在html页面中,当然,要在文件头部加下以下命令:

In [1]: %matplotlib inline

 

基本绘图操作

Pandas的Series和DataFrame中的plot()方法内部是用plt.plot()进行绘图的。

In [2]: ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) 

In [3]: ts = ts.cumsum() # 求累和

In [4]: ts.plot() # 画图
Out[4]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20d5690710>

如果索引包含日期,它会调用gcf().autofmt_xdate()来尝试格式化x轴来美化显示。

使用plot()方法很方便的绘制DataFrame中多列图表,分别以列标签区分:

In [5]: df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))

In [6]: df = df.cumsum()

In [7]: plt.figure(); df.plot();

你可以只在图中绘制一列数据,使用x轴与y轴标签。

In [8]: df3 = pd.DataFrame(np.random.randn(1000, 2), columns=['B', 'C']).cumsum()

In [9]: df3['A'] = pd.Series(list(range(len(df))))

In [10]: df3.plot(x='A', y='B') # x轴标签为A,y轴标签为B
Out[10]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20d5aabf28>

针对更多的格式化与样式调整,可以参考:http://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization-formatting

 

其它可视化图表

绘图方法允许除默认线图之外的一些绘图样式。 这些方法可以作为plot()的kind关键字参数提供,并包含:

如,条形图可以通过以下的方式创建:

In [11]: plt.figure();

In [12]: df.iloc[5].plot(kind='bar');

您还可以使用DataFrame.plot.<kind>方法创建这些图,而不仅仅是提供kind关键字的参数。 这样可以更容易地发现绘图方法及其使用的具体参数:

In [13]: df = pd.DataFrame()

In [14]: df.plot.<TAB>
df.plot.area     df.plot.barh     df.plot.density  df.plot.hist     df.plot.line     df.plot.scatter
df.plot.bar      df.plot.box      df.plot.hexbin   df.plot.kde      df.plot.pie

<TAB>表示按直tab键自动提示。

除了这些类型之外,还有DataFrame.hist()和DataFrame.boxplot()方法,它们使用单独的接口。

最后,pandas.plotting中还有几个绘图函数,它们将Series或DataFrame作为参数。 这些包括:

绘制的图表也可以使用错误栏或表格进行装饰。

 

条形图

对于带标签的非时间序列数据,您可能希望生成条形图:

In [15]: plt.figure();

In [16]: df.iloc[5].plot.bar(); plt.axhline(0, color='k')
Out[16]: <matplotlib.lines.Line2D at 0x7f20d46a4358>

调用DataFrame的plot.bar()方法会产生一个多条形图:

In [17]: df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])

In [18]: df2.plot.bar();

要生成堆积条形图,请传递stacked = True:

In [19]: df2.plot.bar(stacked=True);

要获得水平条形图,请使用barh方法:

In [20]: df2.plot.barh(stacked=True);

 

直方图

可以使用DataFrame.plot.hist()和Series.plot.hist()方法绘制直方图。

In [21]: df4 = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),
   ....:                     'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
   ....: 

In [22]: plt.figure();

In [23]: df4.plot.hist(alpha=0.5)
Out[23]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20cf918908>

 

可以使用stacked = True堆叠直方图。 可以使用bins关键字更改Bin大小。

In [24]: plt.figure();

In [25]: df4.plot.hist(stacked=True, bins=20)
Out[25]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20cf909a58>

您可以传递matplotlib hist支持的其他关键字。 例如,水平和累积直方图可以通过orientation ='horizontal'和cumulative = True绘制。

In [26]: plt.figure();

In [27]: df4['a'].plot.hist(orientation='horizontal', cumulative=True)
Out[27]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20cfbceba8>

仍然可以使用现有的接口DataFrame.hist来绘制直方图。

In [28]: plt.figure();

In [29]: df['A'].diff().hist()
Out[29]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20d550efd0>

DataFrame.hist()绘制多个子图上列的直方图:

In [30]: plt.figure()
Out[30]: <Figure size 640x480 with 0 Axes>

In [31]: df.diff().hist(color='k', alpha=0.5, bins=50)
Out[31]: 
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f20d47d7b38>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f20d490e978>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7f20d4924c88>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f20d41aff98>]], dtype=object)

可以指定by关键字来绘制分组直方图:

In [32]: data = pd.Series(np.random.randn(1000))

In [33]: data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4))
Out[33]: 
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f20d51d9e48>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f20d5763c50>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7f20d576af60>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7f20d5a012b0>]], dtype=object)

箱形图

可以通过调用Series.plot.box()和DataFrame.plot.box()或DataFrame.boxplot()可视化每列中值的分布来绘制箱形图。

例如,这里是一个箱线图,表示在[0,1]上对均匀随机变量进行10次观测的五次试验。

In [34]: df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])

In [35]: df.plot.box()
Out[35]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20cf9400f0>

Boxplot可以通过color参数来指定显示的图形颜色,你可以传递键为boxeswhiskersmedianscaps的字典。如果字典中缺失了某些值,就使用黙认的颜色。boxplot也可以通过指sym参数来指定传单风格。

当您通过color关键字传递其他类型的参数时,它将直接传递给matplotlib中,为boxswhiskersmedians 和caps进行着色。

color应用于要绘制的每个框。 如果您想要更复杂的着色,可以通过传递return_type来获取每个绘制的艺术。

In [36]: color = dict(boxes='DarkGreen', whiskers='DarkOrange',
   ....:              medians='DarkBlue', caps='Gray')
   ....: 

In [37]: df.plot.box(color=color, sym='r+')
Out[37]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20d5907828>

此外,您可以传递matplotlib boxplot支持的其他关键字。 例如,可以通过vert = False和position关键字绘制水平和自定义框图。

In [38]: df.plot.box(vert=False, positions=[1, 4, 5, 6, 8])
Out[38]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20d5be8198>

仍然可以使用现有的接口DataFrame.boxplot来绘制boxplot。

In [39]: df = pd.DataFrame(np.random.rand(10,5))

In [40]: plt.figure();

In [41]: bp = df.boxplot()

您可以使用by关键字参数创建分层箱图,以创建分组。 例如,

In [42]: df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )

In [43]: df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])

In [44]: plt.figure();

In [45]: bp = df.boxplot(by='X')

您还可以将列的子集传递给plot,以按多个列分组:

In [46]: df = pd.DataFrame(np.random.rand(10,3), columns=['Col1', 'Col2', 'Col3'])

In [47]: df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])

In [48]: df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])

In [49]: plt.figure();

In [50]: bp = df.boxplot(column=['Col1','Col2'], by=['X','Y'])

在boxplot中,返回类型可以由return_type,keyword控制。 有效选择是{“axes”,“dict”,“both”,None}。 由DataFrame.boxplot和by关键字创建的Faceting也将影响输出类型:

Groupby.boxplot始终返回Series类型。

In [51]: np.random.seed(1234)

In [52]: df_box = pd.DataFrame(np.random.randn(50, 2))

In [53]: df_box['g'] = np.random.choice(['A', 'B'], size=50)

In [54]: df_box.loc[df_box['g'] == 'B', 1] += 3

In [55]: bp = df_box.boxplot(by='g')

上面的子图首先按数字列拆分,然后按g列的值拆分。 子图下方首先按g的值分割,然后按数字列分割。

In [56]: bp = df_box.groupby('g').boxplot()

 

区域图

您可以使用Series.plot.area()和DataFrame.plot.area()创建区域图。 区域图表默认堆叠。 要生成堆积区域图,每列必须是全部正值或全是负值。

当输入数据包含NaN时,它将自动填充0.如果要删除或填充不同的值,请在调用plot之前使用dataframe.dropna()或dataframe.fillna()。

In [57]: df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])

In [58]: df.plot.area();

要生成未堆叠的绘图,请传递stacked = False。 除非另有说明,否则Alpha值设置为0.5:

In [59]: df.plot.area(stacked=False);

 

散点图

可以使用DataFrame.plot.scatter()方法绘制散点图。 散点图需要x和y轴的数字列。 这些可以由x和y参数指定。

In [60]: df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])

In [61]: df.plot.scatter(x='a', y='b');

要在单个轴上绘制多个列组,请重复绘制方法,指定目标ax。 建议指定颜色和标签关键字以区分每个组。

In [62]: ax = df.plot.scatter(x='a', y='b', color='DarkBlue', label='Group 1');

In [63]: df.plot.scatter(x='c', y='d', color='DarkGreen', label='Group 2', ax=ax);

关键字c可以作为列的名称给出,以便为每个点提供颜色:

In [64]: df.plot.scatter(x='a', y='b', c='c', s=50);

您可以传递matplotlib scatter支持的其他关键字。 下面的示例显示了使用DataFrame列作为气泡大小的气泡图。

In [65]: df.plot.scatter(x='a', y='b', s=df['c']*200);

 

六角形图

您可以使用DataFrame.plot.hexbin()创建六边形bin图。 如果数据太密集而无法单独绘制每个点,则Hexbin图可能是散点图的有用替代方法。

In [66]: df = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])

In [67]: df['b'] = df['b'] + np.arange(1000)

In [68]: df.plot.hexbin(x='a', y='b', gridsize=25)
Out[68]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20c0e53b70>

一个很有用的参数就是gridsize;它控制着x方向上的六边形数量,黙认是100,一个更大的gridsize意味着更多的六边形数量,更小的bins。

默认情况下,计算每个(x,y)点周围的直方图数量。你也可以通过指定C和reduce_C_function参数进行聚合。C指定每个(x,y)点的值,reduce_C_function是一个参数函数,它将bin中的所有值减少为单个数字(例如,mean,max,sum,std)。在此示例中,位置由列a和b给出,而值由列z给出。bins由numpy中的max函数进行聚合。

In [69]: df = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])

In [70]: df['b'] = df['b'] = df['b'] + np.arange(1000)

In [71]: df['z'] = np.random.uniform(0, 3, 1000)

In [72]: df.plot.hexbin(x='a', y='b', C='z', reduce_C_function=np.max,
   ....:         gridsize=25)
   ....: 
Out[72]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20c0df8f98>

 

饼图

您可以使用DataFrame.plot.pie()或Series.plot.pie()创建饼图。如果您的数据包含任何NaN,它们将自动填充为0.如果您的数据中存在任何负值,则会引发ValueError。

In [73]: series = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')

In [74]: series.plot.pie(figsize=(6, 6))
Out[74]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20c0d15908>

对于饼图,最好使用方形图形,即图形纵横比1.您可以创建具有相等宽度和高度的图形,或者在绘制后通过调用ax.set_aspect('equal')强制纵横比相等后返回轴对象。

请注意,使用DataFrame的饼图要求您通过y参数指定目标列或subplots = True。 指定y时,将绘制所选列的饼图。 如果指定了subplots = True,则将每列的饼图绘制为子图。 默认情况下,每个饼图中都会绘制一个图例; 指定legend = False以隐藏它。

In [75]: df = pd.DataFrame(3 * np.random.rand(4, 2), index=['a', 'b', 'c', 'd'], columns=['x', 'y'])

In [76]: df.plot.pie(subplots=True, figsize=(8, 4))
Out[76]: 
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7f20c0cfdb00>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7f20c0ca3ef0>], dtype=object)

您可以使用labels和colors关键字来指定每个楔形的标签和颜色。

如果要隐藏楔形标签,请指定labels = None。 如果指定了fontsize,则该值将应用于楔形标签。 此外,可以使用matplotlib.pyplot.pie()支持的其他关键字。

In [77]: series.plot.pie(labels=['AA', 'BB', 'CC', 'DD'], colors=['r', 'g', 'b', 'c'],
   ....:                 autopct='%.2f', fontsize=20, figsize=(6, 6))
   ....: 
Out[77]: <matplotlib.axes._subplots.AxesSubplot at 0x7f20c0c25668>

如果传递总和小于1.0的值,则matplotlib会绘制一个半圆。

更多其它图形的绘制,大家可以参考官方文档,这里只是给大家一个认识,没必要写很多,都是官方文档中的内容,到用时就看看官方文档,看它支持哪些图形,有没有自己需要的形图,找到自己所需要的图形后,再看看怎么绘制。到实际使用时自然就会了。

 

这一节到这里就这么草率的完成了,如果需要了解更多,更强大的图表绘制方法,请参考matplotlib库:

https://matplotlib.org/users/index.html

 

Python就是个工具,知道它是干什么的?知道它有哪些库?分别用来做什么?numpy和pandas是怎么来分析数据的,大家只要知道有哪些分析函数?用来做什么样的运算?具体细节没必要知道,只要选几个函数或方法理解pandas的分析原理即可,都搞会了也没用,一个月就忘记了,是不是?

后面会讲到数学基础与机器学习理论知识,这个就要好好理解 了,前面不懂后面就更不懂了。