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

特許出願動向調査_multiV05.ipynb

/

# スクリプト処理内容の概要

## 複数のサブテーマの公報データを結合してテーマ全体の公報データを作成し、

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

## コード化(1桁目はサブテーマのコードを割り当てる)

## 集計

## 図表作成

## コメント作成

## レポート作成

# 準備

## 分析公報data.csvに公報データを設定する。

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

## サブテーマ名とコードを「subテーマ対照表」のシート「code表」に設定する。

# データの保存

## 公報データはサブテーマ毎に「subテーマ一括分析公報.xlsx」の各シートに保存する。

## 集計結果は行数が少なく、かつ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)            

    # print(‘nxy_list01=’,nxy_list01) 

    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(‘入力パラメータ‘,lenx,leny,nlwrd,nwdmax, ‘基準以下‘,npwd, ‘>’, round(nytot10,4))

        else:

            print(‘入力パラメータ‘,lenx,leny,nlwrd,nwdmax, ‘基準以上‘,npwd, ‘<‘, round(nytot10,4))

    else:

        print(‘入力パラメータ‘,lenx,leny,nlwrd,nwdmax, round(nytot10,4))   

    print(‘出力パラメータ‘,’No=’,bn+2,’/’,pax,pay,nxsize,nysize,xh_y0,x1,xm,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’)

                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]

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

                    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’)

                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’)

                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]

            for n2, np1 in enumerate(nstr2):

                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’)

                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バブルチャート作成の作成パターンを追加または修正する。

print(”)

print(‘出力サンプル‘)

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

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

y_list= [‘N01:医学または獣医学;衛生学‘, ‘N02:物理的または化学的方法または装置一般‘, ‘N02B:ハロゲン,硫黄,セレン,テルル,りん,窒素またはそれらの化合物からなる触媒‘, ‘N03A:加熱するかまたは加熱することなく,衝撃または他の圧力を加えることによる非電気的接合‘, ‘N04:無機化学‘, ‘N05:有機化学 ‘, ‘N05A:硝酸もしくは亜硝酸のエステルまたは炭素骨格に結合しているニトロまたはニトロソ基を含有する化合物の製造・・・‘, ‘N05B01:周期表の第8族,第9族,第10族または第18族の元素を含有する化合物‘, ‘N06:有機高分子化合物;化学的加工;組成物‘, ‘N08:生化学;ビール;酒;;酢;微生物学;酵素学;遺伝子工学‘, ‘N08A:突然変異または遺伝子工学‘, ‘N08B01:アプタマー‘, ‘N08C:光学的手段‘, ‘N08C01:蛍光‘, ‘N09:測定;試験‘, ‘N09D:ハイブリッドコンデンサ‘, ‘N10D04:触媒の選択‘, ‘N10D05:炭素を主とする電極‘, ‘N10E:無し‘, ‘N99:その他‘]

nxy_list= [[2.0, 3.0, 3.0, 3.0, 2.0, 3.0, 4.0, 8.0, 5.0, 4.0, 3.0, 2.4], [4.0, 6.0, 5.0, 1.0, 0.0, 4.0, 2.0, 2.0, 1.0, 2.0, 1.0, 2.4], [1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 1.0, 0.0, 0.0, 2.4], [0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 3.0, 3.0, 0.0, 0.0, 0.0, 2.4], [2.0, 0.0, 1.0, 3.0, 1.0, 3.0, 2.0, 4.0, 2.0, 2.0, 1.0, 2.4], [9.0, 3.0, 5.0, 4.0, 2.0, 3.0, 5.0, 10.0, 8.0, 6.0, 5.0, 3.6], [4.0, 1.0, 1.0, 0.0, 0.0, 3.0, 1.0, 1.0, 1.0, 2.0, 0.0, 3.6], [1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 2.4], [4.0, 3.0, 3.0, 3.0, 2.0, 5.0, 5.0, 2.0, 2.0, 2.0, 0.0, 1.2], [1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 2.0, 0.0, 2.4], [7.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 2.0, 1.0, 2.0, 0.0, 2.4], [4.0, 1.0, 2.0, 4.0, 0.0, 1.0, 3.0, 4.0, 4.0, 3.0, 0.0, 1.2], [0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 4.0, 1.0, 3.0, 3.0, 3.6], [1.0, 0.0, 1.0, 3.0, 0.0, 1.0, 3.0, 3.0, 2.0, 3.0, 0.0, 1.2], [5.0, 1.0, 1.0, 7.0, 1.0, 2.0, 2.0, 6.0, 5.0, 4.0, 5.0, 12.0], [2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 1.2], [0.0, 3.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 0.0, 2.0, 0.0, 1.2], [1.0, 8.0, 4.0, 2.0, 1.0, 2.0, 1.0, 2.0, 1.0, 1.0, 0.0, 1.2], [0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 2.4], [6.0, 4.0, 5.0, 17.0, 9.0, 3.0, 4.0, 5.0, 3.0, 8.0, 5.0, 3.6]]

#

#

# 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発行件数の年別推移(折線グラフ)にデータを設定し、テストする。

print(”)

print(‘出力サンプル‘)

# 折線データ設定

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

code_list= [‘A:液体用容積形機械;液体または圧縮性流体用ポンプ‘, ‘B:基本的電気素子‘, ‘C:研削;研磨‘, ‘D:電気分解または電気泳動方法;装置 ‘, ‘E:機械要素‘, ‘F:電力の発電,変換,配電‘, ‘G:測定;試験‘, ‘H:物理的または化学的方法一般‘, ‘I:上水;下水‘, ‘Z:その他‘]

arr_nxny= [[42, 26, 35, 43, 41, 34, 196, 165, 216.0, 83, 51], [41, 36, 48, 107, 146, 94, 124, 130, 202.3, 122, 71], [17, 19, 20, 58, 90, 61, 58, 70, 104.6, 66, 33], [3, 8, 8, 13, 20, 11, 20, 33, 51.4, 28, 19], [8, 8, 5, 13, 11, 14, 67, 30, 51.4, 18, 5], [9, 12, 5, 20, 13, 8, 24, 24, 49.7, 24, 10], [5, 3, 4, 15, 22, 13, 22, 21, 41.1, 22, 11], [1, 5, 9, 5, 6, 7, 24, 6, 24.0, 13, 11], [4, 5, 9, 5, 6, 8, 14, 35, 27.4, 6, 9], [4, 6, 10, 11, 9, 12, 19, 25, 37.7, 15, 13]]

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

            #print(‘flg3=’,flg3)

    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

        # print(‘kp=’,kp,’km=’,km)

        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

        # print(nstt, ‘-‘,nstp,’k=’,k)

        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

        # print(‘kp=’,kp,’km=’,km)

        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)

    # print(‘ボトム年pymin=’,pymin,type(pymin))

    # print(‘ボトム年no:npymin=’,npymin,type(npymin))

    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)

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

    # print(‘ピーク年no:npymax=’,npymax,type(npymax))

    ppymax = pken_list[bn1]

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

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

    flgup0 = 0

    newpystt = 0

    # print(‘nyken_list[0]=’,nyken_list[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

    #print(‘開始年からの連続増加年数nupmax=’,nupmax)

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

    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 “減少” 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)

                #print(‘wrdud7=’,wrdud)                

                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

    # print(“ptn2=”,ptn2)

    # 最終年のパターン    

    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:     

                        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 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

        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)

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

        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 = “最終年近傍は減少傾向である。

            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 = “発行件数は少ないが、最終年近傍では増減(減少し増加)していた。”        

        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

print(”)

print(‘出力サンプル‘)

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

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

list3= [146, 127, 142, 124, 130, 82, 96, 20, 38, 31.0]

# 最終月数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(‘list2=’,list2)

# print(‘list3=’,list3)

# print(‘合計発行件数=’,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_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(‘のプログラム、‘, ‘‘)

        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

print(”)

print(‘出力サンプル‘)

# 語句変換表読み込み

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 == 1000: break

    if n1 >= 900:

        if len(str1) > 100: str1 = str1[0:100] + “・・・”    # 100文字/件までに制限

        print(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を集計・分析してコード化する。

#

# スクリブトサブテーマ対照表読み込み

import pandas as pd

import numpy as np

import collections

import openpyxl

import sys

print(”)

print(‘出力サンプル‘)

# サブテーマ読み込み

subtema_data = pd.read_excel(‘テーマ設定data.xlsx’,sheet_name=’subテーマ‘) 

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

print(‘サブテーマ数=’,len(subtema_data))

# コード読み込み

subtema_data01 = subtema_data.iloc[:,0]

subtema_list01 = []

for str1 in subtema_data01:

    subtema_list01.append(str1)

print(‘サブテーマコード=’,subtema_list01)

# サブテーマ読み込み

subtema_data02 = subtema_data.iloc[:,1]

subtema_list02 = []   

for str1 in subtema_data02:

    subtema_list02.append(str1)

print(‘サブテーマ名=’,subtema_list02)

subcode = subtema_list01[0]

subtema = subtema_list02[0]

print(‘サブコード=’,subcode)

print(‘サブテーマ=’,subtema)

#

#

# スクリブト2 分類修正表読み込み

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)

# 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)

#

#

# スクリブト3 特許分類表読み込み

print(”)

print(‘出力サンプル‘)

sec_list = [‘a’]            # セクションのグローバル変数

sectxt_list = [‘a’]       # セクション内容のグローバル変数

cl_list = [‘a’]               # クラスのグローバル変数

cltxt_list = [‘a’]          # クラス内容のグローバル変数

subc_list= [‘a’]          # サブクラスのグローバル変数

subctxt_list= [‘a’]     # サブクラス内容のグローバル変数

ipc_list= [‘a’]             # IPCのグローバル変数

ipctxt_list = [‘a’]        # IPC内容のグローバル変数

# セクションデータ読み込み

pat_data2 = pd.read_excel(‘IPC分類表.xlsx’, sheet_name=’セクション表‘)

print(‘セクション数=’,len(pat_data2))

# セクション読み込み

sec_data = pat_data2.iloc[:,1]

sec_list =[]

