假设我有一个Excel文件,其中包含测试ID(字符串和数字 - 我自己并未将其命名为......),并且在测试期间以不同的增量结果(测试在特定的实例中进行) :
Inc. SV-101 GB-B1A 67.5
1 300 226 547
2 363 344 600
3 461 444 615
. . . .
. . . .
. . . .
10 421 444 625
我想使用xlrd打开文件。然后,我想创建一个循环,使用测试的名称创建一个列表。例如:
testID_SV-101 = ([300, 363, 461, ..., 421])
testID_GB-B1B = ([226, 344, 444, ..., 444])
testID_67.5 = ([547, 600, 615, ..., 625])
我的最终目标是使用测试结果并计算从增量4到9的斜率,然后绘制结果。说到这,这是实现我最终目标的最佳方式吗?
我已经想出了(有很多帮助)如何使用gnuplot来做到这一点,但是我预见它将无法完成我需要的所有事情,所以我决定开始学习Python。
答案 0 :(得分:0)
您的数据适用于python的数字库numpy
(但您也可以使用Pandas
,但这仍然基于numpy
。对于绘图,您应该查看例如matplotlib
您想要的是将工作表中的每一行存储为结构化数组中的记录。这是因为每一行都是与同一事物相关的逻辑事物组(例如测量结果)。稍后,您可以通过第一行中给出的名称访问所有这些名称,这些名称用于标识每个记录的含义。以下是可行的代码。
>>> import xlrd
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>>
>>> wb = xlrd.open_workbook('sto.xls')
>>> sheet = wb.sheet_by_name('Sheet1')
>>> headers = [str(cell.value) for cell in sheet.row(0)] # extra conversion to string required for later use in record array header
>>> headers
['Inc.', 'SV-101', 'GB-B1A', '67.5']
>>> arr = []
>>> for rowind in range(sheet.nrows)[1:]:
... arr.append([ cell.value for cell in sheet.row(rowind)])
...
>>> arr
[[1.0, 300.0, 226.0, 547.0], [2.0, 363.0, 344.0, 600.0], [3.0, 461.0, 444.0, 615.0]]
>>> data = np.rec.fromrecords(arr, names=headers)
>>> data
rec.array([(1.0, 300.0, 226.0, 547.0), (2.0, 363.0, 344.0, 600.0),
(3.0, 461.0, 444.0, 615.0)],
dtype=[('Inc.', '<f8'), ('SV-101', '<f8'), ('GB-B1A', '<f8'), ('67.5', '<f8')])
>>> data['SV-101'] # You can access columns by their name
array([ 300., 363., 461.])
>>> data['67.5'] # bit of a strange header name
array([ 547., 600., 615.])
>>> # If you want to plot e.g. the 3rd column vs the 2nd, do this:
>>> plt.plot(data['SV-101'], data['GB-B1A'])
[<matplotlib.lines.Line2D object at 0x2af3c90>]
>>> plt.show()
至于确定记录4和9之间的“斜率”,你的问题的一部分有点不清楚。你可能意味着每个连续记录之间的差异(然后是每列),在这种情况下你将得到5个值(在我的例子中只有2个):
>>> np.diff(data['SV-101'])
array([ 63., 98.])
或者您可能只想要这两个点之间的切线斜率,在这种情况下,您可以在这些点上获取您感兴趣的值(例如'GB-B1A')并除以相应的独立变量的差值(例如'SV-101'):
>>> (data['GB-B1A'][2] - data['GB-B1A'][0])/(data['SV-101'][2] - data['SV-101'][0])
1.3540372670807452
顺便说一下,你不能让python变量的名称如testID_SV-101
(因为短划线不是allowed in an identifier)或testID_67.5
(因为圆点的含义不同)。< / p>