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

python, xlrd: Maniplulate spreadsheet data with xlrd function then graph the manipulated data

我正在尝试从 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()

给定的值列表:

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

纯python解:

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

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 数组作为容器。