for str1 in sec_data:

    sec_list.append(str(str1))    

    # セクション内容読み込み

    sectxt_data = pat_data2.iloc[:,2]

    sectxt_list =[]

    for str2 in sectxt_data:

        sectxt_list.append(str(str2))

print(‘セクション=’,sec_list)

print(‘セクション内容=’,sectxt_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))  

print(‘クラス=’,cl_list[0:3])

# クラス内容読み込み

cl_data2 = pat_data2.iloc[:,2]

cltxt_list =[]

for str1 in cl_data2:

    cltxt_list.append(str(str1))

print(‘クラス内容‘,cltxt_list[0:3])

# サブクラスデータ読み込み

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(str1)

print(‘サブクラス=’,subc_list[0:5])

# サブクラス内容読み込み

subc_data02 = pat_data3.iloc[:,2]

subctxt_list =[]

for str1 in subc_data02:

    subctxt_list.append(str1)

print(‘サブクラス内容=’,subctxt_list[0:3])

# 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_list =[]

for str3 in ipc_data01:

    ipc_list.append(str(str3))   

print(‘IPC=’,ipc_list[0:3])                

# 分類内容読み込み

ipc_data2 = pat_data05.iloc[:,4]                

ipctxt_list =[]

for str3 in ipc_data2:

    ipctxt_list.append(str(str3))     

print(‘IPC内容=’,ipctxt_list[0:5])

#

#

スクリブト4 公報のIPCFI読み込み

print(”)

print(‘出力サンプル‘)

ipc_list01 = [‘a’]    # 公報のIPCのグローバル変数

fi_list01 = [‘a’]      # 公報のFIのグローバル変数

min_clst = 0          # クラスタ化最小件数のグローバル変数

sub_sheet = ‘A’    # 初期設定

def kohoipcfi_read(sub_sheet):

    print(‘シート=’,sub_sheet)

    # 公報xlsxデータ読み込み

    pat_data0 = pd.read_excel(‘subテーマ一括分析公報.xlsx’,sheet_name=sub_sheet) 

    # 公報csvデータ読み込み

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

    print(‘公報件数=’,len(pat_data))

    # クラスタ化する最小件数を設定

    global min_clst

    if len(pat_data) > 10000:    # 公報件数が多ければ最小件数も多くする

        min_clst = len(pat_data) * 0.025

    else:

        min_clst = len(pat_data) * 0.05

    # IPC読み込み

    ipc_data = pat_data.iloc[:,6]

    global ipc_list01

    ipc_list01 =[]

    for str1 in ipc_data:

        str0 = str(str1) + ‘;’

        ipc_list01.append(str0)

    # FI読み込み

    fi_data = pat_data.iloc[:,7]

    global fi_list01

    fi_list01 =[]

    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(“ “, “”))    # 全角空白を削除

            str0 = str(str1) + ‘;’

            fi_list01.append(str0)

        else:

            fi_list01.append(‘分類無し‘)

#    print(‘クラスタ化最小件数=’,min_clst)

    return ipc_list01, fi_list01,min_clst

#

#

# スクリブト5 IPCFIの修正

print(”)

print(‘出力サンプル‘)

ipc_list02 = [‘a’]    # 修正公報修正IPCのグローバル変数

fi_list02 = [‘a’]      # 修正公報FIのグローバル変数

def ipcfi_correct():

    # IPC修正

    global ipc_list02

    ipc_list02 =[]

    for str1 in ipc_list01:

        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)

    # FI修正

    global fi_list02

    fi_list02 =[]

    for str1 in fi_list01:

        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)

    return ipc_list02, fi_list02

#

#

# スクリブト6 公報データを分割し、クラスに修正

print(”)

print(‘出力サンプル‘)

ipc_list3 = [‘a’]    # クラスのグローバル変数

hindo_list3 = 0    # クラス出現回数のグローバル変数

def class_shukei():

    class_list = []

    for str1 in ipc_list02:

        ipc_split = str1.split(‘;’)    # 分割

        list1 = []

        for str2 in ipc_split:    # 展開し、クラスに修正

            str2 = str2[0:3]

            list1.append(str2)

        class_list.append(list1)

    # [[]][]に変換

    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(クラス)別の集計表(クラス集計表)を作成

    global ipc_list3

    global hindo_list3

    ipc_list3 = []

    hindo_list3 = []

    for n,str1 in enumerate(ipc_n_list):

        ipc_list3.append(str1[0])

        hindo_list3.append(str1[1])

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list3,columns=[‘クラス‘])

    df2 = pd.DataFrame(data=hindo_list3,columns=[‘出現頻度‘])

    # 集計表にまとめる

    df3=pd.concat([df1, df2], axis=1)

    # CSVとして書き出し

    df3.to_csv(‘./中間data/class_hindo.csv’,encoding=’utf-8′, index=False)

    print(‘class_hindo.csvを書き出しました‘)

    return ipc_list3, hindo_list3

#

#

# スクリブトコアクラスに3桁コードを付与

## 出現頻度がmin_clst以上のクラスをコアクラスとして3桁コードを付与

print(”)

print(‘出力サンプル‘)

coreclcode_list = [‘a’]    # コアクラスコード グローバル変数

corecltxt_list = [‘a’]       # コアクラス内容 グローバル変数

def coreclass_fuyo():

    global cl_list

    global cltxt_list

    global hindo_list3

    global coreclass_list

    global coreclcode_list

    global corecltxt_list

    global min_clst

    # min_clst以上のクラスを読み込み

    coreclass_list = []

    for n1, nhindo in enumerate(hindo_list3):

        if nhindo > min_clst:

            bclass = ipc_list3[n1]

            coreclass_list.append(bclass)

    # coreclass_listでソート

    coreclass_list = sorted(coreclass_list)

    # コアクラスに3桁コードを付与

    classcode_list = []

    n_chr =64

    for str1 in coreclass_list:

        n_chr = n_chr + 1

        str1 = chr(n_chr)

        classcode_list.append(str1)

    # コード内容付与

    ct1 = 0

    coreclcode_list= []

    corecltxt_list = []

    for n1,str1 in enumerate(coreclass_list):

        # コード付与

        ct1 = ct1 + 1

        if ct1 <= 9: ct1_str = ‘0’ + str(ct1)

        if ct1 >= 10: ct1_str = str(ct1) 

        str2 = subcode + ct1_str

        coreclcode_list.append(str2)

        # コード内容を追加

        for n2, str3 in enumerate(cl_list):

            if str1 == str3:

                corecltxt_list.append(cltxt_list[n2])

    # DataFrame

    df1 = pd.DataFrame(data=coreclass_list,columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=coreclcode_list,columns=[‘コード‘])

    df3 = pd.DataFrame(data=corecltxt_list,columns=[‘コード内容‘])

    # 集計表にまとめる

    df4=pd.concat([df1, df2, df3], axis=1)

    # CSVとして書き出し

    df4.to_csv(‘./中間data/class_code.csv’,encoding=’utf-8′, index=False)

    print(‘class_code.csvを書き出しました‘)

    return coreclass_list, coreclcode_list, corecltxt_list

#

#

# スクリブト8 IPCサブクラス別出現頻度を集計

print(”)

print(‘出力サンプル‘)

subcl_list4 = [‘a’]         # サブクラスのグローバル変数

subclhindo_list4 = 0    # サブクラス出現回数のグローバル変数

def subclass_shukei():

    global subcl_list4

    global subclhindo_list4

    # 公報データを分割し、サブクラスに修正

    subclass_list = []

    for str1 in ipc_list02:

        ipc_split = str1.split(‘;’)    # 分割

        list1 = []

        for str2 in ipc_split:    # 展開し、サブクラスに修正

            str2 = str2[0:4]

            list1.append(str2)

        subclass_list.append(list1)

    # [[]][]に変換

    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)

        ipc_list.append(str2[0])

    # 出現頻度の高い順にソート

    ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)

    # IPC4(サブクラス)別の集計表(クラス集計表)を作成

    subcl_list4 = []

    subclhindo_list4 = []

    for n,str1 in enumerate(ipc_n_list):

        subcl_list4.append(str1[0])

        subclhindo_list4.append(str1[1])

    # DataFrame

    df1 = pd.DataFrame(data=subcl_list4,columns=[‘サブクラス‘])

    df2 = pd.DataFrame(data=subclhindo_list4,columns=[‘出現頻度‘])

    # 集計表にまとめる

    df3=pd.concat([df1, df2], axis=1)

    # CSVとして書き出し

    df3.to_csv(‘./中間data/subclass_hindo.csv’,encoding=’utf-8′, index=False)

    print(‘subclass_hindo.csvを書き出しました‘)

    return subcl_list4, subclhindo_list4

#

#

# スクリブトコアサブクラス毎に4桁コードを付与

## コアクラス毎に出現頻度がmin_clst/2以上(以下なら上位3)のサブクラスを抽出し、

## 抽出したサブクラスをコアサブクラスとし、4桁コードを付与

print(”)

print(‘出力サンプル‘)

subcl_list01 = [‘a’]       # コアサブクラスのグローバル変数

coresubcd_list = [‘a’]    # コアサブクラスコードのグローバル変数

coresubtxt_list = [‘a’]    # コアサブクラス内容のグローバル変数

