Jupyter Notebook でポチポチ入力しながら読んでる続き。
前回のはその後 anaconda の updateを何度か繰り返してたらコンプリートした。
C:\WINDOWS\system32>conda update --prefix "C:\Program Files\Anaconda3" anaconda Collecting package metadata: done Solving environment: done # All requested packages already installed. C:\WINDOWS\system32>
ここからが本題。
第12章で statsmodels.formula.api を使うのだけど、謎のエラーが出る。
model = smf.ols(formula='tip ~ total_bill', data=tips) --------------------------------------------------------------------------- AssertionError Traceback (most recent call last) <ipython-input-6-a9177a705d62> in <module>() ----> 1 model = smf.ols(formula='tip ~ total_bill', data=tips) C:\Program Files\Anaconda3\lib\site-packages\statsmodels\base\model.py in from_formula(cls, formula, data, subset, *args, **kwargs) 145 (endog, exog), missing_idx = handle_formula_data(data, None, formula, 146 depth=eval_env, --> 147 missing=missing) 148 kwargs.update({'missing_idx': missing_idx, 149 'missing': missing}) C:\Program Files\Anaconda3\lib\site-packages\statsmodels\formula\formulatools.py in handle_formula_data(Y, X, formula, depth, missing) 63 if data_util._is_using_pandas(Y, None): 64 result = dmatrices(formula, Y, depth, return_type='dataframe', ---> 65 NA_action=na_action) 66 else: 67 result = dmatrices(formula, Y, depth, return_type='dataframe', C:\Program Files\Anaconda3\lib\site-packages\patsy\highlevel.py in dmatrices(formula_like, data, eval_env, NA_action, return_type) 308 eval_env = EvalEnvironment.capture(eval_env, reference=1) 309 (lhs, rhs) = _do_highlevel_design(formula_like, data, eval_env, --> 310 NA_action, return_type) 311 if lhs.shape[1] == 0: 312 raise PatsyError("model is missing required outcome variables") C:\Program Files\Anaconda3\lib\site-packages\patsy\highlevel.py in _do_highlevel_design(formula_like, data, eval_env, NA_action, return_type) 163 return iter([data]) 164 design_infos = _try_incr_builders(formula_like, data_iter_maker, eval_env, --> 165 NA_action) 166 if design_infos is not None: 167 return build_design_matrices(design_infos, data, C:\Program Files\Anaconda3\lib\site-packages\patsy\highlevel.py in _try_incr_builders(formula_like, data_iter_maker, eval_env, NA_action) 60 "ascii-only, or else upgrade to Python 3.") 61 if isinstance(formula_like, str): ---> 62 formula_like = ModelDesc.from_formula(formula_like) 63 # fallthrough 64 if isinstance(formula_like, ModelDesc): C:\Program Files\Anaconda3\lib\site-packages\patsy\desc.py in from_formula(cls, tree_or_string) 162 tree = tree_or_string 163 else: --> 164 tree = parse_formula(tree_or_string) 165 value = Evaluator().eval(tree, require_evalexpr=False) 166 assert isinstance(value, cls) C:\Program Files\Anaconda3\lib\site-packages\patsy\parse_formula.py in parse_formula(code, extra_operators) 146 tree = infix_parse(_tokenize_formula(code, operator_strings), 147 operators, --> 148 _atomic_token_types) 149 if not isinstance(tree, ParseNode) or tree.type != "~": 150 tree = ParseNode("~", None, [tree], tree.origin) C:\Program Files\Anaconda3\lib\site-packages\patsy\infix_parser.py in infix_parse(tokens, operators, atomic_types, trace) 208 209 want_noun = True --> 210 for token in token_source: 211 if c.trace: 212 print("Reading next token (want_noun=%r)" % (want_noun,)) C:\Program Files\Anaconda3\lib\site-packages\patsy\parse_formula.py in _tokenize_formula(code, operator_strings) 92 else: 93 it.push_back((pytype, token_string, origin)) ---> 94 yield _read_python_expr(it, end_tokens) 95 96 def test__tokenize_formula(): C:\Program Files\Anaconda3\lib\site-packages\patsy\parse_formula.py in _read_python_expr(it, end_tokens) 42 origins = [] 43 bracket_level = 0 ---> 44 for pytype, token_string, origin in it: 45 assert bracket_level >= 0 46 if bracket_level == 0 and token_string in end_tokens: C:\Program Files\Anaconda3\lib\site-packages\patsy\util.py in next(self) 319 else: 320 # May raise StopIteration --> 321 return six.advance_iterator(self._it) 322 __next__ = next 323 C:\Program Files\Anaconda3\lib\site-packages\patsy\tokens.py in python_tokenize(code) 33 break 34 origin = Origin(code, start, end) ---> 35 assert pytype not in (tokenize.NL, tokenize.NEWLINE) 36 if pytype == tokenize.ERRORTOKEN: 37 raise PatsyError("error tokenizing input " AssertionError:
最初に疑ったのチルダ。
自分が入力してる画面に表示されるのと、テキストのが一致しないし、ウェブでは "~" が "?" になってたりするのがよくあるから。
そのへんのキーワードでググってみても見つからない。
最後の何も語らない AssertionError:
がいやらしいなぁと思って
statsmodels python ols formula AssertionError
でググってみたらヒットしたのがここ
Python のバージョンは違うけど、出てるスタックトレースが全く同じ。
これか!ってことでチェックすると
import patsy patsy.__version__ '0.4.1'
ビンゴ?
おなじみの手順で
C:\WINDOWS\system32>conda update --prefix "C:\Program Files\Anaconda3" patsy Collecting package metadata: done Solving environment: done ## Package Plan ## environment location: C:\Program Files\Anaconda3 added / updated specs: - patsy The following packages will be downloaded: package | build ---------------------------|----------------- patsy-0.5.1 | py36_0 380 KB ------------------------------------------------------------ Total: 380 KB The following packages will be UPDATED: patsy pkgs/free::patsy-0.4.1-py36_0 --> pkgs/main::patsy-0.5.1-py36_0 Proceed ([y]/n)? y Downloading and Extracting Packages patsy-0.5.1 | 380 KB | ############################################################################ | 100% Preparing transaction: done Verifying transaction: done Executing transaction: done C:\WINDOWS\system32>
よし、これで行けた。
と思ったがリロードしても変わらない。
import importlib importlib.reload(patsy) patsy.__version__ '0.4.1'
こいつも更新したが変わらない。
C:\WINDOWS\system32>conda update --prefix "C:\Program Files\Anaconda3" statsmodels Collecting package metadata: done Solving environment: done ## Package Plan ## environment location: C:\Program Files\Anaconda3 added / updated specs: - statsmodels The following packages will be UPDATED: statsmodels pkgs/free::statsmodels-0.6.1-np111py3~ --> pkgs/main::statsmodels-0.9.0-py36h452e1ab_0 Proceed ([y]/n)? y Preparing transaction: done Verifying transaction: done Executing transaction: done C:\WINDOWS\system32>
ってか、上の方でやって anaconda が取り込んでるモジュールはすべてアップグレードされてたんじゃないの?
結局 Jupyter を再起動したら更新されたモジュールが読み込まれました。
import patsy patsy.__version__ '0.5.1'
問題の文でもエラーが出なくなってめでたしめでたし。
model = smf.ols(formula='tip ~ total_bill', data=tips)