

以下のコードで突然ValueError: Length
mismatchが出てきて、対処の方法が分かりません。同じ証券コードを繰り返し取得したからかと思ったのですがそうではなく、昨日までは問題なく動作していたためどこを改善してよいかも不明です。  
解決策を教えていただけますでしょうか。

[code]

    %matplotlib inline
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from pandas_datareader.stooq import StooqDailyReader
    from datetime import datetime
    import numpy as np
    import sys
    import matplotlib.dates as mdate
    
    
    a=[0]
    codes=[1301,1332,1333,1352]
    
    codes = sorted(codes)
    start = datetime(2021, 4, 1)
    end = datetime(2021, 6, 22)
    
    dfc = (
           StooqDailyReader([f'{n}.JP' for n in codes], start, end).read()
           .Close.iloc[::-1].reset_index(drop=True)
           .set_axis([codes]*len(a), axis=1)
         )
    
    print(dfc)
    
    print(dfc.corr())
    plt.figure(figsize=(20,20))
    sns.heatmap(dfc.corr(),annot=True, vmax =1,vmin=-1,cmap ='coolwarm',center =0)
    
[/code]

以下エラー内容

[code]

    ValueError                                Traceback (most recent call last)
    <ipython-input-33-4bb2b2d041c0> in <module>()
         20        StooqDailyReader([f'{n}.JP' for n in codes], start, end).read()
         21        .Close.iloc[::-1].reset_index(drop=True)
    ---> 22        .set_axis([codes]*len(a), axis=1)
         23      )
         24 
    
    6 frames
    pandas/_libs/properties.pyx in pandas._libs.properties.AxisProperty.__set__()
    
    /usr/local/lib/python3.7/dist-packages/pandas/core/internals/managers.py in set_axis(self, axis, new_labels)
        225         if new_len != old_len:
        226             raise ValueError(
    --> 227                 f"Length mismatch: Expected axis has {old_len} elements, new "
        228                 f"values have {new_len} elements"
        229             )
    
    ValueError: Length mismatch: Expected axis has 2 elements, new values have 3 elements
    
[/code]

よろしくお願いいたします。


CC BY-SA 4.0
2021-06-29T09:29:43.390
77852
2022-07-21T00:04:45.617
47011
question
python pandas numpy matplotlib
Python でのValueError: Length mismatchへの対処が分かりません。


> 証券コードに重複がある場合(例えば `codes=[1301,1301,1333,1352]`
> など)、同じ証券コードのデータは一度だけしか取得しませんのでデータフレームの列数が少なくなります。

> 考えられる状況として、存在しない証券コードが `codes` に含まれているのかもしれません。例えば `codes = [1301, 1302,
> 1332]` として実行すると同様のエラーが発生します(`1302.JP` は存在しません)。

証券コードに重複があったり、存在しない証券コードを指定している場合を考慮して書き直してみました。

[code]

    import pandas as pd
    import re
    from pandas_datareader.stooq import StooqDailyReader
    from datetime import datetime
    
    codes = [1301, 1332, 1333]
    ## codes = [1301, 1301, 1332, 1333] # 重複
    ## codes = [1301, 1302, 1332, 1333] # 欠番
    
    codes = sorted(codes)
    start = datetime(2021, 6, 1)
    end = datetime(2021, 6, 22)
    
    dfc = (
      StooqDailyReader([f'{n}.JP' for n in codes], start, end).read()
      .Close.astype(int).sort_index()
      .rename_axis(index=None, columns=None)
      .rename(columns=lambda c: re.sub(r'\.JP$', '', c))
    )
    
[/code]

#### 実行結果

  * 重複

[code]

    # 1301.JP が重複
    codes = [1301, 1301, 1332, 1333]
    
    print(dfc.head())
    
                1301  1332  1333
    2021-06-01  2974   514  2435
    2021-06-02  2918   516  2435
    2021-06-03  2936   534  2465
    2021-06-04  2935   540  2455
    2021-06-07  2942   548  2448
    
[/code]

  * 欠番

[code]

    # 1302.JP は存在しない
    codes = [1301, 1302, 1332, 1333]
    
    print(dfc.head())
    
                1301  1332  1333
    2021-06-01  2974   514  2435
    2021-06-02  2918   516  2435
    2021-06-03  2936   534  2465
    2021-06-04  2935   540  2455
    2021-06-07  2942   548  2448
    
[/code]


CC BY-SA 4.0
2021-06-29T18:15:55.047
77865
2021-06-29T18:15:55.047
77852
answer