numpy 尝试创建散点图时出错:TypeError:'value'必须是str或bytes的示例,而不是float

omhiaaxx  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(145)

我试图运行此代码以生成散点图,但我不知道如何修复错误
代码的思想是使用pandas从CSV文件加载数据,然后分别分离属性和目标x和y。
然后我必须用散点图生成一个图,有这些初始变量。
然后我必须把x和y分成测试变量和训练变量,其中测试变量为15%。
然后我必须使用Scikit训练线性回归器并再次绘制样本,在训练结束时呈现回归器获得的线。最后,估计测试样本的目标,给出均方误差(MSE)和R2得分值。
但是我在图表创建部分失败了,我无法前进。
代码:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv('prehistoric_pueblos.csv', header=None, names=['X', 'y'])

X = df['X'] 
y = df['y']    

plt.scatter(X, y)
plt.ylabel('y')
plt.xlabel('X')
plt.show()

CSV:

1000,105;
1125,115;
1087,1213;
1070,1275;
1100,13;
1150,13;
1250,14;
1150,14;
1100,125;
1350,183;
1275,135;
1375,145;
1175,13;
1200,13;
1175,1275;
1300,1375;
1260,1285;
1330,14;
1325,14;
1200,1285;
1225,1275;
1090,1135;
1075,125;
1080,1275;
1080,115;
1180,125;
1225,1275;
1175,1225;
1250,128;
1250,13;
750,125;
1125,1175;
700,13;
900,125;
900,13;
850,12;
;

错误代码:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[45], line 16
     13 X = df['X'] 
     14 y = df['y']    
---> 16 plt.scatter(X, y)
     17 plt.ylabel('y')
     18 plt.xlabel('X')

File c:\Program Files\Python311\Lib\site-packages\matplotlib\pyplot.py:2862, in scatter(x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, edgecolors, plotnonfinite, data, **kwargs)
   2857 @_copy_docstring_and_deprecators(Axes.scatter)
   2858 def scatter(
   2859         x, y, s=None, c=None, marker=None, cmap=None, norm=None,
   2860         vmin=None, vmax=None, alpha=None, linewidths=None, *,
   2861         edgecolors=None, plotnonfinite=False, data=None, **kwargs):
-> 2862     __ret = gca().scatter(
   2863         x, y, s=s, c=c, marker=marker, cmap=cmap, norm=norm,
   2864         vmin=vmin, vmax=vmax, alpha=alpha, linewidths=linewidths,
   2865         edgecolors=edgecolors, plotnonfinite=plotnonfinite,
   2866         **({"data": data} if data is not None else {}), **kwargs)
   2867     sci(__ret)
   2868     return __ret

File c:\Program Files\Python311\Lib\site-packages\matplotlib\__init__.py:1461, in _preprocess_data..inner(ax, data, *args, **kwargs)
   1458 @functools.wraps(func)
...
     96         ", ".join(names[:-1]) + " or " + names[-1]
     97         if len(names) > 1 else names[0],
     98         type_name(type(v))))

TypeError: 'value' must be an instance of str or bytes, not a float

我希望它能形成一个图形

nwsw7zdq

nwsw7zdq1#

由于csv的质量很差,您需要使用更多的参数来使用pd.read_csv获得所需的df

  • 添加sep=r',|;'来处理多个分隔符,这需要engine='python'来避免ParserWarning
  • 添加skipfooter=1以跳过最后一行。
  • 添加usecols=[0, 1]以忽略第三列的空值(由每行的尾随;引起)。
df = pd.read_csv('prehistoric_pueblos.csv',
                 header=None,
                 names=['X', 'y'],
                 sep=r',|;',
                 engine='python',
                 skipfooter=1,
                 usecols=[0,1])

X = df['X'] 
y = df['y']    

plt.scatter(X, y)
plt.ylabel('y')
plt.xlabel('X')
plt.show()

结果

建议您随时检查您的df。你的会看起来像这样:

# showing first 2 and last 2 lines
df.iloc[np.r_[0:2, -2:0]]

       X     y
0   1000  105;
1   1125  115;
35   850   12;
36     ;   NaN

使用添加的参数创建的df如下所示:

df.iloc[np.r_[0:2, -2:0]]

       X    y
0   1000  105
1   1125  115
34   900   13
35   850   12
ejk8hzay

ejk8hzay2#

使用一些.csv编辑器,如Notepad++,并将;替换为,或将,替换为;,以便在.csv文件上始终使用相同的分隔符。你可以很容易地做到这一点与查找和替换功能

相关问题