数据分析踩坑笔记

1.使用百度echarts 绘制中国地图

  • echarts geo地图由于某些原因被封了,拿不到数据包,现在官方推荐使用百度地图的api,因此需要申请百度地图的开发者key. 申请地址
  • 除了正常引入echarts的包之外,还需要引入bmap,cdn 脚本如下:

1
    <script src="https://cdn.bootcss.com/echarts/3.8.5/extension/bmap.min.js"></script>

2.’Series’ objects are mutable, thus they cannot be hashed

  • 在使用Python pandas时试图用apply函数直接将所有的字母转化为浮点数,写了如下代码:

    data_object.apply(lambda x: dict_object[x])

    其中dict_object为字典,保存的字母到浮点数的映射,字母为key, data_object为原始数据,出现了上面的错误。经调试发现原来pandas apply函数与我想象的并不一致,我原因为隐函数中传递的是单个的值(类似map),但实际上传递的是整个Series, 所以可以使用这样的表达:

    normalize data:
    data.apply(lambda x: (x – np.min(x)) / (np.max(x) – np.min(x)))

    另外,关于这个错误更通用的描述,以及dict类型为什么会报错,我在stackoverflow上找到了这个回答,“Series objects are mutable and cannot be hashed” error 大意就是 python 中的dict以键值对的形式来存储数据,key与value之间通过hash关联(很多语言中的map也是如此),所以key必须是不可变的值,比如int, string, tuple. 而在我这个问题中,series是可变类型(mutable),所以不可作为key.

    然后我又尝试了一下一层FOR循环加map,

    
    
    1
    2
    for col in data_object_col:
        data[col].values = list(map(lambda x: dict_object[x], data[col].values))

    结果依然报错,AttributeError: can’t set attribute, 看来numpy.array与list还是有些不一样啊,不想再继续纠结这个问题,于是直接上了两层for循环:

    
    
    1
    2
    3
    for col in data_object_col:
        for i in range(len(data[col].values)):
            data[col].values[i] = dict_object[data[col].values[i]]

    问题解决

3.sklearn 使用LDA对监督学习数据降维时,出现 Value Error: Unknown label type

  • 经调试,发现出错的是下面这段代码。这段代码的主要意思是从label中提取独特的值,剔除重复值。但是支持的label值居然只有binary和muticlass(二分和多分类),而我传入的是连续值,经调试发现,确实是continuous,所以导致出错。
  • 在stackoverflow上找到类似回答:LogisticRegression: Unknown label type: ‘continuous’ using sklearn in python ,总之就是需要将连续值转化为Multiclass值,使用labelEncoder. LabelEncoder将所有的标签值分别映射到一个从0开始的int值,比如我这里有53个标签值,那么转化后的结果就是0 – 52这53个值,保留了大小关系,但是忽略了具体的值差异。感觉这是一个不靠谱的操作,因为这个降维后的结果我完全看不懂了,我将n_components设置为10,然而得到却只有一个类别。。。

4.sklearn 使用ensemble.BaggingRegressor时python崩溃,重启后程序阻塞

  • 代码如下:
    
    
    1
    2
    3
    4
    5
    >   model = Ridge(alpha=alpha)  
        print("Begin to ensemble")  
        clf = ensemble.BaggingRegressor(model, n_jobs=-1, n_estimators = 10)  
        print("Bagging")  
        clf.fit(x_train, y_train.ravel())
  • 阻塞的代码为clf.fit(), 除此之外没有任何报错信息,但是有一个警告,
    
    
    1
    DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().y = column_or_1d(y, warn=True)
  • 根据这个警告在stackoverflow上找到了一个类似的问题,a-column-vector-y-was-passed-when-a-1d-array-was-expected从题主的描述中可以发现他也有类似的问题——程序被阻塞,但是回答的答案只给了如何解决警告。改了之后程序依然阻塞
  • 于是只能自己debug, 单步调试,发现程序阻塞的地方代码如下:
  • 虽然不认识这段代码,但是大意可以猜出来这是根据传入的njob来控制并发的一个循环,这可能和我电脑的配置有关,于是我将njob设置为1,基本上就不并行了,然后果然就解决问题了:
    
    
    1
    > clf = ensemble.BaggingRegressor(model, n_jobs=-1, n_estimators = 10)

5.Numpy.cov AttributeError: ‘float’ object has no attribute ‘shape’

点击量:530


发表评论

电子邮件地址不会被公开。 必填项已用*标注