def corsubcl_fuyo():

    global subcl_list4

    global subclhindo_list4

    global coreclcode_list

    global corecltxt_list

    global min_clst

    global subcl_list01

    global coresubcd_list

    global coresubtxt_list

    # コアクラスに属しかつmin_clst/2以上のサブクラスをコアサブクラスとして読み込む

    coresubclass_list = []

    subclasscode_list = []

    subcl_list4

    for n1, str1 in enumerate(subcl_list4):

        for n2, str2 in enumerate(coreclass_list):

            if str2 in str1:

                if subclhindo_list4[n1] > min_clst/2:

                    coresubclass_list.append(str1)

                    str4 = coreclcode_list[n2] + ‘A’    # 仮コード‘A’を付与classcode_list

                    subclasscode_list.append(str4)

    # DataFrame

    df1 = pd.DataFrame(data=coresubclass_list,columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=subclasscode_list,columns=[‘コード‘])

    # 結合

    df20=pd.concat([df1, df2], axis=1)

    # サブクラスでソート

    df20 = df20.sort_values(‘コード‘, ascending=True)    # 昇順

    # df20読み込み

    # 新コアサブクラス読み込み

    coresubclass_list = df20.iloc[:,0]

    subcl_list01 = []

    for str1 in coresubclass_list:

        subcl_list01.append(str1)

    # 新コアサブクラスコード読み込み

    coresubclass_list = df20.iloc[:,1]

    subcl_list02 = []

    for str1 in coresubclass_list:

        subcl_list02.append(str1)

    # コアサブクラスの4桁コードを修正

    bcode = ”

    n_chr = 64

    coresubcd_list = []

    for str1 in subcl_list02:

        # コード追加

        if str1 != bcode: n_chr = 64

        n_chr = n_chr + 1

        str3 = chr(n_chr)

        str4 = str1[0:3] + str3

        coresubcd_list.append(str4)  

        bcode = str1

    # コード内容付与

    coresubtxt_list = []

    for n1,str1 in enumerate(subcl_list01):    # 新コアサブクラス

        # クラス内容付与

        for n2, str2 in enumerate(subc_list):    # サブクラス

            if str1 == str2:

                str3 = subctxt_list[n2]

                break       

        coresubtxt_list.append(str3)

    # DataFrame

    df1 = pd.DataFrame(data=subcl_list01,columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=coresubcd_list,columns=[‘コード‘])

    df3 = pd.DataFrame(data=coresubtxt_list,columns=[‘コード内容‘])

    # subclasscode集計表にまとめる

    df4=pd.concat([df1, df2, df3], axis=1)

    # CSVとして書き出し

    df4.to_csv(‘./中間data/subclass_code.csv’,encoding=’utf-8′, index=False)

    print(‘subclass_code.csvを書き出しました‘)   

    return subcl_list01, coresubcd_list, coresubtxt_list

#

#

# スクリブト10  IPC別出現頻度を集計

ipc_list4 = [‘a’]    # IPCのグローバル変数

hindo_list4 = 0    # IPC出現回数のグローバル変数

def ipc_shukei():

    global ipc_list02

    global ipc_list4

    global hindo_list4

    ipc_list = []

    for str1 in ipc_list02:

        ipc_split = str1.split(‘;’)    # 分割

        list1 = []

        for str2 in ipc_split:    # 展開

            list1.append(str2)

        ipc_list.append(list1)

    # [[]][]に変換

    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)

        ipc_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])

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list4,columns=[‘IPC’])

    df2 = pd.DataFrame(data=hindo_list4,columns=[‘出現頻度‘])

    # 集計表にまとめる

    df3=pd.concat([df1, df2], axis=1)

    # CSVとして書き出し

    df3.to_csv(‘./中間data/IPC_hindo.csv’,encoding=’utf-8′, index=False)

    print(‘IPC_hindo.csvを書き出しました‘)

    return ipc_list4, hindo_list4

#

#

# スクリブト11  コアIPC毎に6桁コードを付与

## コアサブクラス毎に出現頻度がmin_clst/4以上(以下なら上位3)IPCを抽出し、

## 抽出したIPCをコアIPCとし、6桁コードを付与する。

coreipc_list02 = [‘a’]     # コアIPCのグローバル変数

ipccode_list05 = [‘a’]    # コアIPCコードのグローバル変数

codetxt_list = [‘a’]        # コアIPC内容のグローバル変数

def coreipc_fuyo():

    global ipc_list4

    global subcl_list01

    global coreipc_list02

    global ipccode_list05

    global codetxt_list

    global ipc_list

    global ipctxt_list

    global ipccode_list02

    # コアサブクラスに属しかつmin_clst/4以上のIPCをコアIPCとして読み込む

    coreipc_list = []

    ipccode_list = []

    for n1, str1 in enumerate(ipc_list4):    # コアIPC毎に

        for n2, str2 in enumerate(subcl_list01):

            if str2 in str1:

                if hindo_list4[n1] > min_clst/4:

                    coreipc_list.append(str1)

                    str4 = coresubcd_list[n2] + ’01’    # 仮コード’01’を付与

                    ipccode_list.append(str4)

    # DataFrame

    df1 = pd.DataFrame(data=coreipc_list,columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=ipccode_list,columns=[‘コード‘])

    # 結合

    df20=pd.concat([df1, df2], axis=1)

    # IPCでソート

    df20 = df20.sort_values(‘特許分類‘, ascending=True)    # 昇順

    # df20読み込み

    # 新コアIPC読み込み

    coreipc_list01 = df20.iloc[:,0]

    coreipc_list02 = []

    for str1 in coreipc_list01:

        coreipc_list02.append(str1)

    # 新コアIPCコード読み込み

    coreipccode_list02 = df20.iloc[:,1]

    ipccode_list02 = []

    for str1 in coreipccode_list02:

        ipccode_list02.append(str1)

    # 新コアIPC3桁コードを修正(3桁が異なればct1を加算)

    bcode = ”

    ct1 = 0

    ipccode_list03 = []

    for n1, str1 in enumerate(coreipc_list02):

        str2 = str1[0:3]

        if str2 != bcode: 

            ct1 = ct1 + 1

            if ct1 <= 9: ct1_str = ‘0’ + str(ct1)

            if ct1 >= 10: ct1_str = str(ct1) 

            str3 = subcode + ct1_str

            ipccode_list03.append(str3)

        else:

            ipccode_list03.append(str3)

        bcode = str2

    # 新コアIPC4桁コードを修正(3桁が同じで4桁目が異なればn_chrを加算)

    # 新コアIPC4桁コードを修正(3桁が同じで「/」までが異なればn_chrを加算)

    bcode1 = ”    # 3

    bcode2 = ”    # /」まで

    n_chr = 64    # chr(65)=’A’

    ipccode_list04 = []

    for n1, str1 in enumerate(coreipc_list02):

        str2 = str1[0:3]

        npos = str1.find(‘/’)

        str3= str1[0: npos +1]  

        if str2 != bcode1: 

            n_chr = 65

            str5 = ipccode_list03[n1] + chr(n_chr)

            ipccode_list04.append(str5)

        if str2 == bcode1:

            if str3 != bcode2:

                n_chr = n_chr + 1

                str4 = chr(n_chr)

                str5 = ipccode_list03[n1] + chr(n_chr)

                ipccode_list04.append(str5)   

            else:

                str5 = ipccode_list03[n1] + chr(n_chr)

                ipccode_list04.append(str5)

        bcode1 = str2

        bcode2 = str3

    # 新コアIPC6桁コードを修正(4桁が同じで「/」までが異なればct1を加算)

    ## /」まで同じIPCを別ード化(H01L31/H01L51/を別コード化)

    bcode1 = ”    # 4

    bcode2 = ”    # /」まで

    ct1 = 0

    nmax = 0

    ipccode_list05 = []

    for n1, str1 in enumerate(coreipc_list02):

        npos = str1.find(‘/’)

        str2= str1[0: npos +1]      

        if str2 != bcode1: 

            ct1 = 1

            str3 = ipccode_list04[n1] + str(’01’)

            ipccode_list05.append(str3)

        if str2 == bcode1:

            if str1 != bcode2:

                ct1 =ct1 + 1

                if ct1 > nmax: nmax = ct1

                if ct1 <= 9: ct1_str = ‘0’ + str(ct1)

                if ct1 >= 10: ct1_str = str(ct1) 

                str3 = ipccode_list04[n1] + ct1_str

                ipccode_list05.append(str3)   

            else:

                str3 = ipccode_list04[n1] + ct1_str

                ipccode_list05.append(str3)  

        bcode1 = str2

        bcode2 = str1

#    print(‘5-6桁の最大数=’,nmax)

    # コード内容付与

    codetxt_list = []

    for n1, str1 in enumerate(coreipc_list02):    # 新コアIPC

        for n2, str2 in enumerate(ipc_list):    # IPC

            if str1 == str2:

                str3 = ipctxt_list[n2]

                codetxt_list.append(str3)

    # DataFrame

    df1 = pd.DataFrame(data=coreipc_list02,columns=[‘特許分類‘])    

    df2 = pd.DataFrame(data=ipccode_list05,columns=[‘コード‘])    

    df3 = pd.DataFrame(data=codetxt_list,columns=[‘コード内容‘])

    # 結合

    df4=pd.concat([df1, df2,df3], axis=1)    

    # CSVとして書き出し

    df4.to_csv(‘./中間data/IPC_code00.csv’,encoding=’utf-8′, index=False)

    # ‘5-6桁の最大数=’,nmax15を越えていれば、「/」以下2桁に修正

    if nmax > 15:

        bcode = ”

        coreipc_list03 = []

        ipccode_list06 = []

        for n1, str1 in enumerate(coreipc_list02):

            npos = str1.find(‘/’)

            str2= str1[0: npos +3]  

            if str2 != bcode:

                coreipc_list03.append(str2)

                str3 = ipccode_list04[n1]

                ipccode_list06.append(str3)

            bcode = str2

        # /」以下2桁に修正

        bcode1 = ”    # 4

        bcode2 = ”    # 全桁

        ct1 = 0

        nmax = 0

        ipccode_list07 = []

        for n1, str1 in enumerate(coreipc_list03):

            npos = str1.find(‘/’)

            str2= str1[0: npos +1]  

            if str2 != bcode1: 

                ct1 = 1

                str3 = ipccode_list06[n1] + str(’01’)

                ipccode_list07.append(str3)

            if str2 == bcode1:

                if str1 != bcode2:

                    ct1 =ct1 + 1

                    if ct1 > nmax: nmax = ct1

                    if ct1 <= 9: ct1_str = ‘0’ + str(ct1)

                    if ct1 >= 10: ct1_str = str(ct1) 

                    str3 = ipccode_list06[n1] + ct1_str

                    ipccode_list07.append(str3)   

                else:

                    str3 = ipccode_list06[n1] + ct1_str

                    ipccode_list07.append(str3)  

            bcode1 = str2

            bcode2 = str1      

        # コード内容付与

        codetxt_list = []

        for n1, str1 in enumerate(coreipc_list03):    # 新コアIPC

            flg = 0

            for n2, str2 in enumerate(ipc_list02):    # IPC

                if str1 == str2:

                    str3 = ipctxt_list[n2]

                    flg =1

                    break   

                else:

                    str3 = ”

            if flg == 0:

                # 元のIPCに戻して照合

                nlen = len(str1)

            else:

                nlen = nmax

            for str4 in coreipc_list02:

                if str1 == str4[0:nlen]:

                    for n3, str5 in enumerate(ipc_list02):    # IPC

                        if str5 == str4:

                            str3 = ipctxt_list[n3]

                            coreipc_list03[n1] = str4

                            break   

                        else:

                            str3 = ”

            codetxt_list.append(str3)

    # DataFrame

    df1 = pd.DataFrame(data=coreipc_list02,columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=ipccode_list05,columns=[‘コード‘])

    df3 = pd.DataFrame(data=codetxt_list,columns=[‘コード内容‘])

    # 集計表にまとめる

    df4=pd.concat([df1, df2, df3], axis=1)

    # CSVとして書き出し

    df4.to_csv(‘./中間data/IPC_code.csv’,encoding=’utf-8′, index=False)

    print(‘IPC_code.csvを書き出しました‘)

    return coreipc_list02, ipccode_list05, codetxt_list

