首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyvin:解析VIN号码

pyvin:解析VIN号码
EN

Stack Overflow用户
提问于 2021-01-20 13:37:06
回答 1查看 368关注 0票数 0

上下文

与解码带有车辆识别号的列的代码相同,对于其中一个库,我得到了一个错误。

代码

代码语言:javascript
复制
import pandas as pd
from vininfo import Vin # COUNTRY AND BRAND
from pyvin import VIN # MODEL AND YEAR


db = pd.DataFrame("VIN": ["3N6PD23W5ZK911765", "MNTACUD40Z0000632", "3N6DD23T9ZK874454"])  # VIN EXAMPLE


db["COUNTRY"] = db["VIN"].map(lambda x: Vin(x).country)  # PARSES OK AND RETURNS COUNTRY
db["BRAND"] = db["VIN"].map(lambda x: Vin(x).manufacturer)  # PARSES OK AND RETURNS BRAND

db["MODEL"] = db["VIN"].map(lambda x: VIN(x).Model)  # ERROR
db["YEAR"] = db["VIN"].map(lambda x: VIN(x).ModelYear)  # ERROR

错误

代码语言:javascript
复制
AttributeError: 'list' object has no attribute 'Model'
or
AttributeError: 'list' object has no attribute 'ModelYear'

问题

我不要求一个完整的解决方案,因为问题非常具体,但在这一点上,我感到不安全,任何建议都是受欢迎的。

db["YEAR"] = db["VIN"].map(lambda x: VIN(x).ModelYear)中的x是否等于单个字符串,还是将一个列表传递给函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-20 15:27:59

让我们把这个问题分成几部分。首先,db是一个pandas.DataFrame对象。正如您可能知道的,db["VIN"]是一个pandas.Series对象。您还可以使用以下命令进行验证

代码语言:javascript
复制
In [19]: type(db["VIN"])
Out[19]: pandas.core.series.Series

然后,您正在使用的pandas.Series.map函数将arg作为参数,该参数可以是dict类型,也可以是函数(或系列)类型。你给它一个函数。然后,对序列db["VIN"]的每个值调用此函数。让我们来看看那是什么。

代码语言:javascript
复制
# first value OK. Maybe?
In [23]: VIN("3N6PD23W5ZK911765")
Out[23]: <pyvin.pyvin.DecodedVIN at 0x2ef77ea5550>

# second value not OK
In [24]: VIN("MNTACUD40Z0000632")
Out[24]: []

因此,出于某种原因,VIN返回一个list。为什么会这样呢?这是因为pyvin.VIN无法识别输入。如果添加错误处理,您将看到:

代码语言:javascript
复制
In [26]: import pyvin

In [27]: VIN("MNTACUD40Z0000632", error_handling=pyvin.RAISE)

...
c:\python\python 3.8.6-64\lib\site-packages\pyvin\utils.py in _compare_check_digit(vin, remainder)
     92     if check_digit != rem_val:
     93         msg = 'Invalid check digit! %s does not match computed val %s' % (check_digit, rem_val)
---> 94         raise VINError(msg)
     95     logger.debug("%s check [OK]")
     96

VINError: Invalid check digit! 0 does not match computed val 5

我怀疑要么是VIN代码不正确,要么是pyvin有bug,要么是底层服务(NHTSA API)无法识别VIN代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65803646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档