在当今这个数据泛滥的时代,数据无处不在,只有当能够从中提取信息时,数据才变得有用。数据可视化是数据分析中最美丽的部分,它使能够以交互式和视觉化的方式描述数据。这是一种神奇的技术,能够一目了然地向大众传达信息,并从数据中讲述有趣的故事。
数据可视化在做出关键业务决策中扮演着非常重要的角色,尤其是在数据量非常大的情况下,企业从中提取决策性信息变得更加困难。
在数据分析过程中,完成数据清洗和数据操作后,下一步是从数据中提取有意义的洞察和结论,这可以通过图表来实现。Python为此目的提供了几个库。通常,只知道这两个库:matplotlib和seaborn。这些库提供了绘制折线图、饼图、条形图、箱形图等图表的功能。现在,可能会问,既然已经有了matplotlib和seaborn,为什么还需要其他的数据可视化库呢?这是第一次听说plotly和cufflinks时的疑问。然而,当阅读了它们的资料并在项目中使用它们后,完全被它们提供的强大功能所震撼。
Plotly是一个开源的绘图库,提供了交互式绘图的功能。该库可用于多种编程语言,如Python、R、MATLAB、Arduino和REST等。Cufflinks也是一个Python库,它将plotly与pandas连接起来,使能够直接在数据帧上创建图表。它本质上充当一个插件。Plotly图表是动态的,它允许悬停在值上,放大缩小图表,识别数据集中的异常值。另一方面,matplotlib和seaborn图表是静态的,不能放大或缩小,它不提供图表上每个值的详细信息。Plotly最重要的特性是它允许直接从Python为Web构建动态图表,这在matplotlib中是不可能的。使用plotly,还可以在地理、科学、统计和财务数据上创建动画和交互式图表。
首先,使用pip命令安装这两个库。
pip install plotly
pip install cufflinks
安装完成后,在Python shell或jupyter notebook中导入所有必要的模块。
import pandas as pd
import numpy as np
import plotly
import datetime
from datetime import date
import cufflinks as cf
为了在jupyter notebook中启用本地绘图的离线模式,编写以下代码。
from plotly import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
cf.go_offline()
在实施plotly之前,首先需要了解数据集以及可以应用的操作,以便使用各种图表进行数据可视化。从yahoo finance获取了塔塔汽车股价数据集,时间跨度为6年(2016-2021)。数据集有7列,包括日期、收盘价、开盘价、最高价、最低价、调整收盘价和成交量。然后在数据集中添加了两列,即年份和月份,这将有助于绘制图表。
import pandas as pd
stock_data=pd.read_csv('TTM.csv')
stock_data['Year']=pd.DatetimeIndex(stock_data['Date']).year
stock_data['Month']=pd.DatetimeIndex(stock_data['Date']).month
print(stock_data.head())
现在,将在此数据集上绘制几个图表。
import plotly.express as px
fig = px.line(stock_data, x="Date", y="Adj Close",title = 'TATAMOTORS SHARE PRICE (2016-2021)')
fig.show()
如上所见,Plotly提供了一组选项来调整可视化。在图表的右上角,可以看到10个按钮,提供多种功能。从左到右依次是下载图表为png图片的按钮,切换缩放模式和平移模式的切换按钮,放大和缩小按钮,以及重置图表比例的自动缩放按钮,重置轴按钮,切换图表中的尖刺线的按钮,以及切换不同鼠标悬停模式的一对切换按钮。
stock=stock_data.groupby('Year')['Adj Close'].mean()
fig = px.bar(stock, x=stock.index, y=stock.values,title = 'TATAMOTORS SHARE PRICE (2016-2021)',labels={'y':'Price'})
fig.show()
这个条形图显示了塔塔汽车在几年内的平均股价。
df=stock_data.loc[stock_data['Year']==2021,['Date','Adj Close','Volume','Year','Month']]
fig = px.scatter(df, x="Date", y="Adj Close", size='Volume',color='Month',title = 'TATAMOTORS SHARE PRICE (2016-2021)')
fig.show()
这个气泡图显示了2021年塔塔汽车股价在不同月份的变化,气泡的大小代表交易的股份数量。
fig = px.box(stock_data, x="Year", y="Adj Close",title = 'TATAMOTORS SHARE PRICE (2016-2021)')
fig.show()
这个箱形图提供了塔塔汽车不同年份股价的各种描述性统计数据。它提供了最大值、最小值、中位数、第一四分位数、第三四分位数以及排除异常值后的最大/最小值。
fig = px.histogram(stock_data, x="Adj Close",title = 'TATAMOTORS SHARE PRICE (2016-2021)')
fig.show()
直方图告诉塔塔汽车股价在6年内的计数。可以看到,在大部分时间里,股价在160卢比到200卢比之间。
dff= stock_data[['Adj Close','Year','Month']]
dff=dff.groupby(['Year','Month']).mean()
dff=dff.unstack(level=0)
dff.head()
month=['January','February','March','April','May','June','July','August','September','October','November','December']
year=[2016,2017,2018,2019,2020]
import plotly.graph_objects as go
fig = go.Figure(data=go.Heatmap(
z=dff,
x=year,
y=month,
colorscale='Viridis'))
fig.update_layout(title="TATAMOTORS SHARE PRICE (2016-2021) -> (Jan to Dec)")
fig.show()
热力图显示了塔塔汽车股价在不同月份及其相应年份的变化。通过悬停,可以得到每个区块的详细信息。
fig = go.Figure(data=[go.Candlestick(x=stock_data['Date'],
open=stock_data['Open'],
high=stock_data['High'],
low=stock_data['Low'],
close=stock_data['Adj Close'])])
fig.update_layout(title="TATAMOTORS SHARE PRICE (2016-2021)")
fig.show()
蜡烛图给出了每天的开盘价、收盘价、最高价和最低价。图表下方还有一个滑块,可以使用它来获取6年内任何范围的图表。
fig = px.area(y=stock_data["Adj Close"],x=stock_data['Date'],title = 'TATAMOTORS SHARE PRICE (2016-2021)',labels={'x':'Year','y':'Price'})
fig.update_layout(showlegend = False)
fig.show()