#

#

# スクリブト12  公報データにコードを追記し、コード化できなかった公報を抽出

## IPC_codeによりコード化する。

## 付与されたコードが無ければsubclass_codeによりコード化する。

## それでも付与されたコードが無ければclass_codeによりコード化する。

code_list01 = [‘a’]    # 追記コードのグローバル変数

ipc_list06 = [‘a’]    # コード無し公報のIPCのグローバル変数

def code_tuiki():

    global ipc_list01

    global ipc_list02

    global coreipc_list02

    global code_list01

    global ipc_list06

    global ipccode_list02

    # コード初期化

    code_list01 =[]

    for str1 in ipc_list02:

        str1 = ”

        code_list01.append(str1)

    # IPC_code表によりコードを追記

    # IPC追記

    for n1, str1 in enumerate(ipc_list02):    

        for n2, str2 in enumerate(coreipc_list02):

            if str2 in str1:

                str3 = ipccode_list05[n2]

                if str3 not in code_list01[n1]:

                    if code_list01[n1] == ”:

                        code_list01[n1] =  str3

                    else:

                        code_list01[n1] = code_list01[n1]  + ‘;’ + str3 

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])

    df2 = pd.DataFrame(data=code_list01, columns=[‘コード‘])

    # 結合

    df3=pd.concat([df1, df2], axis=1)

    # CSVとして書き出し

    df3.to_csv(‘./中間data/コード化リスト.csv’,encoding=’utf-8′, index=False)

    # コード無しの公報データを抽出

    ipc_list06 = []

    code_list06 = []

    for n1, str1 in enumerate(code_list01):

        if str1 == ”:

            code_list06.append(str1)

            ipc_list06.append(ipc_list02[n1])

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list06, columns=[‘IPC‘])

    df2 = pd.DataFrame(data=code_list06, columns=[‘コード‘])

    # 結合

    df3=pd.concat([df1, df2], axis=1)

    # 書き出し

    df3.to_csv(‘./中間data/nocode_list.csv’,encoding=’utf-8′, index=False)

    return code_list01, ipc_list06

#

#

# スクリブト13  コードZを作成

zipc_list3 = [‘a’]        # Z公報のIPCのグローバル変数

zcode_list = [‘a’]       # Z公報のコードのグローバル変数

codetxt_list = [‘a’]    # Z公報のコード内容のグローバル変数

def z_sakusei(): 

    global zipc_list3

    global zcode_list

    global codetxt_list

    global ipc_list06

    global cl_list

    global cltxt_list

    global sec_list

    global sectxt_list

    # csv読み込み

    ipc_code_data = pd.read_csv(‘./中間data/nocode_list.csv’, encoding=’utf-8′)

    ipc_list06 = ipc_code_data.iloc[:,0]     

    class_list = []

    for str1 in ipc_list06:    # コード無し

        ipc_split = str1.split(‘;’)    # 分割

        list1 = []

        for str2 in ipc_split:    # 展開し、サブクラスに修正

            str2 = str2[0:3]

            list1.append(str2)

        class_list.append(list1)

    # [[]][]に変換

    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])

    # クラス数が多すぎる時はセクションでコード化

    if len(ipc_list3) > 19:

        flg = 1

    else:

        flg = 0

    # クラスでコード化

    if flg == 0:

        # コード付与

        zipc_list3 = []

        zcode_list = []

        n_chr = 64

        for str1 in ipc_list3:

            n_chr = n_chr + 1

            str3 = chr(n_chr)

            str4 = subcode + ’80’ + str3    # ex: A80A

            zipc_list3.append(str1)

            zcode_list.append(str4)

        # コード内容を追加

        cltxt_list =[]

        for str1 in cl_data2:

            cltxt_list.append(str(str1))

        # コード内容付与

        codetxt_list = []

        for n,str1 in enumerate(zipc_list3):

            # クラス内容付与

            if len(str1) == 3:

                for n1, str2 in enumerate(cl_list):

                    if str1 == str2:

                        str3 = cltxt_list[n1]

                        break        

                codetxt_list.append(str3)

    # セクションでコード化

    if flg == 1:

        # セクションデータに修正

        sec_list01 =[]

        for str1 in ipc_list3:

            str1= str1[0:1]

            if str1 not in sec_list01:

                sec_list01.append(str(str1))   

        sec_list01= sorted(sec_list01)    # ソート      

        # コード付与

        zipc_list3 = []

        zcode_list = []

        n_chr = 64

        for str1 in sec_list01:

            if str1 != ‘0’:

                n_chr = n_chr + 1

                str3 = chr(n_chr)

                str4 = subcode + ’80’ + str3    # ex: A80A

                zipc_list3.append(str1)

                zcode_list.append(str4)   

        # コード内容付与

        codetxt_list = []

        for n,str1 in enumerate(zipc_list3):

            # セクション内容付与

            str1= str1[0:1]

            for n1, str2 in enumerate(sec_list):

                if str1 == str2:

                    str3 = sectxt_list[n1]

                    break     

                else:

                    str3 =’無し

            codetxt_list.append(str3)

    return zipc_list3, zcode_list, codetxt_list

#

#

# スクリブト14  公報データにZコードを追記

## 付与されたコードが無ければzcode_listによりコード化する。

def zcode_tuiki():

    global ipc_list02

    global zipc_list3

    global code_list01

    # 付与されたコードがなければZコードを追記

    for n1, str1 in enumerate(ipc_list02):

        for n2, str2 in enumerate(zipc_list3):

            if str2 == str1[0:1]:

                str3 = zcode_list[n2]

                if code_list01[n1]  == ”:

                    code_list01[n1] = str3 

    # さらに付与されたコードがなければ99コードを追記

    for n1, str1 in enumerate(ipc_list02):

        if code_list01[n1] == ”:

            code_list01[n1] = subcode + ’99’

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])

    df2 = pd.DataFrame(data=code_list01, columns=[‘コード‘])

    # 結合

    df3=pd.concat([df1,df2], axis=1)

    # 書き出し

    df3.to_csv(‘./中間data/コード化リスト2.csv’,encoding=’utf-8′, index=False)

    print(‘コード化リスト2.csvを書き出しました‘)    

    return ipc_list02, code_list01

#

#

# スクリブト15  全てのコード表を結合

## サブテーマデータを追加する。

## クラスからIPC全桁までのコード表を結合する。

## 上位コード(IPC3桁、4)を追加する。

import re

