我的 Python 代码没有从 .csv excel 文件中提取所有信息,我不知道为什么
My Python code isn't pulling all the information from the .csv excel file and I cannot figure out why
我对编码领域还很陌生,我的老板有点把我扔进了火里,所以如果这是新手犯的错误,我很抱歉,虽然我不认为是。
所以我正在尝试绘制 G 与 l1 的关系图(这不是 11,而是 L1)。数据在我从 excel 文件加载的文件中。 excel 文件是 14x250,所以有 14 个参数,每个参数有 250 个数据点。我张贴的图表格式正确,但 y 值显示为零。据我所知,代码绘制了前 12 列的图形,并保留了最后 2 列(包含两组 'y' 数据)。我找不到错误在哪里,这让我发疯!任何帮助将不胜感激!
这是我格式化 excel 文件的地方,我认为错误是:
header = ['l1', 'l2', 'l3', 'l4', 'l5', 'EI',
'S', 'P_right', 'P1_0', 'P3_0',
'w_left', 'w_right', 'G_left', 'G_right']
def loadfile(filename, skip=[], *args):
output = []
with open(filename, *args) as f:
reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
for i, row in enumerate(reader):
if not(i in skip):
output.append(row)
return np.array(output)
这是我实际加载 excel 文件的地方,这是下一个可能出错的地方:
outputs_l1 = [loadfile('FILE.csv'.format(p)) for p in p3_arr]
fig = plt.figure()
for output, col in zip(outputs_l1, colors):
plt.plot(output[:,0], output[:,10]*1E3, col+'-')
plt.legend(['$P3 = {} Pa$'.format(p) for p in p3_arr], loc=(1.05, 0.6), fontsize=16)
for output, col in zip(outputs_l1, colors):
plt.plot(output[:,0], output[:,11]*1E3, col+'--')
plt.ticklabel_format(axis='both', style='plain', scilimits=(-1,1))
plt.xlabel('$l1 (m)$')
plt.ylabel('G $(J / m^2) * 10^{-3}$')
plt.xlim(xmin=.2)
plt.ylim(ymax=2, ymin=0)
plt.subplots_adjust(top=0.8, bottom=0.15, right=0.7)
使用列名而不是数字并组合两个绘图循环,
col = {name:i for i,name in enumerate(header)}
fig = plt.figure()
for data,color in zip(outputs_l1, colors):
xs = data[:, col["l1" ]]
wl = data[:, col["w_left" ]] * 1000.0 # column 10
wr = data[:, col["w_right"]] * 1000.0 # column 11
plt.plot(xs, wl, color + "-", wr, color + "--")
一个可能的错误变得很明显:你说你想绘制图表 G
,但你指定的是 w
(第 10 和 11 列,而不是第 12 和 13 列)。
也许 w_left
和 w_data
没有出现是因为它们超出了您指定的限制 (plt.ylim(ymax=2, ymin=0)
)?
我想你真正想要的是
fig = plt.figure()
for data,color in zip(outputs_l1, colors):
xs = data[:, col["l1" ]]
gl = data[:, col["G_left" ]] * 1000.0 # column 12
gr = data[:, col["G_right"]] * 1000.0 # column 13
plt.plot(xs, gl, color + "-", gr, color + "--")
在
def loadfile(filename, skip=[], *args):
将 []
作为默认参数传递有点危险,因为对默认列表的更改可能会在对函数的调用中持续存在,从而导致非常奇怪的结果。你应该改为
def loadfile(filename, skip=None, *args):
skip = skip or []
除非你只使用 skip 进行成员资格测试,所以它作为一个集合会更快,所以它变成了
def loadfile(filename, skip=None, *args):
skip = set(skip or [])
此外,
output = []
with open(filename, *args) as f:
reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
for i, row in enumerate(reader):
if not(i in skip):
output.append(row)
return np.array(output)
可以缩短为
with open(filename, *args) as f:
cr = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
return np.array(row for i,row in enumerate(cr) if i not in skip)
结果是一个 numpy 二维数组;所以
outputs_l1 = [loadfile('FILE.csv'.format(p)) for p in p3_arr]
看起来 p3_arr
是一个列表,确定您要查看哪些数据集;然后 outputs_l1
成为二维数组的列表。这是一个误导性的名称,因为在 header
中,l1
应该是每个二维数组的第一列;因此 outputs_l1
逻辑上应该是一个仅包含第一列数据的二维数组。我建议将其重命名为 p_data
.
我对编码领域还很陌生,我的老板有点把我扔进了火里,所以如果这是新手犯的错误,我很抱歉,虽然我不认为是。
所以我正在尝试绘制 G 与 l1 的关系图(这不是 11,而是 L1)。数据在我从 excel 文件加载的文件中。 excel 文件是 14x250,所以有 14 个参数,每个参数有 250 个数据点。我张贴的图表格式正确,但 y 值显示为零。据我所知,代码绘制了前 12 列的图形,并保留了最后 2 列(包含两组 'y' 数据)。我找不到错误在哪里,这让我发疯!任何帮助将不胜感激!
这是我格式化 excel 文件的地方,我认为错误是:
header = ['l1', 'l2', 'l3', 'l4', 'l5', 'EI',
'S', 'P_right', 'P1_0', 'P3_0',
'w_left', 'w_right', 'G_left', 'G_right']
def loadfile(filename, skip=[], *args):
output = []
with open(filename, *args) as f:
reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
for i, row in enumerate(reader):
if not(i in skip):
output.append(row)
return np.array(output)
这是我实际加载 excel 文件的地方,这是下一个可能出错的地方:
outputs_l1 = [loadfile('FILE.csv'.format(p)) for p in p3_arr]
fig = plt.figure()
for output, col in zip(outputs_l1, colors):
plt.plot(output[:,0], output[:,10]*1E3, col+'-')
plt.legend(['$P3 = {} Pa$'.format(p) for p in p3_arr], loc=(1.05, 0.6), fontsize=16)
for output, col in zip(outputs_l1, colors):
plt.plot(output[:,0], output[:,11]*1E3, col+'--')
plt.ticklabel_format(axis='both', style='plain', scilimits=(-1,1))
plt.xlabel('$l1 (m)$')
plt.ylabel('G $(J / m^2) * 10^{-3}$')
plt.xlim(xmin=.2)
plt.ylim(ymax=2, ymin=0)
plt.subplots_adjust(top=0.8, bottom=0.15, right=0.7)
使用列名而不是数字并组合两个绘图循环,
col = {name:i for i,name in enumerate(header)}
fig = plt.figure()
for data,color in zip(outputs_l1, colors):
xs = data[:, col["l1" ]]
wl = data[:, col["w_left" ]] * 1000.0 # column 10
wr = data[:, col["w_right"]] * 1000.0 # column 11
plt.plot(xs, wl, color + "-", wr, color + "--")
一个可能的错误变得很明显:你说你想绘制图表 G
,但你指定的是 w
(第 10 和 11 列,而不是第 12 和 13 列)。
也许 w_left
和 w_data
没有出现是因为它们超出了您指定的限制 (plt.ylim(ymax=2, ymin=0)
)?
我想你真正想要的是
fig = plt.figure()
for data,color in zip(outputs_l1, colors):
xs = data[:, col["l1" ]]
gl = data[:, col["G_left" ]] * 1000.0 # column 12
gr = data[:, col["G_right"]] * 1000.0 # column 13
plt.plot(xs, gl, color + "-", gr, color + "--")
在
def loadfile(filename, skip=[], *args):
将 []
作为默认参数传递有点危险,因为对默认列表的更改可能会在对函数的调用中持续存在,从而导致非常奇怪的结果。你应该改为
def loadfile(filename, skip=None, *args):
skip = skip or []
除非你只使用 skip 进行成员资格测试,所以它作为一个集合会更快,所以它变成了
def loadfile(filename, skip=None, *args):
skip = set(skip or [])
此外,
output = []
with open(filename, *args) as f:
reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
for i, row in enumerate(reader):
if not(i in skip):
output.append(row)
return np.array(output)
可以缩短为
with open(filename, *args) as f:
cr = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC)
return np.array(row for i,row in enumerate(cr) if i not in skip)
结果是一个 numpy 二维数组;所以
outputs_l1 = [loadfile('FILE.csv'.format(p)) for p in p3_arr]
看起来 p3_arr
是一个列表,确定您要查看哪些数据集;然后 outputs_l1
成为二维数组的列表。这是一个误导性的名称,因为在 header
中,l1
应该是每个二维数组的第一列;因此 outputs_l1
逻辑上应该是一个仅包含第一列数据的二维数组。我建议将其重命名为 p_data
.