python,xlrd:使用xlrd函数处理电子表格数据,然后绘制操纵数据的图形

时间:2016-09-27 00:42:27

标签: python-2.7 matplotlib xlrd

我正在尝试从Excel电子表格中提取数据,然后找到相邻行之间的百分比变化。我想要进行此操作的列是第1列和第4列。我希望使用第0列作为x轴,使用子图来绘制两个不同条形图中的这些百分比变化。 除了提取数据并在相邻行之间制定百分比变化之外,我能够做所有事情。百分比变化的公式是Current / previous-1或(r,0)/(r-1,0)-1。以下是我目前的剧本:

import xlrd
import numpy as np
import matplotlib.pyplot as plt  
import matplotlib.ticker as tkr
import matplotlib.dates as mdates
import datetime
from matplotlib import rc
rc('mathtext', default='regular')

file_location = "/Users/adampatel/Desktop/psw01.xls"
workbook = xlrd.open_workbook(file_location, on_demand = False)
worksheet = workbook.sheet_by_name('Data 1')

x = [worksheet.cell_value(i+1699, 0) for i in range(worksheet.nrows-1699)]
y1 = [worksheet.cell_value(i+1699, 1) for i in range(worksheet.nrows-1699)]
y2 = [worksheet.cell_value(i+1699, 4) for i in range(worksheet.nrows-1699)]

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212, sharex = ax1)

start_date = datetime.date(1899, 12, 30)
dates=[start_date + datetime.timedelta(xval) for xval in x]
ax1.xaxis.set_major_locator(mdates.MonthLocator((), bymonthday=1,     interval=2))
ax1.xaxis.set_minor_locator(mdates.MonthLocator((), bymonthday=1, interval=1))
ax1.xaxis.set_major_formatter(mdates.DateFormatter("%b'%y"))

ly1 = ax1.bar(dates, y1, 0.9)
ly2 = ax2.bar(dates, y2, 0.9)

ax1.grid()
ax2.grid()
ax1.set_ylim(-3,3)
ax2.set_ylim(-3,3)

fig.text(0.5, 0.04, 'Inventory Weekly Percent Change', ha='center', va='center', size = '14')
fig.text(0.06, 0.5, 'Weekly Percent Change', ha='center', va='center',  size = '14', rotation='vertical')

ax1.set_title('Oil', size = '12')
ax2.set_title('Gasoline', size = '12')

plt.savefig('Gasoline Inventories Weekly Percent Change.png', bbox_inches='tight', dpi=300)
plt.show()

1 个答案:

答案 0 :(得分:0)

给出值列表:

y1 = [1000,1010,950,1050,1100,1030]

纯python解决方案:

使用zip函数创建分子和分母的元组。然后使用list comprehension获取百分比变化列表。

pct_chg = [1.0*num / den - 1 for num, den in zip(y1[1:], y1)]

Numpy解决方案:

将列表转换为numpy数组,然后使用数组切片执行计算。

a1 = np.array(y1)
pct_chg = np.divide(a1[1:],a1[:-1])-1

Pandas套餐解决方案:

将列表转换为Pandas系列并使用内置百分比更改功能

s1 = pd.Series(y1)
pct_chg = s1.pct_change()

现在,pct_chg也是一个系列。您可以通过pct_chg.values在numpy数组中获取其值。在大多数情况下,Matplotlib应该接受numpy数组作为容器。