def subcode_list(subcode,subtema):

    global code_list05 

    # サブテーマデータをDataFrame

    df1 = pd.DataFrame(data=[‘無し‘], columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=[subcode], columns=[‘コード‘])

    df3 = pd.DataFrame(data=[subtema], columns=[‘コード内容‘])

    df7=pd.concat([df1,df2,df3], axis=1)

    # 上位コード(IPC3桁、4)を追加

    # csv読み込み

    ipc_code_data = pd.read_csv(‘./中間data/IPC_code.csv’, encoding=’utf-8′)

    # クラスデータ読み込み

    pat_data3 = pd.read_excel(‘IPC分類表.xlsx’, sheet_name=’クラス表‘)

    pat_data4 = pd.read_excel(‘IPC分類表.xlsx’, sheet_name=’サブクラス表‘)

    # IPC3桁読み込み

    ipc_data03 = ipc_code_data.iloc[:,0]                    

    ipc_list03 =[]

    for str1 in ipc_data03:

        ipc_list03.append(str1[0:3])   

    ipc_list03 = list(set(ipc_list03))    # 重複を削除 

    ipc_list03= sorted(ipc_list03)

    # コード読み込み

    code_data03 = ipc_code_data.iloc[:,1] 

    code_list03 = []

    for str1 in code_data03:

        code_list03.append(str1[0:3])   

    code_list03 = list(set(code_list03))    # 重複を削除 

    code_list03= sorted(code_list03)

    # IPC3桁内容読み込み

    cls_data03 = pat_data3.iloc[:,1]    # クラス読み込み

    cls_list = []

    for str1 in cls_data03:

        cls_list.append(str1)

    clstxt_data03 = pat_data3.iloc[:,2]

    clstxt_list = []

    for str1 in clstxt_data03:

        clstxt_list.append(str1)

    # 分類内容読み込み

    txt_list03 = []

    for str1 in ipc_list03:

        for n1, str2 in enumerate(cls_list):

            if str1 == str2:

                txt_list03.append(clstxt_list[n1])          

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list03, columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=code_list03, columns=[‘コード‘])

    df3 = pd.DataFrame(data=txt_list03, columns=[‘コード内容‘])

    # データリストを作成

    df8=pd.concat([df1,df2,df3], axis=1)

    # subG4桁コード読み込み

    # IPC読み込み

    ipc_data04 = ipc_code_data.iloc[:,0]      

    ipc_list04 =[]

    for str1 in ipc_data04:

        ipc_list04.append(str1)

    # コード読み込み

    code_data04 = ipc_code_data.iloc[:,1] 

    code_list04 = []

    for str1 in code_data04:

        code_list04.append(str1)  

    #照合

    ipc_list05 = []

    code_list05 = []

    for n1, str1 in enumerate(ipc_list04):

        if ‘/’ in str1:    # str1中に’/‘が含まれていれば

            m = re.search(‘/’,str1)

            str2= str1[0:m.end()] 

            ipc_list05.append(str2)

            str3 = code_list04[n1]

            code_list05.append(str3[0:4])

    # IPC分類表.csv読み込み

    pat_data05 = pd.read_csv(‘allIPC分類表.csv’, encoding=’utf-8′)

    # IPC読み込み

    ipc_data05 = pat_data05.iloc[:,2]    # IPC記号

    ipcful_list05 = []

    for str1 in ipc_data05:

        ipcful_list05.append(str1)

    # IPC内容読み込み

    txt_data05 = pat_data05.iloc[:,4]    # 簡略表記タイトル

    txt_list05 = []

    for str1 in txt_data05:

        txt_list05.append(str1)

    # 分類内容読み込み

    subtxt_list05 = []

    for str1 in ipc_list05:

        str1 = str1 + ’00’

        for n1, str2 in enumerate(ipcful_list05):

            if str1 == str2:

                subtxt_list05.append(txt_list05[n1])

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list05, columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=code_list05, columns=[‘コード‘])

    df3 = pd.DataFrame(data=subtxt_list05, columns=[‘コード内容‘])

    # データリストを作成

    df9=pd.concat([df1,df2,df3], axis=1)

    df9 = df9.drop_duplicates(keep=’first’)    # 最初の重複は残す

    # csvデータ読み込み

    ipc_code03 = pd.read_csv(‘./中間data/IPC_code.csv’, encoding=’utf-8′)

    df1 = pd.DataFrame(data=ipc_code03)

    # データリストを作成

    df20=pd.concat([df1,df7,df8,df9], axis=0)

    # ソート

    df20 = df20.sort_values(‘特許分類‘, ascending=True)    # 昇順

    # 空欄データを補充

    # 読み込み

    ipc_data = df20.iloc[:,0]    # 特許分類

    ipc_list = []

    for str1 in ipc_data:

        ipc_list.append(str1)

    code_data = df20.iloc[:,1]    # コード

    code_list = []

    for str1 in code_data:

        code_list.append(str1)

    txt_data = df20.iloc[:,2]    # コード内容

    txt_list = []

    for str1 in txt_data:

        txt_list.append(str1)

    # 空白行の処理

    ## 01が消えたコードの修正

    # 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_list =[]

    for str3 in ipc_data2:

        ipctxt_list.append(str(str3))     

    for n1,str1 in enumerate(ipc_list):

        if str(str1) == ‘nan’:

            # 下のIPCが「/00」ならば、上のコードを下にコピー

            str2 = str(ipc_list[n1+1])

            if ‘/00’ in str2:    # str2中に’/00‘が含まれていれば

                code_list[n1+1] = code_list[n1]

            else:    # 下のIPCを上にコピーし、「/00」に修正し、その分類内容を追加

                ipc_list[n1] = ipc_list[n1+1]

                str2 = str(ipc_list[n1])

                if ‘/’ in str2:    # str2中に’/‘が含まれていれば

                    m = re.search(‘/’,str2)

                    str3= str2[0:m.end()] + ’00’

                    ipc_list[n1] = str3

                    # 分類内容を追加

                    for n2, str2 in enumerate(ipc_list01):

                        if str2 == str3:

                            txt_list[n1] = ipctxt_list[n2]

                            break

    # 01が消えたコードの修正

    nstop = len(code_list) -1

    for n1, str1 in enumerate(code_list):

        if n1 >= nstop: break

        if len(str1) == 4:

            str2 = code_list[n1+1]

            str3 = str2[-1]

            if str3 == ‘2’:     

                for x in range(20):      

                    str4 = code_list[n1+x+1]

                    if len(str4) <= 4: break

                    nlen = len(str4)

                    nn = int(str4[nlen-2:nlen]) – 1

                    if nn <=9:

                        nstr = ‘0’ + str(nn)

                    else:

                        nstr = str(nn)                    

                    str5 = str4[0:nlen-2] + nstr

                    code_list[n1+x+1] = str5       

    # 特許分類が空白のコードをクリア

    for n1, str1 in enumerate(ipc_list):

        if str(str1) == ‘nan’:

            code_list[n1] = ”

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list, columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=code_list, columns=[‘コード‘])

    df3 = pd.DataFrame(data=txt_list, columns=[‘コード内容‘])

    # データリストを作成

    df20=pd.concat([df1,df2,df3], axis=1)       

    # [xx/][xx/00]があれば[xx/00]の行を削除

    # IPC読み込み

    ipc_list01 = []

    for str1 in ipc_list:

        ipc_list01.append(str1)

    # コード読み込み

    code_list01 = []

    for str1 in code_list:

        code_list01.append(str1)

    # コード内容読み込み

    txt_list01 = []

    for str1 in txt_list:

        txt_list01.append(str1)  

    #  [xx/][xx/00]ならば[xx/00]の行データをクリア

    nstop = len(ipc_list01) – 1

    for n1, str1 in enumerate(ipc_list01):

        if n1 == nstop: break

        str1 = str1 + ’00’

        if str1 == ipc_list01[n1+1]:

            ipc_list01[n1+1] = ”

            code_list01[n1+1] = ”

            txt_list01[n1+1] = ”

    # 01が消えたコードの修正

    nstop = len(code_list01) -1

    for n1, str1 in enumerate(code_list01):

        if n1 >= nstop: break

        if len(str1) <= 4:

            str2 = code_list01[n1+1]

            if len(str2) == 6:

                str3 = str2[5:6]   

                if str3 == ‘2’:   

                    for x in range(20):   

                        str4 = code_list01[n1+x+1]

                        if len(str4) <= 4: break

                        nlen = len(str4)

                        nn = int(str4[nlen-2:nlen]) – 1

                        if nn <=9:

                            nstr = ‘0’ + str(nn)

                        else:

                            nstr = str(nn)                    

                        str5 = str4[0:nlen-2] + nstr

                        code_list01[n1+x+1] = str5     

    # 空白行を削除

    ipc_list03 = []

    code_list03 = []

    txt_list03 = []

    for n1, str1 in enumerate(ipc_list01):

        if str1 != ”:

            ipc_list03.append(str1)

            code_list03.append(code_list01[n1])

            txt_list03.append(txt_list01[n1])

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list03, columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=code_list03, columns=[‘コード‘])

    df3 = pd.DataFrame(data=txt_list03, columns=[‘コード内容‘])

    # データリストを作成

    df4=pd.concat([df1,df2,df3], axis=1)

    df4 = df4.sort_values(‘コード‘, ascending=True)    # 昇順

    # CSVとして書き出し

    df4.to_csv(‘./中間data/IPC_code対照表.csv’,encoding=’utf-8′, index=False)

    print(‘IPC_code対照表.csvを書き出しました‘)  

#

#

# スクリブト16  IPC_code対照表をコード別にまとめる

## Z99のコード内容を修正する。

def subcode2_list():    

    # IPC_code対照表.csvデータ読み込み

    ipc_code_data = pd.read_csv(‘./中間data/IPC_code対照表.csv’, encoding=’utf-8′)

    code1_data = ipc_code_data.iloc[:,0]    # コード化IPC(G05B13/02・・・)

    ipc_list1 =[]

    for str1 in code1_data:

        ipc_list1.append(str1)

    code2_data = ipc_code_data.iloc[:,1]    # 階層化コード(A,A01・・・)

    code_list1 =[]

    for str1 in code2_data:

        code_list1.append(str1)

    code3_data = ipc_code_data.iloc[:,2]    # コード内容(電気式・・・)

    txt_list1 =[]

    for str1 in code3_data:

        txt_list1.append(str1)

    # コード別にコード内容をまとめる

    # 現行を保持し、次行が同じならばtxtを追加し、変化したらAppend

    bcode = ”

    btxt = ”

    bipc = ”

    ipc_list2 =[]

    code_list2 =[]

    txt_list2 =[]

    for n1, str1 in enumerate(code_list1):

        flg = 0

        if str1 != bcode:

            if n1 > 0:

                code_list2.append(bcode)

                txt_list2.append(btxt)

                btxt =”

                ipc_list2.append(bipc)

            if n1== 0:

                bcode = code_list1[n1]

                btxt = ”

                bipc = ”

        bcode = str1

        txt2 = txt_list1[n1]

        ipc2 = ipc_list1[n1]

        if type(txt2) == float: 

            txt2 = ‘無し

        if btxt == ”:

            btxt =  txt2

            bipc = ipc2        

        else:

            btxt = btxt + ‘+’ + txt2

            bipc = bipc + ‘+’ + ipc2  

    code_list2.append(bcode)

    txt_list2.append(btxt)

    ipc_list2.append(bipc)

    # Z99のコード内容を修正

    for n1, str1 in enumerate(code_list2):

        if ’99’ in str1:

            str2 = txt_list2[n1]

            str2 = str2.split(‘+’)

            str2 = str2[0]

            txt_list02[n1] = ‘その他の‘ + str2

        if str1 == ‘Z99’:

            txt_list2[n1] = ‘その他

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list2, columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=code_list2, columns=[‘コード‘])

    df3 = pd.DataFrame(data=txt_list2, columns=[‘コード内容‘])

    # 結合

    df4=pd.concat([df1,df2,df3], axis=1)

    # コード表書き出し

    df4.to_csv(‘./中間data/IPC_code対照表2.csv’,encoding=’utf-8′, index=False)

    print(‘IPC_code対照表2.csvを書き出しました‘)

#

#

# スクリブト17  IPC_code対照表2を使用して公報データを再度コード化

