我正在尝试从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()
答案 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数组作为容器。