pythonを利用した特許情報分析

特許出願動向調査_singleV05

/

# スクリプト処理内容の説明

## 単一テーマの公報データに対して、以下の処理を行い、特許出願動向調査のレポートを作成する。

## コード化

## 集計

## 図表作成

## コメント作成

## レポート作成

# 準備

## 公報データを分析公報data.csvとして保存する。

## テーマ名を「テーマ設定data.xlsx」のシート「テーマ名」に設定する。

# データの保存方法

## 件数が6万件を越えても処理できるように公報データはcsv(分析公報data.csv)に保存する。

## 集計結果は行数が少なく、かつ1bookに複数種類のデータをまとめて保存できるのでExcel形式で保存する。

## (ただし、macでは扱いにくいのでExcelマクロを使用しない。)

## 後で消去する中間データは散乱しないようにするため、フォルダ「中間data」に保存する。

# IPCクラスタリング(new_patlist4.csvtrans_data01.xlsxに書き出し)

## 高出現頻度のIPCをコアIPCとし、これに関連するIPCFIを付加する。

## コアIPCと付加IPCFIとを結合し、特許分類(IPC,FI)とコードとコード内容の対照表を作成する。

## コード化できなかった公報データを再度集計し、その他の特許分類とコードとコード内容の対照表を作成する。

## その他の特許分類とコードとコード内容を対照表に追加する。

## 作成した対照表に基づいて公報データにコードを付加する。

## その他のコードについてトピックKWを作成する。

## 年別の公報データについてトピックKWを作成する。

# グラフ作成用データの集計(trans_data.xlsxに書き出し)

## 「年別発行件数集計」~「六桁コード別集計」までを集計する。

## 上で作成した「コード表」をコピーする。

# 図表と各図表に対するコメントを作成する。

# 図表とコメントを組み合わせてレポートを作成する。

#

#

# 書き出し図表内のファイルを全て削除

import os

import shutil

# 削除

shutil.rmtree(‘./書き出し図表‘)

# 作成

os.mkdir(‘./書き出し図表‘)

# defバブルチャート作成

## 件数や人数に応じてバブルの大きさを変え、チャートを作成する。

## (x_list,y_list,nxy_list)に応じてバブルチャート作成の作成パターンを選択し、

## バブルチャートの枠の大きさ、項目の配置間隔、文字の大きさを修正する。

import pandas as pd

import numpy as np

import openpyxl

import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams[‘font.family’] = ‘MS PGothic’

import matplotlib.patches as patches

import copy

def buble0(x_list,y_list,nxy_list,fig_n):

    # 発行件数のmax算出

    nmax = 0

    for str1 in nxy_list:

        for n1 in str1:

            if nmax < n1: nmax = n1

    # print(‘nmax=’,nmax)

    # len(x_list) <= 5 ならば、nxy_list0を追加

    nxy_list01 = nxy_list

    if len(x_list) <= 5:

        nxy_list01 = []

        for str1 in nxy_list:

            str1.append(0.0)

            nxy_list01.append(str1)            

    oldy_list = copy.deepcopy(y_list)

    # print(‘oldy_list’,y_list)

    # len(y_list) <= 5 ならば、y_listに空白“”を追加、nxy_listにリスト[0,0,・・・0]を追加    

    if len(y_list) <= 5:

        y_list.append(”)    # 空白“”を追加

        list01 = []

        k01 = len(nxy_list01)

        for n1 in range(k01):

            list01.append(0.0)

        nxy_list01.append(list01)            

    # print(‘nxy_list01=’,nxy_list01)    

    # 発行件数%

    npxy_list = []

    nytot_list = []

    for n1_list in nxy_list:

        nytot = 0

        npx_list = []

        for n2 in n1_list:

            if nmax > 0:

                n3= n2/nmax

                npx_list.append(n3)

            else:

                n3 = 0

                npx_list.append(n3)

            nytot = nytot + n2

            nytot = round(nytot,1)

        npxy_list.append(npx_list)

        nytot_list.append(nytot)

    if nytot_list[0] > 0:

        print(‘nytot_list[1]/nytot_list[0] =’,nytot_list[1]/nytot_list[0] )

        nytot10 =  nytot_list[1]/nytot_list[0] 

    else:

        nytot10 = 0

    # X軸とY軸の大きさを調整    

    pax = 12

    pay =pax * ((len(y_list)/len(x_list))/2)

    #print(‘figsizeの設定値 ‘,’pax=’,pax,’pay=’,pay)

    y_list01 = []

    for str1 in y_list:

        str1 = str1.replace(“株式会社“, “”)    # “株式会社を消去    

        str1 = str1.replace(“国立大学法人“, “”)    # “国立大学法人を消去

        str1 = str1.replace(“公立大学法人“, “”)    # “公立大学法人を消去

        str1 = str1.replace(“学校法人“, “”)    # “学校法人を消去

        str1 = str1.replace(“地方独立行政法人“, “”)    # “地方独立行政法人を消去

        str1 = str1.replace(“独立行政法人“, “”)    # “独立行政法人を消去

        str1 = str1.replace(“国立研究開発法人“, “”)    # “国立研究開発法人を消去

        str1 = str1.replace(“一般財団法人“, “”)    # “一般財団法人を消去        

        str1 = str1.replace(“公益財団法人“, “”)    # “公益財団法人を消去 

        y_list01.append(str1)

    # print(‘y_list01’,y_list01)

    # 語数を算出

    nlwrd = 0

    wntot = 0

    for str1 in y_list01:

        wntot = wntot + (len(str1))

    print(‘word=’,wntot)

    print(‘word/Y軸項目数=’,wntot/len(y_list01))

    if len(y_list01) > 0:

        nlwrd = wntot/len(y_list01)    # 行数毎の語数

#        nlwrd = round(nlwrd,1)

    print(‘X軸の項目数=’,len(x_list),’Y軸の項目数=’,len(y_list01),’行単位の平均語数=’,nlwrd)

    # y_listの最大語数を判定

    nwdmax = 0

    for str1 in y_list01:

        if len(str1) > nwdmax: nwdmax = len(str1)

    print(‘最大語数=’,nwdmax)

    # 初期値を設定

    pax = 12    # グラフのxサイズ

    pay = 6      # グラフのYサイズ

    xh_y0 = 1.2    # xヘッダのy位置

    x1 = 0.3    # xヘッダのx位置

    xm = 1.33    # x方向の離間係数

    nxsize = 12    # xヘッダの文字サイズ

    nysize = 12    #Yヘッダの文字サイズ

    ypls = 0    # Y方向の補正値

    # 公報データ読み込み

    #try:

    #    para_data = pd.read_csv(‘XY補正値.csv’, engine =’python’)                   # csv

    #except UnicodeDecodeError as e:

    #    para_data = pd.read_csv(‘XY補正値.csv’, encoding=’shift_jis’)                   # csv        

    # pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’utf-8′)                   # csv

    para_data = pd.read_excel(‘XY補正値.xlsx’,sheet_name=’Sheet1′)     # Excelデータ読み込み

    para_data = para_data.dropna(how=’all’)    # 全列がNaNである行を削除

    print(‘パラメータ数=’,len(para_data))

    ## 入力バラメータ読み込み ##

    # X数読み込み(逆順)

    nox_data = para_data.iloc[:,0]

    nox_list =[]

    for n1 in nox_data:

        nox_list.append(n1)

    # print(‘nox_list[0:5]=’,nox_list[0:5])

    # Y数読み込み(逆順)

    noy_data = para_data.iloc[:,1]

    noy_list =[]

    for n1 in noy_data:

        noy_list.append(n1)

    # print(‘noy_list[0:5]=’,noy_list[0:5])

    # 平均語数読み込み(逆順)

    nlwrd_data = para_data.iloc[:,2]

    nlwrd_list =[]

    for n1 in nlwrd_data:

        nlwrd_list.append(n1)

    # print(‘nlwrd_list[0:5]=’,nlwrd_list[0:5])

    # 最大語数読み込み(逆順)

    nwdmax_data = para_data.iloc[:,3]

    nwdmax_list =[]

    for n1 in nwdmax_data:

        nwdmax_list.append(n1)

    # print(‘nwdmax_list[0:5]=’,nwdmax_list[0:5])

    # 語数比率nytot_list[1]/nytot_list[0] 読み込み(逆順)

    npwd_data = para_data.iloc[:,4]

    npwd_list =[]

    for n1 in npwd_data:

        npwd_list.append(n1)

    # print(‘npwd_list[0:5]=’,npwd_list[0:5])

    ## 出力バラメータ読み込み ##

    # グラフXサイズpax読み込み(逆順)

    gsizex_data = para_data.iloc[:,5]

    gsizex_list =[]

    for n1 in gsizex_data:

        gsizex_list.append(n1)

    # print(‘gsizex_list[0:5]=’,gsizex_list[0:5])

    # グラフYサイズpax読み込み(逆順)

    gsizey_data = para_data.iloc[:,6]

    gsizey_list =[]

    for n1 in gsizey_data:

        gsizey_list.append(n1)

    # print(‘gsizey_list[0:5]=’,gsizey_list[0:5])

    # Xヘッダの文字サイズnxsize読み込み(逆順)

    fsizex_data = para_data.iloc[:,7]

    fsizex_list =[]

    for n1 in fsizex_data:

        fsizex_list.append(n1)

    # print(‘fsizex_list[0:5]=’,fsizex_list[0:5])

    # Yヘッダの文字サイズnysize読み込み(逆順)

    fsizey_data = para_data.iloc[:,8]

    fsizey_list =[]

    for n1 in fsizey_data:

        fsizey_list.append(n1)

    # print(‘fsizey_list[0:5]=’,fsizey_list[0:5])

    # XヘッダのY位置xh_y0読み込み(逆順)

    posxy0_data = para_data.iloc[:,9]

    posxy0_list =[]

    for n1 in posxy0_data:

        posxy0_list.append(n1)

    # print(‘posxy0_list[0:5]=’,posxy0_list[0:5])

    # XヘッダのX位置x1読み込み(逆順)

    posxx1_data = para_data.iloc[:,10]

    posxx1_list =[]

    for n1 in posxx1_data:

        posxx1_list.append(n1)

    # print(‘posxx1_list[0:5]=’,posxx1_list[0:5])

    # X方向の離間係数xm読み込み(逆順)

    xm_data = para_data.iloc[:,11]

    xm_list =[]

    for n1 in xm_data:

        xm_list.append(n1)

    # print(‘xm_list[0:5]=’,xm_list[0:5])

    # Y方向の補正値ypls読み込み(逆順)

    ypls_data = para_data.iloc[:,12]

    ypls_list =[]

    for n1 in ypls_data:

        ypls_list.append(n1)

    # print(‘ypls_list[0:5]=’,ypls_list[0:5])

    lenx = len(x_list)

    leny = len(y_list) 

    bn = 0

    flg = 0

    for n1, str1 in enumerate(nox_list):

        nox = str1

        if nox == lenx: 

            if leny >=noy_list[n1]:

                if nlwrd >= nlwrd_list[n1]:

                    if nwdmax >= nwdmax_list[n1]:         

                        pax = gsizex_list[n1]

                        pay = gsizey_list[n1]

                        nxsize = fsizex_list[n1]

                        nysize = fsizey_list[n1]

                        xh_y0 = posxy0_list[n1]

                        x1 = posxx1_list[n1]

                        xm = xm_list[n1]

                        ypls = ypls_list[n1]

                        bn = n1

                        npwd = npwd_list[n1]

                        if npwd_list[n1] == 0.1:

                            flg = 1

                            if nytot10 > 0.1:                 

                                xm = 1.33

                            else:

                                xm = 1.48   

                            npwd = npwd_list[n1]

    if npwd_list[bn] == 0.1:

        if npwd > nytot10:                 

            print(‘入力パラメータ=’,’A=’,lenx,’B=’,leny,’C=’,nlwrd,’D=’,nwdmax, ‘、基準以下‘,npwd, ‘>’, ‘E=’,round(nytot10,4))

        else:

            print(‘入力パラメータ=’,’A=’,lenx,’B=’,leny,’C=’,nlwrd,’D=’,nwdmax, ‘、基準以上‘,npwd, ‘<‘, ‘E=’,round(nytot10,4))

    else:

        print(‘入力パラメータ=’,’A=’,lenx,’B=’,leny,’C=’,nlwrd,’D=’,nwdmax, ‘E=’,round(nytot10,4))   

    print(‘出力パラメータ‘,’No=’,bn+2,’/’,’F=’,pax,’G=’,pay,’H=’,nxsize,’I=’,nysize,’J=’,xh_y0,’K=’,x1,’L=’,xm,’M=’,ypls)

    # 設定値確認

    print(‘pax=’,pax,’pay=’,pay,’xh_y0=’,xh_y0,’x1=’,x1,

          ‘xm=’,xm,’nxsize=’,nxsize,’nysize=’,nysize)

    bnysize = nysize

    # 折り返しパターンの判定

    flg_ipc = 0

    for str1 in y_list:

        if len(str1) <= 9:

            if str1.count(‘/00’) > 0: flg_ipc = 1

    flg=0

    if len(x_list) > 1: flg = 0

    if len(x_list) >= 10: flg = 1

    if len(x_list) >= 11: flg = 2

    if flg_ipc == 1: flg = 3

    print(‘折り返しパターン=’,flg)    

    # 描画フレーム設定

    if len(x_list) <=10:

        fig = plt.figure(figsize=(pax, pay), dpi=100)

    if len(x_list) >=11:

        fig = plt.figure(figsize=(pax, pay), dpi=140)

    ax = plt.axes() 

    # X軸ヘッダ書き出し

    for n1, str1 in enumerate(x_list):

        if len(str1) == 1: str1 = ‘  ‘ + str1

        ax.text(n1*xm+2.5+x1, xh_y0, str1,size=nxsize) 

    # バブルチャート描画

    for n1, str1 in enumerate(y_list01):        

        if flg == 0:     # 縦長パターン   

            nyp=1.0    # Y位置間隔係数

            # y軸の文字数に応じて折り返し表示

            if len(str1) <= 8:    # 8文字以下ならば

                apname = str1

                #  len(y_list01) <= 5 ならば、y位置を下げる

                if len(y_list01) <= 5:

                    ax.text(-1, – n1*nyp-0.4+ypls, apname,size=nysize,horizontalalignment=”left”)    # 左寄せ

                else:

                    # x=-1y= – n1*nyp-0.2に設定  

                    ax.text(-1, – n1*nyp-0.2+ypls, apname,size=nysize,horizontalalignment=”left”)    # 左寄せ

            if len(str1) >= 9:    # 9文字以上ならば        

                apname = str1[0:9] + ‘\n ‘ + str1[9:17] + ‘\n ‘ + str1[17:26]

                #  len(y_list01) <= 5 ならば、y位置を下げる

                if len(y_list01) <= 5:

                    ax.text(-1, – n1*nyp- 0.7+ypls, apname,size=nysize,horizontalalignment=”left”)    # 左寄せ   

                else:

                    # x=-1y= – n1*nyp- 0.5に設定 

                    ax.text(-1, – n1*nyp- 0.5+ypls, apname,size=nysize,horizontalalignment=”left”)    # 左寄せ        

            if n1 <  len(npxy_list): 

                nstr2 = npxy_list[n1]                

            for n2, np1 in enumerate(nstr2):

                if n1 >= len(oldy_list): break  

                if n2 == len(nstr2): break

                if np1>0:

                    if np1<0.03: 

                        np1= 0.03                    

                c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(np1)*0.5, fc=’skyblue’)

#                c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(0.5)*0.5, fc=’skyblue’)

                ax.add_patch(c)

                nn=round(nxy_list01[n1][n2],1)

                if n1 >= len(oldy_list): break

                if len(x_list) <= 5:

                    if n2 < len(x_list) :

                        ax.text(n2*1.33 +3, -n1*0.98-0.2, nn)    # バブルの右下に件数を描画       

                else:

                    if n1 < len(y_list01) : 

                        ax.text(n2*1.33 +3, -n1*0.98-0.2, nn)    # バブルの右下に件数を描画 

        if  flg == 1:    # 標準

            nyp=1.0    # Y位置間隔係数

            # y軸の文字数に応じて折り返し表示

            if len(str1) <= 9:    # 9文字以下ならば

                if len(str1) <= 7:    # 7文字以下ならば

                    str1 = str1 + ‘\n ‘ 

                apname = str1

                #  len(y_list01) <= 5 ならば、y位置を下げる

                if len(y_list01) <= 5:

                    ax.text(-1, – n1*nyp -0.2+ypls, apname,size=bnysize,horizontalalignment=”left”)    # 左寄せ

                else:

                    # x=-1y= – n1*nyp-0.2に設定  

                    ax.text(-1, – n1*nyp -0.4+ypls, apname,size=bnysize,horizontalalignment=”left”)    # 左寄せ

            else:

                if len(str1) >= 10:    # 10文字以上ならば        

                    apname = str1[0:9] + ‘\n ‘ + str1[9:17] + ‘\n ‘ + str1[17:25]

                    if len(y_list01) <= 5:

                        ax.text(-1, – n1*nyp – 0.5+ypls, apname,size=bnysize,horizontalalignment=”left”)    # 左寄せ    

                    else:

                        # x=-1y= – n1*nyp – 0.5に設定 

                        ax.text(-1, – n1*nyp – 0.5+ypls, apname,size=bnysize,horizontalalignment=”left”)    # 左寄せ        

            nstr2 = npxy_list[n1]

            for n2, np1 in enumerate(nstr2):

                if n1 >= len(oldy_list): break                

                if n2 == len(nstr2): break

                if np1>0:

                    if np1<0.03: 

                        np1= 0.03

                c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(np1)*0.5, fc=’skyblue’)

#                c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(0.5)*0.5, fc=’skyblue’)

                ax.add_patch(c)

                nn=round(nxy_list01[n1][n2],1)

                if len(x_list) <= 5:

                    if n2 <  len(x_list) :

                        ax.text(n2*1.33 +3, -n1*0.98-0.2, nn)    # バブルの右下に件数を描画       

                else:

                    if n1 < len(y_list01) : 

                        ax.text(n2*1.33 +3, -n1*0.98-0.2, nn)    # バブルの右下に件数を描画 

        if flg == 2:     # 横長パターン   

            nyp=1.0    # Y位置間隔係数

            # y軸の文字数に応じて折り返し表示

            if len(str1) <= 8:    # 8文字以下ならば

                apname = str1

                #  len(y_list01) <= 5 ならば、y位置を下げる

                if len(y_list01) <= 5:

                    ax.text(-1, – n1*nyp-0.4+ypls, apname,size=nysize,horizontalalignment=”left”)    # 左寄せ

                else:

                    # x=-1y= – n1*nyp-0.2に設定  

                    ax.text(-1, – n1*nyp-0.2+ypls, apname,size=nysize,horizontalalignment=”left”)    # 左寄せ

            if len(str1) >= 9:    # 9文字以上ならば        

                apname = str1[0:8] + ‘\n ‘ + str1[8:16] + ‘\n ‘ + str1[16:24]

                #  len(y_list) <= 5 ならば、y位置を下げる

                if len(y_list01) <= 5:

                    ax.text(-1, – n1*nyp- 0.7+ypls, apname,size=nysize,horizontalalignment=”left”)    # 左寄せ   

                else:

                    # x=-1y= – n1*nyp- 0.5に設定 

                    ax.text(-1, – n1*nyp- 0.5+ypls, apname,size=nysize,horizontalalignment=”left”)    # 左寄せ        

            nstr2 = npxy_list[n1]

            for n2, np1 in enumerate(nstr2):

                if n1 >= len(oldy_list): break  

                if n2 == len(nstr2): break

                if np1>0:

                    if np1<0.03: 

                        np1= 0.03

                c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(np1)*0.5, fc=’skyblue’)

#                c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(0.5)*0.5, fc=’skyblue’)

                ax.add_patch(c)

                nn=round(nxy_list01[n1][n2],1)

                if n1 >= len(oldy_list): break

                if len(x_list) <= 5:

                    if n2 < len(x_list) :

                        ax.text(n2*1.33 +3, -n1*0.98-0.2, nn)    # バブルの右下に件数を描画       

                else:

                    if n1 < len(y_list01) : 

                        ax.text(n2*1.33 +3, -n1*0.98-0.2, nn)    # バブルの右下に件数を描画 

        if flg == 3:     # IPCパターン   

            apname = str1

            # x=-1y= – n1*0.98-0.2に設定  

            ax.text(-1, – n1*0.98-0.2+ypls, apname,size=nysize,horizontalalignment=”left”)    # 左寄せ

            nstr2 = npxy_list[n1]

            print(‘nstr2=’,nstr2)

            for n2, np1 in enumerate(nstr2):

                print(n1,np1)

                if n2 == len(nstr2): break

                if np1>0:

                    if np1<0.03: 

                        np1= 0.03

                c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(np1)*0.5, fc=’skyblue’)

#                c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(0.5)*0.5, fc=’skyblue’)

                ax.add_patch(c)

                nn=round(nxy_list01[n1][n2],1)

                ax.text(n2*1.33 +3, -n1*0.98-0.2, nn)    # バブルの右下に件数を描画                         

    # グラフ修正                    

    plt.axis(‘scaled’)

    ax.set_aspect(‘equal’)

    ax.axes.xaxis.set_visible(False)    # x軸目盛りを消す

    ax.axes.yaxis.set_visible(False)    # y軸目盛りを消す

    # 図表書き出し

    plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

    plt.show()

    return()

# テスト バブルチャート作成

## (x_list,y_list,nxy_list)のパターンを変更し、作成されるバブルチャートを確認する。

## 作成されたバブルチャートを見ながら、defバブルチャート作成の作成パターンを追加または修正する。

# X軸の項目数=  Y軸の項目数行単位の平均語数

x_list= [‘2010‘, ‘2011‘, ‘2012‘, ‘2013‘, ‘2014‘, ‘2015‘, ‘2016‘, ‘2017‘, ‘2018‘, ‘2019‘, ‘2020‘, ‘2021‘]

y_list= [‘F:物理的または化学的方法一般‘, ‘F01:化学的または物理的方法,例.触媒,コロイド化学;それらの関連装置  ‘, ‘F01A:固体‘, ‘F01A01:触媒体の形状,構造に特微があるもの‘, ‘F01A02:超微粒子状の触媒‘, ‘F01A03:光触媒‘, ‘F01A04:その他のもの+KW=化合+アニオン+製造+エポキシケトン+交換+構造+酸化+反応+なし+エノン‘, ‘F02:分離  ‘, ‘F02A:無機材料‘, ‘F02A01:気体分離用‘]

nxy_list= [[2.0, 5.0, 4.0, 6.0, 2.0, 3.0, 7.0, 9.0, 2.0, 4.0, 5.0, 3.6], [126.0, 108.0, 115.0, 125.0, 123.0, 93.0, 125.0, 137.0, 83.0, 113.0, 86.0, 102.0], [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 16.0, 19.2], [1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0], [3.0, 5.0, 4.0, 4.0, 2.0, 8.0, 10.0, 4.0, 6.0, 9.0, 0.0, 0.0], [22.0, 22.0, 19.0, 14.0, 15.0, 21.0, 20.0, 15.0, 18.0, 9.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [36.0, 37.0, 49.0, 40.0, 50.0, 33.0, 39.0, 54.0, 49.0, 40.0, 30.0, 34.8], [2.0, 0.0, 1.0, 2.0, 0.0, 1.0, 1.0, 6.0, 4.0, 4.0, 8.0, 3.6], [3.0, 3.0, 9.0, 3.0, 6.0, 4.0, 6.0, 3.0, 3.0, 3.0, 0.0, 0.0]]

# Y軸語数に応じてX軸ヘッダのy位置を補正

wntot = 0

for str1 in y_list:

    wntot = wntot + (len(str1))

# print(‘word=’,wntot)

# print(‘word/Y軸項目数=’,wntot/len(y_list))

nlwrd = wntot/len(y_list)    # 行数毎の語数

fig_n = ‘0′

buble0(x_list,y_list,nxy_list,fig_n)

# def発行件数の年別推移(折線グラフ)(図表とコメント作成)

## (nen_list, code_list, arr_nxny)に応じ、折線グラフを作成する。

## 折線グラフの変化についてコメントを作成し、returnする。

import pandas as pd

import numpy as np

import openpyxl

import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams[‘font.family’] = ‘MS PGothic’

import matplotlib.patches as patches

import csv

import copy

def oresen_comment(nen_list, code_list, arr_nxny, fig_n, g_title):

    # 発行年読み込み

    nnen = len(nen_list)

    # print(‘nnen=’,nnen)

    # print(‘nen_list=’,nen_list)

    # print(‘code_list=’,code_list)

    py_list  = []

    for str1 in nen_list:

        str1 = str1[0:4]

        py_list.append(str1)

    # print(‘発行年=’,py_list)

    # y軸の最大値を算出

    nmax = 0

    for str1 in arr_nxny:

        for nn1 in str1:

            if nn1 > nmax: nmax = nn1

    # グラフ作成

    fig = plt.figure(figsize=(12, 4), dpi=150, linewidth=10)

    ax = fig.add_subplot(111)

    x_datas = range(1, nnen+1)

    # プロット

    for str1 in arr_nxny:

        plt.plot(x_datas, str1[0:])

    plt.xticks(x_datas, nen_list)

    plt.xlim(0, nnen+1)    # ex:2011202010

    plt.ylim(0, nmax*1.1) #y軸の最大値*1.1

    plt.title(g_title, fontsize = 20)

    plt.xlabel(‘発行年‘, fontsize = 16)

    plt.ylabel(‘発行件数‘, fontsize = 16)

    plt.tick_params(labelsize=14)

    plt.grid(True)

    # 凡例を設定

    hanrei_nm = code_list    # コード+内容を凡例として格納

    plt.legend(hanrei_nm, fontsize=12,bbox_to_anchor=(0, -0.3), loc=’upper left’) # 凡例の表示

    print(fig_n)

    # 図表書き出し

    plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

    plt.show()

    # 各列の合計件数リストを作成

    ntot_list = []

    for n1, str1 in enumerate(nen_list):

        nxtot = 0

        for str2 in arr_nxny:

            nxtot = nxtot + float(str2[n1])

            nxtot = round(nxtot,1)

        ntot_list.append(nxtot)

    # print(‘各列の合計件数=’,ntot_list)

    # 2-3 出願人数年別推移のコメント1

    # 合計ntot算出

    ntot = 0

    for n1 in ntot_list:

        ntot = ntot + n1

    # ピーク年判定

    npeak = 0

    pymax = 0

    for n1, str1 in enumerate(ntot_list):

        if str1>npeak:

            npeak = str1

            pymax= py_list[n1]

    # 増減率を計算

    bn = 0

    testud_list = []

    for n1,str1 in enumerate(ntot_list):

        if n1>0:

            if ntot > 0:

                bd = ((str1 – bn)/ntot)*100

                testud_list.append(bd)

            else:

                bd = 100    # とりあえず100に設定

                testud_list.append(bd)

        bn = str1

    # 増減回数をカウント

    ctud = 0    # 増減カウンタ

    flgud = 0

    for n1, str1 in enumerate(testud_list):    

        # 増減変化回数をカウント (ただし、件数が(平均/2)以上でかつ増減率1以上または-1以下が対象)

        if ntot_list[n1] > (ntot/nnen)/2:

            if flgud == 0:

                if abs(str1) > 1: 

                    ctud = ctud + 1

                    flgud = 1

            if flgud == 1:

                if str1 < -1: 

                    ctud = ctud + 1

                    flgud = 0

    # 初期化

    ptn = 0

    wrd = ”

    # 全期間のパターンを判定

    # 増加 

    if ntot_list[nnen-1] – ntot_list[0] > 0:ptn = 1    # 全期間では増加

    if ntot_list[nnen-1] – ntot_list[0] > (ntot/nnen)*2: ptn = 2    # 全期間では急増

    # 減少

    if ntot_list[nnen-1] – ntot_list[0] < 0:ptn = -1    # 全期間では減少

    if ntot_list[nnen-1] – ntot_list[0] < (-ntot/nnen)/2: ptn = -2    # 全期間では急減

    # 横這い

    if abs(ntot_list[nnen-1] – ntot_list[0]) < (ntot/nnen)/6: ptn = 4    # 全期間では横這い   

    # パターン名修正             

    if ctud > 2: 

        if ptn == 4:

            ptn = 5

        else:

            if ptn > 0: ptn = 3

            if ptn < 0: ptn = -3

    # 全期間の傾向をコメント

    wrd1 = ”    

    # 増加    

    if ptn == 1: wrd1 = ‘全体的には増加傾向を示している。

    if ptn == 2: wrd1 = ‘全体的には増加傾向が顕著である。

    if ptn == 3: wrd1 = ‘全体的には増減しながらも増加傾向を示している。

    # 減少

    if ptn == -1: wrd1 = ‘全体的には減少傾向を示している。

    if ptn == -2: wrd1 = ‘全体的には減少傾向が顕著である。

    if ptn == -3: wrd1 = ‘全体的には増減しながらも減少傾向を示している。

    # 横這い

    if ptn == 4: wrd1 = ‘全体的には横這い傾向を示している。

    if ptn == 5: wrd1 = ‘増減しているものの全期間で見ると横這い傾向を示している。

    wrd = wrd1

    print(‘ptn=’,ptn,’=’,wrd)

    # 横這い期間を判定

    pyflat_nen = “0000”

    pyflat0 = 0    # 平坦開始年(int)

    pyflat1 = 0    # 平坦終了年(int)

    nflat = 0

    flg = 0

    ct = 0

    for n1, str1 in enumerate(testud_list):

        if flg == 0:

            if abs(str1) < 1:

                if ct == 0:

                    pyflat0 = int(py_list[n1])

                    flg = 1

        if flg == 1:

            if abs(str1) < 1: 

                ct = ct + 1

                nflat = ct

            if abs(str1) > 1:

                if pyflat0 != 0: 

                    pyflat1 = int(py_list[n1+1])

                flg = 0

                ct = 0

    if nflat > 3:    # 4年間平坦ならば横這いと判定

        flg =2

        pyflat1 = int(pyflat1) – 1    # 平坦終了年を修正

    if flg == 2: print(‘横這い期間=’,pyflat0, ‘‘,pyflat1)

    if flg == 2:

        wrd_pyflat = str(pyflat0) + ‘年~‘ + str(pyflat1) + ‘年まで横這いだが、

        pyflat_nen = str(pyflat1) + wrd_pyflat

    # 増加開始年を判定

    flg = 0

    pyup = 0

    for n1, str1 in enumerate(testud_list):

        if abs(str1) > 1:

            flg = 1

            break

    if flg == 1:

        pyup = int(py_list[n1+1])

    # 中間の急増を判定

    wrd_rap_nen = “0000”

    pyrap = 0

    for n1, str1 in enumerate(testud_list):

        if n1 < (nnen – 2):

            if str1 > 7:

                pyrap = py_list[n1]

                if ptn >= 1:     # 全期間が増加ならば

                    wrd_rap = str(py_list[n1]) + “年から急増し、

                    wrd_rap_nen = str(py_list[n1]) + wrd_rap

                    break

                if ptn <= -1:      # 全期間が減少ならば

                    wrd_rap = str(py_list[n1]) + “年から急増しているものの、

                    wrd_rap_nen = str(py_list[n1]) + wrd_rap

                    break

                if ptn == 4:     # 全期間が横這いならば

                    wrd_rap = str(py_list[n1]) + “年から急増しているものの、

                    wrd_rap_nen = str(py_list[n1]) + wrd_rap

                    break

    # 中間でピークとなった年を判定(横這いならばスキップ)

    wrd_peak_nen = “0000”

    if pymax != py_list[0]:

        if pymax != py_list[nnen-1]:

            if pymax != py_list[nnen-2]:   # 最終年とその前年はコメントせず

                if ptn != 5:

                    if ptn >= 1:    # 全期間が増加ならば

                        # wrd_peak = “ただし” + str(pymax) + “年にピークを付けた後は減少し、

                        wrd_peak = str(pymax) + “年にピークを付けた後は減少し、

                        wrd_peak_nen = str(pymax) + wrd_peak

                    if ptn <= -1:     # 全期間が減少ならば

                        wrd_peak = str(pymax) + “年にピークを付けた後は減少し、

                        wrd_peak_nen = str(pymax) + wrd_peak

    wrd_inc_nen = “0000”

    if ptn > 0:

        if pyflat0 == 0: pyflat0 = py_list[0]        

        if int(pyup) > (int(pyflat0) + 1):

#            print(pyup, ‘<‘, pyrap)

            if int(pyup) < int(pyrap):

                wrd_inc = str(pyup) + ‘年から増加し、

                wrd_inc_nen = str(pyup) + wrd_inc

    # 発行年順に結合

    wrd_list = []

    if int(pyflat_nen[0:4]) > 0:

        wrd_list.append(pyflat_nen[4:])

    if int(wrd_rap_nen[0:4]) > 0:

        wrd_list.append(wrd_rap_nen[4:])

    if int(wrd_peak_nen[0:4]) > 0:  

        wrd_list.append(wrd_peak_nen[4:])

    if int(wrd_inc_nen[0:4]) > 0: 

        wrd_list.append(wrd_inc_nen[4:])

    wrd_list= sorted(wrd_list)

    # wrdに追加

    for str1 in wrd_list:

        wrd = wrd + str1

    # print(‘wrd=’,wrd)        

    # 最終年の増減傾向を判定

    if (ntot_list[nnen-1] – ntot_list[nnen-2]) > 0:    # 最終年が増加でかつ

        if abs(testud_list[nnen-2]) >= 1:   # 増減率が1以上でかつ

            if ptn >= 1:    # 全期間が増加ならば

                if testud_list[nnen-2] > 7:

                    wrd = wrd + ‘最終年も急増している。

                else:

                    if ptn != 5: wrd = wrd + ‘最終年も増加している。

                    if ptn == 5: wrd = wrd + ‘最終年は増加している。

            if ptn <= -1:    # 全期間が減少ならば

                if testud_list[nnen-2] > 7:

                    wrd = wrd + ‘最終年は急増している。

                else:

                    wrd = wrd + ‘最終年は増加している。

            if abs(ptn) < 1:    # 全期間が横這いならば(-0.9+0.9)

                if testud_list[nnen-2] > 7:

                    wrd = wrd + ‘最終年は急増している。

                else:

                    wrd = wrd + ‘最終年は増加している。

        if abs(testud_list[nnen-2]) < 1:   # 増減率が1以下ならば

            if abs(ptn) < 1:    # 横這いならば(-0.9+0.9)

                wrd = wrd + ‘最終年も横這いとなっている。‘   

            else:

                wrd = wrd + ‘最終年は横這いとなっている。‘   

    if (ntot_list[nnen-1] – ntot_list[nnen-2]) < 0:    # 最終年が減少でかつ

        if abs(testud_list[nnen-2]) >= 1:   # 増減率が1以上でかつ

            if ptn >= 1:    # 全期間が増加ならば

                if testud_list[nnen-2] < -7:

                    wrd = wrd + ‘最終年は急減している。

                else:

                    wrd = wrd + ‘最終年は減少している。‘            

            if ptn <= -1:    # 全期間が減少ならば

                wrd = wrd + ‘最終年も減少している。‘            

            if abs(ptn) < 1:    # 全期間が横這いならば(-0.9+0.9)

                wrd = wrd + ‘最終年は減少している。

        if abs(testud_list[nnen-2]) < 1:   # 増減率が1以下ならば

            if abs(ptn) < 1:    # 全期間が横這いならば(-0.9+0.9)

                wrd = wrd + ‘最終年も横這いとなっている。‘   

            else:

                wrd = wrd + ‘最終年は横這いとなっている。

    if (ntot_list[nnen-1] – ntot_list[nnen-2]) == 0:    # 最終年が前年と同じならば

        if ptn >= 1:    # 増加ならば

            wrd = wrd + ‘最終年は横這いとなっている。‘            

        if ptn <= -1:    # 減少ならば

            wrd = wrd + ‘最終年は横這いとなっている。‘            

        if abs(ptn) < 1:    # 横這いならば(-0.9+0.9)

            wrd = wrd + ‘最終年も横這いとなっている。

    # 修正

    wrd = wrd.replace(“横這いだが、最終年も増加“, “横這いだが、最終年は増加“)

    wrd = wrd.replace(“減少し、最終年も増加“, “減少し、最終年は増加“)

    # 結合

    wrd = ‘ このグラフによれば上記出願人名義の公報発行件数は、‘ + wrd

#    print(wrd)

    wrd01 = wrd

    print(wrd01)

    if len(arr_nxny) == 1:    # 共同出願人が無ければ

        wrd02 = wrd

    else:

        wrd02 = ”

    if len(arr_nxny) > 1:    # 共同出願人が有れば

        # 1位のコード抽出

        topcode = ”

        maxtot = 0

        ncd = 0

        nlast = nnen -1

        for n1, str1 in enumerate(arr_nxny):

#            print(str1[nlast])

            bnn = int(str1[nlast])

#            ntot = 0

#            for nn1 in str1:

#                ntot = ntot + nn1

            if bnn > maxtot: 

                maxtot = bnn

                ncd = n1        

        print(‘最終年が1=’,code_list[ncd],arr_nxny[ncd],maxtot,’ 件‘)

        bcode = code_list[ncd]   # 1位のコード名

        list01 = arr_nxny[ncd]

        nlast = list01[nnen-1]

       # print(‘最終年の件数=’,nlast)

        nzennen = list01[nnen-2]

        # print(‘最終年前年の件数=’,nzennen)

        ninc = nlast-nzennen    # (最終年前年)の件数

        # print(‘(最終年前年)の件数=’,ninc)

        # 1 位の単調増加を判定

        bstr2 = 0

        upyear = ”    # 増加開始年

        flg_sinc = 0    # 増加開始年からの単調増加フラグ

        flg_inc = 0

        upnn1 = 0

        for n1, nn1 in enumerate(list01):

            if n1 == nnen +1: break

            if n1 == 1:bstr1 =  int(nn1)

            if n1>1:

                nn1 = int(nn1)

                bstr2 =   nn1

                if ((bstr2-bstr1) / nmax) > 0.05:    # 増加ならば

                    if flg_inc == 0:

                        upyear = nen_list[n1-1]    # 増加開始年

                        upnn1 = bstr2

                        flg_inc = 1    # 単調増加

                if ((bstr2-bstr1) / nmax) < 0.05:

                    upyear = ”

                    flg_inc = 0

                    break

            bstr1 = bstr2

        if flg_inc == 1: 

            print(‘単調増加である。‘)

        else:

            print(‘増減している。‘)

        if ((bstr2-upnn1) / nmax) > 0.5:flg_inc = 2    # nmax/2以上の顕著な単調増加

        # 1位の合計件数を集計し、ピークを判定

        ntot = 0

        ntop = 0

        for str1 in list01:

            ntot = ntot + str1

            if str1 > ntop: ntop = str1

        # コメント作成

        wrd = “\n”

        wrd0 = ”

        # 突出判定

        nlast = nnen – 1

        flg = 0

        for n1, str1 in enumerate(arr_nxny):

#            print(n1,str1)

#            print(str1[nlast])

            if str1[nlast] > (ntop * 0.9):

                flg = 1

        if flg == 1: 

            print(“最終年の件数が同程度のコードがある。“)

            flgntop = 0

        else:

            ptn = 0        

            flgntop = 0

            if ntop > (ntot / 2):

                flgntop = 1

                if ninc > (nmax / (nnen * 4)):

                    wrd0 = wrd + “ この中で「” + bcode + “」が突出しており、最終年も増加している。\n”

                if ninc > (nmax / (nnen * 4)):

                    if ninc< -(nmax / (nnen * 0.9)):

                        wrd0 = wrd + “ この中で「” + bcode + “」が突出しているが、最終年は急減している。\n”

                    else:

                        if ninc< 0:

                            wrd0 = wrd + “ この中で「” + bcode + “」が突出しているが、最終年は減少している。\n”

                if abs(ninc) < (nmax / (nnen * 4)):

                    wrd0 = wrd + “ この中で「” + bcode + “」が突出しているが、最終年は横這いとなっている。\n”

        if flg_inc == 0:    # 単調増加でなければ

            if flgntop == 0:     #  ピークと比較

                if ninc > (nmax / (nnen * 4)):

                    if ninc > (nmax / (nnen * 1)):

                        wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は急増している。\n”

                    else:

                        if ninc >0:

                            wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は増加している。\n”

                if ninc < -(nmax / (nnen * 4)):

                    if ninc < -(nmax / (nnen * 1)):

                        wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は急減している。\n”

                    else:

                        if ninc < 0:

                            wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は減少している。\n”

                if abs(ninc) <= (nmax / (nnen * 4)):

                    wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は横這いとなっている。\n”

        if flg_inc == 1:    # 単調増加ならば

            wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、” + upyear + “から増加している。\n”

            ptn = 1

        if flg_inc == 2:    # 顕著な単調増加ならば

            wrd = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、” + upyear + “から増加し、その後も顕著に増加し続けている。\n”

            ptn = 3

        # 結合

        wrd01 = wrd01 + wrd0

        # 最終年に増加しているコードを抽出

        ninc = 0

        inc_cd_list = []

        for n1, str1 in enumerate(arr_nxny):

            if str1[nnen-1] – str1[nnen-2] > 0:   # 最終年件数前年件数 > 0

                ninc = ninc + 1

                bcd = code_list[n1] 

                inc_cd_list.append(bcd)

        # print(‘最終年に増加しているコード=’,inc_cd_list)

        # コメント追加

        if ninc > 0:

            if ptn >= 1:

                wrd1 = “ また、次のコードも最終年に増加傾向を示している。\n”

            if ptn <= -1:

                wrd1 = “ また、次のコードは最終年に増加傾向を示している。\n”

            if ptn == 0:

                wrd1 = “ また、次のコードは最終年に増加傾向を示している。\n”

        # 増加したコード書き出し

        wrd2 =”

        for str1 in inc_cd_list:

            str1 = “  ” + str1 + “\n”

            if str1 not in bcode:

                wrd2 = wrd2 + str2

#            wrd2 = wrd2 + str1

        wrd = wrd1 + wrd2

        wrd02 = wrd

    return(wrd01,wrd02)    

# テスト def発行件数の年別推移(折線グラフ)

## def発行件数の年別推移(折線グラフ)にデータを設定し、テストする。

# 折線データ設定

nen_list= [‘2011‘, ‘2012‘, ‘2013‘, ‘2014‘, ‘2015‘, ‘2016‘, ‘2017‘, ‘2018‘, ‘2019‘, ‘2020‘]

code_list= [‘A:航空機;飛行;宇宙工学‘, ‘B:電気通信技術‘, ‘C:測定;試験‘, ‘D:制御;調整‘, ‘E:信号‘, ‘F:計算;計数‘, ‘G:農業;林業;畜産;狩猟;捕獲;漁業‘, ‘H:写真;映画;波使用類似技術;電子写真;ホログラフイ ‘, ‘I:電力の発電,変換,配電‘]

arr_nxny= [[6, 9, 19, 9, 19, 77, 301, 407, 641, 543], [0, 1, 1, 0, 4, 20, 58, 73, 79, 70], [2, 0, 2, 2, 2, 14, 61, 68, 120, 82], [0, 1, 3, 0, 1, 9, 68, 74, 131, 105], [0, 0, 2, 1, 2, 13, 41, 58, 105, 90], [0, 0, 0, 0, 1, 1, 28, 24, 52, 52], [0, 0, 0, 0, 0, 2, 12, 32, 34, 39], [0, 0, 0, 1, 3, 4, 24, 7, 23, 13], [0, 0, 0, 0, 0, 2, 15, 26, 33, 28]]

nnen = len(nen_list)

# 1位のコード抽出

topcode = ”

maxtot = 0

for n1, str1 in enumerate(arr_nxny):

    ntot = 0

    for nn1 in str1:

        ntot = ntot + nn1

    if ntot > maxtot: 

        maxtot = ntot

        ncd = n1        

bcode = code_list[ncd]   # 1位のコード名

list01 = arr_nxny[ncd]

nlast = list01[nnen-1]

# print(‘最終年の件数=’,nlast)

nzennen = list01[nnen-2]

# print(‘最終年前年の件数=’,nzennen)

ninc = nlast-nzennen    # (最終年前年)の件数

# print(‘(最終年前年)の件数=’,ninc)

g_title = ‘コード別発行件数の年別推移

# def実行

fig_n = ‘0′

wrd = ”

wrd01,wrd02 = oresen_comment(nen_list,code_list,arr_nxny,fig_n, g_title)

print(‘wrd01=’,wrd01)

print(‘wrd02=’,wrd02)

# 増減判定

import pandas as pd

import numpy as np

def chk_zogen(testud_list,nstt,nstp):

    wrdud = “”      

    flg = 0

    bflg = 0

    ntot = 0

    flg2 = 0

    flg3 = 0

    bstt = testud_list[nstt-1]    # nstt-1の増減率

    for n1,nn1 in enumerate(testud_list):

        if n1 > nstp -1: break

        if n1 >= nstt: 

            ntot = ntot + nn1

            if abs(bstt-ntot) > 1:    # 増減が大きければ横這いとせず

                bflg = 1

            if nstt == 0:    # 開始年からの横這いはここでは判定しない

                bflg = 1   

            if abs(nn1) > 1:    # 増減が大きければ横這いとせず

                bflg = 1   

            if nn1 > 8: flg2 = 1

            if nn1 < -8: flg3 = 1

    if ntot > 0:

        if flg2 == 1:

            wrdud = “急増し、

        else:

            wrdud = “増加し、

        flg = 1

    if abs(ntot) <= 1:

        if bflg == 0:

            wrdud = “横這い、

            flg = 2        

    if ntot < 0:

        if flg3 == 1:

            wrdud = “急減し、

        else:

            wrdud = “減少し、”            

        flg =3

    # 連続増加を判定

    flg2 = 0

    if flg == 1:

        k = 0

        for n1, nn1 in enumerate(testud_list):

            if n1 > nstp -1: break

            if n1 >= nstt: 

                if nn1 >= 0:

                    k = k +1

                if nn1 > 7: flg2 = 1

                else:

                    break

        if k >= 2: 

            if flg2 == 1:

                wrdud = “急増し、

            else:

                wrdud = “増加し、

        if k >= 3: 

            wrdud = “増加し続け、

    # 増減しながらも増加

    if flg == 1:

        kp = 0

        km = 0

        for n1, nn1 in enumerate(testud_list):

            if n1 > nstp -1: break

            if n1 >= nstt: 

                if nn1 >= 0:

                    kp = kp +1

                else:

                    km = km + 1

        if kp > 0: 

            if km > 0:

                wrdud = “増減しながらも増加し、

    # 連続横這いを判定

    if flg == 2:

        k = 0

        bnn0 = testud_list[nstt]

        ntot = 0

        for n1, nn1 in enumerate(testud_list):

            if n1 > nstp -1: break

            if n1 >= nstt: 

                ntot = ntot + nn1

                if ntot <= 1:

                    k = k +1

                else:

                    break

        if k >= 2: 

            wrdud = “横這いが続き、

    # 連続減少を判定

    if flg == 3:

        k = 0

        for n1, nn1 in enumerate(testud_list):

            if n1 > nstp -1: break

            if n1 >= nstt: 

                if nn1 <= 0:

                    k = k +1

                else:

                    break

        if k >= 3:

            wrdud = “減少し続け、

    # 増減しながらも減少

    if flg == 3:

        kp = 0

        km = 0

        for n1, nn1 in enumerate(testud_list):

            if n1 > nstp -1: break

            if n1 >= nstt: 

                if nn1 <= 0:

                    kp = kp +1

                else:

                    km = km + 1

        if kp > 0: 

            if km > 0:

                wrdud = “増減しながらも減少し、”                    

    return(wrdud)  

# def棒グラフとコメント作成

## 棒グラフデータを分析し、棒グラフの特徴を表すコメントを作成

# ex:py_list=[‘2011’, ‘2012’, ‘2013’, ‘2014’, ‘2015’, ‘2016’, ‘2017’, ‘2018’, ‘2019’, ‘2020’]

# ex:nyken_list[2, 5, 6, 6, 14, 52, 169, 216, 274, 254]

def bargraph_comment(py_list,nyken_list):    

    nnen = len(py_list)           # 調査年数nnen(int)算出

    py_list = py_list                # 公報発行年

    # print(‘公報発行年py_list=’,py_list)

    nyken_list = nyken_list    # 年別発行件数

    # print(‘年別発行件数nyken_list=’,nyken_list)

    # 合計ntot算出

    ntot = 0

    for n1 in nyken_list:

        ntot = ntot + n1

    # print(‘合計件数ntot=’,ntot)

    # 年別発行率pken_list(発行年の件数/合計件数ntot)

    pken_list = []

    for nn1 in nyken_list:

        bpken = (nn1/ntot)*100

        bpken = round(bpken,1)

        pken_list.append(bpken)

    # print(‘年別発行率pken_list=’,pken_list)

    # 増減率を計算

    bn = 0

    testud_list = []

    for n1,str1 in enumerate(nyken_list):

        if n1>0:

            if ntot > 0:

                bd = ((str1 – bn)/ntot)*100

                bd = round(bd,1)

                testud_list.append(bd)

            else:

                bd = 100    # とりあえず100に設定

                testud_list.append(bd)

        bn = str1

    # print(‘増減率testud_list=’,testud_list)

    # 増減反転回数をカウント

    ctud = 0    # 増減反転カウンタ

    flgud = 0

    for n1, nn1 in enumerate(testud_list):

        if n1 == len(testud_list) – 1: break

        if nn1 > 0:

            if testud_list[n1+1] < 0: ctud = ctud + 1

        if nn1 < 0:

            if testud_list[n1+1] > 0: ctud = ctud + 1

    # print(‘増減反転回数ctud=’,ctud)

    # 初期化

    ptn0 = 0

    wrd = ”

    # 全期間のパターンptnを判定

    # 増加 

    if nyken_list[nnen-1] – nyken_list[0] > 1:ptn0 = 1    # 全期間では増加

    if nyken_list[nnen-1] – nyken_list[0] > (ntot/nnen)*2: ptn0 = 2    # 全期間では急増

    # 減少

    if nyken_list[nnen-1] – nyken_list[0] < -1:ptn0 = -1    # 全期間では減少

    if nyken_list[nnen-1] – nyken_list[0] < (-ntot/nnen)/2: ptn0 = -2    # 全期間では急減

    # 横這い

    if abs(nyken_list[nnen-1] – nyken_list[0]) <= 1: ptn0 = 4    # 全期間では横這い 

    # if ctud > 2:    # 増減回数が3回以上ならば

    if ctud > 2:

        if ptn0 == 4:    # パターン45に修正

            ptn0 = 5

        else:    # さもなくば

            if ptn0 > 0: ptn0 = 3   # パターン123に修正

            if ptn0 < 0: ptn0 = -3   # パターン-1-2-3に修正

    # 全期間の傾向をコメント

    wrd0 = ”    

    # 増加   

    if ptn0 == 1: wrd0 = ‘全期間では増加傾向を示している。

    if ptn0 == 2: wrd0 = ‘全期間では増加傾向が顕著である。

    if ptn0 == 3: wrd0 = ‘全期間では増減しながらも増加傾向を示している。

    # 減少

    if ptn0 == -1: wrd0 = ‘全期間では減少傾向を示している。

    if ptn0 == -2: wrd0 = ‘全期間では減少傾向が顕著である。

    if ptn0 == -3: wrd0 = ‘全期間では増減しながらも減少傾向を示している。

    # 横這い

    if ptn0 == 4: wrd0 = ‘全期間では横這い傾向を示している。

    if ptn0 == 5: wrd0 = ‘増減しているものの全期間で見ると横這い傾向を示している。

    wrd0 = wrd0 + “\n” + “ 

    #print(‘パターンptn0=’,ptn0,’=’,wrd)

    # 調査期間

    #print(‘調査期間nnen=’,nnen,’‘)

    # 開始年

    pystt = int(py_list[0])

    #print(‘開始年pystt=’,pystt,type(pystt))

    ppystt = pken_list[0]

    #print(‘開始年発行率ppystt=’,ppystt,type(ppystt))

    # 最終年

    pystp = int(py_list[nnen-1])

    #print(‘最終年pystp=’,pystp,type(pystp))

    ppystp = pken_list[nnen-1]

    #print(‘最終年発行率ppystp=’,ppystp,type(ppystp))

    pstp = testud_list[nnen-2]

    #print(‘最終年増減率pstp=’,pstp,type(pstp))

    # ボトム年判定pymin

    wrd_btm = ”

    nbtm = 1000000

    pymin= 0

    npymin = 0

    for n1, str1 in enumerate(nyken_list):

        if str1< nbtm:            

            nbtm = str1

            bpymin = py_list[n1]

            npymin = n1

            bn1 = n1

    pymin = int(bpymin)

    ppymin = pken_list[bn1]

    #print(‘ボトム年発行率ppymin=’,ppymin,type(bn1))

    # ピーク年判定pymax

    wrd_peak_nen = “0000”

    wrd_peak = ”

    npeak = 0

    pymax= 1000000

    npymax = 0

    for n1, str1 in enumerate(nyken_list):

        if str1> npeak:            

            npeak = str1

            bpymax = py_list[n1]

            npymax = n1

            bn1 = n1

    pymax = int(bpymax)

    ppymax = pken_list[bn1]

    #print(‘ピーク年ppymax=’,ppymax,type(ppymax)) 

    # 調査開始年以降が0件ならば調査開始年を修正

    flgup0 = 0

    newpystt = 0

    if nyken_list[0] == 0:

        for n2, nn2 in enumerate(nyken_list):

            if nn2 == 0: 

                upstt0 = int(py_list[n2+1])    # 新増加開始年

                flgup0 = n2

            else:

                break

        newpystt = int(py_list[flgup0]) + 1

    #print(‘新開始年newpystt=’,newpystt,type(newpystt))

    # パラメータをリスト化

    para_list = []

    para_list.append(str(pystt) + “pystt”)

    para_list.append(str(pystp) + “pystp”)

    para_list.append(str(pymin) + “pymin”)

    para_list.append(str(pymax) + “pymax”)

    #print(para_list)

    # 発行年順にソート

    para_list= sorted(para_list)

    # 増減パターン

    #print(‘増減パターンpara_list=’,para_list)

    #テストデータ書き出し

    print(”)

    print(‘list2= ‘,py_list)

    print(‘list3= ‘,nyken_list)

    print(‘年別発行率pken_list=’,pken_list)

    print(‘増減率testud_list=’,testud_list)

    print(‘全期間の傾向para_list=’,para_list)   

    # 増減パターンptn判定

    ptn1 = 0

    # 開始年のパターン

    wrd1 = “”

    if para_list[0][4:] == “pystt”:

        ptn1 = 11    # pymax !=pystt

        wrd1 = wrd1 + “開始年は” + para_list[0][0:4] + “年であり、”        

    if para_list[0][4:] == ‘pymin’: 

        ptn1= 12    # pymin=pystt

        wrd1 = wrd1 + “開始年の” + para_list[0][0:4] + “年がボトムであり、

    if para_list[0][4:] == ‘pymax’: 

        ptn1= 13    # pymax=pystt

        wrd1 = wrd1 + “開始年の” + para_list[0][0:4] + “年がピークであり、

    # 開始年からの連続増加を判定

    nupmax = 0

    for n1, nn1 in enumerate(pken_list):

        if n1 > 0:

            if (pken_list[n1-1] – pken_list[n1]) < 0: 

                nupmax = nupmax + 1

            else:

                break

    # 開始年からの連続減少を判定

    ndwnmax = 0

    for n1, nn1 in enumerate(pken_list):

        if n1 > 0:

            if (pken_list[n1-1] – pken_list[n1]) > 0: 

                ndwnmax = ndwnmax + 1

            else:

                break

    #print(‘開始年からの連続増減少年数ndwnmax=’,ndwnmax)

    # 連続横這いを判定(開始年0件は除く)

    flg = 0

    if nupmax >=2: flg = 1

    if ndwnmax >=2: flg = 1

    if flg == 0:

        if nyken_list[0] !=0:

            bpken0 = pken_list[0]

            k = 0    # 横這いカウンタ

            flg = 0

            ndwn = 0    # DOWNカウンタ

            nup = 0    # UPカウンタ

            for n1, nn1 in enumerate(pken_list):

                if n1 > 0:

                    if n1 < (len(pken_list) -1):

                        if abs(nn1 – bpken0) <=1:

                            if (pken_list[n1-1] – pken_list[n1]) > 0: 

                                ndwn = ndwn + 1

                                nup = 0

                            if (pken_list[n1-1] – pken_list[n1]) < 0:

                                nup = nup + 1

                                ndwn = 0

                    if abs(bpken0 – nn1) <= 1:    # pyminpymaxは除外

                        if int(py_list[n1]) == pymin: flg = 1

                        if int(py_list[n1]) == pymax: flg = 1

                    if flg == 1:

                        if abs(bpken0 – nn1) <  0.5: flg = 0    # nn1までの増減が小ならば横這い

                    if abs(pken_list[n1-1] – pken_list[n1]) > 1: flg = 1    # 翌年の増減が大ならば増減

                    if abs(nn1 – bpken0) <=1:

                        if flg == 0:

                            k = k +1

                        else:

                            break

            if k >= 2:             

                bk = k 

                bpy0 = py_list[bk ]

                print(‘連続横這い終了年=’,bpy0,’bk=’,bk)

                print(‘連続減少数=’,ndwn,’連続増加数=’,nup)

                if ndwn > 0:

                    if bk > ndwn: ptn1= 14    #  連続横這い

                if nup > 0:

                    if bk > nup: ptn1= 14    #  連続横這い

    print(‘ptn1=’,ptn1,wrd1)

    # 最終年のパターン

    ptn2 = 0

    wrd4 = “”

    if para_list[3][4:] == “pystp”:

        if para_list[3][0:4] != para_list[2][0:4]:

            ptn2 = 21    # pymax !=pystp

            wrd4 = wrd4 + “最終年は” + para_list[3][0:4] + “年であり、

        else:            

            if para_list[2][4:] == “pymax”:

                ptn2 = 22    # pymax=pystp

                wrd4 = wrd4 + “最終年の” + para_list[3][0:4] + “年がピークであり、”                

            if para_list[2][4:] == “pymin”:

                ptn2 = 23    # pymin=pystp

                wrd4 = wrd4 + “最終年の” + para_list[3][0:4] + “年がボトムであり、”   

    print(‘ptn2=’,ptn2,wrd4)

    # 開始年からpara_list[2]までの増減パターン    

    wrd2 =””

    if ptn1 == 11:

        # 開始年から減少

        if para_list[1][4:] == “pymin”:

            # 翌年がボトム

            if npymin == 1:

                wrd2 = wrd2 + “翌年にボトムを付け、

                # def実行

                nstt = 1

                nstp = npymax

                wrdud = chk_zogen(testud_list,nstt,nstp)

                if para_list[2][0:4] != para_list[3][0:4]:    # ピーク年 != 最終年ならば

                    wrd2 = wrd2 + “ピークの” + str(pymax) + “年まで” + wrdud

            else:

                # def実行

                nstt = 0

                nstp = npymin

                wrdud = chk_zogen(testud_list,nstt,nstp)             

                # if wrdud== ‘減少し続け、‘:    # 連続減少ならば

                if “減少” in wrdud:

                    wrd2 = wrd2 + str(pymin) + “年のボトムにかけて” + wrdud

                    # def実行

                    nstt = npymin

                    nstp = npymax

                    wrdud = chk_zogen(testud_list,nstt,nstp)

                    if para_list[2][0:4] != para_list[3][0:4]:    # ピーク年 != 最終年ならば

                        wrd2 = wrd2 + “ピークの” + str(pymax) + “年まで” + wrdud

                else:

                    wrd2 = wrd2 + str(pymin) + “年にボトムを付け、

                    # def実行

                    nstt = npymin

                    nstp = npymax

                    wrdud = chk_zogen(testud_list,nstt,nstp)

                    if para_list[2][0:4] != para_list[3][0:4]:    # ピーク年 != 最終年ならば

                        wrd2 = wrd2 + “ピークの” + str(pymax) + “年まで” + wrdud

        # 開始年から増加

        if para_list[1][4:] == “pymax”:

            # 翌年がピーク

            if npymax == 1:

                wrd2 = wrd2 + “翌年にピークを付け、

                # def実行

                nstt = npymax

                nstp = npymin

                wrdud = chk_zogen(testud_list,nstt,nstp)

                if para_list[2][0:4] != para_list[3][0:4]:    # ピーク年 != 最終年ならば

                    wrd2 = wrd2 + “ボトムの” + str(pymin) + “年まで” + wrdud

            else:

                # def実行

                nstt = 0

                nstp = npymax

                wrdud = chk_zogen(testud_list,nstt,nstp)

                wrd2 = wrd2 + str(pymax) + “年のピークにかけて” + wrdud

                # def実行

                nstt = npymax

                nstp = npymin

                wrdud = chk_zogen(testud_list,nstt,nstp)

                if para_list[2][0:4] != para_list[3][0:4]:    # ピーク年 != 最終年ならば

                    wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud

    # 開始年=ボトムの増減パターン        

    if ptn1 == 12:

        wrd1 =””

        wrd2 =””

        # 開始年=ボトム

        # 開始年が0件の場合

        k = 0

        if nyken_list[0] == 0:    # 開始年が0

            k = 0

            for n1, nn1 in enumerate(nyken_list):

                if nn1 == 0:

                    k = k + 1

                else:

                    break

            #print(“0件の終了年=”,py_list[k -1])

        k0py = int(py_list[k -1])

        if k > 0:

            if  para_list[0][0:4] == str(k0py):

                wrd1 = “開始年の” + para_list[0][0:4] + “年は0件であり、その後は

            else:  

                wrd1 = “開始年の” + para_list[0][0:4] + “年から” + str(k0py) + “年までは0件であり、

        else:    

            wrd1 = wrd1 + “開始年の” + para_list[0][0:4] + “年がボトムであり、

        # 開始から横這いを判定

        nn0 = pken_list[0]

        bflnen = 0

        k = 0

        for n1, nn1 in enumerate(pken_list):

            if abs(nn1-nn0) > 1: break

            bflnen = int(py_list[n1])

            k = k +1

        print(‘横這い終了年=’,bflnen)

        if k >= 3:

            wrd1 = wrd1 + str(bflnen) +”年まで横這いを続け、

        # 開始年からpara_list[2]までの増減パターン    

        # 開始年から増加

        if para_list[2][4:] == “pymax”:

            # 翌年がピーク

            if npymax == 1:

                if testud_list[1] < -5:

                    wrd2 = wrd2 + “翌年にピークを付けた後に急減し、

                    pymax = py_list[2]

                    npymax = 2

                else:

                    wrd2 = wrd2 + “翌年にピークを付け、”                  

            else:

                # def実行

                nstt = 0

                nstp = npymax

                wrdud = chk_zogen(testud_list,nstt,nstp)            

                if pymax == pystp:

                    wrdud = wrdud.replace(“増加し、“,”増加している。“)

                    wrd2 = wrd2 + “最終年(=ピーク年)” + str(pymax) + “年にかけて” + wrdud

                    print(“ptn2=”,ptn2,”最終年がピークであり“)

                    ptn1 = 0

                    ptn2 = 0

                    wrd4 = “”                    

                else:

                    wrd2 = wrd2 + str(pymax) + “年のピークにかけて” + wrdud

    #開始年=ピークの増減パターン

    if ptn1 == 13:

        wrd1 =””

        wrd2 =””

    # 開始年=ピーク

        wrd1 = wrd1 + “開始年の” + para_list[0][0:4] + “年がピークであり、

        # 開始年から減少

        if para_list[2][4:] == “pymin”:

            # 翌年がボトム

            if npymin == 1:

                wrd2 = wrd2 + “翌年にボトムを付け、

            else:

                if pymin != pystp:

                    # def実行

                    nstt = 0

                    nstp = npymin

                    wrdud = chk_zogen(testud_list,nstt,nstp)

                    wrd2 = wrd2 + str(pymin) + “年のボトムにかけて” + wrdud 

    # 全期間で横這い判定

    bmin = 100

    bmax = 0

    for n1, nn1 in enumerate(pken_list):

        if nn1 < bmin: bmin = nn1

        if nn1 > bmax: bmax = nn1

    # print(‘全期間のmax-min=’,bmax, ‘-‘, bmin, ‘=’, bmax – bmin)

    bmaxmin = bmax – bmin

    if bmaxmin <= 1:

        wrd2 = “開始年の” + str(pystt) + “年から最終年の” + str(pystp) + “年までの全期間で増減は少なく、ほぼ横這いとなっている。

        ptn1 = 15

        ptn2 = 25

        wrd1 = “”

        wrd4 = “”

        print(“ptn1=”,ptn1,”全期間で横這い“)

        print(“ptn2=”,ptn2,”全期間で横這い“)

    if bmaxmin <= 2:

        wrd2 = “開始年の” + str(pystt) + “年から最終年の” + str(pystp) + “年まで多少増減しているものの、全期間で見ると概ね横這いとなっている。

        ptn1 = 15

        ptn2 = 25

        wrd1 = “”

        wrd4 = “”

        print(“ptn1=”,ptn1,”全期間で概ね横這い“)

        print(“ptn2=”,ptn2,”全期間で概ね横這い“)

#    print(wrd2)

    # 開始年近傍=連続横這い    

    if ptn1 == 14:    # 連続横這い

        wrd1 = “”

        wrd2 = “”

        if int(bpy0) == int(pymin):

            wrd2 = “開始年の” + str(pystt) + “年からボトムの” + str(pymin) + “年までほぼ横這いとなっており、その後、

        else:     

            wrd2 = “開始年の” + str(pystt) + “年から” + str(bpy0) + “年までほぼ横這いとなっており、その後、

        # para_list[1]をテスト

        if int(bpy0) < int(para_list[1][0:4]):    # 横這い終了年の後にpara_list[1][0:4]        

            if para_list[1][4:] == “pymax”:

                # def実行

                nstt = bk

                nstp = npymax

                wrdud = chk_zogen(testud_list,nstt,nstp)

                wrd2 = wrd2 + “ピークの” + str(pymax) + “年にかけて” + wrdud

                if para_list[2][4:] == “pymin”:

                    if pymin != pystp:

                        # def実行

                        nstt = npymax

                        nstp = npymin

                        wrdud = chk_zogen(testud_list,nstt,nstp)

                        wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud

            if para_list[1][4:] == “pymin”:

                # def実行

                nstt = bk

                nstp = npymin

                wrdud = chk_zogen(testud_list,nstt,nstp)           

                wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud                

                if para_list[2][4:] == “pymax”:

                    if pymax != pystp:

                        # def実行

                        nstt = npymin

                        nstp = npymax

                        wrdud = chk_zogen(testud_list,nstt,nstp)

                        wrd2 = wrd2 + “ピークの” + str(pymax) + “年にかけて” + wrdud

            if para_list[1][4:] == “pystt”:

                wrd1 = “”

                wrd2 = “開始年の” + str(pystt) + “年から” + str(bpy0) + “年までほぼ横這いとなっており、その後、

                if para_list[2][4:] == “pymin”:

                    # def実行

                    nstt = bk

                    nstp = npymin

                    wrdud = chk_zogen(testud_list,nstt,nstp)            

                    wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud

                if para_list[2][4:] == “pymax”:

                    # def実行

                    nstt = bk

                    nstp = npymax

                    wrdud = chk_zogen(testud_list,nstt,nstp)            

                    wrd2 = wrd2 + “ピークの” + str(pymax) + “年にかけて” + wrdud

        if int(bpy0) >= int(para_list[1][0:4]):    # 横這い終了年の前にpara_list[1][0:4]ならばpara_list[2]をテスト                    

           # para_list[2]をテスト         

            if int(para_list[2][0:4]) >= int(bpy0): 

                if para_list[2][4:] == “pymax”:

                    # def実行

                    nstt = bk

                    nstp = npymax

                    wrdud = chk_zogen(testud_list,nstt,nstp) 

                    if pymax == pystp:

                        wrdud = wrdud.replace(“し、“,”している。“)

                        wrdud = wrdud.replace(“し続け、“,”し続けている。“)

                        wrd2 = wrd2 + “最終年(=ピーク年)” + str(pymax) + “年にかけて” + wrdud

                        wrd1 = “”

                        wrd4 = “”

                        ptn2 = 0

                    else:

                        if pymax != pystp:                            

                            wrd2 = wrd2 + “ピークの” + str(pymax) + “年にかけて” + wrdud

                if para_list[2][4:] == “pymin”:

                    # def実行

                    nstt = bk

                    nstp = npymin

                    wrdud = chk_zogen(testud_list,nstt,nstp)

                    if pymin == pystp:

                        wrdud = wrdud.replace(“し、“,”している。“)

                        wrd2 = wrd2 + “最終年(=ピーク年)” + str(pymax) + “年にかけて” + wrdud

                        wrd1 = “”

                        wrd4 = “”

                        ptn2 = 0

                    else:

                        wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud

    # 最終年のパターン    

    if ptn2 == 21:    # “最終年は” + para_list[3][0:4] + “年であり、

        wrd4 = “最終年は” +str(pystp) + “年である。”        

        if para_list[3][4:] == “pystp”:

            # 増減判定

            if para_list[2][4:] == “pymin”:

            # def実行

                nstt = npymin

                nstp = nnen -1

                wrdud = chk_zogen(testud_list,nstt,nstp)

                wrdud = wrdud.replace(“し、“,”“)

                wrdud = wrdud.replace(“け、“,”“)

                wrdud = wrdud.replace(“続き、“,”続い“)

                if (pystp – pymin) == 1:

                    if testud_list[nnen-2] <= 1:

                        wrd4 = “最終年の” + str(para_list[3][0:4]) + “年はほぼ横這いとなっている。

                        wrd4 = wrd4.replace(“し続けて“,”して“)

                    else:

                        wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけては” + wrdud + “ている。

                else:

                    if abs(pken_list[nstt] – pken_list[nstp]) <=1:

                        if pken_list[nstt] == pken_list[nstp]:

                            wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけてはボトムに戻っている。

                        else:

                            wrd4 = “最終年の” + para_list[3][0:4] + “年にかけては” + wrdud + “ている。

                            wrd4 = wrd4.replace(“増加し“,”ボトム近くに戻っ“)

                            wrd4 = wrd4.replace(“減少し“,”ボトム近くに戻っ“)

                    else:     

                        #print(wrdud)

                        wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけては” + wrdud + “ている。

                if testud_list[nnen-2] < 0:

                    wrd4 = wrd4.replace(“し続けて“,”して“)

            if para_list[2][4:] == “pymax”:

            # def実行

                nstt = npymax

                nstp = nnen -1

                wrdud = chk_zogen(testud_list,nstt,nstp)

                wrdud = wrdud.replace(“し、“,”“)

                wrdud = wrdud.replace(“け、“,”“)

                wrdud = wrdud.replace(“続き、“,”続い“)

                if (ppymax – ppystp) <= 1:

                    if abs(testud_list[nnen-2]) > 1:

                        if ppymax == ppystp:

                            wrd4 = “その後増減しているが、最終年の” + str(para_list[3][0:4]) + “年にはピークに戻っている。

                        else:

                            wrd4 = “その後増減しているが、最終年の” + str(para_list[3][0:4]) + “年にはピーク近くに戻っている。

                    else: 

                        wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけてはほぼ横這いとなっている。

                else:

                    wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけては” + wrdud + “ている。

                    wrd4 = wrd4.replace(“し続けて“,”して“)

                if testud_list[nnen-2] > 0:

                    wrd4 = wrd4.replace(“し続けて“,”して“)

        # wrdudが空白でかつ開始年と最終年が同数

        if wrdud == “”:

            if abs(pken_list[0] –  pken_list[nnen -1]) <= 1:

                wrd4 = “その後に増減したものの、最終年の” + str(para_list[3][0:4]) + “年では開始年近くに戻っている。

    if ptn2 == 22:    # “最終年の” + para_list[3][0:4] + “年がピークであり、

        print(“ptn2=”,ptn2,”最終年がピークであり、“)

        wrd4 = “最終年は” +str(pystp) + “年である。

        print(“最終年=”,pystp)

        if para_list[3][4:] == “pystp”:

            if para_list[2][4:] == “pymax”:

                if para_list[2][0:4] == para_list[3][0:4]:

                    wrd4 = “最終年の” + str(pystp) + “年がピークであり、”                

                    # 増減判定

                    if para_list[1][4:] == “pymin”:

                        # def実行

                        nstt = npymin

                        nstp = nnen -1

                        wrdud = chk_zogen(testud_list,nstt,nstp)

                        wrdud = wrdud.replace(“し、“,”“)

                        wrdud = wrdud.replace(“け、“,”“)

                        if testud_list[nnen-2] > 5:

                            wrd4 = “最終年の” + para_list[3][0:4] + “年は急増しピークとなっている。

                        else:

                            wrd4 = “最終年(=ピーク年)” + para_list[3][0:4] + “年にかけて” + wrdud + “ている。

    if ptn2 == 23:    # “最終年の” + para_list[3][0:4] + “年がボトムであり、”            

        print(“ptn2=”,ptn2,”最終年がボトムであり、“)

        wrd4 = “最終年は” +str(pystp) + “年である。

        if para_list[3][4:] == “pystp”:

            if para_list[2][4:] == “pymin”:

                if para_list[2][0:4] == para_list[3][0:4]:              

                    # 増減判定

                    if para_list[2][4:] == “pymin”:

                        # def実行

                        nstt = npymax

                        nstp = nnen -1

                        wrdud = chk_zogen(testud_list,nstt,nstp)

                        wrdud = wrdud.replace(“し、“,”“)

                        wrdud = wrdud.replace(“け、“,”“)

                        wrdud = wrdud.replace(“続き、“,”続い“)

                        wrd4 = “最終年(=ボトム年)” + para_list[3][0:4] + “年にかけて” + wrdud + “ている。

    # 例外処理(横這い、急増、急減)    

    # max件数判定

    nkenmax = 0

    for n1, nn1 in enumerate(nyken_list):

        if nn1 > nkenmax:

            nkenmax = nkenmax + nn1

            nkenmax =  nn1

    #print(‘最大件数=’,nkenmax)

    # 少数ならば顕著を修正

    if nkenmax < 10:

        wrd0 = wrd0.replace(“増加傾向が顕著である“,”増加傾向を示している“)

        wrd0 = wrd0.replace(“減少傾向が顕著である“,”減少傾向を示している“)

    # 結合

    wrd = wrd0 + wrd1 + wrd2 + wrd4

    wrd = wrd.replace(“横這い、ている“,”横這いとなっている“)

    wrd = wrd.replace(“その後翌年に“,”翌年に“)

    #print(‘wrd=’,wrd)

    # 最頻値件数判定

    nkenmid = 0

    bk = 0

    bn = 0

    for n1, nn1 in enumerate(nyken_list):

        k = 0

        for n2, nn2 in enumerate(nyken_list):

            if nn1 == nn2:

                k = k + 1

        if k > bk: 

            bk = k

            bn = nn1

    nkenmid = bn

    nkmid = bk

    #print(‘最頻値=’,nkenmid,’出現回数=’,nkmid) 

    # max<10ならば急増、急減を増加、減少に置換

    if nkenmax < 10:

        wrd = wrd.replace(“急増“,”増加“)

        wrd = wrd.replace(“急減“,”減少“)

    # 横這い判定

#    if nkenmax < 10: 

    if nkenmid <= 3: 

        nn00 = 3       

    else:

        nn00 = 0    

    #

    k = 0

    kmax = 0

    ktot = 0

    bnn0 = pken_list[0]

    flgup = 0

    flgup1 = 0

    flgdwn = 0

    wrd5 = “”

    wrdup = “”

    wrddwn = “”

    bn1 = 0

    bn2 = 0

    for n1, nn1 in enumerate(pken_list):

        if n1 > 0:

            # 横這い

            if abs(bnn0 – nn1) <= 1:

                k = k +1

                if k >kmax: kmax =k

            else:

                k = 0

                if kmax >= 2:

                    ktot =ktot + kmax

                kmax = 0

                bnn0 = pken_list[n1]

            if n1 == len(pken_list) – 1:

                ktot =ktot + kmax

            # 急増

            if testud_list[n1-1]>= (7 + nn00): 

                flgup = 1

                bn1 = n1

            # 急減          

            if testud_list[n1-1] <= (-7 – nn00): 

                flgdwn = 1

                bn2 = n1

            # 急増・急減

            if n1 != (len(pken_list) -1):

                if bn1 > 1:

                    if bn2 > 1:

                        if abs(bn1 – bn2) == 1:

                            flgup1 = 1

    #print(‘横這い回数合計(2回以上の合計)=’,ktot ,’flgup=’,flgup,’flgup1=’,flgup1,’flgdwn=’,flgdwn)

    #print(‘2回以上の横這い回数合計=’,ktot)

    if ‘急増‘  in wrd: 

        flgup = 0

        flgup1 = 0

    if ‘急減‘  in wrd: 

        flgdwn = 0

    if ‘横這いとなっており、‘  in wrd: 

        ktot = 0

    if ‘横這いとなっている。‘  in wrd: 

        ktot = 0

    # コメント追加

    if nkenmax < 10:

        flgup = 0

        flgup1 = 0

        flgdwn = 0

    flg = 0

    flgyoko = 0

    if ktot >= 4:

        flgyoko = 1

        if flgup == 1: flg = 1

        if flgup1 == 1: flg = 1

        if flgdwn == 1: flg = 1

        #print(ktot ,flgup,flgup1,flgdwn)

        if flg == 1:

            wrd5 = “横這いが続く期間が多く、さらに、

        else:

            wrd5 = “横這いが続く期間が多かった。”    

    if flgup1 == 1:

        wrdup = “急増・急減している期間があった。

        flgup = 0

        flgdwn = 0

    if flgup == 1:            

        if flgdwn == 1:

            wrdup = “急増している期間があり、

        else:

            wrdup = “急増している期間があった。

    if flgdwn == 1:

        wrddwn = “急減している期間があった。

    # 結合

    flg = 0

    if flgyoko == 1:flg = 1

    if flgup == 1:flg = 1

    if flgup1 == 1:flg = 1

    if flgdwn == 1:flg = 1

    if flg == 1:

        wrd = wrd + “また、” + wrd5 + wrdup + wrddwn

    # 1期間を除き横這い

    bn0 = nyken_list[0]

    k = 0

    for n1,nn1 in enumerate(nyken_list): 

        if n1 > 0:

            if nyken_list[n1] !=  bn0:     # 横這いでなくなれば

                bpy = py_list[n1]

                k = k + 1

    if k == 1:

        wrd = wrd0 + bpy + “年を除き全期間で横這いとなっている。

    # 1期間を除きほぼ横這い

    if nkenmax < 15:

        if nkmid > (nnen-5):

            bn0 = nkenmid

            k = 0

            for n1,nn1 in enumerate(nyken_list): 

                if abs(nn1 – bn0) > 1:

                    if abs(pken_list[n1] –  bn0) >= 7:    # 横這い以上

                        bpy = py_list[n1]

                        k = k + 1

            if k == 1:

                wrd = wrd0 + bpy + “年を除き全期間でほぼ横這いとなっている。

    # 最大件数nkenmaxが少ない場合

    if nkenmax < 10:

        udmaxmin = 0

        for n1,nn1 in enumerate(testud_list): 

            if abs(nn1) > udmaxmin:

                udmaxmin = abs(nn1)

        #print(‘増減率の変動量=’,udmaxmin)

        if udmaxmin > 4:    # 増減率の変動が大ならば

            print(‘増減率の変動量=’,udmaxmin)

            wrd = wrd0 + “全期間で発行件数は少ないが、増減している。

        # 増減件数の変動が小ならばほぼ横這い

        udmaxmin = 0

        for n1,nn1 in enumerate(nyken_list): 

            if abs(nn1) > udmaxmin:

                udmaxmin = abs(nn1)

        if udmaxmin <= 3:    # 増減件数の変動が小ならば

            print(‘増減件数の変動量=’,udmaxmin)

            wrd = wrd0 + “全期間で発行件数が少ないため、増減件数も少なかった。

    # 最終年近傍を評価

    wrd = ‘ ‘ + wrd + ‘\n 

    print(‘増減率=’,testud_list)

    #print(testud_list[nnen-3],testud_list[nnen-2])

    print(‘pken_list=’,pken_list)

    a =((pken_list[nnen-2]-pken_list[nnen-3])/2)    # 左側の増減値の中央値

    b =((pken_list[nnen-1]-pken_list[nnen-2])/2)    # 右側の増減値の中央値

    #print(a+b)    # a点とb点を結ぶ直線y=ax+bの傾斜係数aと同等

    kupdwn = ((pken_list[nnen-2]-pken_list[nnen-3])/2) + ((pken_list[nnen-1]-pken_list[nnen-2])/2)

    print(‘傾斜係数=’,kupdwn)

    flg = 0

    lastwrd = “”

    # 横這い判定

    if abs(kupdwn) < 0.4:

        if abs(testud_list[nnen-2]) <= 1:  

            if abs(testud_list[nnen-3]) <= 1:  

                lastwrd = “最終年近傍は横這い傾向である。

                flg = 1

    #弱い増加判定

    if kupdwn >= 0.4:    # 弱い右上がりで

        lastwrd = “最終年近傍は増加傾向を示していた。

        if testud_list[nnen-3] >= 0:    # かつ左が減少ではなく

            if testud_list[nnen-3] <= 2:    # かつ左の増加が微増(+2まで)ならば

                lastwrd = “最終年近傍は弱い増加傾向を示していた。

                flg = 1

        if testud_list[nnen-3] < 0:    # かつ左が減少で

            if testud_list[nnen-3] > -2:    # かつ左が-2以上で

                if testud_list[nnen-2] >= 1:    # かつ右が横這い以上に増加していれば

                    lastwrd = “最終年近傍は弱い増加傾向を示していた。

                    flg = 1

    #増加判定

    if kupdwn >= 0.7:    # 右上がりで

        if testud_list[nnen-2] >= -2:    # かつ右の減少が緩やか(-2)であれば

            lastwrd = “最終年近傍は増加傾向である。

            flg = 1

        if testud_list[nnen-2] >= 0:    # かつ右が増加であれば

            lastwrd = “最終年近傍は増加傾向である。

            flg = 1   

    #急増判定

    if kupdwn >= 3:    # 強い右上がりで

        if testud_list[nnen-2] >= 2:    # かつ右も強い増加(+2)であれば

            lastwrd = “最終年近傍は強い増加傾向を示していた。

            flg = 1

    #弱い減少判定

    if kupdwn <= -0.4:    # 弱い右下がりで

        lastwrd = “最終年近傍は減少傾向を示していた。

        if testud_list[nnen-3] <= 0:    # かつ左が増加ではなく

            if testud_list[nnen-3] >= -1:    # かつ左の増加が微減(-1)ならば

                lastwrd = “最終年近傍は弱い減少傾向を示していた。”    

                flg = 1

        if testud_list[nnen-3] > 0:    # かつ左が増加で

            if testud_list[nnen-3] < 2:    # かつ左が+2以下で

                if testud_list[nnen-2] >= -1:    # かつ右が横這い以上に減少していれば

                    lastwrd = “最終年近傍は弱い減少傾向を示していた。”    

                    flg = 1

    #減少判定

    if kupdwn <= -0.7:    # 右下がりで

        if testud_list[nnen-2] <= 2:    # かつ右の増加が緩やか(+2)であれば

            lastwrd = “最終年近傍は減少傾向である。

            #print(testud_list[nnen-2], ‘<=’, 2)

            flg = 1

        if testud_list[nnen-2] <= 0:    # かつ右が減少であれば

            lastwrd = “最終年近傍は減少傾向である。

            flg = 1          

    #急減判定

    if kupdwn <= -3:    # 強い右下がりで

        if testud_list[nnen-2] <= -2:    # 右も強い減少(-2)であれば

            lastwrd = “最終年近傍は強い減少傾向を示していた。

            flg = 1            

    # 増減判定

    if flg == 0:

        if testud_list[nnen-3] > 0:    # 増加

            if testud_list[nnen-2] < 0:    # 減少

                lastwrd = “最終年近傍は増減(増加し減少)していた。

        if testud_list[nnen-3] < 0:    # 減少

            if testud_list[nnen-2] > 0:    # 増加

                lastwrd = “最終年近傍は増減(減少し増加)していた。

    # 年単位のmax件数が20件以下を再判定            

    if nkenmax <= 20:

        print(‘年単位のmax件数=’,nkenmax)

        flg = 0

        # 横這い判定

        if abs(kupdwn) <= 2:

            if abs(testud_list[nnen-2]) <= 5:  

                if abs(testud_list[nnen-3]) <= 5:  

                    lastwrd = “発行件数が少なく、最終年近傍は横這い傾向である。

                    flg = 1

        if abs(nyken_list[nnen-1] – nyken_list[nnen-2]) <= 1:    # 右の変化が1以内でかつ  

            if abs(nyken_list[nnen-2] – nyken_list[nnen-3]) <= 1:    # 左の変化が1以内でかつ

                if abs(nyken_list[nnen-1] – nyken_list[nnen-3]) <= 1:    # 左右の差異が1以内ならば

                    lastwrd = “発行件数が少なく、最終年近傍は横這い傾向である。

                    flg = 2   

        if flg > 0: print(‘lastwrd=’,lastwrd,flg)

        #増加判定

        if flg != 2:

            if kupdwn >= 0.7:    # 右上がりで

                if testud_list[nnen-2] > 5:  

                    lastwrd = “発行件数は少ないが、最終年近傍では増加傾向である。

                    flg = 1

                if testud_list[nnen-3] > 5:  

                    lastwrd = “発行件数は少ないが、最終年近傍では増加傾向である。

                    flg = 1

            if (testud_list[nnen-3] + testud_list[nnen-2]) > 2:

                lastwrd = “発行件数は少ないが、最終年近傍では増加傾向である。

            lastwrd = lastwrd.replace(“最終年近傍は強い増加傾向“,”発行件数は少ないが、最終年近傍は増加傾向“)

        #減少判定

        if flg != 2:

            if kupdwn <= -0.7:

                if testud_list[nnen-2] < -5:

                    lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。

                    flg = 1

                if testud_list[nnen-3] < -5:      

                    lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。

                    flg = 1

            if (testud_list[nnen-3] + testud_list[nnen-2]) < -2:

                lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。

            lastwrd = lastwrd.replace(“最終年近傍は強い減少傾向“,”発行件数は少ないが、最終年近傍は減少傾向“)

        # 増減判定

        if abs(nyken_list[nnen-1] – nyken_list[nnen-2]) > 1:  flg = 3  # 右の変化が1を越えていれば  

        if abs(nyken_list[nnen-2] – nyken_list[nnen-3]) > 1:  flg = 3  # 左の変化が1を越えていれば 

        if flg == 3:

            if testud_list[nnen-3] > 0:    # 増加

                if testud_list[nnen-2] < 0:    # 減少                

                    lastwrd = “発行件数は少ないが、最終年近傍では増減(増加し減少)していた。

            if testud_list[nnen-3] < 0:    # 減少

                if testud_list[nnen-2] > 0:    # 増加                 

                    lastwrd = “発行件数は少ないが、最終年近傍では増減(減少し増加)していた。

        #print(‘lastwrd=’,lastwrd) 

        if nkenmax <= 3:    # 件数が極めて少数ならば

            lastwrd = “発行件数が少なく、かつ最終年近傍の増減も少ないので、最終年近傍も横這い傾向である。

            flg = 2

            # 最終年近傍で増加

            if (nyken_list[nnen-1] – nyken_list[nnen-2]) >= 2:    # 最終年が強く増加していれば

                lastwrd = “発行件数は少ないが、最終年近傍では増加傾向を示していた。”   

            if testud_list[nnen-3] > 0:

                if testud_list[nnen-2] > 0:

                    lastwrd = “発行件数は少ないが、最終年近傍では増加傾向を示していた。”             

            if testud_list[nnen-3] > 0:

                if testud_list[nnen-2] > 0:

                    lastwrd = “発行件数は少ないが、最終年近傍では増加傾向を示していた。

            if (nyken_list[nnen-2] – nyken_list[nnen-3]) == 2:

                if testud_list[nnen-2] == 0:

                    lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。

            if testud_list[nnen-3] == 0:

                if (nyken_list[nnen-1] – nyken_list[nnen-2]) == 2:                

                    lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”      

            # 最終年近傍で減少

            if (nyken_list[nnen-1] – nyken_list[nnen-2]) <= -2:    # 最終年が強く減少していれば

                lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”  

            if testud_list[nnen-3] < 0:

                if testud_list[nnen-2] < 0:

                    lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”         

            if testud_list[nnen-3] < 0:

                if testud_list[nnen-2] < 0:

                    lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”    

            if (nyken_list[nnen-3] – nyken_list[nnen-2]) == 2:

                if testud_list[nnen-2] == 0:

                    lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。

            if testud_list[nnen-3] == 0:

                if (nyken_list[nnen-2] – nyken_list[nnen-1]) == 2:                

                    lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”      

            # 最終年近傍では増減

            if abs(nyken_list[nnen-1] – nyken_list[nnen-2]) > 1:    # 最終年の変化が1以上ならば  

                if testud_list[nnen-3] > 0:    # 増加

                    if testud_list[nnen-2] < 0:    # 減少                

                        lastwrd = “発行件数は少ないが、最終年近傍では増減(増加し減少)していた。

                if testud_list[nnen-3] < 0:    # 減少

                    if testud_list[nnen-2] > 0:    # 増加                 

                        lastwrd = “発行件数は少ないが、最終年近傍では増減(減少し増加)していた。”           

    # wrd lastwrdを追加

    wrd = wrd + lastwrd   

    wrd = wrd.replace(”  “,” “)

#    print(wrd)

    return(wrd)

# テスト(def 棒グラフのコメントを作成)

import pandas as pd

import numpy as np

import openpyxl

import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams[‘font.family’] = ‘MS PGothic’

import matplotlib.patches as patches

import csv

import copy

# 年データlist2と元の件数データlist3を設定

list2= [‘2011’, ‘2012’, ‘2013’, ‘2014’, ‘2015’, ‘2016’, ‘2017’, ‘2018’, ‘2019’, ‘2020’]

list3= [2, 5, 6, 6, 14, 52, 169, 216, 274, 254]

# 最終月数monthendを設定

monthend=7

monthend=12

# 追加補正係数nmend

npmend=12/int(monthend) – 1

print(‘追加補正係数=’,npmend)

# 追加件数を算出

nenlast = len(list3)

list4 = []    # 追加件数

list5 = []    # 合計件数

for n1,nn in enumerate(list3):

    if (n1+1) == nenlast:

        nn2 = nn*npmend

        nn2 = round(nn2)

        list4.append(nn2)

        list5.append(nn+nn2)

    else:

        list4.append(0)

        list5.append(nn)

print(‘元の件数=’,list3)

print(‘追加件数=’,list4)

print(‘合計件数=’,list5)

# 合計件数を算出

ntot = 0

for nn1 in list5:

    ntot = ntot + nn1

print(‘合計件数=’,ntot)

# 描画データ設定

labels = list2

data = list3

data2 = list4

# 表示位置設定

x_width = 0.5

x_loc = np.array(range(len(data))) + x_width

# グラフの大きさを設定

fig = plt.figure(figsize=(13.0, 4.0))

# タイトル、ラベルを設定

plt.title(“公報発行件数の年別推移“, fontsize=20)

plt.xlabel(“発行年“, fontsize=18)

plt.ylabel(“発行件数“, fontsize=18)

plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘)    # 棒グラフの設定

if npmend > 0:    # 追加補正係数>0ならば予想件数を表示

    plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘)    # 棒グラフの設定

plt.xticks(x_loc, labels, fontsize=14)                          # x軸にラベル設定

plt.grid()                                                  # 罫線追加

# 追加補正係数>0ならば予想件数を表示

if npmend > 0:

    plt.legend()

# 棒グラフ内に数値を書く

hx = (ntot/len(data))/30    # 書き込み位置を上に修正

for x, y in zip(x_loc, data):

    plt.text(x, y+hx, y, ha=’center’, va=’bottom’)    # 数値の書き込み位置をhx上に修正

# 描画実行

plt.show()

# def実行

wrd = bargraph_comment(list2,list5)

print(”)

print(‘wrd=’,wrd)

# defタイトルまとめ

## 「発明の名称」のリストから特徴のない語句や重複語句を削除し、リストとしてreturnする。

def titlematome(title_data):

    titlewrd_list0 =[]

    for n1, str1 in enumerate(title_data):    

        str1 = “” + str1 + “

        # 置換1(変換表による置換)

        for n2, str2 in enumerate(hwrd1):

            str3 = hwrd2[n2]

            str1 = str1.replace(str2, str3)

        # 置換2(置換1の後で置換)

        str1 = str1.replace(‘処理方法‘, ‘処理装置‘)

        str1 = str1.replace(‘処理プログラム、‘, ‘処理装置‘)

        str1 = str1.replace(‘記憶した記憶‘, ‘記憶‘)

        str1 = str1.replace(‘記録した記録‘, ‘記録‘)

        str1 = str1.replace(‘記録した記憶‘, ‘記憶‘)

        str1 = str1.replace(‘治療する‘, ‘治療、‘)

        str1 = str1.replace(‘等や‘, ‘等、‘)

        str1 = str1.replace(‘がブロッキング‘, ‘ブロッキング‘)

        str1 = str1.replace(‘‘, ‘‘)

        str1 = str1.replace(‘―’, ‘‘)

        str1 = str1.replace(‘‘, ‘‘)

        str1 = str1.replace(‘‘, ‘‘)

        str1 = str1.replace(‘‐’, ‘‘)

        str1 = str1.replace(‘‘, ”)

        str1 = str1.replace(‘を、‘, ‘‘) 

        str1 = str1.replace(‘と、‘, ‘‘) 

        # 類似語句を統合

        str1 = str1.replace(‘制御プログラム‘, ‘制御‘)

        str1 = str1.replace(‘制御システム‘, ‘制御‘)

        str1 = str1.replace(‘制御装置‘, ‘制御‘)

        str1 = str1.replace(‘制御方法‘, ‘制御‘)

        str1 = str1.replace(‘管理プログラム‘, ‘管理‘)

        str1 = str1.replace(‘管理システム‘, ‘管理‘)

        str1 = str1.replace(‘管理装置‘, ‘管理‘)

        str1 = str1.replace(‘管理方法‘, ‘管理‘)        

        # 単独の、システム、プログラム、装置、方法を削除

        str1 = str1.replace(‘、システム、‘, ‘‘)

        str1 = str1.replace(‘、プログラム、‘, ‘‘)

        str1 = str1.replace(‘、制御装置、‘, ‘‘)

        str1 = str1.replace(‘、制御方法、‘, ‘‘)

        str1 = str1.replace(‘、制御プログラム、‘, ‘‘)

        str1 = str1.replace(‘、制御、‘, ‘‘)

        str1 = str1.replace(‘、情報処理装置、‘, ‘‘)

        str1 = str1.replace(‘、情報処理システム、‘, ‘‘)

        str1 = str1.replace(‘、装置、‘, ‘‘)

        str1 = str1.replace(‘、方法、‘, ‘‘)

        str1 = str1.replace(‘、使用、‘, ‘‘)

        # 追加修正

        str1 = str1.replace(‘取得方法、取得装置‘, ‘取得方法‘)

        str1 = str1.replace(‘可能な‘, ‘可能、‘)

        str1 = str1.replace(‘‘, ‘‘)

        str1 = str1.replace(‘‘, ‘‘)

        str1 = str1.replace(‘、並び‘, ‘‘)

        str1 = str1.replace(‘、該‘,’‘)

        str1 = str1.replace(‘、成る‘,’‘)

        # 装置、方法、システム、プログラムの前が同一文ならばシステムかプログラムに統合

        str1_list = str1.split(‘‘)    # 分割

        k = 0

        flg = 0

        bstr = ”

        bstr1 = ”

        for str3 in str1_list:

            npos = 0

            if ‘装置‘ in str3: 

                npos = str3.find(‘装置‘)

            else:

                if ‘方法‘ in str3: 

                    npos = str3.find(‘方法‘)

                else:

                    if ‘システム‘ in str3: 

                        npos = str3.find(‘システム‘)

                        flg = 1

                        bstr = str3[0:npos]

                    else:

                        if ‘プログラム‘ in str3: 

                            npos = str3.find(‘プログラム‘)

                            flg = 2

                            bstr = str3[0:npos]

            if bstr1 != ”:

                if str3[0:npos] == bstr1: k = k + 1                

            bstr1 = str3[0:npos]

        if k > 0:

            if flg == 1:

                str1 = bstr + ‘システム‘    # システムに統合

            if flg == 2:

                str1 = bstr + ‘プログラム‘    # プログラムに統合

        str1 = str1.replace(‘、方法、‘, ‘‘)

        str1 = str1.replace(‘、装置、‘, ‘‘)

        str1 = str1.replace(‘、本方法、‘, ‘‘)

        str1 = str1.replace(‘、本装置、‘, ‘‘)

        str1 = str1.replace(‘、当方法、‘, ‘‘)

        str1 = str1.replace(‘、当装置、‘, ‘‘)

        str1 = str1.replace(‘、適用、‘, ‘‘)

        # 重複している「、、、」を「、」に置換

        str1 = str1.replace(‘、、‘, ‘‘)    # 「、、」を「、」に置換

        str1 = str1.replace(‘、、‘, ‘‘)    # 「、、」を「、」に置換

        str1 = str1.replace(‘、、‘, ‘‘)    # 「、、」を「、」に置換

        # 先頭と末尾の「、」を削除

        if str1[0] == ‘‘: str1 = str1[1:]    # 先頭の「、」を削除   

        np = len(str1) – 1

        if np > 0:

            if str1[np] == ‘‘:                             # 末尾の「、」を削除            

                str1 = str1[0:np]       

        np = len(str1) – 1

        titlewrd_list0.append(str1)

    # 「方法、」、「装置、」、「システム、」、「プログラム、」を消去

    titlewrd_list1 = []

    for n1, str1 in enumerate(titlewrd_list0):

        str1 = str1 + ‘

        str1 = str1.replace(‘方法、‘, ‘‘)

        str1 = str1.replace(‘装置、‘, ‘‘)

        str1 = str1.replace(‘システム、‘, ‘‘)

        str1 = str1.replace(‘プログラム、‘, ‘‘)

        titlewrd_list1.append(str1)

    # 重複語句を削除

    titlewrd_list = []

    for n1, str1 in enumerate(titlewrd_list1):

        str2 = str1.split(‘‘)    # 分割

        bstr2 = str2[0]

        for str3 in str2:

            if str3 not in bstr2:

                bstr2 = bstr2 + ‘‘ + str3

        if bstr2 != ”:

            print(n1,bstr2)

            titlewrd_list.append(bstr2)

    return(titlewrd_list)  

# テスト(発明の名称からKWを抽出)

import pandas as pd

# 語句変換表読み込み

word_data0 = pd.read_excel(‘語句変換表.xlsx’,sheet_name=’変換表‘)     # Excelデータ読み込み

word_data0 = word_data0.dropna(how=’all’)    # 全列がNaNである行を削除

print(‘変換語句数=’,len(word_data0))

word_data1 = word_data0.iloc[:,0]

hwrd1 = []

for str1 in word_data1:

    hwrd1.append(str1)

print(‘元の語句=’,hwrd1[0:5])

word_data2 = word_data0.iloc[:,1]

hwrd2 = []

for str1 in word_data2:

    hwrd2.append(str1)

print(‘修正した語句=’,hwrd2[0:5])

# 公報データ読み込み

pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’utf-8′)                   # csvデータ読み込み

print(‘公報データ=’,len(pat_data))

# 発明の名称読み込み(100文字/件までに制限)

title_data = pat_data.iloc[:,3]

titlewrd_list0 =[]

for n1, str1 in enumerate(title_data):    

    if n1 == 1500: break

    if n1 >= 1400:

        if len(str1) > 100: str1 = str1[0:100] + “・・・”    # 100文字/件までに制限

        print(‘No=’,n1,str1)

        titlewrd_list0.append(str1)

print(‘ ‘)

print(‘処理結果‘)

# def実行

titlewrd_list = titlematome(titlewrd_list0)

# print(titlewrd_list)

title_wrd = ”

for str1 in titlewrd_list:                    

    if str1 not in title_wrd:

        title_wrd = title_wrd + ‘‘ + str1

# コメント追加

wrd1 = ‘ これらのサンプル公報の「発明の名称」には、

wrd2 = title_wrd

wrd3 = ‘などの語句が含まれていた。\n’

wrd = wrd1 + wrd2 + wrd3

print(wrd)

# 公報にコードを付与

# コードの1桁目はサブテーマとし、2桁目以下はIPCを集計・分析してコード化する。

# スクリブト1 公報データを読み込み、リスト化

## 件数が少ないときは「分析公報data.xlsx」に公報データをコピーし、Excel用の「公報データ読み込み」を有効にする。

## 件数が多すぎてExcelで処理できない時には、「分析公報data.csv」に公報データをコピーし、csv用の「公報データ読み込み」を有効にする。

import pandas as pd

import numpy as np

import collections

import openpyxl

# import codecs

print(”)

print(‘出力サンプル‘)

# 公報データ読み込み

try:

    pat_data = pd.read_csv(‘分析公報data.csv’, engine =’python’)                   # csv

except UnicodeDecodeError as e:

    pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’shift_jis’)                   # csv        

# pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’utf-8′)                   # csv

pat_data = pat_data.dropna(how=’all’)    # 全列がNaNである行を削除

print(‘対象公報件数=’,len(pat_data))

# クラスタ化する最小件数を設定

min_clst = len(pat_data) * 0.05

print(‘一次クラスタ化する最小件数=’,min_clst)

## 公報データ読み込み ##

# 公報番号欄読み込み

patno_data = pat_data.iloc[:,0]

pn_list =[]

for str1 in patno_data:

    str0 = str1

    pn_list.append(str(str0))

# 出願番号読み込み

apno_data = pat_data.iloc[:,1]

an_list =[]

for str1 in apno_data:

    str0 = str1

    an_list.append(str(str0))

# 発行日読み込み

pd_data = pat_data.iloc[:,2]

pd_list =[]

for str1 in pd_data:

    if “発行” not in str(str1):

        str0 = str(str1)[0:10]

        pd_list.append(str(str0))

# 発明の名称欄読み込み

title_data = pat_data.iloc[:,3]

ti_list =[]

for str1 in title_data:

    str0 = str1

    ti_list.append(str(str0))

# 出願人名称読み込み

apname_data = pat_data.iloc[:,4]

ap_list =[]

for str1 in apname_data:

    str0 = str1

    ap_list.append(str(str0))

# 発明者読み込み

name_data = pat_data.iloc[:,5]

name_list =[]

for str1 in name_data:

    str0 = str(str1)

    name_list.append(str0)

# IPC読み込み

ipc_data = pat_data.iloc[:,6]

ipc_list =[]

for str1 in ipc_data:

    str0 = str(str1) + ‘;’

    ipc_list.append(str0)

# FI読み込み

fi_data = pat_data.iloc[:,7]

fi_list =[]

for str1 in fi_data:

    str1 = str(str1)

    if len(str1) > 3:

        #データ中の空白を削除

        str1 = (str1.replace(‘        ‘, ‘,’))    # 空白を「,」に置換

        str1 = (str1.replace(‘    ‘, ‘,’))    # 空白を「,」に置換

        str1 = (str1.replace(‘   ‘, ‘,’))    # 空白を「,」に置換

        str1 = (str1.replace(‘   ‘, ‘,’))    # 空白を「,」に置換

        str1 = (str1.replace(‘   ‘, ‘,’))    # 空白を「,」に置換

        str1 = (str1.replace(‘  ‘, ‘,’))    # ,,」を「,」に置換

        str1 = (str1.replace(‘,,’, ‘,’))    # ,,」を「,」に置換        

        str1 = (str1.replace(“ “, “”))    # 全角空白を削除

        str1 = (str1.replace(” “, “”))    # 半角空白を削除

        str1 = (str1.replace(” “, “”))    # 全角空白を削除

        str0 = str(str1) + ‘;’

        fi_list.append(str0)

    else:

        fi_list.append(‘分類無し‘)

# Fターム読み込み

ft_data = pat_data.iloc[:,8]

ft_list =[]

for str1 in ft_data:

    str1 = str(str1)

    if len(str1) > 3:

        #データ中の空白を削除

        str1 = (str1.replace(” “, “”))    # 半角空白を削除

        str1 = (str1.replace(“ “, “”))    # 全角空白を削除

        str0 = str(str1)    

        ft_list.append(str0)

    else:

        ft_list.append(‘分類無し‘)        

# 要約読み込み

abst_data = pat_data.iloc[:,9]    # 分類コードが無い場合

abst_list =[]

for str1 in abst_data:

    str1 = str(str1)

    if len(str1) > 3:

        #データ中の空白を削除

        str1 = (str1.replace(” “, “”))    # 半角空白を削除

        str1 = (str1.replace(“ “, “”))    # 全角空白を削除

        str1 = (str1.replace(“,”, “”))    # ,」を「、」に置換

        abst_list.append(str1)

    else:

        abst_list.append(‘要約無し‘)

# スクリブト公報データの特許分類を修正

## 変更があったIPCFIの分類を代表となる一つの分類に変更する。

### (:情報検索:G06F17/30を新G06F16/00に変更)

print(”)

print(‘出力サンプル‘)

# 分類修正表読み込み

# IPC読み込み

shusei_data01 = pd.read_excel(‘修正分類表.xlsx’,sheet_name=’IPC’) 

# 元のIPC欄読み込み

moto_ipc = shusei_data01.iloc[:,0]

motoipc_list = []

for str1 in moto_ipc:

    if ‘ ‘ in str1: str1 = str1.replace(‘ ‘,”)

    str1 = str1 + ‘;’

    motoipc_list.append(str1)

print(‘元のIPC=’,motoipc_list)

# 修正後のIPC欄読み込み

shusei_ipc = shusei_data01.iloc[:,1]

shuseiipc_list = []

for str1 in shusei_ipc:

    str1 = str1 + ‘;’

    shuseiipc_list.append(str1)

print(‘修正後のIPC=’,shuseiipc_list)

# IPC修正

ipc_list02 =[]

for str1 in ipc_list:

    if str1[-1] != ‘;’:    # 末尾が ‘;’でなければ末尾を追加

        str1 = str1 + ‘;’

    for n1, str2 in enumerate(motoipc_list):

        if str2[-1] != ‘;’:    # 末尾が ‘;’でなければ末尾を追加        

            str2 = str2 + ‘;’

        if str2 in str1:            

            str3 = shuseiipc_list[n1]

            if str3 in str1:

                str1 = str1.replace(str2,”)

            else:

                str1 = str1.replace(str2,str3)

    if str1[-1] == ‘;’:    # 末尾が ‘;’ならば末尾を除去

        np = len(str1)

        str1 = str1[0:np-1]                

    ipc_list02.append(str1)

print(‘IPC[0:3] =’,ipc_list02[0:3])

# FI読み込み

shusei_data02 = pd.read_excel(‘修正分類表.xlsx’,sheet_name=’FI’) 

# 元のFI欄読み込み

moto_fi = shusei_data02.iloc[:,0]

motofi_list = []

for str1 in moto_fi:

    str1 = str1 + ‘;’

    motofi_list.append(str1)

print(‘元のFI=’,motofi_list)

# 修正後のFI欄読み込み

shusei_fi = shusei_data02.iloc[:,1]

shuseifi_list = []

for str1 in shusei_fi:

    str1 = str1 + ‘;’

    shuseifi_list.append(str1)

print(‘修正後のFI=’,shuseifi_list)

# FI修正

fi_list02 =[]

for str1 in fi_list:

    if str1[-1] != ‘;’:    # 末尾が ‘;’でなければ末尾を追加

        str1 = str1 + ‘;’

    for n1, str2 in enumerate(motofi_list):

        if str2[-1] != ‘;’:    # 末尾が ‘;’でなければ末尾を追加

            str2 = str2 + ‘;’

        if str2 in str1:            

            str3 = shuseifi_list[n1]

            if str3 in str1:

                str1 = str1.replace(str2,”)

            else:

                str1 = str1.replace(str2,str3)

    if str1[-1] == ‘;’:    # 末尾が ‘;’ならば末尾を除去

        np = len(str1)

        str1 = str1[0:np-1]

    fi_list02.append(str1)

# DataFrame

df01 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])

df02 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])

df03 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])

df04 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])

df05 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])

df06 = pd.DataFrame(data=name_list, columns=[‘発明者‘])

df07 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])

df08 = pd.DataFrame(data=fi_list02, columns=[‘FI‘])

df09 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])

df10 = pd.DataFrame(data=abst_list, columns=[‘要約‘])

# 結合

df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df10], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/new_patlist.csv’,encoding=’utf-8′, index=False)

# スクリブト3 IPCクラス別出現頻度を集計

print(”)

print(‘出力サンプル‘)

# IPC欄読み込み

ipc_data = pat_data.iloc[:,6]

df07 = pd.DataFrame(data=ipc_data)

# 分割してリスト化

ipc_list01 = []

for str1 in ipc_data:

    list1_split = str1.split(‘;’)    # ;」で分割  

    ipc_list01.append(list1_split)        

# 公報データを分割し、クラスに修正

class_list = []

for str1 in ipc_data:

    ipc_split = str1.split(‘;’)    # 分割

    list1 = []

    for str2 in ipc_split:    # 展開し、クラスに修正

        str2 = str2[0:3]

        list1.append(str2)

    class_list.append(list1)

print(‘class_list[0:3]=’,class_list[0:3])

# [[]][]に変換

list2 = []

for str1 in class_list:

    list2=list2 + str1

# IPC別に集計

ct_ipc = collections.Counter(list2)

ipc_n = list(ct_ipc.items())  # keyvalueをリストに格納

ipc_n_list = []

ipc_list = []

for str1 in ipc_n:

    str2 = list(str1)

    ipc_n_list.append(str2)

    class_list.append(str2[0])

# 出現頻度の高い順にソート

ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)

# IPC3(クラス)別の集計表(クラス集計表)を作成

ipc_list3 = []

hindo_list3 = []

for n,str1 in enumerate(ipc_n_list):

    ipc_list3.append(str1[0])

    hindo_list3.append(str1[1])

print(‘クラス数=’,len(ipc_list3))

# DataFrame

df1 = pd.DataFrame(data=ipc_list3,columns=[‘クラス‘])

df2 = pd.DataFrame(data=hindo_list3,columns=[‘出現頻度‘])

# 集計表にまとめる

df20=pd.concat([df1, df2], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/class_hindo.csv’,encoding=’utf-8′, index=False)

print(‘class_hindo.csvを書き出しました‘)

# スクリブトコアクラスに1桁コードを付与

## 出現頻度がmin_clst以上のクラスをコアクラスとして1桁コードを付与する。

print(”)

print(‘出力サンプル‘)

# min_clst以上のクラスを読み込み

coreclass_list = []

for n1, nhindo in enumerate(hindo_list3):

    if nhindo > min_clst:

        bclass = ipc_list3[n1]

        coreclass_list.append(bclass)

print(‘コアクラス数=’,len(coreclass_list))

print(‘コアクラス=’,coreclass_list)

# コアクラスに1桁コードを付与

classcode_list = []

n_chr =64

for str1 in coreclass_list:

    n_chr = n_chr + 1

    str1 = chr(n_chr)

    classcode_list.append(str1)

print(‘クラスコード=’,classcode_list)

# クラスデータ読み込み

pat_data2 = pd.read_excel(‘IPC分類表.xlsx’, sheet_name=’クラス表‘)

print(‘クラス数=’,len(pat_data2))

# クラスコード読み込み

cl_data1 = pat_data2.iloc[:,1]

cl_list =[]

for str1 in cl_data1:

    cl_list.append(str(str1))    

# クラス内容読み込み

cl_data2 = pat_data2.iloc[:,2]

cltxt_list =[]

for str1 in cl_data2:

    cltxt_list.append(str(str1))

# コード内容付与

codetxt_list = []

for n,str1 in enumerate(coreclass_list):

    # クラス内容付与

    if len(str1) == 3:

        for n1, str2 in enumerate(cl_list):

            if str1 == str2:

                str3 = cltxt_list[n1]

                break                         

        codetxt_list.append(str3)

print(‘クラス内容[0:2]=’,codetxt_list[0:2])

# DataFrame

df1 = pd.DataFrame(data=coreclass_list,columns=[‘特許分類‘])

df2 = pd.DataFrame(data=classcode_list,columns=[‘コード‘])

df3 = pd.DataFrame(data=codetxt_list,columns=[‘コード内容‘])

# 集計表にまとめる

df20=pd.concat([df1, df2, df3], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/class_code.csv’,encoding=’utf-8′, index=False)

print(‘class_code.csvを書き出しました‘)

# スクリブト5 IPCサブクラス別出現頻度を集計

print(”)

print(‘出力サンプル‘)

# IPC欄読み込み

ipc_data = pat_data.iloc[:,6]

df07 = pd.DataFrame(data=ipc_data)

# 分割してリスト化

ipc_list01 = []

for str1 in ipc_data:

    list1_split = str1.split(‘;’)    # ;」で分割  

    ipc_list01.append(list1_split)        

print(‘ipc_list01[0]=’,ipc_list01[0])    # IPCリスト

# 公報データを分割し、サブクラスに修正

subclass_list = []

for str1 in ipc_data:

    ipc_split = str1.split(‘;’)    # 分割

    list1 = []

    for str2 in ipc_split:    # 展開し、サブクラスに修正

        str2 = str2[0:4]

        list1.append(str2)

    subclass_list.append(list1)

print(‘subclass_list[0:3]=’,subclass_list[0:3])

# [[]][]に変換

list2 = []

for str1 in subclass_list:

    list2=list2 + str1

# IPC別に集計

ct_ipc = collections.Counter(list2)

ipc_n = list(ct_ipc.items())  # keyvalueをリストに格納

ipc_n_list = []

ipc_list = []

for str1 in ipc_n:

    str2 = list(str1)

    ipc_n_list.append(str2)

    class_list.append(str2[0])

# 出現頻度の高い順にソート

ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)

# IPC4(サブクラス)別の集計表(クラス集計表)を作成

subcl_list4 = []

hindo_list4 = []

for n,str1 in enumerate(ipc_n_list):

    subcl_list4.append(str1[0])

    hindo_list4.append(str1[1])

print(‘サブクラス数=’,len(subcl_list4))

print(‘サブクラス[0:5]=’,subcl_list4[0:5])

print(‘出現頻度[0:5]=’,hindo_list4[0:5])

# DataFrame

df1 = pd.DataFrame(data=subcl_list4,columns=[‘サブクラス‘])

df2 = pd.DataFrame(data=hindo_list4,columns=[‘出現頻度‘])

# 集計表にまとめる

df20=pd.concat([df1, df2], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/subclass_hindo.csv’,encoding=’utf-8′, index=False)

print(‘subclass_hindo.csvを書き出しました‘)

# min_clst以上のサブクラスをコアサブクラスとして読み込む

coresubclass_list = []

for n1, nhindo in enumerate(hindo_list4):

    if nhindo > min_clst:

        bclass = subcl_list4[n1]

        coresubclass_list.append(bclass)

print(‘コアサブクラス数=’,len(coresubclass_list))

print(‘コアサブクラス=’,coresubclass_list)

# スクリブトコアサブクラス毎に3桁コードを付与

## コアクラス毎に出現頻度がmin_clst/2以上のサブクラスを抽出し、コアサブクラスとして3桁コードを付与

## コアサブクラスが無かったコアクラスがあれば、

## 当該コアクラスの代表として上位1個をコアサブクラスとして3桁コードを追加付与する。

print(”)

print(‘出力サンプル‘)

# コアサブクラス毎に3桁コードを付与

coresubclass_list = []

subclasscode_list = []

Z03class_list = []

Z03code_list = []

for n1, str1 in enumerate(coreclass_list):    # コアクラス毎に    

    classcode = classcode_list[n1]

    ct01 = 0    # コアクラス毎のコード数カウンタ

    # min_clst以上のサブクラス読み込み

    ct3 = 0    # コード値のカウンタ

    flg = 0

    for n2, str2 in enumerate(subcl_list4):    # サブクラス読み込み

        if str2[0:3] == str1:

            if hindo_list4[n2] > min_clst/2:    # min_clst/2より多ければ

                flg = 1

                ct01 = ct01 + 1

                # コアサブクラス追加

                if str2 not in coresubclass_list:

                    coresubclass_list.append(str2)

                # コード追加

                ct3 = ct3 + 1

                if ct3 <= 9: ct3_str = ‘0’ + str(ct3)

                if ct3 >= 10: ct3_str = str(ct3)                

                subclass = classcode + ct3_str

                if subclass not in subclasscode_list:

                    subclasscode_list.append(subclass)

    # コアサブクラスが無かったコアクラスは、そのサブクラスの上位1個にコード付与

    if flg == 0:

        flg = 1

        ct01 = ct01 + 1

        for str3 in subcl_list4:

            if str3[0:3] == str1:

                str4 = str3

                break

        print(‘追加コアサブクラス=’,str4)        

        if str2 not in coresubclass_list:

            coresubclass_list.append(str4)

            ct3 = ct3 + 1

            if ct3 <= 9: ct3_str = ‘0’ + str(ct3)

            if ct3 >= 10: ct3_str = str(ct3)

            subclass = classcode + ct3_str

            if subclass not in subclasscode_list:

                subclasscode_list.append(subclass)

print(‘コアサブクラス=’,coresubclass_list)            

print(‘サブクラスコード=’,subclasscode_list)         

# サブクラスデータ読み込み

pat_data3 = pd.read_excel(‘IPC分類表.xlsx’, sheet_name=’サブクラス表‘)

# print(‘サブクラス数=’,len(pat_data3))

# サブクラスコード読み込み

subc_data01 = pat_data3.iloc[:,1]

subc_list =[]

for str1 in subc_data01:

    subc_list.append(str(str1))  

# print(‘サブクラス=’,subc_list[0:5])

# サブクラス内容読み込み

subc_data02 = pat_data3.iloc[:,2]

subctxt_list =[]

for str1 in subc_data02:

    subctxt_list.append(str(str1))

# print(‘サブクラス内容=’,subctxt_list[0:3])

# コード内容付与

codetxt_list = []

for n,str1 in enumerate(coresubclass_list):

    # クラス内容付与

    if len(str1) == 4:

        for n1, str2 in enumerate(subc_list):

            if str1 == str2:

                str3 = subctxt_list[n1]

                break                         

        codetxt_list.append(str3)

print(‘コード内容[0:2]=’,codetxt_list[0:2])

# DataFrame

df1 = pd.DataFrame(data=coresubclass_list,columns=[‘特許分類‘])

df2 = pd.DataFrame(data=subclasscode_list,columns=[‘コード‘])

df3 = pd.DataFrame(data=codetxt_list,columns=[‘コード内容‘])

# subclasscode集計表にまとめる

df20=pd.concat([df1, df2, df3], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/subclass_code.csv’,encoding=’utf-8′, index=False)

print(‘subclass_code.csvを書き出しました‘)   

# スクリブト7  IPC別出現頻度を集計

print(”)

print(‘出力サンプル‘)

# IPC欄読み込み

ipc_data = pat_data.iloc[:,6]

# 分割してリスト化

ipc_list01 = []

for str1 in ipc_data:

    list1_split = str1.split(‘;’)    # ;」で分割  

    ipc_list01.append(list1_split)        

# 公報データをIPC別に分割

ipc_list = []

for str1 in ipc_data:

    ipc_split = str1.split(‘;’)    # 分割

    list1 = []

    for str2 in ipc_split:    # 展開

        list1.append(str2)

    ipc_list.append(list1)

print(‘IPC_list[0:2]=’,ipc_list[0:2])

# [[]][]に変換

list2 = []

for str1 in ipc_list:

    list2=list2 + str1

# IPC別に集計

ct_ipc = collections.Counter(list2)

ipc_n = list(ct_ipc.items())  # keyvalueをリストに格納

ipc_n_list = []

ipc_list = []

for str1 in ipc_n:

    str2 = list(str1)

    ipc_n_list.append(str2)

    class_list.append(str2[0])

# 出現頻度の高い順にソート

ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)

# IPC全桁別の集計表(IPC全桁集計表)を作成

ipc_list4 = []

hindo_list4 = []

for n,str1 in enumerate(ipc_n_list):

    ipc_list4.append(str1[0])

    hindo_list4.append(str1[1])

print(‘IPC=’,len(ipc_list4))

# DataFrame

df1 = pd.DataFrame(data=ipc_list4,columns=[‘IPC’])

df2 = pd.DataFrame(data=hindo_list4,columns=[‘出現頻度‘])

# 集計表にまとめる

df20=pd.concat([df1, df2], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/IPC_hindo.csv’,encoding=’utf-8′, index=False)

print(‘IPC_hindo.csvを書き出しました‘)

# スクリブトコアIPC毎に4桁コードを付与

## コアサブクラス毎に出現頻度がmin_clst以上のIPCを抽出し、コアIPCとして4桁コードを付与する。

## コアIPCが無かったコアサブクラスがあれば、

## 当該コアクラスの代表として上位1個をコアIPCとして4桁コードを追加付与する。

print(”)

print(‘出力サンプル‘)

# min_clst以上のIPCをコアIPCとして読み込む

coreipc_list = []

for n1, nhindo in enumerate(hindo_list4):

    if nhindo > min_clst:

        bclass = ipc_list4[n1]

        coreipc_list.append(bclass)

print(‘元コアIPC=’,len(coreipc_list))

print(‘元コアIPC=’,coreipc_list)

# コアIPC毎に4桁コードを付与

coreipc_list01 = []

ipccode_list01 = []

for n1, str1 in enumerate(coresubclass_list):    # コアサブクラス毎に

    subclasscode = subclasscode_list[n1]

    ct01 = 0    # コアクラス毎のコード数カウンタ

    n_chr = 64    # コード値の初期化(chr(65)=’A’)

    # min_clst以上のコアIPC4桁コードを付与

    ct3 = 0    # コード値のカウンタ

    flg = 0

    for n2, str2 in enumerate(ipc_list4):    # IPC読み込み

        if str2[0:4] == str1:

            if hindo_list4[n2] > min_clst:    # min_clstより多ければ

                flg = 1

                ct01 = ct01 + 1

                coreipc_list01.append(str2)

                n_chr = n_chr + 1

                str3 = chr(n_chr)

                bcode = subclasscode + str3

                ipccode_list01.append(bcode)

    # コアIPCが無かったコアサブクラスは、その下位IPCの上位2個にコード付与

    if flg == 0:                       

        flg = 1

        ct01 = ct01 + 1

        ipc2_list = []

        for str3 in ipc_list4:

            if str1 in str3:

                ipc2_list.append(str3)

        str2 = ipc2_list[0]

        if len(ipc2_list) > 1:

            bstr2 = ipc2_list[1]

        else:

            bstr2 = str2

        # print(‘追加コアIPC=’,str2)

        coreipc_list01.append(str2)

        n_chr = n_chr + 1

        str4 = chr(n_chr)

        bipc = subclasscode + str4

        ipccode_list01.append(bipc)

print(‘コアIPC=’,len(coreipc_list01))

print(‘コアIPC=’,coreipc_list01)            

print(‘コアIPCコード=’,ipccode_list01)         

# IPC分類表.csv読み込み

pat_data05 = pd.read_csv(‘allIPC分類表.csv’, encoding=’utf-8′)

# IPC読み込み

ipc_data01 = pat_data05.iloc[:,2]                    

ipc_list01 =[]

for str3 in ipc_data01:

    ipc_list01.append(str(str3))   

# 分類内容読み込み

ipc_data2 = pat_data05.iloc[:,4]                

ipctxt_list01 =[]

for str3 in ipc_data2:

    ipctxt_list01.append(str(str3))     

# コード内容付与/無ければstr1bstr2に変更

coreipc_list02 = []

ipccode_list02 = []

codetxt_list02 = []

for n1, str1 in enumerate(coreipc_list01):

    # コード内容付与

    flg = 0

    for n2, str2 in enumerate(ipc_list01):

        if str1 == str2:

            str3 = ipctxt_list01[n2]

            coreipc_list02.append(coreipc_list01[n1])

            ipccode_list02.append(ipccode_list01[n1])

            codetxt_list02.append(str3)            

            flg = 1

            break    

    if flg == 0:    # 無ければstr1bstr2に変更

        for n2, str2 in enumerate(ipc_list01):

            if bstr2 == str2:

                str3 = ipctxt_list01[n2]

                coreipc_list02.append(coreipc_list01[n1])

                ipccode_list02.append(ipccode_list01[n1])

                codetxt_list02.append(str3)            

                break  

print(‘IPC内容[0:2]=’,codetxt_list02[0:2])

# DataFrame

df1 = pd.DataFrame(data=coreipc_list02,columns=[‘特許分類‘])

df2 = pd.DataFrame(data=ipccode_list02,columns=[‘コード‘])

df3 = pd.DataFrame(data=codetxt_list02,columns=[‘コード内容‘])

# 集計表にまとめる

df20=pd.concat([df1, df2, df3], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/IPC_code.csv’,encoding=’utf-8′, index=False)

print(‘IPC_code.csvを書き出しました‘)   

# スクリブトコアIPCを含むFIの読み込み

print(”)

print(‘出力サンプル‘)

# csvデータ読み込み

ipc_code01 = pd.read_csv(‘./中間data/IPC_code.csv’, encoding=’utf-8′)

# コアIPC読み込み

ipc_data = ipc_code01.iloc[:,0]

# リストに変更

ipc_list01 = ipc_data.values

# 読み込むシート名(AH)を抽出

sheet_name = []

for str1 in ipc_list01:

    str2 = str1[0]

    sheet_name.append(str2)

sheet_name = list(set(sheet_name))    # 重複を削除 

print(‘シート名‘,sheet_name)

# メインコードのipcを含むFIの読み取り

ficode_list =[]

fidot_list = []

fiti_list =[]

for str1 in sheet_name:    # # sheet選択

    # FIコードと分類内容の読み込み

    fi_data = pd.read_excel(‘FI分類表.xlsx’,sheet_name=str1) 

    for str2 in ipc_list01:   # コアIPC読み込み

        # FIデータ読み込み

        ficode_data = fi_data.iloc[:,1]     

        fidot_data = fi_data.iloc[:,2]         

        fiti_data = fi_data.iloc[:,3]   

        for n,str3 in enumerate(ficode_data):

            if str3 == ‘END’: break

            # FIのコードとドットとタイトルの読み込み

            if ‘,’ in str3:

                str4 = str3.split(‘,’)

            else:

                str4 = str3

            if str4[0] == str2:

                ficode_list.append(str3)    # FIコード

                str5 = fidot_data[n]

                if str(str5) == ‘nan’: str5 = ‘空白

                fidot_list.append(str5)    # FIドット

                str6 = fiti_data[n]

                fiti_list.append(str6)    # FIタイトル

# メインコードをFI付きに修正

fi_list1 = []

fi_list2 = []

fi_list3 = []

fi_list4 = []

for n1, str1 in enumerate(ipc_list01):    # コアIPC

    for n2, str2 in enumerate(ficode_list):    # FIコード

        str3 = str2.split(‘,’)

        if str3[0] == str1:            

            fi_list1.append(str1)

            fi_list2.append(str2)

            fi_list3.append(fidot_list[n2])

            fi_list4.append(fiti_list[n2])

print(‘コアIPC[0:4]=’,fi_list1[0:4])

print(‘FIコード[0:4]=’,fi_list2[0:4])

print(‘FIドット[0:4]=’,fi_list3[0:4])

print(‘FIタイトル[0:4]=’,fi_list4[0:4])

# DataFrame

df1 = pd.DataFrame(data=fi_list1,columns=[‘コアIPC’])

df2 = pd.DataFrame(data=fi_list2,columns=[‘特許分類‘])

df3 = pd.DataFrame(data=fi_list3,columns=[‘FIドット‘])

df4 = pd.DataFrame(data=fi_list4,columns=[‘コード内容‘])

# 集計表にまとめる

df20=pd.concat([df1, df2, df3,df4], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/FIデータリスト1.csv’,encoding=’utf-8′, index=False)

print(‘FIデータリスト1.csvを書き出しました‘)   

# スクリブト10 メイングループに対応するFIグループに階層パターンのパターンコードを付与

## メイングループに対応するFIグループの階層パターンを調べ、タイプコードを付与する

### タイプ0 =(nword1=0,nword3=0,nword4=0)   nword1+nword3*2+nword4*4 =0 

### タイプ1 =(nword1=1,nword3=0,nword4=0)   nword1+nword3*2+nword4*4 =1 

### タイプ2 =(nword1=0,nword3=1,nword4=0)   nword1+nword3*2+nword4*4 =2 

### タイプ3 =(nword1=1,nword3=1,nword4=0)   nword1+nword3*2+nword4*4 =3 

### タイプ4 =(nword1=0,nword3=0,nword4=1)   nword1+nword3*2+nword4*4 =4 

### タイプ5 =(nword1=1,nword3=0,nword4=1)   nword1+nword3*2+nword4*4 =5 

### タイプ6 =(nword1=0,nword3=1,nword4=1)   nword1+nword3*2+nword4*4 =6 

### タイプ7 =(nword1=1,nword3=1,nword4=1)   nword1+nword3*2+nword4*4 =7 

print(”)

print(‘出力サンプル‘)

# コアIPC毎に分離

bcode = ”

n0 = len(fi_list1)

bfi_list1 = []

bfi_list2 = []

for n1, str1 in enumerate(fi_list1):      

    if n1 == 0: bcode = str1

    if str1 == bcode: 

        str1 = fi_list1[n1]

        if n1+1< n0:

            str11 = fi_list1[n1+1]

        str2 = fi_list2[n1]

        str3 = fi_list3[n1]

        str4 = fi_list4[n1]    

        bfi_str = str(str1) + ‘;’ + str(str2) + ‘;’ + str(str3) + ‘;’ + str(str4)

        bfi_list2.append(bfi_str)

        if str11 != bcode:    # メインコード毎に分離してリスト化

            if n1+1< n0:

                bcode = fi_list1[n1+1]  

                bfi_list1.append(bfi_list2)

            bfi_list2 = []

    bfi_list1.append(bfi_list2)            

print(‘FIデータ数=’,len(bfi_list1),’‘)   

# 階層パターンを調べ、ドットタイプのコードを付与

nword1 = 0

nword3 = 0

nword4 = 0

main1_list = []

type_list = []  

dot_list = []

bstr2 = ”

for n0, str1 in enumerate(bfi_list1):

    for n1, str2 in enumerate(str1):          

        split_str2 = str2.split(‘;’)

        str21 = split_str2[1]

        bdot = split_str2[2]

        dot_list.append(bdot)

        if n0 == 0:

            if n1 == 0: 

                bstr2 = split_str2[0]

                bficode = split_str2[1]            

        if str2.find(‘,’) > 0:    # ‘,’が含まれていれば

            split_str21 = str21.split(‘,’)          

            str22 = split_str21[1]    # [,]以下を抽出゜

            bcd = str22

            if nword1 == 0:

                if len(bcd) == 1: nword1 = 1

            if nword3 == 0:

                if len(bcd) == 3: nword3 = 1

            if nword4 == 0:

                if len(bcd) == 4: nword4 = 1            

        # タイプを判別

        if split_str2[0] != bstr2:

            if nword1+nword3*2+nword4*4 == 0: dottype = 0

            if nword1+nword3*2+nword4*4 == 1: dottype = 1

            if nword1+nword3*2+nword4*4 == 2: dottype = 2

            if nword1+nword3*2+nword4*4 == 3: dottype = 3

            if nword1+nword3*2+nword4*4 == 4: dottype = 4

            if nword1+nword3*2+nword4*4 == 5: dottype = 5

            if nword1+nword3*2+nword4*4 == 6: dottype = 6        

            if nword1+nword3*2+nword4*4 == 7: dottype = 7   

            # リストに追加

            main1_list.append(bstr2)

            type_list.append(dottype)

            # 次のstr2処理のために初期化

            bstr2 = split_str2[0]    # str2(メインコード)を比較用に保存

            bficode = split_str2[1]    # 表示用に保存

            # ワード数カウンタを初期化

            nword1 = 0

            nword3 = 0

            nword4 = 0

# 最後のstr2の結果を追加

if nword1+nword3*2+nword4*4 == 1: dottype = 1

if nword1+nword3*2+nword4*4 == 2: dottype = 2

if nword1+nword3*2+nword4*4 == 3: dottype = 3

if nword1+nword3*2+nword4*4 == 4: dottype = 4

if nword1+nword3*2+nword4*4 == 5: dottype = 5

if nword1+nword3*2+nword4*4 == 6: dottype = 6        

if nword1+nword3*2+nword4*4 == 7: dottype = 7    

main1_list.append(bstr2)

type_list.append(dottype)

print(‘コアIPCt[0:5]=’,main1_list[0:5])

print(‘type_listt[0:5]=’,type_list[0:5])

print(‘ドット項目数=’,len(dot_list))

print(‘現ドットリストt[0:5]=’,dot_list[0:5])

# FIデータリストにドットタイプを追加

type_list01 = []

for n1, str1 in enumerate(fi_list1):    # コアIPC

    for n2, str2 in enumerate(main1_list):

        if str1 == str2:

            type_list01.append(type_list[n2])

# DataFrame

df1 = pd.DataFrame(data=fi_list1,columns=[‘コアIPC’])

df2 = pd.DataFrame(data=fi_list2,columns=[‘特許分類‘])

df3 = pd.DataFrame(data=fi_list3,columns=[‘FIドット‘])

df4 = pd.DataFrame(data=fi_list4,columns=[‘コード内容‘])

df5 = pd.DataFrame(data=type_list01,columns=[‘ドットタイプ‘])

# 集計表にまとめる

df20=pd.concat([df1, df2, df3,df4,df5], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/FIデータリスト2.csv’,encoding=’utf-8′, index=False)

print(‘FIデータリスト2.csvを書き出しました‘)   

# スクリブト11 FIグループのタイプに応じてグループ毎のFIドット数を修正

print(”)

print(‘出力サンプル‘)

import re

# csvデータ読み込み

fi_code01 = pd.read_csv(‘./中間data/FIデータリスト2.csv’, encoding=’utf-8′)

print(‘FI=’,len(fi_code01),’‘)

# コアIPC読み込み

coreipc_data = fi_code01.iloc[:,0]

# リストに変更

coreipc01 = coreipc_data.values

print(‘coreipc01t[0:5]=’,coreipc01[0:5])

# FI読み込み

fi_data = fi_code01.iloc[:,1]

# リストに変更

fi_list01 = fi_data.values

print(‘fi_list01t[0:4]=’,fi_list01[0:4])

# ドット読み込み

dot_data = fi_code01.iloc[:,2]

# リストに変更

dot_list01 = dot_data.values

print(‘dot_list01t[0:10]=’,dot_list01[0:10])

# コード内容読み込み

code_data = fi_code01.iloc[:,3]

# リストに変更

fitxt_list01 = code_data.values

print(‘fitxt_list01t[0:3]=’,fitxt_list01[0:3])

# ドットタイプ読み込み

dottype_data = fi_code01.iloc[:,4]

# リストに変更

type_list01 = dottype_data.values

print(‘type_list01t[0:10]=’,type_list01[0:10])

# FIドット数を修正

new_dot = ”

coreipc_list = []

ficode_list = []

fidot_list = []

fistr_list = []

nall = 0

bipc = ”

ndot01 = 0

for n1,str1 in enumerate(dot_list01):

    coreipc = coreipc01[n1]

    n_type = type_list01[n1]

    if coreipc != bipc:    # コアIPCが変われば、修正後ドット数ndot=0とする

        ndot = 0    # 修正後トット数を初期化

        fidot_list.append(ndot)

        coreipc_list.append(coreipc01[n1] )

        ficode_list.append(fi_list01[n1] )

        fistr_list.append(fitxt_list01[n1]) 

        if str(str1) != ‘空白‘:

            basedot = len(str1)

        else:

            basedot = 0

        plusdot = 0    # 加算ドット数を初期化         

        nbaselen = len(fi_list01[n1])    # 基本桁数

    else:    # コアIPCが同じならば、

        if str(str1) != ‘空白‘:

            ndot01 = len(str1)

        else:

            ndot01 = 0            

        # ドットタイプにより加算ドット数(plusdot)を変更

        if n_type == 1:

            if str(str1) == ‘空白‘: plusdot = 0    # 途中で空白になれば初期化                

        if n_type == 3:

            if str(str1) == ‘空白‘: 

                plusdot = 0    # 途中で空白になれば初期化        

        if n_type == 6:

            if str(str1) == ‘空白‘: 

                if len(fi_list01[n1]) > len(fi_list01[n1-1]):

                    plusdot = bndot + 1    # 空白でかつ桁数が増加すれば下位とみなす

            if len(fi_list01[n1]) == nbaselen:    # 基本桁数に戻ればplusdot=0とする

                plusdot = 0        

        if n_type == 7:

            if str(str1) == ‘空白‘: 

                if len(fi_list01[n1]) > len(fi_list01[n1-1]):

                    plusdot = bndot + 1    # 空白でかつ桁数が増加すれば下位とみなす

            if len(fi_list01[n1]) < len(fi_list01[n1-1]):    # 桁数が減少すればplusdot=0とする

                plusdot = 0

        # 修正後ドット数を計算

        ndot =  ndot01 – basedot + plusdot    # 最初のドット数を差し引き、plusdotを加算

        # 書き出しデータを追加

        fidot_list.append(ndot)    # 修正後ドット数

        coreipc_list.append(coreipc01[n1] )

        ficode_list.append(fi_list01[n1] )

        fistr_list.append(fitxt_list01[n1]) 

    # プログラム制御用の前データを更新

    bipc = coreipc    # 前行のコアIPC

    bndot = ndot01 # 前行のドット数

# DataFrame

df1 = pd.DataFrame(data=coreipc_list,columns=[‘コアIPC’])

df2 = pd.DataFrame(data=ficode_list,columns=[‘特許分類‘])

df3 = pd.DataFrame(data=fidot_list,columns=[‘FIドット‘])

df4 = pd.DataFrame(data=fistr_list,columns=[‘コード内容‘])

# FIデータリストを作成

df20=pd.concat([df1, df2,df3,df4], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/FIデータリスト3.csv’,encoding=’utf-8′, index=False)

print(‘FIデータリスト3.csvを書き出しました‘)       

# スクリブト12  FI別出現頻度を集計

print(”)

print(‘出力サンプル‘)

# 公報csv読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist.csv’, encoding=’utf-8′)

# FI欄読み込み

fi_data = pat_data.iloc[:,7]

# 分割してリスト化

fi_list01 = []

for str1 in ipc_data:

    list1_split = str1.split(‘;’)    # ;」で分割  

    fi_list01.append(list1_split)        

print(‘FI_list01[0]=’,fi_list01[0])    # FICリスト

# 公報データをFI別に分割

fi_list = []

for str1 in fi_data:

    fi_split = str1.split(‘;’)    # 分割

    list1 = []

    for str2 in fi_split:    # 展開

        list1.append(str2)

    fi_list.append(list1)

print(‘FI_list[0:1]=’,fi_list[0:1])

# [[]][]に変換

list2 = []

for str1 in fi_list:

    list2=list2 + str1

# FI別に集計

ct_fi = collections.Counter(list2)

fi_n = list(ct_fi.items())  # keyvalueをリストに格納

fi_n_list = []

fi_list = []

for str1 in fi_n:

    str2 = list(str1)

    fi_n_list.append(str2)

# 出現頻度の高い順にソート

fi_n_list = sorted(fi_n_list, key=lambda x:x[1], reverse=True)

# FI全桁別の集計表(FI全桁集計表)を作成

fi_list4 = []

hindo_list4 = []

for n,str1 in enumerate(fi_n_list):

    fi_list4.append(str1[0])

    hindo_list4.append(str1[1])

print(‘頻度集計FI=’,len(fi_list4))

# DataFrame

df1 = pd.DataFrame(data=fi_list4,columns=[‘FI’])

df2 = pd.DataFrame(data=hindo_list4,columns=[‘出現頻度‘])

# 集計表にまとめる

df20=pd.concat([df1, df2], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/FI_hindo.csv’,encoding=’utf-8′, index=False)

print(‘FI_hindo.csvを書き出しました‘)

# スクリブト13 公報データで少数のFIを削除

print(”)

print(‘出力サンプル‘)

# 公報csv読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist.csv’, encoding=’utf-8′)

# FI01読み込み

fi_data01 = pat_data.iloc[:,7]                    

fi_list01 =[]

for str1 in fi_data01:

    fi_list01.append(str1)   

# FIcsv読み込み

fi_data = pd.read_csv(‘./中間data/FIデータリスト3.csv’, encoding=’utf-8′)

# coreIPC読み込み

ipc_data02 = fi_data.iloc[:,0]                    

coreipc_list02 =[]

for str1 in ipc_data02:

    coreipc_list02.append(str1)  

print(‘coreipc[0:5]=’,coreipc_list02[0:5])

# FI02読み込み

fi_data02 = fi_data.iloc[:,1]                    

fi_list02 =[]

for str1 in fi_data02:

    fi_list02.append(str1)   

print(‘FI[0:4]=’,fi_list02[0:4])

# FIドット読み込み

fi_data02 = fi_data.iloc[:,2]                    

fidot_list02 =[]

for str1 in fi_data02:

    fidot_list02.append(str1)  

# FI内容読み込み

fi_data02 = fi_data.iloc[:,3]                    

fitxt_list02 =[]

for str1 in fi_data02:

    fitxt_list02.append(str1)  

# FI出現頻度読み込み

fi_data = pd.read_csv(‘./中間data/FI_hindo.csv’, encoding=’utf-8′)    

# FI読み込み

fi_data03 = fi_data.iloc[:,0]                    

fi_list03 =[]

for str1 in fi_data03:

    fi_list03.append(str1) 

# FI数読み込み

nfi_data03 = fi_data.iloc[:,1]                    

nfi_list03 =[]

for str1 in nfi_data03:

    nfi_list03.append(str1)     

# 少数のFIを削除(min_clst/10)/ただしドット数が0は残す

coreipc_list04 = []

fi_list04 = []

fidot_list04 = []

fitxt_list04 = []

for n1,str1 in enumerate(fi_list02):                # FIデータリスト2

    flg = 0

    for str2 in fi_list01:                                        # new_patlist

        if str1 in str2:

            for n3,str3 in enumerate(fi_list03):     # FI_hindo

                if str1 == str3:

                    if fidot_list02[n1] == 0:

                        coreipc_list04.append(coreipc_list02[n1])

                        fi_list04.append(str1)

                        fidot_list04.append(fidot_list02[n1])

                        fitxt_list04.append(fitxt_list02[n1])

                        flg = 1

                    else:

                        if nfi_list03[n3] > min_clst/10:

                            coreipc_list04.append(coreipc_list02[n1])

                            fi_list04.append(str1)

                            fidot_list04.append(fidot_list02[n1])

                            fitxt_list04.append(fitxt_list02[n1])

                            flg = 1

                            break

        if flg == 1: break

# DataFrame

df1 = pd.DataFrame(data=coreipc_list04,columns=[‘コアIPC’])

df2 = pd.DataFrame(data=fi_list04,columns=[‘特許分類‘])

df3 = pd.DataFrame(data=fidot_list04,columns=[‘FIドット数‘])

df4 = pd.DataFrame(data=fitxt_list04,columns=[‘コード内容‘])

# FIデータリストを作成

df20=pd.concat([df1, df2,df3,df4], axis=1)

print(‘FIデータ数=’,len(df20))

# CSVとして書き出し

df20.to_csv(‘./中間data/FIデータリスト4.csv’,encoding=’utf-8′, index=False)

print(‘FIデータリスト4.csvを書き出しました‘)      

# スクリブト14 FIデータリスト4のドット数を修正

## FIを削除後のドット数の増減が連続するように修正する。

# csvデータ読み込み

fi_code01 = pd.read_csv(‘./中間data/FIデータリスト4.csv’, encoding=’utf-8′)

# コアIPC読み込み

coreipc_data = fi_code01.iloc[:,0]

# リストに変更

coreipc_list01 = coreipc_data.values

print(‘コアIPC[0:5]=’,coreipc_list01[0:5])

# FI読み込み

fi_data = fi_code01.iloc[:,1]

# リストに変更

fi_list01 = fi_data.values

print(‘FI[0:4]=’,fi_list01[0:4]) 

# FIドット数読み込み

fidot_data = fi_code01.iloc[:,2]

# リストに変更

fidot_list01 = fidot_data.values

print(‘FIドット数[0:5]=’,fidot_list01[0:5]) 

nbasedot = 0

bipc = ”

bfi = ”

bndot  = 0

nplus = 0

fidot_list04 =[]

for n1, str1 in enumerate(fi_list01):

    str2 = coreipc_list01[n1]

    if str2 != bipc:

        nbasedot = fidot_list01 [n1]

        nplus = 0

        fidot_list01 [n1] = 0

        fidot_list04.append(fidot_list01 [n1])

    else:

        if len(str1) > len(bfi):

            nbasedot = fidot_list01[n1]

            fidot_list01 [n1] = fidot_list01[n1] – nbasedot

            fidot_list04.append(fidot_list01 [n1])

        else:

            if fidot_list01[n1] > nbasedot:

                fidot_list01 [n1] = fidot_list01[n1] – nbasedot

            else:

                fidot_list01 [n1] = 0

            fidot_list04.append(fidot_list01 [n1])                    

    bipc = coreipc_list01[n1]

    bfi = str1

    bndot = fidot_list01[n1]

# DataFrame

df1 = pd.DataFrame(data=coreipc_list04,columns=[‘コアIPC’])

df2 = pd.DataFrame(data=fi_list04,columns=[‘特許分類‘])

df3 = pd.DataFrame(data=fidot_list04,columns=[‘FIドット数‘])

df4 = pd.DataFrame(data=fitxt_list04,columns=[‘コード内容‘])

# FIデータリストを作成

df20=pd.concat([df1, df2,df3,df4], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/FIデータリスト4_2.csv’,encoding=’utf-8′, index=False)

print(‘FIデータリスト4_2.csvを書き出しました‘)     

# スクリブト15  コアIPCの下位にFIをコード化して追加

## IPC_code表とFIデータリストを結合し、newIPC_code表を作成する。

print(”)

print(‘出力サンプル‘)

# csvデータ読み込み

ipc_code01 = pd.read_csv(‘./中間data/IPC_code.csv’, encoding=’utf-8′)

print(‘コアIPC=’,len(ipc_code01),’‘)

# csvデータ読み込み

fi_code01 = pd.read_csv(‘./中間data/FIデータリスト4_2.csv’, encoding=’utf-8′)

print(‘FIデータ=’,len(fi_code01),’‘)

# FI読み込み

coreipc_data = fi_code01.iloc[:,0]

# リストに変更

coreipc_list01 = coreipc_data.values

print(‘コアIPC[0:5]=’,coreipc_list01[0:5]) 

# FI読み込み

fi_data = fi_code01.iloc[:,1]

# リストに変更

fi_list01 = fi_data.values

print(‘FI[0:4]=’,fi_list01[0:4])   

# FIドット数読み込み

fidot_data = fi_code01.iloc[:,2]

# リストに変更

fidot_list01 = fidot_data.values

print(‘FIドット数[0:5]=’,fidot_list01[0:5])  

# FI分類を階層コード化

bipc = ”

ndot = 0

bndot = 0

ct01 = 0    # 5-6(00-99)

ct02 = 64    # 7(A-Z) chr(65)=’A’

ct03 = 0    # 8-9(00-99)

# n_chr = 64

coreipc_list = []

ficode_list = []

bad_list = []

for n1, str1 in enumerate(fi_list01):

    ndot = fidot_list01[n1]

    str2 = coreipc_list01[n1]

    if str2 != bipc:

        ct01 = 0    # 5-6(00-99)

        ct02 = 64    # 7(A-Z) chr(65)=’A’

        ct03 = 0    # 8-9(00-99)                

        # ndot=0ならばct01(00-99)でコード化

        if ndot == 0:

            if ct01 == 0:

                nstr = ’01’

                ficode_list.append(nstr)

                coreipc_list.append(str1)

                ct01 = ct01 + 1

    else:       

        # ndot=0ならばct01(00-99)でコード化

        if ndot== 0:

            if bndot > ndot: 

                ct02 = 64

                ct03 = 0

            ct01 = ct01 + 1

            if ct01 <= 9:

                nstr = ‘0’ + str(ct01)                  

            else:

                nstr = str(ct01)

            ficode_list.append(nstr)

            coreipc_list.append(str1)        

        # ndot=1になればct02(A-Z)でコード化

        if ndot== 1:

            if bndot > ndot: 

                ct03 = 0

            ct02 = ct02 + 1

            if chr(ct02)== ‘P’:

                bad_list.append(str1[0])    # ‘P’になればstr1[0]を追加

            bcode = chr(ct02)

            ficode_list.append(nstr + bcode)

            coreipc_list.append(str1)                 

        # ndot>=2ならばct03(00-99)でコード化

        if ndot>= 2:

            ct03 = ct03 + 1

            if ct03 <= 9:

                nstr2 = ‘0’ + str(ct03)                

            else:

                nstr2 = str(ct03)

            ficode_list.append(nstr + bcode + nstr2)  

            coreipc_list.append(str1)                             

    # bipcbndotを更新

    bipc = coreipc_list01[n1]

    bndot = ndot

print(‘coreipc_list[0:3]=’,coreipc_list[0:3])    # FIを追加

print(‘ficode_list[0:5]=’,ficode_list[0:5])

print(‘bad_list[0:5]=’,bad_list[0:5])

# ct02(A-Z)‘O’を超えている場合は修正

## 最初のコードは‘??A’とし、

## ドットが1以上は??A+00-99に修正

bcode = ”

for str1 in bad_list: 

    ct03 = 0

    for n1, str2 in enumerate(coreipc_list):

        if str1 == str2:

            ct03 = ct03 + 1

            if ct03 <= 9:

                nstr2 = ‘0’ + str(ct03)

            else:

                nstr2 = str(ct03)

            ## 最初のコードならば‘??A’

            if str1 != bcode:

                ficode = ficode_list[n1][0:2] + ‘A’ 

                ct03 = 0

                # bcodeを更新

                bcode = str1

            else:

                ficode = ficode_list[n1][0:2] + ‘A’ + nstr2

            ficode_list[n1] = ficode   

print(ficode_list[0:5])

# 書き出すと数値に戻るので先頭に‘X’を追加

ficode_list2 = []

for str1 in ficode_list:

    str2 = ‘X’ + str1

    ficode_list2.append(str2)

# DataFrame

# df1 = pd.DataFrame(data=maincode_list,columns=[‘コアIPC’])

# df2 = pd.DataFrame(data=ficode_list,columns=[‘特許分類‘])

df3 = pd.DataFrame(data=ficode_list2,columns=[‘コード‘])

# df4 = pd.DataFrame(data=fistr_list,columns=[‘コード内容‘])

# FIデータリストを作成

df20=pd.concat([df1, df2,df3,df4], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/FIデータリスト5.csv’,encoding=’utf-8′, index=False)

print(‘FIデータリスト5.csvを書き出しました‘)      

# スクリブト16  FIデータリストの完全コードに修正

## FIデータリスト3のコードにIPC_コード表の4桁コードを付加する。

print(”)

print(‘出力サンプル‘)

# csvデータ読み込み

ipc_code01 = pd.read_csv(‘./中間data/IPC_code.csv’, encoding=’utf-8′)

print(‘IPC_code=’,len(ipc_code01),’‘)

# コアIPC読み込み

ipc_data = ipc_code01.iloc[:,0]

# リストに変更

ipc_list01 = ipc_data.values

print(‘コアIPC[0:5]=’,ipc_list01[0:5])    # コアIPC

# コアIPCのコード読み込み

ipccode_data = ipc_code01.iloc[:,1]

# リストに変更

ipccode_list01 = ipccode_data.values

print(‘コアIPCのコード[0:5]=’,ipccode_list01[0:5])    # コアIPCのコード

# csvデータ読み込み

fi_code01 = pd.read_csv(‘./中間data/FIデータリスト5.csv’, encoding=’utf-8′)

print(‘FIデータ数=’,len(fi_code01),’‘)

fi_data01 = fi_code01.iloc[:,0]    # コアIPC

fi_data02 = fi_code01.iloc[:,1]    # FI

fi_data03 = fi_code01.iloc[:,2]    # コード

fi_data04 = fi_code01.iloc[:,3]    # コード内容

# FIデータリスト3のコアIPCをリスト化

fi_list01 = fi_data01.values    # FIデータリスト3のコアIPCのリスト化

print(‘FI[0:5]=’,fi_list01[0:5]) 

# FIデータリスト3のコアIPCをリスト化

fi_code01 = fi_data03.values    # FIデータリスト3のコードのリスト化

print(‘FI_code[0:5]=’,fi_code01[0:5]) 

# FIデータリスト3のコアIPC = IPC_code表のコアIPCならば

## FIデータリスト3のコードにIPC_コード表のコードを付加

ficode_list = []

for n1, str1 in enumerate(fi_list01):    # FIデータリスト3のコアIPC読み込み

    for n2, str2 in enumerate(ipc_list01):    # IPC_code表のコアIPC読み込み

        if str1== str2:

            str3 = fi_code01[n1][1:]    # FIデータリスト3のコードを2桁目から読み込み

            str4 = ipccode_list01[n2] + str3

            ficode_list.append(str4)

            break

print(‘ficode_list[0:5]=’,ficode_list[0:5])

# DataFrame

df1 = pd.DataFrame(data=fi_data01,columns=[‘コアIPC’])

df2 = pd.DataFrame(data=fi_data02,columns=[‘特許分類‘])

df3 = pd.DataFrame(data=ficode_list,columns=[‘コード‘])

df4 = pd.DataFrame(data=fi_data04,columns=[‘コード内容‘])

# FIデータリストを作成

df20=pd.concat([df1, df2,df3,df4], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/FIデータリスト.csv’,encoding=’utf-8′, index=False)

print(‘FIデータリスト.csvを書き出しました‘)       

# FIデータリストを作成

df21=pd.concat([df2,df3,df4], axis=1)

# 逆順にソート

df21=df21.sort_values(‘コード‘,ascending=False)

# CSVとして書き出し

df21.to_csv(‘./中間data/FI_code.csv’,encoding=’utf-8′, index=False)

print(‘FI_code.csvを書き出しました‘)  

# スクリブト17 公報データにコードを付与

## IPC_codeFI_codenofiIPC_codeによりコード化する。

## 付与されたコードが無ければsubclass_codeによりコード化する。

## 付与されたコードが無ければclass_codeによりコード化する。

print(”)

print(‘出力サンプル‘)

# csv読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist.csv’, encoding=’utf-8′)

# IPC01読み込み

ipc_data01 = pat_data.iloc[:,6]                    

ipc_list01 =[]

for str1 in ipc_data01:

    ipc_list01.append(str1)   

# FI01読み込み

fi_data01 = pat_data.iloc[:,7]                    

fi_list01 =[]

for str1 in fi_data01:

    fi_list01.append(str1)   

# コード初期化

code_list01 =[]

for str1 in ipc_list01:

    str1 = ”

    code_list01.append(str1) 

# csv読み込み

ficode_data01 = pd.read_csv(‘./中間data/FI_code.csv’, encoding=’utf-8′)

# FI03読み込み

fi_data03 = ficode_data01.iloc[:,0]                    

fi_list03 =[]

for str1 in fi_data03:

    fi_list03.append(str1)   

# code03読み込み

ficode_data03 = ficode_data01.iloc[:,1]                    

code_list03 =[]

for str1 in ficode_data03:

    code_list03.append(str1)   

# csv読み込み

ipccode_data01 = pd.read_csv(‘./中間data/IPC_code.csv’, encoding=’utf-8′)

# IPC02読み込み

ipc_data02 = ipccode_data01.iloc[:,0]                    

ipc_list02 =[]

for str1 in ipc_data02:

    ipc_list02.append(str1)   

# code02読み込み

code_data02 = ipccode_data01.iloc[:,1]                    

code_list02 =[]

for str1 in code_data02:

    code_list02.append(str1)   

# csv読み込み

subclass_data01 = pd.read_csv(‘./中間data/subclass_code.csv’, encoding=’utf-8′)

# subclass_code読み込み

subclass_data05 = subclass_data01.iloc[:,0]                    

subclass_list05 =[]

for str1 in subclass_data05:

    subclass_list05.append(str1)   

# code05読み込み

subclass_data05 = subclass_data01.iloc[:,1]                    

code_list05 =[]

for str1 in subclass_data05:

    code_list05.append(str1)   

# csv読み込み

class_data01 = pd.read_csv(‘./中間data/class_code.csv’, encoding=’utf-8′)

# class_code読み込み

class_data06 = class_data01.iloc[:,0]                    

class_list06 =[]

for str1 in class_data06:

    class_list06.append(str1)   

# code06読み込み

class_data06 = class_data01.iloc[:,1]                    

code_list06 =[]

for str1 in class_data06:

    code_list06.append(str1)   

# FI_code表により追記

for n1, str1 in enumerate(fi_list01):

    for n2, str2 in enumerate(fi_list03):

        if str2 in str1:

            str3 = code_list03[n2]

            if code_list01[n1]  == ”:

                code_list01[n1] = str3 

            else:

                code_list01[n1] =code_list01[n1] + ‘;’ + str3   

# IPC追記

for n1, str1 in enumerate(ipc_list01):    

    for n2, str2 in enumerate(ipc_list02):

        if str2 in str1:

            str3 = code_list02[n2]

            if code_list01[n1] == ”:

                code_list01[n1] = str3

            else:

                if str3 not in code_list01[n1]:

                    code_list01[n1] = code_list01[n1] + ‘;’ + str3            

# subclass_code表により追記

for n1, str1 in enumerate(ipc_list01):

    for n2, str2 in enumerate(subclass_list05):

        str1 = ‘;’ + str1

        str2 = ‘;’ + str2

        if str2 in str1:

            str3 = code_list05[n2]

            if code_list01[n1]  == ”:

                code_list01[n1] = str3 

            else:

                if str3 not in code_list01[n1]:

                    code_list01[n1] =code_list01[n1] + ‘;’ + str3   

# class_code表により追記

for n1, str1 in enumerate(ipc_list01):

    for n2, str2 in enumerate(class_list06):

        str1 = ‘;’ + str1

        str2 = ‘;’ + str2

        if str2 in str1:

            str3 = code_list06[n2]

            if code_list01[n1]  == ”:

                code_list01[n1] = str3 

            else:

                if str3 not in code_list01[n1]: 

                    code_list01[n1] = code_list01[n1] + ‘;’ + str3   

print(‘公報付与コード[0:5]=’,code_list01[0:5])

# DataFrame

# df01 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])

# df02 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])

# df03 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])

# df04 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])

# df05 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])

# df06 = pd.DataFrame(data=name_list, columns=[‘発明者‘])

# df07 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])

# df08 = pd.DataFrame(data=fi_list02, columns=[‘FI‘])

# df09 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])

# df10 = pd.DataFrame(data=abst_list, columns=[‘要約‘])

df11 = pd.DataFrame(data=code_list01, columns=[‘コード‘])

# 結合

df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df11,df10], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/new_patlist2.csv’,encoding=’utf-8′, index=False)

print(‘new_patlist2.csvを書き出しました‘)

# スクリブト18  コードが無かった公報のIPCの出現頻度を集計

print(”)

print(‘出力サンプル‘)

# csvデータ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist2.csv’, encoding=’utf-8′)

# IPC読み込み

ipc_data01 = pat_data.iloc[:,6]    # IPC

ipc_list01 = []

for str1 in ipc_data01:

    ipc_list01.append(str1)

# コード化されなかった公報の公報IPCを読み込み

code_data01 = pat_data.iloc[:,9]    # コードリスト

nocode_list = []    # コード無しIPC

for n1, str2 in enumerate(code_data01):

    if str(str2) == ‘nan’:

        str3 = ipc_list01[n1]

        split_str3 = str3.split(‘;’)

        for str4 in split_str3:

            nocode_list.append(str4)

# IPC別に集計

ct_ipc = collections.Counter(nocode_list)

ipc_n = list(ct_ipc.items())  # keyvalueをリストに格納

ipc_n_list = []

ipc_list = []

for str1 in ipc_n:

    str2 = list(str1)

    ipc_n_list.append(str2)

# 出現頻度の高い順にソート

ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)

# コード無しIPCの集計表作成

nocode_list = []

n_list = []

for n,str1 in enumerate(ipc_n_list):

    nocode_list.append(str1[0])

    n_list.append(str1[1])

print(‘コード無しIPC[0:5]=’,nocode_list[0:5])

print(‘出現頻度[0:5]=’,n_list[0:5])

# スクリブト19  コードZを追記

print(”)

print(‘出力サンプル‘)

# csvデータ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist2.csv’, encoding=’utf-8′)

# IPC読み込み

ipc_data01 = pat_data.iloc[:,6]    # IPC

ipc_list01 = []

for str1 in ipc_data01:

    ipc_list01.append(str1)

print(‘公報IPC[0:1]=’,ipc_list01[0:1])

# コード読み込み

code_data01 = pat_data.iloc[:,9]    # コード

code_list01 = []

for str1 in code_data01:

    code_list01.append(str1)

print(‘コード[0:3]=’,code_list01[0:3])

sonota_ipc = []

sonota_code = []

for n1, str1 in enumerate(nocode_list):

    if n1 <= 4:

        sonota_ipc.append(str1)

        str2 = ‘Z’ + ‘0’ + str(n1+1)

        sonota_code.append(str2)

    if n1 > 4:

        sonota_ipc.append(‘その他‘)

        str3 = ‘Z99’ 

        sonota_code.append(str3)

        break

print(‘その他のコード=’,sonota_code)

print(‘その他のIPC=’,sonota_ipc)

# コードZ(その他)を追記

for n1, str2 in enumerate(code_list01):

    if str(str2) == ‘nan’:

        for n2, str3 in enumerate(sonota_ipc):

            if str3 in ipc_list01[n1]:

                code_list01[n1] = sonota_code[n2]

            if str3 == ‘その他‘:

                if str(code_list01[n1]) == ‘nan’:

                    code_list01[n1] = sonota_code[n2]

# DataFrame

# df01 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])

# df02 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])

# df03 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])

# df04 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])

# df05 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])

# df06 = pd.DataFrame(data=name_list, columns=[‘発明者‘])

# df07 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])

# df08 = pd.DataFrame(data=fi_list02, columns=[‘FI‘])

# df09 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])

# df10 = pd.DataFrame(data=abst_list, columns=[‘要約‘])

df11 = pd.DataFrame(data=code_list01, columns=[‘コード‘])

# 結合

df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df11,df10], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/new_patlist3.csv’,encoding=’utf-8′, index=False)    # コード付き母集合

print(‘(コード付き母集合)new_patlist3.csvを書き出しました‘)

# スクリブト20 その他のコード(Z)のコード表を作成

print(”)

print(‘出力サンプル‘)

sonota_ipc = []

sonota_code = []

for n1, str1 in enumerate(nocode_list):

    if n1 <= 4:

        sonota_ipc.append(str1)

        str2 = ‘Z’ + ‘0’ + str(n1+1)

        sonota_code.append(str2)

    if n1 > 4:

        sonota_ipc.append(‘その他‘)

        str3 = ‘Z99’ 

        sonota_code.append(str3)

        break

print(‘その他のコード=’,sonota_code)

print(‘その他のIPC=’,sonota_ipc)

# IPC分類表.csv読み込み

pat_data05 = pd.read_csv(‘allIPC分類表.csv’, encoding=’utf-8′)

# print(‘IPC=’,len(pat_data05))

# IPC読み込み

ipc_data01 = pat_data05.iloc[:,2]                    

ipc_list01 =[]

for str3 in ipc_data01:

    ipc_list01.append(str(str3))   

print(‘IPC[0:3]=’,ipc_list01[0:3])

# 分類内容読み込み

ipc_data2 = pat_data05.iloc[:,4]                

ipctxt_list =[]

for str3 in ipc_data2:

    ipctxt_list.append(str(str3))     

print(‘IPC内容[0:3]=’,ipctxt_list[0:3])

# コード内容を追加

sonota_ipc_list02= []

sonota_code02 =[]

sonota_txt_list02= []

for n1, str1 in enumerate(sonota_ipc):

    for n2, str2 in enumerate(ipc_list01):

        if str1 == str2:

            sonota_ipc_list02.append(str1)

            sonota_code02.append(sonota_code[n1])

            sonota_txt_list02.append(ipctxt_list[n2])

        if str1 == ‘その他‘:

            sonota_ipc_list02.append(str1)

            sonota_code02.append(sonota_code[n1])

            sonota_txt_list02.append(‘その他‘)

            break

# コードZのコード表作成

# DataFrame

df1 = pd.DataFrame(data=sonota_ipc_list02,columns=[‘特許分類‘])

df2 = pd.DataFrame(data=sonota_code02,columns=[‘コード‘])

df3 = pd.DataFrame(data=sonota_txt_list02,columns=[‘コード内容‘])

# 集計表にまとめる

df20=pd.concat([df1, df2, df3], axis=1)

# 書き出し

df20.to_csv(‘./中間data/Z_code.csv’,encoding=’utf-8′, index=False)

print(‘Z_code.csvを書き出しました‘)

# スクリブト19-2  コードZの件数を集計

print(”)

print(‘出力サンプル‘)

# csvデータ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist3.csv’, encoding=’utf-8′)

nkoho = len(pat_data)

print(‘公報件数=’,nkoho)

# コード読み込み

code_data99 = pat_data.iloc[:,9]    # コード

code_list99 = []

nz99 = 0

for str1 in code_data99:

    if ‘Z99’ in str1: nz99 = nz99 + 1        

    code_list99.append(str1)

print(‘コード[0:3]=’,code_list99[0:3])

print(‘Z99の件数=’,nz99)

# IPC読み込み

ipc_data99 = pat_data.iloc[:,6]    # IPC

ipc_list99 = []

for str1 in ipc_data99:

    ipc_list99.append(str1)

print(‘公報IPC[0:1]=’,ipc_list99[0:1])

# Z99が多過ぎる場合はIPCのセクション別にコード化

if (nz99 / nkoho) * 100 > 10:

    npz99 = (nz99 / nkoho) * 100

    print(npz99)

    nza = 0

    nzb = 0

    nzc = 0

    nzd = 0

    nze = 0

    nzf = 0

    nzg = 0

    nzh = 0

    cd99_list = []

    for n1, str1 in enumerate(ipc_list99):

        bcode_list = code_list99[n1]

        if ‘Z99’ in code_list99[n1]:

            str2 = str1.split(‘;’) 

            bcd = ”

            for str3 in str2:

                if str3[0] == ‘A’: 

                    if ‘Z99A’ not in bcd:

                        bcd = bcd + ‘;Z99A’

                        nza = nza + 1

                if str3[0] == ‘B’: 

                    if ‘Z99B’ not in bcd:

                        bcd = bcd + ‘;Z99B’

                        nzb = nzb + 1

                if str3[0] == ‘C’:

                    if ‘Z99C’ not in bcd:

                        bcd = bcd + ‘;Z99C’

                        nzc = nzc + 1

                if str3[0] == ‘D’: 

                    if ‘Z99D’ not in bcd:

                        bcd = bcd + ‘;Z99D’

                        nzd = nzd + 1

                if str3[0] == ‘E’: 

                    if ‘Z99E’ not in bcd:

                        bcd = bcd + ‘;Z99E’

                        nze = nze + 1

                if str3[0] == ‘F’: 

                    if ‘Z99F’ not in bcd:

                        bcd = bcd + ‘;Z99F’

                        nzf = nzf + 1

                if str3[0] == ‘G’:

                    if ‘Z99G’ not in bcd:

                        bcd = bcd + ‘;Z99G’

                        nzg = nzg + 1

                if str3[0] == ‘H’:

#                    print(str3[0])

                    if ‘Z99H’ not in bcd:

                        bcd = bcd + ‘;Z99H’

                        nzh = nzh + 1

#                    print(bcd)

#                print(bcd)

            bcode_list = bcd

#        print(bcode_list)

        if bcode_list != ”:

            if bcode_list[0] == ‘;’: bcode_list = bcode_list[1:]

#        print(n1,bcode_list)

#        print(n1, code_list99[n1])

#        print(n1,bcode_list, ‘=’,str1)

        cd99_list.append(bcode_list)

    print(‘Z99A=’,nza,’Z99B=’,nzb,’Z99C=’,nzc,’Z99D=’,nzd,’Z99E=’,nze,’Z99F’,nzf,’Z99G=’,nzg,’Z99H=’,nzh)

    print(len(cd99_list), cd99_list[0:5])

    # コード修正

    # DataFrame

    # df01 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])

    # df02 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])

    # df03 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])

    # df04 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])

    # df05 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])

    # df06 = pd.DataFrame(data=name_list, columns=[‘発明者‘])

    # df07 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])

    # df08 = pd.DataFrame(data=fi_list02, columns=[‘FI‘])

    # df09 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])

    # df10 = pd.DataFrame(data=abst_list, columns=[‘要約‘])

    df11 = pd.DataFrame(data=cd99_list, columns=[‘コード‘])

    # 結合

    df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df11,df10], axis=1)

    # CSVとして書き出し

    df20.to_csv(‘./中間data/new_patlist3.csv’,encoding=’utf-8′, index=False)    # コード付き母集合

    print(‘(コード付き母集合)new_patlist3.csvを修正しました‘)

    # Z_code表にコード追加

    code_data = pd.read_csv(‘./中間data/Z_code.csv’, encoding=’utf-8′)    

    # Zコード読み込み

    zcode_data0 = code_data.iloc[:,0]    # 特許分類

    zcode_data1 = code_data.iloc[:,1] 

    zcode_data2 = code_data.iloc[:,2] 

    zcode_list0 = []

    for str1 in zcode_data0:

        zcode_list0.append(str1)

    zcode_list1 = []

    for str1 in zcode_data1:

        zcode_list1.append(str1)

    zcode_list2 = []

    for str1 in zcode_data2:

        zcode_list2.append(str1)        

    # Z99コード追加

    zcode_list0.append(‘A’)

    zcode_list1.append(‘Z99A’)

    zcode_list2.append(‘その他の生活必需品‘)

    zcode_list0.append(‘B’)

    zcode_list1.append(‘Z99B’)

    zcode_list2.append(‘その他の処理操作;運輸‘)

    zcode_list0.append(‘C’)

    zcode_list1.append(‘Z99C’)

    zcode_list2.append(‘その他の化学;冶金‘)

    zcode_list0.append(‘D’)

    zcode_list1.append(‘Z99D’)

    zcode_list2.append(‘その他の繊維;‘)

    zcode_list0.append(‘E’)

    zcode_list1.append(‘Z99E’)

    zcode_list2.append(‘その他の固定構造物‘)

    zcode_list0.append(‘F’)

    zcode_list1.append(‘Z99F’)

    zcode_list2.append(‘その他の機械工学;照明;加熱;武器;爆破‘)

    zcode_list0.append(‘G’)

    zcode_list1.append(‘Z99G’)

    zcode_list2.append(‘その他の物理学‘)

    zcode_list0.append(‘H’)

    zcode_list1.append(‘Z99H’)

    zcode_list2.append(‘その他の電気‘)

    print(zcode_list0)

    print(zcode_list1)

    print(zcode_list2)    

    # コードZのコード表作成

    # DataFrame

    df1 = pd.DataFrame(data=zcode_list0,columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=zcode_list1,columns=[‘コード‘])

    df3 = pd.DataFrame(data=zcode_list2,columns=[‘コード内容‘])

    # 集計表にまとめる

    df20=pd.concat([df1, df2, df3], axis=1)

    # 書き出し

    df20.to_csv(‘./中間data/Z_code.csv’,encoding=’utf-8′, index=False)

    print(‘Z_code.csvを書き出しました‘)    

# スクリブト21  全てのコード表を結合

## クラスからIPC全桁までのコード表を結合する。

print(”)

print(‘出力サンプル‘)

# csvデータ読み込み

ipc_code01 = pd.read_csv(‘./中間data/class_code.csv’, encoding=’utf-8′)

df1 = pd.DataFrame(data=ipc_code01)

ipc_code02 = pd.read_csv(‘./中間data/subclass_code.csv’, encoding=’utf-8′)

df2 = pd.DataFrame(data=ipc_code02)

ipc_code03 = pd.read_csv(‘./中間data/IPC_code.csv’, encoding=’utf-8′)

df3 = pd.DataFrame(data=ipc_code03)

ipc_code04 = pd.read_csv(‘./中間data/FI_code.csv’, encoding=’utf-8′)

df4 = pd.DataFrame(data=ipc_code04)

ipc_code05 = pd.read_csv(‘./中間data/Z_code.csv’, encoding=’utf-8′)

df5 = pd.DataFrame(data=ipc_code05)

# データリストを作成

df20=pd.concat([df1,df2,df3,df4,df5], axis=0)

# ソート

df20 = df20.sort_values(‘コード‘, ascending=True)    # 昇順

# DataFrame

ipc_data = df20.iloc[:,0]  

df1 = pd.DataFrame(data=ipc_data, columns=[‘特許分類‘])

code_data = df20.iloc[:,1]  

df2 = pd.DataFrame(data=code_data, columns=[‘コード‘])

txt_data = df20.iloc[:,2]  

df3 = pd.DataFrame(data=txt_data, columns=[‘コード内容‘])

# データリストを作成

df20=pd.concat([df1,df2,df3], axis=1)

df20 = df20.dropna(axis=0)

print(‘IPC_code対照表のコード数=’,len(df20))

# CSVとして書き出し

df20.to_csv(‘./中間data/IPC_code対照表.csv’,encoding=’utf-8′, index=False)

print(‘IPC_code対照表.csvを書き出しました‘)  

# スクリブト22 トピック分析するコードを抽出

## ここでは、その他とZコードを抽出し、トピック分析している。

print(”)

print(‘出力サンプル‘)

# IPC_code対照表.csvデータ読み込み

ipc_code_data = pd.read_csv(‘./中間data/IPC_code対照表.csv’, encoding=’utf-8′)

print(‘コード件数=’,len(ipc_code_data))

code01_data = ipc_code_data.iloc[:,0]    # コード化IPC(G05B13/02・・・)

ipc_list01 =[]

for str1 in code01_data:

    ipc_list01.append(str1)

print(‘コード化IPC[0:1]=’,ipc_list01[0:1])

code02_data = ipc_code_data.iloc[:,1]    # 階層化コード(A,A01・・・)

code_list01 =[]

for str1 in code02_data:

    code_list01.append(str1)

print(‘階層化コード[0:5]=’,code_list01[0:5])

code03_data = ipc_code_data.iloc[:,2]    # コード内容(電気式・・・)

txt_list01 =[]

for str1 in code03_data:

    txt_list01.append(str1)

print(‘コード内容[0:1]=’,txt_list01[0:1])

# 4桁コードとZコードを抽出

ipc_list02 = []

code_list02 = []

txt_list02 = []

for n1, str1 in enumerate(code_list01):

    flg = 0

    if len(str1) <= 6:

        str2 = txt_list01[n1]

        if str2[0:3] == ‘その他‘:

            ipc_list02.append(ipc_list01[n1])

            code_list02.append(str1)

            txt_list02.append(txt_list01[n1])

            flg = 1

    if flg == 0:

        if str1[0:1] == ‘Z’:

            ipc_list02.append(ipc_list01[n1])

            code_list02.append(str1)

            txt_list02.append(txt_list01[n1])

# DataFrame

df1 = pd.DataFrame(data=ipc_list02, columns=[‘特許分類‘])

df2 = pd.DataFrame(data=code_list02, columns=[‘コード‘])

df3 = pd.DataFrame(data=txt_list02, columns=[‘コード内容‘])

# 結合

df20=pd.concat([df1,df2,df3], axis=1)

print(‘データ件数=’,len(df20))

# コード表書き出し

df20.to_csv(‘./中間data/Z_code.csv’,encoding=’utf-8′, index=False)

print(‘Z_code.csvを書き出しました‘)

# スクリブト23 コード別に読み込みトピックKWリストを追加

### 読み込むコードはIPC_code(その他とZコード)

import MeCab

# m = MeCab.Tagger (“-Ochasen”)

from sklearn.feature_extraction.text import CountVectorizer

from sklearn.decomposition import LatentDirichletAllocation

from matplotlib import pyplot as plt

from wordcloud import WordCloud

# MeCabの準備

tagger = MeCab.Tagger()

print(”)

print(‘出力サンプル‘)

# 書き出すワード数を設定

n_top_words = 20

# 出現頻度が1%以下は低すぎるとして対象外とした(min_df=.001)

min_hindo = 0.01

# 出現頻度が50%以上は高すぎる(特徴の無い語句)として対象外とした(max_df=0.5)

max_hindo = 0.5

# 公報データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist3.csv’, encoding=’utf-8′)

print(‘公報件数=’,len(pat_data))

# 公報番号欄読み込み

patno_data = pat_data.iloc[:,0]

pn_list =[]

for str1 in patno_data:

    str0 = str1

    pn_list.append(str(str0))

# 発明の名称欄読み込み

title_data = pat_data.iloc[:,3]

ti_list = []

for str1 in title_data:

    str1 = str(str1)

    ti_list.append(str1)

# コード欄読み込み

code_data = pat_data.iloc[:,9]

code_list = []

for str1 in code_data:

    str1 = str(str1)

    code_list.append(str1)

# 要約欄読み込み

abst_data = pat_data.iloc[:,10]    # 分類コード有りの場合

abst_list = []

for str1 in abst_data:

    str1 = str(str1)

    if len(str1) > 3:

        #データ中の空白を削除

        str1 = (str1.replace(” “, “”))    # 半角空白を削除

        str1 = (str1.replace(“ “, “”))    # 全角空白を削除

        str1 = (str1.replace(“,”, “”))    # ,」を「、」に置換

        abst_list.append(str1)

    else:

        abst_list.append(‘要約無し‘)

# 発明の名称と要約を結合

tiab_list = []

for n, str1 in enumerate(ti_list):

    str2 = str1 + ‘ ‘ + abst_list[n]

    tiab_list.append(str2)

# 分析対象データ読み込み

code_data01 = pd.read_csv(‘./中間data/Z_code.csv’, encoding=’utf-8′)

ipc_data = code_data01.iloc[:,0]    # IPC

df1 = pd.DataFrame(ipc_data)

kcode_data = code_data01.iloc[:,1]    # コード

df2 = pd.DataFrame(kcode_data)

txt_data = code_data01.iloc[:,2]    # コード内容

df3 = pd.DataFrame(txt_data)

# コード化IPC欄読み込み

ipc_list1 = []

for str1 in ipc_data:

    str1 = str(str1)

    ipc_list1.append(str1)

# コード欄読み込み

kcode_list1 = []

for str1 in kcode_data:

    str1 = str(str1)

    kcode_list1.append(str1)

alltopic_list = []

# コード別に読み込みトピックKWリストを書き出し

for n1, str1 in enumerate(kcode_list1):    

    print(‘コード=’,str1)

    # 指定コードに対するtiabデータを読み込み

    code_tiab_list = []

    code_pn_list = []

    for n2, str2 in enumerate(code_list):

        if str1 in str2:    # 公報データのコード中に階層化コードが含まれていれば

            code_pn_list.append(pn_list[n2])

            code_tiab_list.append(tiab_list[n2])

    if len(code_tiab_list) == 0:

        print(‘このコードの対象公報は有りません‘)

        print(‘ ‘)

        # topic_listをリスト化

        topic_list = [‘ ‘]

        alltopic_list.append(topic_list)

    else:

        # テキスト読み込み

        source_text = str(code_tiab_list)

        # 英数字、記号を除去

        source_text = re.sub(r”[a-z]”, “”, source_text)  #半角小文字

        source_text = re.sub(r”[]”, “”, source_text)  #全角小文字

        source_text = re.sub(r”[A-Z]”, “”, source_text)  #半角大文字

        source_text = re.sub(r”[]”, “”, source_text)  #全角大文字

        source_text = re.sub(r”[]”, “”, source_text)    # 半角数字

        source_text = re.sub(r”[0-9]”, “”, source_text)   # 全角数字

        source_text = re.sub(r'[:;/+\.「」]’, ”, source_text)   # 記号

        source_text =source_text[:-2]  # 右端の削除

        # 基礎的除去語句を設定

        stop_words0 = [‘(57)’,’【要約】‘,’(修正有)‘,’【課題】‘,’【選択図】‘,’本発明‘,’本願‘,’前記‘,’上記‘,

              ‘場合‘,’当該‘,’発明‘,’もの‘,’こと‘,’及び‘, ‘および‘, ‘用いる‘, ‘なる‘, ‘する‘, ‘れる‘,’られる‘,

               ‘全て‘,’ため‘,’有する‘, ‘その‘, ‘この‘, ‘有す‘, ‘それら‘, ‘ある‘, ‘いる‘, ‘もつ‘, ‘うち‘, ‘できる‘,

               ‘せる‘, ‘より‘, ‘/’, ‘備える‘, ‘備えた‘,'()’, ‘ここ‘, ‘よう‘, ‘なる‘,’含む‘,’手段‘]

        n0 = (len(stop_words0),’‘)

        # テーマ毎の除去語句を設定

        stop_words1 = [‘方法‘,’装置‘,’システム‘,’データ‘,’処理‘]

        n1 = (len(stop_words1),’‘)

        # 設定した不要語句を除去

        for str1 in stop_words0:

            source_text = (source_text.replace(str1, ”))

        for str1 in stop_words1:

            source_text = (source_text.replace(str1, ”))

        # MeCab.Taggerによりnode(形態素に分割)

        node = tagger.parseToNode(source_text)

        # 名詞、形容詞だけを取り出す

        word_list = []

        while node:

            word_type = node.feature.split(‘,’)[0]

            if word_type == ‘名詞‘: word_list.append(node.surface)

            if word_type == ‘形容詞‘: word_list.append(node.surface)

#    if word_type == ‘動詞‘: word_list.append(node.surface)

            node = node.next

        # リストを文字列に変換

        word_chain = ‘ ‘.join(word_list)

        if len(word_list) > 1:

            count = CountVectorizer(min_df=min_hindo, max_df=max_hindo,max_features=5000)

        if len(word_list) == 1:

            count = CountVectorizer(min_df=0, max_df=1,max_features=5000)

        erflg = 0

        try:

            X = count.fit_transform(word_list)

        except ValueError as e:

            print(e)

            erflg = 1

        n_out = 1    # トピック数を指定

        # トピック抽出

        lda = LatentDirichletAllocation(n_components=n_out,

                                random_state=100,

                                learning_method=’batch’)

        X_topics = lda.fit_transform(X)

        lda.components_.shape

        # 出現した単語を取得

        feature_names = count.get_feature_names()

        # トピックリスト作成

        topic_list = []

        for topic_idx, topic in enumerate(lda.components_):

#            print(“Topic %d:” % (topic_idx + 1))

            print(” “.join([feature_names[i]

                    for i in topic.argsort()\

                        [:-n_top_words – 1:-1]]))

            str1 = “Topic %d,” % (topic_idx + 1)

            str2 = “,”.join([feature_names[i]

                    for i in topic.argsort()\

                        [:-n_top_words – 1:-1]])

            topic_list.append(str2)

        print(‘トピックKW=’,topic_list)        

        # topic_listをリスト化

        alltopic_list.append(topic_list)

        # ワードクラウド作成

        if erflg == 0:

            W = WordCloud(width=500, height=400, background_color=’black’, colormap=’Paired_r’, 

              collocations = False, # 複合語のオプションをオフ

              font_path=’/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc’).generate(word_chain)

        # プロット

        plt.imshow(W)

        plt.axis(‘off’)

        plt.show()

# DataFrame

# df1 = pd.DataFrame(data=ipc_data, columns=[‘コード化IPC’])

# df2 = pd.DataFrame(data=kcode_data, columns=[‘階層化コード‘])

# df3 = pd.DataFrame(data=txt_data, columns=[‘コード内容‘])

df4 = pd.DataFrame(data=alltopic_list,columns=[‘トピックKW’])

df20=pd.concat([df1,df2,df3,df4], axis=1)

# CSVとして書き出し

df20.to_csv(‘./中間data/IPC_code2.csv’,encoding=’utf-8′, index=False)

print(‘IPC_code2.csvを書き出しました‘)  

# スクリブト24  IPC_コード対照表にトピックKWの上位10を追加

print(”)

print(‘出力サンプル‘)

# IPC_code対照表.csvデータ読み込み

ipc_code_data = pd.read_csv(‘./中間data/IPC_code対照表.csv’, encoding=’utf-8′)

print(‘コード件数=’,len(ipc_code_data))

ipc_data01 = ipc_code_data.iloc[:,0]    # コード化IPC(ex:G05B13/02・・・)

ipc_list01 =[]

for str1 in ipc_data01:

    ipc_list01.append(str1)

print(‘コード化IPC[0:1]=’,ipc_list01[0:1])

code_data01 = ipc_code_data.iloc[:,1]    # 階層化コード(ex:A,A01・・・)

code_list01 =[]

for str1 in code_data01:

    code_list01.append(str1)

print(‘コード[0:5]=’,code_list01[0:5])

txt_data01 = ipc_code_data.iloc[:,2]    # コード内容(ex:電気式・・・)

txt_list01 =[]

for str1 in txt_data01:

    txt_list01.append(str1)

print(‘コード内容[0:1]=’,txt_list01[0:1])

# IPC_code対照表.csvデータ読み込み

ipc_code_data = pd.read_csv(‘./中間data/IPC_code2.csv’, encoding=’utf-8′)

print(‘コード件数=’,len(ipc_code_data))

ipc_data02 = ipc_code_data.iloc[:,0]    # コード化IPC(ex:G05B13/02・・・)

ipc_list02 =[]

for str1 in ipc_data02:

    ipc_list02.append(str1)

code_data02 = ipc_code_data.iloc[:,1]    # コード(A,A01・・・)

code_list02 =[]

for str1 in code_data02:

    code_list02.append(str1)

txt_data02 = ipc_code_data.iloc[:,3]    # トピックKW

txt_list02 =[]

for str1 in txt_data02:

    txt_list02.append(str1)

print(‘トピックKW[0:1]=’,txt_list02[0:1])

# トピックKWを追加

for n1, str1 in enumerate(code_list01):

    flg = 0

    for n2, str2 in enumerate(code_list02):

        if str1 == str2:

            str3 = txt_list02[n2]

            str3 = str3.split(‘,’)

            str4 = ”

            for str5 in str3[0:10]:

                if str4 == ”:

                    str4 = str5

                else:

                    str4 = str4 + ‘+’ + str5

            txt_list01[n1] = txt_list01[n1] + ‘+KW=’ + str4

# コードZを追加

ipc_list01.append(‘その他‘)

code_list01.append(‘Z’)

txt_list01.append(‘その他‘)            

# DataFrame

df1 = pd.DataFrame(data=ipc_list01, columns=[‘特許分類‘])

df2 = pd.DataFrame(data=code_list01, columns=[‘コード‘])

df3 = pd.DataFrame(data=txt_list01, columns=[‘コード内容‘])

# 結合

df20=pd.concat([df1,df2,df3], axis=1)

print(‘データ件数=’,len(df20))

# ソート

df20=df20.sort_values(‘コード‘)

# コード表書き出し

df20.to_csv(‘./中間data/コード_コード内容対照表.csv’,encoding=’utf-8′, index=False)

print(‘コード_コード内容対照表.csvを書き出しました‘)

# スクリブト25 不要語句を消去

print(”)

print(‘出力サンプル‘)

# IPC_code対照表.csvデータ読み込み

ipc_code_data = pd.read_csv(‘./中間data/コード_コード内容対照表.csv’, encoding=’utf-8′)

print(‘コード件数=’,len(ipc_code_data))

ipc_data01 = ipc_code_data.iloc[:,0]    # コード化IPC(G05B13/02・・・)

ipc_list01 =[]

for str1 in ipc_data01:

    ipc_list01.append(str1)

code_data01 = ipc_code_data.iloc[:,1]    # 階層化コード(A,A01・・・)

code_list01 =[]

for str1 in code_data01:

    code_list01.append(str1)

print(‘階層化コード[0:5]=’,code_list01[0:5])

txt_data01 = ipc_code_data.iloc[:,2]    # コード内容(電気式・・・)

txt_list01 =[]

for str1 in txt_data01:

    txt_list01.append(str1)

txt_list03 = []

for str1 in txt_list01:    # 不要語句を消去

    if ‘このサブクラスの他のグループに分類されない主題事項‘ in str1: 

        str1 = str1.replace(‘このサブクラスの他のグループに分類されない主題事項‘,’その他の主題‘)

    if ‘このサブグループに記述され,かつ‘ in str1: str1 = str1.replace(‘あるいはこのサブグループに記述され,かつ‘,”)

    if ‘このサブクラスの他のグループの,‘ in str1: str1 = str1.replace(‘このサブクラスの他のグループの,‘,”)        

    if ‘あるいは共通技術‘ in str1: str1 = str1.replace(‘あるいは共通技術‘,”)

    if ‘することによるもの‘ in str1: str1 = str1.replace(‘することによるもの‘,”)        

    if ‘するためのもの‘ in str1: str1 = str1.replace(‘するためのもの‘,”)       

    if ‘のための方法または装置‘ in str1: str1 = str1.replace(‘のための方法または装置‘,”)                 

    if ‘の使用を伴うもの‘ in str1: str1 = str1.replace(‘の使用を伴うもの‘,”)

    if ‘に特に適合したもの‘ in str1: str1 = str1.replace(‘に特に適合したもの‘,”)

    if ‘に特に適合するもの‘ in str1: str1 = str1.replace(‘に特に適合するもの‘,”)    

    if ‘に特徴があるもの‘ in str1: str1 = str1.replace(‘に特徴があるもの‘,”)

    if ‘を利用したもの‘ in str1: str1 = str1.replace(‘を利用したもの‘,”)

    if ‘を用いること‘ in str1: str1 = str1.replace(‘を用いること‘,”)        

    if ‘を行なうもの‘ in str1: str1 = str1.replace(‘を行なうもの‘,”)

    if ‘を用いるもの‘ in str1: str1 = str1.replace(‘を用いるもの‘,’を使用‘)       

    if ‘を用いたもの‘ in str1: str1 = str1.replace(‘を用いたもの‘,’を使用‘)     

    if ‘を使用するもの‘ in str1: str1 = str1.replace(‘を使用するもの‘,’を使用‘)                

    if ‘を伴うもの‘ in str1: str1 = str1.replace(‘を伴うもの‘,”)

    if ‘に関するもの‘ in str1: str1 = str1.replace(‘に関するもの‘,”)

    if ‘を有するもの‘ in str1: str1 = str1.replace(‘を有するもの‘,”)

    if ‘を使用するもの‘ in str1: str1 = str1.replace(‘を使用するもの‘,”)     

    if ‘に適合したもの‘ in str1: str1 = str1.replace(‘に適合したもの‘,’に適合‘)                  

    if ‘を行うもの‘ in str1: str1 = str1.replace(‘を行うもの‘,”)

    if ‘そのための‘ in str1: str1 = str1.replace(‘そのための‘,”)        

    if ‘のためのもの‘ in str1: str1 = str1.replace(‘のためのもの‘,”)           

    if ‘または装置‘ in str1: str1 = str1.replace(‘または装置‘,”)

    if ‘によるもの‘ in str1: str1 = str1.replace(‘によるもの‘,”)

    if ‘このような‘ in str1: str1 = str1.replace(‘このような‘,”)                

    if ‘のあるもの‘ in str1: str1 = str1.replace(‘のあるもの‘,”)

    if ‘をするもの‘ in str1: str1 = str1.replace(‘をするもの‘,”)

    if ‘としたもの‘ in str1: str1 = str1.replace(‘としたもの‘,”)        

    if ‘をもつもの‘ in str1: str1 = str1.replace(‘をもつもの‘,”)

    if ‘を含むもの‘ in str1: str1 = str1.replace(‘を含むもの‘,”)  

    if ‘のまたは‘ in str1: str1 = str1.replace(‘のまたは‘,’‘)          

    #print(str1)

    txt_list03.append(str1)    

# DataFrame

df1 = pd.DataFrame(data=ipc_list01, columns=[‘特許分類‘])

df2 = pd.DataFrame(data=code_list01, columns=[‘コード‘])

df3 = pd.DataFrame(data=txt_list03, columns=[‘コード内容‘])

# 結合

df20=pd.concat([df1,df2,df3], axis=1)

# dataframearrayに変換

arr1 = df20.values

旧データクリア

## ブックを新規作成。これにより旧データがクリア

book = openpyxl.Workbook()

# シートを追加

ws = book.create_sheet(title=’コード対照表‘)

ws = book.create_sheet(title=’一括処理code‘)

ws = book.create_sheet(title=’年別トピックKW’)

# 不要な「Sheet」を削除

del book[‘Sheet’]

# 保存

book.save(‘./中間data/trans_data01.xlsx’)

# コード表書き出し

df20.to_csv(‘./中間data/コード_コード内容対照表2.csv’,encoding=’utf-8′, index=False)

print(‘コード_コード内容対照表2.csvを書き出しました‘)

# dataframearrayに変換

arr1 = df20.values

# Exce(xlsx)に書き出し

# ヘッダ作成

header_list =[[‘特許分類‘,’コード‘,’コード内容‘]]

file_name = ‘./中間data/trans_data01.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘コード対照表‘]

write_list_1d(sheet, header_list, 1, 1)    # ヘッダを1行目1列目に書き込み

write_list_1d(sheet, arr1, 2, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

print(‘trans_data01.xlsxのシート「コード対照表」に「コード対照表」を書き出しました‘)   

# スクリブト25-1  不足IPCの確認

import sys

import pandas as pd

print(”)

print(‘出力サンプル‘)

# コード内容を修正

# IPC分類表.csv読み込み

pat_data6 = pd.read_csv(‘allIPC分類表.csv’, encoding=’utf-8′)

# IPC読み込み

ipc_data6 = pat_data6.iloc[:,2]    # IPC記号

ipcful_list6 = []

for str1 in ipc_data6:

    str1 =str(str1)

#    if ‘B60L11’ in str1: print(str1)

#    str1 = str1.replace(‘ ‘,”)    

    ipcful_list6.append(str1)

print(ipcful_list6[0:5])

# IPC内容読み込み

txt_data6 = pat_data6.iloc[:,4]    # 簡略表記タイトル

txt_list6 = []

for str1 in txt_data6:

    txt_list6.append(str1)

print(txt_list6[0:5])

# 対照表読み込み

code_txt_data = pd.read_excel(‘./中間data/trans_data01.xlsx’,sheet_name=’コード対照表‘) 

print(‘対照表のコード数=’,len(code_txt_data))

# 対照表のIPC読み込み。読み込み時に「/+」以降を「/」に修正

ipc_data7 = code_txt_data.iloc[:,0]    # IPC記号

ipc_list7 = []

for str1 in ipc_data7:

    if ‘/+’ in str1:

        npos = str1.find(‘/+’)

        str1= str1[0: npos +1]

        str1 =str(str1)

    if ‘B60L11’ in str1: print(str1)

#        print(str1)

    ipc_list7.append(str1)

print(ipc_list7[0:5])

# 対照表のコード内容読み込み

code_data7 = code_txt_data.iloc[:,1]    # コード

code_list7 = []

for str1 in code_data7:

    code_list7.append(str1)

print(code_list7[0:5])

# 対照表のコード内容読み込み

text_data7 = code_txt_data.iloc[:,2]    # コード内容

text_list7 = []

for str1 in text_data7:

    text_list7.append(str1)

print(text_list7[0:5])

# 簡略表記タイトル無しを修正

txt_list = []

flg3 = 0

for n1, str1 in enumerate(ipc_list7):

#    print(n1,str1,’=’,code_list7[n1])

    flg1 = 0

    if str1 == ‘無し‘:

        txt_list.append(text_list7[n1])

        flg1 =1

    if str1 == ‘その他‘:

        txt_list.append(text_list7[n1])

        flg1 =1

    if ‘,’ in str1:

        txt_list.append(text_list7[n1])

        flg1 =1    

    if flg1 == 0:

        if str1[-1] == ‘/’:   # 末尾が ‘;’ならば[00]を付加

            str1 = str1 + ’00’        

        for n2, str2 in enumerate(ipcful_list6):

            flg2 = 0

#            str2 = str(str2)

            if str1 in str2:

                str3 = txt_list6[n2]

                txt_list.append(str3)

                flg2 = 1

                break

        if flg2 == 0:

            print(‘IPC内容不明=’,str1)

            flg2 = 1

if flg3 == 1:

            sys.exit()

# DataFrame

df1 = pd.DataFrame(data=ipc_list7, columns=[‘特許分類‘])

df2 = pd.DataFrame(data=code_list7, columns=[‘コード‘])

df3 = pd.DataFrame(data=txt_list, columns=[‘コード内容‘])

# 結合

df4=pd.concat([df1,df2,df3], axis=1)

# コード表書き出し

df4.to_csv(‘./中間data/IPC_code対照表test.csv’,encoding=’utf-8′, index=False)

print(‘IPC_code対照表test.csvを書き出しました‘)   

# スクリブト26  一括処理用のコード表を作成

print(”)

print(‘出力サンプル‘)

# 対照表読み込み

code_txt__data = pd.read_csv(‘./中間data/コード_コード内容対照表.csv’, encoding=’utf-8′) 

print(‘対照表のコード数=’,len(code_txt__data))

# コード読み込み

code_data01 = code_txt__data.iloc[:,1]    # コード( A.A01,A01A・・・)

code_list01 = []

for str1 in code_data01:

    code_list01.append(str1)

print(‘コード[0:5]=’,code_list01[0:5])

# コード内容読み込み

txt_data01 = code_txt__data.iloc[:,2]    # コード内容( 計算;計数・・)

txt_list01 = []

for str1 in txt_data01:

    txt_list01.append(str1)

print(‘コード内容[0:3]=’,txt_list01[0:3])

A_list = []

bcode = ‘A’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        A_list.append(btxt)

    if str1[0] == bcode:

        A_list.append(str1)

print(‘A_list[0:5]=’,A_list[0:5])

B_list = []

bcode = ‘B’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        B_list.append(btxt)

    if str1[0] == bcode:

        B_list.append(str1)

print(‘B_list[0:5]=’,B_list[0:5])

C_list = []

bcode = ‘C’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        C_list.append(btxt)

    if str1[0] == bcode:

        C_list.append(str1)

print(‘C_list[0:5]=’,C_list[0:5])

D_list = []

bcode = ‘D’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        D_list.append(btxt)

    if str1[0] == bcode:

        D_list.append(str1)

print(‘D_list[0:5]=’,D_list[0:5])

E_list = []

bcode = ‘E’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        E_list.append(btxt)

    if str1[0] == bcode:

        E_list.append(str1)

print(‘E_list[0:5]=’,E_list[0:5])

F_list = []

bcode = ‘F’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        F_list.append(btxt)

    if str1[0] == bcode:

        F_list.append(str1)

print(‘F_list[0:5]=’,F_list[0:5])

G_list = []

bcode = ‘G’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        G_list.append(btxt)

    if str1[0] == bcode:

        G_list.append(str1)

print(‘G_list[0:5]=’,G_list[0:5])

H_list = []

bcode = ‘H’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        H_list.append(btxt)

    if str1[0] == bcode:

        H_list.append(str1)

print(‘H_list[0:5]=’,H_list[0:5])

I_list = []

bcode = ‘I’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        I_list.append(btxt)

    if str1[0] == bcode:

        I_list.append(str1)

print(‘I_list[0:5]=’,I_list[0:5])

J_list = []

bcode = ‘J’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        J_list.append(btxt)

    if str1[0] == bcode:

        J_list.append(str1)

print(‘J_list[0:5]=’,J_list[0:5])

K_list = []

bcode = ‘K’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        K_list.append(btxt)

    if str1[0] == bcode:

        K_list.append(str1)

print(‘K_list[0:5]=’,K_list[0:5])

L_list = []

bcode = ‘L’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        L_list.append(btxt)

    if str1[0] == bcode:

        L_list.append(str1)

print(‘L_list[0:5]=’,L_list[0:5])

M_list = []

bcode = ‘M’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        M_list.append(btxt)

    if str1[0] == bcode:

        M_list.append(str1)

print(‘M_list[0:5]=’,M_list[0:5])

N_list = []

bcode = ‘N’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        N_list.append(btxt)

    if str1[0] == bcode:

        N_list.append(str1)

print(‘N_list[0:5]=’,N_list[0:5])

O_list = []

bcode = ‘O’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        O_list.append(btxt)

    if str1[0] == bcode:

        O_list.append(str1)

print(‘O_list[0:5]=’,O_list[0:5])

P_list = []

bcode = ‘P’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        P_list.append(btxt)

    if str1[0] == bcode:

        P_list.append(str1)

print(‘P_list[0:5]=’,P_list[0:5])

Q_list = []

bcode = ‘Q’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        Q_list.append(btxt)

    if str1[0] == bcode:

        Q_list.append(str1)

print(‘Q_list[0:5]=’,Q_list[0:5])

R_list = []

bcode = ‘R’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        R_list.append(btxt)

    if str1[0] == bcode:

        R_list.append(str1)

print(‘R_list[0:5]=’,R_list[0:5])

#1桁コード別に分割し、横に並べた表を作成

Z_list = []

bcode = ‘Z’

ct =0

for n1, str1 in enumerate(code_data01):

    if str1 == bcode:

        btxt = txt_list01[n1]

        Z_list.append(btxt)

    if str1[0] == bcode:

        Z_list.append(str1)

print(‘Z_list[0:5]=’,Z_list[0:5])

# DataFrame

df1 = pd.DataFrame(data=Z_list, columns=[‘その他‘])

df2 = pd.DataFrame(data=A_list)

df3 = pd.DataFrame(data=B_list)

df4 = pd.DataFrame(data=C_list)

df5 = pd.DataFrame(data=D_list)

df6 = pd.DataFrame(data=E_list)

df7 = pd.DataFrame(data=F_list)

df8 = pd.DataFrame(data=G_list)

df9 = pd.DataFrame(data=H_list)

df20 = pd.DataFrame(data=I_list)

df21 = pd.DataFrame(data=J_list)

df22 = pd.DataFrame(data=K_list)

df23 = pd.DataFrame(data=L_list)

df24 = pd.DataFrame(data=M_list)

df25 = pd.DataFrame(data=N_list)

df26 = pd.DataFrame(data=O_list)

df27 = pd.DataFrame(data=P_list)

df28 = pd.DataFrame(data=Q_list)

df29 = pd.DataFrame(data=R_list)

# 結合

df30=pd.concat([df2,df3,df4,df5,df6,df7,df8,df9,df20,df21,df22,df23,df24,df25,

                df26,df27,df28,df29,df1], axis=1)

print(‘データ件数=’,len(df30))

# コード表書き出し

df30.to_csv(‘./中間data/一括処理コード表.csv’,encoding=’utf-8′, index=False)

print(‘一括処理コード表.csvを書き出しました‘)

# dataframearrayに変換

arr1 = df30.values

# Exce(xlsx)に書き出し

file_name = ‘./中間data/trans_data01.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘一括処理code‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

print(‘trans_data01.xlsxに「一括処理コード表」を書き出しました‘) 

# スクリブト27 年別のトピックKWを書き出しは保留(スクリプトは下記に移動)

## トピック数=1とし、高頻度の単語を出力(1トピックX 15word )する。

# 以下は集計処理

## 集計結果はtrans_data.xlsxに書き込み

# スクリプト28 旧データクリアし、Excelに転送するためのtrans_data.xlsxを設定

## trans_data.xlsx」を新規作成する(これにより旧データがクリアされる)

##転送用のシートを追加する。

## テーマ名とコード表をコピーする。

import pandas as pd

import openpyxl

print(”)

print(‘出力サンプル‘)

# ブックを作成

book = openpyxl.Workbook()

# 保存する

book.save(‘trans_data.xlsx’)

# シートを追加

ws = book.create_sheet(title=’テーマ名‘)

ws = book.create_sheet(title=’code‘)

ws = book.create_sheet(title=’年別発行件数集計‘)

ws = book.create_sheet(title=’出願人別集計‘)

ws = book.create_sheet(title=’出願人数年別集計‘)

ws = book.create_sheet(title=’出願人別年別集計‘)

ws = book.create_sheet(title=’メインG別年別集計‘)

ws = book.create_sheet(title=’新規参入集計‘)

ws = book.create_sheet(title=’全サンプル公報‘)

ws = book.create_sheet(title=’最新サンプル公報‘)

ws = book.create_sheet(title=’コード別年別集計‘)

ws = book.create_sheet(title=’一桁年別集計‘)

ws = book.create_sheet(title=’三桁年別集計‘)

ws = book.create_sheet(title=’四桁年別集計‘)

ws = book.create_sheet(title=’六桁年別集計‘)

ws = book.create_sheet(title=’一桁コード別集計‘)

ws = book.create_sheet(title=’三桁コード別集計‘)

ws = book.create_sheet(title=’四桁コード別集計‘)

ws = book.create_sheet(title=’六桁コード別集計‘)

ws = book.create_sheet(title=’コード表‘)

# 不要な「Sheet」を削除

del book[‘Sheet’]

# 保存する

book.save(‘trans_data.xlsx’)

print(‘trans_data.xlsxをクリアしました‘)

# テーマ名読み込み

thema_data = pd.read_excel(‘テーマ設定data.xlsx’,sheet_name=’テーマ名‘) 

thema_data = thema_data.dropna(how=’all’)    # 全列がNaNである行を削除

thema01 = thema_data.iloc[:,0]

thema = thema01[0]

print(‘テーマ名=’,thema)

# テーマ名書き込み

book = openpyxl.load_workbook(‘trans_data.xlsx’)

# シートを取得

sheet = book[‘テーマ名‘]

# セルへ書き込む

sheet[‘A1’] = ‘テーマ名

sheet[‘A2’] = thema

# 保存する

book.save(‘trans_data.xlsx’)

# コード表をコピー

code_data = pd.read_excel(‘./中間data/trans_data01.xlsx’,sheet_name=’コード対照表‘)     # Excel

code_data = code_data.dropna(how=’all’)    # 全列がNaNである行を削除

# 特許分類読み込み

code01 = code_data.iloc[:,0]

code_list01 =[]

for str1 in code01:

    code_list01.append(str1)

print(‘コード数=’,len(code_list01))

print(‘特許分類[0:5]=’,code_list01[0:5])

# コード読み込み

code02 = code_data.iloc[:,1]

code_list02 =[]

for str1 in code02:

    code_list02.append(str1)

# print(‘コード数=’,len(code_list02))

print(‘コード[0:5]=’,code_list02[0:5])

# コード内容読み込み

code03 = code_data.iloc[:,2]

code_list03 =[]

for str1 in code03:

    code_list03.append(str(str1))

print(‘コード内容[0:5]=’,code_list03[0:5])

# DataFrame

df1 = pd.DataFrame(data=code_list01, columns=[‘特許分類‘])

df2 = pd.DataFrame(data=code_list02, columns=[‘コード‘])

df3 = pd.DataFrame(data=code_list03, columns=[‘コード内容‘])

# 結合

df20=pd.concat([df1,df2,df3], axis=1)

print(‘コード件数=’,len(df20))

# dataframearrayに変換

arr1 = df20.values

# Exce(xlsx)に書き出し

# ヘッダ作成

header_list =[[‘特許分類‘,’コード‘,’コード内容‘]]

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘code‘]

write_list_1d(sheet, header_list, 1, 1)    # ヘッダを1行目1列目に書き込み

write_list_1d(sheet, arr1, 2, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

print(‘trans_data.xlsxのシート「code表」に「コード対照表」を書き出しました‘)   

# スクリプト29 出願人名称修正

## 異なる表記の出願人名称を統一するために、変換表を使用して出願人名称を修正する。

import datetime

import numpy as np

import pprint

import sys

print(”)

print(‘出力サンプル‘)

# 出願人名称変換表読み込み

apcon_data = pd.read_excel(‘出願人名称変換表.xlsx’,sheet_name=’出願人名称変換表‘)

df0 = apcon_data

# 元の出願人名称読み込み

apname1_data = apcon_data .iloc[:,0]

ap1_list =[]

for str1 in apname1_data:

    if type(str1) == str:    

        ap1_list.append(str(str1))

# 行数を取得

nyap1 = len(ap1_list)

# 変換後の出願人名称読み込み

apname1_data = apcon_data .iloc[:,1]

ap2_list =[]

for n in range(nyap1):

    str0 = apname1_data[n]

    ap2_list.append(str(str0))  

# 行数を取得

nyap2 = len(ap2_list)

# 行数が不一致ならば終了

if nyap1 != nyap2:

        print(“出願人名称変換表に空白セルがあるので終了します“)

        sys.exit()

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist3.csv’)    # コード付き公報データ読み込み

# 出願人名称の読み込み・修正(ap1_list=元、ap2_list=)

apname_data = pat_data.iloc[:,4]

ap_list = []

for str1 in apname_data:

    if type(str1) == str:

        str0 = str1

        for n,str2 in enumerate(ap1_list):

            if str1 == str2:

                str0 = str0.replace(ap1_list[n],ap2_list[n])    # 出願人名称変換        

        ap_list.append(str(str0))

# 行数を取得

nyap = len(ap_list)

# 公報番号読み込み

patno_data = pat_data.iloc[:,0]

pn_list =[]

for n in range(nyap):

    str0 = patno_data[n]

    pn_list.append(str(str0))

print(‘pn_list[0:1]=’,pn_list[0:1])

# 出願番号読み込み

apno_data = pat_data.iloc[:,1]

an_list =[]

for n in range(nyap):

    str0 = apno_data[n]

    an_list.append(str(str0))

print(‘an_list[0:1]=’,an_list[0:1])

# 発行日読み込み

pd_data = pat_data.iloc[:,2]

pd_list =[]

for n in range(nyap):

    str1= pd_data[n]

    str0 = str(str1)[0:10]

    pd_list.append(str(str0))

print(‘pd_list[0:1]=’,pd_list[0:1])

# 発明の名称読み込み

title_data = pat_data.iloc[:,3]

ti_list =[]

for n in range(nyap):

    str0 = title_data[n]

    ti_list.append(str(str0))

print(‘ti_list[0:1]=’,ti_list[0:1])

# 発明者読み込み

name_data = pat_data.iloc[:,5]

name_list =[]

for n in range(nyap):

    str0 = name_data[n]

    str0 = (str0.replace(“ “, “_”))    # 空白を「_」に置換

    name_list.append(str0)

print(‘name_list[0:1]=’,name_list[0:1])

# IPC読み込み

ipc_data = pat_data.iloc[:,6]

ipc_list =[]

for n in range(nyap):

    str0 = ipc_data[n]

    ipc_list.append(str0)

print(‘ipc_list[0:1]=’,ipc_list[0:1])

# FI読み込み

fi_data = pat_data.iloc[:,7]

fi_list =[]

for n in range(nyap):        

    str0 = fi_data[n]

    str0 = str(str0)

    #データ中の空白を削除

    str0 = (str0.replace(” “, “”))    # 半角空白を削除

    str0 = (str0.replace(“ “, “”))    # 全角空白を削除    

    fi_list.append(str0)

print(‘fi_list[0:1]=’,fi_list[0:1])

# Fターム読み込み

ft_data = pat_data.iloc[:,8]

ft_list =[]

for n in range(nyap):

    str0 = ft_data[n]

    str0 = str(str0)

    #データ中の空白を削除

    str0 = (str0.replace(” “, “”))    # 半角空白を削除

    str0 = (str0.replace(“ “, “”))    # 全角空白を削除

    ft_list.append(str0)

# print(‘ft_list[0:1]=’,ft_list[0:1])

# 分類コード読み込み

code_data = pat_data.iloc[:,9]

cd_list =[]

for n in range(nyap):

    str0 = code_data[n]

    str0 = str(str0)

    #データ中の空白を削除

    str0 = (str0.replace(” “, “”))    # 半角空白を削除

    str0 = (str0.replace(“ “, “”))    # 全角空白を削除

    cd_list.append(str0)

print(‘cd_list[0:1]=’,cd_list[0:1])

# 要約読み込み

abst_data = pat_data.iloc[:,10]

abst_list =[]

for n in range(nyap):

    str0 = abst_data[n]

    str0 = str(str0)    

    #データ中の空白を削除

    str0 = (str0.replace(” “, “”))    # 半角空白を削除

    str0 = (str0.replace(“ “, “”))    # 全角空白を削除

    str0 = (str0.replace(“,”, “”))    # ,」を「、」に置換

    abst_list.append(str0)

print(‘abst_list[0:1]=’,abst_list[0:1])

# DataFrame

df1 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])

df2 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])

df3 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])

df4 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])

df5 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])

df6 = pd.DataFrame(data=name_list, columns=[‘発明者‘])

df7 = pd.DataFrame(data=ipc_list, columns=[‘IPC‘])

df8 = pd.DataFrame(data=fi_list, columns=[‘FI‘])

df9 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])

df10 = pd.DataFrame(data=cd_list, columns=[‘分類コード‘])

df11 = pd.DataFrame(data=abst_list, columns=[‘要約‘])

# 結合

df20=pd.concat([df1, df2, df3, df4, df5, df6, df7, df8, df9, df10, df11], axis=1)

print(‘公報件数=’,len(df20))

# CSVとして書き出し

df20.to_csv(‘./中間data/new_patlist4.csv’,encoding=’utf-8′, index=False)

print(‘new_patlist4.csvを書き出しました‘)

# スクリブト30 年別発行件数

## 開始年から終了年までの数値を作成し、文字に変換し、連続する発行年を作成する。

## 連続する発行年毎に発行件数を集計する。

## 集計した発行年と発行件数とを書き出す。

### file_name = ‘patlist16.xlsx’sheet = wb[‘年別発行件数‘]

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 発行日読み込み

pd_list =[]

for str1 in pd_data:

    if “発行” not in str(str1):

        str0 = str(str1)[0:10]

        pd_list.append(str(str0))

# 最終発行年データ読み取り

max_nengetu = []

for str1 in pd_list:

    if ‘/’ in str1:

        split_str1 = str1.split(‘/’)

        str2 = split_str1[0]

        str3 = split_str1[1]

        if len(str3) == 1:str3 = ‘0’ + str3

        max_nengetu.append(str2 + str3)

    if ‘-‘ in str1:

        split_str1 = str1.split(‘-‘)

        str2 = split_str1[0]

        str3 = split_str1[1]

        if len(str3) == 1:str3 = ‘0’ + str3

        max_nengetu.append(str2 + str3)

# print(max_nengetu[0:5])        

#最終月判定

max_nengetu = max(max_nengetu)    # maxデータを抽出

monthend = max_nengetu[4:6]

print(‘最終月=’,monthend,’‘)

# 追加補正係数nmend

npmend=12/int(monthend) – 1

print(‘追加補正係数=’,npmend)

# 開始年と終了年を判定

min_date = min(pd_list)    # minデータを抽出

pystt = min_date[0:4]         # 4文字(年データ)読み取り

max_date = max(pd_list)    # maxデータを抽出

pyend = max_date[0:4]         # 4文字(年データ)読み取り

print(“開始年=”,pystt, “終了年=”,pyend)

if int(pyend) > 2100:

    print(“公報発行年が2100年以降になっています“)

    sys.exit()

# 連番作成

year_list = list(range(int(pystt),int(pyend)+1))

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list = []

nen_list = []

for str1 in year_list:

    nopy_list.append(str1)

    str1 = str(str1) + ‘

    nen_list.append(str1)

print(“発行年連番=”, nopy_list,type(nopy_list))

print(“発行年=”, nen_list)

nnen = len(nen_list)

print(“調査年数=”, nnen,’‘)

# 表の初期化

nx = 1                         # 0列と1列の2列を設定

ny = len(nopy_list)   # リストの行数を設定

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)]    # 初期化

# 縦軸(発行年)設定

for y, str1 in enumerate(nopy_list):    # 発行年連番のリストから取り出して表の0(先頭列)に書き込む

    arr1[y][0] = str1

# 発行日欄データを発行年に修正しリスト化

pd_data = pat_data.iloc[:,2]    # 発行日欄

py_list01 =[]

for str1 in pd_data:

    if “発行” not in str(str1):    

        nen = str1[0:4]

        str0 = str(nen)

        py_list01.append(str(str0))

# 年別件数を集計

ntate = len(nopy_list)

for y, str1 in enumerate(py_list01):    # 

    for n in range(ntate):

        if arr1[n][0] == int(str1):

            arr1[n][1] +=  1    # 一致すれば出現回数を加算

# 横ヘッダ追加

# 0行目にコピーを挿入

arr1.insert(0,arr1[0][:])

arr1[0][0] = “発行年

arr1[0][1] = “発行件数

# サンプル出力

print(arr1)

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘年別発行件数集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# 棒グラフ作成

import numpy as np

import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams[‘font.family’] = ‘MS PGothic’

# 発行年別の発行件数を集計

nenlast = nnen

list2 = []                               # グラフ用の発行年

list3 = []                               # グラフ用の発行件数

list4 = []                               # 追加件数

list0 = []

for n1, str1 in enumerate(nopy_list):

    if str1!= “発行年“:

        nn = py_list01.count(str(str1)) # 発行件数をカウント        

        list2.append(str1)

        list3.append(float(nn))    # グラフ用にfloatに変更

        if n1 == nenlast – 1:

            nn2 = nn*npmend

            nn2 = round(nn2,1)

            list4.append(nn2)

            list0.append(nn+nn2)

        else:

            list4.append(0)

            list0.append(nn)

print(‘元の件数=’,list3)       

print(‘月数補正後の件数=’,list0) 

# データ設定

labels = list2

data = list3

data2 = list4

# 表示位置設定

x_width = 0.5

x_loc = np.array(range(len(data))) + x_width

# グラフの大きさを設定

fig = plt.figure(figsize=(13.0, 4.0))

# タイトル、ラベルを設定

plt.title(“公報発行件数の年別推移“, fontsize=20)

plt.xlabel(“発行年“, fontsize=18)

plt.ylabel(“発行件数“, fontsize=18)

plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘)    # 棒グラフの設定

if npmend > 0:    # 追加補正係数>0ならば予想件数を表示

    plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘)    # 棒グラフの設定

plt.xticks(x_loc, labels, fontsize=14)                          # x軸にラベル設定

plt.grid()                                                  # 罫線追加

# 追加補正係数>0ならば予想件数を表示

if npmend > 0:

    plt.legend()

# 描画実行

plt.show()

# スクリブト31 出願人別発行件数

## 重複を除去した出願人データを作成する。

## 持分を算出し、出願人毎の発行件数を集計する。

## 集計した出願人と発行件数とを書き出す。

### file_name = ‘patlist16.xlsx’sheet = wb[‘年別発行件数‘]

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 出願人読み込み

apname_data = pat_data.iloc[:,4]

# 全出願人(重複無し)を抽出

list1 =[]

for str1 in apname_data:

    ap_list = str1.split(“;”)    # 分割

    for str2 in ap_list:    # 展開

        list1.append(str2)

list1 = list(set(list1))    # 重複を削除 

# arr1の初期化

nx = 1

ny = len(list1)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)]

# 縦軸書き込み

for y, str1 in enumerate(list1):

    arr1[y][0] = str1

# (出願人+持分)リスト作成

ntate = len(list1)

list2 = []

list3 = []

for str1 in apname_data:

    nap = str1.count(“;”) + 1

    motibun = 1/nap

    str2= str1.split(“;”)

    for n in range(nap):

        list2.append(str2[n])

        list3.append(motibun)  

for y,str1 in enumerate(arr1):

    for n,str2 in enumerate(list2):

        if str2 == arr1[y][0]:

            arr1[y][1] += list3[n]    # 一致すれば持分を加算

# 合計でソート

arr1 = sorted(arr1, key=lambda x:x[1], reverse=True)    # 2列目で逆ソート

# グラフ用にコピー

arr2 = arr1

# 横ヘッダ追加

# 0行目にコピーを挿入

arr1.insert(0,arr1[0][:])

arr1[0][0] = “出願人

arr1[0][1] = “発行件数

# サンプル出力

print(‘arr1[0:5]=’,arr1[0:5][:])

# 書き込み

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘出願人別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# 棒グラフ作成

import numpy as np

import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams[‘font.family’] = ‘MS PGothic’

# ラベルとデータを設定

ntop = 10

ap_list = []

kensu_list = []

for y,str1 in enumerate(arr2):

    ap_list.append(arr2[y][0])

    kensu_list.append(arr2[y][1])

labels = ap_list[1:ntop]

data = kensu_list[1:ntop]

# 表示位置設定

x_width = 0.5

x_loc = np.array(range(len(labels))) + x_width 

# グラフの大きさを設定

fig = plt.figure(figsize=(13.0, 4.0))

# タイトル、ラベルを設定

plt.title(“出願人別の発行件数(上位10)”, fontsize=20)

plt.xlabel(“出願人“, fontsize=18)

plt.ylabel(“発行件数“, fontsize=18)

plt.bar(x_loc, data, width=x_width,color=’C0′)    # 棒グラフの設定

plt.xticks(x_loc, labels, rotation=70,fontsize=14)  # x軸にラベル設定(45度回転)

plt.grid()                                                  # 罫線追加

# 描画実行

plt.show()

# スクリブト32 出願人数年別集計

## 出願人数を年別に集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# 発行日欄データを発行年に修正しリスト化

pd_data = pat_data.iloc[:,2]    # 発行日欄

py_list01 = []

for str1 in pd_data:

    str1 = str1[0:4]

    py_list01.append(str1)    

# 出願人読み込み

apname_data = pat_data.iloc[:,4]

# 全出願人+発行年を抽出

ap_list =[]

for n, str1 in enumerate(apname_data):

    ap_split = str1.split(“;”)    # 分割

    for str2 in ap_split:    # 展開

        str2 =  py_list01[n] + “,” + str2

        ap_list.append(str2)

# 発行年別に出願人の重複を削除

ap_list = list(set(ap_list))    # 重複を削除 

# 4文字のみに修正

list1 = []

for str1 in ap_list:

    str4 = str1[0:4]

    list1.append(str(str4))

# 発行年別の出願人数を集計

nenlast = nnen

ap_list = []

nap_list = []

list3 = []                               # グラフ用の出願人数

list4 = []                               # 追加件数

list5 = []                               # 月数補正後の件数

for n1, str1 in enumerate(nopy_list):    # nopy_list=発行年連番

    if str1!= “発行年“:

        nn = list1.count(str(str1))    # 出願人数をカウント

        ap_list.append(str1)

        nap_list.append(nn)

        list3.append(float(nn))    # グラフ用にfloatに変更

        if n1 == nenlast – 1:

            nn2 = nn*npmend

            nn2 = round(nn2,1)

            list4.append(nn2)

            list5.append(nn+nn2)

        else:

            list4.append(0)

            list5.append(nn)

print(‘元の件数=’,list3)

print(‘月数補正後の件数=’,list5)

# 表の初期化

nx = 1

ny = len(nopy_list)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)]

# 縦軸書き込み

for y, str1 in enumerate(ap_list):

    arr1[y][0] = str1

# 表を作成

for y,str1 in enumerate(arr1):

    for n,str2 in enumerate(ap_list):

        if str2 == arr1[y][0]:

            arr1[y][1] += nap_list[n]    # 一致すれば加算

# 横ヘッダ追加

# 0行目にコピーを挿入

arr1.insert(0,arr1[0][:])

arr1[0][0] = “発行年

arr1[0][1] = “出願人数

# サンプル出力

print(arr1)

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘出願人数年別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# 棒グラフ作成

import numpy as np

import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams[‘font.family’] = ‘MS PGothic’

# データ設定

labels = nopy_list

data = list3

data2 = list4

# 表示位置設定

x_width = 0.5

x_loc = np.array(range(len(data))) + x_width

# グラフの大きさを設定

fig = plt.figure(figsize=(13.0, 4.0))

# plt.title(“Bar Graph”)

plt.title(“出願人数の年別推移“, fontsize=20)

plt.xlabel(“発行年“, fontsize=18)

plt.ylabel(“出願人数“, fontsize=18)

plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘)    # 棒グラフの設定

plt.xticks(x_loc, labels, fontsize=18)                          # x軸にラベル設定

if npmend > 0:    # 追加補正係数>0ならば予想件数を表示

    plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘)    # 棒グラフの設定

plt.grid()                                                  # 罫線追加

# 追加補正係数>0ならば予想件数を表示

if npmend > 0:

    plt.legend()

# 描画実行

plt.show()

# スクリブト33 出願人別年別集計

## 各公報毎に持分を計算し、年別に集計し、出願人毎の発行件数(持分)を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# 出願人(重複なし)リスト作成(縦軸作成)

# 出願人読み込み

apname_data = pat_data.iloc[:,4]

ap_list =[]

for str1 in apname_data:

    str0 = str1 + “,”

    ap_list.append(str(str0))

# 出願人の重複を削除

list1 =[]

for str1 in apname_data:

    ap_split = str1.split(“;”)    # 分割

    for str2 in ap_split:    # 展開

        list1.append(str2)

list1 = list(set(list1))    # 重複を削除 

# 各公報から出願人+発行年+持分をリスト化

list2 =[]

for n, str1 in enumerate(apname_data):

    nap = str1.count(“;”) + 1

    nen = py_list01[n]

    motibun = 1/nap

    ap_split = str1.split(“;”)    # 分割

    for str2 in ap_split:    # 展開

        str3 = str2 + “,” + str(py_list01[n]) + “,” + str(motibun)

        list2.append(str3)

# 表の初期化

nx = len(nopy_list)

ny = len(list1)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(nopy_list):

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(list1):

    arr1[y+1][0] = str1

# 出願人別年別集計

for str1 in list2:

    str2= str1.split(“,”)

    ap =str2[0]

    nen =str2[1]

    motibun = str2[2]

    for y, str3 in enumerate(list1):

        if arr1[y+1][0] == ap:

            for x, str4 in enumerate(nopy_list):

                if arr1[0][x+1] == int(nen):

                    arr1[y+1][x+1] +=  float(motibun)

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# aray1をリスト化

list3 = []

for str1 in arr1:

    list3.append(str1)

# 行列数を算出

ny = len(list1)

nx = len(nopy_list)

# 合計を算出し追加

list4 = []

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]

    str1.append(ntot)

    list4.append(str1)

# 合計でソート

arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “出願人

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:5]=’,arr1[0:5][:]) 

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘出願人別年別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト34-1 新規参入企業抽出

## 最近になって参入してきた出願人の新規度合いを評価し、評価が高かった出願人をリストアップする。

### 調査開始年に発行公報がなかった出願人を抽出する。

### 出願人別年別集計表を作成

### 年平均件数(=横合計件数/(最終年発行開始年))を算出

### 平均増加率を算出

### 平均件数以上でかつ平均増加率以上の出願人を抽出

### 最終年の件数が3件以上でかつ最近に新規参入した出願人を新規参入として抽出

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# 出願人(重複なし)リスト作成(縦軸作成)

# 出願人読み込み

apname_data = pat_data.iloc[:,4]

ap_list =[]

for str1 in apname_data:

    str0 = str1 + “,”

    ap_list.append(str(str0))

# 出願人の重複を削除

list1 =[]

for str1 in apname_data:

    ap_split = str1.split(“;”)    # 分割

    for str2 in ap_split:    # 展開

        list1.append(str2)

list1 = list(set(list1))    # 重複を削除 

# 各公報から出願人+発行年+持分をリスト化

list2 =[]

for n, str1 in enumerate(apname_data):

    nap = str1.count(“;”) + 1

    nen = py_list01[n]

    motibun = 1/nap

    ap_split = str1.split(“;”)    # 分割

    for str2 in ap_split:    # 展開

        str3 = str2 + “,” + str(py_list01[n]) + “,” + str(motibun)

        list2.append(str3)

# 表の初期化

nx = len(nopy_list)

ny = len(list1)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(nopy_list):

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(list1):

    arr1[y+1][0] = str1

# 出願人別年別集計

for str1 in list2: 

    str2= str1.split(“,”)

    ap =str2[0]

    nen =str2[1]

    motibun = str2[2]

    for y, str3 in enumerate(list1):

        if arr1[y+1][0] == ap:

            for x, str4 in enumerate(nopy_list):

                if arr1[0][x+1] == int(nen):

                    arr1[y+1][x+1] +=  float(motibun)

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# aray1をリスト化

list3 = []

for str1 in arr1:

    list3.append(str1)

# 行列数を算出

ny = len(list1)

nx = len(nopy_list)

# 合計を算出し追加

list4 = []

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]

    str1.append(ntot)

    list4.append(str1)

# 合計でソート

arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “出願人

arr1[0].append(“合計“)

# 調査開始年に発行公報が無かった出願人を抽出

list3 = []

for str1 in arr1:

    if type(str1[1]) is float:    # 開始年が0件ならばappend

            if str1[1] == 0:

                list3.append(str1)                

    if type(str1[1]) is int:    # typeintならばヘッダの年と判定しappend

        list3.append(str1)

list3[0][0] = “出願人”    # ヘッダの(0,0)出願人に変更

print(“出願人=”, list3[0:2])

# 横合計を算出

list4 = []

for str1 in list3:

    nx = len(str1)

    xtot = 0

    if type(str1[1]) is not str:

        for x,str2 in enumerate(str1):

            if type(str2) is float:

                xtot = xtot + str2

    list4.append(xtot)

list4[0] = “合計

# 年平均件数(=横合計件数/(最終年発行開始年))を追加

list5 = []

nsokei = 0

heikin = float(0)

ny = 0

for y, str1 in enumerate(list3):

    ny = ny + 1

    if type(str1[1]) is float:

        heikin = list4[y] / (nx-1)

        nsokei = nsokei + heikin    # 年平均件数の合計を算出

        list5.append(heikin)

print(‘年平均件数=’,list5[0:2])      

print(“年平均件数の合計=”,nsokei)

# 全平均件数を算出

pav = nsokei / len(list5)

print(“全平均件数=”,pav) 

# 平均件数以上でかつ平均増加率以上の出願人を抽出

list6 = [list3[0]]

for y,str1 in enumerate(list5):

    if type(str1) is float:

        if str1 > (nsokei / ny):    # 平均件数以上

            if str1 > pav:    # 平均増加率以上

                list6.append(list3[y+1])

        else:

            if list3[y+1][nx-1] >= 3:    # 最終年の件数が3件以上

                if list3[y+1][3] > 0:    # 最近(調査開始年+2)に新規参入

                    list6.append(list3[y+1])

print(‘元表=’,list6[0:2])    # 元表

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘新規参入集計‘]

write_list_1d(sheet, list6, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト34-2 新規参入企業抽出

##  全体の平均件数と増加率を算出する。

##  新規参入出願人による発行件数の縦合計を集計する。

import numpy as np

print(”)

print(‘出力サンプル‘)

nnen = int(pyend) – int(pystt) + 1    # 調査期間

print(‘調査期間=’,nnen,’‘)

print(‘新規候補=’,len(list6),’‘)    # 元表+合計

ntot = 0

for n1, nn1 in enumerate(list6):

    if n1> 0:

        ntot = ntot + nn1[nnen+1]

print(‘新規参入の縦合計=’,ntot)    # 新規参入の縦合計

# 年平均件数(=横合計件数/発行期間(=0件でない年数))を算出

# 横合計欄=nnen+1

navr_list = [‘年平均件数‘]

for n1, nn1 in enumerate(list6):

    if n1> 0:

        # 発行期間(npnen)

        npnen = 0

        for n2, nn2 in enumerate(nn1):

            if n2 < nnen+1:

                if n2 > 0:

                    if nn2 > 0: 

                        npnen = npnen + 1

        if npnen > 1:

            nn01 = round(nn1[nnen+1]/npnen,1)

        else:

            nn01 = 0

        navr_list.append(nn01)

print(‘年平均件数[0:9]=’,navr_list[0:9])

# print(‘年平均件数=’,navr_list)

# 平均増加率(=(最終年前年件数調査開始年翌年件数)/(発行期間(=0件でない年数))を算出

npavr_list = [‘平均増加率‘]

for n1, nn1 in enumerate(list6):

    if n1 >0:

        # 発行期間(npnen)

        npnen = 0

        for n2, nn2 in enumerate(nn1):

            if n2 < nnen+1:

                if n2 > 0:

                    if nn2 > 0: 

                        npnen = npnen + 1

        if npnen > 1:

            np = round(nn1[nnen+1]/npnen,1)

        else:

            np = 0

        np = round(np,1)

        npavr_list.append(np)

print(‘平均増加率[0:9]=’,npavr_list[0:9])

# print(‘平均増加率=’,npavr_list)

# 全年平均件数(=新規参入の縦合計/新規候補者数/調査期間)を算出

nall = (ntot/len(list6))/nnen

print(‘全年平均件数=’,nall)

増加傾向出願人(=平均増加率>0)の全体平均増加率を算出

ntot = 0    # 増加傾向出願人の増加率

npall = 0    # 全体平均増加率

k = 0    # 増加傾向出願人の数

for n1, nn1 in enumerate(navr_list):

    if n1 > 0:

        if nn1 > 0:    # 平均増加率>0

            k=k+1

            ntot = ntot + nn1

npall = ntot/k    # 全体平均増加率

print(‘全体平均増加率=’,npall)

# 全年平均件数以上でかつ全体平均増加率以上の出願人(新規候補)を抽出

# かつ最終年件数+最終年前年の件数>3 (最終年近傍て3件以下は対象外)

newap_list = [‘新規候補フラグ‘]

for n1, nn1 in enumerate(list6):

    if n1 > 0:

        # print(nn1[0] ,’最終年近傍2年の発行件数=’,nn1[nnen] + nn1[nnen-1])

        if (nn1[nnen] + nn1[nnen-1]) > 3:

            bap = 0

            if navr_list[n1] > nall:    # 全年平均件数以上でかつ

                if npavr_list[n1] > npall:   # 全体平均増加率以上ならば

                    bap = 1    # 新規候補フラグ =1

        else:

            bap = 0

        newap_list.append(bap)

print(‘新規候補フラグ[0:9]=’,newap_list[0:9])

# print(‘新規候補フラグ=’,newap_list)

# 発行年評価値(=最先発行年)を算出

fstnen_list = [‘発行年評価値‘]

for n1, nn1 in enumerate(list6):

    if n1 > 0:

        for n2, nn2 in enumerate(nn1):

            if n2 > 0:

                if nn2 > 0:

                    fstnen_list.append(n2+1)

                    break

print(‘発行年評価値[0:9]=’,fstnen_list[0:9])

# 合計件数評価値(=11-合計件数順位)を算出・付与

# 合計件数評価値を付与

k = 11

totrank_list = [‘合計件数評価値‘]

for str1 in list6:

    if k > 0:

        k=k – 1

    else:

        k=0

    totrank_list.append(k)   

print(‘合計件数評価値[0:9]=’,totrank_list[0:9])

# 総合評価値を算出

sogo_list = [‘総合評価値‘]

for nn1 in range(len(fstnen_list)):

    if nn1 > 0:

        nn2 = (fstnen_list[nn1] + totrank_list[nn1])*newap_list[nn1]

        sogo_list.append(nn2)

print(‘総合評価値=’,sogo_list[0:20])

# 元表に追加

df1 = pd.DataFrame(list6)

df2 = pd.DataFrame(data=newap_list, columns=[‘新規候補フラグ‘])

df3 = pd.DataFrame(data=fstnen_list, columns=[‘発行年評価値‘])

df4 = pd.DataFrame(data=totrank_list, columns=[‘合計件数評価値‘])

df5 = pd.DataFrame(data=sogo_list, columns=[‘総合評価値‘])

df6 = pd.concat([df1, df2, df3, df4, df5], axis=1)

# 1行目をコピー

df0 = df6.iloc[0]

# リスト化

arr0 = df0.values

# 1行目を削除

df6 = df6.drop(df6.index[0])

# ソート

df6=df6.sort_values(‘総合評価値‘,ascending=False)

# リスト化

arr6 = df6.values

print(‘新規参入評価表[0:2]=’,arr6[0:2])

# Exceに書き出し

# ヘッダ作成

header_list = [arr0]

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘新規参入集計‘]

write_list_1d(sheet, header_list, 1, 1)    # ヘッダを1行目1列目から書き込み

write_list_1d(sheet, arr6, 2, 1)    # シート名「sheet」の2行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト35 サンプル公報リスト作成

# 全期間の発行公報をサンプリングし、公報番号~要約までの公報リストを作成する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 公報番号読み込み

patno_data = pat_data.iloc[:,0]

kensu = len(patno_data)

pn_list =[]

for str1 in patno_data:

    str0 = str1

    pn_list.append(str(str0))

# 発行日読み込み

pd_data = pat_data.iloc[:,2]

pd_list =[]

for str1 in pd_data:

    if “発行” not in str(str1):    

        str0 = str(str1)[0:10]

        pd_list.append(str(str0))

# 発明の名称読み込み

title_data = pat_data.iloc[:,3]

ti_list =[]

for str1 in title_data:

    str0 = str1

    ti_list.append(str(str0))

# 出願人読み込み

apname_data = pat_data.iloc[:,4]

ap_list =[]

for str1 in apname_data:

    str0 = str1

    ap_list.append(str(str0))

# 発明者読み込み

name_data = pat_data.iloc[:,5]

name_list =[]

for str1 in name_data:

    str1 = str(str1)

    str1 = (str1.replace(“ “, “_”))    # 空白を「_」に置換

    str0 = str(str1)

    name_list.append(str0)

# IPC読み込み

ipc_data = pat_data.iloc[:,6]

ipc_list =[]

for str1 in ipc_data:

    str0 = str(str1)

    ipc_list.append(str0)

# 要約読み込み

abst_data = pat_data.iloc[:,10]

abst_list =[]

for str1 in abst_data:

    if str1 != ‘nan’:

        #データ中の空白を削除

        str1 = (str1.replace(” “, “”))    # 半角空白を削除

        str1 = (str1.replace(“ “, “”))    # 全角空白を削除

        str1 = (str1.replace(“,”, “”))    # ,」を「、」に置換

        abst_list.append(str1)

    else:

        abst_list.append(‘無し。‘)

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# DataFrame

df1 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])

df2 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])

df3 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])

df4 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])

df5 = pd.DataFrame(data=name_list, columns=[‘発明者‘])

df6 = pd.DataFrame(data=ipc_list, columns=[‘IPC‘])

df7 = pd.DataFrame(data=abst_list, columns=[‘要約‘])

# 結合

df20=pd.concat([df1, df2, df3, df4, df5, df6, df7], axis=1)

# ソート

df20 = df20.sort_values(‘発行日‘, ascending=True)    # 昇順

# 全件サンプリング(n=10)

if kensu>10:

    df_allsample = df20.sample(n=10, random_state=0)

    # dataframearrayに変換

    arr1 = df_allsample.values

else:

    arr1 = df20.values

# ヘッダ作成

header_list =[[“公報番号“,”発行日“,”発明の名称“,”出願人“,”発明者“,”IPC“,”要約“]]

# サンプル書き出し

print(“サンプル件数=”,len(arr1))

print(‘header_list=’,header_list)

print(‘arr1[0:1]=’,arr1[0:1])    # 1件出力

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘全サンプル公報‘]

write_list_1d(sheet, header_list, 1, 1)    # ヘッダを1行目1列目に書き込み

write_list_1d(sheet, arr1, 2, 1)    # シート名「sheet」の2行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

print(‘「全サンプル公報」をtrans_data.xlsxに書き出しました‘)

# スクリブト36 最終年発行のサンプル公報リスト作成

## 最終年発行の公報に絞った後にサンプリングし、公報番号~要約までの公報リストを作成する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 公報番号読み込み

patno_data = pat_data.iloc[:,0]

kensu = len(patno_data)

pn_list =[]

for str1 in patno_data:

    str0 = str1

    pn_list.append(str(str0))

# 発行日読み込み

pd_data = pat_data.iloc[:,2]

pd_list =[]

for str1 in pd_data:

    if “発行” not in str(str1):

        str0 = str(str1)[0:10]

        pd_list.append(str(str0))

# 発明の名称読み込み

title_data = pat_data.iloc[:,3]

ti_list =[]

for str1 in title_data:

    str0 = str1

    ti_list.append(str(str0))

# 出願人読み込み

apname_data = pat_data.iloc[:,4]

ap_list =[]

for str1 in apname_data:

    str0 = str1

    ap_list.append(str(str0))

# 発明者読み込み

name_data = pat_data.iloc[:,5]

name_list =[]

for str1 in name_data:

    str1 = str(str1)

    str1 = (str1.replace(“ “, “_”))    # 空白を「_」に置換

    str0 = str(str1)

    name_list.append(str0)

# IPC読み込み

ipc_data = pat_data.iloc[:,6]

ipc_list =[]

for str1 in ipc_data:

    str0 = str(str1)

    ipc_list.append(str0)

# 要約読み込み

abst_data = pat_data.iloc[:,10]

abst_list =[]

for str1 in abst_data:

    # 空白セル(=非数値データ(=nan))を文字(= “data無し“)に置換

    str1 = str(str1)

    #データ中の空白を削除

    str1 = (str1.replace(” “, “”))    # 半角空白を削除

    str1 = (str1.replace(“ “, “”))    # 全角空白を削除

    str1 = (str1.replace(“,”, “”))    # ,」を「、」に置換

    str0 = str(str1)

    abst_list.append(str0)

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# DataFrame

df1 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])

df2 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])

df3 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])

df4 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])

df5 = pd.DataFrame(data=name_list, columns=[‘発明者‘])

df6 = pd.DataFrame(data=ipc_list, columns=[‘IPC‘])

df7 = pd.DataFrame(data=abst_list, columns=[‘要約‘])

# 結合

df20=pd.concat([df1, df2, df3, df4, df5, df6, df7], axis=1)

# ソート

df20 = df20.sort_values(‘発行日‘, ascending=True)    # 昇順

# 最終年サンプリング(n=10)

str1 = str(pyend)

df_nmax0 = (df20[df20[‘発行日‘].str.contains(str1)])

if len(df_nmax0)>10:

    df_nmax1 = df_nmax0.sample(n=10, random_state=0)

    # dataframearrayに変換

    arr2 = df_nmax1.values

else:

    arr2 = df_nmax0.values

# ヘッダ作成

header_list =[[“公報番号“,”発行日“,”発明の名称“,”出願人“,”発明者“,”IPC“,”要約“]]

# サンプル書き出し

print(“件数=”,len(arr2))

print(‘header_list=’,header_list)

print(‘arr2[0:1]=’,arr2[0:1])    # 1件出力

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘最新サンプル公報‘]

write_list_1d(sheet, header_list, 1, 1)    # ヘッダを1行目1列目に書き込み

write_list_1d(sheet, arr2, 2, 1)    # シート名「sheet」の2行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト37 メインG別年別集計

## IPCをメイングループに修正した後に、各メイングループ毎に年別の出現回数を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# IPCメインG(重複なし)リスト作成(縦軸作成)

ipc_data = pat_data.iloc[:,6]

ipc_list =[]

for str1 in ipc_data:

    str0 = str1 + “,”

    ipc_list.append(str(str0))

# IPCをメインGに修正し、重複を削除して縦軸データを作成

list1 =[]

for str1 in ipc_data:

    ipc_split = str1.split(“;”)    # 分割

    for str2 in ipc_split:    # 展開

        str3 = str2.split(“/”)    # /」で分割

        str2 = str3[0] + “/”      # IPCをメインGに修正

        list1.append(str2)

list1 = list(set(list1))    # 重複を削除 

# ソート

list1 = sorted(list1)

# 公報データをメインGに修正(同一公報内の重複は削除)

maing_list = []

for str1 in ipc_data:

    ipc_split = str1.split(“;”)    # 分割

    list0 = []

    for str2 in ipc_split:    # 展開

        str3 = str2.split(“/”)    # /」で分割

        str2 = str3[0] + “/”      # IPCをメインGに修正

        if len(str2) > 5:

            list0.append(str2)

    list0 = list(set(list0))    # 重複を削除 

    maing_list.append(list0)

# 各公報からメインG+発行年+持分をリスト化

list2 =[]

for n, str1 in enumerate(maing_list):

    nparts = len(str1)

    for np in range(nparts):

        ipc = str1[np]

        nen = py_list01[n]

        kaisu = 1

        str3 =  ipc + “,” + str(py_list01[n]) + “,” + str(kaisu)

        list2.append(str3)

# 表の初期化

nx = len(nopy_list)

ny = len(list1)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(nopy_list):

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(list1):

    arr1[y+1][0] = str1

# メインG別年別集計

for str1 in list2: 

    str2= str1.split(“,”)

    ipc =str2[0]

    nen =str2[1]

    for y, str3 in enumerate(list1):    # 重複なし分類コード(縦軸)と照合

        if arr1[y+1][0] == ipc:

            for x, str4 in enumerate(nopy_list):    # 発行年連番(横軸)と照合

                if arr1[0][x+1] == int(nen):

                    arr1[y+1][x+1] +=  1    # 一致すれば出現回数を加算

arr1[0][0] = “メインG”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# arayをリスト化

list3 = []

for str1 in arr1:

    list3.append(str1)

# 行列数を算出

ny = len(list1)

nx = len(nopy_list)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 合計でソート

arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “メインG

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:3]=’,arr1[0:3]) 

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘メインG別年別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト38 コード別年別集計

## 各年毎に各コード(全桁)の出現回数を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# 分類コード(重複なし)リスト作成(縦軸作成)

code_data = pat_data.iloc[:,9]

cd_list =[]

for str1 in code_data:

    str0 = str1 + “,”

    cd_list.append(str(str0))

# 分類コードの重複を削除

list1 =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開

        list1.append(str2)

list1 = list(set(list1))    # 重複を削除 

# ソート

list1 = sorted(list1)

# 各公報からコード+発行年+出現回数をリスト化

list2 =[]

for n, str1 in enumerate(code_data):

    nen = py_list01[n]

    kaisu = 1

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開

        str3 = str2 + “,” + str(py_list01[n]) + “,” + str(kaisu)

        list2.append(str3)

# 表の初期化

nx = len(nopy_list)

ny = len(list1)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(nopy_list):

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(list1):

    arr1[y+1][0] = str1

# コード別年別集計

for str1 in list2:

    str2= str1.split(“,”)

    code =str2[0]

    nen =str2[1]

    motibun = str2[2]

    for y, str3 in enumerate(list1):    # 重複なし分類コード(縦軸)と照合

        if arr1[y+1][0] == code:

            for x, str4 in enumerate(nopy_list):    # 発行年連番(横軸)と照合

                if arr1[0][x+1] == int(nen):

                    arr1[y+1][x+1] +=  float(kaisu)    # 一致すれば出現回数を加算

arr1[0][0] = “分類コード”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# arayをリスト化

list3 = []

for str1 in arr1:

    list3.append(str1)

# 行列数を算出

ny = len(list1)

nx = len(nopy_list)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 分類コードでソート

arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “分類コード

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:3]=’,arr1[0:3]) 

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘コード別年別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト39 一桁コード年別集計

## コードを一桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = []

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# 分類コード(重複なし)リスト作成(縦軸作成)

code_data = pat_data.iloc[:,9]

cd_list =[]

for str1 in code_data:

    str0 = str1 + “,”

    cd_list.append(str(str0))

# 分類コードを一桁に修正し、分類コードの重複を削除

list1 =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開

        str2 = str2[0]    # 分類コードを一桁に修正

        list1.append(str2)

list1 = list(set(list1))    # 重複を削除 

# ソート

list1 = sorted(list1)

# 一桁に修正して重複を削除

bunkatu_list = []

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    list0 = []

    for str2 in code_split:    # 展開

        str2 = str2[0]    # 分類コードを一桁に修正

        list0.append(str2)

    list0 = list(set(list0))    # 重複を削除 

    bunkatu_list.append(list0)

# 各公報からコード+発行年+出現回数をリスト化

list2 =[]

for n, str1 in enumerate(bunkatu_list):

    nparts = len(str1)

    for np in range(nparts):

        code = str1[np]

        nen = py_list01[n]

        kaisu = 1

        str3 =  code + “,” + str(py_list01[n]) + “,” + str(kaisu)

        list2.append(str3)

# 表の初期化

nx = len(nopy_list)

ny = len(list1)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(nopy_list):

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(list1):

    arr1[y+1][0] = str1

# コード別年別集計

for str1 in list2:  

    str2= str1.split(“,”)

    code =str2[0]

    code = code[0]    # 一桁に絞り込み

    nen =str2[1]

    kaisu = str2[2]

    for y, str3 in enumerate(list1):    # 重複なし分類コード(縦軸)と照合

        if arr1[y+1][0] == code:

            for x, str4 in enumerate(nopy_list):    # 発行年連番(横軸)と照合

                if arr1[0][x+1] == int(nen):

                    arr1[y+1][x+1] +=  float(kaisu)    # 一致すれば出現回数を加算

arr1[0][0] = “分類コード”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# arayをリスト化

list3 = []

for str1 in arr1:

    list3.append(str1)

# 行列数を算出

ny = len(list1)

nx = len(nopy_list)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 分類コードでソート

arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “一桁分類コード

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:2]=’,arr1[0:2])

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘一桁年別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト40 三桁コード年別集計

## コードを三桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# 分類コード(重複なし)リスト作成(縦軸作成)

code_data = pat_data.iloc[:,9]

cd_list =[]

for str1 in code_data:

    str0 = str1 + “,”

    cd_list.append(str(str0))

# 分類コードを三桁に修正し、分類コードの重複を削除

list1 =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開

        str2 = str2[0:3]    # 分類コードを三桁に修正

        list1.append(str2)

list1 = list(set(list1))    # 重複を削除 

# ソート

list1 = sorted(list1)

# 三桁に修正して重複を削除

bunkatu_list = []

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    list0 = []

    for str2 in code_split:    # 展開

        str2 = str2[0:3]    # 分類コードを三桁に修正

        list0.append(str2)

    list0 = list(set(list0))    # 重複を削除 

    bunkatu_list.append(list0)

# 各公報からコード+発行年+持分をリスト化

list2 =[]

for n, str1 in enumerate(bunkatu_list):

    nparts = len(str1)

    for np in range(nparts):

        code = str1[np]

        nen = py_list01[n]

        kaisu = 1

        str3 =  code + “,” + str(py_list01[n]) + “,” + str(kaisu)

        list2.append(str3)

# 表の初期化

nx = len(nopy_list)

ny = len(list1)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(nopy_list):

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(list1):

    arr1[y+1][0] = str1

# コード別年別集計

for str1 in list2:

    str2= str1.split(“,”)

    code =str2[0]

    code = code[0:3]    # 三桁に絞り込み

    nen =str2[1]

    motibun = str2[2]

    for y, str3 in enumerate(list1):    # 重複なし分類コード(縦軸)と照合

        if arr1[y+1][0] == code:

            for x, str4 in enumerate(nopy_list):    # 発行年連番(横軸)と照合

                if arr1[0][x+1] == int(nen):

                    arr1[y+1][x+1] +=  float(kaisu)    # 一致すれば出現回数を加算

arr1[0][0] = “分類コード”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# arayをリスト化

list3 = []

for str1 in arr1:

    list3.append(str1)

# 行列数を算出

ny = len(list1)

nx = len(nopy_list)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 分類コードでソート

arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “三桁分類コード

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:2]=’,arr1[0:2])

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘三桁年別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト41 四桁コード年別集計

## コードを四桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# 分類コード(重複なし)リスト作成(縦軸作成)

code_data = pat_data.iloc[:,9]

cd_list =[]

for str1 in code_data:

    str0 = str1 + “,”

    cd_list.append(str(str0))

# 分類コードを四桁に修正し、分類コードの重複を削除

list1 =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開

        str2 = str2[0:4]    # 分類コードを四桁に修正

        list1.append(str2)

list1 = list(set(list1))    # 重複を削除 

# ソート

list1 = sorted(list1)

# 四桁に修正して重複を削除

bunkatu_list = []

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    list0 = []

    for str2 in code_split:    # 展開

        str2 = str2[0:4]    # 分類コードを四桁に修正

        list0.append(str2)

    list0 = list(set(list0))    # 重複を削除 

    bunkatu_list.append(list0)

# 各公報からコード+発行年+持分をリスト化

list2 =[]

for n, str1 in enumerate(bunkatu_list):

    nparts = len(str1)

    for np in range(nparts):

        code = str1[np]

        nen = py_list01[n]

        kaisu = 1

        str3 =  code + “,” + str(py_list01[n]) + “,” + str(kaisu)

        list2.append(str3)

# 表の初期化

nx = len(nopy_list)

ny = len(list1)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(nopy_list):

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(list1):

    arr1[y+1][0] = str1

# コード別年別集計

for str1 in list2:  

    str2= str1.split(“,”)

    code =str2[0]

    code = code[0:4]    # 四桁に絞り込み

    nen =str2[1]

    motibun = str2[2]

    for y, str3 in enumerate(list1):    # 重複なし分類コード(縦軸)と照合

        if arr1[y+1][0] == code:

            for x, str4 in enumerate(nopy_list):    # 発行年連番(横軸)と照合

                if arr1[0][x+1] == int(nen):

                    arr1[y+1][x+1] +=  float(kaisu)    # 一致すれば出現回数を加算

arr1[0][0] = “分類コード”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# arayをリスト化

list3 = []

for str1 in arr1:

    list3.append(str1)

# 行列数を算出

ny = len(list1)

nx = len(nopy_list)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 分類コードでソート

arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “四桁分類コード

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:2]=’,arr1[0:2])

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘四桁年別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト42 六桁コード年別集計

## コードを六桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 開始年と終了年

print(“開始年=”,pystt, “終了年=”,pyend)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# 分類コード(重複なし)リスト作成(縦軸作成)

# 分類コード読み込み

code_data = pat_data.iloc[:,9]

cd_list =[]

for str1 in code_data:

    str0 = str1 + “,”

    cd_list.append(str(str0))

# 分類コードを六桁に修正し、分類コードの重複を削除

list1 =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開

        str2 = str2[0:6]    # 分類コードを六桁に修正

        list1.append(str2)

list1 = list(set(list1))    # 重複を削除 

# ソート

list1 = sorted(list1)

# 六桁に修正して重複を削除

bunkatu_list = []

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    list0 = []

    for str2 in code_split:    # 展開

        str2 = str2[0:6]    # 分類コードを六桁に修正

        list0.append(str2)

    list0 = list(set(list0))    # 重複を削除 

    bunkatu_list.append(list0)

# 各公報からコード+発行年+持分をリスト化

list2 =[]

for n, str1 in enumerate(bunkatu_list):

    nparts = len(str1)

    for np in range(nparts):

        code = str1[np]

        nen = py_list01[n]

        kaisu = 1

        str3 =  code + “,” + str(py_list01[n]) + “,” + str(kaisu)

        list2.append(str3)

# 表の初期化

nx = len(nopy_list)

ny = len(list1)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(nopy_list):

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(list1):

    arr1[y+1][0] = str1

# コード別年別集計

for str1 in list2: 

    str2= str1.split(“,”)

    code =str2[0]

    code = code[0:6]    # 六桁に絞り込み

    nen =str2[1]

    motibun = str2[2]

    for y, str3 in enumerate(list1):    # 重複なし分類コード(縦軸)と照合

        if arr1[y+1][0] == code:

            for x, str4 in enumerate(nopy_list):    # 発行年連番(横軸)と照合

                if arr1[0][x+1] == int(nen):

                    arr1[y+1][x+1] +=  float(kaisu)    # 一致すれば出現回数を加算

arr1[0][0] = “分類コード”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# arayをリスト化

list3 = []

for str1 in arr1:

    list3.append(str1)

# 行列数を算出

ny = len(list1)

nx = len(nopy_list)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 分類コードでソート

arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “六桁分類コード

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:2]=’,arr1[0:2])    # 5件出力

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘六桁年別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト43 コード一桁出願人リスト

## コードを一桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。

### 横軸がコード、縦軸が出願人

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 分類コード(重複なし)リスト作成(縦軸作成)

code_data = pat_data.iloc[:,9]

cd_list =[]

for str1 in code_data:

    str0 = str1

    cd_list.append(str(str0))

# 分類コードを一桁に修正し、重複を削除し、コードヘッダリストを作成

cdhd_list =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開        

        str2 = str2[0:1]            #<<< 分類コードを三桁に修正 >>>

        cdhd_list.append(str2)

cdhd_list = list(set(cdhd_list))    # 重複を削除 

# 出現コードをソート

cdhd_list = sorted(cdhd_list)

# 各行の分類コードを一桁に修正し、同一公報内の分類コードの重複を削除

cddt_list =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    list1 =[]

    for str2 in code_split:    # 展開        

        str2 = str2[0:1]            #<<< 分類コードを一桁に修正 >>>

        list1.append(str2)

    list1 = list(set(list1))    # 重複を削除    

    list1 = sorted(list1)      # 各要素リスト内をソート

    cddt_list.append(list1)

# 出願人別集計結果を読み込み

ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)

# 出願人(重複なし)リスト作成(縦軸作成)

# apname_data = ap_data.iloc[0:20,0]     # 上位20件を読み込み

apname_data = ap_data.iloc[:,0]

aphd_minilist =[]

for str1 in apname_data:

    str0 = str1 + “,”

    aphd_minilist.append(str(str0))

# 各公報から出願人(apname_data)+コード(cddt_list)+出願人数(nap)をリスト化

apname_data = pat_data.iloc[:,4]

apcd_list =[]

for n, str1 in enumerate(apname_data):

    nap = str1.count(“;”) + 1    # 出願人数を算出

    ap_split = str1.split(“;”)     # 出願人を分割

    for n1 in range(nap):           # 分割した出願人毎に処理

        ap_str = ap_split[n1]

        ncd = len(cddt_list[n])          # コード数を算出

        for n2 in range(ncd):          # 分割したコード毎に処理

            str2 = cddt_list[n]             # n行目のコードを読み出し

            str2 = str2[n2]               # n行のn2番目のコードを読み出し(リスト[“A”]文字A)

            apcd_str = ap_str + “,” + str2 + “,” + str(nap)    # 出願人+コード+出願人数を作成

            apcd_list.append(apcd_str)

# 表の初期化(y=重複無し出願人,x=コードヘッダリスト)

ny = len(aphd_minilist)    # 重複無し出願人

nx = len(cdhd_list)    # コードヘッダリスト

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(cdhd_list):    # コードヘッダリスト

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(aphd_minilist):    # 重複無し出願人

    arr1[y+1][0] = str1

# 出願人別コード別集計(出願人+コード=”, apcd_list)

for str1 in apcd_list:    # (出願人+コード=”, apcd_list)  

    str2= str1.split(“,”)

    ap =str2[0]

    code =str2[1]   

    code = code[0:1]             #<<< 一桁に絞り込み >>>

    motibun = 1/int(str2[2])    # 持分を読み込み

    for y, str3 in enumerate(aphd_minilist):    # 重複なし出願人(縦軸)と照合

        bap = arr1[y+1][0].rstrip(“,”)

        if bap == ap:

            for x, str4 in enumerate(cdhd_list):    # コードヘッダリスト(横軸)と照合

                if arr1[0][x+1] == code:

                    arr1[y+1][x+1] +=  float(motibun)    # 一致すれば持分を加算

arr1[0][0] = “出願人”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# 合計を算出

ny = len(aphd_minilist)    # aphd_list:    # 重複なし出願人(縦軸)

nx = len(cdhd_list)            # cdhd_list:    # コードヘッダリスト(横軸)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 合計でソート

arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “出願人

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:2]=’,arr1[0:2])    # 5件出力

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘一桁コード別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト44 コード三桁出願人リスト

## コードを三桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。

### 横軸がコード、縦軸が出願人

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 分類コード(重複なし)リスト作成(縦軸作成)

code_data = pat_data.iloc[:,9]

cd_list =[]

for str1 in code_data:

    str0 = str1

    cd_list.append(str(str0))

# 分類コードを三桁に修正し、重複を削除し、コードヘッダリストを作成

cdhd_list =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開        

        str2 = str2[0:3]            #<<< 分類コードを三桁に修正 >>>

        cdhd_list.append(str2)

cdhd_list = list(set(cdhd_list))    # 重複を削除 

# 出現コードをソート

cdhd_list = sorted(cdhd_list)

# 分類コードが多すぎる場合には終了する

ncode = len(cdhd_list)

if ncode > 255: 

    print(“コード数が255以上になったので終了します“)

    sys.exit()

# 各行の分類コードデータを三桁に修正し、重複を削除

cddt_list =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    list1 =[]

    for str2 in code_split:    # 展開        

        str2 = str2[0:3]            #<<< 分類コードを三桁に修正 >>>

        list1.append(str2)

    list1 = list(set(list1))    # 重複を削除    

    list1 = sorted(list1)      # 各要素リスト内をソート

    cddt_list.append(list1)

# 出願人別集計結果を読み込み

ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)

# 出願人(重複なし)リスト作成(縦軸作成)

# apname_data = ap_data.iloc[0:20,0]     # 上位20件を読み込み

apname_data = ap_data.iloc[:,0]

aphd_minilist =[]

for str1 in apname_data:

    str0 = str1 + “,”

    aphd_minilist.append(str(str0))

# 各公報から出願人(apname_data)+コード(cddt_list)+出願人数(nap)をリスト化

apname_data = pat_data.iloc[:,4]

apcd_list =[]

for n, str1 in enumerate(apname_data):

    nap = str1.count(“;”) + 1    # 出願人数を算出

    ap_split = str1.split(“;”)     # 出願人を分割

    for n1 in range(nap):           # 分割した出願人毎に処理

        ap_str = ap_split[n1]

        ncd = len(cddt_list[n])          # コード数を算出

        for n2 in range(ncd):          # 分割したコード毎に処理

            str2 = cddt_list[n]             # n行目のコードを読み出し

            str2 = str2[n2]               # n行のn2番目のコードを読み出し(リスト[“A”]文字A)

            apcd_str = ap_str + “,” + str2 + “,” + str(nap)    # 出願人+コード+出願人数を作成

            apcd_list.append(apcd_str)

# 表の初期化(y=重複無し出願人,x=コードヘッダリスト)

ny = len(aphd_minilist)    # 重複無し出願人

nx = len(cdhd_list)    # コードヘッダリスト

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(cdhd_list):    # コードヘッダリスト

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(aphd_minilist):    # 重複無し出願人

    arr1[y+1][0] = str1

# 出願人別コード別集計(出願人+コード=”, apcd_list)

for str1 in apcd_list:    # (出願人+コード=”, apcd_list)   

    str2= str1.split(“,”)

    ap =str2[0]

    code =str2[1]

    code = code[0:3]             #<<< 三桁に絞り込み >>>

    motibun = 1/int(str2[2])    # 持分を読み込み

    for y, str3 in enumerate(aphd_minilist):    # 重複なし出願人(縦軸)と照合

        bap = arr1[y+1][0].rstrip(“,”)

        if bap == ap:

            for x, str4 in enumerate(cdhd_list):    # コードヘッダリスト(横軸)と照合

                if arr1[0][x+1] == code:

                    arr1[y+1][x+1] +=  float(motibun)    # 一致すれば持分を加算

arr1[0][0] = “出願人”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# 合計を算出

ny = len(aphd_minilist)    # aphd_list:    # 重複なし出願人(縦軸)

nx = len(cdhd_list)            # cdhd_list:    # コードヘッダリスト(横軸)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 分類コードでソート

arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “出願人

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:2]=’,arr1[0:2])   

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘三桁コード別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト45 コード四桁出願人リスト

## コードを四桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。

### 横軸がコード、縦軸が出願人

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 分類コード(重複なし)リスト作成(縦軸作成)

code_data = pat_data.iloc[:,9]

cd_list =[]

for str1 in code_data:

    str0 = str1

    cd_list.append(str(str0))

# 分類コードを四桁に修正し、重複を削除し、コードヘッダリストを作成

cdhd_list =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開        

        str2 = str2[0:4]            #<<< 分類コードを四桁に修正 >>>

        cdhd_list.append(str2)

cdhd_list = list(set(cdhd_list))    # 重複を削除 

# 出現コードをソート

cdhd_list = sorted(cdhd_list)

# 各行の分類コードデータを四桁に修正し、同一公報内の分類コードの重複を削除

cddt_list =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    list1 =[]

    for str2 in code_split:    # 展開        

        str2 = str2[0:4]            #<<< 分類コードを四桁に修正 >>>

        list1.append(str2)

    list1 = list(set(list1))    # 重複を削除    

    list1 = sorted(list1)      # 各要素リスト内をソート

    cddt_list.append(list1)

# 分類コードが多すぎる場合には終了する

ncode = len(cdhd_list)

if ncode > 255: 

    print(“コード数が255以上になったので終了します“)

    sys.exit()

# 出願人別集計結果を読み込み

ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)                       

# 出願人(重複なし)リスト作成(縦軸作成)

# apname_data = ap_data.iloc[0:20,0]     # 上位20件を読み込み

apname_data = ap_data.iloc[:,0]

aphd_minilist =[]

for str1 in apname_data:

    str0 = str1 + “,”

    aphd_minilist.append(str(str0))

# 各公報から出願人(apname_data)+コード(cddt_list)+出願人数(nap)をリスト化

apname_data = pat_data.iloc[:,4]

apcd_list =[]

for n, str1 in enumerate(apname_data):

    nap = str1.count(“;”) + 1    # 出願人数を算出

    ap_split = str1.split(“;”)     # 出願人を分割

    for n1 in range(nap):           # 分割した出願人毎に処理

        ap_str = ap_split[n1]

        ncd = len(cddt_list[n])          # コード数を算出

        for n2 in range(ncd):          # 分割したコード毎に処理

            str2 = cddt_list[n]             # n行目のコードを読み出し

            str2 = str2[n2]               # n行のn2番目のコードを読み出し(リスト[“A”]文字A)

            apcd_str = ap_str + “,” + str2 + “,” + str(nap)    # 出願人+コード+出願人数を作成

            apcd_list.append(apcd_str)

# 表の初期化(y=重複無し出願人,x=コードヘッダリスト)

ny = len(aphd_minilist)    # 重複無し出願人

nx = len(cdhd_list)    # コードヘッダリスト

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(cdhd_list):    # コードヘッダリスト

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(aphd_minilist):    # 重複無し出願人

    arr1[y+1][0] = str1

# 出願人別コード別集計(出願人+コード=”, apcd_list)

for str1 in apcd_list:    # (出願人+コード=”, apcd_list)

    str2= str1.split(“,”)

    ap =str2[0]

    code =str2[1] 

    code = code[0:4]             #<<< 四桁に絞り込み >>>

    motibun = 1/int(str2[2])    # 持分を読み込み

    for y, str3 in enumerate(aphd_minilist):    # 重複なし出願人(縦軸)と照合

        bap = arr1[y+1][0].rstrip(“,”)

        if bap == ap:

            for x, str4 in enumerate(cdhd_list):    # コードヘッダリスト(横軸)と照合

                if arr1[0][x+1] == code:

                    arr1[y+1][x+1] +=  float(motibun)    # 一致すれば持分を加算

arr1[0][0] = “出願人”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# 合計を算出

ny = len(aphd_minilist)    # aphd_list:    # 重複なし出願人(縦軸)

nx = len(cdhd_list)            # cdhd_list:    # コードヘッダリスト(横軸)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 分類コードでソート

arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “出願人

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:2]=’,arr1[0:2])  

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘四桁コード別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト46 コード六桁出願人リスト

## コードを六桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。

### 横軸がコード、縦軸が出願人

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 分類コード(重複なし)リスト作成(縦軸作成)

code_data = pat_data.iloc[:,9]

cd_list =[]

for str1 in code_data:

    str0 = str1

    cd_list.append(str(str0))

# print(“分類コード欄=”, cd_list)

# 分類コードを六桁に修正し、重複を削除し、コードヘッダリストを作成

cdhd_list =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    for str2 in code_split:    # 展開        

        str2 = str2[0:6]            #<<< 分類コードを六桁に修正 >>>

        cdhd_list.append(str2)

cdhd_list = list(set(cdhd_list))    # 重複を削除 

# 出現コードをソート

cdhd_list = sorted(cdhd_list)

# 各行の分類コードデータを六桁に修正し、同一公報内の分類コードの重複を削除

cddt_list =[]

for str1 in code_data:

    code_split = str1.split(“;”)    # 分割

    list1 =[]

    for str2 in code_split:    # 展開        

        str2 = str2[0:6]            #<<< 分類コードを六桁に修正 >>>

        list1.append(str2)

    list1 = list(set(list1))    # 重複を削除    

    list1 = sorted(list1)      # 各要素リスト内をソート

    cddt_list.append(list1)

# 分類コードが多すぎる場合には終了する

ncode = len(cdhd_list)

if ncode > 255: 

    print(“コード数が255以上になったので終了します“)

    sys.exit()

# 出願人別集計結果を読み込み

ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)

# 出願人(重複なし)リスト作成(縦軸作成)

# apname_data = ap_data.iloc[0:20,0]     # 上位20件を読み込み

apname_data = ap_data.iloc[:,0]

aphd_minilist =[]

for str1 in apname_data:

    str0 = str1 + “,”

    aphd_minilist.append(str(str0))

# 各公報から出願人(apname_data)+コード(cddt_list)+出願人数(nap)をリスト化

apname_data = pat_data.iloc[:,4]

apcd_list =[]

for n, str1 in enumerate(apname_data):

    nap = str1.count(“;”) + 1    # 出願人数を算出

    ap_split = str1.split(“;”)     # 出願人を分割

    for n1 in range(nap):           # 分割した出願人毎に処理

        ap_str = ap_split[n1]

        ncd = len(cddt_list[n])          # コード数を算出

        for n2 in range(ncd):          # 分割したコード毎に処理

            str2 = cddt_list[n]             # n行目のコードを読み出し

            str2 = str2[n2]               # n行のn2番目のコードを読み出し(リスト[“A”]文字A)

            apcd_str = ap_str + “,” + str2 + “,” + str(nap)    # 出願人+コード+出願人数を作成

            apcd_list.append(apcd_str)

# 表の初期化(y=重複無し出願人,x=コードヘッダリスト)

ny = len(aphd_minilist)    # 重複無し出願人

nx = len(cdhd_list)    # コードヘッダリスト

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

# 横軸設定

for x, str1 in enumerate(cdhd_list):    # コードヘッダリスト

    arr1[0][x+1] = str1

# 縦軸設定

for y, str1 in enumerate(aphd_minilist):    # 重複無し出願人

    arr1[y+1][0] = str1

# 出願人別コード別集計(出願人+コード=”, apcd_list)

for str1 in apcd_list:    # (出願人+コード=”, apcd_list)  

    str2= str1.split(“,”)

    ap =str2[0]

    code =str2[1]

    code = code[0:6]             #<<< 六桁に絞り込み >>>

    motibun = 1/int(str2[2])    # 持分を読み込み

    for y, str3 in enumerate(aphd_minilist):    # 重複なし出願人(縦軸)と照合

        bap = arr1[y+1][0].rstrip(“,”)

        if bap == ap:

            for x, str4 in enumerate(cdhd_list):    # コードヘッダリスト(横軸)と照合

                if arr1[0][x+1] == code:

                    arr1[y+1][x+1] +=  float(motibun)    # 一致すれば持分を加算

arr1[0][0] = “出願人”    # ヘッダ設定

# print(arr1)    # 元表

# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

# 1行目をコピー

a1_list = arr1[0][:]

# 1行目を削除

del arr1[0][:]

# 合計を算出

ny = len(aphd_minilist)    # aphd_list:    # 重複なし出願人(縦軸)

nx = len(cdhd_list)            # cdhd_list:    # コードヘッダリスト(横軸)

# 合計を算出し追加

先頭の[]を削除

del arr1[0]

for y,str1 in enumerate(arr1):

    ntot = 0

    for x in range(nx+1):

        if x>0:

            ntot = ntot + arr1[y][x]    # 合計を算出

    str1.append(ntot)    # 合計を追加

# 分類コードでソート

arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)

# 0行目にコピーを挿入

arr1.insert(0, a1_list)

# ヘッダを修正

arr1[0][0] = “出願人

arr1[0].append(“合計“)

# サンプル出力

print(‘arr1[0:2]=’,arr1[0:2])    

# Exceに書き出し

file_name = ‘trans_data.xlsx’

wb = openpyxl.load_workbook(file_name)

def write_list_1d(sheet, l_1d, start_row, start_col):

    for y, row in enumerate(l_1d):

        for x, cell in enumerate(row):

            sheet.cell(row=start_row + y,

                       column=start_col + x,

                       value=l_1d[y][x])

sheet = wb[‘六桁コード別集計‘]

write_list_1d(sheet, arr1, 1, 1)    # シート名「sheet」の1行目1列目からarr1の内容を書き込み

wb.save(file_name)                     # ファイル「file_name」に保存

# スクリブト47  用済みファイルを削除

import os

print(”)

print(‘出力サンプル‘)

os.remove(‘./中間data/class_code.csv’)

os.remove(‘./中間data/class_hindo.csv’)

os.remove(‘./中間data/FI_code.csv’)

os.remove(‘./中間data/FIデータリスト1.csv’)

os.remove(‘./中間data/FIデータリスト2.csv’)

os.remove(‘./中間data/FIデータリスト3.csv’)

os.remove(‘./中間data/FI_hindo.csv’)

os.remove(‘./中間data/FIデータリスト4.csv’)

os.remove(‘./中間data/FIデータリスト5.csv’)

os.remove(‘./中間data/new_patlist2.csv’)

os.remove(‘./中間data/new_patlist3.csv’)

# os.remove(‘./中間data/new_patlist4.csv’)    # この後で使用

# os.remove(‘./中間data/Z_code.csv’)

os.remove(‘./中間data/IPC_code対照表.csv’)

os.remove(‘./中間data/Z_code.csv’)

os.remove(‘./中間data/IPC_code2.csv’)

os.remove(‘./中間data/コード_コード内容対照表.csv’)

os.remove(‘./中間data/コード_コード内容対照表2.csv’)

os.remove(‘./中間data/一括処理コード表.csv’)

# os.remove(‘./中間data/トピックKWリスト.csv’)

os.remove(‘./中間data/FIデータリスト4_2.csv’)

os.remove(‘./中間data/IPC_code.csv’)

os.remove(‘./中間data/IPC_hindo.csv’)

os.remove(‘./中間data/new_patlist.csv’)

os.remove(‘./中間data/subclass_code.csv’)

os.remove(‘./中間data/subclass_hindo.csv’)

os.remove(‘./中間data/FIデータリスト.csv’)

# os.remove(‘./中間data/trans_data01.xlsx’)   # この後で使用

print(‘不要ファイルを削除しました‘)

# 図表、コメント、調査レポートの作成

# スクリブト50   発行年データ読み込み

import pandas as pd

import openpyxl

print(”)

print(‘出力サンプル‘)

# 公報データ読み込み

try:

    pat_data = pd.read_csv(‘分析公報data.csv’, engine =’python’)                   # csv

except UnicodeDecodeError as e:

    pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’shift_jis’)                   # csv

# pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’utf-8′)               # csv

pat_data = pat_data.dropna(how=’all’)    # 全列がNaNである行を削除

print(‘対象公報件数=’,len(pat_data))

# 発行日欄読み込み

pd_data = pat_data.iloc[:,2]

# 発行日読み込み

pd_list =[]

for str1 in pd_data:

    if “発行” not in str(str1):

        str0 = str(str1)[0:10]

        pd_list.append(str(str0))

# 発行日欄データを発行年に修正しリスト化

pd_data = pat_data.iloc[:,2]    # 発行日欄

py_list01 =[]

for str1 in pd_data:

    if “発行” not in str(str1):    

        nen = str1[0:4]

        str0 = str(nen)

        py_list01.append(str(str0))

print(‘発行年データ[0:5]=’,py_list01[0:5])        

# 開始年と終了年を判定

min_date = min(pd_list)    # minデータを抽出

pystt = min_date[0:4]         # 4文字(年データ)読み取り

max_date = max(pd_list)    # maxデータを抽出

pyend = max_date[0:4]         # 4文字(年データ)読み取り

# print(“開始年=”,pystt, “終了年=”,pyend)

if int(pyend) > 2100:

    print(“公報発行年が2100年以降になっています“)

    sys.exit()

# 連番作成

year_list = list(range(int(pystt),int(pyend)+1))

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

print(“発行年連番=”, nopy_list,type(nopy_list))

# スクリブト51  第一章調査の概要を書き出し

## テーマ名からツールソフトまでのコメントを作成し、書き出す。

import pandas as pd

import openpyxl

import docx

from docx import Document

from docx.enum.text import WD_ALIGN_PARAGRAPH

from matplotlib import pyplot as plt

print(”)

print(‘出力サンプル‘)

# 図表Noを初期化

nfig = 0

fig_n = ‘‘ + str(nfig)

nhyo = 0

hyo_n = ‘‘ + str(nhyo)

# テーマ名読み込み

thema_data = pd.read_excel(‘テーマ設定data.xlsx’,sheet_name=’テーマ名‘) 

thema_data = thema_data.dropna(how=’all’)    # 全列がNaNである行を削除

thema01 = thema_data.iloc[:,0]

thema = thema01[0]

print(‘テーマ名=’,thema)

# 年別発行件数読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’年別発行件数集計‘)

# 発行年読み込み

pd_data1 = pd_data.iloc[:,0]

py_list = []

for str1 in pd_data1:

    py_list.append(int(str1)) 

# print(py_list)

# 開始年と終了年を判定

pystt = min(py_list)    # minデータを抽出

pyend = max(py_list)    # maxデータを抽出

print(“開始年=”,pystt, “終了年=”,pyend)

if int(pyend) > 2100:

    print(“公報発行年が2100年以降になっています“)

    sys.exit()

# 開始年と終了年

# print(“開始年=”,pystt, “終了年=”,pyend)

if npmend > 0:

    period = str(pystt) + ‘11日~‘ + str(pyend) + ‘‘ + str(monthend) + ‘月末

else:

    period = str(pystt) + ‘11日~‘ + str(pyend) + ‘1231

# ‘調査目的読み込み

mokuteki_data = pd.read_excel(‘テーマ設定data.xlsx’,sheet_name=’調査目的‘) 

mokuteki_data = mokuteki_data.dropna(how=’all’)    # 全列がNaNである行を削除

# 読み込み

mokuteki01 = mokuteki_data.iloc[:,0]

mokuteki =”

for str1 in mokuteki01:

    str1 = str1 + ‘\n’

    mokuteki = mokuteki + str1

print(‘調査目的=’,mokuteki)

# 初期化

doc = docx.Document()

npara = 0

para = doc.add_paragraph(‘特許出願動向の調査レポート\n’)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(16)    # 16ポイント

para.runs[npara].underline = True    # 下線

para.runs[npara].bold = True    # ポールド

para = doc.add_paragraph(‘第一章 調査の概要‘)

para.alignment = WD_ALIGN_PARAGRAPH.LEFT    # 左揃え

para.runs[npara].font.size = docx.shared.Pt(16)

para.runs[npara].bold = True

para = doc.add_paragraph(‘1調査テーマ‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

para = doc.add_paragraph(‘  ‘ + thema + ‘の特許出願動向‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para = doc.add_paragraph(‘2調査目的‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

wrd = mokuteki

para = doc.add_paragraph(wrd)

para = doc.add_paragraph(‘3調査対象‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

wrd1 = ‘ 対象公報:公開特許公報\n’    # \nで改行を追加

wrd21 = period + ‘の発行\n’

wrd2 = ‘ 対象期間:‘ + wrd21

wrd3 = ‘ 対象技術 : ‘ + thema

wrd =wrd1 + wrd2 + wrd3

para = doc.add_paragraph(wrd)

para = doc.add_paragraph(‘4調査手法‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

wrd1 = ‘ 以下の手順により、対象公報の抽出、コード化、グラフ化、分析を行なっている。\n’

wrd2 = ‘ なお、コード化、グラフ化、分析コメントの作成、本レポートの作成については、すべてpythonにより自動作成している。\n’

wrd = wrd1 + wrd2

para = doc.add_paragraph(wrd)

wrd = ‘1-4-1 検索に使用するIPC、キーワードの抽出

para = doc.add_paragraph(wrd)

para.runs[npara].bold = True

wrd1= ‘ 次の手順により、検索に使用するIPC、キーワードを抽出する。\n’

wrd2 = ‘①インターネットにより調査テーマに関するキーワードを調べる。\n’

wrd3 = ‘②調べたキーワードを検索語句としてキーワード検索により公報を予備検索する。\n’

wrd4 = ‘③上記①と②の検索結果(発明の名称、要約、特許分類(IPC,FI,FT))を整理し、検索に使用するIPCとキーワードを抽出する。\n’

wrd = wrd1 + wrd2 + wrd3 + wrd4

para = doc.add_paragraph(wrd)

wrd = ‘1-4-2 公報データの作成

para = doc.add_paragraph(wrd)

para.runs[npara].bold = True

wrd = ‘ 抽出したIPCとキーワードを組み合わせて検索式を作成し、この検索式により検索し、公報データをダウンロードする。

para = doc.add_paragraph(wrd)

wrd = ‘1-4-3 ノイズ公報データの除去

para = doc.add_paragraph(wrd)

para.runs[npara].bold = True

wrd = ‘ 書誌事項に対してキーワード検索を行を行なってノイズ公報のデータを除去する。

para = doc.add_paragraph(wrd)

wrd = ‘1-4-4 コード付与

para = doc.add_paragraph(wrd)

para.runs[npara].bold = True

wrd1 = ‘ pythonを利用して独自に作成したコード化プログラムによりコード化する。\n’

wrd2 = ‘ コード化の基本的な処理では、出現頻度が高いIPCを抽出し、抽出したIPCに関連が深いIPCをまとめてコードを付与している。

wrd =wrd1 + wrd2

para = doc.add_paragraph(wrd)

wrd = ‘1-4-5 グラフ化および分析

para = doc.add_paragraph(wrd)

para.runs[npara].bold = True

wrd0 = ‘ 分析用公報データの書誌情報と、各公報に付与した分類コードとから以下の各種集計表とグラフを作成し、本テーマの出願動向を分析している。\n’

wrd0_1 = ‘  上記書誌情報の内容は、「公報番号、出願番号、発行日、発明等の名称、出願人・権利者、発明者、IPC、FI、Fターム、要約」である。\n’

wrd1 =’①全体の出願状況\n’

wrd1_1 = ‘ ・公報発行件数の年別推移(縦棒グラフ)\n’

wrd2 = ‘②出願人ベースの分析\n’

wrd2_1 = ‘ ・出願人別発行件数の割合(集計表、円グラフ)\n ‘

wrd2_2 = ‘ ・出願人数の年別推移(縦棒グラフ)\n’

wrd2_3 = ‘  ・出願人別発行件数の年別推移(折線グラフ、バブルチャート)\n’

wrd3 = ‘③メイングループの分析(縦棒グラフ、バブルチャート)\n’

wrd3_1 = ‘ ・メイングループ別発行件数の分布(縦棒グラフ)\n’

wrd3_2 = ‘ ・メイングループ別発行件数の年別推移(バブルチャート)\n’

wrd4 = ‘  新規参入企業(バブルチャート)\n’

wrd5 = ‘⑤最新発行のサンプル公報の概要(書誌リスト、概要)\n’

wrd6 = ‘⑥分類コードベースの分析\n’

wrd6_1 = ‘ ・分類コード別の発行件数割合(集計表、円グラフ)\n’

wrd6_2 = ‘ ・分類コード別発行件数の年別推移(折線グラフ、バブルチャート)\n’

wrd7 = ‘⑦コード別の詳細分析\n’

wrd7_1 = ‘ ・一桁コード別発行件数の年別推移(縦棒グラフ)\n’

wrd7_2 =’ ・一桁コード別出願人別の発行件数割合(集計表、円グラフ)\n’

wrd7_3 =’ ・一桁コード別出願人数の年別推移(縦棒グラフ)\n’

wrd7_4 = ‘ ・一桁コード別出願人別発行件数の年別推移(バブルチャート)\n’

wrd7_5 = ‘ ・一桁コード別新規参入企業(バブルチャート)\n’

wrd7_6 = ‘ ・一桁コード毎の下位コード別の発行件数割合(集計表、円グラフ)\n’

wrd7_7 = ‘ ・一桁コード毎の下位コード別発行件数の年別推移(バブルチャート)\n’

wrd7_8 = ‘  ・(該当公報が有れば)サンプル公報の概要(書誌リスト)\n’

wrd8 = ‘⑧出願人別・コード別の公報発行件数(バブルチャート)\n’

# wrd24 = ‘⑧課題別の年別推移(バブルチャート)\n’

# wrd 25 = ‘⑨トピック分析(発行年別の高頻出キーワードリスト)\n’

wrd01 =wrd0 + wrd0_1 + wrd1 + wrd1_1 + wrd2 + wrd2_1 + wrd2_2 + wrd2_3 + wrd3 + wrd3_1 + wrd3_2

wrd02 = wrd4 + wrd5 + wrd6 + wrd6_1 +wrd6_2 + wrd7 + wrd7_1 + wrd7_2 + wrd7_3

wrd03 = wrd7_4 + wrd7_5 + wrd7_6 + wrd7_7 + wrd7_8 + wrd8 

wrd = wrd01 + wrd02 + wrd03

para = doc.add_paragraph(wrd)

wrd = ‘1-5 バソコン環境

para = doc.add_paragraph(wrd)

para.runs[npara].bold = True

wrd1 = ‘・使用パソコンのOS macOS Catalina\n’

wrd2 = ‘・使用python python 3.8.3\n’

wrd3 = ‘python実行環境 Jupyter Notebook\n’

wrd =wrd1 + wrd2 + wrd3

para = doc.add_paragraph(wrd)

wrd = ‘1-6 ツールソフト(処理内容)’

para = doc.add_paragraph(wrd)

para.runs[npara].bold = True

wrd = ‘・特許出願動向調査_singleV4.ipynb(コーデイング、集計、図表作成、コメント作成、レポート作成)\n’

para = doc.add_paragraph(wrd)

doc.add_page_break()    # 改頁

doc.save(‘report.docx’)

# スクリブト52  2-1 発行件数の年別推移(図表とコメント作成)

import pandas as pd

import numpy as np

import openpyxl

import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams[‘font.family’] = ‘MS PGothic’

import matplotlib.patches as patches

import csv

import copy

print(”)

print(‘出力サンプル‘)

# 図表Noを初期化

nfig = 0

fig_n = ‘‘ + str(nfig)

nhyo = 0

hyo_n = ‘‘ + str(nhyo)

# テーマ名thema読み込み

thema_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’テーマ名‘)

thema_data = thema_data.dropna(how=’all’)    # 全列がNaNである行を削除

thema01 = thema_data.iloc[:,0]

thema = thema01[0]

print(‘テーマ名=’,thema)

# コード表読み込み

code_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’code‘)

code_data = code_data.dropna(how=’all’)    # 全列がNaNである行を削除

# コードcode_list01読み込み

code01 = code_data.iloc[:,1]

code_list01 =[]

for str1 in code01:

    code_list01.append(str1)

print(‘コード数=’,len(code_list01))

print(‘コード[0:5]=’,code_list01[0:5])

# コード内容code_list02読み込み

code02 = code_data.iloc[:,2]

code_list02 =[]

for str1 in code02:

    code_list02.append(str(str1))

print(‘コード内容[0:3]=’,code_list02[0:3])

# 年別発行件数読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’年別発行件数集計‘)

# 年別発行件数nyken_list読み込み

pd_data1 = pd_data.iloc[:,1]

# nenlast = len(pd_data1)

ntot = 0

nyken_list = []

nyken_list2 = []    # 追加件数

nyken_list3 = []     # 合計件数

# for str1 in pd_data1:

for n1, str1 in enumerate(pd_data1):

    nyken_list.append(int(str1)) 

    ntot = ntot + str1

    nn = int(str1)

    if n1 == nenlast – 1:

        nn = nn*npmend    # 月数補正

        nn = round(nn,1)

        nyken_list2.append(nn)

        nyken_list3.append(str1+nn)

    else:

        nyken_list2.append(0)    

        nyken_list3.append(str1)

print(‘発行件数=’,nyken_list)

print(‘追加補正係数=’,npmend)

print(‘追加予想件数=’,nyken_list2)

print(‘合計発行件数=’,nyken_list3)

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

# コメント書き出し

if npmend > 0:

    wrd1 = ‘ ‘ + str(pystt) + ‘年~‘ +str(pyend) + ‘‘ + str(monthend) + ‘月末の間に発行された‘ + thema + ‘に関する分析対象公報の合計件数は‘ + str(ntot) + ‘件であった。\n’

else:

    wrd1 = ‘ ‘ + str(pystt) + ‘年~‘ +str(pyend) + ‘年の間に発行された‘ + thema + ‘に関する分析対象公報の合計件数は‘ + str(ntot) + ‘件であった。\n’

wrd2 = ‘ ‘ + fig_n + ‘はこの分析対象公報を発行年別に集計し、縦棒グラフにしたものである。\n’

if npmend > 0:

    wrd3 = ‘ 調査最終年が12ヶ月未満の場合には、実際の発行件数を青色、その後の発行予想件数を橙色で示している(以下、同じ)\n’

    wrd =wrd1 + wrd2 + wrd3

else:

    wrd =wrd1 + wrd2

print(‘wrd=’,wrd)

wrd2_1_1= wrd

print(fig_n)

# 描画データ設定

labels = py_list

data = nyken_list

data2 = nyken_list2

# 表示位置設定

x_width = 0.5

x_loc = np.array(range(len(data))) + x_width

# グラフの大きさを設定

fig = plt.figure(figsize=(13.0, 4.0))

# タイトル、ラベルを設定

plt.title(“公報発行件数の年別推移“, fontsize=20)

plt.xlabel(“発行年“, fontsize=18)

plt.ylabel(“発行件数“, fontsize=18)

plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘)    # 棒グラフの設定

plt.xticks(x_loc, labels,fontsize=14)                          # x軸にラベル設定

if npmend > 0:    # 追加補正係数>0ならば予想件数を表示

    plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘)   

plt.grid()                                                  # 罫線追加

# 追加補正係数>0ならば予想件数を表示

if npmend > 0:

    plt.legend()

# 棒グラフ内に数値を書く

hx =(ntot/len(data))/30    # 書き込み位置を上に修正

for x, y in zip(x_loc, data):

    plt.text(x, y+hx, y, ha=’center’, va=’bottom’)    # 数値の書き込み位置をhx上に修正

# 図表書き出し

plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

# 描画実行

plt.show()

# 2-1 発行件数年別推移のコメント

# 調査年数nnen算出

nnen = int(pyend) – int(pystt) + 1

# def bargraph_comment実行 / IN=(py_list,nyken_list)OUT=wrd

print(‘list2=’,py_list)    # 発行年

print(‘list3=’,nyken_list)    # 発行件数

print(‘合計発行件数=’,nyken_list3)

wrd = bargraph_comment(py_list,nyken_list3)

# print(‘def_wrd=’,wrd)

# コメント作成

wrd1 = ‘ このグラフによれば、‘ + thema + ‘に関する公報件数は‘ + wrd + ‘\n’

# まとめに追加

wrd2= ‘ 今回の調査テーマ「‘ + thema + ‘」に関する公報件数は‘ + wrd + ‘\n’

f = open(“matome.txt”, “w”)

f.write(str(wrd2) + ‘\n’)

f.close()    

# コメント追加

wrd2 =  ‘ 上記「最終年近傍」は最終年を含む3年としている。\n’ 

wrd3= ‘ 出願時期は、一般的には発行日の1年6ヶ月以前である。\n’ 

wrd = wrd1 + wrd2 + wrd3

# コメント書き出し

print(‘wrd=’,wrd)

wrd2_1_2=wrd

# print(fig_n,’‘,hyo_n)

# スクリブト53  第二章 全体分析 発行件数の年別推移(コメント書き出し)

print(”)

print(‘出力サンプル‘)

# 図表Noの初期値設定

nfig = 0

fig_n = ‘‘ + str(nfig)

nhyo = 0

hyo_n = ‘‘ + str(nhyo)

para = doc.add_paragraph(‘第二章 全体分析‘)

para.runs[npara].font.size = docx.shared.Pt(16)

para.runs[npara].bold = True

para = doc.add_paragraph(‘2-1 発行件数の年別推移‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd2_1_1)

para = doc.add_paragraph(wrd2_1_1)

nfig = nfig+ 1

fig_n = ‘‘ + str(nfig)

print(fig_n)

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(‘ ‘ + wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd2_1_2)

para = doc.add_paragraph(wrd2_1_2)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト54 2-2 出願人別発行件数の割合(図表とコメント作成)

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nhyo = nhyo + 1

hyo_n = ‘‘ + str(nhyo)

wrd1 = ‘ ‘ + hyo_n + ‘は本テーマの分析対象公報を公報発行件数が多い上位10社とその他の出願人について集計した集計表である。\n’

wrd2 = ‘ 件数は持ち分として共同出願人数で按分している。\n’

wrd = wrd1 + wrd2

# コメント書き出し

wrd2_2_1= wrd

print(wrd2_2_1)

# 出願人別集計読み込み

ap_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人別集計‘)

ap_data = ap_data.dropna(how=’all’)    # 全列がNaNである行を削除

nlimit = 10

# 出願人読み込み

ap01 = ap_data.iloc[:,0]

ap01_list =[]

for n1,str1 in enumerate(ap01):    

    if len(str1) > 30:

        str1 = str1[0:29] + ‘\n’+str1[29:59] 

    ap01_list.append(str1)

    if n1>= nlimit-1: break

nap = len(ap01_list)

print(‘出願人数=’,nap)

print(‘出願人名[0:5]=’,ap01_list[0:5])

# 発行件数読み込み

ap02 = ap_data.iloc[:,1]

nap02 = 0

ap02_list =[]

for n1, str1 in enumerate(ap02):

    str1= round(str1,1)

    ap02_list.append(float(str1))

    nap02 = nap02 + str1

    if n1>= nlimit-1: break

# 全発行件数算出

naptot = 0

for str1 in ap02:

    naptot = naptot + float(str1)  

# その他と合計を追加

ap01_list.append(‘その他‘)

ap01_list.append(‘合計‘)

naphoka=round((naptot – nap02),1)    # その他の件数

if naphoka < 0: naphoka = 0

ap02_list.append(naphoka)

naptot01=round(naptot,1)

ap02_list.append(naptot01 )

# %計算

ap03_list = []

for str1 in ap02_list:

    str2 = (str1/naptot)*100

    str2=round(str2,1)

    ap03_list.append(str2) 

# 上位10社の発行件数集計表

df1 = pd.DataFrame(data=ap01_list,columns=[‘出願人‘])

df2 = pd.DataFrame(data=ap02_list,columns=[‘発行件数‘])

df3 = pd.DataFrame(data=ap03_list,columns=[‘%’])

df4 = pd.concat([df1,df2,df3], axis=1)

# 表の作成

nx = 2

ny = len(ap01_list)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)]

# 縦軸設定

for y, str1 in enumerate(ap01_list):

    arr1[y][0] = str1

# 発行年別の発行件数

for y, str1 in enumerate(ap02_list):

    arr1[y][1] = str1

# %追加

for y, str1 in enumerate(ap03_list):

    arr1[y][2] = str1

table_vals = arr1

fig = plt.figure()

ax = fig.add_subplot(111)    # nrowsncolsindexが全て一桁のときは、カンマを省略して111で良い

print(hyo_n)

# 描画

col_labels = [‘出願人‘, ‘発行件数‘,’%’]

the_table = plt.table(cellText=table_vals,

                      colWidths=[0.4, 0.1, 0.1],    # 列の幅を指定

                      colLabels=col_labels,

                      loc=’center’)

the_table.scale(4, 4)

the_table.auto_set_font_size(False)

the_table.set_fontsize(18)

for x in range(3):

    the_table[(0,x)].set_facecolor(‘lightgreen’)    # ヘッダを薄緑色に着色

    the_table[(0,x)].get_text().set_fontsize(’24’)    # フォントサイズ=24

    the_table[(0,x)].get_text().set_fontweight(‘bold’)    # フォント種=bold

for j in range(nap+2):

    the_cell = the_table[j+1,0]

    the_text = the_cell.get_text()

    the_text.set_horizontalalignment(‘center’)

plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)

plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)

for pos in [‘right’,’top’,’bottom’,’left’]:

    plt.gca().spines[pos].set_visible(False)

# 図表書き出し

plt.savefig(‘書き出し図表/’ + hyo_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

plt.show()

# ソート

arr4 = df4.values

arr4 = arr4[0:11]    # 合計を除く

arr4 = sorted(arr4, key=lambda x:x[1], reverse=True)   # 逆順

# 株式会社を空白に置換

ap011_list = []

for str1 in arr4:

    str2 = str1[0].replace(“株式会社“, “”)    # “株式会社を消去

    str2 = str2.replace(“国立大学法人“, “”)    # “国立大学法人を消去

    str2 = str2.replace(“公立大学法人“, “”)    # “公立大学法人を消去

    str2 = str2.replace(“学校法人“, “”)    # “学校法人を消去

    str2 = str2.replace(“地方独立行政法人“, “”)    # “地方独立行政法人を消去

    str2 = str2.replace(“独立行政法人“, “”)    # “独立行政法人を消去

    str2 = str2.replace(“国立研究開発法人“, “”)    # “国立研究開発法人を消去

    str2 = str2.replace(“一般財団法人“, “”)    # “一般財団法人を消去   

    str2 = str2.replace(“公益財団法人“, “”)    # “公益財団法人を消去  

    ap011_list.append(str2)

if naphoka > ap02_list[0]:

    wrd1 = ‘ この集計表によれば、その他を除くと、第1位は

else:

    wrd1 = ‘ この集計表によれば、第1位は

wrd2 = ap01_list[0] + ‘であり、‘    # その他を除く1位の出願人略称

wrd3 = str(ap03_list[0])    # その他を除く1位の%

wrd = wrd1 + wrd2 + wrd3 + ‘%であった。\n’

# まとめに追加

wrd4 = ‘ 出願人別に集計した結果によれば、第1位は‘ +  wrd2 + wrd3 + ‘%であった。

f = open(“matome.txt”, “a”)

f.write(str(wrd4) + ‘\n’)

f.close()  

# コメント書き出し

wrd2_2_2= wrd

arr5 =ap011_list[2:11]    # 2位~10位に絞り込み

wrd4 = ”

for n1, str1 in enumerate(arr5):

    if n1== 0:

        wrd4 = str1

    else:

        wrd4 =wrd4 +  ‘‘ +  str1

wrd4 = wrd4.replace(‘\n’,”)    # 改行を削除

# コメント追加

wrd4 = ‘ 以下、‘ + wrd4

wrd5 =  wrd4 + ‘と続いている。\n’

# まとめに追加

f = open(“matome.txt”, “a”)

f.write(str(wrd5) + ‘\n’)

f.close()  

# コメント書き出し

print(‘wrd=’,wrd)

wrd2_2_3= wrd

# print(fig_n,’‘,hyo_n)

# スクリブト55  2-2 出願人別発行件数の割合(コメント書き出し)

print(”)

print(‘出力サンプル‘)

# コメント書き出し

doc.add_page_break()    # 改頁

para = doc.add_paragraph(‘2-2 出願人別発行件数の割合‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd2_2_1)

para = doc.add_paragraph(wrd2_2_1)

doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)

wrd = hyo_n

para = doc.add_paragraph(‘ ‘ + wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd2_2_2)

para = doc.add_paragraph(wrd2_2_2)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト56  2-2 出願人別円グラフ)(図表とコメント作成)

print(”)

print(‘出力サンプル‘)

# データ読み込み

fig_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人別集計‘)

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

# コメント追加

wrd = ‘ ‘ + fig_n + ‘は上記集計結果を円グラフにしたものである。\n’

print(wrd)

wrd2_2_4 = wrd

# 出願人読み込み

pd_data0 = fig_data.iloc[:,0]

list2 =[]

for str1 in pd_data0:

    list2.append(str1)

# 発行件数読み込み

pd_data1 = fig_data.iloc[:,1]

list3 = []

ntot = 0

for str1 in pd_data1:

    list3.append(str1) 

    ntot = ntot + str1

# 上位10読み込み

n10 = []

ap10 = []

fullap10 = []

ntot10 = 0

for n in range(10):

    n10.append(list3[n])

    ntot10 =ntot10 + list3[n]

    str2 = list2[n].replace(“株式会社“, “”)    # “株式会社を消去

    str2 = str2.replace(“国立大学法人“, “”)    # “国立大学法人を消去

    str2 = str2.replace(“公立大学法人“, “”)    # “公立大学法人を消去

    str2 = str2.replace(“学校法人“, “”)    # “学校法人を消去

    str2 = str2.replace(“地方独立行政法人“, “”)    # “地方独立行政法人を消去

    str2 = str2.replace(“独立行政法人“, “”)    # “独立行政法人を消去

    str2 = str2.replace(“国立研究開発法人“, “”)    # “国立研究開発法人を消去

    str2 = str2.replace(“一般財団法人“, “”)    # “一般財団法人を消去   

    str2 = str2.replace(“公益財団法人“, “”)    # “公益財団法人を消去  

    ap10.append(str2)

    fullap10.append(list2[n])

n10.append(ntot-ntot10)

ap10.append(‘その他‘)

fullap10.append(‘その他‘)

print(fig_n)

# 凡例

hanrei_nm = fullap10    # 出願人名を凡例として格納

# 円グラフ作成

plt.pie(n10, labels=ap10, autopct=”%1.1f%%”,pctdistance=0.9,radius=1.5,

        startangle=90,counterclock=False)

# 円グラフの右横=1.5の位置に高さ=1で描画

plt.legend(hanrei_nm, fontsize=14,bbox_to_anchor=(1.5, 1)) # 凡例の表示

# 図表書き出し

plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

plt.show()

# コメント作成

np = round((ntot10/ntot)*100,1)    # 小数点以下1位で%表示

wrd =  “ このグラフによれば、上位10社で” +  str(np)  + “%を占めている。

m05_wrd01 = ” この上位10社で” +   str(np)  + “%を占めている。

if np<35: 

    wrd = “ このグラフによれば、上位10社だけでは” +  str(np) + “%を占めているに過ぎず、多数の出願人に分散しているようである。

    m05_wrd01 = ” この上位10社だけでは” +   str(np)  + “%を占めているに過ぎず、多数の出願人に分散しているようである。

if np>45: 

    wrd = “ このグラフによれば、上位10社だけで” + str(np) + “%を占めており、少数の出願人に集中しているようである。

    m05_wrd01 = “ この上位10社だけで” + str(np) + “%を占めており、少数の出願人に集中しているようである。

wrd =wrd + ‘\n’

print(wrd)

wrd2_2_5 = wrd

print(‘m05_wrd01=’,m05_wrd01)

# まとめに追加

f = open(“matome.txt”, “a”)

f.write(m05_wrd01+ ‘\n’)

f.close()

# print(fig_n,’‘,hyo_n)

# スクリブト57  2-2 出願人別発行件数の割合(コメント書き出し)

print(”)

print(‘出力サンプル‘)

fig_n = ‘‘ + str(2)

# print(fig_n)

print(wrd2_2_4 )

para = doc.add_paragraph(wrd2_2_4 )    # 第2図は上記集計結果を円グラフ

#No追加

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd2_2_5)

para = doc.add_paragraph(wrd2_2_5)    # このグラフによれば、上位10

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,hyo_n)

# スクリブト58  2-3 出願人数の年別推移(図表とコメント作成)

import numpy as np

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

wrd1 = ‘ ‘ + fig_n + ‘は本テーマの分析対象公報の出願人数を発行年別に集計し、縦棒グラフにしたものである。\n’

wrd2 = ‘ 同じ年の出願人の重複は除去して集計している。\n’

wrd = wrd1 + wrd2

print(‘wrd=’,wrd)

wrd_2_3_1 = wrd

# 年別出願人数読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人数年別集計‘)

# 年別出願人数読み込み

pd_data1 = pd_data.iloc[:,1]

ntot = 0

nyken_list = []

nyken_list2 = []                               # 追加件数

nyken_list3 = []                               # 合計件数

for n1, str1 in enumerate(pd_data1):

    nyken_list.append(str1) 

    ntot = ntot + str1

    if n1 == nenlast – 1:

        nn2 = str1*npmend    # 月数補正

        nn2 = round(nn2,1)

        nyken_list2.append(nn2)

        nyken_list3.append(str1+nn2)

    else:

        nyken_list2.append(0)

        nyken_list3.append(str1)

print(‘出願人数=’,nyken_list)

print(‘追加補正係数=’,npmend)

print(‘追加予想出願人数=’,nyken_list2)

print(‘合計出願人数=’,nyken_list3)

# print(‘出願人数合計=’,ntot)

print(fig_n)

# 描画データ設定

labels = py_list

data = nyken_list

data2 = nyken_list2

# 表示位置設定

x_width = 0.5

x_loc = np.array(range(len(data))) + x_width

# グラフの大きさを設定

fig = plt.figure(figsize=(13.0, 4.0))

# タイトル、ラベルを設定

plt.title(“出願人数の年別推移“, fontsize=20)

plt.xlabel(“発行年“, fontsize=18)

plt.ylabel(“出願人数“, fontsize=18)

plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘)    # 棒グラフの設定

plt.xticks(x_loc, labels, fontsize=14)                          # x軸にラベル設定

if npmend > 0:    # 追加補正係数>0ならば予想件数を表示

    plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘)    # 棒グラフの設定

plt.grid()                                                  # 罫線追加

# 追加補正係数>0ならば予想件数を表示

if npmend > 0:

    plt.legend()

# 棒グラフ内に数値を書く

hx = (ntot/len(data))/30    # 書き込み位置を上に修正

for x, y in zip(x_loc, data):

    plt.text(x, y+hx, y, ha=’center’, va=’bottom’)    # 数値の書き込み位置をhx上に修正

# 図表書き出し

plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

# 描画実行

plt.show()

# def bargraph_comment実行

print(‘list2=’,py_list)    # 発行年

print(‘list3=’,nyken_list)    # 出願人数

print(‘合計出願人数=’,nyken_list3)

wrd = bargraph_comment(py_list,nyken_list3)

# print(wrd)

# 2-3 出願人数年別推移のコメント

wrd = ‘ このグラフによれば、出願人数は‘ + wrd + ‘\n’

print(‘wrd=’,wrd)

# コメントコピー

wrd_2_3_2 = wrd

# print(fig_n,’‘,hyo_n)

# スクリブト59  2-3 出願人数の年別推移(コメント書き出し)

print(”)

print(‘出力サンプル‘)

fig_n = ‘‘ + str(3)

# print(fig_n)

# doc.add_page_break()    # 改頁

para = doc.add_paragraph(‘2-3 出願人数の年別推移‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd_2_3_1)

para = doc.add_paragraph(wrd_2_3_1)    # 第1表は本テーマの分析対象公報

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd_2_3_2)

para = doc.add_paragraph(wrd_2_3_2)    # このグラフによれば、上位10

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト60  2-4 出願人別発行件数の年別推移(折線グラフ)(図表とコメント作成)

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

wrd1 = ‘ ‘ + fig_n + ‘は本テーマに関係する主要出願人の発行件数が年毎にどのように推移しているかを見るためのものであり、

wrd2 = ‘公報発行件数が多い上位10社について公報発行件数を発行年別に集計し、折線グラフにしたものである。\n’

wrd3 = ‘ 件数は持ち分として共同出願人数で按分している。(以下、この注釈は省略する)\n’

wrd = wrd1 + wrd2 + wrd3

print(wrd)

# コメントコピー

wrd_2_4_1 = wrd

# 年別出願人数読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人別年別集計‘)

nclm=(len(pd_data.columns))    # 出願人欄から合計欄まで

# 読み込みデータ全体をDataFrameに変換

df00 = pd.DataFrame(pd_data)

# dataframearrayに変換

arr00 = df00.values

##発行年読み込み

nen_data = pd_data.columns[1:nclm-1]    # 発行年のminからmaxまで

nen_list = []

for str1 in nen_data:

    str1 = str(str1) + ‘

    nen_list.append(str1)

nnen = len(nen_list)

print(‘発行年=’,nen_list)

# ベスト(nbest)設定

nbest=10

## 出願人読み込み

ap_list =[]

for n1, str1 in enumerate(arr00):

    if n1 == nbest: break

    ap_list.append(str1[0])

print(‘出願人=’,ap_list)

## 表内数値読み込み

arr_nxny = []

for n1, str1 in enumerate(arr00):

    if n1 == nbest: break

    list01 = []

    for n2, nn1 in enumerate(str1):

        if n2 > 0:

            nn1 = round(nn1,1)

            if n2 < nnen+1:

                nn1 = round(nn1,1)

                if n2 < nnen+1:

                    list01.append(nn1)

    arr_nxny.append(list01)

print(‘arr_nxny=’,arr_nxny)

# 最終年の件数を補正

nmax = 0

arr01 = []

cd01 = []

nxy_list0 = []

for n1, str1 in enumerate(arr_nxny):

    arr02 = []

    list0 = []

    for n2, str2 in enumerate(str1):

        if str2 > nmax: nmax = str2

        list0.append(str2)

        if (n2+1) == nenlast:

            str2 = str2*(npmend+1)        # 最終年の件数を補正

            str2 = round(str2,1)

            arr02.append(str2)

        else:

            arr02.append(str2)

    arr01.append(arr02)

    nxy_list0.append(list0)

print(‘元の件数=’,nxy_list0)

print(‘月数補正後の件数=’,arr01)

# 変数名修正

nen_list = nen_list

code_list = ap_list

arr_nxny = arr01

g_title = ‘出願人別発行件数の年別推移

# def実行

wrd = ”

wrd01,wrd02 = oresen_comment(nen_list,code_list,arr_nxny,fig_n, g_title)

print(‘wrd01=’,wrd01)

wrd02 = wrd02.replace(‘次のコード‘,’次の出願人‘)

bwd = code_list[0] 

wrd02 = wrd02.replace(bwd,”)

print(‘wrd02=’,wrd02)

# スクリブト61 2-4 出願人別発行件数の年別推移(コメント書き出し)

print(”)

print(‘出力サンプル‘)

para = doc.add_paragraph(‘2-4 出願人別発行件数の年別推移‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd_2_4_1)

para = doc.add_paragraph(wrd_2_4_1)    # ex:4は本テーマに関係する主要出願人の発行件数

para.runs[npara].font.size = docx.shared.Pt(11)

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd01)

para = doc.add_paragraph(wrd01)

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

print(wrd02)

para = doc.add_paragraph(wrd02)    # このグラフによれば、上位10

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

# print(fig_n,’‘,hyo_n)

# スクリブト62  2-4 出願人別発行件数の年別推移(バブルチャート)(図表とコメント作成)

import numpy as np

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

# コメント追加

wrd1 = ‘ ‘ + fig_n + ‘はこの集計結果を数値付きバブルチャートにしたものである。\n’

if npmend > 0:

    wrd2 = ‘ 最終年は発行予想件数を加算した件数を使用している(以下、同じ)\n’

else:

    wrd2 = ”

wrd = wrd1 + wrd2

print(wrd)

# コメントコピー

wrd_2_4_5 = wrd

# 年別出願人数読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人別年別集計‘)

#出願人読み込み

ap_data = pd_data.iloc[:,0]

ap_list =[]

ap_list01 =[]

for n1, str1 in enumerate(ap_data):

    if n1 >= nbest: break 

    ap_list01.append(str1)

    str2 = str1.replace(“株式会社“, “”)    # “株式会社を消去

    str2 = str2.replace(“国立大学法人“, “”)    # “国立大学法人を消去

    str2 = str2.replace(“公立大学法人“, “”)    # “公立大学法人を消去

    str2 = str2.replace(“学校法人“, “”)    # “学校法人を消去

    str2 = str2.replace(“地方独立行政法人“, “”)    # “地方独立行政法人を消去

    str2 = str2.replace(“独立行政法人“, “”)    # “独立行政法人を消去

    str2 = str2.replace(“国立研究開発法人“, “”)    # “国立研究開発法人を消去

    str2 = str2.replace(“一般財団法人“, “”)    # “一般財団法人を消去     

    str2 = str2.replace(“公益財団法人“, “”)    # “公益財団法人を消去 

    ap_list.append(str1)

nnen = len(nen_list)

# 発行件数nxy_list読み込み

nenlast = nnen

nmax = 0

nxy_list = []

nxy_list0= []

for n1 in range(nap):

    if n1 >= nbest:break

    nx_list = []

    nx_list0 = []

    for n2 in range(nnen+1):

        if n2 > 0:       

            str1 = pd_data.iloc[n1,n2]

            str1 = round(str1,1)

            if n2 == nenlast :

                nx_list0.append(str1)

                str1 = str1*(npmend + 1)

                str1 = round(str1,1)

                nx_list.append(str1)

            else:

                nx_list.append(str1)

                nx_list0.append(str1)

            if nmax < int(str1): nmax = int(str1)

    nxy_list.append(nx_list)

    nxy_list0.append(nx_list0)

print(‘元の件数=’,nxy_list0)

print(‘月数補正後の件数=’,nxy_list)

# 変数名変更

x_list = nen_list

y_list = ap_list

print(‘x_list=’,x_list)

print(‘y_list=’,y_list)

print(‘nxy_list=’,nxy_list)

print(fig_n)

# def buble0実行

buble0(x_list,y_list,nxy_list,fig_n)

# 2-4 出願人別発行件数の年別推移(バブルチャート)のコメント

# 最終年が最多の出願人を抽出

nap = len(ap_list)

npk_list = []

pkap_list = []

for n1, str1 in enumerate(ap_list01):

    nxy_list01 = nxy_list[n1]

    np = 0

    for n2, str2 in enumerate(nxy_list01):

        if str2>np: 

            np=str2    # ピーク件数            

            pknen = n2+1    # ピーク年

            if pknen==nnen:    # 最終年がピークならば

                pkap_list.append(str1)

    np = round(np,1)

    npk_list.append(np)

n2 = len(pkap_list)    # 最終年が最多の出願人数

# コメント追加

if n2 > 0:

    wrd1 = ‘ このチャートによれば、次の出願人は最終年が最多となっている。\n’

    # 最終年が最多の出願人書き出し

    wrd2 =”

    for str1 in pkap_list:    # 最終年が最多の出願人

        str1 = “  ” + str1 + “\n”

        wrd2 = wrd2 + str1

    wrd = wrd1 + wrd2

if n2 == 0:

    wrd = ‘ このチャートによれば、最終年が最多となっている出願人は無かった。\n’

# 増加した出願人コピー

wrd_2_4_6 = wrd

print(wrd_2_4_6)

# 重要出願人を抽出

## 最終年の件数が平均以上でかつピーク時の80%以上(ただし0件以外の平均)でかつ増加率が100%以上か

## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要出願人として書出す

#最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出

ct = 0

ntot = 0

nlast_list = []

nmae_list = []

for n in range(nap):

    n0 = nxy_list[n][nnen-1]    # 最終年の件数

    if n0 > 0: ct = ct + 1

    nlast_list.append(n0)

    n1 = nxy_list[n][nnen-2]    # 最終年前年の件数

    nmae_list.append(n1)

    ntot = ntot + n0

if ct > 0:

    navr = round(ntot/ct,1)    # 最終年の平均件数(ただし0件以外の平均)

else:

     navr = 0

print(‘最終年の平均件数=’,navr,’対象件数=’,ct)

# 重要出願人を判定

vipap_list = []

for n1, str1 in enumerate(ap_list01):

    flg = 0

    if nlast_list[n1] > navr:    # 最終年の件数が平均以上

        if nlast_list[n1] > (npk_list[n1]*0.8):    # ピーク時の80%以上

            if nmae_list[n1] > 0:

                if (nlast_list[n1]/nmae_list[n1]) > 1:    #増加率が100%以上

                    vipap_list.append(str1)

                    flg = 1

        if flg == 0:

            if nlast_list[n1] > navr:    # 最終年の件数が平均以上

                if nlast_list[n1] > (npk_list[n1]*0.95):    # ピーク時の95%以上

                    vipap_list.append(str1)            

# コメント追加

wrd1 = ‘ 下記条件を満たす重要出願人は次のとおり。\n’

# 重要出願人書き出し

wrd2 =”

for str1 in vipap_list:

    str1 = “  ” + str1 + “\n”

    wrd2 = wrd2 + str1

wrd = wrd1 + wrd2

if wrd2 != ”:

    wrd = ‘ 下記条件を満たす重要出願人は次のとおり。\n’ + wrd2

else:

    wrd = ‘ 下記条件を満たす重要出願人は無かった。\n’ 

print(wrd)

# 増加した出願人コピー

wrd_2_4_7 = wrd

if wrd2 != ”:

    m08_wrd01 = ‘ 特に、重要と判定された出願人は次のとおり。\n’ + wrd2

else:

    m08_wrd01 = ‘ 特に、重要と判定された出願人は無かった。\n’ 

# まとめに追加

f = open(“matome.txt”, “a”)

f.write(m08_wrd01 + ‘\n’)

f.close()  

# コメント追加

wrd1 = ‘ 最終年の件数が平均以上でかつピーク時の80%以上でかつ増加率が100%以上か、

wrd2 = ‘または最終年の件数が平均以上でかつピーク時の95%以上。以下、この条件を「所定条件」という。\n’

wrd = wrd1 + wrd2

# コピー

wrd_2_4_8 = wrd

print(wrd_2_4_8)

# print(fig_n,’‘,hyo_n)

# スクリブト63  2-4 出願人別発行件数の年別推移(コメント書き出し)

print(”)

print(‘出力サンプル‘)

print(wrd_2_4_5)

para = doc.add_paragraph(wrd_2_4_5)    # 第1表は本テーマの分析対象公報

para.runs[npara].font.size = docx.shared.Pt(11)

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd_2_4_6)

para = doc.add_paragraph(wrd_2_4_6)

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

print(wrd_2_4_7)

para = doc.add_paragraph(wrd_2_4_7)    

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

print(wrd_2_4_8)

para = doc.add_paragraph(wrd_2_4_8)    

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト64  2-5 メイングループ別発行件数の分布(図表とコメント作成)

import numpy as np

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

# コメント追加

wrd = ‘ ‘ + fig_n + ‘はIPCのメイングループ分類別に発行公報を集計し、上位20位までを縦棒グラフにしたものである。\n’

# コメントコピー

wrd_2_5_1 = wrd

print(wrd_2_5_1)

# 年別出願人数読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’メインG別年別集計‘)

# ベストnを設定

nbest = 20

# メインG読み込み

pd_data0 = pd_data.iloc[:,0]

k = 0

maing_list =[]

for str1 in pd_data0:

    k = k + 1

    if k > nbest: break

    str1 = str1 + ’00’

    maing_list.append(str(str1))

# 合計読み込み

pd_data1 = pd_data.iloc[:,nnen+1]

k = 0

ntot = 0

nken_list = []

for nn1 in pd_data1:

    k = k + 1

    if k > nbest: break

    nken_list.append(nn1) 

    ntot = ntot +nn1

# DataFrame

df1 = pd.DataFrame(data=maing_list, columns=[‘メインG‘])

df2 = pd.DataFrame(data=nken_list, columns=[‘メインG別合計件数‘])

# 結合

df3=pd.concat([df1, df2], axis=1)

# メインGでソート

df3 = df3.sort_values(‘メインG‘, ascending=True)    # 昇順

# リストに分解

maing_list01 = df3.iloc[:,0]

nken_list01 = df3.iloc[:,1]

# データ設定

labels = maing_list01

data = nken_list01

# 表示位置設定

x_width = 0.5

x_loc = np.array(range(len(data))) + x_width

print(fig_n)

# グラフの大きさを設定

fig = plt.figure(figsize=(13.0, 4.0))

# タイトル、ラベルを設定

gtitle=”メイングループ別ベスト” + str(nbest) +”の発行件数分布

plt.title(gtitle, fontsize=20)

plt.xlabel(“メイングループ“, fontsize=18)

plt.ylabel(“発行件数“, fontsize=18)

plt.bar(x_loc, data, width=x_width,color=’C0′)    # 棒グラフの設定

# x軸にラベル設定(45度回転)

plt.xticks(x_loc, labels, rotation=45,fontsize=14)                          # x軸にラベル設定

plt.grid()                                                  # 罫線追加

# 棒グラフ内に数値を書く

hx = (ntot/len(data))/30    # 書き込み位置を上に修正

for x, y in zip(x_loc, data):

    plt.text(x, y+hx, y, ha=’center’, va=’bottom’)    # 数値の書き込み位置をhx上に修正

# 図表書き出し

plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

# 描画実行

plt.show()

# 2-5 メイングループ別発行件数の分布(棒グラフ)のコメント

# IPC分類表読み込み

ipc_data = pd.read_excel(‘IPC分類表.xlsx’,sheet_name=’メイングループ表‘)

ipc_data = ipc_data.dropna(how=’all’)    # 全列がNaNである行を削除

maing01 = ipc_data.iloc[:,1]

maing_list01 = maing01[0:]

mgtitle01 =  ipc_data.iloc[:,2]

mgtitle_list01 = mgtitle01[0:]

# 上位メインGに分類内容と件数を結合

mg_title_list =[]

for n1, str1 in enumerate(maing_list):

    for n2, str2 in enumerate(maing_list01):

        if str1 == str2:

            str3 = str1 + “:” + mgtitle_list01[n2] + “(” +str(nken_list[n1]) + “)”

            mg_title_list.append(str3)

mg_title_list = sorted(mg_title_list)

# コメント追加

wrd1 = ‘ これらのメイングループの内容は以下のとおり。\n’

# 上位メインG書き出し

wrd2 =”

for str1 in mg_title_list:    # 上位メインG+分類内容+件数

    str1 = str1 + “\n”

    wrd2 = wrd2 + str1

wrd = wrd1 + wrd2

print(wrd)

# 上位メインGコピー

wrd_2_5_2 = wrd

# 重要メインG(=平均件数以上)を抽出

ntot = 0

for nn1 in nken_list:

    ntot = ntot + nn1

npsum = 0

nlimit = ntot/nbest

mgv_list = []

for n1, nn1 in enumerate(nken_list):

    if nn1 < nlimit: break

    mgv_list.append(maing_list[n1])

nmgv = len(mgv_list)

# 重要メインGに分類内容を結合

mg_title2_list =[]

for n1, str1 in enumerate(mgv_list):

    for n2, str2 in enumerate(maing_list01):

        if str1 == str2:

            str3 = str1 + “:” + mgtitle_list01[n2] + “(” +str(nken_list[n1]) + “)”

            mg_title2_list.append(str3)

            break

mg_title2_list = sorted(mg_title2_list)

# 重要メインG数を書き出し

n2 =nmgv

print(‘重要メインG=’,n2) 

# コメント追加

wrd1 = ‘ この中で比較的多かったのは、次のメイングループである。\n’

# 重要メインG書き出し

wrd2 =”

for str1 in mg_title2_list:    # 重要メインG+分類内容+件数

    str1 = str1 + “\n”

    wrd2 = wrd2 + str1

wrd = wrd1 + wrd2

print(wrd)

# 重要メインGコピー

wrd_2_5_3 = wrd

m09_wrd01 = ‘ IPC別に集計した結果によれば、重要メイングループは次のとおり。\n’ + wrd2

# まとめに追加

f = open(“matome.txt”, “a”)

f.write(m09_wrd01 + ‘\n’)

f.close()

# print(fig_n,’‘,hyo_n)

# スクリブト65  2-5 IPC別発行件数の年別推移(コメント書き出し)

print(”)

print(‘出力サンプル‘)

doc.add_page_break()    # 改頁

para = doc.add_paragraph(‘2-5 メイングループ別発行件数の分布‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd_2_5_1)

para = doc.add_paragraph(wrd_2_5_1)    # 第1表は本テーマの分析対象公報

para.runs[npara].font.size = docx.shared.Pt(11)

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd_2_5_2)

para = doc.add_paragraph(wrd_2_5_2)

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

print(wrd_2_5_3)

para = doc.add_paragraph(wrd_2_5_3)    

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト66  2-6 IPC別発行件数の年別推移(バブルチャート)(図表とコメント作成)

import numpy as np

print(”)

print(‘出力サンプル‘)

# 上位メインG数の設定

nbest = 20

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

# コメント追加

wrd1 = ‘ ‘ + fig_n + ‘はIPCのメイングループ分類別の発行件数を年別に集計し、

wrd2 = ‘上位20位までを数値付きバブルチャートにしたものである。\n’

wrd = wrd1 + wrd2

print(wrd)

# コメントコピー

wrd_2_6_1 = wrd

# メインG数読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’メインG別年別集計‘)

#メインG読み込み

maing_data = pd_data.iloc[:,0]

maing_list =[]

for n1, str1 in enumerate(maing_data):

    if n1 == nbest: break    # nbestでループ終了

    str1 = str1 + ’00’

    maing_list.append(str1)    

nmg=len(maing_list)

# 発行年読み込み

nen_data = pd_data.columns[1:nnen+1]    # 発行年

nen_list = []

for str1 in nen_data:

    str1 = str(str1) + ‘

    nen_list.append(str1)

# カラム数読み込み

nclm=(len(pd_data.columns))

# 発行件数読み込み

nenlast = len(nen_list)

nmax = 0

nxy_list = []

nxy_list0 = []

for n1 in range(nmg):

    nx_list = []

    nx_list0 = []

    for n2 in range(nclm-1):

        if n2>0:

            str1 = pd_data.iloc[n1,n2] 

            if n2 == nenlast :

                nx_list0.append(str1)

                str1 = str1*(npmend + 1)

                str1 = round(str1,1)

                nx_list.append(str1)

            else:

                nx_list.append(str1)

                nx_list0.append(str1)

            if nmax < str1: nmax = str1

    nxy_list.append(nx_list)

    nxy_list0.append(nx_list0)

print(‘元の件数=’,nxy_list0)

print(‘月数補正後の件数=’,nxy_list)

# 変数名変更

x_list = nen_list

y_list = maing_list

print(‘x_list=’,x_list)

print(‘y_list=’,y_list)

print(‘nxy_list=’,nxy_list)

print(fig_n)

# def buble0実行

buble0(x_list,y_list,nxy_list, fig_n)

# 2-6 IPC別発行件数の年別推移(バブルチャート)のコメント

# 最終年が最多のメインGを抽出

nnen = len(nen_list)

nmg =len(maing_list)

npk_list = []

pkmg_list = []

for n1, str1 in enumerate(maing_list):

    nxy_list01 = nxy_list[n1]

    np1 = 0

    for n2, str2 in enumerate(nxy_list01):

        if str2>np1: 

            np1=str2    # ピーク件数            

            pknen = n2+1    # ピーク年

            if pknen==nnen:    # 最終年がピークならば

                pkmg_list.append(str1)

    np = round(np1,1)

    npk_list.append(np1)

# ソート

pkmg_list= sorted(pkmg_list)

# メインGに分類内容と件数を結合

pkmg_title_list =[]

for n1, str1 in enumerate(pkmg_list):

    for n2, str2 in enumerate(maing_list01):

        if str1 == str2:

            str3 = str1 + “:” + mgtitle_list01[n2] + “(” +str(nken_list[n1]) + “)”

            pkmg_title_list.append(str3)

# 最終年が最多のメインG数を書き出し

n2 = len(pkmg_list)

print(‘最終年が最多のメインG=’,n2) 

# コメント追加

flg_n2 = 0

if n2 > 0:

    wrd1 = ‘ このチャートによれば、最終年が最多となっているメイングループは次のとおり。\n’

    # 最終年が最多のメインG書き出し

    wrd2 =”

    for str1 in pkmg_title_list:    # 最終年が最多のメインG

        str1 = str1 + “\n”

        wrd2 = wrd2 + str1

    wrd = wrd1 + wrd2

if n2 == 0:

    wrd = ‘ このチャートによれば、最終年が最多のメイングループはなかった。\n’

# 増加したメインG書き出し

f = open(‘sub_txt.txt’, ‘a’)

f.write(wrd)

f.close()  

wrd_2_6_2 = wrd

print(wrd_2_6_2)

# 重要メインGを抽出

## 最終年の件数が平均以上でかつピーク時の80%以上でかつ増加率が100%以上か

## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要メインGとして書出す

#最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出

ntot = 0

nlast_list = []

nmae_list = []

for n in range(nmg):

    n0 = nxy_list[n][nnen-1]    # 最終年の件数

    nlast_list.append(n0)

    n1 = nxy_list[n][nnen-2]    # 最終年前年の件数

    nmae_list.append(n1)

    ntot = ntot + n0

navr = round(ntot/nmg,1)    # 最終年の平均件数

# 重要メインGを判定

vipmg_list = []

for n1, str1 in enumerate(maing_list):

    flg = 0

    if nlast_list[n1] > navr:    # 最終年の件数が平均以上

        if nlast_list[n1] > (npk_list[n1]*0.8):    # ピーク時の80%以上

            if nmae_list[n1] > 0:

                if (nlast_list[n1]/nmae_list[n1]) > 1:    #増加率が100%以上

                    vipmg_list.append(str1)

                    flg = 1

        if flg == 0:

            if nlast_list[n1] > navr:    # 最終年の件数が平均以上

                if nlast_list[n1] > (npk_list[n1]*0.95):    # ピーク時の95%以上

                    vipmg_list.append(str1)

# ソート

vipmg_list= sorted(vipmg_list)

# メインGに分類内容と件数を結合

vmg_title_list =[]

for n1, str1 in enumerate(vipmg_list):

    for n2, str2 in enumerate(maing_list01):

        if str1 == str2:

            str3 = str1 + “:” + mgtitle_list01[n2] + “(” +str(nken_list[n1]) + “)”

            vmg_title_list.append(str3)

# 重要メインG数を書き出し

n2 = len(vipmg_list)

print(‘重要メインG=’,n2)

# コメント追加

if n2  > 0:

    wrd1 = ‘ 所定条件を満たす重要メインGは次のとおり。\n’

    # 重要出願人書き出し

    wrd2 =”

    for str1 in vmg_title_list:

        str1 = str1 + “\n”

        wrd2 = wrd2 + str1

    wrd = wrd1 + wrd2

if n2  == 0:

    if flg_n2 == 0:

        wrd = ‘ 所定条件を満たす重要メインGはなかった。\n’

    else:

        wrd = ‘ 所定条件を満たす重要メインGもなかった。\n’

# 増加した出願人書き出し

f = open(‘sub_txt.txt’, ‘a’)

f.write(wrd)

f.close()  

print(‘wrd=’,wrd)

wrd_2_6_3 = wrd

# print(fig_n,’‘,hyo_n)

# スクリブト67  2-6 IPC別発行件数の年別推移(コメント書き出し)

print(”)

print(‘出力サンプル‘)

# doc.add_page_break()    # 改頁

para = doc.add_paragraph(‘2-6 メイングループ別発行件数の年別推移‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd_2_6_1)

para = doc.add_paragraph(wrd_2_6_1)    # 第1表は本テーマの分析対象公報

para.runs[npara].font.size = docx.shared.Pt(11)

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd_2_6_2)

para = doc.add_paragraph(wrd_2_6_2)

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

print(wrd_2_6_3)

para = doc.add_paragraph(wrd_2_6_3)    

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト68  2-7 新規参入企業抽出(図表とコメント作成)

import numpy as np

print(”)

print(‘出力サンプル‘)

# 上位10に制限

nbest = 10

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

# コメント追加

wrd1 = ‘ ‘ + fig_n + ‘は分析対象公報全体を対象として各出願人の新規参入評価点を集計し、

wrd2 = ‘評価点が上位の出願人について年別発行件数を数値付きバブルチャートとして示したものである。\n’

wrd3 = ‘ 調査開始年が0件でかつ合計件数と年平均件数が平均以上の出願人を抽出し、

wrd4 = ‘合計件数が上位10社までの年別発行件数を集計した。\n’

wrd5 = ‘ 件数は持ち分として共同出願人数で按分している。

wrd6 = ‘(以下、これらの注釈は省略する。)’

wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5 + wrd6

print(wrd)

# コメントコピー

wrd_2_7_1 = wrd

# 年別出願人数読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’新規参入集計‘)

pd_data = pd_data.dropna(axis=0)

y = len(pd_data)

print(‘y=’,y)

x = len(pd_data.columns)

print(‘x=’,x)

#  nbest,nap修正

if y <= 10: nbest = y

nap = nbest   

print(‘nap=’,nap)

# リスト化

arr1 = pd_data.values

#出願人読み込み

ap_data = pd_data.iloc[:,0]

ap_list =[]

for n1, str1 in enumerate(ap_data):

    if n1 == nbest: break

    ap_list.append(str1)   

# 発行年読み込み

nen_data = pd_data.columns[1:nnen+1] 

nen_list = []

for str1 in nen_data:

    str1 = str(str1) + ‘

    nen_list.append(str1)

nmax = 0

# 発行件数読み込み

nenlast = len(nen_list)

nxy_list = []

nxy_list0 = []

for n1 in range(nap):

    nx_list = []

    nx_list0 = []

    for n2 in range(len(nen_list)+1):

        if n2>0:

            str1 = pd_data.iloc[n1,n2] 

            if n2 == nenlast :

                nx_list0.append(str1)

                str1 = str1*(npmend + 1)

                str1 = round(str1,1)

                nx_list.append(str1)

            else:

                nx_list.append(str1)

                nx_list0.append(str1)

            if nmax < str1: nmax = str1

    nxy_list.append(nx_list)

    nxy_list0.append(nx_list0)

print(‘元の件数=’,nxy_list0)

print(‘月数補正後の件数=’,nxy_list)

# 発行件数%

npxy_list = []

for n1_list in nxy_list:

    npx_list = []

    for n2 in n1_list:

        n3= round(n2/nmax,2)

        npx_list.append(n3)

    npxy_list.append(npx_list)

# 変数名変更

x_list = nen_list

y_list = ap_list

print(‘x_list=’,x_list)

print(‘y_list=’,y_list)

print(‘nxy_list=’,nxy_list)

print(fig_n)

# def実行

buble0(x_list,y_list,nxy_list, fig_n)

# 新規参入企業として重要と判定された出願人(最終年の件数>=3)を判定

# 最終年の件数読み込み

nken_data = pd_data.iloc[:,x-6]    # 最終年の件数

nken_list =[]

for str1 in nken_data:

    nken_list.append(str1)

newap_list = []

for n1,  nn1 in enumerate(nken_list):

    if n1 == nbest: break

    if nn1 >= 3:    # 重要と判定

        newap_list.append(ap_list[n1])

print(‘重要と判定された新規参入企業=’,n2,newap_list)

# コメント追加

wrd2 =”

if n2 > 1:

    wrd1 = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)は次のとおり。\n’

    # 出願人書き出し

    wrd2 =”

    for str1 in newap_list:

        str1 = “ ” + str1 + “\n”

        wrd2 = wrd2 + str1

    wrd = wrd1 + wrd2

    print(wrd)

    # コメント書き出し

    wrd3 = ‘ ここでは最終年の件数 > 3を重要とした。\n’

    wrd = wrd + wrd3

    wrd_2_7_2 = wrd

    m10_wrd01 = ‘ 重要と判定された新規参入企業(出願人)は次のとおり。\n’ + wrd2

    # まとめに追加

    f = open(“matome.txt”, “a”)

    f.write(m10_wrd01 + ‘\n’)

    f.close()

if  n2 <= 1:

    if flg_n2 == 1:    # チャートが無ければ

        wrd = ‘ 新規参入企業として評価が高かった出願人は無かった。\n’

    else:

        wrd = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)は無かった。\n’

    # コメント書き出し

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    print(‘wrd=’,wrd)    

    # 出願人コピー

    wrd_2_7_2 = wrd

    m10_wrd01 = ‘ 重要と判定された新規参入企業(出願人)は無かった。\n’ 

    # まとめに追加

    f = open(“matome.txt”, “a”)

    f.write(m10_wrd01 + ‘\n’)

    f.close()

if n2 == 0:

    wrd1 = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)はなかった。\n’

    wrd = wrd1

    print(wrd)

    # 出願人コピー  

    wrd_2_7_2 = wrd

# print(fig_n,’‘,hyo_n)

# スクリブト69  2-7 新規参入企業(コメント書き出し)

print(”)

print(‘出力サンプル‘)

doc.add_page_break()    # 改頁

para = doc.add_paragraph(‘2-7 新規参入企業‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd_2_7_1)

para = doc.add_paragraph(wrd_2_7_1)    # 第1表は本テーマの分析対象公報

para.runs[npara].font.size = docx.shared.Pt(11)

# 図表書き出し

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd_2_7_2)

para = doc.add_paragraph(wrd_2_7_2)    

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト70  2-8最新発行のサンプル公報(図表とコメント作成)

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nhyo = nhyo + 1

hyo_n = ‘‘ + str(nhyo)

# コメント追加

wrd = ‘ ‘ + hyo_n + ‘は最近発行された公報の書誌事項をまとめた公報書誌リストである。

print(wrd)

# コメントコピー

wrd_2_8_1 = wrd

# 年別出願人数読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’最新サンプル公報‘)

y = len(pd_data)

x = len(pd_data.columns)

nclm = 4    # 書き出すカラム数を設定

arr1 = pd_data.values    # リスト化

#公報番号読み込み

pn_data = pd_data.iloc[:,0]

pn_list =[]

for n1, str1 in enumerate(pn_data):

    pn_list.append(str1)    

npn=len(pn_list)

print(‘サンプル公報数=’,npn)

# 発行日読み込み

date_data = pd_data.iloc[:,1]

date_list = []

for str1 in date_data:

    date_list.append(str1)

# 発明の名称読み込み(30文字/行までに制限)

title_data = pd_data.iloc[:,2]

title_list = []

fulltitle_list = []

for str1 in title_data:

    fulltitle_list.append(str1)  

    if len(str1) > 30:

        if len(str1) < 60:    # 行を下げるために先頭に ‘\n’ 

            str1 =  ‘\n’ + str1[:29] + ‘\n’ + str1[29:58]   # 30文字で折り返し(90文字以上は表示せず)  

    if len(str1) > 59:

        if len(str1) < 90:

            str1 = str1[:29] + ‘\n’ + str1[29:58]  +  ‘\n’ + str1[58:87]      # 30文字で折り返し  

        else:    # (91文字以上は表示せず

            str1 = str1[:29] + ‘\n’ + str1[29:58]  +  ‘\n’ + str1[58:90] + ‘・・・‘   

    title_list.append(str1)

# 出願人読み込み

ap_data = pd_data.iloc[:,3]

ap_list = []

fullap_list = []

for str1 in ap_data:

    fullap_list.append(str1)

    ap_list.append(str1)

# 要約読み込み(500文字までに制限。不要文字を削除)

abst_data = pd_data.iloc[:,6]

abst_list = []

for str1 in abst_data:

    str0 = str1.split(‘【選択図】‘)    # 【選択図】で分割

    str1 = str0[0]    # 【選択図】より前を残す

    str1 = str(str1)

    if len(str1) > 3:

        #データ中の空白を削除

        str1 = (str1.replace(” “, “”))    # 半角空白を削除

        str1 = (str1.replace(“ “, “”))    # 全角空白を削除

        str1 = (str1.replace(“,”, “”))    # ,」を「、」に置換        

        str1 = (str1.replace(“(57)”, “”))    # (57)」を削除

        str1 = (str1.replace(“【要約】“, “”))    # 「【要約】」を削除

        str1 = (str1.replace(“(修正有)“, “”))    # 「(修正有)」をを削除

        str1 = (str1.replace(“【課題】“, “”))    # 「【課題】」をを削除        

        abst_list.append(str1)

    else:

        abst_list.append(‘要約無し‘)

# DataFrame

df1 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])

df2 = pd.DataFrame(data=date_list, columns=[‘発行日‘])

df3 = pd.DataFrame(data=title_list, columns=[‘発明の名称‘])

df4 = pd.DataFrame(data=ap_list, columns=[‘発明の名称‘])

# 横方向(axis=1)に結合

df5=pd.concat([df1, df2, df3, df4], axis=1)

# 表の作成

nx = 3

ny = len(ap_list)

arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)]

# 公報番号

for y, str1 in enumerate(pn_list):

    str1 = str1[0:6] + ‘\n’+ str1[6:]    # 7文字で折り返し

    arr1[y][0] = str1

# 発行日

for y, str1 in enumerate(date_list):

    arr1[y][1] = str1

# 発明の名称

for y, str1 in enumerate(title_list):

    arr1[y][2] = str1

# 出願人

for y, str1 in enumerate(ap_list):

    if len(str1) > 8:

        str1 = str1[0:8] + ‘\n’ + str1[8:17]   # 9文字で折り返し(17文字以上は表示せず)

    arr1[y][3] = str1

table_vals = arr1   # サンプル公報のテーブル値

fig = plt.figure()  

ax = fig.add_subplot()

head_list = [‘公報番号‘,’発行日‘,’発明の名称‘,’出願人‘] 

col_labels = head_list    # ヘッダ設定

the_table = plt.table(cellText=table_vals,    # トップ10のテーブル値

                      colWidths=[0.1, 0.1, 0.52, 0.16],    # 列の幅を指定

                      colLabels=col_labels,    # ヘッダを指定

                      loc=’center’)

the_table.scale(4, 6)    # 全体のサイズをX=5Y=15に設定

the_table.auto_set_font_size(False)

the_table.set_fontsize(22)    # 全体が縮小されたのでフォントサイズを拡大

# ヘッダを着色

for x in range(nclm):

    the_table[(0,x)].set_facecolor(‘lightgreen’)    # ヘッダを薄緑色に着色

    the_table[(0,x)].get_text().set_fontsize(’30’)    # フォントサイズ=60

    the_table[(0,x)].get_text().set_fontweight(‘bold’)    # フォント種=bold

# 先頭列の文字位置を設定

for j in range(npn):

    the_cell = the_table[j+1,0]

    the_text = the_cell.get_text()

    the_text.set_horizontalalignment(‘left’)

# 3列目の文字位置を設定

for j in range(npn):

    the_cell = the_table[j+1,2]

    the_text = the_cell.get_text()

    the_text.set_horizontalalignment(‘left’)

# 4列目の文字位置を設定

for j in range(npn):

    the_cell = the_table[j+1,3]

    the_text = the_cell.get_text()

    the_text.set_horizontalalignment(‘left’)

plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)

plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)

for pos in [‘right’,’top’,’bottom’,’left’]:

    plt.gca().spines[pos].set_visible(False)

ax.plot(x, y, linewidth = 4)    # 罫線の太さを設定

# 図表書き出し

plt.savefig(‘書き出し図表/’ + hyo_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

# 描画実行

# plt.show()

# サンプル公報の概要読み込み

abst01_list = []

for n1, str1 in enumerate(fulltitle_list):

    pn = pn_list[n1]

    str2 = abst_list[n1]

    splt_str2 = str2.split(‘‘)

    str3 = pn + ‘ ‘ + str1 + ‘\n’ + ‘ ‘ + splt_str2[0] + ‘

    abst01_list.append(str3)

print(‘概要[0]=’,abst01_list[0])

# コメント追加

wrd1 = ‘ これらのサンプル公報の概要は以下のとおり。

# 要約書き出し

wrd2 =”

for str1 in abst01_list:

    wrd2 = wrd2 + “\n” + str1 + “\n”

wrd = wrd1 + wrd2

print(wrd)

# 要約書コピー

wrd_2_8_2 = wrd

# 発明の名称読み込み(100文字/件までに制限)

minititle_list =[]

for n1, str1 in enumerate(fulltitle_list):    

    if len(str1) > 100: str1 = str1[0:100] + “・・・”    # 100文字/件までに制限

    print(n1,str1)

    minititle_list.append(str1)

# コメント追加(発明の名称を修正)

# def titlematome実行(fulltitle_listdef titlematomeに渡し、処理結果をtitlewrd_list0として受け取る)

titlewrd_list0 = titlematome(minititle_list)

print(‘titlewrd_list0=’,titlewrd_list0)

# 2文字の単語を抽出

two_wrd = []

titlewrd_list =[]

for n1, str1 in enumerate(titlewrd_list0):

    # リスト化      

    title0 = str1.split(‘‘)

    for str3 in title0:

        if len(str3) == 1: str3 = “”

        if len(str3) == 2:

            if str3 not in two_wrd:

                two_wrd.append(str3)

        if str3 not in titlewrd_list:

            if str3 != ”:

                titlewrd_list.append(str3)

del_wrd = []

for str1 in titlewrd_list:    

    for str2 in two_wrd:

        if str2 in str1:

            if str2 != str1:

                del_wrd.append(str2)

 # 上位表現を削除(ex:「対象識別」が有れば単語「識別」を削除する)

if len(del_wrd) > 0:

    title_wrd = ”

    for str1 in titlewrd_list:

        for str2 in del_wrd:

            if str1 != str2:

                if title_wrd == ”:

                    title_wrd= str1

                else:

                    if str1 not in title_wrd:

                        title_wrd= title_wrd + ‘‘ + str1

else:

    title_wrd = ”

    for str1 in titlewrd_list:                    

        if str1 not in title_wrd:

            title_wrd = title_wrd + ‘‘ + str1

# 残った付与文字を置換および削除

title_wrd = (title_wrd.replace(‘、、‘, ‘‘))    # 「、、」を「、」に置換

title_wrd = (title_wrd.replace(‘、、‘, ‘‘))    # 「、、」を「、」に置換

if title_wrd[0] == ‘‘:

    title_wrd = title_wrd[1:]    # 先頭の「、」を削除

# コメント追加

wrd1 = ‘ これらのサンプル公報には、

wrd2 = title_wrd

wrd3 = ‘などの語句が含まれていた。\n’

wrd = wrd1 + wrd2 + wrd3

print(wrd)

# 出願人書き出し

wrd_2_8_3 = wrd

# print(fig_n,’‘,hyo_n)

# スクリブト71  2-8最新発行のサンプル公報(コメント書き出し)

print(”)

print(‘出力サンプル‘)

# doc.add_page_break()    # 改頁

para = doc.add_paragraph(‘2-8 最新発行のサンプル公報‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd_2_8_1)

para = doc.add_paragraph(wrd_2_8_1)    # 第1表は本テーマの分析対象公報

para.runs[npara].font.size = docx.shared.Pt(11)

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)

wrd = hyo_n

para = doc.add_paragraph(wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd_2_8_2)

para = doc.add_paragraph(wrd_2_8_2)    

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

print(wrd_2_8_3)

para = doc.add_paragraph(wrd_2_8_3)    

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト72  第三章 コード別の分析(図表とコメント作成)

import copy

# copy.deepcopy(コピー後に一方の値を変更しても、もう一方には影響しない)を使用

print(”)

print(‘出力サンプル‘)

# code表読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’code‘)

y = len(pd_data)

x = len(pd_data.columns)

arr1 = pd_data.values    # リスト化

#コード読み込み

code_data = pd_data.iloc[:,1]

code_list =[]

for str1 in code_data:

    code_list.append(str1)    

ncd=len(code_list)

# コード内容読み込み

cdnaiyo_data = pd_data.iloc[:,2]

cdnaiyo_list = []

for str1 in cdnaiyo_data:

    cdnaiyo_list.append(str1)

# コード一桁目読み込み

flg = 0

code01_list = []

code01_list01 = []

for n1, str1 in enumerate(code_list):

    if len(str1) == 1:

        str2 = str1 + ‘:’ + cdnaiyo_list[n1]

        code01_list01.append(str2)

        if len(str2) > 36:

            str2 = str2[0:35] + “\n   ” + str2[35:]

            flg = flg + 1

        code01_list.append(str2)

# 一桁コード数算出

n2 = len(code01_list)

n2 = n2 + flg

print(‘一桁コード数=’,n2)

# コメント追加

wrd1 = ‘ この調査では、上記分析対象公報についてpythonによりコード化し、そのコードの一桁目をサブテーマのコードとした。

# 一桁コード書き出し

wrd2 =”

for str1 in code01_list:

    str1 = “  ” + str1

    wrd2 = wrd2 + “\n” + str1

wrd_cd1_list = wrd2

wrd = wrd1 + wrd2

print(wrd)

# コピー

wrd_3 =wrd

# 深いコピー(参照元を変化させない)

m11_wrd01 = “ コードはIPCを中心にコード化したが、その1桁コードは次のとおり。\n” + wrd2

m11_wrd = copy.deepcopy(m11_wrd01)

n2_m11 = copy.deepcopy(n2)    # 一桁コード数 

# print(fig_n,’‘,hyo_n)

# スクリブト73  第三章 コード別の分析(コメント書き出し)

print(”)

print(‘出力サンプル‘)

doc.add_page_break()    # 改頁

para = doc.add_paragraph(‘第三章 分類コード別の分析‘)

para.runs[npara].font.size = docx.shared.Pt(16)

para.runs[npara].bold = True

print(wrd_3)

para = doc.add_paragraph(wrd_3)    # 第1表は本テーマの分析対象公報

para.runs[npara].font.size = docx.shared.Pt(11)

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト74  3-1-1 一桁コード別の発行件数割合(集計表)(図表とコメント作成)

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nhyo = nhyo + 1

hyo_n = ‘‘ + str(nhyo)

# コメント追加

wrd = ‘ ‘ + hyo_n + ‘は分析対象公報の分類コードを一桁別(サブテーマ別)で集計した集計表である。\n’

print(wrd)

# コメントコピー

wrd_3_1_1 = wrd

# 一桁年別集計読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’一桁年別集計‘)

ny = len(pd_data)

nx = len(pd_data.columns)

nclm = 4    # 書き出すカラム数を設定

arr1 = pd_data.values    # リスト化

#一桁分類コード読み込み

code_data01 = pd_data.iloc[:,0]

code_list01 =[]

for str1 in code_data01:

    code_list01.append(str1)    

ncd01=len(code_list01)

# code表読み込み

pd_data01 = pd.read_excel(‘trans_data.xlsx’,sheet_name=’code‘)

#コード読み込み

code_data = pd_data01.iloc[:,1]

code_list =[]

for str1 in code_data:

    code_list.append(str1)    

ncd=len(code_list)

# print(code_list)

# コード内容読み込み

cdnaiyo_data = pd_data01.iloc[:,2]

cdnaiyo_list = []

for str1 in cdnaiyo_data:

    cdnaiyo_list.append(str1)

# print(cdnaiyo_list)

# コード内容追加

nwrd_max = 0

cdnaiyo_list01 = []

for n1, str1 in enumerate(code_list01):

    for n2, str2 in enumerate(code_list):

        if str1 == str2:

            str3 = cdnaiyo_list[n2]

            if len(str3) > 26:

                str3 = str3[:25] + ‘\n’ + str3[26:50]    # 25文字で折り返し(50文字以上は表示せず

            cdnaiyo_list01.append(str3)

            if len(str3) > nwrd_max: nwrd_max = len(str3)

# print(cdnaiyo_list01)

#横合計読み込み、全合計算出

tot_data01 = pd_data.iloc[:,nx-1]

ntot = 0

tot_list01 =[]

for nn1 in tot_data01:

    ntot = ntot + nn1

    tot_list01.append(nn1)    

# %算出

np_list01 =[]

for str1 in tot_data01:

    if ntot > 0:

        str1 = (str1/ntot)*100

        str1 = round(str1,1)

        np_list01.append(str1)

    else:

        np_list01.append(0)

# 上位10社の発行件数集計表

df1 = pd.DataFrame(data=code_list01,columns=[‘コード‘])

df2 = pd.DataFrame(data=cdnaiyo_list01,columns=[‘コード内容‘])

df3 = pd.DataFrame(data=tot_list01,columns=[‘合計‘])

df4 = pd.DataFrame(data=np_list01,columns=[‘%’])

df5 = pd.concat([df1,df2,df3,df4], axis=1)

# 表の作成

arr1 = df5.values    # リスト化

table_vals = arr1

fig = plt.figure()

ax = fig.add_subplot(111)    # nrowsncolsindexが全て一桁のときは、カンマを省略して111で良い

# 描画

col_labels = [‘コード‘, ‘コード内容‘,’合計‘,’%’]

the_table = plt.table(cellText=table_vals,

                      colWidths=[0.1, 0.4, 0.1, 0.1],    # 列の幅を指定

                      colLabels=col_labels,

                      loc=’center’)

the_table.scale(4, 4)    # 全体のサイズをX=4Y=4に設定

the_table.auto_set_font_size(False)

the_table.set_fontsize(20)

for x in range(nclm):

    the_table[(0,x)].set_facecolor(‘lightgreen’)    # ヘッダを薄緑色に着色

    the_table[(0,x)].get_text().set_fontsize(’20’)    # フォントサイズ=80

    the_table[(0,x)].get_text().set_fontweight(‘bold’)    # フォント種=bold

for j in range(ny):

    the_cell = the_table[j+1,0]

    the_text = the_cell.get_text()

    the_text.set_horizontalalignment(‘center’)

# 2列目の文字位置を設定

for j in range(ny):

    the_cell = the_table[j+1,1]

    the_text = the_cell.get_text()

    the_text.set_horizontalalignment(‘left’)

plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)

plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)

for pos in [‘right’,’top’,’bottom’,’left’]:

    plt.gca().spines[pos].set_visible(False)

# 図表書き出し

plt.savefig(‘書き出し図表/’ + hyo_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

# 合計でソート

arr1 = sorted(arr1, key=lambda x:x[3], reverse=True)

# コメント作成

wrd1 = ‘ この集計表によれば、コード「

wrd2 = arr1[0][0] + ‘:’ + arr1[0][1]

topcode2 = wrd2

print(‘topcode2=’,topcode2)

wrd2 = wrd2.replace(‘\n’,”)    # 改行を削除

wrd3 = ‘」が最も多く、

wrd4 = str(arr1[0][3]) + ‘%を占めている。\n’

wrd5 = ‘ 以下、

wrd6 = ”

for n1, str1 in enumerate(arr1):

    if n1== ny : break

    str2 = str1[:][0] + ‘:’ + str1[:][1]

    if n1== 1:

        wrd6 = str2

    if n1 > 1:

        wrd6 = wrd6 + ‘‘ + str2

wrd6 = wrd6.replace(‘\n’,”)    # 改行を削除

wrd7 = ‘と続いている。

wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5 + wrd6 + wrd7

# 書き出し

wrd_3_1_2 = wrd

print(wrd_3_1_2)

m12_wrd01 = ‘ 1桁コード別に集計した結果によれば、コード「‘+ wrd2 + wrd3 + wrd4 + wrd5 + wrd6 +wrd7

# まとめに追加

f = open(“matome.txt”, “a”)

f.write(m12_wrd01 + ‘\n’)

f.close()

# print(fig_n,’‘,hyo_n)

# スクリブト75  3-1 コード別全体分析(コメント書き出し)

print(”)

print(‘出力サンプル‘)

para = doc.add_paragraph(‘3-1 分類コード別全体分析‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

wrd = “ 分析対象公報を、サブテーマコード毎に分類し、分析した結果は以下のようになった。

print(wrd)

para = doc.add_paragraph(wrd)

para = doc.add_paragraph(‘3-1-1 一桁コード別の発行件数割合‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd_3_1_1)

para = doc.add_paragraph(wrd_3_1_1)    

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)

wrd = hyo_n

para = doc.add_paragraph(‘ ‘ + wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd_3_1_2)

para = doc.add_paragraph(wrd_3_1_2)    

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト76  3-1-1 一桁コード別の発行件数割合(円グラフ)(図表とコメント作成)

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

# コメント追加

wrd = ‘ ‘ + fig_n + ‘は上記集計結果を円グラフにしたものである。

print(‘wrd=’,wrd)

para = doc.add_paragraph( wrd)

# コメントコピー

wrd_3_1_3 = wrd

# 凡例用に、コード+内容を作成

cd_naiyo_list = []

hancd_naiyo_list = []

for n1, str1 in enumerate(code_list01):

    str2 = str1 + ‘:’ + cdnaiyo_list01[n1]

    nlen = len(str2)

    if nlen > 15:

        str3 = str2[0:15] + ‘・・・

    else:

        str3 = str2[0:15] 

    cd_naiyo_list.append(str2)

    hancd_naiyo_list.append(str3)

# 凡例を設定

hanrei_nm = hancd_naiyo_list    # コード+内容を凡例として格納

print(fig_n)

# 円グラフ作成

plt.pie(tot_list01, labels=hancd_naiyo_list, autopct=”%1.1f%%”,pctdistance=0.9,

        startangle=90,counterclock=False)

# 円グラフの右横=2.7の位置に高さ=1で描画

plt.legend(hanrei_nm, fontsize=12,bbox_to_anchor=(2.7, 1))    # 凡例の表示

# 図表書き出し

plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

plt.show()

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(‘ ‘ + wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト77   3-1-2 一桁コード別発行件数の年別推移(折線グラフ)(図表とコメント作成)

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

# コメント追加

wrd = ‘ ‘ + fig_n + ‘は分析対象公報を一桁コード別・年別に集計し、折線グラフにしたものである。

print(wrd)

# コメントコピー

wrd_3_1_2_1 = wrd

# 一桁年別集計読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’一桁年別集計‘)

nclm=(len(pd_data.columns))    # コード名から合計欄まで

# 読み込みデータ全体をDataFrameに変換

df00 = pd.DataFrame(pd_data)

# dataframearrayに変換

arr00 = df00.values

# 上位10に制限

nbest = 10

##発行年読み込み

nen_data = pd_data.columns[1:nclm-1]    # 発行年のminからmaxまで

nen_list = []

for str1 in nen_data:

    str1 = str(str1) + ‘

    nen_list.append(str1)

nnen = len(nen_list)

print(‘発行年=’,nen_list)

## コード読み込み

print(nbest)

cd_list =[]

for n1, str1 in enumerate(arr00):

    if n1 == (nbest-1): break

    cd_list.append(str1[0])

print(‘コード=’,cd_list)

# コード内容読み込み

code_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’code‘)

nclm=(len(code_data.columns))    # コード名から合計欄まで

# コードcode_list01読み込み

code01 = code_data.iloc[:,1]

code_list01 =[]

for str1 in code01:

    code_list01.append(str1)

print(‘コード数=’,len(code_list01))

print(‘コード[0:5]=’,code_list01[0:5])

# コード内容code_list02読み込み

code02 = code_data.iloc[:,2]

code_list02 =[]

for str1 in code02:

    code_list02.append(str(str1))

print(‘コード内容[0:3]=’,code_list02[0:3])

# コード内容追加

cdnaiyo_list01 = []

for n1, str1 in enumerate(code_list01):

    for n2, str2 in enumerate(cd_list):

        if str1 == str2:

            str3 = str2 + ‘:’ + code_list02[n1]

            if len(str3) > 30:

                str3 = str3[:29] + ‘\n’ + str3[29:]    # 30文字で折り返し(60文字以上は表示せず)    

            cdnaiyo_list01.append(str3)

print(‘コード内容=’,cdnaiyo_list01)

## 表内数値読み込み

arr_nxny = []

for n1, str1 in enumerate(arr00):

    if n1 == (nbest-1): break

    list01 = []

    for n2, nn1 in enumerate(str1):

        if n2 > 0:

            nn1 = round(nn1,1)

            if n2 < nnen+1:

                list01.append(nn1)

    arr_nxny.append(list01)

print(‘arr_nxny=’,arr_nxny)

# 最終年の件数を補正

nmax = 0

arr01 = []

cd01 = []

nxy_list0 = []

for n1, str1 in enumerate(arr_nxny):

    arr02 = []

    list0 = []

    for n2, str2 in enumerate(str1):

        if str2 > nmax: nmax = str2

        list0.append(str2)

        if (n2+1) == nenlast:

            str2 = str2*(npmend+1)        # 最終年の件数を補正

            str2 = round(str2,1)

            arr02.append(str2)

        else:

            arr02.append(str2)

    arr01.append(arr02)

    nxy_list0.append(list0)

print(‘元の件数=’,nxy_list0)

print(‘月数補正後の件数=’,arr01)

# 変数名修正

nen_list = nen_list

code_list = cdnaiyo_list01

arr_nxny = arr01

g_title = ‘一桁コード別発行件数の年別推移

# def実行

wrd = ”

wrd01,wrd02 = oresen_comment(nen_list,code_list,arr_nxny,fig_n, g_title)

print(‘第1位のコード=’,topcode2)

topcode2 = “コード「” + topcode2 + “

# wrd01 = wrd01.replace(‘主要出願人名義‘,’コード‘)

wrd01 = wrd01.replace(‘主要出願人名義‘,topcode2)

print(‘wrd01=’,wrd01)

bwd = ‘次のコードも

wrd02 = wrd02.replace(bwd,’次のコードは‘)

print(‘wrd02=’,wrd02)

# まとめに追加

m08_wrd01 = wrd01 + wrd02

m08_wrd01 = m08_wrd01.replace(‘このグラフによれば上記‘,’年別推移で見ると‘)

m08_wrd01 = m08_wrd01.replace(‘この中で第1位は‘,’上記のとおり、この中で第1位は‘)

m08_wrd01 = m08_wrd01.replace(‘この中で、第1位は‘,’上記のとおり、この中で第1位は‘)

m08_wrd01 = m08_wrd01.replace(‘年別推移で見るとコード‘,’年別推移で見ると上記コード‘)

print(m08_wrd01)

f = open(“matome.txt”, “a”)

f.write(m08_wrd01)

f.close()

# スクリブト78  3-1-2 一桁コード別発行件数の年別推移(折線グラフ)(コメント書き出し)

print(”)

print(‘出力サンプル‘)

# doc.add_page_break()    # 改頁

para = doc.add_paragraph(”)

para = doc.add_paragraph(‘3-1-2 一桁コード別発行件数の年別推移‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

print(wrd_3_1_2_1)

para = doc.add_paragraph(wrd_3_1_2_1)    

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(‘ ‘ + wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd01)

para = doc.add_paragraph(wrd01)    

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

print(wrd02)

para = doc.add_paragraph(wrd02)    

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# スクリブト79  3-1-2 一桁コード別発行件数の年別推移(バブルチャート作成)(図表とコメント作成)

import numpy as np

print(”)

print(‘出力サンプル‘)

# 図表Noを加算

nfig = nfig + 1

fig_n = ‘‘ + str(nfig)

# コメント追加

wrd = ‘ ‘ + fig_n + ‘は一桁コード別の発行件数を年別に集計し、数値付きバブルチャートにしたものである。

print(‘wrd=’,wrd)

# コメントコピー

wrd_3_1_2_4 = wrd

ncd=len(cd_naiyo_list)

# 一桁年別集計読み込み

pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’一桁年別集計‘)

ny = len(pd_data)

nx = len(pd_data.columns)

arr1 = pd_data.values    # リスト化

# 発行年読み込み

nen_data = pd_data.columns[1:nnen+1]    # 発行年

nen_list = []

for str1 in nen_data:

    str1 = str(str1) + ‘

    nen_list.append(str1)

print(‘nen_list=’,nen_list)

# コード+コード内容リスト

print(‘cd_naiyo_list=’,cd_naiyo_list)

nmax = 0

# 発行件数読み込み

nenlast = len(nen_list)

nxy_list = []

nxy_list0 = []

for n1 in range(ncd):

    nx_list = []

    nx_list0 = []

    for n2 in range(nx-1):

        if n2 > 0:

            str1 = pd_data.iloc[n1,n2]

            nx_list0.append(str1)

            if n2 == nenlast :

                str1 = str1*(npmend + 1)

                str1 = round(str1,1)

                nx_list.append(str1)

            else:

                nx_list.append(str1)

            if nmax < str1: nmax = str1

    nxy_list.append(nx_list)

    nxy_list0.append(nx_list0)

print(‘元の件数=’,nxy_list0)

print(‘月数補正後の件数=’,nxy_list)    

y_len = len(nxy_list)

# 発行件数%

npxy_list = []

for n1_list in nxy_list:

    npx_list = []

    for n2 in n1_list:

        n3= round(n2/nmax,2)

        npx_list.append(n3)

    npxy_list.append(npx_list)

# 変数名変更

x_list = nen_list

y_list = cd_naiyo_list

print(‘x_list=’,x_list)

print(‘y_list=’,y_list)

print(‘nxy_list=’,nxy_list)

print(fig_n)

# def実行

buble0(x_list,y_list,nxy_list, fig_n)

# 3-1-2 一桁コード別発行件数の年別推移(バブルチャート)のコメント

# 最終年が最多のメインGを抽出

nnen = len(nen_list)

ncd =len(cd_naiyo_list)

npk_list = []

pkcd_list = []

for n1, str1 in enumerate(cd_naiyo_list):

    nxy_list01 = nxy_list[n1]

    np1 = 0

    for n2, str2 in enumerate(nxy_list01):

        if str2>np1: 

            np1=str2    # ピーク件数            

            pknen = n2+1    # ピーク年

            if pknen==nnen:    # 最終年がピークならば

                pkcd_list.append(str1)

    np = round(np1,1)

    npk_list.append(np1)

# 合計件数読み込み

pd_data1 = pd_data.iloc[:,nx-1]

ntot = 0

nyken_list = []

for str1 in pd_data1:

    nyken_list.append(str1) 

    ntot = ntot + str1

# DataFrame

df1 = pd.DataFrame(data=cd_naiyo_list, columns=[‘コード‘])

df2 = pd.DataFrame(data=nyken_list, columns=[‘コード別合計件数‘])

# 結合

df3=pd.concat([df1, df2], axis=1)

# コード

code_list01 = df3.iloc[:,0]

# ソート

pkcd_list= sorted(pkcd_list)

# メインGに分類内容と件数を結合

pkcd_title_list =[]

for n1, str1 in enumerate(pkcd_list):

    for n2, str2 in enumerate(code_list01):

        if str1 == str2:

            str3 = nyken_list[n2]

            str3 =round(str3,1)

            str4 = str1 + “(” +str(str3) + “)”

            pkcd_title_list.append(str4)

# print(‘pkcd_title_list=’,pkcd_title_list)   

n2 = len(pkcd_list)    # 最終年が最多のメインG

# コメント追加

flg_n2 = 0

if n2 > 0:

    wrd1 = ‘ このチャートによれば、最終年が最多となっているコードは次のとおり。\n’

    # 最終年が最多のコード書き出し

    wrd2 =”

    for str1 in pkcd_title_list:    # 最終年が最多のコード

        str1 = “  ” + str1 + “\n”

        wrd2 = wrd2 + str1    

    wrd = wrd1 + wrd2

if n2 == 0:

    flg_n2 = 1

    wrd = ‘ このチャートによれば、最終年が最多となっているコードはなかった。

    print(wrd)

# 増加したコードコピー

wrd_3_1_2_5 = wrd

# 重要コードを抽出

## 最終年の件数が平均以上でかつピーク時の80%以上でかつ増加率が100%以上か

## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要コードとして書出す

#最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出

ntot = 0

nlast_list = []

nmae_list = []

for n in range(y_len):    

    n0 = nxy_list[n][nnen-1]    # 最終年の件数

    nlast_list.append(n0)

    n1 = nxy_list[n][nnen-2]    # 最終年前年の件数

    nmae_list.append(n1)

    ntot = ntot + n0

navr = round(ntot/ncd,1)    # 最終年の平均件数

# 重要メインGを判定

vipcd_list = []

for n1, str1 in enumerate(code_list01):

    if n1 >= y_len: break

    flg = 0

    if nlast_list[n1] > navr:    # 最終年の件数が平均以上

        if nlast_list[n1] > (npk_list[n1]*0.8):    # ピーク時の80%以上

            if nmae_list[n1] > 0:

                if (nlast_list[n1]/nmae_list[n1]) > 1:    #増加率が100%以上

                    vipcd_list.append(str1)

                    flg = 1

        if flg == 0:

            if nlast_list[n1] > navr:    # 最終年の件数が平均以上

                if nlast_list[n1] > (npk_list[n1]*0.95):    # ピーク時の95%以上

                    vipcd_list.append(str1)

# ソート

vipcd_list= sorted(vipcd_list)

# メインGに分類内容と件数を結合

vcd_title_list =[]

for n1, str1 in enumerate(vipcd_list):

    for n2, str2 in enumerate(code_list01):

        if str1 == str2:

            str3 = str1 + “(” +str(nyken_list[n2]) + “)”

            vcd_title_list.append(str3)

n2 = len(vipcd_list)    # 最終年が最多のコード数

# コメント追加

if n2 > 0:

    wrd1 = ‘ 所定条件を満たす重要コードは次のとおり。\n’

    # 重要コード書き出し

    wrd2 =”

    for str1 in vcd_title_list:

        str1 = “  ” + str1 + “\n”

        wrd2 = wrd2 + str1

    wrd = wrd1 + wrd2

if n2 == 0:

    if flg_n2 == 0:

        wrd = ‘ 所定条件を満たす重要コードはなかった。

    else:

        wrd = ‘ 所定条件を満たす重要コードもなかった。

print(wrd)

# 増加したコードコピー

wrd_3_1_2_6 = wrd

# print(fig_n,’‘,hyo_n)

# スクリブト80  3-1-2 一桁コード別発行件数の年別推移(バブルチャート作成)(コメント書き出し)

print(”)

print(‘出力サンプル‘)

print(wrd_3_1_2_4)

para = doc.add_paragraph(wrd_3_1_2_4)    

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

# 図表読み込み

doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

wrd = fig_n

para = doc.add_paragraph(‘ ‘ + wrd)

para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

para.runs[npara].font.size = docx.shared.Pt(14)

print(wrd_3_1_2_5)

para = doc.add_paragraph(wrd_3_1_2_5)    

para.runs[npara].font.size = docx.shared.Pt(11)

# para.runs[npara].bold = True

print(wrd_3_1_2_6)

para = doc.add_paragraph(wrd_3_1_2_6)    

para.runs[npara].font.size = docx.shared.Pt(11)

para.runs[npara].bold = True

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

# コード別個別分析一括処理

## 一桁コード毎に(1)(8)の図表を作成する。

# スクリブト81  3-2-AZ-(1) コード別発行件数の年別推移(棒グラフ)(図表とコメント作成)

## AZ-(1)=ex:A:計算;計数]

import pandas as pd

import numpy as np

import openpyxl

import matplotlib.pyplot as plt

plt.rcParams[‘font.family’] = ‘MS PGothic’

import matplotlib.patches as patches

import copy

import math

def bar_graph01(nfig,nhyo):

    global nen_list

    global nnen    # 調査年数

    global ncdtot

    global npmend    # 追加補正係数

    # コメント追加

    print(”)

    wrd = ‘(1) コード別発行件数の年別推移

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # 発行年別の発行件数を集計

    nenlast = len(nen_list)

    nmax = 0    # 最大件数

    nken_list= []    # 一桁コードの年別件数リスト

    nken_list2 = []    # 追加件数

    nken_list3 = []     # 合計件数

    for n1,str1 in enumerate(nen_list):

        nn = 0

        for str2 in nen_list01:

            if str1[0:4] == str2:

                nn = nn +1

        if nn > nmax: nmax = nn

        nken_list.append(nn)

        if n1 == nenlast – 1:

            nn2 = nn*npmend    # 月数補正

            nn2 = round(nn2,1)

            nken_list2.append(nn2)

            nken_list3.append(nn+nn2)

        else:

            nken_list2.append(0)

            nken_list3.append(nn)

    print(‘発行件数=’,nken_list)

    print(‘追加補正係数=’,npmend)

    print(‘追加予想件数=’,nken_list2)

    print(‘合計発行件数=’,nken_list3)

    # 発行年に「年」を付加し横軸ヘッダを作成

    nen_head = []

    for str1 in nen_list:

        str1 = str(str1) + ‘

        nen_head.append(str1)

    # コメント追加

    wrd1 = ‘ 分析対象公報のうちコード「

    wrd2 = cdhead_list[ncd]

    wrd3 = ‘ 」が付与された公報は

    wrd4 = str(ncdtot)

    wrd5 = ‘件であった。\n’

    # 図表Noを加算

    nfig = nfig + 1

    fig_n = ‘‘ + str(nfig)

    wrd6 = ‘ ‘ + fig_n + ‘はこのコード「

    wrd7 = cdhead_list[ncd]

    wrd8 = ‘」が付与された公報を発行年別に集計し、縦棒グラフにしたものである。\n’

    wrd  = wrd1 +wrd2 +wrd3 + wrd4 + wrd5 +wrd6 + wrd7 + wrd8

    print(wrd)

    # 書き出し

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    # 棒グラフ描画

    # X軸ラベル設定

    labels = nen_head    # ラベル=発行年

    # 一桁コード発行件数設定

    data = nken_list

    data2 = nken_list2

    # 表示位置設定

    x_width = 0.5

    x_loc = np.array(range(len(nen_list))) + x_width

    print(fig_n)

    # グラフの大きさを設定

    fig = plt.figure(figsize=(13.0, 4.0))

    # タイトル、ラベルを設定

    plt.title(“公報発行件数の年別推移“, fontsize=20)

    plt.xlabel(“発行年“, fontsize=18)

    plt.ylabel(“発行件数“, fontsize=18)

    plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘)    # 棒グラフの設定

    plt.xticks(x_loc, labels, fontsize=14)                          # x軸にラベル設定

    if npmend > 0:    # 追加補正係数>0ならば予想件数を表示

        plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘)    # 棒グラフの設定

    plt.grid()                                                  # 罫線追加

    # 追加補正係数>0ならば予想件数を表示

    if npmend > 0:

        plt.legend()

    # 棒グラフ内に数値を書く

    hx = nmax/50    # 書き込み位置を上に修正

    for x, y in zip(x_loc, data):

        plt.text(x, y+hx, y, ha=’center’, va=’bottom’)    # 数値の書き込み位置をhx上に修正

    # 図表書き出し

    plt.savefig(‘書き出し図表/’ + fig_n +’.png’,bbox_inches=’tight’, pad_inches=0.05)

    # 描画実行

    plt.show()

    # 3-2 コード別個別分析コード別発行件数の年別推移(棒グラフのコメント作成)

    # コード別発行件数の年別推移(棒グラフ)の変動をコメントする

    # def実行

    print(‘list2=’,nen_list)    # 発行年

    print(‘list3=’,nken_list)    # 発行件数

    print(‘合計発行件数=’,nken_list3)    

    wrd = bargraph_comment(nen_list,nken_list3)

    # 図表書き出し

    doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

    figwrd = fig_n

    para = doc.add_paragraph(‘ ‘ + figwrd)

    para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

    para.runs[npara].font.size = docx.shared.Pt(14)

    # コメント作成

    wrd1 = ‘ このグラフによれば、コード「

    wrd2 = cdhead_list[ncd]

    wrd3 = ‘ 」が付与された公報の発行件数は

    wrd0 = wrd1 + wrd2 + wrd3

    wrd = wrd0 + wrd             

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    doc.save(‘report.docx’)

    # print(fig_n,’‘,hyo_n)

    return(nfig,nhyo)

# スクリブト82  3-2-AZ-(2) コード別出願人別の発行件数割合(表と円グラフ)(図表とコメント作成)

def ap_hyo01(nfig,nhyo):

    global ncdtot

    # コメント追加

    print(”)

    wrd = ‘(2) コード別出願人別の発行件数割合

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    ntot01= ncdtot    # 一桁コードの公報件数

    print(‘一桁コードの公報件数=’,ntot01)      

    # 上位出願人数を指定

    nbest_ap = 10

    # 一桁コード別集計読み込み

    code01__data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’一桁コード別集計‘) 

    # 発行件数読み込み    

    ncode01_data = code01__data.iloc[:,ncd+1]

    nenlast = len(ncode01_data)

    ntot = 0

    napken_list= [] 

    for n1,nn1 in enumerate(ncode01_data):

        nn1 = round(nn1,1)

        if n1 == nenlast :                  

            nn1 = nn1*(npmend + 1)

            nn1 = round(nn1,1)

            napken_list.append(nn1)

        else:

            napken_list.append(nn1)

        ntot = ntot + nn1

    # 出願人名読み込み

    apname_data = code01__data.iloc[:,0]

    ap01_list = []

    for n1,str1 in enumerate(apname_data):

        if napken_list[n1] > 0:

            ap01_list.append(str1)

    # print(len(ap01_list),’ap01_list=’,ap01_list)

    # %を追加

    npap_list = []

    for n1, nn1 in enumerate(napken_list):

        if napken_list[n1] > 0:

            np = (nn1/ntot)*100

            np = round(np,1)

            npap_list.append(np)    

    # print(len(npap_list),’npap_list=’,npap_list)

    napken_list01 = []

    for nn1 in napken_list:

        if nn1 > 0:

            napken_list01.append(nn1)

    # print(len(napken_list01),’napken_list01=’,napken_list01)

    # DataFrame

    df1 = pd.DataFrame(data=ap01_list, columns=[‘出願人‘])

    df2 = pd.DataFrame(data=napken_list01, columns=[‘発行件数‘])

    df3 = pd.DataFrame(data=npap_list, columns=[‘%’])

    # 横方向(axis=1)に結合

    df4=pd.concat([df1, df2,df3], axis=1)

    # 逆順にソート

    df4=df4.sort_values(‘発行件数‘,ascending=False)

    # 上位nbest_apをリスト化

    arr1 = df4[0:nbest_ap].values

    # 上位nbest_apの合計を算出

    ntop = 0

    for n1, str1 in enumerate(arr1):    

        if n1  == nbest_ap: break

        nn = str1[1]

        ntop = ntop + nn

    # その他と合計を追加

    arr1_nbest = []

    for str1 in arr1:

        blist = []

        for str2 in str1:

            # 末尾を削除

            if type(str2) == str:

                if str2[-1] == ‘,’:    # 末尾が ‘,’ならば末尾を除去

                    np = len(str2)

                    str2 = str2[0:np-1]            

            blist.append(str2)

        arr1_nbest.append(blist)

    nsonota = round(ntot01 – ntop,1)    # その他の件数

    npsonota = round(((ntot01 – ntop)/ntot)*100,1)    # その他の%

    ngokei = round(ntot01,1)

    arr1_nbest.append([‘その他‘,nsonota,npsonota])

    arr1_nbest.append([‘合計‘,ngokei,100])     # 合計を追加

    nlimit = len(arr1_nbest) – 2

    # 読み込み数を設定

    if nlimit < nbest_ap: nbest_ap=nlimit      

    # 出願人名を30文字以内に制限

    for str1 in arr1_nbest:

        if len(str1[0]) > 30:

            str1[0] = str1[0][:29] + ‘\n’ + str1[0][29:]    # 30文字で折り返し(60文字以上は表示せず)    

    # 2位以下をap_wrdにまとめる(その他は除外)

    ap_wrd = ‘ 以下

    ap_wrd2 = ‘ 以下

    for n1, str1 in enumerate(arr1_nbest):

        if str1[0] == ‘その他‘: break

        str1 = str(str1[0])

        str1 = str1.replace(‘株式会社‘, ”)     # “株式会社を消去

        str1 = str1.replace(“国立大学法人“, “”)    # “国立大学法人を消去

        str1 = str1.replace(“公立大学法人“, “”)    # “公立大学法人を消去

        str1 = str1.replace(“学校法人“, “”)    # “学校法人を消去

        str1 = str1.replace(“地方独立行政法人“, “”)    # “地方独立行政法人を消去

        str1 = str1.replace(“独立行政法人“, “”)    # “独立行政法人を消去

        str1 = str1.replace(“国立研究開発法人“, “”)    # “国立研究開発法人を消去

        str1 = str1.replace(“一般財団法人“, “”)    # “一般財団法人を消去        

        str1 = str1.replace(“公益財団法人“, “”)    # “公益財団法人を消去 

        if n1 > 0:

            if n1 <= nbest:

                ap_wrd = ap_wrd + ‘‘ + str1

        if n1 > 1:

            if n1 <= nbest:

                ap_wrd2 = ap_wrd2 + ‘‘ + str1

    ap_wrd = ap_wrd + ‘と続いている。

    ap_wrd = ap_wrd.replace(‘\n’,”)    # 改行を削除

    p_wrd2 = ap_wrd2 + ‘と続いている。

    ap_wrd2 = ap_wrd2.replace(‘\n’,”)    # 改行を削除

    # 図表Noを加算

    nhyo = nhyo + 1

    hyo_n = ‘‘ + str(nhyo)

    wrd1 = ‘ ‘ + hyo_n + ‘はコード「

    wrd2 = cdhead_list[ncd]

    wrd3 = ‘」が付与された公報を公報発行件数が多い上位10社とその他の出願人について集計した集計表である。

    wrd = wrd1 + wrd2 + wrd3 + ‘\n’

    print(wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)    

    # 描画準備

    table_vals = arr1_nbest    # 表データ

    fig = plt.figure()

    ax = fig.add_subplot(111)    # nrowsncolsindexが全て一桁のときは、カンマを省略して111で良い

    # 表描画

    col_labels = [‘出願人‘, ‘発行件数‘,’%’]

    the_table = plt.table(cellText=table_vals,

                      colWidths=[0.4, 0.1, 0.1],    # 列の幅を指定

                      colLabels=col_labels,

                      loc=’center’)

    the_table.set_fontsize(30)

    the_table.scale(5, 6)    # 全体のサイズをX=5Y=6に設定

    for x in range(3):

        the_table[(0,x)].set_facecolor(‘lightgreen’)    # ヘッダを薄緑色に着色

        the_table[(0,x)].get_text().set_fontsize(’80’)    # フォントサイズ=80

        the_table[(0,x)].get_text().set_fontweight(‘bold’)    # フォント種=bold    

    for j in range(nbest_ap+2):

        the_cell = the_table[j+1,0]

        the_text = the_cell.get_text()

        the_text.set_horizontalalignment(‘center’)

    plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)

    plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)

    for pos in [‘right’,’top’,’bottom’,’left’]:

        plt.gca().spines[pos].set_visible(False)

    # 図表書き出し

    hyo_n = ‘‘ + str(nhyo)

    print(hyo_n)

    plt.savefig(‘書き出し図表/’ + hyo_n +’.png’,bbox_inches=’tight’, pad_inches=0.05)

    # 描画実行

    plt.show()

    # 図表書き出し

    doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)

    figwrd = hyo_n

    para = doc.add_paragraph(‘ ‘ + figwrd)

    para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

    para.runs[npara].font.size = docx.shared.Pt(14)

    # 1位と2位が同数かチェック

    flg1_2 = 0

    if arr1_nbest[0][1] == arr1_nbest[1][1] : flg1_2 = 1

    # コメント作成

    if flg1_2 == 0:

        if (ntot – ntop) > arr1_nbest[0][1]:

            wrd1 = ‘ この集計表によれば、その他を除くと、第1位は‘    

        else:

            wrd1 = ‘ この集計表によれば、第1位は‘        

        wrd2 = arr1_nbest[0][0]        

        wrd3 = ‘であり、

        wrd4 = str(arr1_nbest[0][2])

        wrd5 = ‘%であった。\n’

        wrd6 = ap_wrd    # 2位以下の出願人

        wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5 + wrd6  + ‘\n’

        wrd = wrd.replace(‘,’,”)     

    if flg1_2 == 1:

        if (ntot – ntop) > arr1_nbest[0][1]:

            wrd1 = ‘ この集計表によれば、その他を除くと、第1位は同数の‘    

        else:

            wrd1 = ‘ この集計表によれば、第1位は同数の‘      

        wrd2 = arr1_nbest[0][0] + ‘‘ + arr1_nbest[1][0]        

        wrd3 = ‘であり、それぞれ

        wrd4 = str(arr1_nbest[0][2])

        wrd5 = ‘%であった。\n’

        wrd6 = ap_wrd2    # 3位以下の出願人

        wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5 + wrd6  + ‘\n’

        wrd = wrd.replace(‘,’,”)   

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True    

    if arr1_nbest[0][2] == 0:

        wrd1 = wrd1 + ‘無かった。

        return (nfig,nhyo)

    if arr1_nbest[0][2] == 1:

        wrd1 = wrd1 + wrd2 + ‘のみであった。

        return (nfig,nhyo)

    # 共同出願人が0または1ならばグラフ化せずにスキップ    

    if nlimit <=1:

        wrd = ‘ 共同出願人は無かった。

        print(‘wrd=’,wrd)

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

        # para.runs[npara].bold = True

        return (nfig,nhyo)

    if nlimit ==2:

        ap01 = arr1_nbest[1][0].replace(‘,’,”)    # 筆頭出願人の末尾の「,」を削除

        wrd = ‘ 共同出願人は‘ + ap01 + ‘のみである。

        print(‘wrd=’,wrd)

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

        # para.runs[npara].bold = True

        return (nfig,nhyo)    

    # 共同出願人が2人以上ならば円グラフを描画    

    # 図表Noを加算

    nfig = nfig + 1

    fig_n = ‘‘ + str(nfig)

    # コメント作成

    wrd = ‘ ‘ + fig_n + ‘は上記集計結果を円グラフにしたものである。\n’   

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

#    para.runs[npara].bold = True

    print(fig_n)    

    # (2) コード別出願人別の発行件数割合(円グラフ)

    # 円グラフの描画データ作成

    ap10 = []    # 上位nbest_apの出願人略称(株式会社を除去)

    fullap10 = []    # # 上位nbest_apの出願人フルネーム

    ntot10 = 0    # 上位nbest_apの合計件数

    n10 = []    # 上位nbest_ap%リスト

    for n1, str1 in enumerate(arr1_nbest):

        if n1 >= nbest_ap+1: break 

        str2 = str1[0].replace(“株式会社“, “”)    # “株式会社を消去

        str2 = str2.replace(“国立大学法人“, “”)    # “国立大学法人を消去

        str2 = str2.replace(“公立大学法人“, “”)    # “公立大学法人を消去

        str2 = str2.replace(“学校法人“, “”)    # “学校法人を消去

        str2 = str2.replace(“地方独立行政法人“, “”)    # “地方独立行政法人を消去

        str2 = str2.replace(“独立行政法人“, “”)    # “独立行政法人を消去

        str2 = str2.replace(“国立研究開発法人“, “”)    # “国立研究開発法人を消去

        str2 = str2.replace(“一般財団法人“, “”)    # “一般財団法人を消去   

        str2 = str2.replace(“公益財団法人“, “”)    # “公益財団法人を消去  

        if nlen > 15:

            str2 = str2[0:15] + ‘・・・

        else:

            str2 = str2[0:15] 

        ap10.append(str2)

        fullap10.append(str2)

        n10.append(str1[2])

        if n1 < nbest_ap:

            ntot10 = ntot10 + str1[1]

    # 凡例

    hanrei_nm = fullap10    # 出願人フルネームを凡例として格納

    # 円グラフ作成

    print(n10,ap10)

    plt.pie(n10, labels=ap10, autopct=”%1.1f%%”,pctdistance=0.9,

        startangle=90,counterclock=False)

    # 円グラフの右横=2.7の位置に高さ=1で描画

    plt.legend(hanrei_nm, fontsize=12,bbox_to_anchor=(2.7, 1)) # 凡例の表示

    # 図表書き出し

    plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)

    # 描画実行

    plt.show()

    # 図表書き出し

    doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

    figwrd = fig_n

    para = doc.add_paragraph(‘ ‘ + figwrd)

    para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

    para.runs[npara].font.size = docx.shared.Pt(14)

    # コメント作成

    np = round((ntot10/ntot)*100,1)    # 小数点以下1位で%表示

    wrd =  “ このグラフによれば、上位10社で” +  str(np)  + “%を占めている。

    if np<35: wrd = “ このグラフによれば、上位10社だけでは” +  str(np) + “%を占めているに過ぎず、多数の出願人に分散しているようである。

    if np>45: wrd = “ このグラフによれば、上位10社だけで” + str(np) + “%を占めており、少数の出願人に集中しているようである。

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # print(fig_n,’‘,hyo_n)

    return (nfig,nhyo)

# スクリブト83  3-2-AZ-(3) コード別出願人数の年別推移(棒グラフ)(図表とコメント作成)

def bar_graph02(nfig,nhyo):    # 3-2-AZ-(3)コード別出願人数の年別推移(棒グラフ)

    global nen_list

    global nen_list01

    global nen_head_list

    global nnen

    global nen_head_list

    global npmend    # 追加補正係数

    # コメント追加

    print(”)

    wrd = ‘(3) コード別出願人数の年別推移

    print(‘wrd=’,wrd)    

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # 図表Noを加算

    nfig = nfig + 1

    fig_n = ‘‘ + str(nfig)

    wrd1 = ‘ ‘ + fig_n + ‘はコード「

    wrd2 = cdhead_list[ncd]

    wrd3 = ‘」が付与された公報の出願人数を発行年別に集計し、縦棒グラフにしたものである。

    wrd = wrd1 + wrd2 + wrd3 + ‘\n’   

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    # 一桁コード別発行年別の出願人データにまとめる

    cdap_list = []    # 一桁コード別出願人リスト

    bap_list = []

    bap_list01 = []

    for n1,str1 in enumerate(nen_list):    # 全公報発行年リスト(ex:2011,2012・・・)

        bap_list01 = []

        for n2, str2 in enumerate(nen_list01):    # コード別公報の発行年リスト

            if str1 == str2:    # 発行年が同じならば

                str3 = ap_list01[n2]

                # 共同出願人を分割

                split_str3 = str3.split(‘;’)

                for str4 in split_str3:

                    bap_list01.append(str4)    # 発行年別にリスト化

        cdap_list.append(bap_list01)

    # 一桁コード別出願人を抽出し重複を削除 

    nenlast = len(cdap_list)

    nmax = 0    # 最大人数

    ncdap01_list = []    # 一桁コード別年別出願人数

    ncdap01_list2 = []    # 追加件数

    ncdap01_list3 = []    # 合計件数

    for n1, str1 in enumerate(cdap_list):

        # 重複を削除 

        str1 = list(set(str1))    # 重複を削除 

        nn = len(str1)

        if nn > nmax: nmax = nn

        ncdap01_list.append(nn)

        if n1 == nenlast – 1:

            nn2 = nn*npmend    # 月数補正

            nn2 = round(nn2,1)

            ncdap01_list2.append(nn2)

            ncdap01_list3.append(nn+nn2)

        else:

            ncdap01_list2.append(0)

            ncdap01_list3.append(nn)

    print(‘発行件数=’,ncdap01_list)

    print(‘追加補正係数=’,npmend)

    print(‘追加予想件数=’,ncdap01_list2)

    print(‘合計発行件数=’,ncdap01_list3)

    # 棒グラフ描画準備

    # X軸ラベル設定   

    labels = nen_head_list    # ラベル=発行年

    # 一桁コード別年別出願人数をdataに設定

    data = ncdap01_list

    data2 = ncdap01_list2

    # 表示位置設定

    x_width = 0.5

    x_loc = np.array(range(nnen)) + x_width

    print(fig_n)

    # グラフの大きさを設定

    fig = plt.figure(figsize=(13.0, 4.0))

    # タイトル、ラベルを設定

    plt.title(“出願人数の年別推移“, fontsize=20)

    plt.xlabel(“発行年“, fontsize=18)

    plt.ylabel(“出願人数“, fontsize=18)

    plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘)    # 棒グラフの設定

    plt.xticks(x_loc, labels, fontsize=14)                          # x軸にラベル設定

    if npmend > 0:    # 追加補正係数>0ならば予想件数を表示

        plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘)    # 棒グラフの設定

    plt.grid()                                                  # 罫線追加

    # 追加補正係数>0ならば予想件数を表示

    if npmend > 0:

        plt.legend()

    # 棒グラフ内に数値を書く

    hx = nmax/50    # 書き込み位置を上に修正

    for x, y in zip(x_loc, data):

        plt.text(x, y+hx, y, ha=’center’, va=’bottom’)    # 数値の書き込み位置をhx上に修正

    # 図表書き出し

    plt.savefig(‘書き出し図表/’ + fig_n +’.png’,bbox_inches=’tight’, pad_inches=0.05) 

    # 描画実行

    plt.show()

    #図表書き出し

    doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

    figwrd = fig_n

    # (3) コード別出願人数の年別推移(棒グラフ)のコメントを作成

    # 年別出願人数リスト ncdap01_list

    # def実行

    print(‘list2=’,nen_list)    # 発行年

    print(‘list3=’,ncdap01_list)     # 発行件数

    print(‘合計発行件数=’,ncdap01_list3)    

    wrd = bargraph_comment(nen_list,ncdap01_list3)

    print(wrd)

    figwrd = fig_n

    para = doc.add_paragraph(‘ ‘ + figwrd)

    para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

    para.runs[npara].font.size = docx.shared.Pt(14)

    wrd1 = ‘ このグラフによれば、コード「

    wrd2 = cdhead_list[ncd]

    wrd3 = ‘ 」が付与された公報の出願人数は

    wrd0 = wrd1 + wrd2 + wrd3

    wrd = wrd0 + wrd + ‘\n’    

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # print(fig_n,’‘,hyo_n)

    return (nfig,nhyo)

# スクリブト84  2-AZ-(4) コード別出願人別発行件数の年別推移(バブルチャート)(図表とコメント作成)

def buble_ap01(nfig,nhyo): 

    global ncd

    global cdhead_list    # 一桁コード+コード内容

    global nen_list

    global nen_head_list

    global nnen

    global cd01

    global ncdtot

    global py_list

    global py_list01

    global npmend

    # コメント追加

    print(”)

    wrd = ‘(4) コード別出願人別発行件数の年別推移

    # 書き出し

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # 合計件数 ntot 

    ntot = ncdtot

    # 図表Noを加算

    nfig = nfig + 1

    fig_n = ‘‘ + str(nfig)

    wrd1 = ‘ ‘ + fig_n + ‘はコード「

    wrd2 = cdhead_list[ncd]

    wrd3 = ‘」が付与された公報について主要出願人の発行件数が年毎にどのように推移しているかを見るためのものであり、

    wrd4 = ‘公報発行件数が多い上位10社について公報発行件数を発行年別に集計し、数値付きバブルチャートにしたものである。\n’

    wrd = wrd1 + wrd2 + wrd3 + wrd4

    print(‘wrd=’,wrd)

    # コメント書き出し

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    # 各公報毎に持分を計算し、年別に集計し、出願人毎の発行件数(持分)を集計する。

    # データ読み込み

    pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)        # csv

    pat_data = pat_data.dropna(how=’all’)    # 全列がNaNである行を削除

    # 開始年から終了年までの数値を作成し、文字に変換し、リスト化

    nopy_list=[]

    for str1 in year_list:

        nopy_list.append(str1)

    # コード欄データをリスト化

    pd_data = pat_data.iloc[:,9]    # コード欄

    code_list =[]

    for str1 in pd_data:

        str1 = ‘;’ + str1

        code_list.append(str(str1))

    # 出願人(重複なし)リスト作成(縦軸作成)

    # 出願人読み込み

    apname_data = pat_data.iloc[:,4]

    ap_list =[]

    for str1 in apname_data:

        str0 = str1 + “,”

        ap_list.append(str(str0))

    # 出願人の重複を削除

    list1 =[]

    for str1 in apname_data:

        ap_split = str1.split(“;”)    # 分割

        for str2 in ap_split:    # 展開

            list1.append(str2)

    list1 = list(set(list1))    # 重複を削除 

    # 各公報から出願人+発行年+持分とコードをリスト化

    list2 = []

    list3 = []

    for n, str1 in enumerate(apname_data):

        nap = str1.count(“;”) + 1

        nen = py_list01[n]

        motibun = 1/nap

        code01 = code_list[n]

        ap_split = str1.split(“;”)    # 分割

        for str2 in ap_split:    # 展開

            str3 = str2 + “,” + str(py_list01[n]) + “,” + str(motibun) 

            list2.append(str3)    # 出願人+発行年+持分

            list3.append(str(code01))    # コード

    # 設定コードに絞り込み

    bcd01 = ‘;’ + cd01    # 設定コードbcdに絞り込むために先頭に区切り符号「;」を付加

    list4 = []    # 元リスト

    for n1, str1 in enumerate(list2):

        if bcd01 in list3[n1]:

            list4.append(str1)

    # 表の初期化

    nx = len(nopy_list)

    ny = len(list1)

    arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

    # 横軸設定

    for x, str1 in enumerate(nopy_list):

        arr1[0][x+1] = str1

    # 縦軸設定

    for y, str1 in enumerate(list1):

        arr1[y+1][0] = str1

    # 出願人別年別集計

    for str1 in list4:

        str2= str1.split(“,”)

        ap =str2[0]

        nen =str2[1]

        motibun = str2[2]

        for y, str3 in enumerate(list1):

            if arr1[y+1][0] == ap:

                for x, str4 in enumerate(nopy_list):

                    if arr1[0][x+1] == int(nen):

                        arr1[y+1][x+1] +=  float(motibun)

    # print(arr1[0:2])    # 元表

    # 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、

    # ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした

    # 1行目をコピー

    a1_list = arr1[0][:]

    # 1行目を削除

    del arr1[0][:]

    # aray1をリスト化

    list3 = []

    for str1 in arr1:

        list3.append(str1)

    # 行列数を算出

    ny = len(list1)

    nx = len(nopy_list)

    # 合計を算出し追加

    list4 = []

    #  先頭の[]を削除

    del arr1[0]

    for y,str1 in enumerate(arr1):

        ntot = 0

        for x in range(nx+1):

            if x>0:

                ntot = ntot + arr1[y][x]

        str1.append(ntot)

        list4.append(str1)

    # 合計でソート

    arr1 = sorted(list4, key=lambda x:x[nx+1], reverse=True)

    # 0行目にコピーを挿入

    arr1.insert(0, a1_list)

    # ヘッダを修正

    arr1[0][0] = “出願人

    arr1[0].append(“合計“)

    # nbestに絞り込み(上位出願人の年別発行件数(持分))

    nbest = 10

    arr_nbest = arr1[0:nbest+1][:]    # ヘッダ+10行に絞り込み

    # ヘッダコピー

    head_list = arr1[0][:]    # ヘッダ

    # 上位出願人リストを作成

    ap_list = []

    for n1,str1 in enumerate(arr_nbest):

        if n1 > 0:

            ap_list.append(str1[0])

    aptop_list = ap_list

    # arr_nbestから件数リストを抽出

    nenlast = len(arr_nbest)

#    print(‘元の件数=’,arr_nbest)

    nmax = 0

    nxy_list = []

    nxy_list0 = []

    for  n1, str1 in enumerate(arr_nbest):    # Y        

        if n1 > 0:

            nx_list = []

            nx_list0 = []

            for n2, nn in enumerate(str1):    # X                

                if n2 == nnen+1: break        # 合計欄を除く

                if type(nn) != str:                 # 文字を除く

                    nx_list0.append(nn)

                    if (n2+1) == nenlast :                  

                        nn2 = nn*(npmend + 1)

                        nn2 = round(nn2,1)

                        nx_list.append(nn2)

                    else:

                        nx_list.append(nn)

                    if nn > nmax: nmax=nn

            nxy_list.append(nx_list)

            nxy_list0.append(nx_list0)

    # print(‘元の件数=’,nxy_list0)

    # print(‘月数補正後の件数=’,nxy_list)

    # 発行件数%

    npxy_list = []

    for str1 in nxy_list:

        if n1 > 0:

            npx_list = []

            for n2, x2 in enumerate(str1):

                n3= round(x2/nmax,2)

                npx_list.append(n3)

        npxy_list.append(npx_list)

    # 変数名変更

    x_list = nen_head_list

    y_list = ap_list

    print(‘x_list=’,x_list)

    print(‘y_list=’,y_list)

    print(‘nxy_list=’,nxy_list)

    print(fig_n)

    # def実行

    buble0(x_list,y_list,nxy_list, fig_n)

    # 図表書き出し

    doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

    figwrd = fig_n

    para = doc.add_paragraph(‘ ‘ + figwrd)

    para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

    para.runs[npara].font.size = docx.shared.Pt(14)    

    # (4) コード別出願人別発行件数の年別推移(バブルチャート)のコメント

    # 最終年が最多の出願人を抽出

    nnen = len(nen_list)

    nap = len(ap_list)

    npk_list = []    # ピーク件数

    pkap_list = []    # 最終年が最多の出願人

    for n1, str1 in enumerate(ap_list):

        nxy_list01 = nxy_list[n1]

        np = 0

        for n2, str2 in enumerate(nxy_list01):

            if str2>np: 

                np=str2    # ピーク件数            

                pknen = n2+1    # ピーク年

                if pknen==nnen:    # 最終年がピークならば

                    pkap_list.append(str1)

        np = round(np,1)

        npk_list.append(np)

    # 最終年が最多の出願人数を書き出し

    n2 = len(pkap_list)

    # 書き出し人数書き出し

    f = open(‘sub_txt.txt’, ‘a’)

    f.write(str(n2) + “\n”)

    f.close()  

    # 最終年の発行年件数読み込み

    nlast_list =[]

    for n1, str1 in enumerate(nxy_list):

        nlast_list.append(str1[9])

        if n1 == 9: break

    # 最終年前年の発行年件数読み込み

    nzennen_list =[]

    for n1, str1 in enumerate(nxy_list):

        nzennen_list.append(str1[8])

        if n1 == 9: break

    bcode = ap_list[0]    # 1位の出願人名

    # 最終年に増加した出願人を抽出

    inc_ap_list = []

    for n1, str1 in enumerate(ap_list):

        if nlast_list[n1] – nzennen_list[n1] > 0:

            inc_ap_list.append(str1)

    # コメント追加

    flg_n2 = 0

    if n2 > 0:

        wrd1 = ‘ このチャートによれば、以下の出願人は最終年が最多となっている。\n’

        # 最終年が最多の出願人書き出し

        wrd2 =”

        for str1 in pkap_list:

            str1 = “  ” + str1 + “\n”

            wrd2 = wrd2 + str1

        wrd = wrd1 + wrd2

    if n2 == 0:

        wrd = ‘ このチャートによれば、最終年が最多となっている出願人はなかった。

        flg_n2 = 1

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

#    para.runs[npara].bold = True

    # 重要出願人を抽出

    ## 最終年の件数が平均以上(ただし0件以外の平均)でかつピーク時の80%以上でかつ増加率が100%以上か

    ## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要出願人として書出す

    #最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出

    ct = 0

    ntot = 0

    nlast_list = []

    nmae_list = []

    for n in range(nap):

        n0 = nxy_list[n][nnen-1]    # 最終年の件数

        if n0 > 0: ct = ct + 1

        nlast_list.append(n0)

        n1 = nxy_list[n][nnen-2]    # 最終年前年の件数

        nmae_list.append(n1)

        ntot = ntot + n0

    if ct > 0:

        navr = round(ntot/ct,1)    # 最終年の平均件数(ただし0件以外の平均)

    else:

        navr = 0

    print(‘最終年の平均件数=’,navr,’対象件数=’,ct)

    # 重要出願人を判定

    vipap_list = []

    for n1, str1 in enumerate(ap_list):

        flg = 0

        if nlast_list[n1] > navr:    # 最終年の件数が平均以上

            if nlast_list[n1] > (npk_list[n1]*0.8):    # ピーク時の80%以上

                if nmae_list[n1] > 0:

                    if (nlast_list[n1]/nmae_list[n1]) > 1:    #増加率が100%以上

                        vipap_list.append(str1)

                        flg = 1

            if flg == 0:

                if nlast_list[n1] > navr:    # 最終年の件数が平均以上

                    if nlast_list[n1] > (npk_list[n1]*0.95):    # ピーク時の95%以上

                        vipap_list.append(str1)            

    print(‘重要出願人=’,vipap_list)

    # 最終年が最多の出願人数を書き出し

    n2 = len(vipap_list)

    # 書き出し人数書き出し

    f = open(‘sub_txt.txt’, ‘a’)

    f.write(str(n2) + “\n”)

    f.close()  

    # コメント追加

    if n2 > 0:

        wrd1 = ‘ 所定条件を満たす重要出願人は次のとおり。\n’

        # 重要出願人書き出し

        wrd2 =”

        for str1 in vipap_list:

            str1 = “  ” + str1 + “\n”

            wrd2 = wrd2 + str1

        wrd = wrd1 + wrd2

    if n2  == 0:

        if flg_n2 == 0:

            wrd = ‘ 所定条件を満たす重要出願人はなかった。\n’

        else:

            wrd = ‘ 所定条件を満たす重要出願人もなかった。\n’

    # 増加した出願人書き出し

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # print(fig_n,’‘,hyo_n)

    return (nfig,nhyo,arr1)

# スクリブト85  3-2-AZ-(5) コード別新規参入企業(バブルチャート)(図表とコメント作成、書き出し)

## 最終年の件数が5件以上でかつ最近に新規参入した出願人を新規参入として抽出

## 調査開始年に発行公報が無かった出願人を抽出

## 年平均件数(=横合計件数/(最終年発行開始年))を算出

## 平均増加率を算出

## 平均件数以上でかつ平均増加率以上の出願人を抽出

def buble_ap02(nfig,nhyo):    # 3-2-AZ-(5) コード別新規参入企業(バブルチャート)

    global ap_arr1

    global nnen

    global nen_list

    global nen_head_list

    global ncdtot

    global npmend

    # コメント追加

    print(”)

    wrd = ‘(5) コード別新規参入企業

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    ntot  = ncdtot

    nbest = 10

    # 図表Noを加算

    nfig = nfig + 1

    fig_n = ‘‘ + str(nfig)

    wrd1 = ‘ ‘ + fig_n + ‘は分析対象公報全体を対象として各出願人の新規参入評価点を集計し、

    wrd2 = ‘評価点が高かった出願人の年別発行件数を数値付きバブルチャートとして示したものである。\n’

    wrd01 = wrd1 + wrd2      

    print(‘wrd01=’,wrd01)

    # コメント書き出し

    wrd = wrd01

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # 調査開始年に発行公報が無かった出願人を抽出

    #  先頭の[]を削除

    sinki_arr1 = ap_arr1

    list2 = copy.deepcopy(sinki_arr1)    # arr1を深いコピー(参照元arr1を変化させない)

    del list2[0]

    head_list = sinki_arr1[0][:]    # ヘッダ

    list3 = [head_list]    # ヘッダを追加

    for str1 in list2:

        if type(str1[1]) is float:    # 開始年が0件ならばappend

            if str1[1] == 0:

                list3.append(str1)                

        if type(list2[1]) is int:    # typeintならばヘッダの年と判定しappend

            list3.append(str1)

    # 横合計を抽出

    list4 = []

    for str1 in list3:

        str2= str1[nnen+1]

        list4.append(str2)

    # 年平均件数(=横合計件数/(最終年発行開始年))を追加

    nsokei = 0    # 年平均件数の合計

    heikin = float(0)

    ny = 0

    nx = nnen

    list5 = []    # 年平均件数

    for y, str1 in enumerate(list3):

        ny = ny + 1

        if type(str1[1]) is float:

            heikin = list4[y] / (nx-1)

            nsokei = nsokei + heikin    # 年平均件数の合計を算出

            list5.append(heikin)

    # 全平均件数を算出

    pav = nsokei / len(list5)

    # 平均件数以上でかつ平均増加率以上の出願人を抽出

    list6 = [head_list]    # 新規参入出願人リスト

    for y,str1 in enumerate(list5):

        if y == len(list5)-1: break

        if type(str1) is float:

            if str1 > (nsokei / ny):    # 平均件数以上

                if str1 > pav:    # 平均増加率以上

                    list6.append(list3[y+1])

            else:

                if list3[y][nx-1] > 5:    # 最終年の件数が5件以上

                    if list3[y][3] > 0:    # 最近(調査開始年+2)に新規参入

                        list6.append(list3[y])                    

    # 年平均件数(=横合計件数/調査期間)を算出

    # 横合計欄=nnen+1

    navr_list = [‘年平均件数‘]

    for n1, nn1 in enumerate(list6):

        if (n1+1) == (nnen): break

        if n1> 0:

            nn01 = round(nn1[nnen]/nnen,1)

            navr_list.append(nn01)

    # 平均増加率(=(最終年前年件数調査開始年翌年件数)/(調査期間-2)を算出

    npavr_list = [‘平均増加率‘]

    for n1, nn1 in enumerate(list6):

        if (n1+1) == nnen: break

        if n1 >0:

            np = (nn1[nnen-1] – nn1[2])/(nnen-2)

            np = round(np,1)

            npavr_list.append(np)

    # 全年平均件数(=新規参入の縦合計/新規候補者数/調査期間)を算出

    nall = (ntot/len(list6))/nnen    # 全年平均件数

    #  増加傾向出願人(=平均増加率>0)の全体平均増加率を算出

    ntot = 0    # 増加傾向出願人の増加率

    npall = 0    # 全体平均増加率

    k = 0    # 増加傾向出願人の数

    for n1, nn1 in enumerate(navr_list):

        if n1 > 0:

            if nn1 > 0:    # 平均増加率>0

                k=k+1

                ntot = ntot + nn1

    if k > 0:

        npall = ntot/k    # 全体平均増加率

    else:

        npall = 100

    # 全年平均件数以上でかつ全体平均増加率以上の出願人(新規候補)を抽出

    newap_list = [‘新規候補フラグ‘]

    for n1, str1 in enumerate(list6):

        if (n1+3) ==  nnen: break

        if n1 > 0:

            bap = 0

            if navr_list[n1] > nall:    # 全年平均件数以上でかつ

                if npavr_list[n1] > npall:   # 全体平均増加率以上ならば

                    bap = 1    # 新規候補フラグ =1

            newap_list.append(bap)

    # 発行年評価値(=最先発行年)を算出

    fstnen_list = [‘発行年評価値‘]

    for n1, nn1 in enumerate(list6):

        if n1 > 0:

            for n2, nn2 in enumerate(nn1):

                if n2 > 0:

                    if nn2 > 0:

                        fstnen_list.append(n2+1)

                        break

    # 合計件数評価値(=11-合計件数順位)を算出・付与

    # 合計件数評価値を付与

    k = 11

    totrank_list = [‘合計件数評価値‘]

    for n1, str1 in enumerate(list6):    

        if n1 > 0:    

            if k > 0:

                k=k – 1

            else:

                k=0

            totrank_list.append(k)

    # 総合評価値を算出

    sogo_list = [‘総合評価値‘]

    print(‘fstnen_list=’,len(fstnen_list))

    print(‘totrank_list=’,len(totrank_list))

    print(‘newap_list=’,len(newap_list))

    for nn1 in range(len(fstnen_list)):

        if nn1 == (len(newap_list)): break

        if nn1 > 0:

            nn2 = (fstnen_list[nn1] + totrank_list[nn1])*newap_list[nn1]

            sogo_list.append(nn2)

    # 元表に追加

    df1 = pd.DataFrame(list6)

    df2 = pd.DataFrame(data=newap_list, columns=[‘新規候補フラグ‘])

    df3 = pd.DataFrame(data=fstnen_list, columns=[‘発行年評価値‘])

    df4 = pd.DataFrame(data=totrank_list, columns=[‘合計件数評価値‘])

    df5 = pd.DataFrame(data=sogo_list, columns=[‘総合評価値‘])

    df6 = pd.concat([df1, df2, df3, df4, df5], axis=1)

    # ソートのために0行目(ヘッダ相当)を削除

    df6 = df6.drop(df6.index[[0]])

    # ソート

    df6 = df6.sort_values(‘総合評価値‘, ascending=False)    # 降順

    # テスト用書き込み

    df6.to_csv(‘新規参入評価表.csv’,encoding=’utf-8′, index=False)

    # リスト化

    arr6 = df6.values

    # nbest読み込み

    arr6 = arr6[0:nbest]

    # 出願人リストを作成

    ap_list = []

    for n1,str1 in enumerate(arr6):

        ap_list.append(str1[0])

    # 発行年欄に絞り込み

    top_arr6 = arr6[:,1:nnen+1]

    # arr_nbestから件数リストを抽出

    nenlast = len(top_arr6)

    nmax = 0

    nxy_list = []

    nxy_list0 = []

    for  n1, str1 in enumerate(top_arr6):    # Y

        nx_list = []

        nx_list0 = []

        for n2, nn in enumerate(str1):    # X            

            if n2 == nnen+1: break        # 合計欄を除く

            if type(nn) != str:                 # 文字を除く

                nx_list0.append(nn)

                if (n2+1) == nenlast :                  

                    nn2 = nn*(npmend + 1)

                    nn2 = round(nn2,1)

                    nx_list.append(nn2)

                else:

                    nx_list.append(nn)

                if nn > nmax: nmax=nn                

        nxy_list.append(nx_list)

        nxy_list0.append(nx_list0)

    # print(‘元の件数=’,nxy_list0)

    # print(‘月数補正後の件数=’,nxy_list)

    y_len = len(nxy_list)

    # print(y_len)

    # 発行件数%

    npxy_list = []

    for str1 in nxy_list:

        npx_list = []

        for n2, x2 in enumerate(str1):

            n3= round(x2/nmax,2)

            npx_list.append(n3)

        npxy_list.append(npx_list)

    # 変数名変更

    x_list = nen_head_list

    y_list = ap_list

    print(‘x_list=’,x_list)

    print(‘y_list=’,y_list)

    print(‘nxy_list=’,nxy_list)

    print(fig_n)

    # def実行

    flg_n2 = 0

    if len(nxy_list) > 1:

        buble0(x_list,y_list,nxy_list, fig_n)

        # 図表書き出し

        doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

        figwrd = fig_n

        para = doc.add_paragraph(‘ ‘ + figwrd)

        para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

        para.runs[npara].font.size = docx.shared.Pt(14)

    else:

        nfig = nfig – 1

        fig_n = ‘‘ + str(nfig)

        flg_n2 = 1

    # (5) コード別新規参入企業(バブルチャート)のコメント

    # 新規参入企業として重要と判定された出願人(最終年の件数>=3)を判定

    n2 = 0

    newap_list = []

    for n1, str1 in enumerate(nxy_list):

        if n1 >= y_len: break

        if str1[nnen-1] >= 3:    # 最終年の件数>=3を判定

            n2 = n2 + 1

            newap_list.append(y_list[n1])

    print(‘重要と判定された新規参入企業=’,n2,newap_list)

    # コメント追加

    if n2 > 1:

        wrd1 = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)は次のとおり。\n’

        # 出願人書き出し

        wrd2 =”

        for str1 in newap_list:

            str1 = “  ” + str1 + “\n”

            wrd2 = wrd2 + str1

        wrd = wrd1 + wrd2

        # コメント書き出し

        wrd = wrd01 + wrd

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

        para.runs[npara].bold = True

    if  n2 <= 1:

        if flg_n2 == 1:    # チャートが無ければ

            wrd = ‘ 新規参入企業として評価が高かった出願人は無かった。\n’

        else:

            wrd = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)は無かった。\n’

        # コメント書き出し

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

        para.runs[npara].bold = True

        print(‘wrd=’,wrd)          

    # print(fig_n,’‘,hyo_n)

    return (nfig,nhyo)

# スクリブト86  3-2-AZ-(6) コード別の発行件数割合(判定、表作成、円グラフ)(図表とコメント作成、書き出し)

## 設定コードの下位コードであって10コードに近い階層を見つけ、その階層別の表と円グラフを作成する。

def cd_hyo01(nfig,nhyo):

    global  codehyo_list    # code

    global ncd

    global cdhead_list    # 一桁コード+コード内容

    global codehyo_list

    global code01_list

    global nketa    # 3,4,6

    global strketa   # ,,

    # コメント追加

    # wrd = ‘(6) コード別の発行件数割合\n’

    print(”)

    wrd = ‘(6) コード別の発行件数割合

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # (6) コード別の発行件数割合(表作成)    

    # コード欄データをリスト化

    pd_data = pat_data.iloc[:,9]    # コード欄

    code_list =[]

    for str1 in pd_data:

        str1 = ‘;’ + str1

        code_list.append(str(str1))

    # 指定桁(nketa)コードとコード内容読み込み

    code_nketa_list = []

    codewrd_nketa_list = []    # 改行有りリスト

    for str1 in codehyo_list:

        if str1[1][0] == cd01:

            if len(str1[1])  <= nketa:

                code_nketa_list.append(str1[1])

                str2 = str1[2]                

                if len(str2) > 30:

                    if len(str2) < 60:

                        str2 = ‘\n’ +str2[:29] + ‘\n’ + str2[29:58]

                    else:

                        str2 = str2[:29] + ‘\n’ + str2[29:58] + ‘\n’ + str2[58:87] 

                codewrd_nketa_list.append(str2)

    code_nketa_list.append(‘ ‘)

    codewrd_nketa_list.append(‘合計‘)

    # 指定桁コード別合計算出(指定桁は下位の桁以下を含めて集計)

    ntot = 0

    ncd_nketa_list = []    # 指定桁コード別合計

    for str1 in code_nketa_list:

        nn = 0

        for str2 in code_list:

            if str1 in str2:

                split_str2 = str2.split(‘;’)

                for str3 in split_str2:

                    if len(str1) < nketa:

                        if str1 == str3:

                            nn = nn + 1

                    else:

                        if str1 == str3[0:nketa]:

                            nn = nn + 1

        ntot = ntot + nn

        ncd_nketa_list.append(nn)

    nlast = len(code_nketa_list)

    ncd_nketa_list[nlast-1] = ntot

#    print(‘ncd_nketa_list=’,ncd_nketa_list)

#    print(‘ncd_nketa_list[nlast-1]=’,ncd_nketa_list[nlast-1])

    # %算出

    flg0 = 0

    np_nketa_list = []

    for str1 in ncd_nketa_list:

        if ntot> 0:

            np = (str1/ntot)*100

            np01 = round(np,1)

            if np01 > 0: flg0 = 1

            np_nketa_list.append(np01)

        else:

            np_nketa_list.append(0)

    # コードZ99のコード内容を修正

    for n1, str1 in enumerate(code_nketa_list):

        if str1 == ‘Z99A’:

            if code_nketa_list[n1-1] == ‘Z99’:

                if ncd_nketa_list[n1-1] == 0:

                    codewrd_nketa_list[n1-1] = ‘上記以外のその他

    if flg0== 0: 

        wrd = ‘ コード別の発行件数は無かった。

        para = doc.add_paragraph(wrd)

        print(wrd)

        return (nfig,nhyo)

    # 図表Noを加算

    nhyo = nhyo + 1

    hyo_n = ‘‘ + str(nhyo)

    # コメント追加

    wrd1 = ‘ ‘ + hyo_n + ‘はコード「

    wrd2 = cdhead_list[ncd]

    wrd3 = ‘」が付与された公報のコードを

    wrd4 = strketa

    wrd5 = ‘桁別で集計した集計表である。\n’

    wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)            

    # コードデータの行数

    nline = len(code_nketa_list)

    # DataFrame(改行有り)

    df1 = pd.DataFrame(data=code_nketa_list, columns=[‘コード‘])

    df2 = pd.DataFrame(data=codewrd_nketa_list, columns=[‘コード内容‘])

    df3 = pd.DataFrame(data=ncd_nketa_list, columns=[‘合計‘])

    df4 = pd.DataFrame(data=np_nketa_list, columns=[‘%’])

    # 横方向(axis=1)に結合

    df5=pd.concat([df1, df2, df3,df4], axis=1)

    # リスト化(改行有り)

    arr1 = df5.values

    print(hyo_n)

    # コード別集計表作成

    # 描画準備

    table_vals = arr1    # 表データ

    fig = plt.figure()

    ax = fig.add_subplot(111)    # nrowsncolsindexが全て一桁のときは、カンマを省略して111で良い

    # 表描画

    col_labels  = [‘コード‘,’コード内容‘,’合計‘,’%’]

    the_table = plt.table(cellText=table_vals,

                      colWidths=[0.05,0.4, 0.05, 0.05],    # 列の幅を指定

                      colLabels=col_labels,

                      loc=’center’)

    the_table.set_fontsize(40)

    the_table.scale(4, 5)    # 全体のサイズをX=5Y=10に設定

    for x in range(4):

        the_table[(0,x)].set_facecolor(‘lightgreen’)    # ヘッダを薄緑色に着色

        the_table[(0,x)].get_text().set_fontsize(’60’)    # フォントサイズ=60

        the_table[(0,x)].get_text().set_fontweight(‘bold’)    # フォント種=bold

    for j in range(nline+1):

        if j > 0:    # ヘッダを除いて

            the_cell = the_table[j,0]    # 1列目

            the_text = the_cell.get_text()

            the_text.set_horizontalalignment(‘left’)

            the_cell = the_table[j,1]    # 2列目

            the_text = the_cell.get_text()

            the_text.set_horizontalalignment(‘left’)

    the_cell = the_table[nline,1]    # 2列目

    the_text = the_cell.get_text()

    the_text.set_horizontalalignment(‘center’)    # 「合計」をcenterに配置

    plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)

    plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)

    for pos in [‘right’,’top’,’bottom’,’left’]:

        plt.gca().spines[pos].set_visible(False)

    # 図表書き出し

    plt.savefig(‘書き出し図表/’ + hyo_n +’.png’,bbox_inches=’tight’, pad_inches=0.05) 

    # 描画実行

    plt.show()

    # 図表書き出し

    doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)

    figwrd = hyo_n

    para = doc.add_paragraph(‘ ‘ + figwrd)

    para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

    para.runs[npara].font.size = docx.shared.Pt(14)

    # 第1位を判定

    nlast = len(arr1)

    nmax = 0

    cdmax = ”

    cdwdmax = ”

    npmax = 0    

    for n1, str1 in enumerate(arr1):

        if n1 == nlast-1: break

        if str1[2] > nmax: 

            nmax = str1[2]

            cdmax = str1[0]

            cdwdmax = str1[1]

            npmax = str1[3]

    # コメント追加

    wrd1 = ‘ この集計表によれば、コード「

    wrd2 = cdmax + “:” + cdwdmax

    wrd2 = wrd2.replace(‘\n’,”)    # 改行を削除

    wrd3 = ‘」が最も多く、

    wrd4 = str(npmax)

    wrd5 = ‘%を占めている。\n’

    wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5

    print(‘wrd=’,wrd)

    # まとめに書き出し

    m13_wrd01 = ‘下位分類の分析結果によれば、「‘ + wrd2 + ‘が特に多かった。\n’

    m13_wrd = copy.deepcopy(m13_wrd01)    # arr1を深いコピー(参照元arr1を変化させない)

    # コメント書き出し

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # (6) コード別の発行件数割合(円グラフ作成)

    # コメント追加

    # 図表Noを加算

    nfig = nfig + 1

    fig_n = ‘‘ + str(nfig)

    wrd =’ ‘ + fig_n + ‘は上記集計結果を円グラフにしたものである。\n’

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    nlast = len(df5)

    df6 = df5.drop(df5.index[[nlast-1]])    # 1行目(ヘッダ相当)を削除

    # リスト化

    arr1 = df6.values

    # 円グラフの描画データ作成

    codewrd_nketa_list01 = []

    cdwd_nketa_list01 = []

    np_nketa_list01 = []

    for str1 in arr1:

        str2 = str1[0] + ‘:’ + str1[1][0:5]

        codewrd_nketa_list01.append(str2)

        str3= str1[0] + ‘:’ + str1[1]

        nlen = len(str3)

        if nlen > 15:

            str4 = str3[0:15] + ‘・・・

        else:

            str4 = str3[0:15] 

        cdwd_nketa_list01.append(str4)

        np_nketa_list01.append(str1[3])

    # 凡例

    hanrei_nm = cdwd_nketa_list01    # コード内容を凡例として格納

    print(fig_n)

    # 円グラフ作成

    plt.pie(np_nketa_list01, labels=codewrd_nketa_list01, autopct=”%1.1f%%”,pctdistance=0.9,

        startangle=90,counterclock=False)

    # 円グラフの右横=2.7の位置に高さ=1で描画

    plt.legend(hanrei_nm, fontsize=12,bbox_to_anchor=(2.7, 1)) # 凡例の表示

    # 図表書き出し

    plt.savefig(‘書き出し図表/’ + fig_n +’.png’,bbox_inches=’tight’, pad_inches=0.05) 

    # 描画実行

    plt.show()

    # 図表書き出し

    doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

    figwrd = fig_n

    para = doc.add_paragraph(fig_n)

    para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

    para.runs[npara].font.size = docx.shared.Pt(14)

    # print(fig_n,’‘,hyo_n)

    return (nfig,nhyo)

# スクリブト87  3-2-AZ-(7) コード別発行件数の年別推移(判定、バブルチャート作成)(図表とコメント作成、書き出し)

## 設定コードの下位コードであって20コードに近い階層を見つけ、その階層別のバブルチャートを作成する。

def buble_cd01(nfig,nhyo):

    global pat_list

    global cd01

    global cdhead01

    global nen_list

    global nen_head_list

    global nnen

    global ncd

    global npmend

    import copy

    # コメント作成

    print(”)

    wrd = ‘(7) コード別発行件数の年別推移

    # 書き出し

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # 設定した一桁コードのデータに絞り込む

    nen_list01 = []    # 発行年データ

    code_list01 = []     # コード欄データ

    for str1 in pat_list:

        str2 = ‘;’ + str1[9]    # コード欄読み込み

        if bcd01 in str2:    # 設定一桁コードbcd01に絞り込む

            str3 = str1[2]    # 発行日欄を選択

            str3 = str3[0:4]        

            nen_list01.append(str3)

            str4 = str1[9]    # コード欄を選択

            code_list01.append(str4)

    ncdtot = len(nen_list01)

    # 設定一桁コードを含む公報から縦軸となるコードをリスト化

    bcode_list =[]

    for str1 in code_list01:

        split_str1 = str1.split(‘;’)

        for str2 in split_str1:

            if str2[0] == cd01:

                if len(str2) <= 6:    # 6桁コードならば

                    bcode_list.append(str(str2))

    # 重複なしコードリスト(縦軸)作成

    ncd_code_list = list(set(bcode_list))    # 重複を削除 

    # 縦軸(コード)別年別件数を算出

    # 集計表の初期化

    nx = nnen + 1    # ex: 11(10+合計欄)

    ny = len(ncd_code_list)    # ex: 44(コードAA04A)

    arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

    # 横軸設定

    for x, str1 in enumerate(nen_list):

        arr1[0][x+1] = str1

    arr1[0][0] = ‘コード

    arr1[0][nx] = ‘合計

    # 縦軸設定

    for y, str1 in enumerate(ncd_code_list):

        arr1[y+1][0] = str1

    # コード別年別集計

    for n1,str1 in enumerate(ncd_code_list):    # 縦軸(コード)

        str1 = ‘;’ + str1 + ‘;’

        for n2, str2 in enumerate(code_list01):    # コード欄データ

            str2  =  ‘;’ + str2 + ‘;’

            if str1 in str2:    # n2行のコードデータに縦軸(コード)が含まれていれば

                nen = nen_list01[n2]

                for n3, str3 in enumerate(nen_list):

                    if nen == str3:

                        nx01= n3 + 1

                        break

                arr1[n1+1][nx01] += 1

                arr1[n1+1][nx]  += 1

    # print(arr1[0:5])    # 元表

    arr2 = []

    for n1,str1 in enumerate(arr1):

        if n1 > 0:

            arr2.append(str1)

    # 合計でソート(‘合計欄=’,nx)

    arr2 = sorted(arr2, key=lambda x:x[nx-1], reverse=True)

    # 上位20コードに制限

    arr_nbest = []

    code_20 = []

    for n1, str1 in enumerate(arr2):

        if n1 == 20: break

        arr_nbest.append(str1)

        code_20.append(str1[0])

    # コードでソート

    df1 = pd.DataFrame(data=code_20,columns=[‘コード‘])

    df2 = pd.DataFrame(data=arr_nbest)

    # 横方向(axis=1)に結合

    df3=pd.concat([df1, df2], axis=1)

    # ソート

    df3 = df3.sort_values(‘コード‘, ascending=True)    # 昇順

    # 先頭率を削除

    df3 = df3.drop(columns=0)

    # リスト化

    arr_nbest = df3.values

    # print(‘arr_nbest=’,arr_nbest)

    # 6桁上位20コード再現

    code_20 = []

    for n1, str1 in enumerate(arr_nbest):

        code_20.append(str1[0])

    # 上位20コードにコード内容付加

    code_naiyo_20 = []

    for str1 in code_20:

        for str2 in codehyo_list:

            if str2[1] == str1:

                str3 = str1 + ‘:’ + str2[2]

                code_naiyo_20.append(str3)

    # arr_nbestから件数リストを抽出

    nenlast = len(nen_list)

    nmax = 0

    nxy_list = []

    nxy_list0 = []

    for  n1, str1 in enumerate(arr_nbest):    # Y

        nx_list = []

        nx_list0 = []

        for n2, nn in enumerate(str1):    # X

            if n2 == nnen+1: break        # 合計欄を除く

            if type(nn) != str:                 # 文字を除く

                nx_list0.append(nn)

                if (n2+1) == nenlast+1 :                  

                    nn2 = nn*(npmend + 1)

                    nn2 = round(nn2,1)

                    nx_list.append(nn2)

                else:

                    nx_list.append(nn)

                if nn > nmax: nmax=nn

        nxy_list.append(nx_list)

        nxy_list0.append(nx_list0)

    # print(‘元の件数=’,nxy_list0)

    # print(‘月数補正後の件数=’,nxy_list)

    # 合計欄のリスト作成

    ntot_list = []

    for  n1, str1 in enumerate(arr_nbest):    # Y

        str1 = int(str1[nx])

        ntot_list.append(str1)

    # 発行件数%

    npxy_list = []

    for str1 in nxy_list:

        npx_list = []

        for n2, x2 in enumerate(str1):

            if nmax < 0:

                n3= round(x2/nmax,2)

                npx_list.append(n3)

            else:

                npx_list.append(0)

        npxy_list.append(npx_list)

    # 図表Noを加算

    nfig = nfig + 1

    fig_n = ‘‘ + str(nfig)

    # print(fig_n)

    # 変数名変更

    x_list = nen_head_list

    y_list = code_naiyo_20

    print(‘x_list=’,x_list)

    print(‘y_list=’,y_list)

    print(‘nxy_list=’,nxy_list)

    print(fig_n)

    by_list = copy.deepcopy(y_list)

    bnxy_list = copy.deepcopy(nxy_list)

    if len(y_list) == 0:

        nfig = nfig – 1

        fig_n = ‘‘ + str(nfig)

        ewrd = ‘ コード別の発行件数は無かった。

        para = doc.add_paragraph(ewrd)

        print(ewrd)

        return (nfig,nhyo)

    else:

        # def buble0実行

        buble0(x_list,y_list,nxy_list, fig_n)

        # コメント作成

        wrd = ‘ ‘ + fig_n + ‘は六桁コード別の発行件数を年別に集計し、上位20までを数値付きバブルチャートにしたものである。\n’

        print(‘wrd=’,wrd)

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)       

        # 図表書き出し

        doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)

        figwrd = fig_n

        para = doc.add_paragraph(‘ ‘ + figwrd)

        para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

        para.runs[npara].font.size = docx.shared.Pt(14)

    # (7) コード別発行件数の年別推移(バブルチャート)のコメント

    flg_n2 = 0    # n2 == 1 なら flg_n2 = 1 にする

    # 最終年が最多のコードを抽出

    nnen = len(nen_list)

    ncd20 = len(code_naiyo_20)

    npk_list = []    # ピーク件数

    pkcd_list = []    # 最終年が最多のコード

    for n1, str1 in enumerate(code_naiyo_20):

        nxy_list01 = nxy_list[n1]

        np = 0

        for n2, str2 in enumerate(nxy_list01):

            if str2>np: 

                np=str2    # ピーク件数            

                pknen = n2+1    # ピーク年

                if pknen == nnen:    # 最終年がピークならば

                    pkcd_list.append(str1)

        np = round(np,1)

        npk_list.append(np)

    # 最終年が最多のコード数を算出

    n2 = len(pkcd_list)

#    n2 = n2 +1

    # 最終年の発行年件数読み込み

    nxy_list = bnxy_list

    nlast_list =[]

    for n1, str1 in enumerate(nxy_list):

        nlast_list.append(str1[nnen-1])

    # print(‘nlast_list=’,nlast_list,len(nlast_list))

    # 最終年前年の発行年件数読み込み

    nzennen_list =[]

    for n1, str1 in enumerate(nxy_list):

        nzennen_list.append(str1[nnen-2])

    # print(‘nzennen_list=’,nzennen_list,len(nzennen_list))

    bcode = code_naiyo_20[0]    # 1位のコード

    # 最終年に増加したコードを抽出

    inc_acs_list = []

    code_naiyo_20 = by_list

    for n1, str1 in enumerate(code_naiyo_20):

        if nlast_list[n1] – nzennen_list[n1] > 0:

            inc_acs_list.append(str1)

    # コメント作成

    flg_n2 = 0

    if n2 > 0:

        wrd1 = ‘ このチャートによれば、最終年が最多となっているコードは次のとおり。\n’

        # 最終年が最多のコード書き出し

        wrd2 =”

        for str1 in pkcd_list:

            str1 = “  ” + str1 + “\n”

            wrd2 = wrd2 + str1

        wrd = wrd1 + wrd2

    if n2 == 0:

        wrd = ‘ このチャートによれば、最終年が最多のコードはなかった。\n’

        flg_n2 = 1

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

#    para.runs[npara].bold = True

    # 重要コードを抽出

    ## 最終年の件数が平均以上でかつピーク時の80%以上でかつ増加率が100%以上か

    ## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要として書出す

    #最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出

    xlast = len(nxy_list[0])    # リストの列数

    # print(‘xlast=’,xlast)

    ntot = 0

    nlast01_list = []

    nmae_list = []

    for n in range(len(nlast_list)):

        n0 = nxy_list[n][xlast-1]    # 最終年(xlast-1)の件数

        nlast01_list.append(n0)

        n1 = nxy_list[n][xlast-2]    # 最終年前年(xlast-2)の件数

        nmae_list.append(n1)

        ntot = ntot + n0

    if ncd20 != 0:

        navr = round(ntot/ncd20,1)    # 最終年の平均件数

    # 重要コードを判定

    vipcd_list = []

    for n1, str1 in enumerate(code_naiyo_20):  

        flg = 0

        if nlast01_list[n1] > navr:    # 最終年の件数が平均以上

            if nlast01_list[n1] > (npk_list[n1]*0.8):    # ピーク時の80%以上

                if nmae_list[n1] > 0:

                    if (nlast01_list[n1]/nmae_list[n1]) > 1:    #増加率が100%以上

                        vipcd_list.append(str1)

                        flg = 1

            if flg == 0:

                if nlast01_list[n1] > navr:    # 最終年の件数が平均以上

                    if nlast01_list[n1] > (npk_list[n1]*0.95):    # ピーク時の95%以上

                        vipcd_list.append(str1)            

    n2 = len(vipcd_list)    # 最終年が最多のコード数

    # コメント作成

    if n2 > 0:

        wrd1 = ‘ 所定条件を満たす重要コードは次のとおり。\n’

        # 重要コード書き出し

        wrd2 =”

        for str1 in vipcd_list:

            str1 = “  ” + str1 + “\n”

            wrd2 = wrd2 + str1

        wrd = wrd1 + wrd2

    if n2 == 0:

        if flg_n2 == 0:

            wrd = ‘ 所定条件を満たす重要コードはなかった。\n’

        else:

            wrd = ‘ 所定条件を満たす重要コードもなかった。\n’

    print(‘wrd=’,wrd)    

    # コメント書き出し

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # ループ回数書き出し

    nloop02 = len(vipcd_list)

    # print(‘サンプル公報のループ回数=’,nloop02)

    if nloop02 == 0: return (nfig,nhyo)

    # コメント作成    

    wrd = ‘ 上記重要コードのサンプル公報によれば、次のような技術が出願されていた。\n’

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    # 重要コードのサンプル公報

    ## 上記重要コードを含む公報からサンプル10件を抽出し、発明の名称と要約の一部を書き出す。

    # 公報データリスト化

    pat_list = pat_data.values    

    # 公報番号読み込み

    pn_list =[]

    for n1, str1 in enumerate(pat_list):

        str1= str1[0]

        pn_list.append(str1)    

    # 発行日読み込み

    pd_list =[]

    for n1, str1 in enumerate(pat_list):

        if n1 == 0:

            str1= str1[2]

            pd_list.append(str1)  

        if n1 != 0:

            if “発行” not in str(str1[2]):

                str1= str1[2]

                pd_list.append(str1)        

    # 発明の名称読み込み

    ti_list =[]

    for n1, str1 in enumerate(pat_list):

        str1= str1[3]

        ti_list.append(str1)    

    # コード読み込み

    cd_list =[]

    for n1, str1 in enumerate(pat_list):

        str1= str1[9]

        cd_list.append(str1)    

#    print(‘コード=’,cd_list[0:2])

    # 要約読み込み(最初の文を抽出し、不要文字を削除)

    ab_list =[]

    for n1, str1 in enumerate(pat_list):

        str0 = str1[10].split(‘‘)    #「。」で分割

        str1 = str0[0] + ‘‘    # 最初の文を残す

        if len(str1) > 3:

            #データ中の空白を削除

            str1 = (str1.replace(” “, “”))    # 半角空白を削除

            str1 = (str1.replace(“ “, “”))    # 全角空白を削除

            str1 = (str1.replace(“,”, “”))    # ,」を「、」に置換        

            str1 = (str1.replace(“(57)”, “”))    # (57)」を削除

            str1 = (str1.replace(“【要約】“, “”))    # 「【要約】」を削除

            str1 = (str1.replace(“(修正有)“, “”))    # 「(修正有)」をを削除

            str1 = (str1.replace(“【課題】“, “”))    # 「【課題】」をを削除        

            ab_list.append(str1)

        else:

            ab_list.append(‘要約無し‘)        

    print(‘要約の最初の文=’,ab_list[0:1])

    # 重要コード毎にサンプル公報書き出し

    for n1, str1 in enumerate(vipcd_list):

        vipcd = str1

        split_str1 = str1.split(‘:’)

        vipcd01 = split_str1[0]

        vipcd01 = ‘;’ + vipcd01 + ‘;’    # 重要コード

        wrd =”

        pn01_list = []

        pd01_list = []

        ti01_list = []

        ab01_list = []

        for n2, str2 in enumerate(cd_list):

            str2 = ‘;’ + str2 + ‘;’

            if vipcd01 in str2:

                pn01_list.append(pn_list[n2])

                pd01_list.append(pd_list[n2])

                ti01_list.append(ti_list[n2])

                ab01_list.append(ab_list[n2])

        # DataFrame

        df1 = pd.DataFrame(data=pn01_list, columns=[‘公報番号‘])

        df2 = pd.DataFrame(data=pd01_list, columns=[‘発行日‘])

        df3 = pd.DataFrame(data=ti01_list, columns=[‘発明の名称‘])

        df4 = pd.DataFrame(data=ab01_list, columns=[‘要約‘])

        # 結合

        df6=pd.concat([df1, df2, df3,df4], axis=1)

        # サンプリング(n=10)

        npn = len(pn01_list)

        print(‘重要コード=’,vipcd01,’npn=’,npn,’‘)

        if npn>10:

            df_allsample = df6.sample(n=10, random_state=0)

        else:

            df_allsample = df6  

        # ソート

        df7 = df_allsample.sort_values(‘発行日‘, ascending=True)    # 昇順

        # リスト化

        samp_arr = df7.values

        # コード毎のコメントを作成

        wrd = “[” + vipcd + “]”

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

        para.runs[npara].bold = True

        wrd = ”

        for str3 in samp_arr:

            wrd = wrd + str3[0] + ” “+ str3[2] + “\n” + “ ” + str3[3] +  “\n”+  “\n”

        # サンプル公報書誌書き出し

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

#        para.runs[npara].bold = True

        # コメント追加(発明の名称を修正)

        titlewrd_list0 =[]

        for n1, str1 in enumerate(samp_arr):

            str1 = str1[2]

            if len(str1) > 100: str1 = str1[0:100] + “・・・”    # 100文字/件までに制限

            # print(n1,str1)

            titlewrd_list0.append(str1)

        # def実行(titlewrd_list0def titlematomeに渡し、処理結果をtitlewrd_list1として受け取る)

        titlewrd_list1 = titlematome(titlewrd_list0)    

        # print(‘titlewrd_list1=’,titlewrd_list1)

        # 2文字の単語を抽出

        two_wrd = []

        titlewrd_list =[]

        for n1, str1 in enumerate(titlewrd_list1):          

            # リスト化      

            title0 = str1.split(‘‘)

            for str3 in title0:

                if len(str3) == 1: str3 = “”

                if len(str3) == 2:

                    if str3 not in two_wrd:

                        two_wrd.append(str3)

                if str3 not in titlewrd_list:

                    titlewrd_list.append(str3)  

        # 削除する2文字単語を抽出

        del_wrd = []

        title_wrd = ”

        for str1 in titlewrd_list:

            for str2 in two_wrd:

                if str2 in str1:

                    if str2 != str1:

                        del_wrd.append(str2)

        # 上位表現を削除(ex:「対象識別」が有れば単語「識別」を削除する)

        if len(del_wrd) > 0:

            title_wrd = ”

            for str1 in titlewrd_list:

                for str2 in del_wrd:

                    if str1 != str2:

                        if title_wrd == ”:

                            title_wrd= str1

                        else:

                            if str1 not in title_wrd:

                                title_wrd= title_wrd + ‘‘ + str1

        else:

            title_wrd = ”

            for str1 in titlewrd_list:                    

                if str1 not in title_wrd:

                    title_wrd = title_wrd + ‘‘ + str1

        # 残った付与文字を置換および削除

        title_wrd = (title_wrd.replace(‘、、‘, ‘‘))    # 「、、」を「、」に置換

        title_wrd = (title_wrd.replace(‘、、‘, ‘‘))    # 「、、」を「、」に置換

        if title_wrd[0] == ‘‘:

            title_wrd = title_wrd[1:]    # 先頭の「、」を削除

        # コメント作成

        wrd1 = ‘ これらのサンプル公報には、

        wrd2 = title_wrd

        wrd3 = ‘などの語句が含まれていた。\n’

        wrd = wrd1 + wrd2 + wrd3

        print(wrd)

        # コメント書き出し

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

        para.runs[npara].bold = True

        # print(fig_n,’‘,hyo_n)

    return (nfig,nhyo)

# スクリブト88  3-2-AZ-(8) 出願人別・四桁コード別の公報発行状況(バブルチャート作成)(図表とコメント作成、書き出し)

## 設定コードの下位コードであって20コードに近い階層を見つけ、その階層別のバブルチャートを作成する。

def buble_ap03(nfig,nhyo):

    global pat_list

    global cd01

    global nen_list

    global nnen

    global ncd

    global ap_arr1

    global codehyo_list

    global nketa    # 3,4,6

    global strketa   # ,,

    global npmend

    print(”)

    strketa = strketa + ‘

    print(‘分析対象桁数=’,strketa)

    # コメント追加

    wrd1 = ‘(8) 出願人別・

    wrd2 = ‘コード別の公報発行状況

    wrd = wrd1 + strketa + wrd2

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

    para.runs[npara].bold = True

    # 図表Noを加算

    nfig = nfig + 1

    fig_n = ‘‘ + str(nfig)

    # 設定した一桁コードのデータに絞り込む

    ap_list01 = []    # 出願人欄データ

    code_list01 = []     # コード欄データ

    for str1 in pat_list:

        str2 = ‘;’ + str1[9]    # コード欄読み込み

        if bcd01 in str2:    # 設定一桁コードbcd01に絞り込む

            str3 = str1[4]    # 出願人欄を選択       

            ap_list01.append(str3)

            str4 = str1[9]    # コード欄を選択

            code_list01.append(str4)

    ncdtot = len(nen_list01)    # 一桁コード別全公報件数  

    # 判定桁数(nketa)コードとコード内容読み込み(横軸)

    code_nketa_list = []     # コード

    codewrd_nketa_list = []    # コード内容

    cd_wrd_list = []    # コード+コード内容

    for str1 in codehyo_list:

        if str1[1][0] == cd01:

            if len(str1[1])  <= nketa:

                code_nketa_list.append(str1[1])

                str2 = str1[2]

                codewrd_nketa_list.append(str2)

                str3 = str1[1] + ‘:’ + str2

                cd_wrd_list.append(str3)

    # 主要出願人リスト作成

    nbest = 10

    aptop_list= []

    for n1, str1 in enumerate(ap_arr1):

        if n1 == nbest +1: break

        if n1 > 0:

            aptop_list.append(str1[0])

    # 表の初期化

    nx = len(cd_wrd_list)

    ny = len(aptop_list)

    arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]

    # 横軸設定

    for x, str1 in enumerate(code_nketa_list):

        arr1[0][x+1] = str1

    # 縦軸設定

    for y, str1 in enumerate(aptop_list):

        arr1[y+1][0] = str1

    # 出願人別コード別集計

    for n1, str1 in enumerate(aptop_list):    # n1=y(上位出願人)

        str1 = ‘;’ + str1 + ‘;’

        for n2, str2 in enumerate(ap_list01):    # 出願人欄データ

            str2 = ‘;’ + str2 + ‘;’

            if str1 in str2:      # ;A会社;B会社;C会社;」の中に「;A会社;」が含まれていれば      

                for n4, str3 in enumerate(code_nketa_list):    # n4=x(設定桁数のコード)

                    str4 = code_list01[n2]    # コード欄データ

                    split_str4 = str4.split(‘;’)    # ;」で分離してリスト化

                    for str5 in split_str4:

                        str5 = str5[0:nketa]    # 先頭からnketaまでに修正

                        if str3 == str5:    # nketaまではその桁数で比較、nketa以上はnketaまでで比較

                            arr1[n1+1][n4+1] += 1    # 先頭行、先頭列はヘッダなので+1の配列に加算

    # print(arr1)    # 元表

    # 件数表作成

    nenlast = len(arr1)

    nmax = 0

    nxy_list = []

    for  n1, str1 in enumerate(arr1):    # Y

        if n1 > 0:

            nx_list = []

            for n2, nn in enumerate(str1):    # X

                if n2 > 0:

                    if n2 == nenlast :                  

                        str1 = nn*(npmend + 1)

                        str1 = round(nn,1)

                        nx_list.append(nn)

                    else:

                        nx_list.append(nn)

                    if nn > nmax: nmax=nn

            nxy_list.append(nx_list)

    # 発行件数%

    npxy_list = []

    for str1 in nxy_list:

        npx_list = []

        for n2, x2 in enumerate(str1):

            if nmax > 0:

                n3= round(x2/nmax,2)

                npx_list.append(n3)

            else:

                npx_list.append(0)

        npxy_list.append(npx_list)

    # 変数名変更

    x_list = code_nketa_list

    y_list = aptop_list

    print(‘x_list=’,x_list)

    print(‘y_list=’,y_list)

    print(‘nxy_list=’,nxy_list)

    print(fig_n)

    if nmax > 0:

#        print(fig_n)

        # def実行

        buble0(x_list,y_list,nxy_list, fig_n)

         # コメント追加

        wrd1 = ‘ ‘ + fig_n + ‘は主要出願人がどのような技術に注力しているかを見るためのものであり、

        wrd2 = ‘上位10社についてそれぞれ

        wrd3 = ‘コード別に集計し、数値付きバブルチャートとしてまとめたものである。\n’

        wrd = wrd1 + wrd2 + strketa + wrd3

        print(‘wrd=’,wrd)

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)           

        # 図表書き出し

        doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)        

        figwrd = fig_n

        para = doc.add_paragraph(‘ ‘ + figwrd)

        para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 中央揃え

        para.runs[npara].font.size = docx.shared.Pt(14)       

    else:

        # 図表Noを加算

        wrd=’ 出願人別・三桁コード別の公報はなかった。

        para = doc.add_paragraph(wrd)

        print(wrd)

        nfig = nfig – 1

        fig_n = ‘‘ + str(nfig)

        doc.add_page_break()    # 改頁

        return (nfig,nhyo)    

    # (8) 出願人別・四桁コード別の公報発行状況(コメント)

    ## 各出願人が最も注力しているコードを抽出し、コード別にまとめ、書き出す

    cd_ap_list = []

    for  n1, str1 in enumerate(arr1):

        if n1 > 0:

            nmax = 0

            for n2, str2 in enumerate(str1):

                if n2 > 0:

                    if str2 > 0:

                        if str2 > nmax: 

                            nmax = str2

                            bcd = arr1[0][n2]

                            bap = arr1[n1][0]

            if nmax > 0:

                cdap = bcd + ‘;’ + bap

                cd_ap_list.append(cdap)

    # コード別に書き出し

    bwrd = ”

    wrd_list = []

    for  n1, str1 in enumerate(code_nketa_list):

        for n2, str2 in enumerate(cd_ap_list):

            split_str2 = str2.split(‘;’)

            if str1 == split_str2[0]:

                if cd_wrd_list[n1] != bwrd:

                    str3 = ‘[‘ + cd_wrd_list[n1] + ‘]’

                    wrd_list.append(str3)

                str4 = ‘  ‘ + split_str2[1]

                wrd_list.append(str4)

                bwrd = cd_wrd_list[n1]

    # コメント追加

    wrd1 = ‘ このチャートから各出願人が最も注力しているコードを抽出し、コード別にまとめると以下のようになる。\n’

    # コード取得

    wrd2 =”

    for str1 in wrd_list:

        str1 = “ ” + str1 + “\n”

        wrd2 = wrd2 + str1

    wrd = wrd1 + wrd2

    # コード書き出し

    f = open(‘sub_txt.txt’, ‘a’)

    f.write(wrd)

    f.close()  

    print(‘wrd=’,wrd)

    para = doc.add_paragraph(wrd)    

    para.runs[npara].font.size = docx.shared.Pt(11)

#    para.runs[npara].bold = True

    doc.add_page_break()    # 改頁

    # print(fig_n,’‘,hyo_n)

    return (nfig,nhyo)

# スクリブト89   コード別個別分析一括処理(図表、コメント書き出し)

## コード別個別分析一括処理

print(”)

print(‘出力サンプル‘)

# テスト用初期値設定

# nfig = 11

# fig_n = ‘‘ + str(nfig)

# nhyo = 3

# hyo_n = ‘‘ + str(nhyo)

doc.add_page_break()    # 改頁

para = doc.add_paragraph(‘3-2 分類コード別個別分析‘)

para.runs[npara].font.size = docx.shared.Pt(14)

para.runs[npara].bold = True

wrd = “ 分析対象公報を分析対象公報を一桁コード別(AZ)に分け、それぞれのコードを分析した結果は以下のようになった。

print(wrd[0][0:30])

para = doc.add_paragraph(wrd)

# 公報データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)      # csv

pat_data = pat_data.dropna(how=’all’)    # 全列がNaNである行を削除

print(‘全公報件数=’,len(pat_data))

# 公報データリスト化

pat_list = pat_data.values

# 全公報発行年を抽出

nen_list = []

nen_head_list = []

for str1 in pat_list:

    str1 = str1[2]    # 発行日

    str1 = str1[0:4]    # 発行年

    nen_list.append(str1)

    nen_head_list.append(str1 + ‘‘)

# 重複を削除 

nen_list = list(set(nen_list))    # 重複を削除 

nen_list= sorted(nen_list)    # ソート

nen_head_list = list(set(nen_head_list))    # 重複を削除 

nen_head_list= sorted(nen_head_list)    # ソート

print(‘発行年ヘッダリスト(nen_head_list)=’,nen_head_list)

nnen = len(nen_list)

print(‘調査期間(nnen)=’,nnen,’‘)

# コード表読み込み

code_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’code‘) 

code_data = code_data.dropna(how=’all’)    # 全列がNaNである行を削除

print(‘全コード数(code_data)=’,len(code_data))

# コード表リスト化

codehyo_list = code_data.values

# 一桁コード抽出

code01_list = []    # 一桁コード

cdwrd01_list = []    # 一桁コード内容

cdhead_list = []    # 一桁コード+コード内容

for str1 in codehyo_list:

    str2 = str1[1]

    if len(str2) == 1:

        code01_list.append(str2)    # ex:A

        cdwrd01_list.append(str1[2])    # ex:「計算;計数」

        str3 = str2 + ‘:’ + str1[2]

        cdhead_list.append(str3)    # ex:A:計算;計数」

# print(‘一桁コード(code01_list)=’,code01_list)

# print(‘一桁コード内容(cdwrd01_list)[0:3]=’,cdwrd01_list[0:3])

# print(‘一桁コード:内容(cdhead_list)[0:3]=’,cdhead_list[0:3])

# 一桁コードのループ回数を設定

nloop01 = len(code01_list)

# 一桁コード別に分析し書き出す

nstoploop = 0

for n1, str1 in enumerate(code01_list):  

    ncd = n1

    cd01 = str1

    cdhead01 = cdhead_list[n1]

    # print(‘一桁コードNo(ncd)=’,ncd,’一桁コード名(cd01)=’,cd01,’一桁コード:内容‘,cdhead01)

    bcd01 = ‘;’ + cd01    # 設定コードbcdに絞り込むために先頭に区切り符号「;」を付加

    # 一桁コードのヘッダ書き出し(ex:3-2-1 A:計算;計数])

    wrd = ‘3-2-‘ + str(n1+1) + ‘ [‘ + cdhead01 + ‘]’ + ‘\n’

    wrd_cdhead= wrd

    para = doc.add_paragraph(wrd_cdhead)    

    para.runs[npara].font.size = docx.shared.Pt(12)

    para.runs[npara].bold = True

    # 設定した一桁コードのデータに絞り込む

    nen_list01 = []    # 発行年リスト

    ap_list01 = []     # 出願人リスト

    for str1 in pat_list:

        str2 = ‘;’ + str1[9]    # コード欄読み込み

        if bcd01 in str2:    # 設定コードbcdに絞り込む

            str3 = str1[2]    # 発行日欄を選択

            str3 = str3[0:4]        

            nen_list01.append(str3)

            str4 = str1[4]    # 出願人欄を選択

            ap_list01.append(str4)

    ncdtot = len(nen_list01)

    print(‘一桁コード別全公報件数(ncdtot)=’,ncdtot)

    code03_list = []

    code04_list = []

    code06_list = []

    for str1 in codehyo_list:

        # 3

        if str1[1][0] == cd01:

            if len(str1[1])  <= 3:

                code03_list.append(str1[1])

        # 4

        if str1[1][0] == cd01:

            if len(str1[1])  <= 4:

                code04_list.append(str1[1])

        # 6

        flg6 = 0

        if str1[1][0] == cd01:

            if len(str1[1])  <= 6:

                code06_list.append(str1[1])

                if len(str1[1]) >= 6: flg =1

        # print(‘六桁有りフラグ=’,flg6)

    # コード数算出

    ncd03 = len(code03_list)

    ncd04 = len(code04_list)

    ncd06 = len(code06_list)

    # 10との誤差が最小の桁数を判定

    n03 = abs(ncd03- 10)

    nmin = 3

    n04 = abs(ncd04- 10)

    n06 = abs(ncd06- 10)

    if n04 < n03: nmin = 4

    n_list = [n03,n04,n06]

    # 六桁コードが有れば

    if flg6 ==1:

        if n06 < n03: nmin = 6

    # print(’10に近い桁数=’,nmin)    

    # コードZ4桁に修正

    print(‘cd01=’,cd01)

    if cd01 == ‘Z’: nmin = 4

    # 桁数を指定

    nketa = nmin

    if nketa == 3: strketa = ‘

    if nketa == 4: strketa = ‘‘    

    if nketa == 6: strketa = ‘

    print(‘分析対象桁数=’,nketa)    # 3,4,6

    # def実行

    if ncdtot >= 10:    # 10件以上ならば

        print(”)

        print(‘出力サンプル(1)’)

        x,y = bar_graph01(nfig,nhyo)    # 3-2-AZ-(1) コード別発行件数の年別推移(棒グラフ)

        nfig = x

        nhyo = y

        print(”)

        print(‘出力サンプル(2)’)

        x,y = ap_hyo01(nfig,nhyo)         # 3-2-AZ-(2) コード別出願人別の発行件数割合(表と円グラフ)

        nfig = x

        nhyo = y

        print(”)

        print(‘出力サンプル(3)’)

        x,y = bar_graph02(nfig,nhyo)    # 3-2-AZ-(3)コード別出願人数の年別推移(棒グラフ)

        nfig = x

        nhyo = y

        print(”)

        print(‘出力サンプル(4)’)

        x,y,str1 = buble_ap01(nfig,nhyo)    # 3-2-AZ-(4) コード別出願人別発行件数の年別推移(バブルチャート)

        nfig = x

        nhyo = y

        print(”)

        print(‘出力サンプル(5)’)

        ap_arr1 = str1    # str1global

        x,y = buble_ap02(nfig,nhyo)    # 3-2-AZ-(5) コード別新規参入企業(バブルチャート)

        nfig = x

        nhyo = y

        print(”)

        print(‘出力サンプル(6)’)

        x,y = cd_hyo01(nfig,nhyo)      # 3-2-AZ-(6) コード別の発行件数割合(判定、表と円グラフ作成)

        nfig = x

        nhyo = y

        print(”)

        print(‘出力サンプル(7)’)

        x,y = buble_cd01(nfig,nhyo)    # 3-2-AZ-(7) コード別発行件数の年別推移(判定、バブルチャート作成)

        nfig = x

        nhyo = y

        print(”)

        print(‘出力サンプル(8)’)

        x,y = buble_ap03(nfig,nhyo)    # 3-2-AZ-(8) 出願人別・四桁コード別の公報発行状況(バブルチャート作成)

        nfig = x

        nhyo = y 

    else:

        wrd1 = ‘(‘ + str(ncdtot) + ‘‘ + ‘)’

        wrd = ‘ 公報件数が少なかったので分析対象外とした。‘ + wrd1

        para = doc.add_paragraph(wrd)  

        doc.add_page_break()    # 改頁

    doc.save(‘report.docx’)    

    # print(fig_n,’‘,hyo_n)

# スクリブト90 Z99AZ99Zのサンプル公報

## Z99AZ99Zを含む公報からそれぞれサンプル10件を抽出し、発明の名称と要約の一部を書き出す。

# 以下を実行するかを判定

code_data = pd.read_csv(‘./中間data/Z_code.csv’, encoding=’utf-8′)

code_list = code_data.values   

print(code_list)

flg = 0

for str1 in code_list:

    str1 = str1[1]

    if str1 == ‘Z99A’: flg = 1

if flg == 0: print(‘Z99Aが含まれていないのでスキップ‘)

if flg == 1: print(‘Z99Aが含まれているので以下を実行‘)

# Z99AZ99Zをリスト化

if flg == 1:

    print(”)

    print(‘出力サンプル‘)

    para = doc.add_paragraph(‘3-3 その他(Z99)のコード別全体分析‘)

    para.runs[npara].font.size = docx.shared.Pt(14)

    para.runs[npara].bold = True

    wrd = “ その他(Z99)のコードが付与された公報が多かったので、その他(Z99)のコードが付与されたそれぞれの公報をサンプリングし、以下に、その概要を示す。

    print(wrd)

    para = doc.add_paragraph(wrd)

    para = doc.add_paragraph(‘3-1-1 一桁コード別の発行件数割合‘)

    para.runs[npara].font.size = docx.shared.Pt(14)

    para.runs[npara].bold = True

    # Z99AZ99Zをリスト化

    code_data = pd.read_csv(‘./中間data/Z_code.csv’, encoding=’utf-8′)

    code_list = code_data.values   

    print(code_list)

    zcd_list = []

    for str1 in code_list:

        str1 = str1[1]

        if len(str1) == 4:

            zcd_list.append(str1)

    print(‘Z_code=’,zcd_list)

    # 公報データリスト化

    pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

    pat_list = pat_data.values  

    # 公報番号読み込み

    pn_list =[]

    for n1, str1 in enumerate(pat_list):

        str1= str1[0]

        pn_list.append(str1)    

    # 発行日読み込み

    pd_list =[]

    for n1, str1 in enumerate(pat_list):

        if n1 == 0:

            str1= str1[2]

            pd_list.append(str1)  

        if n1 != 0:

            if “発行” not in str(str1[2]):

                str1= str1[2]

                pd_list.append(str1)        

    # 発明の名称読み込み

    ti_list =[]

    for n1, str1 in enumerate(pat_list):

        str1= str1[3]

        ti_list.append(str1)    

    # コード読み込み

    cd_list =[]

    for n1, str1 in enumerate(pat_list):

        str1= str1[9]

        cd_list.append(str1)    

    # print(‘コード=’,cd_list[0:2])

    # 要約読み込み(最初の文を抽出し、不要文字を削除)

    ab_list =[]

    for n1, str1 in enumerate(pat_list):

        str0 = str1[10].split(‘‘)    #「。」で分割

        str1 = str0[0] + ‘‘    # 最初の文を残す

        if len(str1) > 3:

            #データ中の空白を削除

            str1 = (str1.replace(” “, “”))    # 半角空白を削除

            str1 = (str1.replace(“ “, “”))    # 全角空白を削除

            str1 = (str1.replace(“,”, “”))    # ,」を「、」に置換        

            str1 = (str1.replace(“(57)”, “”))    # (57)」を削除

            str1 = (str1.replace(“【要約】“, “”))    # 「【要約】」を削除

            str1 = (str1.replace(“(修正有)“, “”))    # 「(修正有)」をを削除

            str1 = (str1.replace(“【課題】“, “”))    # 「【課題】」をを削除        

            ab_list.append(str1)

        else:

            ab_list.append(‘要約無し‘)        

    print(‘要約の最初の文=’,ab_list[0:1])

    # Z99コード毎にサンプル公報書き出し

    pn01_list = []

    pd01_list = []

    ti01_list = []

    for n1, str1 in enumerate(zcd_list):

        zcd = str1

        pn01_list = []

        pd01_list = []

        ti01_list = []

        ab01_list = []    

        for n2, str2 in enumerate(cd_list):

            if str1 in str2:

                pn01_list.append(pn_list[n2])

                pd01_list.append(pd_list[n2])

                ti01_list.append(ti_list[n2])

                ab01_list.append(ab_list[n2])

        # DataFrame

        df1 = pd.DataFrame(data=pn01_list, columns=[‘公報番号‘])

        df2 = pd.DataFrame(data=pd01_list, columns=[‘発行日‘])

        df3 = pd.DataFrame(data=ti01_list, columns=[‘発明の名称‘])

        df4 = pd.DataFrame(data=ab01_list, columns=[‘要約‘])            

        # 結合

        df6=pd.concat([df1, df2, df3,df4], axis=1)

        # サンプリング(n=10)

        npn = len(ti01_list)

        if npn >10:

            df_allsample = df6.sample(n=10, random_state=0)

        else:

            df_allsample = df6 

        # print(str1,ti_sample)

        # ソート

        df7 = df_allsample.sort_values(‘発行日‘, ascending=True)    # 昇順

        # リスト化

        samp_arr = df7.values

        # コード毎のコメントを作成

        wrd = “[” + zcd + “]”

        print(wrd)

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

        para.runs[npara].bold = True

        wrd = ”

        for str3 in samp_arr:

            wrd = wrd + str3[0] + ” “+ str3[2] + “\n” + “ ” + str3[3] +  “\n”+  “\n”

        print(wrd)

        # 末尾を削除

        if wrd[-2] == ‘\n’:    # 末尾が ‘;’ならば末尾を除去

            np = len(wrd)

            wrd = wrd[0:np-2]

        # サンプル公報書誌書き出し

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

#        para.runs[npara].bold = True

        # コメント追加(発明の名称を修正)

        titlewrd_list0 =[]

        for n1, str1 in enumerate(samp_arr):

            str1 = str1[2]

            if len(str1) > 100: str1 = str1[0:100] + “・・・”    # 100文字/件までに制限

            # print(n1,str1)

            titlewrd_list0.append(str1)

        # def実行(titlewrd_list0def titlematomeに渡し、処理結果をtitlewrd_list1として受け取る)

        titlewrd_list1 = titlematome(titlewrd_list0)    

        # print(‘titlewrd_list1=’,titlewrd_list1)

        # 2文字の単語を抽出

        two_wrd = []

        titlewrd_list =[]

        for n1, str1 in enumerate(titlewrd_list1):          

            # リスト化      

            title0 = str1.split(‘‘)

            for str3 in title0:

                if len(str3) == 1: str3 = “”

                if len(str3) == 2:

                    if str3 not in two_wrd:

                        two_wrd.append(str3)

                if str3 not in titlewrd_list:

                    titlewrd_list.append(str3)  

        # 削除する2文字単語を抽出

        del_wrd = []

        title_wrd = ”

        for str1 in titlewrd_list:

            for str2 in two_wrd:

                if str2 in str1:

                    if str2 != str1:

                        del_wrd.append(str2)

        # 上位表現を削除(ex:「対象識別」が有れば単語「識別」を削除する)

        if len(del_wrd) > 0:

            title_wrd = ”

            for str1 in titlewrd_list:

                for str2 in del_wrd:

                    if str1 != str2:

                        if title_wrd == ”:

                            title_wrd= str1

                        else:

                            if str1 not in title_wrd:

                                title_wrd= title_wrd + ‘‘ + str1

        else:

            title_wrd = ”

            for str1 in titlewrd_list:                    

                if str1 not in title_wrd:

                    title_wrd = title_wrd + ‘‘ + str1

        # 残った付与文字を置換および削除

        title_wrd = (title_wrd.replace(‘、、‘, ‘‘))    # 「、、」を「、」に置換

        title_wrd = (title_wrd.replace(‘、、‘, ‘‘))    # 「、、」を「、」に置換

        if title_wrd[0] == ‘‘:

            title_wrd = title_wrd[1:]    # 先頭の「、」を削除

        # コメント作成

        wrd1 = ‘ これらのサンプル公報には、

        wrd2 = title_wrd

        wrd3 = ‘などの語句が含まれていた。\n’

        wrd = wrd1 + wrd2 + wrd3

        print(wrd)

        # コメント書き出し

        para = doc.add_paragraph(wrd)    

        para.runs[npara].font.size = docx.shared.Pt(11)

        para.runs[npara].bold = True

        doc.add_page_break()    # 改頁

    doc.save(‘report.docx’)

# スクリブト91  第四章 まとめ(コメント書き出し)

print(”)

print(‘出力サンプル‘)

# doc.add_page_break()    # 改頁

para = doc.add_paragraph(‘第四章 まとめ‘)

para.runs[npara].font.size = docx.shared.Pt(16)

para.runs[npara].bold = True

wrd = “ この調査では、機械学習で使用されているpythonによりコード化し、コードを付与した公報データをグラフ化した。

para = doc.add_paragraph(wrd)    # この調査では、機械学習で使用されているpython

print(‘wrd=’,wrd)

# wrd01 = “ コード化はIPCを中心としており、その1桁コードは次のとおり。\n”

wrd01 = “ コード化はIPCを中心としており、その1桁コードは次のとおり。

wrd = wrd01 + wrd_cd1_list

para = doc.add_paragraph(wrd)

print(‘wrd=’,wrd)

#コメント追加

with open(“matome.txt”,”r”) as f:

    wrd = f.readlines()    

para = doc.add_paragraph(wrd)    # 分析結果は以下のとおり

print(‘wrd=’,wrd)

#エンドコメント追加

wrd = ‘ なお、この分析は全てプログラム処理による簡易的なものであるので、さらに精度の高い分析が必要であれば、特許調査会社の専門家による検索式作成と全件目視チェックによる分析を依頼することが望ましい(ただし数百万円と数ヶ月の期間が必要となるかもしれません)。

para = doc.add_paragraph(wrd)    # なお、この調査はほとんどがプログラム処理

print(‘wrd=’,wrd)

doc.save(‘report.docx’)

# print(fig_n,’‘,hyo_n)

print(‘レポート作成が終了しました。‘)