## 全コードをクリアする。

## 全桁IPCによりコード化する。

## メインG(xx/)によりコード化。ただし、既に下位コードがあれば追加しない。

## サブクラス(4)によりコード化。ただし、既に下位コードがあれば追加しない。

## クラス(3)によりコード化。ただし、既に下位コードがあれば追加しない。

## 未だコード化されていない公報についてはセクション(1)によりコード化する。

code_list3 = [‘a’]    # 公報コードリスト

def ipc_code_list02():

    global ipc_list06

    global code_list3

    global code_list4

    # IPC_code対照表.csvデータ読み込み

    ipc_code_data = pd.read_csv(‘./中間data/IPC_code対照表2.csv’, encoding=’utf-8′)

    code1_data = ipc_code_data.iloc[:,0]    # コード化IPC(G05B13/02・・・)

    ipc_list1 =[]

    for str1 in code1_data:

        ipc_list1.append(str1)

    code2_data = ipc_code_data.iloc[:,1]    # 階層化コード(A,A01・・・)

    code_list1 =[]

    for str1 in code2_data:

        code_list1.append(str1)

    code3_data = ipc_code_data.iloc[:,2]    # コード内容(積層体・・・)

    txt_list1 =[]

    for str1 in code3_data:

        txt_list1.append(str1)

    # 公報データ読み込み

    pat_data = pd.read_csv(‘./中間data/コード化リスト2.csv’, encoding=’utf-8′)

    # IPC欄読み込み

    ipc_data3 = pat_data.iloc[:,0]                    

    ipc_list3 =[]

    for str1 in ipc_data3:

        ipc_list3.append(str1)   

    # 全コードをクリア

    code_data3 = pat_data.iloc[:,1]                    

    code_list3 =[]

    for str1 in code_data3:

        code_list3.append(”)    # クリア

    # 全桁IPCによりコード化

    for n1, str1 in enumerate(ipc_list3):    # 公報IPC

        split_str1 = str1.split(‘;’)

        for str2 in split_str1:

            for n2, str3 in enumerate(ipc_list1):    # 対照表IPC

                if str3 == str2:

                    code_list3[n1] = code_list3[n1] + ‘;’ + code_list1[n2]

    # メインG(xx/)によりコード化。ただし、既に下位コードがあれば追加せず。

    for n1, str1 in enumerate(ipc_list3):    # 公報IPC

        split_str1 = str1.split(‘;’)

        for str2 in split_str1:

            if ‘/’ in str2:    # str2中に’/‘が含まれていれば

                m = re.search(‘/’,str2)

                str3= str2[0:m.end()]     # ’/‘までを切り出す

            for n2, str4 in enumerate(ipc_list1):    # 対照表IPC

                if str4 == str3:

                    if code_list1[n2] not in code_list3[n1]:

                        code_list3[n1] = code_list3[n1] + ‘;’ + code_list1[n2]

    # サブクラス(4)によりコード化。ただし、既に下位コードがあれば追加せず。                

    for n1, str1 in enumerate(ipc_list3):    # 公報IPC

        split_str1 = str1.split(‘;’)

        for str2 in split_str1:

            str3 = str2[0:4]    # サブクラス(4)

            for n2, str4 in enumerate(ipc_list1):    # 対照表IPC

                if str4 == str3:

                    if code_list1[n2] not in code_list3[n1]:

                        code_list3[n1] = code_list3[n1] + ‘;’ + code_list1[n2]

    # その他(X80X)以外はクラス(3)によりコード化。ただし、既に下位コードがあれば追加せず。

    for n1, str1 in enumerate(ipc_list3):    # 公報IPC

        split_str1 = str1.split(‘;’)

        code_list1

        for str2 in split_str1:

            str3 = str2[0:3]    # クラス(3)

            for n2, str4 in enumerate(ipc_list1):    # 対照表IPC

                if str4 == str3:

                    str5 = code_list1[n2] [1:2]

                    if int(str5) < 8: 

                        if code_list1[n2] not in code_list3[n1]:

                            code_list3[n1] = code_list3[n1] + ‘;’ + code_list1[n2]

    # 未だコード化されていない公報についてはセクション(1)によりコード化                    

    for n1, str1 in enumerate(ipc_list3):    # 公報IPC

        split_str1 = str1.split(‘;’)

        for str2 in split_str1:

            str3 = str2[0:1]    # セクション(1)

            for n2, str4 in enumerate(ipc_list1):    # 対照表IPC

                if str4== str3: 

                    if code_list3[n1] == ”:

                        code_list3[n1] = code_list3[n1] + ‘;’ + code_list1[n2]

    # さらに未だコード化されていない公報についてはその他(X99)を付与

    for n1, str1 in enumerate(code_list3):    # 公報IPC

        if str1 == ”:

            code_list3[n1] = subcode + ’99’

    # 先頭の「;」を削除

    for n1, str1 in enumerate(ipc_list3):    # 公報IPC

        str2 = code_list3[n1]

        if str2[0:1] == ‘;’:

            code_list3[n1] = str2[1:]    

    # 使用したコードを抽出

    code_list4 = []

    for str1 in code_list3:

        code_split = str1.split(‘;’)    # 分割

        for str2 in code_split:

            code_list4.append(str2)

    code_list4 = list(set(code_list4))    # 重複を削除 

    # IPC_code対照表書き出し

    df1 = pd.DataFrame(data=ipc_list3, columns=[‘IPC’])

    df2 = pd.DataFrame(data=code_list3, columns=[‘コード‘])

    # 結合

    df3=pd.concat([df1,df2], axis=1)

    # 書き出し

    df3.to_csv(‘./中間data/コード化リスト3.csv’,encoding=’utf-8′, index=False)

    print(‘コード化リスト3.csvを書き出しました‘)

    # 使用したコードのその他コードを追加

    ipc_list5 =[]

    code_list5 = []

    txt_list5 = []

    for str1 in (code_list4):

        flg = 0

        for n1, str2 in enumerate(code_list1):

            if str1 == str2: flg =1

        if flg == 0:            

            if str1[1:2] == ‘8’: flg =2

            if str1[1:2] == ‘9’: flg =2

            if flg == 2:

                ipc_list1.append(‘その他‘)

                code_list1.append(str1)

                txt_list1.append(‘その他‘)

                print(str1)

    # コード内容を修正

    # 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:

        ipcful_list6.append(str1)

    # IPC内容読み込み

    txt_data6 = pat_data6.iloc[:,4]    # 簡略表記タイトル

    txt_list6 = []

    for str1 in txt_data6:

        txt_list6.append(str1)

    # 分類内容読み込み

    subtxt_list6 = []

    for str1 in ipc_list06:

        str1 = str1 + ’00’

        for n1, str2 in enumerate(ipcful_list6):

            if str1 == str2:

                subtxt_list6.append(txt_list6[n1])

    for n1, str1 in enumerate(subtxt_list6):

        if str1 == ‘無し‘:

            for n2, str2 in enumerate(ipcful_list6):

                str3 = ipc_list5[n1]

                if str3[-1] == ‘/’:

                    str3 = str3 = str3  + ’00’

                if str2 == str3:

                    txt_list5[n1] = txt_list6[n2]

                    break                

    # DataFrame

    df1 = pd.DataFrame(data=ipc_list1, columns=[‘特許分類‘])

    df2 = pd.DataFrame(data=code_list1, columns=[‘コード‘])

    df3 = pd.DataFrame(data=txt_list1, columns=[‘コード内容‘])

    # 結合

    df4=pd.concat([df1,df2,df3], axis=1)

    # IPC_code対照表書き出し

    filename = ‘./中間data/’ + code_list1[0][0:1] + ‘_code.csv’

    df4.to_csv(filename,encoding=’utf-8′, index=False)

    print(filename,’を書き出しました‘)

    return code_list3

#

#

# スクリブト18  コード付き公報データ書き出し

sub_sheet = ‘A’    # 初期設定

def code_koho_write(sub_sheet):

    print(‘シート=’,sub_sheet)

    global code_list3

    # 公報xlsxデータ読み込み

    pat_data0 = pd.read_excel(‘subテーマ一括分析公報.xlsx’,sheet_name=sub_sheet) 

    # 公報csvデータ読み込み

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

    # 公報番号欄読み込み

    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(“ “, “”))    # 全角空白を削除

            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[:,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(‘要約無し‘)

    # コード読み込み

    code_data = pd.read_csv(‘./中間data/コード化リスト3.csv’, encoding=’utf-8′)

    code_list3 = code_data.iloc[:,1]  

    # 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_list, columns=[‘IPC‘])

    df08 = pd.DataFrame(data=fi_list, columns=[‘FI‘])

    df09 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])

    df10 = pd.DataFrame(data=code_list3, columns=[‘コード‘])

    df11 = pd.DataFrame(data=abst_list, columns=[‘要約‘])

    # 結合

    global df20

    df20=pd.concat([df01,df02,df03,df04,df05,df06,df07,df08,df09,df10,df11], axis=1)

    # IPC_code対照表書き出し

    filename = ‘./中間data/’ + sub_sheet + ‘公報data.csv’

    df20.to_csv(filename,encoding=’utf-8′, index=False)

    print(sub_sheet,’公報data.csvを書き出しました‘)

#

#

# スクリブト19  全サブテーマ一括コード化

print(”)

print(‘出力サンプル‘)

print(‘サブテーマコード=’,subtema_list01)

print(‘サブテーマ名=’,subtema_list02)

delfile_list01 = []

for n1, sub_sheet in enumerate(subtema_list01):

    subcode = sub_sheet

    subtema = subtema_list02[n1]

    kohoipcfi_read(sub_sheet)

    ipcfi_correct()

    class_shukei()

    coreclass_fuyo()

    subclass_shukei()

    corsubcl_fuyo()

    ipc_shukei()

    coreipc_fuyo()

    code_tuiki()

    z_sakusei()

    zcode_tuiki()

    subcode_list(subcode,subtema)

    subcode2_list()

    ipc_code_list02()

    code_koho_write(sub_sheet)

    bfilenmae01 =  ‘./中間data/’ + sub_sheet + ‘公報data.csv’

    delfile_list01.append(bfilenmae01)

