Raising exceptions within __init__() is absolutely fine. There's no other good way to indicate the error condition within a constructor, and there are many hundreds of examples in the standard library where building an object can raise an exception.
The error class is to raise. It is up to you. ValueError is best if the constructor was passed an invalid parameter.
If you want to know more about the Data Science then do check out the following Data Science which will help you in understanding Data Science from scratch