print(‘消去ファイル=’,delfile_list01)

#

#

# スクリブト20  公報データとコード表のファイルを結合

print(”)

print(‘出力サンプル‘)

# 公報csvデータの結合

data_list = []

for sub_sheet in subtema_list01:

    filename = ‘./中間data/’ + sub_sheet + ‘公報data.csv’

    data_list.append(pd.read_csv(filename))

    df20 = pd.concat(data_list, axis=0)

# 公報data書き出し

df20.to_csv(‘./中間data/全公報data.csv’,encoding=’utf-8′, index=False)

# コード表csvデータの結合

delfile_list02 = []

data_list = []

for sub_sheet in subtema_list01:

    filename =  ‘./中間data/’ + sub_sheet + ‘_code.csv’

    print(filename)

    data_list.append(pd.read_csv(filename))

    df30 = pd.concat(data_list, axis=0)

    delfile_list02.append(filename)

# コード表書き出し

df30.to_csv(‘./中間data/全コード表.csv’,encoding=’utf-8′, index=False)

旧データクリア

## 新規作成。これにより旧データがクリア

# ブックを作成

book = openpyxl.Workbook()

# シートを追加

ws = book.create_sheet(title=’母集合‘)

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’)

# 公報データのdataframearrayに変換

arr1 = df20.values

# Exce(xlsx)に書き出し

# ヘッダ作成

header_list =[[‘公報番号‘,’出願番号‘,’発行日‘,’発明の名称‘,’出願人‘,’発明者‘,’IPC‘,’FI‘,’Fターム‘,’コード‘,’要約‘]]

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のシート「母集合」にコード付き公報データを書き出しました‘)   

# コード表のdataframearrayに変換

arr1 = df30.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のシート「コード対照表」にコード表を書き出しました‘)   

#

#

# スクリブト20-1  不足IPCの確認

import sys

# コード内容を修正

# 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)

    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]

#        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

            if str1 == str2:

                str3 = txt_list6[n2]

                txt_list.append(str3)

                flg2 = 1

                break

        if flg2 == 0:

            print(‘IPC内容不明=’,str1)

            flg3 = 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を書き出しました‘)   

#

#

# スクリブト21  一括処理用のコード表を作成

print(”)

print(‘出力サンプル‘)

# 対照表読み込み

code_txt__data = pd.read_excel(‘./中間data/trans_data01.xlsx’,sheet_name=’コード対照表‘) 

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を書き出しました‘)

#

#

# スクリブト22  トピック分析するコードを抽出

## ここでは、その他とZコードを抽出し、トピック分析する。

print(”)

print(‘出力サンプル‘)

# IPC_code対照表.csvデータ読み込み

ipc_code_data = pd.read_csv(‘./中間data/IPC_code対照表2.csv’, encoding=’utf-8′)

code01_data = ipc_code_data.iloc[:,0]    # コード化IPC(G05B13/02・・・)

ipc_list01 =[]

for str1 in code01_data:

    ipc_list01.append(str1)

code02_data = ipc_code_data.iloc[:,1]    # 階層化コード(A,A01・・・)

code_list01 =[]

for str1 in code02_data:

    code_list01.append(str1)

code03_data = ipc_code_data.iloc[:,2]    # コード内容(電気式・・・)

txt_list01 =[]

for str1 in code03_data:

    txt_list01.append(str1)

# その他を含むコードと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] == ‘その他‘:

            if str1 not in code_list02:

                ipc_list02.append(ipc_list01[n1])

                code_list02.append(str1)

                txt_list02.append(txt_list01[n1])

                flg = 1

    if flg == 0:

        if len(str1) >= 3:

            nc = int(str1[1:2])

        else:

            nc = 1

        if nc >= 8:

            if str1 not in code_list02:

                ipc_list02.append(ipc_list01[n1])

                code_list02.append(str1)

                txt_list02.append(txt_list01[n1])            

# 公報データ中に有るか確認

pat_data04 = pd.read_csv(‘./中間data/全公報data.csv’, encoding=’utf-8′)

code_data04 = pat_data04.iloc[:,9]

code_list04 = []

for str1 in code_data04:

    code_list04.append(str1)

ipc_list03 = []

code_list03 = []

txt_list03 = []

for n1, str1 in enumerate(code_list02):

    flg = 0

    for str2 in code_list04:

        if str1 in str2:

            flg = 1

            break

    if flg == 1:

        ipc_list03.append(ipc_list02[n1])

        code_list03.append(str1)

        txt_list03.append(txt_list02[n1])

#その他を追加

ipc_list03.append(‘その他‘)

code_list03.append(subcode+ ’99’)

txt_list03.append(‘その他‘)  

# DataFrame

df1 = pd.DataFrame(data=ipc_list03, columns=[‘特許分類‘])

df2 = pd.DataFrame(data=code_list03, columns=[‘コード‘])

df3 = pd.DataFrame(data=txt_list03, 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を書き出しました‘)

# Zcodeに絞り込み

ipc_list04 = []

code_list04 = []

txt_list04 = []

for n1, str1 in enumerate(code_list03):

    flg = 0

    if str1[1:2] == ‘8’: flg = 1

    if str1[1:2] == ‘9’: flg = 1

    if flg == 1:

        ipc_list04.append(ipc_list03[n1])

        code_list04.append(str1)

        txt_list04.append(txt_list03[n1])

# DataFrame

df1 = pd.DataFrame(data=ipc_list04, columns=[‘特許分類‘])

df2 = pd.DataFrame(data=code_list04, columns=[‘コード‘])

df3 = pd.DataFrame(data=txt_list04, columns=[‘コード内容‘])

# 結合

df20=pd.concat([df1,df2,df3], axis=1)

# コード表書き出し

df20.to_csv(‘./中間data/Zcode.csv’,encoding=’utf-8′, index=False)

print(‘Zcode.csvを書き出しました‘)

#

#

# 以下は集計処理

## 集計結果はtrans_data.xlsxに書き込み

#

# スクリプト28 旧データクリアし、Excelに転送するためのtrans_data.xlsxを設定

## trans_data.xlsx」を新規作成する。これにより旧データがクリアされる。

## 転送用のシートを追加する。

## テーマ名とコード表をコピーする。

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=’六桁コード別集計‘)

# 不要な「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(‘特許分類=’,code_list01[0:5])

# コード読み込み

code02 = code_data.iloc[:,1]

code_list02 =[]

for str1 in code02:

    code_list02.append(str1)

print(‘コード=’,code_list02[0:5])

# コード内容読み込み

code03 = code_data.iloc[:,2]

code_list03 =[]

for str1 in code03:

    code_list03.append(str(str1))

print(‘コード内容=’,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/全公報data.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))

# 出願番号読み込み

apno_data = pat_data.iloc[:,1]

an_list =[]

for n in range(nyap):

    str0 = apno_data[n]

    an_list.append(str(str0))

# 発行日読み込み

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))

# 発明の名称読み込み

title_data = pat_data.iloc[:,3]

ti_list =[]

for n in range(nyap):

    str0 = title_data[n]

    ti_list.append(str(str0))

# 発明者読み込み

name_data = pat_data.iloc[:,5]

name_list =[]

for n in range(nyap):

    str0 = name_data[n]

    str0 = (str0.replace(“ “, “_”))    # 空白を「_」に置換

    name_list.append(str0)

# IPC読み込み

ipc_data = pat_data.iloc[:,6]

ipc_list =[]

for n in range(nyap):

    str0 = ipc_data[n]

    ipc_list.append(str0)

# 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)

# 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)

# 分類コード読み込み

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)

# 要約読み込み

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)

# 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データを抽出

# print(max_nengetu)

monthend = max_nengetu[4:6]

print(‘最終月=’,monthend,’‘)

# monthend=12    # テスト用設定

# 追加補正係数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 新規参入企業抽出

## 最近になって参入してきた出願人の新規度合いを評価し、評価が高かった出願人をリストアップする。

### 調査開始年に発行公報がなかった出願人を抽出

### スクリブト7 新規参入企業抽出

### 出願人別年別集計表を作成

### 年平均件数(=横合計件数/(最終年発行開始年))を算出

### 平均増加率を算出

### 平均件数以上でかつ平均増加率以上の出願人を抽出

### 最終年の件数が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 新規参入企業抽出

##  全体の平均件数と増加率を算出する。

##  新規参入出願人による発行件数の縦合計を集計する。

print(”)

print(‘出力サンプル‘)

import numpy as np

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])

# 平均増加率(=(最終年前年件数調査開始年翌年件数)/(発行期間(=0件でない年数))を算出

npavr_list = [‘平均増加率‘]

for n1, nn1 in enumerate(list6):

    if n1 >0:

        np = (nn1[nnen-1] – nn1[2])/(nnen-2)

        # 発行期間(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])

# 全年平均件数(=新規参入の縦合計/新規候補者数/調査期間)を算出

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])

# 発行年評価値(=最先発行年)を算出

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)

# 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)

# 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」に保存

print(‘「最新サンプル公報」をtrans_data.xlsxに書き出しました‘)

#

#

# スクリブト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′)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

nopy_list=[]

for str1 in year_list:

    nopy_list.append(str1)

# 発行日欄データを発行年に修正しリスト化

pd_data = pat_data.iloc[:,2]    # 発行日欄

py_list =[]

for str1 in pd_data:

    nen = str1[0:4]    # 年データに絞り込み

    str0 = str(nen)

    py_list.append(str(str0))

# 分類コード(重複なし)リスト作成(縦軸作成)

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_list[n]

        kaisu = 1

        str3 =  code + “,” + str(py_list[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(“合計“)

# 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」に保存

print(‘「一桁年別集計」をtrans_data.xlsxに書き出しました‘)

#

#

# スクリブト40 三桁コード年別集計

## コードを三桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

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_list[n]

        kaisu = 1

        str3 =  code + “,” + str(py_list[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])    # 5件出力

# Exceに書き出し

file_name = ‘trans_data.xlsx’

# file_name = ‘./中間data/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」に保存

print(‘「三桁年別集計」をtrans_data.xlsxに書き出しました‘)

#

#

# スクリブト41 四桁コード年別集計

## コードを四桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

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_list[n]

        kaisu = 1

        str3 =  code + “,” + str(py_list[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(“合計“)

# 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」に保存

print(‘「四桁年別集計」をtrans_data.xlsxに書き出しました‘)

#

#

# スクリブト42 六桁コード年別集計

## コードを六桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。

print(”)

print(‘出力サンプル‘)

# データ読み込み

pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)

# 開始年から終了年までの数値を作成し、文字に変換し、リスト化

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_list[n]

        kaisu = 1

        str3 =  code + “,” + str(py_list[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(“合計“)

# 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」に保存

print(‘「六桁年別集計」をtrans_data.xlsxに書き出しました‘)

#

#

# スクリブト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]

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(“合計“)

# 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」に保存

print(‘「一桁コード別集計」をtrans_data.xlsxに書き出しました‘)

#

#

# スクリブト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]

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(“合計“)  

# 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」に保存

print(‘「三桁コード別集計」をtrans_data.xlsxに書き出しました‘)

#

#

# スクリブト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)

# 分類コードが多すぎる場合には終了する

flgstp = 0

ncode = len(cdhd_list)

if ncode > 255: 

    flgstp = 1

    print(“コード数が255以上になったのでスキップします“)

#    print(“コード数が255以上になったので終了します“)

#    sys.exit()

# コード数が255以下ならば以下を実行

if flgstp == 0:

    # 出願人別集計結果を読み込み

    ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)         

    # 出願人(重複なし)リスト作成(縦軸作成)

    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(“合計“)

    # 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」に保存

    print(‘「四桁コード別集計」をtrans_data.xlsxに書き出しました‘)

#

#

# スクリブト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))

# 分類コードを六桁に修正し、重複を削除し、コードヘッダリストを作成

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)

# 分類コードが多すぎる場合には終了する

flgstp = 0

ncode = len(cdhd_list)

if ncode > 255: 

    flgstp = 1

    print(“コード数が255以上になったのでスキップします“)

if flgstp == 0:

    # 出願人別集計結果を読み込み

    ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)

    # 出願人(重複なし)リスト作成(縦軸作成)

    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(“合計“)   

    # 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」に保存

    print(‘「六桁コード別集計」をtrans_data.xlsxに書き出しました‘)

#

#

# stop

# 用済みファイルを削除の実行を一時保留

#

# スクリブト47  用済みファイルを削除

print(”)

print(‘出力サンプル‘)

import os

os.remove(‘./中間data/class_code.csv’)

os.remove(‘./中間data/class_hindo.csv’)

os.remove(‘./中間data/subclass_code.csv’)

os.remove(‘./中間data/subclass_hindo.csv’)

os.remove(‘./中間data/IPC_code.csv’)

os.remove(‘./中間data/IPC_code00.csv’)

os.remove(‘./中間data/IPC_hindo.csv’)

os.remove(‘./中間data/IPC_code対照表.csv’)

os.remove(‘./中間data/IPC_code対照表2.csv’)

os.remove(‘./中間data/コード化リスト.csv’)

os.remove(‘./中間data/コード化リスト2.csv’)

os.remove(‘./中間data/コード化リスト3.csv’)

os.remove(‘./中間data/nocode_list.csv’)

os.remove(‘./中間data/全公報data.csv’)

os.remove(‘./中間data/全コード表.csv’)

# os.remove(‘./中間data/トピックKWリスト.csv’)

os.remove(‘./中間data/一括処理コード表.csv’)

os.remove(‘./中間data/Zcode.csv’)

os.remove(‘./中間data/Z_code.csv’)

# A公報data.csv」などを削除

for str1 in delfile_list01:

    os.remove(str1)

# A_code.csv」などを削除

for str1 in delfile_list02:

    os.remove(str1)

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/new_patlist4.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 = ‘ なお、コード化(2桁目以下)、グラフ化、分析コメントの作成、本レポートの作成については、すべて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_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 = ‘・特許出願動向調査_single.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]

ntot = 0

nyken_list = []

nyken_list2 = []    # 追加件数

nyken_list3 = []     # 合計件数

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実行 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:25] + ‘・・・‘      

        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    # 出願人名を凡例として格納

# 円グラフ作成(radius=1.5)

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=16,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 出願人数の年別推移(図表とコメント作成)

print(”)

print(‘出力サンプル‘)

import numpy as np

# 図表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実行

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)

if ntot < 30 :

    if nmax < 5:

        wrd = “ 件数が少なく、ピーク人数も少ないため傾向を判定できなかった。

        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-1): break

    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:

                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  

    if n1 >= 0:

        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(str2)    

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(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別年別集計‘)

# y = len(pd_data)

# x = len(pd_data.columns)

#メイン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(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)

x = len(pd_data.columns)

if y <= 10: nbest = y

nap = nbest   

# リスト化

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)

print(nen_list)

# カラム数読み込み

nclm=(len(pd_data.columns)) – 3

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)

    # コメント書き出し

#    wrd2 = ‘ ここでは最終年の件数 > 3を重要とした。\n’

    wrd3 = ‘ ここでは最終年の件数 > 3を重要とした。\n’

#    wrd = wrd01 + wrd + wrd2

    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’   

    # 出願人コピー

    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()  

fig = plt.figure()

head_list = [‘公報番号‘,’発行日‘,’発明の名称‘,’出願人‘] 

col_labels = head_list    # ヘッダ設定

the_table = plt.table(cellText=table_vals,    # トップ10のテーブル値

                      colWidths=[0.1, 0.1, 0.56, 0.18],    # 列の幅を指定

                      colLabels=col_labels,    # ヘッダを指定

                      loc=’center’)

the_table.scale(4, 7)    # 全体のサイズをX=4Y=6に設定

the_table.auto_set_font_size(False)

the_table.set_fontsize(24)    # 全体が縮小されたのでフォントサイズを拡大

# ヘッダを着色

for x in range(nclm):

    the_table[(0,x)].set_facecolor(‘lightgreen’)    # ヘッダを薄緑色に着色

    the_table[(0,x)].get_text().set_fontsize(’30’)    # フォントサイズ=70

    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)

# サンプル公報の概要読み込み

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実行(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)

# コード内容読み込み

cdnaiyo_data = pd_data01.iloc[:,2]

cdnaiyo_list = []

for str1 in cdnaiyo_data:

    cdnaiyo_list.append(str1)

# コード内容追加

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) > 25:

                str3 = str3[:24] + ‘\n’ + str3[24:49]    # 25文字で折り返し(50文字以上は表示せず)       

            cdnaiyo_list01.append(str3)

            if len(str3) > nwrd_max: nwrd_max = len(str3)

#横合計読み込み、全合計算出

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:

    str1 = (str1/ntot)*100

    str1 = round(str1,1)

    np_list01.append(str1)    

# 上位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]

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)

# コメントコピー

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)

# 円グラフ作成(radius=1.5)

plt.pie(tot_list01, labels=hancd_naiyo_list, autopct=”%1.1f%%”,pctdistance=0.9, radius=1.5,

        startangle=90,counterclock=False)

# 円グラフの右横=1.5の位置に高さ=1で描画

plt.legend(hanrei_nm, fontsize=16,bbox_to_anchor=(1.5, 1))    # 凡例の表示

# 図表書き出し

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

plt.show()

# 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)

# 最終年の件数を補正

# nenlast = nnen

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)

wrd01 = wrd01.replace(‘主要出願人名義‘,’コード‘)

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(‘このグラフによれば上記‘,’年別推移で見ると‘)

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

import copy

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)

print(‘y_len=’,y_len)

# 発行件数%

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):    

#    if n1 >= y_len: break

    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

    print(‘n1=’,n1,’y_len=’,y_len)

    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)

    # print(”)

    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’,”)    # 改行を削除

    ap_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位が同数かチェック

    print(arr1_nbest[0][1], ‘==’, arr1_nbest[1][1] )

    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)

    # print(”)

    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)

    # print(”)

    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)

    # 発行件数%

    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 str1[nnen-1] >= 3:    # 最終年の件数>=3を判定

            n2 = n2 + 1

            newap_list.append(y_list[n1])

    print(‘重要と判定された新規参入企業=’,n2,newap_list)

    # n2 = len(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)

    # print(”)

    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   # ,,

    # コメント追加

    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

    # %算出

    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)

    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()

    # 表描画

    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)

    # 円グラフ作成(radius=1.5)

    plt.pie(np_nketa_list01, labels=codewrd_nketa_list01, autopct=”%1.1f%%”,

            pctdistance=0.9,radius=1.5, startangle=90,counterclock=False)

    # 円グラフの右横=1.5の位置に高さ=1で描画

    plt.legend(hanrei_nm, fontsize=16,bbox_to_anchor=(1.5, 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)

    # print(”)

    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)

    else:

        # def実行

        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

    print(‘code_naiyo_20=’,code_naiyo_20)

    print(‘nlast_list=’,nlast_list)

    print(‘nzennen_list=’,nzennen_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])    # リストの列数

    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])

    # 重要コード毎にサンプル公報書き出し

    print(‘vipcd_list=’,len(vipcd_list))

    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]

            titlewrd_list0.append(str1)

        # def実行(titlewrd_list0def titlematomeに渡し、処理結果をtitlewrd_list1として受け取る)

        titlewrd_list1 = titlematome(titlewrd_list0)

        # 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:

        # 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)

    # print(”)

    return (nfig,nhyo)

#

#

# スクリブト89   コード別個別分析一括処理(図表、コメント書き出し)

## コード別個別分析一括処理

# テスト用初期値設定

# 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)    

    # 桁数を指定

    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

        ap_arr1 = str1    # str1global

        print(”)

        print(‘出力サンプル(5)’)

        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  第四章 まとめ(コメント書き出し)

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 = “ コードは各サブテーマは1桁目のコード(A-Z)とし、2桁目以下は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(‘レポート作成が終了しました。‘)