/
# スクリプト0 処理内容の説明
## 単一テーマの公報データに対して、以下の処理を行い、特許出願動向調査のレポートを作成する。
## コード化
## 集計
## 図表作成
## コメント作成
## レポート作成
# 準備
## 公報データを分析公報data.csvとして保存する。
## テーマ名を「テーマ設定data.xlsx」のシート「テーマ名」に設定する。
# データの保存方法
## 件数が6万件を越えても処理できるように公報データはcsv(分析公報data.csv)に保存する。
## 集計結果は行数が少なく、かつ1bookに複数種類のデータをまとめて保存できるのでExcel形式で保存する。
## (ただし、macでは扱いにくいのでExcelマクロを使用しない。)
## 後で消去する中間データは散乱しないようにするため、フォルダ「中間data」に保存する。
# IPCクラスタリング(new_patlist4.csvとtrans_data01.xlsxに書き出し)
## 高出現頻度のIPCをコアIPCとし、これに関連するIPC、FIを付加する。
## コアIPCと付加IPC、FIとを結合し、特許分類(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_listに0を追加
nxy_list01 = nxy_list
if len(x_list) <= 5:
nxy_list01 = []
for str1 in nxy_list:
str1.append(0.0)
nxy_list01.append(str1)
oldy_list = copy.deepcopy(y_list)
# print(‘oldy_list’,y_list)
# len(y_list) <= 5 ならば、y_listに空白“”を追加、nxy_listにリスト[0,0,・・・0]を追加
if len(y_list) <= 5:
y_list.append(”) # 空白“”を追加
list01 = []
k01 = len(nxy_list01)
for n1 in range(k01):
list01.append(0.0)
nxy_list01.append(list01)
# print(‘nxy_list01=’,nxy_list01)
# 発行件数%化
npxy_list = []
nytot_list = []
for n1_list in nxy_list:
nytot = 0
npx_list = []
for n2 in n1_list:
if nmax > 0:
n3= n2/nmax
npx_list.append(n3)
else:
n3 = 0
npx_list.append(n3)
nytot = nytot + n2
nytot = round(nytot,1)
npxy_list.append(npx_list)
nytot_list.append(nytot)
if nytot_list[0] > 0:
print(‘nytot_list[1]/nytot_list[0] =’,nytot_list[1]/nytot_list[0] )
nytot10 = nytot_list[1]/nytot_list[0]
else:
nytot10 = 0
# X軸とY軸の大きさを調整
pax = 12
pay =pax * ((len(y_list)/len(x_list))/2)
#print(‘figsizeの設定値 ‘,’pax=’,pax,’pay=’,pay)
y_list01 = []
for str1 in y_list:
str1 = str1.replace(“株式会社“, “”) # “株式会社“を消去
str1 = str1.replace(“国立大学法人“, “”) # “国立大学法人“を消去
str1 = str1.replace(“公立大学法人“, “”) # “公立大学法人“を消去
str1 = str1.replace(“学校法人“, “”) # “学校法人“を消去
str1 = str1.replace(“地方独立行政法人“, “”) # “地方独立行政法人“を消去
str1 = str1.replace(“独立行政法人“, “”) # “独立行政法人“を消去
str1 = str1.replace(“国立研究開発法人“, “”) # “国立研究開発法人“を消去
str1 = str1.replace(“一般財団法人“, “”) # “一般財団法人“を消去
str1 = str1.replace(“公益財団法人“, “”) # “公益財団法人“を消去
y_list01.append(str1)
# print(‘y_list01’,y_list01)
# 語数を算出
nlwrd = 0
wntot = 0
for str1 in y_list01:
wntot = wntot + (len(str1))
print(‘word数=’,wntot)
print(‘word数/Y軸項目数=’,wntot/len(y_list01))
if len(y_list01) > 0:
nlwrd = wntot/len(y_list01) # 行数毎の語数
# nlwrd = round(nlwrd,1)
print(‘X軸の項目数=’,len(x_list),’Y軸の項目数=’,len(y_list01),’行単位の平均語数=’,nlwrd)
# y_listの最大語数を判定
nwdmax = 0
for str1 in y_list01:
if len(str1) > nwdmax: nwdmax = len(str1)
print(‘最大語数=’,nwdmax)
# 初期値を設定
pax = 12 # グラフのxサイズ
pay = 6 # グラフのYサイズ
xh_y0 = 1.2 # xヘッダのy位置
x1 = 0.3 # xヘッダのx位置
xm = 1.33 # x方向の離間係数
nxsize = 12 # xヘッダの文字サイズ
nysize = 12 #Yヘッダの文字サイズ
ypls = 0 # Y方向の補正値
# 公報データ読み込み
#try:
# para_data = pd.read_csv(‘XY補正値.csv’, engine =’python’) # csv用
#except UnicodeDecodeError as e:
# para_data = pd.read_csv(‘XY補正値.csv’, encoding=’shift_jis’) # csv用
# pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’utf-8′) # csv用
para_data = pd.read_excel(‘XY補正値.xlsx’,sheet_name=’Sheet1′) # Excelデータ読み込み
para_data = para_data.dropna(how=’all’) # 全列がNaNである行を削除
print(‘パラメータ数=’,len(para_data))
## 入力バラメータ読み込み ##
# X数読み込み(逆順)
nox_data = para_data.iloc[:,0]
nox_list =[]
for n1 in nox_data:
nox_list.append(n1)
# print(‘nox_list[0:5]=’,nox_list[0:5])
# Y数読み込み(逆順)
noy_data = para_data.iloc[:,1]
noy_list =[]
for n1 in noy_data:
noy_list.append(n1)
# print(‘noy_list[0:5]=’,noy_list[0:5])
# 平均語数読み込み(逆順)
nlwrd_data = para_data.iloc[:,2]
nlwrd_list =[]
for n1 in nlwrd_data:
nlwrd_list.append(n1)
# print(‘nlwrd_list[0:5]=’,nlwrd_list[0:5])
# 最大語数読み込み(逆順)
nwdmax_data = para_data.iloc[:,3]
nwdmax_list =[]
for n1 in nwdmax_data:
nwdmax_list.append(n1)
# print(‘nwdmax_list[0:5]=’,nwdmax_list[0:5])
# 語数比率nytot_list[1]/nytot_list[0] 読み込み(逆順)
npwd_data = para_data.iloc[:,4]
npwd_list =[]
for n1 in npwd_data:
npwd_list.append(n1)
# print(‘npwd_list[0:5]=’,npwd_list[0:5])
## 出力バラメータ読み込み ##
# グラフXサイズpax読み込み(逆順)
gsizex_data = para_data.iloc[:,5]
gsizex_list =[]
for n1 in gsizex_data:
gsizex_list.append(n1)
# print(‘gsizex_list[0:5]=’,gsizex_list[0:5])
# グラフYサイズpax読み込み(逆順)
gsizey_data = para_data.iloc[:,6]
gsizey_list =[]
for n1 in gsizey_data:
gsizey_list.append(n1)
# print(‘gsizey_list[0:5]=’,gsizey_list[0:5])
# Xヘッダの文字サイズnxsize読み込み(逆順)
fsizex_data = para_data.iloc[:,7]
fsizex_list =[]
for n1 in fsizex_data:
fsizex_list.append(n1)
# print(‘fsizex_list[0:5]=’,fsizex_list[0:5])
# Yヘッダの文字サイズnysize読み込み(逆順)
fsizey_data = para_data.iloc[:,8]
fsizey_list =[]
for n1 in fsizey_data:
fsizey_list.append(n1)
# print(‘fsizey_list[0:5]=’,fsizey_list[0:5])
# XヘッダのY位置xh_y0読み込み(逆順)
posxy0_data = para_data.iloc[:,9]
posxy0_list =[]
for n1 in posxy0_data:
posxy0_list.append(n1)
# print(‘posxy0_list[0:5]=’,posxy0_list[0:5])
# XヘッダのX位置x1読み込み(逆順)
posxx1_data = para_data.iloc[:,10]
posxx1_list =[]
for n1 in posxx1_data:
posxx1_list.append(n1)
# print(‘posxx1_list[0:5]=’,posxx1_list[0:5])
# X方向の離間係数xm読み込み(逆順)
xm_data = para_data.iloc[:,11]
xm_list =[]
for n1 in xm_data:
xm_list.append(n1)
# print(‘xm_list[0:5]=’,xm_list[0:5])
# Y方向の補正値ypls読み込み(逆順)
ypls_data = para_data.iloc[:,12]
ypls_list =[]
for n1 in ypls_data:
ypls_list.append(n1)
# print(‘ypls_list[0:5]=’,ypls_list[0:5])
lenx = len(x_list)
leny = len(y_list)
bn = 0
flg = 0
for n1, str1 in enumerate(nox_list):
nox = str1
if nox == lenx:
if leny >=noy_list[n1]:
if nlwrd >= nlwrd_list[n1]:
if nwdmax >= nwdmax_list[n1]:
pax = gsizex_list[n1]
pay = gsizey_list[n1]
nxsize = fsizex_list[n1]
nysize = fsizey_list[n1]
xh_y0 = posxy0_list[n1]
x1 = posxx1_list[n1]
xm = xm_list[n1]
ypls = ypls_list[n1]
bn = n1
npwd = npwd_list[n1]
if npwd_list[n1] == 0.1:
flg = 1
if nytot10 > 0.1:
xm = 1.33
else:
xm = 1.48
npwd = npwd_list[n1]
if npwd_list[bn] == 0.1:
if npwd > nytot10:
print(‘入力パラメータ=’,’A=’,lenx,’、B=’,leny,’、C=’,nlwrd,’、D=’,nwdmax, ‘、基準以下‘,npwd, ‘>’, ‘、E=’,round(nytot10,4))
else:
print(‘入力パラメータ=’,’A=’,lenx,’、B=’,leny,’、C=’,nlwrd,’、D=’,nwdmax, ‘、基準以上‘,npwd, ‘<‘, ‘、E=’,round(nytot10,4))
else:
print(‘入力パラメータ=’,’A=’,lenx,’、B=’,leny,’、C=’,nlwrd,’、D=’,nwdmax, ‘、E=’,round(nytot10,4))
print(‘出力パラメータ‘,’No=’,bn+2,’/’,’F=’,pax,’、G=’,pay,’、H=’,nxsize,’、I=’,nysize,’、J=’,xh_y0,’、K=’,x1,’、L=’,xm,’、M=’,ypls)
# 設定値確認
print(‘pax=’,pax,’pay=’,pay,’xh_y0=’,xh_y0,’x1=’,x1,
‘xm=’,xm,’nxsize=’,nxsize,’nysize=’,nysize)
bnysize = nysize
# 折り返しパターンの判定
flg_ipc = 0
for str1 in y_list:
if len(str1) <= 9:
if str1.count(‘/00’) > 0: flg_ipc = 1
flg=0
if len(x_list) > 1: flg = 0
if len(x_list) >= 10: flg = 1
if len(x_list) >= 11: flg = 2
if flg_ipc == 1: flg = 3
print(‘折り返しパターン=’,flg)
# 描画フレーム設定
if len(x_list) <=10:
fig = plt.figure(figsize=(pax, pay), dpi=100)
if len(x_list) >=11:
fig = plt.figure(figsize=(pax, pay), dpi=140)
ax = plt.axes()
# X軸ヘッダ書き出し
for n1, str1 in enumerate(x_list):
if len(str1) == 1: str1 = ‘ ‘ + str1
ax.text(n1*xm+2.5+x1, xh_y0, str1,size=nxsize)
# バブルチャート描画
for n1, str1 in enumerate(y_list01):
if flg == 0: # 縦長パターン
nyp=1.0 # Y位置間隔係数
# y軸の文字数に応じて折り返し表示
if len(str1) <= 8: # 8文字以下ならば
apname = str1
# len(y_list01) <= 5 ならば、y位置を下げる
if len(y_list01) <= 5:
ax.text(-1, – n1*nyp-0.4+ypls, apname,size=nysize,horizontalalignment=”left”) # 左寄せ
else:
# x=-1、y= – 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=-1、y= – n1*nyp- 0.5に設定
ax.text(-1, – n1*nyp- 0.5+ypls, apname,size=nysize,horizontalalignment=”left”) # 左寄せ
if n1 < len(npxy_list):
nstr2 = npxy_list[n1]
for n2, np1 in enumerate(nstr2):
if n1 >= len(oldy_list): break
if n2 == len(nstr2): break
if np1>0:
if np1<0.03:
np1= 0.03
c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(np1)*0.5, fc=’skyblue’)
# c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(0.5)*0.5, fc=’skyblue’)
ax.add_patch(c)
nn=round(nxy_list01[n1][n2],1)
if n1 >= len(oldy_list): break
if len(x_list) <= 5:
if n2 < len(x_list) :
ax.text(n2*1.33 +3, -n1*0.98-0.2, nn) # バブルの右下に件数を描画
else:
if n1 < len(y_list01) :
ax.text(n2*1.33 +3, -n1*0.98-0.2, nn) # バブルの右下に件数を描画
if flg == 1: # 標準
nyp=1.0 # Y位置間隔係数
# y軸の文字数に応じて折り返し表示
if len(str1) <= 9: # 9文字以下ならば
if len(str1) <= 7: # 7文字以下ならば
str1 = str1 + ‘\n ‘
apname = str1
# len(y_list01) <= 5 ならば、y位置を下げる
if len(y_list01) <= 5:
ax.text(-1, – n1*nyp -0.2+ypls, apname,size=bnysize,horizontalalignment=”left”) # 左寄せ
else:
# x=-1、y= – n1*nyp-0.2に設定
ax.text(-1, – n1*nyp -0.4+ypls, apname,size=bnysize,horizontalalignment=”left”) # 左寄せ
else:
if len(str1) >= 10: # 10文字以上ならば
apname = str1[0:9] + ‘\n ‘ + str1[9:17] + ‘\n ‘ + str1[17:25]
if len(y_list01) <= 5:
ax.text(-1, – n1*nyp – 0.5+ypls, apname,size=bnysize,horizontalalignment=”left”) # 左寄せ
else:
# x=-1、y= – n1*nyp – 0.5に設定
ax.text(-1, – n1*nyp – 0.5+ypls, apname,size=bnysize,horizontalalignment=”left”) # 左寄せ
nstr2 = npxy_list[n1]
for n2, np1 in enumerate(nstr2):
if n1 >= len(oldy_list): break
if n2 == len(nstr2): break
if np1>0:
if np1<0.03:
np1= 0.03
c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(np1)*0.5, fc=’skyblue’)
# c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(0.5)*0.5, fc=’skyblue’)
ax.add_patch(c)
nn=round(nxy_list01[n1][n2],1)
if len(x_list) <= 5:
if n2 < len(x_list) :
ax.text(n2*1.33 +3, -n1*0.98-0.2, nn) # バブルの右下に件数を描画
else:
if n1 < len(y_list01) :
ax.text(n2*1.33 +3, -n1*0.98-0.2, nn) # バブルの右下に件数を描画
if flg == 2: # 横長パターン
nyp=1.0 # Y位置間隔係数
# y軸の文字数に応じて折り返し表示
if len(str1) <= 8: # 8文字以下ならば
apname = str1
# len(y_list01) <= 5 ならば、y位置を下げる
if len(y_list01) <= 5:
ax.text(-1, – n1*nyp-0.4+ypls, apname,size=nysize,horizontalalignment=”left”) # 左寄せ
else:
# x=-1、y= – 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=-1、y= – n1*nyp- 0.5に設定
ax.text(-1, – n1*nyp- 0.5+ypls, apname,size=nysize,horizontalalignment=”left”) # 左寄せ
nstr2 = npxy_list[n1]
for n2, np1 in enumerate(nstr2):
if n1 >= len(oldy_list): break
if n2 == len(nstr2): break
if np1>0:
if np1<0.03:
np1= 0.03
c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(np1)*0.5, fc=’skyblue’)
# c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(0.5)*0.5, fc=’skyblue’)
ax.add_patch(c)
nn=round(nxy_list01[n1][n2],1)
if n1 >= len(oldy_list): break
if len(x_list) <= 5:
if n2 < len(x_list) :
ax.text(n2*1.33 +3, -n1*0.98-0.2, nn) # バブルの右下に件数を描画
else:
if n1 < len(y_list01) :
ax.text(n2*1.33 +3, -n1*0.98-0.2, nn) # バブルの右下に件数を描画
if flg == 3: # IPCパターン
apname = str1
# x=-1、y= – n1*0.98-0.2に設定
ax.text(-1, – n1*0.98-0.2+ypls, apname,size=nysize,horizontalalignment=”left”) # 左寄せ
nstr2 = npxy_list[n1]
print(‘nstr2=’,nstr2)
for n2, np1 in enumerate(nstr2):
print(n1,np1)
if n2 == len(nstr2): break
if np1>0:
if np1<0.03:
np1= 0.03
c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(np1)*0.5, fc=’skyblue’)
# c = patches.Circle(xy=(n2*1.33+3, -n1*0.98), radius=np.sqrt(0.5)*0.5, fc=’skyblue’)
ax.add_patch(c)
nn=round(nxy_list01[n1][n2],1)
ax.text(n2*1.33 +3, -n1*0.98-0.2, nn) # バブルの右下に件数を描画
# グラフ修正
plt.axis(‘scaled’)
ax.set_aspect(‘equal’)
ax.axes.xaxis.set_visible(False) # x軸目盛りを消す
ax.axes.yaxis.set_visible(False) # y軸目盛りを消す
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
plt.show()
return()
# テスト バブルチャート作成
## (x_list,y_list,nxy_list)のパターンを変更し、作成されるバブルチャートを確認する。
## 作成されたバブルチャートを見ながら、defバブルチャート作成の作成パターンを追加または修正する。
# X軸の項目数= Y軸の項目数= 行単位の平均語数=
x_list= [‘2010年‘, ‘2011年‘, ‘2012年‘, ‘2013年‘, ‘2014年‘, ‘2015年‘, ‘2016年‘, ‘2017年‘, ‘2018年‘, ‘2019年‘, ‘2020年‘, ‘2021年‘]
y_list= [‘F:物理的または化学的方法一般‘, ‘F01:化学的または物理的方法,例.触媒,コロイド化学;それらの関連装置 ‘, ‘F01A:固体‘, ‘F01A01:触媒体の形状,構造に特微があるもの‘, ‘F01A02:超微粒子状の触媒‘, ‘F01A03:光触媒‘, ‘F01A04:その他のもの+KW=化合+アニオン+製造+エポキシケトン+交換+構造+酸化+反応+なし+エノン‘, ‘F02:分離 ‘, ‘F02A:無機材料‘, ‘F02A01:気体分離用‘]
nxy_list= [[2.0, 5.0, 4.0, 6.0, 2.0, 3.0, 7.0, 9.0, 2.0, 4.0, 5.0, 3.6], [126.0, 108.0, 115.0, 125.0, 123.0, 93.0, 125.0, 137.0, 83.0, 113.0, 86.0, 102.0], [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 16.0, 19.2], [1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 3.0, 2.0, 0.0, 1.0, 0.0, 0.0], [3.0, 5.0, 4.0, 4.0, 2.0, 8.0, 10.0, 4.0, 6.0, 9.0, 0.0, 0.0], [22.0, 22.0, 19.0, 14.0, 15.0, 21.0, 20.0, 15.0, 18.0, 9.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [36.0, 37.0, 49.0, 40.0, 50.0, 33.0, 39.0, 54.0, 49.0, 40.0, 30.0, 34.8], [2.0, 0.0, 1.0, 2.0, 0.0, 1.0, 1.0, 6.0, 4.0, 4.0, 8.0, 3.6], [3.0, 3.0, 9.0, 3.0, 6.0, 4.0, 6.0, 3.0, 3.0, 3.0, 0.0, 0.0]]
# Y軸語数に応じてX軸ヘッダのy位置を補正
wntot = 0
for str1 in y_list:
wntot = wntot + (len(str1))
# print(‘word数=’,wntot)
# print(‘word数/Y軸項目数=’,wntot/len(y_list))
nlwrd = wntot/len(y_list) # 行数毎の語数
fig_n = ‘図0′
buble0(x_list,y_list,nxy_list,fig_n)
# def発行件数の年別推移(折線グラフ)(図表とコメント作成)
## (nen_list, code_list, arr_nxny)に応じ、折線グラフを作成する。
## 折線グラフの変化についてコメントを作成し、returnする。
import pandas as pd
import numpy as np
import openpyxl
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams[‘font.family’] = ‘MS PGothic’
import matplotlib.patches as patches
import csv
import copy
def oresen_comment(nen_list, code_list, arr_nxny, fig_n, g_title):
# 発行年読み込み
nnen = len(nen_list)
# print(‘nnen=’,nnen)
# print(‘nen_list=’,nen_list)
# print(‘code_list=’,code_list)
py_list = []
for str1 in nen_list:
str1 = str1[0:4]
py_list.append(str1)
# print(‘発行年=’,py_list)
# y軸の最大値を算出
nmax = 0
for str1 in arr_nxny:
for nn1 in str1:
if nn1 > nmax: nmax = nn1
# グラフ作成
fig = plt.figure(figsize=(12, 4), dpi=150, linewidth=10)
ax = fig.add_subplot(111)
x_datas = range(1, nnen+1)
# プロット
for str1 in arr_nxny:
plt.plot(x_datas, str1[0:])
plt.xticks(x_datas, nen_list)
plt.xlim(0, nnen+1) # ex:2011~2020の10年
plt.ylim(0, nmax*1.1) #y軸の最大値*1.1
plt.title(g_title, fontsize = 20)
plt.xlabel(‘発行年‘, fontsize = 16)
plt.ylabel(‘発行件数‘, fontsize = 16)
plt.tick_params(labelsize=14)
plt.grid(True)
# 凡例を設定
hanrei_nm = code_list # コード+内容を凡例として格納
plt.legend(hanrei_nm, fontsize=12,bbox_to_anchor=(0, -0.3), loc=’upper left’) # 凡例の表示
print(fig_n)
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
plt.show()
# 各列の合計件数リストを作成
ntot_list = []
for n1, str1 in enumerate(nen_list):
nxtot = 0
for str2 in arr_nxny:
nxtot = nxtot + float(str2[n1])
nxtot = round(nxtot,1)
ntot_list.append(nxtot)
# print(‘各列の合計件数=’,ntot_list)
# 2-3 出願人数年別推移のコメント1
# 合計ntot算出
ntot = 0
for n1 in ntot_list:
ntot = ntot + n1
# ピーク年判定
npeak = 0
pymax = 0
for n1, str1 in enumerate(ntot_list):
if str1>npeak:
npeak = str1
pymax= py_list[n1]
# 増減率を計算
bn = 0
testud_list = []
for n1,str1 in enumerate(ntot_list):
if n1>0:
if ntot > 0:
bd = ((str1 – bn)/ntot)*100
testud_list.append(bd)
else:
bd = 100 # とりあえず100に設定
testud_list.append(bd)
bn = str1
# 増減回数をカウント
ctud = 0 # 増減カウンタ
flgud = 0
for n1, str1 in enumerate(testud_list):
# 増減変化回数をカウント (ただし、件数が(平均/2)以上でかつ増減率1以上または-1以下が対象)
if ntot_list[n1] > (ntot/nnen)/2:
if flgud == 0:
if abs(str1) > 1:
ctud = ctud + 1
flgud = 1
if flgud == 1:
if str1 < -1:
ctud = ctud + 1
flgud = 0
# 初期化
ptn = 0
wrd = ”
# 全期間のパターンを判定
# 増加
if ntot_list[nnen-1] – ntot_list[0] > 0:ptn = 1 # 全期間では増加
if ntot_list[nnen-1] – ntot_list[0] > (ntot/nnen)*2: ptn = 2 # 全期間では急増
# 減少
if ntot_list[nnen-1] – ntot_list[0] < 0:ptn = -1 # 全期間では減少
if ntot_list[nnen-1] – ntot_list[0] < (-ntot/nnen)/2: ptn = -2 # 全期間では急減
# 横這い
if abs(ntot_list[nnen-1] – ntot_list[0]) < (ntot/nnen)/6: ptn = 4 # 全期間では横這い
# パターン名修正
if ctud > 2:
if ptn == 4:
ptn = 5
else:
if ptn > 0: ptn = 3
if ptn < 0: ptn = -3
# 全期間の傾向をコメント
wrd1 = ”
# 増加
if ptn == 1: wrd1 = ‘全体的には増加傾向を示している。‘
if ptn == 2: wrd1 = ‘全体的には増加傾向が顕著である。‘
if ptn == 3: wrd1 = ‘全体的には増減しながらも増加傾向を示している。‘
# 減少
if ptn == -1: wrd1 = ‘全体的には減少傾向を示している。‘
if ptn == -2: wrd1 = ‘全体的には減少傾向が顕著である。‘
if ptn == -3: wrd1 = ‘全体的には増減しながらも減少傾向を示している。‘
# 横這い
if ptn == 4: wrd1 = ‘全体的には横這い傾向を示している。‘
if ptn == 5: wrd1 = ‘増減しているものの全期間で見ると横這い傾向を示している。‘
wrd = wrd1
print(‘ptn=’,ptn,’=’,wrd)
# 横這い期間を判定
pyflat_nen = “0000”
pyflat0 = 0 # 平坦開始年(int)
pyflat1 = 0 # 平坦終了年(int)
nflat = 0
flg = 0
ct = 0
for n1, str1 in enumerate(testud_list):
if flg == 0:
if abs(str1) < 1:
if ct == 0:
pyflat0 = int(py_list[n1])
flg = 1
if flg == 1:
if abs(str1) < 1:
ct = ct + 1
nflat = ct
if abs(str1) > 1:
if pyflat0 != 0:
pyflat1 = int(py_list[n1+1])
flg = 0
ct = 0
if nflat > 3: # 4年間平坦ならば横這いと判定
flg =2
pyflat1 = int(pyflat1) – 1 # 平坦終了年を修正
if flg == 2: print(‘横這い期間=’,pyflat0, ‘~‘,pyflat1)
if flg == 2:
wrd_pyflat = str(pyflat0) + ‘年~‘ + str(pyflat1) + ‘年まで横這いだが、‘
pyflat_nen = str(pyflat1) + wrd_pyflat
# 増加開始年を判定
flg = 0
pyup = 0
for n1, str1 in enumerate(testud_list):
if abs(str1) > 1:
flg = 1
break
if flg == 1:
pyup = int(py_list[n1+1])
# 中間の急増を判定
wrd_rap_nen = “0000”
pyrap = 0
for n1, str1 in enumerate(testud_list):
if n1 < (nnen – 2):
if str1 > 7:
pyrap = py_list[n1]
if ptn >= 1: # 全期間が増加ならば
wrd_rap = str(py_list[n1]) + “年から急増し、“
wrd_rap_nen = str(py_list[n1]) + wrd_rap
break
if ptn <= -1: # 全期間が減少ならば
wrd_rap = str(py_list[n1]) + “年から急増しているものの、“
wrd_rap_nen = str(py_list[n1]) + wrd_rap
break
if ptn == 4: # 全期間が横這いならば
wrd_rap = str(py_list[n1]) + “年から急増しているものの、“
wrd_rap_nen = str(py_list[n1]) + wrd_rap
break
# 中間でピークとなった年を判定(横這いならばスキップ)
wrd_peak_nen = “0000”
if pymax != py_list[0]:
if pymax != py_list[nnen-1]:
if pymax != py_list[nnen-2]: # 最終年とその前年はコメントせず
if ptn != 5:
if ptn >= 1: # 全期間が増加ならば
# wrd_peak = “ただし” + str(pymax) + “年にピークを付けた後は減少し、“
wrd_peak = str(pymax) + “年にピークを付けた後は減少し、“
wrd_peak_nen = str(pymax) + wrd_peak
if ptn <= -1: # 全期間が減少ならば
wrd_peak = str(pymax) + “年にピークを付けた後は減少し、“
wrd_peak_nen = str(pymax) + wrd_peak
wrd_inc_nen = “0000”
if ptn > 0:
if pyflat0 == 0: pyflat0 = py_list[0]
if int(pyup) > (int(pyflat0) + 1):
# print(pyup, ‘<‘, pyrap)
if int(pyup) < int(pyrap):
wrd_inc = str(pyup) + ‘年から増加し、‘
wrd_inc_nen = str(pyup) + wrd_inc
# 発行年順に結合
wrd_list = []
if int(pyflat_nen[0:4]) > 0:
wrd_list.append(pyflat_nen[4:])
if int(wrd_rap_nen[0:4]) > 0:
wrd_list.append(wrd_rap_nen[4:])
if int(wrd_peak_nen[0:4]) > 0:
wrd_list.append(wrd_peak_nen[4:])
if int(wrd_inc_nen[0:4]) > 0:
wrd_list.append(wrd_inc_nen[4:])
wrd_list= sorted(wrd_list)
# wrdに追加
for str1 in wrd_list:
wrd = wrd + str1
# print(‘wrd=’,wrd)
# 最終年の増減傾向を判定
if (ntot_list[nnen-1] – ntot_list[nnen-2]) > 0: # 最終年が増加でかつ
if abs(testud_list[nnen-2]) >= 1: # 増減率が1以上でかつ
if ptn >= 1: # 全期間が増加ならば
if testud_list[nnen-2] > 7:
wrd = wrd + ‘最終年も急増している。‘
else:
if ptn != 5: wrd = wrd + ‘最終年も増加している。‘
if ptn == 5: wrd = wrd + ‘最終年は増加している。‘
if ptn <= -1: # 全期間が減少ならば
if testud_list[nnen-2] > 7:
wrd = wrd + ‘最終年は急増している。‘
else:
wrd = wrd + ‘最終年は増加している。‘
if abs(ptn) < 1: # 全期間が横這いならば(-0.9~+0.9)
if testud_list[nnen-2] > 7:
wrd = wrd + ‘最終年は急増している。‘
else:
wrd = wrd + ‘最終年は増加している。‘
if abs(testud_list[nnen-2]) < 1: # 増減率が1以下ならば
if abs(ptn) < 1: # 横這いならば(-0.9~+0.9)
wrd = wrd + ‘最終年も横這いとなっている。‘
else:
wrd = wrd + ‘最終年は横這いとなっている。‘
if (ntot_list[nnen-1] – ntot_list[nnen-2]) < 0: # 最終年が減少でかつ
if abs(testud_list[nnen-2]) >= 1: # 増減率が1以上でかつ
if ptn >= 1: # 全期間が増加ならば
if testud_list[nnen-2] < -7:
wrd = wrd + ‘最終年は急減している。‘
else:
wrd = wrd + ‘最終年は減少している。‘
if ptn <= -1: # 全期間が減少ならば
wrd = wrd + ‘最終年も減少している。‘
if abs(ptn) < 1: # 全期間が横這いならば(-0.9~+0.9)
wrd = wrd + ‘最終年は減少している。‘
if abs(testud_list[nnen-2]) < 1: # 増減率が1以下ならば
if abs(ptn) < 1: # 全期間が横這いならば(-0.9~+0.9)
wrd = wrd + ‘最終年も横這いとなっている。‘
else:
wrd = wrd + ‘最終年は横這いとなっている。‘
if (ntot_list[nnen-1] – ntot_list[nnen-2]) == 0: # 最終年が前年と同じならば
if ptn >= 1: # 増加ならば
wrd = wrd + ‘最終年は横這いとなっている。‘
if ptn <= -1: # 減少ならば
wrd = wrd + ‘最終年は横這いとなっている。‘
if abs(ptn) < 1: # 横這いならば(-0.9~+0.9)
wrd = wrd + ‘最終年も横這いとなっている。‘
# 修正
wrd = wrd.replace(“横這いだが、最終年も増加“, “横這いだが、最終年は増加“)
wrd = wrd.replace(“減少し、最終年も増加“, “減少し、最終年は増加“)
# 結合
wrd = ‘ このグラフによれば上記出願人名義の公報発行件数は、‘ + wrd
# print(wrd)
wrd01 = wrd
print(wrd01)
if len(arr_nxny) == 1: # 共同出願人が無ければ
wrd02 = wrd
else:
wrd02 = ”
if len(arr_nxny) > 1: # 共同出願人が有れば
# 1位のコード抽出
topcode = ”
maxtot = 0
ncd = 0
nlast = nnen -1
for n1, str1 in enumerate(arr_nxny):
# print(str1[nlast])
bnn = int(str1[nlast])
# ntot = 0
# for nn1 in str1:
# ntot = ntot + nn1
if bnn > maxtot:
maxtot = bnn
ncd = n1
print(‘最終年が1位=’,code_list[ncd],arr_nxny[ncd],maxtot,’ 件‘)
bcode = code_list[ncd] # 1位のコード名
list01 = arr_nxny[ncd]
nlast = list01[nnen-1]
# print(‘最終年の件数=’,nlast)
nzennen = list01[nnen-2]
# print(‘最終年前年の件数=’,nzennen)
ninc = nlast-nzennen # (最終年 – 前年)の件数
# print(‘(最終年 – 前年)の件数=’,ninc)
# 1 位の単調増加を判定
bstr2 = 0
upyear = ” # 増加開始年
flg_sinc = 0 # 増加開始年からの単調増加フラグ
flg_inc = 0
upnn1 = 0
for n1, nn1 in enumerate(list01):
if n1 == nnen +1: break
if n1 == 1:bstr1 = int(nn1)
if n1>1:
nn1 = int(nn1)
bstr2 = nn1
if ((bstr2-bstr1) / nmax) > 0.05: # 増加ならば
if flg_inc == 0:
upyear = nen_list[n1-1] # 増加開始年
upnn1 = bstr2
flg_inc = 1 # 単調増加
if ((bstr2-bstr1) / nmax) < 0.05:
upyear = ”
flg_inc = 0
break
bstr1 = bstr2
if flg_inc == 1:
print(‘単調増加である。‘)
else:
print(‘増減している。‘)
if ((bstr2-upnn1) / nmax) > 0.5:flg_inc = 2 # nmax/2以上の顕著な単調増加
# 1位の合計件数を集計し、ピークを判定
ntot = 0
ntop = 0
for str1 in list01:
ntot = ntot + str1
if str1 > ntop: ntop = str1
# コメント作成
wrd = “\n”
wrd0 = ”
# 突出判定
nlast = nnen – 1
flg = 0
for n1, str1 in enumerate(arr_nxny):
# print(n1,str1)
# print(str1[nlast])
if str1[nlast] > (ntop * 0.9):
flg = 1
if flg == 1:
print(“最終年の件数が同程度のコードがある。“)
flgntop = 0
else:
ptn = 0
flgntop = 0
if ntop > (ntot / 2):
flgntop = 1
if ninc > (nmax / (nnen * 4)):
wrd0 = wrd + “ この中で「” + bcode + “」が突出しており、最終年も増加している。\n”
if ninc > (nmax / (nnen * 4)):
if ninc< -(nmax / (nnen * 0.9)):
wrd0 = wrd + “ この中で「” + bcode + “」が突出しているが、最終年は急減している。\n”
else:
if ninc< 0:
wrd0 = wrd + “ この中で「” + bcode + “」が突出しているが、最終年は減少している。\n”
if abs(ninc) < (nmax / (nnen * 4)):
wrd0 = wrd + “ この中で「” + bcode + “」が突出しているが、最終年は横這いとなっている。\n”
if flg_inc == 0: # 単調増加でなければ
if flgntop == 0: # ピークと比較
if ninc > (nmax / (nnen * 4)):
if ninc > (nmax / (nnen * 1)):
wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は急増している。\n”
else:
if ninc >0:
wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は増加している。\n”
if ninc < -(nmax / (nnen * 4)):
if ninc < -(nmax / (nnen * 1)):
wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は急減している。\n”
else:
if ninc < 0:
wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は減少している。\n”
if abs(ninc) <= (nmax / (nnen * 4)):
wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、最終年は横這いとなっている。\n”
if flg_inc == 1: # 単調増加ならば
wrd0 = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、” + upyear + “から増加している。\n”
ptn = 1
if flg_inc == 2: # 顕著な単調増加ならば
wrd = wrd + “ この中で最終年の件数が第1位の出願人は「” + bcode + “」であるが、” + upyear + “から増加し、その後も顕著に増加し続けている。\n”
ptn = 3
# 結合
wrd01 = wrd01 + wrd0
# 最終年に増加しているコードを抽出
ninc = 0
inc_cd_list = []
for n1, str1 in enumerate(arr_nxny):
if str1[nnen-1] – str1[nnen-2] > 0: # 最終年件数 – 前年件数 > 0
ninc = ninc + 1
bcd = code_list[n1]
inc_cd_list.append(bcd)
# print(‘最終年に増加しているコード=’,inc_cd_list)
# コメント追加
if ninc > 0:
if ptn >= 1:
wrd1 = “ また、次のコードも最終年に増加傾向を示している。\n”
if ptn <= -1:
wrd1 = “ また、次のコードは最終年に増加傾向を示している。\n”
if ptn == 0:
wrd1 = “ また、次のコードは最終年に増加傾向を示している。\n”
# 増加したコード書き出し
wrd2 =”
for str1 in inc_cd_list:
str1 = “ ” + str1 + “\n”
if str1 not in bcode:
wrd2 = wrd2 + str2
# wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
wrd02 = wrd
return(wrd01,wrd02)
# テスト def発行件数の年別推移(折線グラフ)
## def発行件数の年別推移(折線グラフ)にデータを設定し、テストする。
# 折線データ設定
nen_list= [‘2011年‘, ‘2012年‘, ‘2013年‘, ‘2014年‘, ‘2015年‘, ‘2016年‘, ‘2017年‘, ‘2018年‘, ‘2019年‘, ‘2020年‘]
code_list= [‘A:航空機;飛行;宇宙工学‘, ‘B:電気通信技術‘, ‘C:測定;試験‘, ‘D:制御;調整‘, ‘E:信号‘, ‘F:計算;計数‘, ‘G:農業;林業;畜産;狩猟;捕獲;漁業‘, ‘H:写真;映画;波使用類似技術;電子写真;ホログラフイ ‘, ‘I:電力の発電,変換,配電‘]
arr_nxny= [[6, 9, 19, 9, 19, 77, 301, 407, 641, 543], [0, 1, 1, 0, 4, 20, 58, 73, 79, 70], [2, 0, 2, 2, 2, 14, 61, 68, 120, 82], [0, 1, 3, 0, 1, 9, 68, 74, 131, 105], [0, 0, 2, 1, 2, 13, 41, 58, 105, 90], [0, 0, 0, 0, 1, 1, 28, 24, 52, 52], [0, 0, 0, 0, 0, 2, 12, 32, 34, 39], [0, 0, 0, 1, 3, 4, 24, 7, 23, 13], [0, 0, 0, 0, 0, 2, 15, 26, 33, 28]]
nnen = len(nen_list)
# 1位のコード抽出
topcode = ”
maxtot = 0
for n1, str1 in enumerate(arr_nxny):
ntot = 0
for nn1 in str1:
ntot = ntot + nn1
if ntot > maxtot:
maxtot = ntot
ncd = n1
bcode = code_list[ncd] # 1位のコード名
list01 = arr_nxny[ncd]
nlast = list01[nnen-1]
# print(‘最終年の件数=’,nlast)
nzennen = list01[nnen-2]
# print(‘最終年前年の件数=’,nzennen)
ninc = nlast-nzennen # (最終年 – 前年)の件数
# print(‘(最終年 – 前年)の件数=’,ninc)
g_title = ‘コード別発行件数の年別推移‘
# def実行
fig_n = ‘図0′
wrd = ”
wrd01,wrd02 = oresen_comment(nen_list,code_list,arr_nxny,fig_n, g_title)
print(‘wrd01=’,wrd01)
print(‘wrd02=’,wrd02)
# 増減判定
import pandas as pd
import numpy as np
def chk_zogen(testud_list,nstt,nstp):
wrdud = “”
flg = 0
bflg = 0
ntot = 0
flg2 = 0
flg3 = 0
bstt = testud_list[nstt-1] # nstt-1の増減率
for n1,nn1 in enumerate(testud_list):
if n1 > nstp -1: break
if n1 >= nstt:
ntot = ntot + nn1
if abs(bstt-ntot) > 1: # 増減が大きければ横這いとせず
bflg = 1
if nstt == 0: # 開始年からの横這いはここでは判定しない
bflg = 1
if abs(nn1) > 1: # 増減が大きければ横這いとせず
bflg = 1
if nn1 > 8: flg2 = 1
if nn1 < -8: flg3 = 1
if ntot > 0:
if flg2 == 1:
wrdud = “急増し、“
else:
wrdud = “増加し、“
flg = 1
if abs(ntot) <= 1:
if bflg == 0:
wrdud = “横這い、“
flg = 2
if ntot < 0:
if flg3 == 1:
wrdud = “急減し、“
else:
wrdud = “減少し、”
flg =3
# 連続増加を判定
flg2 = 0
if flg == 1:
k = 0
for n1, nn1 in enumerate(testud_list):
if n1 > nstp -1: break
if n1 >= nstt:
if nn1 >= 0:
k = k +1
if nn1 > 7: flg2 = 1
else:
break
if k >= 2:
if flg2 == 1:
wrdud = “急増し、“
else:
wrdud = “増加し、“
if k >= 3:
wrdud = “増加し続け、“
# 増減しながらも増加
if flg == 1:
kp = 0
km = 0
for n1, nn1 in enumerate(testud_list):
if n1 > nstp -1: break
if n1 >= nstt:
if nn1 >= 0:
kp = kp +1
else:
km = km + 1
if kp > 0:
if km > 0:
wrdud = “増減しながらも増加し、“
# 連続横這いを判定
if flg == 2:
k = 0
bnn0 = testud_list[nstt]
ntot = 0
for n1, nn1 in enumerate(testud_list):
if n1 > nstp -1: break
if n1 >= nstt:
ntot = ntot + nn1
if ntot <= 1:
k = k +1
else:
break
if k >= 2:
wrdud = “横這いが続き、“
# 連続減少を判定
if flg == 3:
k = 0
for n1, nn1 in enumerate(testud_list):
if n1 > nstp -1: break
if n1 >= nstt:
if nn1 <= 0:
k = k +1
else:
break
if k >= 3:
wrdud = “減少し続け、“
# 増減しながらも減少
if flg == 3:
kp = 0
km = 0
for n1, nn1 in enumerate(testud_list):
if n1 > nstp -1: break
if n1 >= nstt:
if nn1 <= 0:
kp = kp +1
else:
km = km + 1
if kp > 0:
if km > 0:
wrdud = “増減しながらも減少し、”
return(wrdud)
# def棒グラフとコメント作成
## 棒グラフデータを分析し、棒グラフの特徴を表すコメントを作成
# ex:py_list=[‘2011’, ‘2012’, ‘2013’, ‘2014’, ‘2015’, ‘2016’, ‘2017’, ‘2018’, ‘2019’, ‘2020’]
# ex:nyken_list[2, 5, 6, 6, 14, 52, 169, 216, 274, 254]
def bargraph_comment(py_list,nyken_list):
nnen = len(py_list) # 調査年数nnen(int)算出
py_list = py_list # 公報発行年
# print(‘公報発行年py_list=’,py_list)
nyken_list = nyken_list # 年別発行件数
# print(‘年別発行件数nyken_list=’,nyken_list)
# 合計ntot算出
ntot = 0
for n1 in nyken_list:
ntot = ntot + n1
# print(‘合計件数ntot=’,ntot)
# 年別発行率pken_list(発行年の件数/合計件数ntot)
pken_list = []
for nn1 in nyken_list:
bpken = (nn1/ntot)*100
bpken = round(bpken,1)
pken_list.append(bpken)
# print(‘年別発行率pken_list=’,pken_list)
# 増減率を計算
bn = 0
testud_list = []
for n1,str1 in enumerate(nyken_list):
if n1>0:
if ntot > 0:
bd = ((str1 – bn)/ntot)*100
bd = round(bd,1)
testud_list.append(bd)
else:
bd = 100 # とりあえず100に設定
testud_list.append(bd)
bn = str1
# print(‘増減率testud_list=’,testud_list)
# 増減反転回数をカウント
ctud = 0 # 増減反転カウンタ
flgud = 0
for n1, nn1 in enumerate(testud_list):
if n1 == len(testud_list) – 1: break
if nn1 > 0:
if testud_list[n1+1] < 0: ctud = ctud + 1
if nn1 < 0:
if testud_list[n1+1] > 0: ctud = ctud + 1
# print(‘増減反転回数ctud=’,ctud)
# 初期化
ptn0 = 0
wrd = ”
# 全期間のパターンptnを判定
# 増加
if nyken_list[nnen-1] – nyken_list[0] > 1:ptn0 = 1 # 全期間では増加
if nyken_list[nnen-1] – nyken_list[0] > (ntot/nnen)*2: ptn0 = 2 # 全期間では急増
# 減少
if nyken_list[nnen-1] – nyken_list[0] < -1:ptn0 = -1 # 全期間では減少
if nyken_list[nnen-1] – nyken_list[0] < (-ntot/nnen)/2: ptn0 = -2 # 全期間では急減
# 横這い
if abs(nyken_list[nnen-1] – nyken_list[0]) <= 1: ptn0 = 4 # 全期間では横這い
# if ctud > 2: # 増減回数が3回以上ならば
if ctud > 2:
if ptn0 == 4: # パターン4を5に修正
ptn0 = 5
else: # さもなくば
if ptn0 > 0: ptn0 = 3 # パターン1と2を3に修正
if ptn0 < 0: ptn0 = -3 # パターン-1と-2を-3に修正
# 全期間の傾向をコメント
wrd0 = ”
# 増加
if ptn0 == 1: wrd0 = ‘全期間では増加傾向を示している。‘
if ptn0 == 2: wrd0 = ‘全期間では増加傾向が顕著である。‘
if ptn0 == 3: wrd0 = ‘全期間では増減しながらも増加傾向を示している。‘
# 減少
if ptn0 == -1: wrd0 = ‘全期間では減少傾向を示している。‘
if ptn0 == -2: wrd0 = ‘全期間では減少傾向が顕著である。‘
if ptn0 == -3: wrd0 = ‘全期間では増減しながらも減少傾向を示している。‘
# 横這い
if ptn0 == 4: wrd0 = ‘全期間では横這い傾向を示している。‘
if ptn0 == 5: wrd0 = ‘増減しているものの全期間で見ると横這い傾向を示している。‘
wrd0 = wrd0 + “\n” + “ “
#print(‘パターンptn0=’,ptn0,’=’,wrd)
# 調査期間
#print(‘調査期間nnen=’,nnen,’年‘)
# 開始年
pystt = int(py_list[0])
#print(‘開始年pystt=’,pystt,type(pystt))
ppystt = pken_list[0]
#print(‘開始年発行率ppystt=’,ppystt,type(ppystt))
# 最終年
pystp = int(py_list[nnen-1])
#print(‘最終年pystp=’,pystp,type(pystp))
ppystp = pken_list[nnen-1]
#print(‘最終年発行率ppystp=’,ppystp,type(ppystp))
pstp = testud_list[nnen-2]
#print(‘最終年増減率pstp=’,pstp,type(pstp))
# ボトム年判定pymin
wrd_btm = ”
nbtm = 1000000
pymin= 0
npymin = 0
for n1, str1 in enumerate(nyken_list):
if str1< nbtm:
nbtm = str1
bpymin = py_list[n1]
npymin = n1
bn1 = n1
pymin = int(bpymin)
ppymin = pken_list[bn1]
#print(‘ボトム年発行率ppymin=’,ppymin,type(bn1))
# ピーク年判定pymax
wrd_peak_nen = “0000”
wrd_peak = ”
npeak = 0
pymax= 1000000
npymax = 0
for n1, str1 in enumerate(nyken_list):
if str1> npeak:
npeak = str1
bpymax = py_list[n1]
npymax = n1
bn1 = n1
pymax = int(bpymax)
ppymax = pken_list[bn1]
#print(‘ピーク年ppymax=’,ppymax,type(ppymax))
# 調査開始年以降が0件ならば調査開始年を修正
flgup0 = 0
newpystt = 0
if nyken_list[0] == 0:
for n2, nn2 in enumerate(nyken_list):
if nn2 == 0:
upstt0 = int(py_list[n2+1]) # 新増加開始年
flgup0 = n2
else:
break
newpystt = int(py_list[flgup0]) + 1
#print(‘新開始年newpystt=’,newpystt,type(newpystt))
# パラメータをリスト化
para_list = []
para_list.append(str(pystt) + “pystt”)
para_list.append(str(pystp) + “pystp”)
para_list.append(str(pymin) + “pymin”)
para_list.append(str(pymax) + “pymax”)
#print(para_list)
# 発行年順にソート
para_list= sorted(para_list)
# 増減パターン
#print(‘増減パターンpara_list=’,para_list)
#テストデータ書き出し
print(”)
print(‘list2= ‘,py_list)
print(‘list3= ‘,nyken_list)
print(‘年別発行率pken_list=’,pken_list)
print(‘増減率testud_list=’,testud_list)
print(‘全期間の傾向para_list=’,para_list)
# 増減パターンptn判定
ptn1 = 0
# 開始年のパターン
wrd1 = “”
if para_list[0][4:] == “pystt”:
ptn1 = 11 # pymax !=pystt
wrd1 = wrd1 + “開始年は” + para_list[0][0:4] + “年であり、”
if para_list[0][4:] == ‘pymin’:
ptn1= 12 # pymin=pystt
wrd1 = wrd1 + “開始年の” + para_list[0][0:4] + “年がボトムであり、“
if para_list[0][4:] == ‘pymax’:
ptn1= 13 # pymax=pystt
wrd1 = wrd1 + “開始年の” + para_list[0][0:4] + “年がピークであり、“
# 開始年からの連続増加を判定
nupmax = 0
for n1, nn1 in enumerate(pken_list):
if n1 > 0:
if (pken_list[n1-1] – pken_list[n1]) < 0:
nupmax = nupmax + 1
else:
break
# 開始年からの連続減少を判定
ndwnmax = 0
for n1, nn1 in enumerate(pken_list):
if n1 > 0:
if (pken_list[n1-1] – pken_list[n1]) > 0:
ndwnmax = ndwnmax + 1
else:
break
#print(‘開始年からの連続増減少年数ndwnmax=’,ndwnmax)
# 連続横這いを判定(開始年0件は除く)
flg = 0
if nupmax >=2: flg = 1
if ndwnmax >=2: flg = 1
if flg == 0:
if nyken_list[0] !=0:
bpken0 = pken_list[0]
k = 0 # 横這いカウンタ
flg = 0
ndwn = 0 # DOWNカウンタ
nup = 0 # UPカウンタ
for n1, nn1 in enumerate(pken_list):
if n1 > 0:
if n1 < (len(pken_list) -1):
if abs(nn1 – bpken0) <=1:
if (pken_list[n1-1] – pken_list[n1]) > 0:
ndwn = ndwn + 1
nup = 0
if (pken_list[n1-1] – pken_list[n1]) < 0:
nup = nup + 1
ndwn = 0
if abs(bpken0 – nn1) <= 1: # pyminかpymaxは除外
if int(py_list[n1]) == pymin: flg = 1
if int(py_list[n1]) == pymax: flg = 1
if flg == 1:
if abs(bpken0 – nn1) < 0.5: flg = 0 # nn1までの増減が小ならば横這い
if abs(pken_list[n1-1] – pken_list[n1]) > 1: flg = 1 # 翌年の増減が大ならば増減
if abs(nn1 – bpken0) <=1:
if flg == 0:
k = k +1
else:
break
if k >= 2:
bk = k
bpy0 = py_list[bk ]
print(‘連続横這い終了年=’,bpy0,’bk=’,bk)
print(‘連続減少数=’,ndwn,’連続増加数=’,nup)
if ndwn > 0:
if bk > ndwn: ptn1= 14 # 連続横這い
if nup > 0:
if bk > nup: ptn1= 14 # 連続横這い
print(‘ptn1=’,ptn1,wrd1)
# 最終年のパターン
ptn2 = 0
wrd4 = “”
if para_list[3][4:] == “pystp”:
if para_list[3][0:4] != para_list[2][0:4]:
ptn2 = 21 # pymax !=pystp
wrd4 = wrd4 + “最終年は” + para_list[3][0:4] + “年であり、“
else:
if para_list[2][4:] == “pymax”:
ptn2 = 22 # pymax=pystp
wrd4 = wrd4 + “最終年の” + para_list[3][0:4] + “年がピークであり、”
if para_list[2][4:] == “pymin”:
ptn2 = 23 # pymin=pystp
wrd4 = wrd4 + “最終年の” + para_list[3][0:4] + “年がボトムであり、”
print(‘ptn2=’,ptn2,wrd4)
# 開始年からpara_list[2]までの増減パターン
wrd2 =””
if ptn1 == 11:
# 開始年から減少
if para_list[1][4:] == “pymin”:
# 翌年がボトム
if npymin == 1:
wrd2 = wrd2 + “翌年にボトムを付け、“
# def実行
nstt = 1
nstp = npymax
wrdud = chk_zogen(testud_list,nstt,nstp)
if para_list[2][0:4] != para_list[3][0:4]: # ピーク年 != 最終年ならば
wrd2 = wrd2 + “ピークの” + str(pymax) + “年まで” + wrdud
else:
# def実行
nstt = 0
nstp = npymin
wrdud = chk_zogen(testud_list,nstt,nstp)
# if wrdud== ‘減少し続け、‘: # 連続減少ならば
if “減少” in wrdud:
wrd2 = wrd2 + str(pymin) + “年のボトムにかけて” + wrdud
# def実行
nstt = npymin
nstp = npymax
wrdud = chk_zogen(testud_list,nstt,nstp)
if para_list[2][0:4] != para_list[3][0:4]: # ピーク年 != 最終年ならば
wrd2 = wrd2 + “ピークの” + str(pymax) + “年まで” + wrdud
else:
wrd2 = wrd2 + str(pymin) + “年にボトムを付け、“
# def実行
nstt = npymin
nstp = npymax
wrdud = chk_zogen(testud_list,nstt,nstp)
if para_list[2][0:4] != para_list[3][0:4]: # ピーク年 != 最終年ならば
wrd2 = wrd2 + “ピークの” + str(pymax) + “年まで” + wrdud
# 開始年から増加
if para_list[1][4:] == “pymax”:
# 翌年がピーク
if npymax == 1:
wrd2 = wrd2 + “翌年にピークを付け、“
# def実行
nstt = npymax
nstp = npymin
wrdud = chk_zogen(testud_list,nstt,nstp)
if para_list[2][0:4] != para_list[3][0:4]: # ピーク年 != 最終年ならば
wrd2 = wrd2 + “ボトムの” + str(pymin) + “年まで” + wrdud
else:
# def実行
nstt = 0
nstp = npymax
wrdud = chk_zogen(testud_list,nstt,nstp)
wrd2 = wrd2 + str(pymax) + “年のピークにかけて” + wrdud
# def実行
nstt = npymax
nstp = npymin
wrdud = chk_zogen(testud_list,nstt,nstp)
if para_list[2][0:4] != para_list[3][0:4]: # ピーク年 != 最終年ならば
wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud
# 開始年=ボトムの増減パターン
if ptn1 == 12:
wrd1 =””
wrd2 =””
# 開始年=ボトム
# 開始年が0件の場合
k = 0
if nyken_list[0] == 0: # 開始年が0件
k = 0
for n1, nn1 in enumerate(nyken_list):
if nn1 == 0:
k = k + 1
else:
break
#print(“0件の終了年=”,py_list[k -1])
k0py = int(py_list[k -1])
if k > 0:
if para_list[0][0:4] == str(k0py):
wrd1 = “開始年の” + para_list[0][0:4] + “年は0件であり、その後は“
else:
wrd1 = “開始年の” + para_list[0][0:4] + “年から” + str(k0py) + “年までは0件であり、“
else:
wrd1 = wrd1 + “開始年の” + para_list[0][0:4] + “年がボトムであり、“
# 開始から横這いを判定
nn0 = pken_list[0]
bflnen = 0
k = 0
for n1, nn1 in enumerate(pken_list):
if abs(nn1-nn0) > 1: break
bflnen = int(py_list[n1])
k = k +1
print(‘横這い終了年=’,bflnen)
if k >= 3:
wrd1 = wrd1 + str(bflnen) +”年まで横這いを続け、“
# 開始年からpara_list[2]までの増減パターン
# 開始年から増加
if para_list[2][4:] == “pymax”:
# 翌年がピーク
if npymax == 1:
if testud_list[1] < -5:
wrd2 = wrd2 + “翌年にピークを付けた後に急減し、“
pymax = py_list[2]
npymax = 2
else:
wrd2 = wrd2 + “翌年にピークを付け、”
else:
# def実行
nstt = 0
nstp = npymax
wrdud = chk_zogen(testud_list,nstt,nstp)
if pymax == pystp:
wrdud = wrdud.replace(“増加し、“,”増加している。“)
wrd2 = wrd2 + “最終年(=ピーク年)の” + str(pymax) + “年にかけて” + wrdud
print(“ptn2=”,ptn2,”最終年がピークであり“)
ptn1 = 0
ptn2 = 0
wrd4 = “”
else:
wrd2 = wrd2 + str(pymax) + “年のピークにかけて” + wrdud
#開始年=ピークの増減パターン
if ptn1 == 13:
wrd1 =””
wrd2 =””
# 開始年=ピーク
wrd1 = wrd1 + “開始年の” + para_list[0][0:4] + “年がピークであり、“
# 開始年から減少
if para_list[2][4:] == “pymin”:
# 翌年がボトム
if npymin == 1:
wrd2 = wrd2 + “翌年にボトムを付け、“
else:
if pymin != pystp:
# def実行
nstt = 0
nstp = npymin
wrdud = chk_zogen(testud_list,nstt,nstp)
wrd2 = wrd2 + str(pymin) + “年のボトムにかけて” + wrdud
# 全期間で横這い判定
bmin = 100
bmax = 0
for n1, nn1 in enumerate(pken_list):
if nn1 < bmin: bmin = nn1
if nn1 > bmax: bmax = nn1
# print(‘全期間のmax-min=’,bmax, ‘-‘, bmin, ‘=’, bmax – bmin)
bmaxmin = bmax – bmin
if bmaxmin <= 1:
wrd2 = “開始年の” + str(pystt) + “年から最終年の” + str(pystp) + “年までの全期間で増減は少なく、ほぼ横這いとなっている。“
ptn1 = 15
ptn2 = 25
wrd1 = “”
wrd4 = “”
print(“ptn1=”,ptn1,”全期間で横這い“)
print(“ptn2=”,ptn2,”全期間で横這い“)
if bmaxmin <= 2:
wrd2 = “開始年の” + str(pystt) + “年から最終年の” + str(pystp) + “年まで多少増減しているものの、全期間で見ると概ね横這いとなっている。“
ptn1 = 15
ptn2 = 25
wrd1 = “”
wrd4 = “”
print(“ptn1=”,ptn1,”全期間で概ね横這い“)
print(“ptn2=”,ptn2,”全期間で概ね横這い“)
# print(wrd2)
# 開始年近傍=連続横這い
if ptn1 == 14: # 連続横這い
wrd1 = “”
wrd2 = “”
if int(bpy0) == int(pymin):
wrd2 = “開始年の” + str(pystt) + “年からボトムの” + str(pymin) + “年までほぼ横這いとなっており、その後、“
else:
wrd2 = “開始年の” + str(pystt) + “年から” + str(bpy0) + “年までほぼ横這いとなっており、その後、“
# para_list[1]をテスト
if int(bpy0) < int(para_list[1][0:4]): # 横這い終了年の後にpara_list[1][0:4]
if para_list[1][4:] == “pymax”:
# def実行
nstt = bk
nstp = npymax
wrdud = chk_zogen(testud_list,nstt,nstp)
wrd2 = wrd2 + “ピークの” + str(pymax) + “年にかけて” + wrdud
if para_list[2][4:] == “pymin”:
if pymin != pystp:
# def実行
nstt = npymax
nstp = npymin
wrdud = chk_zogen(testud_list,nstt,nstp)
wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud
if para_list[1][4:] == “pymin”:
# def実行
nstt = bk
nstp = npymin
wrdud = chk_zogen(testud_list,nstt,nstp)
wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud
if para_list[2][4:] == “pymax”:
if pymax != pystp:
# def実行
nstt = npymin
nstp = npymax
wrdud = chk_zogen(testud_list,nstt,nstp)
wrd2 = wrd2 + “ピークの” + str(pymax) + “年にかけて” + wrdud
if para_list[1][4:] == “pystt”:
wrd1 = “”
wrd2 = “開始年の” + str(pystt) + “年から” + str(bpy0) + “年までほぼ横這いとなっており、その後、“
if para_list[2][4:] == “pymin”:
# def実行
nstt = bk
nstp = npymin
wrdud = chk_zogen(testud_list,nstt,nstp)
wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud
if para_list[2][4:] == “pymax”:
# def実行
nstt = bk
nstp = npymax
wrdud = chk_zogen(testud_list,nstt,nstp)
wrd2 = wrd2 + “ピークの” + str(pymax) + “年にかけて” + wrdud
if int(bpy0) >= int(para_list[1][0:4]): # 横這い終了年の前にpara_list[1][0:4]ならばpara_list[2]をテスト
# para_list[2]をテスト
if int(para_list[2][0:4]) >= int(bpy0):
if para_list[2][4:] == “pymax”:
# def実行
nstt = bk
nstp = npymax
wrdud = chk_zogen(testud_list,nstt,nstp)
if pymax == pystp:
wrdud = wrdud.replace(“し、“,”している。“)
wrdud = wrdud.replace(“し続け、“,”し続けている。“)
wrd2 = wrd2 + “最終年(=ピーク年)の” + str(pymax) + “年にかけて” + wrdud
wrd1 = “”
wrd4 = “”
ptn2 = 0
else:
if pymax != pystp:
wrd2 = wrd2 + “ピークの” + str(pymax) + “年にかけて” + wrdud
if para_list[2][4:] == “pymin”:
# def実行
nstt = bk
nstp = npymin
wrdud = chk_zogen(testud_list,nstt,nstp)
if pymin == pystp:
wrdud = wrdud.replace(“し、“,”している。“)
wrd2 = wrd2 + “最終年(=ピーク年)の” + str(pymax) + “年にかけて” + wrdud
wrd1 = “”
wrd4 = “”
ptn2 = 0
else:
wrd2 = wrd2 + “ボトムの” + str(pymin) + “年にかけて” + wrdud
# 最終年のパターン
if ptn2 == 21: # “最終年は” + para_list[3][0:4] + “年であり、“
wrd4 = “最終年は” +str(pystp) + “年である。”
if para_list[3][4:] == “pystp”:
# 増減判定
if para_list[2][4:] == “pymin”:
# def実行
nstt = npymin
nstp = nnen -1
wrdud = chk_zogen(testud_list,nstt,nstp)
wrdud = wrdud.replace(“し、“,”し“)
wrdud = wrdud.replace(“け、“,”け“)
wrdud = wrdud.replace(“続き、“,”続い“)
if (pystp – pymin) == 1:
if testud_list[nnen-2] <= 1:
wrd4 = “最終年の” + str(para_list[3][0:4]) + “年はほぼ横這いとなっている。“
wrd4 = wrd4.replace(“し続けて“,”して“)
else:
wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけては” + wrdud + “ている。“
else:
if abs(pken_list[nstt] – pken_list[nstp]) <=1:
if pken_list[nstt] == pken_list[nstp]:
wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけてはボトムに戻っている。“
else:
wrd4 = “最終年の” + para_list[3][0:4] + “年にかけては” + wrdud + “ている。“
wrd4 = wrd4.replace(“増加し“,”ボトム近くに戻っ“)
wrd4 = wrd4.replace(“減少し“,”ボトム近くに戻っ“)
else:
#print(wrdud)
wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけては” + wrdud + “ている。“
if testud_list[nnen-2] < 0:
wrd4 = wrd4.replace(“し続けて“,”して“)
if para_list[2][4:] == “pymax”:
# def実行
nstt = npymax
nstp = nnen -1
wrdud = chk_zogen(testud_list,nstt,nstp)
wrdud = wrdud.replace(“し、“,”し“)
wrdud = wrdud.replace(“け、“,”け“)
wrdud = wrdud.replace(“続き、“,”続い“)
if (ppymax – ppystp) <= 1:
if abs(testud_list[nnen-2]) > 1:
if ppymax == ppystp:
wrd4 = “その後増減しているが、最終年の” + str(para_list[3][0:4]) + “年にはピークに戻っている。“
else:
wrd4 = “その後増減しているが、最終年の” + str(para_list[3][0:4]) + “年にはピーク近くに戻っている。“
else:
wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけてはほぼ横這いとなっている。“
else:
wrd4 = “最終年の” + str(para_list[3][0:4]) + “年にかけては” + wrdud + “ている。“
wrd4 = wrd4.replace(“し続けて“,”して“)
if testud_list[nnen-2] > 0:
wrd4 = wrd4.replace(“し続けて“,”して“)
# wrdudが空白でかつ開始年と最終年が同数
if wrdud == “”:
if abs(pken_list[0] – pken_list[nnen -1]) <= 1:
wrd4 = “その後に増減したものの、最終年の” + str(para_list[3][0:4]) + “年では開始年近くに戻っている。“
if ptn2 == 22: # “最終年の” + para_list[3][0:4] + “年がピークであり、“
print(“ptn2=”,ptn2,”最終年がピークであり、“)
wrd4 = “最終年は” +str(pystp) + “年である。“
print(“最終年=”,pystp)
if para_list[3][4:] == “pystp”:
if para_list[2][4:] == “pymax”:
if para_list[2][0:4] == para_list[3][0:4]:
wrd4 = “最終年の” + str(pystp) + “年がピークであり、”
# 増減判定
if para_list[1][4:] == “pymin”:
# def実行
nstt = npymin
nstp = nnen -1
wrdud = chk_zogen(testud_list,nstt,nstp)
wrdud = wrdud.replace(“し、“,”し“)
wrdud = wrdud.replace(“け、“,”け“)
if testud_list[nnen-2] > 5:
wrd4 = “最終年の” + para_list[3][0:4] + “年は急増しピークとなっている。“
else:
wrd4 = “最終年(=ピーク年)の” + para_list[3][0:4] + “年にかけて” + wrdud + “ている。“
if ptn2 == 23: # “最終年の” + para_list[3][0:4] + “年がボトムであり、”
print(“ptn2=”,ptn2,”最終年がボトムであり、“)
wrd4 = “最終年は” +str(pystp) + “年である。“
if para_list[3][4:] == “pystp”:
if para_list[2][4:] == “pymin”:
if para_list[2][0:4] == para_list[3][0:4]:
# 増減判定
if para_list[2][4:] == “pymin”:
# def実行
nstt = npymax
nstp = nnen -1
wrdud = chk_zogen(testud_list,nstt,nstp)
wrdud = wrdud.replace(“し、“,”し“)
wrdud = wrdud.replace(“け、“,”け“)
wrdud = wrdud.replace(“続き、“,”続い“)
wrd4 = “最終年(=ボトム年)の” + para_list[3][0:4] + “年にかけて” + wrdud + “ている。“
# 例外処理(横這い、急増、急減)
# max件数判定
nkenmax = 0
for n1, nn1 in enumerate(nyken_list):
if nn1 > nkenmax:
nkenmax = nkenmax + nn1
nkenmax = nn1
#print(‘最大件数=’,nkenmax)
# 少数ならば顕著を修正
if nkenmax < 10:
wrd0 = wrd0.replace(“増加傾向が顕著である“,”増加傾向を示している“)
wrd0 = wrd0.replace(“減少傾向が顕著である“,”減少傾向を示している“)
# 結合
wrd = wrd0 + wrd1 + wrd2 + wrd4
wrd = wrd.replace(“横這い、ている“,”横這いとなっている“)
wrd = wrd.replace(“その後翌年に“,”翌年に“)
#print(‘wrd=’,wrd)
# 最頻値件数判定
nkenmid = 0
bk = 0
bn = 0
for n1, nn1 in enumerate(nyken_list):
k = 0
for n2, nn2 in enumerate(nyken_list):
if nn1 == nn2:
k = k + 1
if k > bk:
bk = k
bn = nn1
nkenmid = bn
nkmid = bk
#print(‘最頻値=’,nkenmid,’出現回数=’,nkmid)
# max<10ならば急増、急減を増加、減少に置換
if nkenmax < 10:
wrd = wrd.replace(“急増“,”増加“)
wrd = wrd.replace(“急減“,”減少“)
# 横這い判定
# if nkenmax < 10:
if nkenmid <= 3:
nn00 = 3
else:
nn00 = 0
#
k = 0
kmax = 0
ktot = 0
bnn0 = pken_list[0]
flgup = 0
flgup1 = 0
flgdwn = 0
wrd5 = “”
wrdup = “”
wrddwn = “”
bn1 = 0
bn2 = 0
for n1, nn1 in enumerate(pken_list):
if n1 > 0:
# 横這い
if abs(bnn0 – nn1) <= 1:
k = k +1
if k >kmax: kmax =k
else:
k = 0
if kmax >= 2:
ktot =ktot + kmax
kmax = 0
bnn0 = pken_list[n1]
if n1 == len(pken_list) – 1:
ktot =ktot + kmax
# 急増
if testud_list[n1-1]>= (7 + nn00):
flgup = 1
bn1 = n1
# 急減
if testud_list[n1-1] <= (-7 – nn00):
flgdwn = 1
bn2 = n1
# 急増・急減
if n1 != (len(pken_list) -1):
if bn1 > 1:
if bn2 > 1:
if abs(bn1 – bn2) == 1:
flgup1 = 1
#print(‘横這い回数合計(2回以上の合計)=’,ktot ,’flgup=’,flgup,’flgup1=’,flgup1,’flgdwn=’,flgdwn)
#print(‘2回以上の横這い回数合計=’,ktot)
if ‘急増‘ in wrd:
flgup = 0
flgup1 = 0
if ‘急減‘ in wrd:
flgdwn = 0
if ‘横這いとなっており、‘ in wrd:
ktot = 0
if ‘横這いとなっている。‘ in wrd:
ktot = 0
# コメント追加
if nkenmax < 10:
flgup = 0
flgup1 = 0
flgdwn = 0
flg = 0
flgyoko = 0
if ktot >= 4:
flgyoko = 1
if flgup == 1: flg = 1
if flgup1 == 1: flg = 1
if flgdwn == 1: flg = 1
#print(ktot ,flgup,flgup1,flgdwn)
if flg == 1:
wrd5 = “横這いが続く期間が多く、さらに、“
else:
wrd5 = “横這いが続く期間が多かった。”
if flgup1 == 1:
wrdup = “急増・急減している期間があった。“
flgup = 0
flgdwn = 0
if flgup == 1:
if flgdwn == 1:
wrdup = “急増している期間があり、“
else:
wrdup = “急増している期間があった。“
if flgdwn == 1:
wrddwn = “急減している期間があった。“
# 結合
flg = 0
if flgyoko == 1:flg = 1
if flgup == 1:flg = 1
if flgup1 == 1:flg = 1
if flgdwn == 1:flg = 1
if flg == 1:
wrd = wrd + “また、” + wrd5 + wrdup + wrddwn
# 1期間を除き横這い
bn0 = nyken_list[0]
k = 0
for n1,nn1 in enumerate(nyken_list):
if n1 > 0:
if nyken_list[n1] != bn0: # 横這いでなくなれば
bpy = py_list[n1]
k = k + 1
if k == 1:
wrd = wrd0 + bpy + “年を除き全期間で横這いとなっている。“
# 1期間を除きほぼ横這い
if nkenmax < 15:
if nkmid > (nnen-5):
bn0 = nkenmid
k = 0
for n1,nn1 in enumerate(nyken_list):
if abs(nn1 – bn0) > 1:
if abs(pken_list[n1] – bn0) >= 7: # 横這い以上
bpy = py_list[n1]
k = k + 1
if k == 1:
wrd = wrd0 + bpy + “年を除き全期間でほぼ横這いとなっている。“
# 最大件数nkenmaxが少ない場合
if nkenmax < 10:
udmaxmin = 0
for n1,nn1 in enumerate(testud_list):
if abs(nn1) > udmaxmin:
udmaxmin = abs(nn1)
#print(‘増減率の変動量=’,udmaxmin)
if udmaxmin > 4: # 増減率の変動が大ならば
print(‘増減率の変動量=’,udmaxmin)
wrd = wrd0 + “全期間で発行件数は少ないが、増減している。“
# 増減件数の変動が小ならばほぼ横這い
udmaxmin = 0
for n1,nn1 in enumerate(nyken_list):
if abs(nn1) > udmaxmin:
udmaxmin = abs(nn1)
if udmaxmin <= 3: # 増減件数の変動が小ならば
print(‘増減件数の変動量=’,udmaxmin)
wrd = wrd0 + “全期間で発行件数が少ないため、増減件数も少なかった。“
# 最終年近傍を評価
wrd = ‘ ‘ + wrd + ‘\n ‘
print(‘増減率=’,testud_list)
#print(testud_list[nnen-3],testud_list[nnen-2])
print(‘pken_list=’,pken_list)
a =((pken_list[nnen-2]-pken_list[nnen-3])/2) # 左側の増減値の中央値
b =((pken_list[nnen-1]-pken_list[nnen-2])/2) # 右側の増減値の中央値
#print(a+b) # a点とb点を結ぶ直線y=ax+bの傾斜係数aと同等
kupdwn = ((pken_list[nnen-2]-pken_list[nnen-3])/2) + ((pken_list[nnen-1]-pken_list[nnen-2])/2)
print(‘傾斜係数=’,kupdwn)
flg = 0
lastwrd = “”
# 横這い判定
if abs(kupdwn) < 0.4:
if abs(testud_list[nnen-2]) <= 1:
if abs(testud_list[nnen-3]) <= 1:
lastwrd = “最終年近傍は横這い傾向である。“
flg = 1
#弱い増加判定
if kupdwn >= 0.4: # 弱い右上がりで
lastwrd = “最終年近傍は増加傾向を示していた。“
if testud_list[nnen-3] >= 0: # かつ左が減少ではなく
if testud_list[nnen-3] <= 2: # かつ左の増加が微増(+2まで)ならば
lastwrd = “最終年近傍は弱い増加傾向を示していた。“
flg = 1
if testud_list[nnen-3] < 0: # かつ左が減少で
if testud_list[nnen-3] > -2: # かつ左が-2以上で
if testud_list[nnen-2] >= 1: # かつ右が横這い以上に増加していれば
lastwrd = “最終年近傍は弱い増加傾向を示していた。“
flg = 1
#増加判定
if kupdwn >= 0.7: # 右上がりで
if testud_list[nnen-2] >= -2: # かつ右の減少が緩やか(-2)であれば
lastwrd = “最終年近傍は増加傾向である。“
flg = 1
if testud_list[nnen-2] >= 0: # かつ右が増加であれば
lastwrd = “最終年近傍は増加傾向である。“
flg = 1
#急増判定
if kupdwn >= 3: # 強い右上がりで
if testud_list[nnen-2] >= 2: # かつ右も強い増加(+2)であれば
lastwrd = “最終年近傍は強い増加傾向を示していた。“
flg = 1
#弱い減少判定
if kupdwn <= -0.4: # 弱い右下がりで
lastwrd = “最終年近傍は減少傾向を示していた。“
if testud_list[nnen-3] <= 0: # かつ左が増加ではなく
if testud_list[nnen-3] >= -1: # かつ左の増加が微減(-1)ならば
lastwrd = “最終年近傍は弱い減少傾向を示していた。”
flg = 1
if testud_list[nnen-3] > 0: # かつ左が増加で
if testud_list[nnen-3] < 2: # かつ左が+2以下で
if testud_list[nnen-2] >= -1: # かつ右が横這い以上に減少していれば
lastwrd = “最終年近傍は弱い減少傾向を示していた。”
flg = 1
#減少判定
if kupdwn <= -0.7: # 右下がりで
if testud_list[nnen-2] <= 2: # かつ右の増加が緩やか(+2)であれば
lastwrd = “最終年近傍は減少傾向である。“
#print(testud_list[nnen-2], ‘<=’, 2)
flg = 1
if testud_list[nnen-2] <= 0: # かつ右が減少であれば
lastwrd = “最終年近傍は減少傾向である。“
flg = 1
#急減判定
if kupdwn <= -3: # 強い右下がりで
if testud_list[nnen-2] <= -2: # 右も強い減少(-2)であれば
lastwrd = “最終年近傍は強い減少傾向を示していた。“
flg = 1
# 増減判定
if flg == 0:
if testud_list[nnen-3] > 0: # 増加
if testud_list[nnen-2] < 0: # 減少
lastwrd = “最終年近傍は増減(増加し減少)していた。“
if testud_list[nnen-3] < 0: # 減少
if testud_list[nnen-2] > 0: # 増加
lastwrd = “最終年近傍は増減(減少し増加)していた。“
# 年単位のmax件数が20件以下を再判定
if nkenmax <= 20:
print(‘年単位のmax件数=’,nkenmax)
flg = 0
# 横這い判定
if abs(kupdwn) <= 2:
if abs(testud_list[nnen-2]) <= 5:
if abs(testud_list[nnen-3]) <= 5:
lastwrd = “発行件数が少なく、最終年近傍は横這い傾向である。“
flg = 1
if abs(nyken_list[nnen-1] – nyken_list[nnen-2]) <= 1: # 右の変化が1以内でかつ
if abs(nyken_list[nnen-2] – nyken_list[nnen-3]) <= 1: # 左の変化が1以内でかつ
if abs(nyken_list[nnen-1] – nyken_list[nnen-3]) <= 1: # 左右の差異が1以内ならば
lastwrd = “発行件数が少なく、最終年近傍は横這い傾向である。“
flg = 2
if flg > 0: print(‘lastwrd=’,lastwrd,flg)
#増加判定
if flg != 2:
if kupdwn >= 0.7: # 右上がりで
if testud_list[nnen-2] > 5:
lastwrd = “発行件数は少ないが、最終年近傍では増加傾向である。“
flg = 1
if testud_list[nnen-3] > 5:
lastwrd = “発行件数は少ないが、最終年近傍では増加傾向である。“
flg = 1
if (testud_list[nnen-3] + testud_list[nnen-2]) > 2:
lastwrd = “発行件数は少ないが、最終年近傍では増加傾向である。“
lastwrd = lastwrd.replace(“最終年近傍は強い増加傾向“,”発行件数は少ないが、最終年近傍は増加傾向“)
#減少判定
if flg != 2:
if kupdwn <= -0.7:
if testud_list[nnen-2] < -5:
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。“
flg = 1
if testud_list[nnen-3] < -5:
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。“
flg = 1
if (testud_list[nnen-3] + testud_list[nnen-2]) < -2:
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。“
lastwrd = lastwrd.replace(“最終年近傍は強い減少傾向“,”発行件数は少ないが、最終年近傍は減少傾向“)
# 増減判定
if abs(nyken_list[nnen-1] – nyken_list[nnen-2]) > 1: flg = 3 # 右の変化が1を越えていれば
if abs(nyken_list[nnen-2] – nyken_list[nnen-3]) > 1: flg = 3 # 左の変化が1を越えていれば
if flg == 3:
if testud_list[nnen-3] > 0: # 増加
if testud_list[nnen-2] < 0: # 減少
lastwrd = “発行件数は少ないが、最終年近傍では増減(増加し減少)していた。“
if testud_list[nnen-3] < 0: # 減少
if testud_list[nnen-2] > 0: # 増加
lastwrd = “発行件数は少ないが、最終年近傍では増減(減少し増加)していた。“
#print(‘lastwrd=’,lastwrd)
if nkenmax <= 3: # 件数が極めて少数ならば
lastwrd = “発行件数が少なく、かつ最終年近傍の増減も少ないので、最終年近傍も横這い傾向である。“
flg = 2
# 最終年近傍で増加
if (nyken_list[nnen-1] – nyken_list[nnen-2]) >= 2: # 最終年が強く増加していれば
lastwrd = “発行件数は少ないが、最終年近傍では増加傾向を示していた。”
if testud_list[nnen-3] > 0:
if testud_list[nnen-2] > 0:
lastwrd = “発行件数は少ないが、最終年近傍では増加傾向を示していた。”
if testud_list[nnen-3] > 0:
if testud_list[nnen-2] > 0:
lastwrd = “発行件数は少ないが、最終年近傍では増加傾向を示していた。“
if (nyken_list[nnen-2] – nyken_list[nnen-3]) == 2:
if testud_list[nnen-2] == 0:
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。“
if testud_list[nnen-3] == 0:
if (nyken_list[nnen-1] – nyken_list[nnen-2]) == 2:
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”
# 最終年近傍で減少
if (nyken_list[nnen-1] – nyken_list[nnen-2]) <= -2: # 最終年が強く減少していれば
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”
if testud_list[nnen-3] < 0:
if testud_list[nnen-2] < 0:
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”
if testud_list[nnen-3] < 0:
if testud_list[nnen-2] < 0:
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”
if (nyken_list[nnen-3] – nyken_list[nnen-2]) == 2:
if testud_list[nnen-2] == 0:
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。“
if testud_list[nnen-3] == 0:
if (nyken_list[nnen-2] – nyken_list[nnen-1]) == 2:
lastwrd = “発行件数は少ないが、最終年近傍では減少傾向を示していた。”
# 最終年近傍では増減
if abs(nyken_list[nnen-1] – nyken_list[nnen-2]) > 1: # 最終年の変化が1以上ならば
if testud_list[nnen-3] > 0: # 増加
if testud_list[nnen-2] < 0: # 減少
lastwrd = “発行件数は少ないが、最終年近傍では増減(増加し減少)していた。“
if testud_list[nnen-3] < 0: # 減少
if testud_list[nnen-2] > 0: # 増加
lastwrd = “発行件数は少ないが、最終年近傍では増減(減少し増加)していた。”
# wrd にlastwrdを追加
wrd = wrd + lastwrd
wrd = wrd.replace(” “,” “)
# print(wrd)
return(wrd)
# テスト(def 棒グラフのコメントを作成)
import pandas as pd
import numpy as np
import openpyxl
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams[‘font.family’] = ‘MS PGothic’
import matplotlib.patches as patches
import csv
import copy
# 年データlist2と元の件数データlist3を設定
list2= [‘2011’, ‘2012’, ‘2013’, ‘2014’, ‘2015’, ‘2016’, ‘2017’, ‘2018’, ‘2019’, ‘2020’]
list3= [2, 5, 6, 6, 14, 52, 169, 216, 274, 254]
# 最終月数monthendを設定
monthend=7
monthend=12
# 追加補正係数nmend
npmend=12/int(monthend) – 1
print(‘追加補正係数=’,npmend)
# 追加件数を算出
nenlast = len(list3)
list4 = [] # 追加件数
list5 = [] # 合計件数
for n1,nn in enumerate(list3):
if (n1+1) == nenlast:
nn2 = nn*npmend
nn2 = round(nn2)
list4.append(nn2)
list5.append(nn+nn2)
else:
list4.append(0)
list5.append(nn)
print(‘元の件数=’,list3)
print(‘追加件数=’,list4)
print(‘合計件数=’,list5)
# 合計件数を算出
ntot = 0
for nn1 in list5:
ntot = ntot + nn1
print(‘合計件数=’,ntot)
# 描画データ設定
labels = list2
data = list3
data2 = list4
# 表示位置設定
x_width = 0.5
x_loc = np.array(range(len(data))) + x_width
# グラフの大きさを設定
fig = plt.figure(figsize=(13.0, 4.0))
# タイトル、ラベルを設定
plt.title(“公報発行件数の年別推移“, fontsize=20)
plt.xlabel(“発行年“, fontsize=18)
plt.ylabel(“発行件数“, fontsize=18)
plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘) # 棒グラフの設定
if npmend > 0: # 追加補正係数>0ならば予想件数を表示
plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘) # 棒グラフの設定
plt.xticks(x_loc, labels, fontsize=14) # x軸にラベル設定
plt.grid() # 罫線追加
# 追加補正係数>0ならば予想件数を表示
if npmend > 0:
plt.legend()
# 棒グラフ内に数値を書く
hx = (ntot/len(data))/30 # 書き込み位置を上に修正
for x, y in zip(x_loc, data):
plt.text(x, y+hx, y, ha=’center’, va=’bottom’) # 数値の書き込み位置をhx上に修正
# 描画実行
plt.show()
# def実行
wrd = bargraph_comment(list2,list5)
print(”)
print(‘wrd=’,wrd)
# defタイトルまとめ
## 「発明の名称」のリストから特徴のない語句や重複語句を削除し、リストとしてreturnする。
def titlematome(title_data):
titlewrd_list0 =[]
for n1, str1 in enumerate(title_data):
str1 = “、” + str1 + “、“
# 置換1(変換表による置換)
for n2, str2 in enumerate(hwrd1):
str3 = hwrd2[n2]
str1 = str1.replace(str2, str3)
# 置換2(置換1の後で置換)
str1 = str1.replace(‘処理方法‘, ‘処理装置‘)
str1 = str1.replace(‘処理プログラム、‘, ‘処理装置‘)
str1 = str1.replace(‘記憶した記憶‘, ‘記憶‘)
str1 = str1.replace(‘記録した記録‘, ‘記録‘)
str1 = str1.replace(‘記録した記憶‘, ‘記憶‘)
str1 = str1.replace(‘治療する‘, ‘治療、‘)
str1 = str1.replace(‘等や‘, ‘等、‘)
str1 = str1.replace(‘がブロッキング‘, ‘ブロッキング‘)
str1 = str1.replace(‘,‘, ‘、‘)
str1 = str1.replace(‘―’, ‘、‘)
str1 = str1.replace(‘→‘, ‘、‘)
str1 = str1.replace(‘。‘, ‘、‘)
str1 = str1.replace(‘‐’, ‘、‘)
str1 = str1.replace(‘.‘, ”)
str1 = str1.replace(‘を、‘, ‘、‘)
str1 = str1.replace(‘と、‘, ‘、‘)
# 類似語句を統合
str1 = str1.replace(‘制御プログラム‘, ‘制御‘)
str1 = str1.replace(‘制御システム‘, ‘制御‘)
str1 = str1.replace(‘制御装置‘, ‘制御‘)
str1 = str1.replace(‘制御方法‘, ‘制御‘)
str1 = str1.replace(‘管理プログラム‘, ‘管理‘)
str1 = str1.replace(‘管理システム‘, ‘管理‘)
str1 = str1.replace(‘管理装置‘, ‘管理‘)
str1 = str1.replace(‘管理方法‘, ‘管理‘)
# 単独の、システム、プログラム、装置、方法を削除
str1 = str1.replace(‘、システム、‘, ‘、‘)
str1 = str1.replace(‘、プログラム、‘, ‘、‘)
str1 = str1.replace(‘、制御装置、‘, ‘、‘)
str1 = str1.replace(‘、制御方法、‘, ‘、‘)
str1 = str1.replace(‘、制御プログラム、‘, ‘、‘)
str1 = str1.replace(‘、制御、‘, ‘、‘)
str1 = str1.replace(‘、情報処理装置、‘, ‘、‘)
str1 = str1.replace(‘、情報処理システム、‘, ‘、‘)
str1 = str1.replace(‘、装置、‘, ‘、‘)
str1 = str1.replace(‘、方法、‘, ‘、‘)
str1 = str1.replace(‘、使用、‘, ‘、‘)
# 追加修正
str1 = str1.replace(‘取得方法、取得装置‘, ‘取得方法‘)
str1 = str1.replace(‘可能な‘, ‘可能、‘)
str1 = str1.replace(‘/‘, ‘、‘)
str1 = str1.replace(‘を‘, ‘、‘)
str1 = str1.replace(‘、並び‘, ‘、‘)
str1 = str1.replace(‘、該‘,’、‘)
str1 = str1.replace(‘、成る‘,’、‘)
# 装置、方法、システム、プログラムの前が同一文ならばシステムかプログラムに統合
str1_list = str1.split(‘、‘) # 分割
k = 0
flg = 0
bstr = ”
bstr1 = ”
for str3 in str1_list:
npos = 0
if ‘装置‘ in str3:
npos = str3.find(‘装置‘)
else:
if ‘方法‘ in str3:
npos = str3.find(‘方法‘)
else:
if ‘システム‘ in str3:
npos = str3.find(‘システム‘)
flg = 1
bstr = str3[0:npos]
else:
if ‘プログラム‘ in str3:
npos = str3.find(‘プログラム‘)
flg = 2
bstr = str3[0:npos]
if bstr1 != ”:
if str3[0:npos] == bstr1: k = k + 1
bstr1 = str3[0:npos]
if k > 0:
if flg == 1:
str1 = bstr + ‘システム‘ # システムに統合
if flg == 2:
str1 = bstr + ‘プログラム‘ # プログラムに統合
str1 = str1.replace(‘、方法、‘, ‘、‘)
str1 = str1.replace(‘、装置、‘, ‘、‘)
str1 = str1.replace(‘、本方法、‘, ‘、‘)
str1 = str1.replace(‘、本装置、‘, ‘、‘)
str1 = str1.replace(‘、当方法、‘, ‘、‘)
str1 = str1.replace(‘、当装置、‘, ‘、‘)
str1 = str1.replace(‘、適用、‘, ‘、‘)
# 重複している「、、、」を「、」に置換
str1 = str1.replace(‘、、‘, ‘、‘) # 「、、」を「、」に置換
str1 = str1.replace(‘、、‘, ‘、‘) # 「、、」を「、」に置換
str1 = str1.replace(‘、、‘, ‘、‘) # 「、、」を「、」に置換
# 先頭と末尾の「、」を削除
if str1[0] == ‘、‘: str1 = str1[1:] # 先頭の「、」を削除
np = len(str1) – 1
if np > 0:
if str1[np] == ‘、‘: # 末尾の「、」を削除
str1 = str1[0:np]
np = len(str1) – 1
titlewrd_list0.append(str1)
# 「方法、」、「装置、」、「システム、」、「プログラム、」を消去
titlewrd_list1 = []
for n1, str1 in enumerate(titlewrd_list0):
str1 = str1 + ‘、‘
str1 = str1.replace(‘方法、‘, ‘、‘)
str1 = str1.replace(‘装置、‘, ‘、‘)
str1 = str1.replace(‘システム、‘, ‘、‘)
str1 = str1.replace(‘プログラム、‘, ‘、‘)
titlewrd_list1.append(str1)
# 重複語句を削除
titlewrd_list = []
for n1, str1 in enumerate(titlewrd_list1):
str2 = str1.split(‘、‘) # 分割
bstr2 = str2[0]
for str3 in str2:
if str3 not in bstr2:
bstr2 = bstr2 + ‘、‘ + str3
if bstr2 != ”:
print(n1,bstr2)
titlewrd_list.append(bstr2)
return(titlewrd_list)
# テスト(発明の名称からKWを抽出)
import pandas as pd
# 語句変換表読み込み
word_data0 = pd.read_excel(‘語句変換表.xlsx’,sheet_name=’変換表‘) # Excelデータ読み込み
word_data0 = word_data0.dropna(how=’all’) # 全列がNaNである行を削除
print(‘変換語句数=’,len(word_data0))
word_data1 = word_data0.iloc[:,0]
hwrd1 = []
for str1 in word_data1:
hwrd1.append(str1)
print(‘元の語句=’,hwrd1[0:5])
word_data2 = word_data0.iloc[:,1]
hwrd2 = []
for str1 in word_data2:
hwrd2.append(str1)
print(‘修正した語句=’,hwrd2[0:5])
# 公報データ読み込み
pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’utf-8′) # csvデータ読み込み
print(‘公報データ=’,len(pat_data))
# 発明の名称読み込み(100文字/件までに制限)
title_data = pat_data.iloc[:,3]
titlewrd_list0 =[]
for n1, str1 in enumerate(title_data):
if n1 == 1500: break
if n1 >= 1400:
if len(str1) > 100: str1 = str1[0:100] + “・・・” # 100文字/件までに制限
print(‘No=’,n1,str1)
titlewrd_list0.append(str1)
print(‘ ‘)
print(‘処理結果‘)
# def実行
titlewrd_list = titlematome(titlewrd_list0)
# print(titlewrd_list)
title_wrd = ”
for str1 in titlewrd_list:
if str1 not in title_wrd:
title_wrd = title_wrd + ‘、‘ + str1
# コメント追加
wrd1 = ‘ これらのサンプル公報の「発明の名称」には、‘
wrd2 = title_wrd
wrd3 = ‘などの語句が含まれていた。\n’
wrd = wrd1 + wrd2 + wrd3
print(wrd)
# 公報にコードを付与
# コードの1桁目はサブテーマとし、2桁目以下はIPCを集計・分析してコード化する。
# スクリブト1 公報データを読み込み、リスト化
## 件数が少ないときは「分析公報data.xlsx」に公報データをコピーし、Excel用の「公報データ読み込み」を有効にする。
## 件数が多すぎてExcelで処理できない時には、「分析公報data.csv」に公報データをコピーし、csv用の「公報データ読み込み」を有効にする。
import pandas as pd
import numpy as np
import collections
import openpyxl
# import codecs
print(”)
print(‘出力サンプル‘)
# 公報データ読み込み
try:
pat_data = pd.read_csv(‘分析公報data.csv’, engine =’python’) # csv用
except UnicodeDecodeError as e:
pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’shift_jis’) # csv用
# pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’utf-8′) # csv用
pat_data = pat_data.dropna(how=’all’) # 全列がNaNである行を削除
print(‘対象公報件数=’,len(pat_data))
# クラスタ化する最小件数を設定
min_clst = len(pat_data) * 0.05
print(‘一次クラスタ化する最小件数=’,min_clst)
## 公報データ読み込み ##
# 公報番号欄読み込み
patno_data = pat_data.iloc[:,0]
pn_list =[]
for str1 in patno_data:
str0 = str1
pn_list.append(str(str0))
# 出願番号読み込み
apno_data = pat_data.iloc[:,1]
an_list =[]
for str1 in apno_data:
str0 = str1
an_list.append(str(str0))
# 発行日読み込み
pd_data = pat_data.iloc[:,2]
pd_list =[]
for str1 in pd_data:
if “発行” not in str(str1):
str0 = str(str1)[0:10]
pd_list.append(str(str0))
# 発明の名称欄読み込み
title_data = pat_data.iloc[:,3]
ti_list =[]
for str1 in title_data:
str0 = str1
ti_list.append(str(str0))
# 出願人名称読み込み
apname_data = pat_data.iloc[:,4]
ap_list =[]
for str1 in apname_data:
str0 = str1
ap_list.append(str(str0))
# 発明者読み込み
name_data = pat_data.iloc[:,5]
name_list =[]
for str1 in name_data:
str0 = str(str1)
name_list.append(str0)
# IPC読み込み
ipc_data = pat_data.iloc[:,6]
ipc_list =[]
for str1 in ipc_data:
str0 = str(str1) + ‘;’
ipc_list.append(str0)
# FI読み込み
fi_data = pat_data.iloc[:,7]
fi_list =[]
for str1 in fi_data:
str1 = str(str1)
if len(str1) > 3:
#データ中の空白を削除
str1 = (str1.replace(‘ ‘, ‘,’)) # 空白を「,」に置換
str1 = (str1.replace(‘ ‘, ‘,’)) # 空白を「,」に置換
str1 = (str1.replace(‘ ‘, ‘,’)) # 空白を「,」に置換
str1 = (str1.replace(‘ ‘, ‘,’)) # 空白を「,」に置換
str1 = (str1.replace(‘ ‘, ‘,’)) # 空白を「,」に置換
str1 = (str1.replace(‘ ‘, ‘,’)) # 「,,」を「,」に置換
str1 = (str1.replace(‘,,’, ‘,’)) # 「,,」を「,」に置換
str1 = (str1.replace(“ “, “”)) # 全角空白を削除
str1 = (str1.replace(” “, “”)) # 半角空白を削除
str1 = (str1.replace(” “, “”)) # 全角空白を削除
str0 = str(str1) + ‘;’
fi_list.append(str0)
else:
fi_list.append(‘分類無し‘)
# Fターム読み込み
ft_data = pat_data.iloc[:,8]
ft_list =[]
for str1 in ft_data:
str1 = str(str1)
if len(str1) > 3:
#データ中の空白を削除
str1 = (str1.replace(” “, “”)) # 半角空白を削除
str1 = (str1.replace(“ “, “”)) # 全角空白を削除
str0 = str(str1)
ft_list.append(str0)
else:
ft_list.append(‘分類無し‘)
# 要約読み込み
abst_data = pat_data.iloc[:,9] # 分類コードが無い場合
abst_list =[]
for str1 in abst_data:
str1 = str(str1)
if len(str1) > 3:
#データ中の空白を削除
str1 = (str1.replace(” “, “”)) # 半角空白を削除
str1 = (str1.replace(“ “, “”)) # 全角空白を削除
str1 = (str1.replace(“,”, “”)) # 「,」を「、」に置換
abst_list.append(str1)
else:
abst_list.append(‘要約無し‘)
# スクリブト2 公報データの特許分類を修正
## 変更があったIPC、FIの分類を代表となる一つの分類に変更する。
### (例:情報検索:旧G06F17/30を新G06F16/00に変更)
print(”)
print(‘出力サンプル‘)
# 分類修正表読み込み
# IPC読み込み
shusei_data01 = pd.read_excel(‘修正分類表.xlsx’,sheet_name=’IPC’)
# 元のIPC欄読み込み
moto_ipc = shusei_data01.iloc[:,0]
motoipc_list = []
for str1 in moto_ipc:
if ‘ ‘ in str1: str1 = str1.replace(‘ ‘,”)
str1 = str1 + ‘;’
motoipc_list.append(str1)
print(‘元のIPC=’,motoipc_list)
# 修正後のIPC欄読み込み
shusei_ipc = shusei_data01.iloc[:,1]
shuseiipc_list = []
for str1 in shusei_ipc:
str1 = str1 + ‘;’
shuseiipc_list.append(str1)
print(‘修正後のIPC=’,shuseiipc_list)
# IPC修正
ipc_list02 =[]
for str1 in ipc_list:
if str1[-1] != ‘;’: # 末尾が ‘;’でなければ末尾を追加
str1 = str1 + ‘;’
for n1, str2 in enumerate(motoipc_list):
if str2[-1] != ‘;’: # 末尾が ‘;’でなければ末尾を追加
str2 = str2 + ‘;’
if str2 in str1:
str3 = shuseiipc_list[n1]
if str3 in str1:
str1 = str1.replace(str2,”)
else:
str1 = str1.replace(str2,str3)
if str1[-1] == ‘;’: # 末尾が ‘;’ならば末尾を除去
np = len(str1)
str1 = str1[0:np-1]
ipc_list02.append(str1)
print(‘IPC[0:3] =’,ipc_list02[0:3])
# FI読み込み
shusei_data02 = pd.read_excel(‘修正分類表.xlsx’,sheet_name=’FI’)
# 元のFI欄読み込み
moto_fi = shusei_data02.iloc[:,0]
motofi_list = []
for str1 in moto_fi:
str1 = str1 + ‘;’
motofi_list.append(str1)
print(‘元のFI=’,motofi_list)
# 修正後のFI欄読み込み
shusei_fi = shusei_data02.iloc[:,1]
shuseifi_list = []
for str1 in shusei_fi:
str1 = str1 + ‘;’
shuseifi_list.append(str1)
print(‘修正後のFI=’,shuseifi_list)
# FI修正
fi_list02 =[]
for str1 in fi_list:
if str1[-1] != ‘;’: # 末尾が ‘;’でなければ末尾を追加
str1 = str1 + ‘;’
for n1, str2 in enumerate(motofi_list):
if str2[-1] != ‘;’: # 末尾が ‘;’でなければ末尾を追加
str2 = str2 + ‘;’
if str2 in str1:
str3 = shuseifi_list[n1]
if str3 in str1:
str1 = str1.replace(str2,”)
else:
str1 = str1.replace(str2,str3)
if str1[-1] == ‘;’: # 末尾が ‘;’ならば末尾を除去
np = len(str1)
str1 = str1[0:np-1]
fi_list02.append(str1)
# DataFrame化
df01 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])
df02 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])
df03 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])
df04 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])
df05 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])
df06 = pd.DataFrame(data=name_list, columns=[‘発明者‘])
df07 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])
df08 = pd.DataFrame(data=fi_list02, columns=[‘FI‘])
df09 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])
df10 = pd.DataFrame(data=abst_list, columns=[‘要約‘])
# 結合
df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df10], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/new_patlist.csv’,encoding=’utf-8′, index=False)
# スクリブト3 IPCクラス別出現頻度を集計
print(”)
print(‘出力サンプル‘)
# IPC欄読み込み
ipc_data = pat_data.iloc[:,6]
df07 = pd.DataFrame(data=ipc_data)
# 分割してリスト化
ipc_list01 = []
for str1 in ipc_data:
list1_split = str1.split(‘;’) # 「;」で分割
ipc_list01.append(list1_split)
# 公報データを分割し、クラスに修正
class_list = []
for str1 in ipc_data:
ipc_split = str1.split(‘;’) # 分割
list1 = []
for str2 in ipc_split: # 展開し、クラスに修正
str2 = str2[0:3]
list1.append(str2)
class_list.append(list1)
print(‘class_list[0:3]=’,class_list[0:3])
# [[]]を[]に変換
list2 = []
for str1 in class_list:
list2=list2 + str1
# IPC別に集計
ct_ipc = collections.Counter(list2)
ipc_n = list(ct_ipc.items()) # keyとvalueをリストに格納
ipc_n_list = []
ipc_list = []
for str1 in ipc_n:
str2 = list(str1)
ipc_n_list.append(str2)
class_list.append(str2[0])
# 出現頻度の高い順にソート
ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)
# IPC3桁(クラス)別の集計表(クラス集計表)を作成
ipc_list3 = []
hindo_list3 = []
for n,str1 in enumerate(ipc_n_list):
ipc_list3.append(str1[0])
hindo_list3.append(str1[1])
print(‘クラス数=’,len(ipc_list3))
# DataFrame化
df1 = pd.DataFrame(data=ipc_list3,columns=[‘クラス‘])
df2 = pd.DataFrame(data=hindo_list3,columns=[‘出現頻度‘])
# 集計表にまとめる
df20=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/class_hindo表.csv’,encoding=’utf-8′, index=False)
print(‘class_hindo表.csvを書き出しました‘)
# スクリブト4 コアクラスに1桁コードを付与
## 出現頻度がmin_clst以上のクラスをコアクラスとして1桁コードを付与する。
print(”)
print(‘出力サンプル‘)
# min_clst以上のクラスを読み込み
coreclass_list = []
for n1, nhindo in enumerate(hindo_list3):
if nhindo > min_clst:
bclass = ipc_list3[n1]
coreclass_list.append(bclass)
print(‘コアクラス数=’,len(coreclass_list))
print(‘コアクラス=’,coreclass_list)
# コアクラスに1桁コードを付与
classcode_list = []
n_chr =64
for str1 in coreclass_list:
n_chr = n_chr + 1
str1 = chr(n_chr)
classcode_list.append(str1)
print(‘クラスコード=’,classcode_list)
# クラスデータ読み込み
pat_data2 = pd.read_excel(‘IPC分類表.xlsx’, sheet_name=’クラス表‘)
print(‘クラス数=’,len(pat_data2))
# クラスコード読み込み
cl_data1 = pat_data2.iloc[:,1]
cl_list =[]
for str1 in cl_data1:
cl_list.append(str(str1))
# クラス内容読み込み
cl_data2 = pat_data2.iloc[:,2]
cltxt_list =[]
for str1 in cl_data2:
cltxt_list.append(str(str1))
# コード内容付与
codetxt_list = []
for n,str1 in enumerate(coreclass_list):
# クラス内容付与
if len(str1) == 3:
for n1, str2 in enumerate(cl_list):
if str1 == str2:
str3 = cltxt_list[n1]
break
codetxt_list.append(str3)
print(‘クラス内容[0:2]=’,codetxt_list[0:2])
# DataFrame化
df1 = pd.DataFrame(data=coreclass_list,columns=[‘特許分類‘])
df2 = pd.DataFrame(data=classcode_list,columns=[‘コード‘])
df3 = pd.DataFrame(data=codetxt_list,columns=[‘コード内容‘])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/class_code表.csv’,encoding=’utf-8′, index=False)
print(‘class_code表.csvを書き出しました‘)
# スクリブト5 IPCサブクラス別出現頻度を集計
print(”)
print(‘出力サンプル‘)
# IPC欄読み込み
ipc_data = pat_data.iloc[:,6]
df07 = pd.DataFrame(data=ipc_data)
# 分割してリスト化
ipc_list01 = []
for str1 in ipc_data:
list1_split = str1.split(‘;’) # 「;」で分割
ipc_list01.append(list1_split)
print(‘ipc_list01[0]=’,ipc_list01[0]) # IPCリスト
# 公報データを分割し、サブクラスに修正
subclass_list = []
for str1 in ipc_data:
ipc_split = str1.split(‘;’) # 分割
list1 = []
for str2 in ipc_split: # 展開し、サブクラスに修正
str2 = str2[0:4]
list1.append(str2)
subclass_list.append(list1)
print(‘subclass_list[0:3]=’,subclass_list[0:3])
# [[]]を[]に変換
list2 = []
for str1 in subclass_list:
list2=list2 + str1
# IPC別に集計
ct_ipc = collections.Counter(list2)
ipc_n = list(ct_ipc.items()) # keyとvalueをリストに格納
ipc_n_list = []
ipc_list = []
for str1 in ipc_n:
str2 = list(str1)
ipc_n_list.append(str2)
class_list.append(str2[0])
# 出現頻度の高い順にソート
ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)
# IPC4桁(サブクラス)別の集計表(クラス集計表)を作成
subcl_list4 = []
hindo_list4 = []
for n,str1 in enumerate(ipc_n_list):
subcl_list4.append(str1[0])
hindo_list4.append(str1[1])
print(‘サブクラス数=’,len(subcl_list4))
print(‘サブクラス[0:5]=’,subcl_list4[0:5])
print(‘出現頻度[0:5]=’,hindo_list4[0:5])
# DataFrame化
df1 = pd.DataFrame(data=subcl_list4,columns=[‘サブクラス‘])
df2 = pd.DataFrame(data=hindo_list4,columns=[‘出現頻度‘])
# 集計表にまとめる
df20=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/subclass_hindo表.csv’,encoding=’utf-8′, index=False)
print(‘subclass_hindo表.csvを書き出しました‘)
# min_clst以上のサブクラスをコアサブクラスとして読み込む
coresubclass_list = []
for n1, nhindo in enumerate(hindo_list4):
if nhindo > min_clst:
bclass = subcl_list4[n1]
coresubclass_list.append(bclass)
print(‘コアサブクラス数=’,len(coresubclass_list))
print(‘コアサブクラス=’,coresubclass_list)
# スクリブト6 コアサブクラス毎に3桁コードを付与
## コアクラス毎に出現頻度がmin_clst/2以上のサブクラスを抽出し、コアサブクラスとして3桁コードを付与
## コアサブクラスが無かったコアクラスがあれば、
## 当該コアクラスの代表として上位1個をコアサブクラスとして3桁コードを追加付与する。
print(”)
print(‘出力サンプル‘)
# コアサブクラス毎に3桁コードを付与
coresubclass_list = []
subclasscode_list = []
Z03class_list = []
Z03code_list = []
for n1, str1 in enumerate(coreclass_list): # コアクラス毎に
classcode = classcode_list[n1]
ct01 = 0 # コアクラス毎のコード数カウンタ
# min_clst以上のサブクラス読み込み
ct3 = 0 # コード値のカウンタ
flg = 0
for n2, str2 in enumerate(subcl_list4): # サブクラス読み込み
if str2[0:3] == str1:
if hindo_list4[n2] > min_clst/2: # min_clst/2より多ければ
flg = 1
ct01 = ct01 + 1
# コアサブクラス追加
if str2 not in coresubclass_list:
coresubclass_list.append(str2)
# コード追加
ct3 = ct3 + 1
if ct3 <= 9: ct3_str = ‘0’ + str(ct3)
if ct3 >= 10: ct3_str = str(ct3)
subclass = classcode + ct3_str
if subclass not in subclasscode_list:
subclasscode_list.append(subclass)
# コアサブクラスが無かったコアクラスは、そのサブクラスの上位1個にコード付与
if flg == 0:
flg = 1
ct01 = ct01 + 1
for str3 in subcl_list4:
if str3[0:3] == str1:
str4 = str3
break
print(‘追加コアサブクラス=’,str4)
if str2 not in coresubclass_list:
coresubclass_list.append(str4)
ct3 = ct3 + 1
if ct3 <= 9: ct3_str = ‘0’ + str(ct3)
if ct3 >= 10: ct3_str = str(ct3)
subclass = classcode + ct3_str
if subclass not in subclasscode_list:
subclasscode_list.append(subclass)
print(‘コアサブクラス=’,coresubclass_list)
print(‘サブクラスコード=’,subclasscode_list)
# サブクラスデータ読み込み
pat_data3 = pd.read_excel(‘IPC分類表.xlsx’, sheet_name=’サブクラス表‘)
# print(‘サブクラス数=’,len(pat_data3))
# サブクラスコード読み込み
subc_data01 = pat_data3.iloc[:,1]
subc_list =[]
for str1 in subc_data01:
subc_list.append(str(str1))
# print(‘サブクラス=’,subc_list[0:5])
# サブクラス内容読み込み
subc_data02 = pat_data3.iloc[:,2]
subctxt_list =[]
for str1 in subc_data02:
subctxt_list.append(str(str1))
# print(‘サブクラス内容=’,subctxt_list[0:3])
# コード内容付与
codetxt_list = []
for n,str1 in enumerate(coresubclass_list):
# クラス内容付与
if len(str1) == 4:
for n1, str2 in enumerate(subc_list):
if str1 == str2:
str3 = subctxt_list[n1]
break
codetxt_list.append(str3)
print(‘コード内容[0:2]=’,codetxt_list[0:2])
# DataFrame化
df1 = pd.DataFrame(data=coresubclass_list,columns=[‘特許分類‘])
df2 = pd.DataFrame(data=subclasscode_list,columns=[‘コード‘])
df3 = pd.DataFrame(data=codetxt_list,columns=[‘コード内容‘])
# subclasscode集計表にまとめる
df20=pd.concat([df1, df2, df3], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/subclass_code表.csv’,encoding=’utf-8′, index=False)
print(‘subclass_code表.csvを書き出しました‘)
# スクリブト7 IPC別出現頻度を集計
print(”)
print(‘出力サンプル‘)
# IPC欄読み込み
ipc_data = pat_data.iloc[:,6]
# 分割してリスト化
ipc_list01 = []
for str1 in ipc_data:
list1_split = str1.split(‘;’) # 「;」で分割
ipc_list01.append(list1_split)
# 公報データをIPC別に分割
ipc_list = []
for str1 in ipc_data:
ipc_split = str1.split(‘;’) # 分割
list1 = []
for str2 in ipc_split: # 展開
list1.append(str2)
ipc_list.append(list1)
print(‘IPC_list[0:2]=’,ipc_list[0:2])
# [[]]を[]に変換
list2 = []
for str1 in ipc_list:
list2=list2 + str1
# IPC別に集計
ct_ipc = collections.Counter(list2)
ipc_n = list(ct_ipc.items()) # keyとvalueをリストに格納
ipc_n_list = []
ipc_list = []
for str1 in ipc_n:
str2 = list(str1)
ipc_n_list.append(str2)
class_list.append(str2[0])
# 出現頻度の高い順にソート
ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)
# IPC全桁別の集計表(IPC全桁集計表)を作成
ipc_list4 = []
hindo_list4 = []
for n,str1 in enumerate(ipc_n_list):
ipc_list4.append(str1[0])
hindo_list4.append(str1[1])
print(‘IPC数=’,len(ipc_list4))
# DataFrame化
df1 = pd.DataFrame(data=ipc_list4,columns=[‘IPC’])
df2 = pd.DataFrame(data=hindo_list4,columns=[‘出現頻度‘])
# 集計表にまとめる
df20=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/IPC_hindo表.csv’,encoding=’utf-8′, index=False)
print(‘IPC_hindo表.csvを書き出しました‘)
# スクリブト8 コアIPC毎に4桁コードを付与
## コアサブクラス毎に出現頻度がmin_clst以上のIPCを抽出し、コアIPCとして4桁コードを付与する。
## コアIPCが無かったコアサブクラスがあれば、
## 当該コアクラスの代表として上位1個をコアIPCとして4桁コードを追加付与する。
print(”)
print(‘出力サンプル‘)
# min_clst以上のIPCをコアIPCとして読み込む
coreipc_list = []
for n1, nhindo in enumerate(hindo_list4):
if nhindo > min_clst:
bclass = ipc_list4[n1]
coreipc_list.append(bclass)
print(‘元コアIPC数=’,len(coreipc_list))
print(‘元コアIPC=’,coreipc_list)
# コアIPC毎に4桁コードを付与
coreipc_list01 = []
ipccode_list01 = []
for n1, str1 in enumerate(coresubclass_list): # コアサブクラス毎に
subclasscode = subclasscode_list[n1]
ct01 = 0 # コアクラス毎のコード数カウンタ
n_chr = 64 # コード値の初期化(chr(65)=’A’)
# min_clst以上のコアIPCに4桁コードを付与
ct3 = 0 # コード値のカウンタ
flg = 0
for n2, str2 in enumerate(ipc_list4): # IPC読み込み
if str2[0:4] == str1:
if hindo_list4[n2] > min_clst: # min_clstより多ければ
flg = 1
ct01 = ct01 + 1
coreipc_list01.append(str2)
n_chr = n_chr + 1
str3 = chr(n_chr)
bcode = subclasscode + str3
ipccode_list01.append(bcode)
# コアIPCが無かったコアサブクラスは、その下位IPCの上位2個にコード付与
if flg == 0:
flg = 1
ct01 = ct01 + 1
ipc2_list = []
for str3 in ipc_list4:
if str1 in str3:
ipc2_list.append(str3)
str2 = ipc2_list[0]
if len(ipc2_list) > 1:
bstr2 = ipc2_list[1]
else:
bstr2 = str2
# print(‘追加コアIPC=’,str2)
coreipc_list01.append(str2)
n_chr = n_chr + 1
str4 = chr(n_chr)
bipc = subclasscode + str4
ipccode_list01.append(bipc)
print(‘コアIPC数=’,len(coreipc_list01))
print(‘コアIPC=’,coreipc_list01)
print(‘コアIPCコード=’,ipccode_list01)
# IPC分類表.csv読み込み
pat_data05 = pd.read_csv(‘allIPC分類表.csv’, encoding=’utf-8′)
# IPC読み込み
ipc_data01 = pat_data05.iloc[:,2]
ipc_list01 =[]
for str3 in ipc_data01:
ipc_list01.append(str(str3))
# 分類内容読み込み
ipc_data2 = pat_data05.iloc[:,4]
ipctxt_list01 =[]
for str3 in ipc_data2:
ipctxt_list01.append(str(str3))
# コード内容付与/無ければstr1をbstr2に変更
coreipc_list02 = []
ipccode_list02 = []
codetxt_list02 = []
for n1, str1 in enumerate(coreipc_list01):
# コード内容付与
flg = 0
for n2, str2 in enumerate(ipc_list01):
if str1 == str2:
str3 = ipctxt_list01[n2]
coreipc_list02.append(coreipc_list01[n1])
ipccode_list02.append(ipccode_list01[n1])
codetxt_list02.append(str3)
flg = 1
break
if flg == 0: # 無ければstr1をbstr2に変更
for n2, str2 in enumerate(ipc_list01):
if bstr2 == str2:
str3 = ipctxt_list01[n2]
coreipc_list02.append(coreipc_list01[n1])
ipccode_list02.append(ipccode_list01[n1])
codetxt_list02.append(str3)
break
print(‘IPC内容[0:2]=’,codetxt_list02[0:2])
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list02,columns=[‘特許分類‘])
df2 = pd.DataFrame(data=ipccode_list02,columns=[‘コード‘])
df3 = pd.DataFrame(data=codetxt_list02,columns=[‘コード内容‘])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/IPC_code表.csv’,encoding=’utf-8′, index=False)
print(‘IPC_code表.csvを書き出しました‘)
# スクリブト9 コアIPCを含むFIの読み込み
print(”)
print(‘出力サンプル‘)
# csvデータ読み込み
ipc_code01 = pd.read_csv(‘./中間data/IPC_code表.csv’, encoding=’utf-8′)
# コアIPC読み込み
ipc_data = ipc_code01.iloc[:,0]
# リストに変更
ipc_list01 = ipc_data.values
# 読み込むシート名(A~H)を抽出
sheet_name = []
for str1 in ipc_list01:
str2 = str1[0]
sheet_name.append(str2)
sheet_name = list(set(sheet_name)) # 重複を削除
print(‘シート名‘,sheet_name)
# メインコードのipcを含むFIの読み取り
ficode_list =[]
fidot_list = []
fiti_list =[]
for str1 in sheet_name: # # sheet選択
# FIコードと分類内容の読み込み
fi_data = pd.read_excel(‘FI分類表.xlsx’,sheet_name=str1)
for str2 in ipc_list01: # コアIPC読み込み
# FIデータ読み込み
ficode_data = fi_data.iloc[:,1]
fidot_data = fi_data.iloc[:,2]
fiti_data = fi_data.iloc[:,3]
for n,str3 in enumerate(ficode_data):
if str3 == ‘END’: break
# FIのコードとドットとタイトルの読み込み
if ‘,’ in str3:
str4 = str3.split(‘,’)
else:
str4 = str3
if str4[0] == str2:
ficode_list.append(str3) # FIコード
str5 = fidot_data[n]
if str(str5) == ‘nan’: str5 = ‘空白‘
fidot_list.append(str5) # FIドット
str6 = fiti_data[n]
fiti_list.append(str6) # FIタイトル
# メインコードをFI付きに修正
fi_list1 = []
fi_list2 = []
fi_list3 = []
fi_list4 = []
for n1, str1 in enumerate(ipc_list01): # コアIPC
for n2, str2 in enumerate(ficode_list): # FIコード
str3 = str2.split(‘,’)
if str3[0] == str1:
fi_list1.append(str1)
fi_list2.append(str2)
fi_list3.append(fidot_list[n2])
fi_list4.append(fiti_list[n2])
print(‘コアIPC[0:4]=’,fi_list1[0:4])
print(‘FIコード[0:4]=’,fi_list2[0:4])
print(‘FIドット[0:4]=’,fi_list3[0:4])
print(‘FIタイトル[0:4]=’,fi_list4[0:4])
# DataFrame化
df1 = pd.DataFrame(data=fi_list1,columns=[‘コアIPC’])
df2 = pd.DataFrame(data=fi_list2,columns=[‘特許分類‘])
df3 = pd.DataFrame(data=fi_list3,columns=[‘FIドット‘])
df4 = pd.DataFrame(data=fi_list4,columns=[‘コード内容‘])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/FIデータリスト1.csv’,encoding=’utf-8′, index=False)
print(‘FIデータリスト1.csvを書き出しました‘)
# スクリブト10 メイングループに対応するFIグループに階層パターンのパターンコードを付与
## メイングループに対応するFIグループの階層パターンを調べ、タイプコードを付与する
### タイプ0 =(nword1=0,nword3=0,nword4=0) nword1+nword3*2+nword4*4 =0
### タイプ1 =(nword1=1,nword3=0,nword4=0) nword1+nword3*2+nword4*4 =1
### タイプ2 =(nword1=0,nword3=1,nword4=0) nword1+nword3*2+nword4*4 =2
### タイプ3 =(nword1=1,nword3=1,nword4=0) nword1+nword3*2+nword4*4 =3
### タイプ4 =(nword1=0,nword3=0,nword4=1) nword1+nword3*2+nword4*4 =4
### タイプ5 =(nword1=1,nword3=0,nword4=1) nword1+nword3*2+nword4*4 =5
### タイプ6 =(nword1=0,nword3=1,nword4=1) nword1+nword3*2+nword4*4 =6
### タイプ7 =(nword1=1,nword3=1,nword4=1) nword1+nword3*2+nword4*4 =7
print(”)
print(‘出力サンプル‘)
# コアIPC毎に分離
bcode = ”
n0 = len(fi_list1)
bfi_list1 = []
bfi_list2 = []
for n1, str1 in enumerate(fi_list1):
if n1 == 0: bcode = str1
if str1 == bcode:
str1 = fi_list1[n1]
if n1+1< n0:
str11 = fi_list1[n1+1]
str2 = fi_list2[n1]
str3 = fi_list3[n1]
str4 = fi_list4[n1]
bfi_str = str(str1) + ‘;’ + str(str2) + ‘;’ + str(str3) + ‘;’ + str(str4)
bfi_list2.append(bfi_str)
if str11 != bcode: # メインコード毎に分離してリスト化
if n1+1< n0:
bcode = fi_list1[n1+1]
bfi_list1.append(bfi_list2)
bfi_list2 = []
bfi_list1.append(bfi_list2)
print(‘FIデータ数=’,len(bfi_list1),’件‘)
# 階層パターンを調べ、ドットタイプのコードを付与
nword1 = 0
nword3 = 0
nword4 = 0
main1_list = []
type_list = []
dot_list = []
bstr2 = ”
for n0, str1 in enumerate(bfi_list1):
for n1, str2 in enumerate(str1):
split_str2 = str2.split(‘;’)
str21 = split_str2[1]
bdot = split_str2[2]
dot_list.append(bdot)
if n0 == 0:
if n1 == 0:
bstr2 = split_str2[0]
bficode = split_str2[1]
if str2.find(‘,’) > 0: # ‘,’が含まれていれば
split_str21 = str21.split(‘,’)
str22 = split_str21[1] # [,]以下を抽出゜
bcd = str22
if nword1 == 0:
if len(bcd) == 1: nword1 = 1
if nword3 == 0:
if len(bcd) == 3: nword3 = 1
if nword4 == 0:
if len(bcd) == 4: nword4 = 1
# タイプを判別
if split_str2[0] != bstr2:
if nword1+nword3*2+nword4*4 == 0: dottype = 0
if nword1+nword3*2+nword4*4 == 1: dottype = 1
if nword1+nword3*2+nword4*4 == 2: dottype = 2
if nword1+nword3*2+nword4*4 == 3: dottype = 3
if nword1+nword3*2+nword4*4 == 4: dottype = 4
if nword1+nword3*2+nword4*4 == 5: dottype = 5
if nword1+nword3*2+nword4*4 == 6: dottype = 6
if nword1+nword3*2+nword4*4 == 7: dottype = 7
# リストに追加
main1_list.append(bstr2)
type_list.append(dottype)
# 次のstr2処理のために初期化
bstr2 = split_str2[0] # 次str2(メインコード)を比較用に保存
bficode = split_str2[1] # 表示用に保存
# ワード数カウンタを初期化
nword1 = 0
nword3 = 0
nword4 = 0
# 最後のstr2の結果を追加
if nword1+nword3*2+nword4*4 == 1: dottype = 1
if nword1+nword3*2+nword4*4 == 2: dottype = 2
if nword1+nword3*2+nword4*4 == 3: dottype = 3
if nword1+nword3*2+nword4*4 == 4: dottype = 4
if nword1+nword3*2+nword4*4 == 5: dottype = 5
if nword1+nword3*2+nword4*4 == 6: dottype = 6
if nword1+nword3*2+nword4*4 == 7: dottype = 7
main1_list.append(bstr2)
type_list.append(dottype)
print(‘コアIPCt[0:5]=’,main1_list[0:5])
print(‘type_listt[0:5]=’,type_list[0:5])
print(‘ドット項目数=’,len(dot_list))
print(‘現ドットリストt[0:5]=’,dot_list[0:5])
# FIデータリストにドットタイプを追加
type_list01 = []
for n1, str1 in enumerate(fi_list1): # コアIPC
for n2, str2 in enumerate(main1_list):
if str1 == str2:
type_list01.append(type_list[n2])
# DataFrame化
df1 = pd.DataFrame(data=fi_list1,columns=[‘コアIPC’])
df2 = pd.DataFrame(data=fi_list2,columns=[‘特許分類‘])
df3 = pd.DataFrame(data=fi_list3,columns=[‘FIドット‘])
df4 = pd.DataFrame(data=fi_list4,columns=[‘コード内容‘])
df5 = pd.DataFrame(data=type_list01,columns=[‘ドットタイプ‘])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3,df4,df5], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/FIデータリスト2.csv’,encoding=’utf-8′, index=False)
print(‘FIデータリスト2.csvを書き出しました‘)
# スクリブト11 FIグループのタイプに応じてグループ毎のFIドット数を修正
print(”)
print(‘出力サンプル‘)
import re
# csvデータ読み込み
fi_code01 = pd.read_csv(‘./中間data/FIデータリスト2.csv’, encoding=’utf-8′)
print(‘FI=’,len(fi_code01),’件‘)
# コアIPC読み込み
coreipc_data = fi_code01.iloc[:,0]
# リストに変更
coreipc01 = coreipc_data.values
print(‘coreipc01t[0:5]=’,coreipc01[0:5])
# FI読み込み
fi_data = fi_code01.iloc[:,1]
# リストに変更
fi_list01 = fi_data.values
print(‘fi_list01t[0:4]=’,fi_list01[0:4])
# ドット読み込み
dot_data = fi_code01.iloc[:,2]
# リストに変更
dot_list01 = dot_data.values
print(‘dot_list01t[0:10]=’,dot_list01[0:10])
# コード内容読み込み
code_data = fi_code01.iloc[:,3]
# リストに変更
fitxt_list01 = code_data.values
print(‘fitxt_list01t[0:3]=’,fitxt_list01[0:3])
# ドットタイプ読み込み
dottype_data = fi_code01.iloc[:,4]
# リストに変更
type_list01 = dottype_data.values
print(‘type_list01t[0:10]=’,type_list01[0:10])
# FIドット数を修正
new_dot = ”
coreipc_list = []
ficode_list = []
fidot_list = []
fistr_list = []
nall = 0
bipc = ”
ndot01 = 0
for n1,str1 in enumerate(dot_list01):
coreipc = coreipc01[n1]
n_type = type_list01[n1]
if coreipc != bipc: # コアIPCが変われば、修正後ドット数ndot=0とする
ndot = 0 # 修正後トット数を初期化
fidot_list.append(ndot)
coreipc_list.append(coreipc01[n1] )
ficode_list.append(fi_list01[n1] )
fistr_list.append(fitxt_list01[n1])
if str(str1) != ‘空白‘:
basedot = len(str1)
else:
basedot = 0
plusdot = 0 # 加算ドット数を初期化
nbaselen = len(fi_list01[n1]) # 基本桁数
else: # コアIPCが同じならば、
if str(str1) != ‘空白‘:
ndot01 = len(str1)
else:
ndot01 = 0
# ドットタイプにより加算ドット数(plusdot)を変更
if n_type == 1:
if str(str1) == ‘空白‘: plusdot = 0 # 途中で空白になれば初期化
if n_type == 3:
if str(str1) == ‘空白‘:
plusdot = 0 # 途中で空白になれば初期化
if n_type == 6:
if str(str1) == ‘空白‘:
if len(fi_list01[n1]) > len(fi_list01[n1-1]):
plusdot = bndot + 1 # 空白でかつ桁数が増加すれば下位とみなす
if len(fi_list01[n1]) == nbaselen: # 基本桁数に戻ればplusdot=0とする
plusdot = 0
if n_type == 7:
if str(str1) == ‘空白‘:
if len(fi_list01[n1]) > len(fi_list01[n1-1]):
plusdot = bndot + 1 # 空白でかつ桁数が増加すれば下位とみなす
if len(fi_list01[n1]) < len(fi_list01[n1-1]): # 桁数が減少すればplusdot=0とする
plusdot = 0
# 修正後ドット数を計算
ndot = ndot01 – basedot + plusdot # 最初のドット数を差し引き、plusdotを加算
# 書き出しデータを追加
fidot_list.append(ndot) # 修正後ドット数
coreipc_list.append(coreipc01[n1] )
ficode_list.append(fi_list01[n1] )
fistr_list.append(fitxt_list01[n1])
# プログラム制御用の前データを更新
bipc = coreipc # 前行のコアIPC
bndot = ndot01 # 前行のドット数
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list,columns=[‘コアIPC’])
df2 = pd.DataFrame(data=ficode_list,columns=[‘特許分類‘])
df3 = pd.DataFrame(data=fidot_list,columns=[‘FIドット‘])
df4 = pd.DataFrame(data=fistr_list,columns=[‘コード内容‘])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/FIデータリスト3.csv’,encoding=’utf-8′, index=False)
print(‘FIデータリスト3.csvを書き出しました‘)
# スクリブト12 FI別出現頻度を集計
print(”)
print(‘出力サンプル‘)
# 公報csv読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist.csv’, encoding=’utf-8′)
# FI欄読み込み
fi_data = pat_data.iloc[:,7]
# 分割してリスト化
fi_list01 = []
for str1 in ipc_data:
list1_split = str1.split(‘;’) # 「;」で分割
fi_list01.append(list1_split)
print(‘FI_list01[0]=’,fi_list01[0]) # FICリスト
# 公報データをFI別に分割
fi_list = []
for str1 in fi_data:
fi_split = str1.split(‘;’) # 分割
list1 = []
for str2 in fi_split: # 展開
list1.append(str2)
fi_list.append(list1)
print(‘FI_list[0:1]=’,fi_list[0:1])
# [[]]を[]に変換
list2 = []
for str1 in fi_list:
list2=list2 + str1
# FI別に集計
ct_fi = collections.Counter(list2)
fi_n = list(ct_fi.items()) # keyとvalueをリストに格納
fi_n_list = []
fi_list = []
for str1 in fi_n:
str2 = list(str1)
fi_n_list.append(str2)
# 出現頻度の高い順にソート
fi_n_list = sorted(fi_n_list, key=lambda x:x[1], reverse=True)
# FI全桁別の集計表(FI全桁集計表)を作成
fi_list4 = []
hindo_list4 = []
for n,str1 in enumerate(fi_n_list):
fi_list4.append(str1[0])
hindo_list4.append(str1[1])
print(‘頻度集計FI数=’,len(fi_list4))
# DataFrame化
df1 = pd.DataFrame(data=fi_list4,columns=[‘FI’])
df2 = pd.DataFrame(data=hindo_list4,columns=[‘出現頻度‘])
# 集計表にまとめる
df20=pd.concat([df1, df2], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/FI_hindo表.csv’,encoding=’utf-8′, index=False)
print(‘FI_hindo表.csvを書き出しました‘)
# スクリブト13 公報データで少数のFIを削除
print(”)
print(‘出力サンプル‘)
# 公報csv読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist.csv’, encoding=’utf-8′)
# FI01読み込み
fi_data01 = pat_data.iloc[:,7]
fi_list01 =[]
for str1 in fi_data01:
fi_list01.append(str1)
# FIcsv読み込み
fi_data = pd.read_csv(‘./中間data/FIデータリスト3.csv’, encoding=’utf-8′)
# coreIPC読み込み
ipc_data02 = fi_data.iloc[:,0]
coreipc_list02 =[]
for str1 in ipc_data02:
coreipc_list02.append(str1)
print(‘coreipc[0:5]=’,coreipc_list02[0:5])
# FI02読み込み
fi_data02 = fi_data.iloc[:,1]
fi_list02 =[]
for str1 in fi_data02:
fi_list02.append(str1)
print(‘FI[0:4]=’,fi_list02[0:4])
# FIドット読み込み
fi_data02 = fi_data.iloc[:,2]
fidot_list02 =[]
for str1 in fi_data02:
fidot_list02.append(str1)
# FI内容読み込み
fi_data02 = fi_data.iloc[:,3]
fitxt_list02 =[]
for str1 in fi_data02:
fitxt_list02.append(str1)
# FI出現頻度読み込み
fi_data = pd.read_csv(‘./中間data/FI_hindo表.csv’, encoding=’utf-8′)
# FI読み込み
fi_data03 = fi_data.iloc[:,0]
fi_list03 =[]
for str1 in fi_data03:
fi_list03.append(str1)
# FI数読み込み
nfi_data03 = fi_data.iloc[:,1]
nfi_list03 =[]
for str1 in nfi_data03:
nfi_list03.append(str1)
# 少数のFIを削除(min_clst/10)/ただしドット数が0は残す
coreipc_list04 = []
fi_list04 = []
fidot_list04 = []
fitxt_list04 = []
for n1,str1 in enumerate(fi_list02): # FIデータリスト2
flg = 0
for str2 in fi_list01: # new_patlist
if str1 in str2:
for n3,str3 in enumerate(fi_list03): # FI_hindo表
if str1 == str3:
if fidot_list02[n1] == 0:
coreipc_list04.append(coreipc_list02[n1])
fi_list04.append(str1)
fidot_list04.append(fidot_list02[n1])
fitxt_list04.append(fitxt_list02[n1])
flg = 1
else:
if nfi_list03[n3] > min_clst/10:
coreipc_list04.append(coreipc_list02[n1])
fi_list04.append(str1)
fidot_list04.append(fidot_list02[n1])
fitxt_list04.append(fitxt_list02[n1])
flg = 1
break
if flg == 1: break
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list04,columns=[‘コアIPC’])
df2 = pd.DataFrame(data=fi_list04,columns=[‘特許分類‘])
df3 = pd.DataFrame(data=fidot_list04,columns=[‘FIドット数‘])
df4 = pd.DataFrame(data=fitxt_list04,columns=[‘コード内容‘])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
print(‘FIデータ数=’,len(df20))
# CSVとして書き出し
df20.to_csv(‘./中間data/FIデータリスト4.csv’,encoding=’utf-8′, index=False)
print(‘FIデータリスト4.csvを書き出しました‘)
# スクリブト14 FIデータリスト4のドット数を修正
## FIを削除後のドット数の増減が連続するように修正する。
# csvデータ読み込み
fi_code01 = pd.read_csv(‘./中間data/FIデータリスト4.csv’, encoding=’utf-8′)
# コアIPC読み込み
coreipc_data = fi_code01.iloc[:,0]
# リストに変更
coreipc_list01 = coreipc_data.values
print(‘コアIPC[0:5]=’,coreipc_list01[0:5])
# FI読み込み
fi_data = fi_code01.iloc[:,1]
# リストに変更
fi_list01 = fi_data.values
print(‘FI[0:4]=’,fi_list01[0:4])
# FIドット数読み込み
fidot_data = fi_code01.iloc[:,2]
# リストに変更
fidot_list01 = fidot_data.values
print(‘FIドット数[0:5]=’,fidot_list01[0:5])
nbasedot = 0
bipc = ”
bfi = ”
bndot = 0
nplus = 0
fidot_list04 =[]
for n1, str1 in enumerate(fi_list01):
str2 = coreipc_list01[n1]
if str2 != bipc:
nbasedot = fidot_list01 [n1]
nplus = 0
fidot_list01 [n1] = 0
fidot_list04.append(fidot_list01 [n1])
else:
if len(str1) > len(bfi):
nbasedot = fidot_list01[n1]
fidot_list01 [n1] = fidot_list01[n1] – nbasedot
fidot_list04.append(fidot_list01 [n1])
else:
if fidot_list01[n1] > nbasedot:
fidot_list01 [n1] = fidot_list01[n1] – nbasedot
else:
fidot_list01 [n1] = 0
fidot_list04.append(fidot_list01 [n1])
bipc = coreipc_list01[n1]
bfi = str1
bndot = fidot_list01[n1]
# DataFrame化
df1 = pd.DataFrame(data=coreipc_list04,columns=[‘コアIPC’])
df2 = pd.DataFrame(data=fi_list04,columns=[‘特許分類‘])
df3 = pd.DataFrame(data=fidot_list04,columns=[‘FIドット数‘])
df4 = pd.DataFrame(data=fitxt_list04,columns=[‘コード内容‘])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/FIデータリスト4_2.csv’,encoding=’utf-8′, index=False)
print(‘FIデータリスト4_2.csvを書き出しました‘)
# スクリブト15 コアIPCの下位にFIをコード化して追加
## IPC_code表とFIデータリストを結合し、newIPC_code表を作成する。
print(”)
print(‘出力サンプル‘)
# csvデータ読み込み
ipc_code01 = pd.read_csv(‘./中間data/IPC_code表.csv’, encoding=’utf-8′)
print(‘コアIPC=’,len(ipc_code01),’件‘)
# csvデータ読み込み
fi_code01 = pd.read_csv(‘./中間data/FIデータリスト4_2.csv’, encoding=’utf-8′)
print(‘FIデータ=’,len(fi_code01),’件‘)
# FI読み込み
coreipc_data = fi_code01.iloc[:,0]
# リストに変更
coreipc_list01 = coreipc_data.values
print(‘コアIPC[0:5]=’,coreipc_list01[0:5])
# FI読み込み
fi_data = fi_code01.iloc[:,1]
# リストに変更
fi_list01 = fi_data.values
print(‘FI[0:4]=’,fi_list01[0:4])
# FIドット数読み込み
fidot_data = fi_code01.iloc[:,2]
# リストに変更
fidot_list01 = fidot_data.values
print(‘FIドット数[0:5]=’,fidot_list01[0:5])
# FI分類を階層コード化
bipc = ”
ndot = 0
bndot = 0
ct01 = 0 # 5-6桁(00-99)
ct02 = 64 # 7桁(A-Z) chr(65)=’A’
ct03 = 0 # 8-9桁(00-99)
# n_chr = 64
coreipc_list = []
ficode_list = []
bad_list = []
for n1, str1 in enumerate(fi_list01):
ndot = fidot_list01[n1]
str2 = coreipc_list01[n1]
if str2 != bipc:
ct01 = 0 # 5-6桁(00-99)
ct02 = 64 # 7桁(A-Z) chr(65)=’A’
ct03 = 0 # 8-9桁(00-99)
# ndot=0ならばct01(00-99)でコード化
if ndot == 0:
if ct01 == 0:
nstr = ’01’
ficode_list.append(nstr)
coreipc_list.append(str1)
ct01 = ct01 + 1
else:
# ndot=0ならばct01(00-99)でコード化
if ndot== 0:
if bndot > ndot:
ct02 = 64
ct03 = 0
ct01 = ct01 + 1
if ct01 <= 9:
nstr = ‘0’ + str(ct01)
else:
nstr = str(ct01)
ficode_list.append(nstr)
coreipc_list.append(str1)
# ndot=1になればct02(A-Z)でコード化
if ndot== 1:
if bndot > ndot:
ct03 = 0
ct02 = ct02 + 1
if chr(ct02)== ‘P’:
bad_list.append(str1[0]) # ‘P’になればstr1[0]を追加
bcode = chr(ct02)
ficode_list.append(nstr + bcode)
coreipc_list.append(str1)
# ndot>=2ならばct03(00-99)でコード化
if ndot>= 2:
ct03 = ct03 + 1
if ct03 <= 9:
nstr2 = ‘0’ + str(ct03)
else:
nstr2 = str(ct03)
ficode_list.append(nstr + bcode + nstr2)
coreipc_list.append(str1)
# bipc、bndotを更新
bipc = coreipc_list01[n1]
bndot = ndot
print(‘新coreipc_list[0:3]=’,coreipc_list[0:3]) # FIを追加
print(‘ficode_list[0:5]=’,ficode_list[0:5])
print(‘bad_list[0:5]=’,bad_list[0:5])
# ct02(A-Z)が‘O’を超えている場合は修正
## 最初のコードは‘??A’とし、
## ドットが1以上は??A+00-99に修正
bcode = ”
for str1 in bad_list:
ct03 = 0
for n1, str2 in enumerate(coreipc_list):
if str1 == str2:
ct03 = ct03 + 1
if ct03 <= 9:
nstr2 = ‘0’ + str(ct03)
else:
nstr2 = str(ct03)
## 最初のコードならば‘??A’
if str1 != bcode:
ficode = ficode_list[n1][0:2] + ‘A’
ct03 = 0
# bcodeを更新
bcode = str1
else:
ficode = ficode_list[n1][0:2] + ‘A’ + nstr2
ficode_list[n1] = ficode
print(ficode_list[0:5])
# 書き出すと数値に戻るので先頭に‘X’を追加
ficode_list2 = []
for str1 in ficode_list:
str2 = ‘X’ + str1
ficode_list2.append(str2)
# DataFrame化
# df1 = pd.DataFrame(data=maincode_list,columns=[‘コアIPC’])
# df2 = pd.DataFrame(data=ficode_list,columns=[‘特許分類‘])
df3 = pd.DataFrame(data=ficode_list2,columns=[‘コード‘])
# df4 = pd.DataFrame(data=fistr_list,columns=[‘コード内容‘])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/FIデータリスト5.csv’,encoding=’utf-8′, index=False)
print(‘FIデータリスト5.csvを書き出しました‘)
# スクリブト16 FIデータリストの完全コードに修正
## FIデータリスト3のコードにIPC_コード表の4桁コードを付加する。
print(”)
print(‘出力サンプル‘)
# csvデータ読み込み
ipc_code01 = pd.read_csv(‘./中間data/IPC_code表.csv’, encoding=’utf-8′)
print(‘IPC_code表=’,len(ipc_code01),’件‘)
# コアIPC読み込み
ipc_data = ipc_code01.iloc[:,0]
# リストに変更
ipc_list01 = ipc_data.values
print(‘コアIPC[0:5]=’,ipc_list01[0:5]) # コアIPC
# コアIPCのコード読み込み
ipccode_data = ipc_code01.iloc[:,1]
# リストに変更
ipccode_list01 = ipccode_data.values
print(‘コアIPCのコード[0:5]=’,ipccode_list01[0:5]) # コアIPCのコード
# csvデータ読み込み
fi_code01 = pd.read_csv(‘./中間data/FIデータリスト5.csv’, encoding=’utf-8′)
print(‘FIデータ数=’,len(fi_code01),’件‘)
fi_data01 = fi_code01.iloc[:,0] # コアIPC
fi_data02 = fi_code01.iloc[:,1] # FI
fi_data03 = fi_code01.iloc[:,2] # コード
fi_data04 = fi_code01.iloc[:,3] # コード内容
# FIデータリスト3のコアIPCをリスト化
fi_list01 = fi_data01.values # FIデータリスト3のコアIPCのリスト化
print(‘FI[0:5]=’,fi_list01[0:5])
# FIデータリスト3のコアIPCをリスト化
fi_code01 = fi_data03.values # FIデータリスト3のコードのリスト化
print(‘FI_code[0:5]=’,fi_code01[0:5])
# FIデータリスト3のコアIPC = IPC_code表のコアIPCならば
## FIデータリスト3のコードにIPC_コード表のコードを付加
ficode_list = []
for n1, str1 in enumerate(fi_list01): # FIデータリスト3のコアIPC読み込み
for n2, str2 in enumerate(ipc_list01): # IPC_code表のコアIPC読み込み
if str1== str2:
str3 = fi_code01[n1][1:] # FIデータリスト3のコードを2桁目から読み込み
str4 = ipccode_list01[n2] + str3
ficode_list.append(str4)
break
print(‘ficode_list[0:5]=’,ficode_list[0:5])
# DataFrame化
df1 = pd.DataFrame(data=fi_data01,columns=[‘コアIPC’])
df2 = pd.DataFrame(data=fi_data02,columns=[‘特許分類‘])
df3 = pd.DataFrame(data=ficode_list,columns=[‘コード‘])
df4 = pd.DataFrame(data=fi_data04,columns=[‘コード内容‘])
# FIデータリストを作成
df20=pd.concat([df1, df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/全FIデータリスト.csv’,encoding=’utf-8′, index=False)
print(‘全FIデータリスト.csvを書き出しました‘)
# FIデータリストを作成
df21=pd.concat([df2,df3,df4], axis=1)
# 逆順にソート
df21=df21.sort_values(‘コード‘,ascending=False)
# CSVとして書き出し
df21.to_csv(‘./中間data/FI_code表.csv’,encoding=’utf-8′, index=False)
print(‘FI_code表.csvを書き出しました‘)
# スクリブト17 公報データにコードを付与
## IPC_code、FI_code、nofiIPC_codeによりコード化する。
## 付与されたコードが無ければsubclass_codeによりコード化する。
## 付与されたコードが無ければclass_codeによりコード化する。
print(”)
print(‘出力サンプル‘)
# csv読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist.csv’, encoding=’utf-8′)
# IPC01読み込み
ipc_data01 = pat_data.iloc[:,6]
ipc_list01 =[]
for str1 in ipc_data01:
ipc_list01.append(str1)
# FI01読み込み
fi_data01 = pat_data.iloc[:,7]
fi_list01 =[]
for str1 in fi_data01:
fi_list01.append(str1)
# コード初期化
code_list01 =[]
for str1 in ipc_list01:
str1 = ”
code_list01.append(str1)
# csv読み込み
ficode_data01 = pd.read_csv(‘./中間data/FI_code表.csv’, encoding=’utf-8′)
# FI03読み込み
fi_data03 = ficode_data01.iloc[:,0]
fi_list03 =[]
for str1 in fi_data03:
fi_list03.append(str1)
# code03読み込み
ficode_data03 = ficode_data01.iloc[:,1]
code_list03 =[]
for str1 in ficode_data03:
code_list03.append(str1)
# csv読み込み
ipccode_data01 = pd.read_csv(‘./中間data/IPC_code表.csv’, encoding=’utf-8′)
# IPC02読み込み
ipc_data02 = ipccode_data01.iloc[:,0]
ipc_list02 =[]
for str1 in ipc_data02:
ipc_list02.append(str1)
# code02読み込み
code_data02 = ipccode_data01.iloc[:,1]
code_list02 =[]
for str1 in code_data02:
code_list02.append(str1)
# csv読み込み
subclass_data01 = pd.read_csv(‘./中間data/subclass_code表.csv’, encoding=’utf-8′)
# subclass_code読み込み
subclass_data05 = subclass_data01.iloc[:,0]
subclass_list05 =[]
for str1 in subclass_data05:
subclass_list05.append(str1)
# code05読み込み
subclass_data05 = subclass_data01.iloc[:,1]
code_list05 =[]
for str1 in subclass_data05:
code_list05.append(str1)
# csv読み込み
class_data01 = pd.read_csv(‘./中間data/class_code表.csv’, encoding=’utf-8′)
# class_code読み込み
class_data06 = class_data01.iloc[:,0]
class_list06 =[]
for str1 in class_data06:
class_list06.append(str1)
# code06読み込み
class_data06 = class_data01.iloc[:,1]
code_list06 =[]
for str1 in class_data06:
code_list06.append(str1)
# FI_code表により追記
for n1, str1 in enumerate(fi_list01):
for n2, str2 in enumerate(fi_list03):
if str2 in str1:
str3 = code_list03[n2]
if code_list01[n1] == ”:
code_list01[n1] = str3
else:
code_list01[n1] =code_list01[n1] + ‘;’ + str3
# IPC追記
for n1, str1 in enumerate(ipc_list01):
for n2, str2 in enumerate(ipc_list02):
if str2 in str1:
str3 = code_list02[n2]
if code_list01[n1] == ”:
code_list01[n1] = str3
else:
if str3 not in code_list01[n1]:
code_list01[n1] = code_list01[n1] + ‘;’ + str3
# subclass_code表により追記
for n1, str1 in enumerate(ipc_list01):
for n2, str2 in enumerate(subclass_list05):
str1 = ‘;’ + str1
str2 = ‘;’ + str2
if str2 in str1:
str3 = code_list05[n2]
if code_list01[n1] == ”:
code_list01[n1] = str3
else:
if str3 not in code_list01[n1]:
code_list01[n1] =code_list01[n1] + ‘;’ + str3
# class_code表により追記
for n1, str1 in enumerate(ipc_list01):
for n2, str2 in enumerate(class_list06):
str1 = ‘;’ + str1
str2 = ‘;’ + str2
if str2 in str1:
str3 = code_list06[n2]
if code_list01[n1] == ”:
code_list01[n1] = str3
else:
if str3 not in code_list01[n1]:
code_list01[n1] = code_list01[n1] + ‘;’ + str3
print(‘公報付与コード[0:5]=’,code_list01[0:5])
# DataFrame化
# df01 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])
# df02 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])
# df03 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])
# df04 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])
# df05 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])
# df06 = pd.DataFrame(data=name_list, columns=[‘発明者‘])
# df07 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])
# df08 = pd.DataFrame(data=fi_list02, columns=[‘FI‘])
# df09 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])
# df10 = pd.DataFrame(data=abst_list, columns=[‘要約‘])
df11 = pd.DataFrame(data=code_list01, columns=[‘コード‘])
# 結合
df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df11,df10], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/new_patlist2.csv’,encoding=’utf-8′, index=False)
print(‘new_patlist2.csvを書き出しました‘)
# スクリブト18 コードが無かった公報のIPCの出現頻度を集計
print(”)
print(‘出力サンプル‘)
# csvデータ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist2.csv’, encoding=’utf-8′)
# IPC読み込み
ipc_data01 = pat_data.iloc[:,6] # IPC
ipc_list01 = []
for str1 in ipc_data01:
ipc_list01.append(str1)
# コード化されなかった公報の公報IPCを読み込み
code_data01 = pat_data.iloc[:,9] # コードリスト
nocode_list = [] # コード無しIPC
for n1, str2 in enumerate(code_data01):
if str(str2) == ‘nan’:
str3 = ipc_list01[n1]
split_str3 = str3.split(‘;’)
for str4 in split_str3:
nocode_list.append(str4)
# IPC別に集計
ct_ipc = collections.Counter(nocode_list)
ipc_n = list(ct_ipc.items()) # keyとvalueをリストに格納
ipc_n_list = []
ipc_list = []
for str1 in ipc_n:
str2 = list(str1)
ipc_n_list.append(str2)
# 出現頻度の高い順にソート
ipc_n_list = sorted(ipc_n_list, key=lambda x:x[1], reverse=True)
# コード無しIPCの集計表作成
nocode_list = []
n_list = []
for n,str1 in enumerate(ipc_n_list):
nocode_list.append(str1[0])
n_list.append(str1[1])
print(‘コード無しIPC[0:5]=’,nocode_list[0:5])
print(‘出現頻度[0:5]=’,n_list[0:5])
# スクリブト19 コードZを追記
print(”)
print(‘出力サンプル‘)
# csvデータ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist2.csv’, encoding=’utf-8′)
# IPC読み込み
ipc_data01 = pat_data.iloc[:,6] # IPC
ipc_list01 = []
for str1 in ipc_data01:
ipc_list01.append(str1)
print(‘公報IPC[0:1]=’,ipc_list01[0:1])
# コード読み込み
code_data01 = pat_data.iloc[:,9] # コード
code_list01 = []
for str1 in code_data01:
code_list01.append(str1)
print(‘コード[0:3]=’,code_list01[0:3])
sonota_ipc = []
sonota_code = []
for n1, str1 in enumerate(nocode_list):
if n1 <= 4:
sonota_ipc.append(str1)
str2 = ‘Z’ + ‘0’ + str(n1+1)
sonota_code.append(str2)
if n1 > 4:
sonota_ipc.append(‘その他‘)
str3 = ‘Z99’
sonota_code.append(str3)
break
print(‘その他のコード=’,sonota_code)
print(‘その他のIPC=’,sonota_ipc)
# コードZ(その他)を追記
for n1, str2 in enumerate(code_list01):
if str(str2) == ‘nan’:
for n2, str3 in enumerate(sonota_ipc):
if str3 in ipc_list01[n1]:
code_list01[n1] = sonota_code[n2]
if str3 == ‘その他‘:
if str(code_list01[n1]) == ‘nan’:
code_list01[n1] = sonota_code[n2]
# DataFrame化
# df01 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])
# df02 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])
# df03 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])
# df04 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])
# df05 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])
# df06 = pd.DataFrame(data=name_list, columns=[‘発明者‘])
# df07 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])
# df08 = pd.DataFrame(data=fi_list02, columns=[‘FI‘])
# df09 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])
# df10 = pd.DataFrame(data=abst_list, columns=[‘要約‘])
df11 = pd.DataFrame(data=code_list01, columns=[‘コード‘])
# 結合
df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df11,df10], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/new_patlist3.csv’,encoding=’utf-8′, index=False) # コード付き母集合
print(‘(コード付き母集合)new_patlist3.csvを書き出しました‘)
# スクリブト20 その他のコード(Z)のコード表を作成
print(”)
print(‘出力サンプル‘)
sonota_ipc = []
sonota_code = []
for n1, str1 in enumerate(nocode_list):
if n1 <= 4:
sonota_ipc.append(str1)
str2 = ‘Z’ + ‘0’ + str(n1+1)
sonota_code.append(str2)
if n1 > 4:
sonota_ipc.append(‘その他‘)
str3 = ‘Z99’
sonota_code.append(str3)
break
print(‘その他のコード=’,sonota_code)
print(‘その他のIPC=’,sonota_ipc)
# IPC分類表.csv読み込み
pat_data05 = pd.read_csv(‘allIPC分類表.csv’, encoding=’utf-8′)
# print(‘IPC数=’,len(pat_data05))
# IPC読み込み
ipc_data01 = pat_data05.iloc[:,2]
ipc_list01 =[]
for str3 in ipc_data01:
ipc_list01.append(str(str3))
print(‘IPC[0:3]=’,ipc_list01[0:3])
# 分類内容読み込み
ipc_data2 = pat_data05.iloc[:,4]
ipctxt_list =[]
for str3 in ipc_data2:
ipctxt_list.append(str(str3))
print(‘IPC内容[0:3]=’,ipctxt_list[0:3])
# コード内容を追加
sonota_ipc_list02= []
sonota_code02 =[]
sonota_txt_list02= []
for n1, str1 in enumerate(sonota_ipc):
for n2, str2 in enumerate(ipc_list01):
if str1 == str2:
sonota_ipc_list02.append(str1)
sonota_code02.append(sonota_code[n1])
sonota_txt_list02.append(ipctxt_list[n2])
if str1 == ‘その他‘:
sonota_ipc_list02.append(str1)
sonota_code02.append(sonota_code[n1])
sonota_txt_list02.append(‘その他‘)
break
# コードZのコード表作成
# DataFrame化
df1 = pd.DataFrame(data=sonota_ipc_list02,columns=[‘特許分類‘])
df2 = pd.DataFrame(data=sonota_code02,columns=[‘コード‘])
df3 = pd.DataFrame(data=sonota_txt_list02,columns=[‘コード内容‘])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3], axis=1)
# 書き出し
df20.to_csv(‘./中間data/Z_code表.csv’,encoding=’utf-8′, index=False)
print(‘Z_code表.csvを書き出しました‘)
# スクリブト19-2 コードZの件数を集計
print(”)
print(‘出力サンプル‘)
# csvデータ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist3.csv’, encoding=’utf-8′)
nkoho = len(pat_data)
print(‘公報件数=’,nkoho)
# コード読み込み
code_data99 = pat_data.iloc[:,9] # コード
code_list99 = []
nz99 = 0
for str1 in code_data99:
if ‘Z99’ in str1: nz99 = nz99 + 1
code_list99.append(str1)
print(‘コード[0:3]=’,code_list99[0:3])
print(‘Z99の件数=’,nz99)
# IPC読み込み
ipc_data99 = pat_data.iloc[:,6] # IPC
ipc_list99 = []
for str1 in ipc_data99:
ipc_list99.append(str1)
print(‘公報IPC[0:1]=’,ipc_list99[0:1])
# Z99が多過ぎる場合はIPCのセクション別にコード化
if (nz99 / nkoho) * 100 > 10:
npz99 = (nz99 / nkoho) * 100
print(npz99)
nza = 0
nzb = 0
nzc = 0
nzd = 0
nze = 0
nzf = 0
nzg = 0
nzh = 0
cd99_list = []
for n1, str1 in enumerate(ipc_list99):
bcode_list = code_list99[n1]
if ‘Z99’ in code_list99[n1]:
str2 = str1.split(‘;’)
bcd = ”
for str3 in str2:
if str3[0] == ‘A’:
if ‘Z99A’ not in bcd:
bcd = bcd + ‘;Z99A’
nza = nza + 1
if str3[0] == ‘B’:
if ‘Z99B’ not in bcd:
bcd = bcd + ‘;Z99B’
nzb = nzb + 1
if str3[0] == ‘C’:
if ‘Z99C’ not in bcd:
bcd = bcd + ‘;Z99C’
nzc = nzc + 1
if str3[0] == ‘D’:
if ‘Z99D’ not in bcd:
bcd = bcd + ‘;Z99D’
nzd = nzd + 1
if str3[0] == ‘E’:
if ‘Z99E’ not in bcd:
bcd = bcd + ‘;Z99E’
nze = nze + 1
if str3[0] == ‘F’:
if ‘Z99F’ not in bcd:
bcd = bcd + ‘;Z99F’
nzf = nzf + 1
if str3[0] == ‘G’:
if ‘Z99G’ not in bcd:
bcd = bcd + ‘;Z99G’
nzg = nzg + 1
if str3[0] == ‘H’:
# print(str3[0])
if ‘Z99H’ not in bcd:
bcd = bcd + ‘;Z99H’
nzh = nzh + 1
# print(bcd)
# print(bcd)
bcode_list = bcd
# print(bcode_list)
if bcode_list != ”:
if bcode_list[0] == ‘;’: bcode_list = bcode_list[1:]
# print(n1,bcode_list)
# print(n1, code_list99[n1])
# print(n1,bcode_list, ‘=’,str1)
cd99_list.append(bcode_list)
print(‘Z99A=’,nza,’Z99B=’,nzb,’Z99C=’,nzc,’Z99D=’,nzd,’Z99E=’,nze,’Z99F’,nzf,’Z99G=’,nzg,’Z99H=’,nzh)
print(len(cd99_list), cd99_list[0:5])
# コード修正
# DataFrame化
# df01 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])
# df02 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])
# df03 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])
# df04 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])
# df05 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])
# df06 = pd.DataFrame(data=name_list, columns=[‘発明者‘])
# df07 = pd.DataFrame(data=ipc_list02, columns=[‘IPC‘])
# df08 = pd.DataFrame(data=fi_list02, columns=[‘FI‘])
# df09 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])
# df10 = pd.DataFrame(data=abst_list, columns=[‘要約‘])
df11 = pd.DataFrame(data=cd99_list, columns=[‘コード‘])
# 結合
df20=pd.concat([df01, df02, df03, df04, df05, df06, df07, df08, df09, df11,df10], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/new_patlist3.csv’,encoding=’utf-8′, index=False) # コード付き母集合
print(‘(コード付き母集合)new_patlist3.csvを修正しました‘)
# Z_code表にコード追加
code_data = pd.read_csv(‘./中間data/Z_code表.csv’, encoding=’utf-8′)
# Zコード読み込み
zcode_data0 = code_data.iloc[:,0] # 特許分類
zcode_data1 = code_data.iloc[:,1]
zcode_data2 = code_data.iloc[:,2]
zcode_list0 = []
for str1 in zcode_data0:
zcode_list0.append(str1)
zcode_list1 = []
for str1 in zcode_data1:
zcode_list1.append(str1)
zcode_list2 = []
for str1 in zcode_data2:
zcode_list2.append(str1)
# Z99コード追加
zcode_list0.append(‘A’)
zcode_list1.append(‘Z99A’)
zcode_list2.append(‘その他の生活必需品‘)
zcode_list0.append(‘B’)
zcode_list1.append(‘Z99B’)
zcode_list2.append(‘その他の処理操作;運輸‘)
zcode_list0.append(‘C’)
zcode_list1.append(‘Z99C’)
zcode_list2.append(‘その他の化学;冶金‘)
zcode_list0.append(‘D’)
zcode_list1.append(‘Z99D’)
zcode_list2.append(‘その他の繊維;紙‘)
zcode_list0.append(‘E’)
zcode_list1.append(‘Z99E’)
zcode_list2.append(‘その他の固定構造物‘)
zcode_list0.append(‘F’)
zcode_list1.append(‘Z99F’)
zcode_list2.append(‘その他の機械工学;照明;加熱;武器;爆破‘)
zcode_list0.append(‘G’)
zcode_list1.append(‘Z99G’)
zcode_list2.append(‘その他の物理学‘)
zcode_list0.append(‘H’)
zcode_list1.append(‘Z99H’)
zcode_list2.append(‘その他の電気‘)
print(zcode_list0)
print(zcode_list1)
print(zcode_list2)
# コードZのコード表作成
# DataFrame化
df1 = pd.DataFrame(data=zcode_list0,columns=[‘特許分類‘])
df2 = pd.DataFrame(data=zcode_list1,columns=[‘コード‘])
df3 = pd.DataFrame(data=zcode_list2,columns=[‘コード内容‘])
# 集計表にまとめる
df20=pd.concat([df1, df2, df3], axis=1)
# 書き出し
df20.to_csv(‘./中間data/Z_code表.csv’,encoding=’utf-8′, index=False)
print(‘Z_code表.csvを書き出しました‘)
# スクリブト21 全てのコード表を結合
## クラスからIPC全桁までのコード表を結合する。
print(”)
print(‘出力サンプル‘)
# csvデータ読み込み
ipc_code01 = pd.read_csv(‘./中間data/class_code表.csv’, encoding=’utf-8′)
df1 = pd.DataFrame(data=ipc_code01)
ipc_code02 = pd.read_csv(‘./中間data/subclass_code表.csv’, encoding=’utf-8′)
df2 = pd.DataFrame(data=ipc_code02)
ipc_code03 = pd.read_csv(‘./中間data/IPC_code表.csv’, encoding=’utf-8′)
df3 = pd.DataFrame(data=ipc_code03)
ipc_code04 = pd.read_csv(‘./中間data/FI_code表.csv’, encoding=’utf-8′)
df4 = pd.DataFrame(data=ipc_code04)
ipc_code05 = pd.read_csv(‘./中間data/Z_code表.csv’, encoding=’utf-8′)
df5 = pd.DataFrame(data=ipc_code05)
# データリストを作成
df20=pd.concat([df1,df2,df3,df4,df5], axis=0)
# ソート
df20 = df20.sort_values(‘コード‘, ascending=True) # 昇順
# DataFrame化
ipc_data = df20.iloc[:,0]
df1 = pd.DataFrame(data=ipc_data, columns=[‘特許分類‘])
code_data = df20.iloc[:,1]
df2 = pd.DataFrame(data=code_data, columns=[‘コード‘])
txt_data = df20.iloc[:,2]
df3 = pd.DataFrame(data=txt_data, columns=[‘コード内容‘])
# データリストを作成
df20=pd.concat([df1,df2,df3], axis=1)
df20 = df20.dropna(axis=0)
print(‘IPC_code対照表のコード数=’,len(df20))
# CSVとして書き出し
df20.to_csv(‘./中間data/IPC_code対照表.csv’,encoding=’utf-8′, index=False)
print(‘IPC_code対照表.csvを書き出しました‘)
# スクリブト22 トピック分析するコードを抽出
## ここでは、その他とZコードを抽出し、トピック分析している。
print(”)
print(‘出力サンプル‘)
# IPC_code対照表.csvデータ読み込み
ipc_code_data = pd.read_csv(‘./中間data/IPC_code対照表.csv’, encoding=’utf-8′)
print(‘コード件数=’,len(ipc_code_data))
code01_data = ipc_code_data.iloc[:,0] # コード化IPC(G05B13/02・・・)
ipc_list01 =[]
for str1 in code01_data:
ipc_list01.append(str1)
print(‘コード化IPC[0:1]=’,ipc_list01[0:1])
code02_data = ipc_code_data.iloc[:,1] # 階層化コード(A,A01・・・)
code_list01 =[]
for str1 in code02_data:
code_list01.append(str1)
print(‘階層化コード[0:5]=’,code_list01[0:5])
code03_data = ipc_code_data.iloc[:,2] # コード内容(電気式・・・)
txt_list01 =[]
for str1 in code03_data:
txt_list01.append(str1)
print(‘コード内容[0:1]=’,txt_list01[0:1])
# 4桁コードとZコードを抽出
ipc_list02 = []
code_list02 = []
txt_list02 = []
for n1, str1 in enumerate(code_list01):
flg = 0
if len(str1) <= 6:
str2 = txt_list01[n1]
if str2[0:3] == ‘その他‘:
ipc_list02.append(ipc_list01[n1])
code_list02.append(str1)
txt_list02.append(txt_list01[n1])
flg = 1
if flg == 0:
if str1[0:1] == ‘Z’:
ipc_list02.append(ipc_list01[n1])
code_list02.append(str1)
txt_list02.append(txt_list01[n1])
# DataFrame化
df1 = pd.DataFrame(data=ipc_list02, columns=[‘特許分類‘])
df2 = pd.DataFrame(data=code_list02, columns=[‘コード‘])
df3 = pd.DataFrame(data=txt_list02, columns=[‘コード内容‘])
# 結合
df20=pd.concat([df1,df2,df3], axis=1)
print(‘データ件数=’,len(df20))
# コード表書き出し
df20.to_csv(‘./中間data/Z他_code表.csv’,encoding=’utf-8′, index=False)
print(‘Z他_code表.csvを書き出しました‘)
# スクリブト23 コード別に読み込みトピックKWリストを追加
### 読み込むコードはIPC_code表(その他とZコード)
import MeCab
# m = MeCab.Tagger (“-Ochasen”)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
from matplotlib import pyplot as plt
from wordcloud import WordCloud
# MeCabの準備
tagger = MeCab.Tagger()
print(”)
print(‘出力サンプル‘)
# 書き出すワード数を設定
n_top_words = 20
# 出現頻度が1%以下は低すぎるとして対象外とした(min_df=.001)
min_hindo = 0.01
# 出現頻度が50%以上は高すぎる(特徴の無い語句)として対象外とした(max_df=0.5)
max_hindo = 0.5
# 公報データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist3.csv’, encoding=’utf-8′)
print(‘公報件数=’,len(pat_data))
# 公報番号欄読み込み
patno_data = pat_data.iloc[:,0]
pn_list =[]
for str1 in patno_data:
str0 = str1
pn_list.append(str(str0))
# 発明の名称欄読み込み
title_data = pat_data.iloc[:,3]
ti_list = []
for str1 in title_data:
str1 = str(str1)
ti_list.append(str1)
# コード欄読み込み
code_data = pat_data.iloc[:,9]
code_list = []
for str1 in code_data:
str1 = str(str1)
code_list.append(str1)
# 要約欄読み込み
abst_data = pat_data.iloc[:,10] # 分類コード有りの場合
abst_list = []
for str1 in abst_data:
str1 = str(str1)
if len(str1) > 3:
#データ中の空白を削除
str1 = (str1.replace(” “, “”)) # 半角空白を削除
str1 = (str1.replace(“ “, “”)) # 全角空白を削除
str1 = (str1.replace(“,”, “”)) # 「,」を「、」に置換
abst_list.append(str1)
else:
abst_list.append(‘要約無し‘)
# 発明の名称と要約を結合
tiab_list = []
for n, str1 in enumerate(ti_list):
str2 = str1 + ‘ ‘ + abst_list[n]
tiab_list.append(str2)
# 分析対象データ読み込み
code_data01 = pd.read_csv(‘./中間data/Z他_code表.csv’, encoding=’utf-8′)
ipc_data = code_data01.iloc[:,0] # IPC
df1 = pd.DataFrame(ipc_data)
kcode_data = code_data01.iloc[:,1] # コード
df2 = pd.DataFrame(kcode_data)
txt_data = code_data01.iloc[:,2] # コード内容
df3 = pd.DataFrame(txt_data)
# コード化IPC欄読み込み
ipc_list1 = []
for str1 in ipc_data:
str1 = str(str1)
ipc_list1.append(str1)
# コード欄読み込み
kcode_list1 = []
for str1 in kcode_data:
str1 = str(str1)
kcode_list1.append(str1)
alltopic_list = []
# コード別に読み込みトピックKWリストを書き出し
for n1, str1 in enumerate(kcode_list1):
print(‘コード=’,str1)
# 指定コードに対するtiabデータを読み込み
code_tiab_list = []
code_pn_list = []
for n2, str2 in enumerate(code_list):
if str1 in str2: # 公報データのコード中に階層化コードが含まれていれば
code_pn_list.append(pn_list[n2])
code_tiab_list.append(tiab_list[n2])
if len(code_tiab_list) == 0:
print(‘このコードの対象公報は有りません‘)
print(‘ ‘)
# topic_listをリスト化
topic_list = [‘ ‘]
alltopic_list.append(topic_list)
else:
# テキスト読み込み
source_text = str(code_tiab_list)
# 英数字、記号を除去
source_text = re.sub(r”[a-z]”, “”, source_text) #半角小文字
source_text = re.sub(r”[a–z]”, “”, source_text) #全角小文字
source_text = re.sub(r”[A-Z]”, “”, source_text) #半角大文字
source_text = re.sub(r”[A–Z]”, “”, source_text) #全角大文字
source_text = re.sub(r”[0–9]”, “”, source_text) # 半角数字
source_text = re.sub(r”[0-9]”, “”, source_text) # 全角数字
source_text = re.sub(r'[:;/+\.「」]’, ”, source_text) # 記号
source_text =source_text[:-2] # 右端の削除
# 基礎的除去語句を設定
stop_words0 = [‘(57)’,’【要約】‘,’(修正有)‘,’【課題】‘,’【選択図】‘,’本発明‘,’本願‘,’前記‘,’上記‘,
‘場合‘,’当該‘,’発明‘,’もの‘,’こと‘,’及び‘, ‘および‘, ‘用いる‘, ‘なる‘, ‘する‘, ‘れる‘,’られる‘,
‘全て‘,’ため‘,’有する‘, ‘その‘, ‘この‘, ‘有す‘, ‘それら‘, ‘ある‘, ‘いる‘, ‘もつ‘, ‘うち‘, ‘できる‘,
‘せる‘, ‘より‘, ‘/’, ‘備える‘, ‘備えた‘,'()’, ‘ここ‘, ‘よう‘, ‘なる‘,’含む‘,’手段‘]
n0 = (len(stop_words0),’件‘)
# テーマ毎の除去語句を設定
stop_words1 = [‘方法‘,’装置‘,’システム‘,’データ‘,’処理‘]
n1 = (len(stop_words1),’件‘)
# 設定した不要語句を除去
for str1 in stop_words0:
source_text = (source_text.replace(str1, ”))
for str1 in stop_words1:
source_text = (source_text.replace(str1, ”))
# MeCab.Taggerによりnode化(形態素に分割)
node = tagger.parseToNode(source_text)
# 名詞、形容詞だけを取り出す
word_list = []
while node:
word_type = node.feature.split(‘,’)[0]
if word_type == ‘名詞‘: word_list.append(node.surface)
if word_type == ‘形容詞‘: word_list.append(node.surface)
# if word_type == ‘動詞‘: word_list.append(node.surface)
node = node.next
# リストを文字列に変換
word_chain = ‘ ‘.join(word_list)
if len(word_list) > 1:
count = CountVectorizer(min_df=min_hindo, max_df=max_hindo,max_features=5000)
if len(word_list) == 1:
count = CountVectorizer(min_df=0, max_df=1,max_features=5000)
erflg = 0
try:
X = count.fit_transform(word_list)
except ValueError as e:
print(e)
erflg = 1
n_out = 1 # トピック数を指定
# トピック抽出
lda = LatentDirichletAllocation(n_components=n_out,
random_state=100,
learning_method=’batch’)
X_topics = lda.fit_transform(X)
lda.components_.shape
# 出現した単語を取得
feature_names = count.get_feature_names()
# トピックリスト作成
topic_list = []
for topic_idx, topic in enumerate(lda.components_):
# print(“Topic %d:” % (topic_idx + 1))
print(” “.join([feature_names[i]
for i in topic.argsort()\
[:-n_top_words – 1:-1]]))
str1 = “Topic %d,” % (topic_idx + 1)
str2 = “,”.join([feature_names[i]
for i in topic.argsort()\
[:-n_top_words – 1:-1]])
topic_list.append(str2)
print(‘トピックKW=’,topic_list)
# topic_listをリスト化
alltopic_list.append(topic_list)
# ワードクラウド作成
if erflg == 0:
W = WordCloud(width=500, height=400, background_color=’black’, colormap=’Paired_r’,
collocations = False, # 複合語のオプションをオフ
font_path=’/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc’).generate(word_chain)
# プロット
plt.imshow(W)
plt.axis(‘off’)
plt.show()
# DataFrame化
# df1 = pd.DataFrame(data=ipc_data, columns=[‘コード化IPC’])
# df2 = pd.DataFrame(data=kcode_data, columns=[‘階層化コード‘])
# df3 = pd.DataFrame(data=txt_data, columns=[‘コード内容‘])
df4 = pd.DataFrame(data=alltopic_list,columns=[‘トピックKW’])
df20=pd.concat([df1,df2,df3,df4], axis=1)
# CSVとして書き出し
df20.to_csv(‘./中間data/IPC_code表2.csv’,encoding=’utf-8′, index=False)
print(‘IPC_code表2.csvを書き出しました‘)
# スクリブト24 IPC_コード対照表にトピックKWの上位10を追加
print(”)
print(‘出力サンプル‘)
# IPC_code対照表.csvデータ読み込み
ipc_code_data = pd.read_csv(‘./中間data/IPC_code対照表.csv’, encoding=’utf-8′)
print(‘コード件数=’,len(ipc_code_data))
ipc_data01 = ipc_code_data.iloc[:,0] # コード化IPC(ex:G05B13/02・・・)
ipc_list01 =[]
for str1 in ipc_data01:
ipc_list01.append(str1)
print(‘コード化IPC[0:1]=’,ipc_list01[0:1])
code_data01 = ipc_code_data.iloc[:,1] # 階層化コード(ex:A,A01・・・)
code_list01 =[]
for str1 in code_data01:
code_list01.append(str1)
print(‘コード[0:5]=’,code_list01[0:5])
txt_data01 = ipc_code_data.iloc[:,2] # コード内容(ex:電気式・・・)
txt_list01 =[]
for str1 in txt_data01:
txt_list01.append(str1)
print(‘コード内容[0:1]=’,txt_list01[0:1])
# IPC_code対照表.csvデータ読み込み
ipc_code_data = pd.read_csv(‘./中間data/IPC_code表2.csv’, encoding=’utf-8′)
print(‘コード件数=’,len(ipc_code_data))
ipc_data02 = ipc_code_data.iloc[:,0] # コード化IPC(ex:G05B13/02・・・)
ipc_list02 =[]
for str1 in ipc_data02:
ipc_list02.append(str1)
code_data02 = ipc_code_data.iloc[:,1] # コード(A,A01・・・)
code_list02 =[]
for str1 in code_data02:
code_list02.append(str1)
txt_data02 = ipc_code_data.iloc[:,3] # トピックKW
txt_list02 =[]
for str1 in txt_data02:
txt_list02.append(str1)
print(‘トピックKW[0:1]=’,txt_list02[0:1])
# トピックKWを追加
for n1, str1 in enumerate(code_list01):
flg = 0
for n2, str2 in enumerate(code_list02):
if str1 == str2:
str3 = txt_list02[n2]
str3 = str3.split(‘,’)
str4 = ”
for str5 in str3[0:10]:
if str4 == ”:
str4 = str5
else:
str4 = str4 + ‘+’ + str5
txt_list01[n1] = txt_list01[n1] + ‘+KW=’ + str4
# コードZを追加
ipc_list01.append(‘その他‘)
code_list01.append(‘Z’)
txt_list01.append(‘その他‘)
# DataFrame化
df1 = pd.DataFrame(data=ipc_list01, columns=[‘特許分類‘])
df2 = pd.DataFrame(data=code_list01, columns=[‘コード‘])
df3 = pd.DataFrame(data=txt_list01, columns=[‘コード内容‘])
# 結合
df20=pd.concat([df1,df2,df3], axis=1)
print(‘データ件数=’,len(df20))
# ソート
df20=df20.sort_values(‘コード‘)
# コード表書き出し
df20.to_csv(‘./中間data/コード_コード内容対照表.csv’,encoding=’utf-8′, index=False)
print(‘コード_コード内容対照表.csvを書き出しました‘)
# スクリブト25 不要語句を消去
print(”)
print(‘出力サンプル‘)
# IPC_code対照表.csvデータ読み込み
ipc_code_data = pd.read_csv(‘./中間data/コード_コード内容対照表.csv’, encoding=’utf-8′)
print(‘コード件数=’,len(ipc_code_data))
ipc_data01 = ipc_code_data.iloc[:,0] # コード化IPC(G05B13/02・・・)
ipc_list01 =[]
for str1 in ipc_data01:
ipc_list01.append(str1)
code_data01 = ipc_code_data.iloc[:,1] # 階層化コード(A,A01・・・)
code_list01 =[]
for str1 in code_data01:
code_list01.append(str1)
print(‘階層化コード[0:5]=’,code_list01[0:5])
txt_data01 = ipc_code_data.iloc[:,2] # コード内容(電気式・・・)
txt_list01 =[]
for str1 in txt_data01:
txt_list01.append(str1)
txt_list03 = []
for str1 in txt_list01: # 不要語句を消去
if ‘このサブクラスの他のグループに分類されない主題事項‘ in str1:
str1 = str1.replace(‘このサブクラスの他のグループに分類されない主題事項‘,’その他の主題‘)
if ‘このサブグループに記述され,かつ‘ in str1: str1 = str1.replace(‘あるいはこのサブグループに記述され,かつ‘,”)
if ‘このサブクラスの他のグループの,‘ in str1: str1 = str1.replace(‘このサブクラスの他のグループの,‘,”)
if ‘あるいは共通技術‘ in str1: str1 = str1.replace(‘あるいは共通技術‘,”)
if ‘することによるもの‘ in str1: str1 = str1.replace(‘することによるもの‘,”)
if ‘するためのもの‘ in str1: str1 = str1.replace(‘するためのもの‘,”)
if ‘のための方法または装置‘ in str1: str1 = str1.replace(‘のための方法または装置‘,”)
if ‘の使用を伴うもの‘ in str1: str1 = str1.replace(‘の使用を伴うもの‘,”)
if ‘に特に適合したもの‘ in str1: str1 = str1.replace(‘に特に適合したもの‘,”)
if ‘に特に適合するもの‘ in str1: str1 = str1.replace(‘に特に適合するもの‘,”)
if ‘に特徴があるもの‘ in str1: str1 = str1.replace(‘に特徴があるもの‘,”)
if ‘を利用したもの‘ in str1: str1 = str1.replace(‘を利用したもの‘,”)
if ‘を用いること‘ in str1: str1 = str1.replace(‘を用いること‘,”)
if ‘を行なうもの‘ in str1: str1 = str1.replace(‘を行なうもの‘,”)
if ‘を用いるもの‘ in str1: str1 = str1.replace(‘を用いるもの‘,’を使用‘)
if ‘を用いたもの‘ in str1: str1 = str1.replace(‘を用いたもの‘,’を使用‘)
if ‘を使用するもの‘ in str1: str1 = str1.replace(‘を使用するもの‘,’を使用‘)
if ‘を伴うもの‘ in str1: str1 = str1.replace(‘を伴うもの‘,”)
if ‘に関するもの‘ in str1: str1 = str1.replace(‘に関するもの‘,”)
if ‘を有するもの‘ in str1: str1 = str1.replace(‘を有するもの‘,”)
if ‘を使用するもの‘ in str1: str1 = str1.replace(‘を使用するもの‘,”)
if ‘に適合したもの‘ in str1: str1 = str1.replace(‘に適合したもの‘,’に適合‘)
if ‘を行うもの‘ in str1: str1 = str1.replace(‘を行うもの‘,”)
if ‘そのための‘ in str1: str1 = str1.replace(‘そのための‘,”)
if ‘のためのもの‘ in str1: str1 = str1.replace(‘のためのもの‘,”)
if ‘または装置‘ in str1: str1 = str1.replace(‘または装置‘,”)
if ‘によるもの‘ in str1: str1 = str1.replace(‘によるもの‘,”)
if ‘このような‘ in str1: str1 = str1.replace(‘このような‘,”)
if ‘のあるもの‘ in str1: str1 = str1.replace(‘のあるもの‘,”)
if ‘をするもの‘ in str1: str1 = str1.replace(‘をするもの‘,”)
if ‘としたもの‘ in str1: str1 = str1.replace(‘としたもの‘,”)
if ‘をもつもの‘ in str1: str1 = str1.replace(‘をもつもの‘,”)
if ‘を含むもの‘ in str1: str1 = str1.replace(‘を含むもの‘,”)
if ‘のまたは‘ in str1: str1 = str1.replace(‘のまたは‘,’、‘)
#print(str1)
txt_list03.append(str1)
# DataFrame化
df1 = pd.DataFrame(data=ipc_list01, columns=[‘特許分類‘])
df2 = pd.DataFrame(data=code_list01, columns=[‘コード‘])
df3 = pd.DataFrame(data=txt_list03, columns=[‘コード内容‘])
# 結合
df20=pd.concat([df1,df2,df3], axis=1)
# dataframeをarrayに変換
arr1 = df20.values
# 旧データクリア
## ブックを新規作成。これにより旧データがクリア
book = openpyxl.Workbook()
# シートを追加
ws = book.create_sheet(title=’コード対照表‘)
ws = book.create_sheet(title=’一括処理code表‘)
ws = book.create_sheet(title=’年別トピックKW’)
# 不要な「Sheet」を削除
del book[‘Sheet’]
# 保存
book.save(‘./中間data/trans_data01.xlsx’)
# コード表書き出し
df20.to_csv(‘./中間data/コード_コード内容対照表2.csv’,encoding=’utf-8′, index=False)
print(‘コード_コード内容対照表2.csvを書き出しました‘)
# dataframeをarrayに変換
arr1 = df20.values
# Exce(xlsx)に書き出し
# ヘッダ作成
header_list =[[‘特許分類‘,’コード‘,’コード内容‘]]
file_name = ‘./中間data/trans_data01.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘コード対照表‘]
write_list_1d(sheet, header_list, 1, 1) # ヘッダを1行目1列目に書き込み
write_list_1d(sheet, arr1, 2, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
print(‘trans_data01.xlsxのシート「コード対照表」に「コード対照表」を書き出しました‘)
# スクリブト25-1 不足IPCの確認
import sys
import pandas as pd
print(”)
print(‘出力サンプル‘)
# コード内容を修正
# IPC分類表.csv読み込み
pat_data6 = pd.read_csv(‘allIPC分類表.csv’, encoding=’utf-8′)
# IPC読み込み
ipc_data6 = pat_data6.iloc[:,2] # IPC記号
ipcful_list6 = []
for str1 in ipc_data6:
str1 =str(str1)
# if ‘B60L11’ in str1: print(str1)
# str1 = str1.replace(‘ ‘,”)
ipcful_list6.append(str1)
print(ipcful_list6[0:5])
# IPC内容読み込み
txt_data6 = pat_data6.iloc[:,4] # 簡略表記タイトル
txt_list6 = []
for str1 in txt_data6:
txt_list6.append(str1)
print(txt_list6[0:5])
# 対照表読み込み
code_txt_data = pd.read_excel(‘./中間data/trans_data01.xlsx’,sheet_name=’コード対照表‘)
print(‘対照表のコード数=’,len(code_txt_data))
# 対照表のIPC読み込み。読み込み時に「/+」以降を「/」に修正
ipc_data7 = code_txt_data.iloc[:,0] # IPC記号
ipc_list7 = []
for str1 in ipc_data7:
if ‘/+’ in str1:
npos = str1.find(‘/+’)
str1= str1[0: npos +1]
str1 =str(str1)
if ‘B60L11’ in str1: print(str1)
# print(str1)
ipc_list7.append(str1)
print(ipc_list7[0:5])
# 対照表のコード内容読み込み
code_data7 = code_txt_data.iloc[:,1] # コード
code_list7 = []
for str1 in code_data7:
code_list7.append(str1)
print(code_list7[0:5])
# 対照表のコード内容読み込み
text_data7 = code_txt_data.iloc[:,2] # コード内容
text_list7 = []
for str1 in text_data7:
text_list7.append(str1)
print(text_list7[0:5])
# 簡略表記タイトル無しを修正
txt_list = []
flg3 = 0
for n1, str1 in enumerate(ipc_list7):
# print(n1,str1,’=’,code_list7[n1])
flg1 = 0
if str1 == ‘無し‘:
txt_list.append(text_list7[n1])
flg1 =1
if str1 == ‘その他‘:
txt_list.append(text_list7[n1])
flg1 =1
if ‘,’ in str1:
txt_list.append(text_list7[n1])
flg1 =1
if flg1 == 0:
if str1[-1] == ‘/’: # 末尾が ‘;’ならば[00]を付加
str1 = str1 + ’00’
for n2, str2 in enumerate(ipcful_list6):
flg2 = 0
# str2 = str(str2)
if str1 in str2:
str3 = txt_list6[n2]
txt_list.append(str3)
flg2 = 1
break
if flg2 == 0:
print(‘IPC内容不明=’,str1)
flg2 = 1
if flg3 == 1:
sys.exit()
# DataFrame化
df1 = pd.DataFrame(data=ipc_list7, columns=[‘特許分類‘])
df2 = pd.DataFrame(data=code_list7, columns=[‘コード‘])
df3 = pd.DataFrame(data=txt_list, columns=[‘コード内容‘])
# 結合
df4=pd.concat([df1,df2,df3], axis=1)
# コード表書き出し
df4.to_csv(‘./中間data/IPC_code対照表test.csv’,encoding=’utf-8′, index=False)
print(‘IPC_code対照表test.csvを書き出しました‘)
# スクリブト26 一括処理用のコード表を作成
print(”)
print(‘出力サンプル‘)
# 対照表読み込み
code_txt__data = pd.read_csv(‘./中間data/コード_コード内容対照表.csv’, encoding=’utf-8′)
print(‘対照表のコード数=’,len(code_txt__data))
# コード読み込み
code_data01 = code_txt__data.iloc[:,1] # コード( A.A01,A01A・・・)
code_list01 = []
for str1 in code_data01:
code_list01.append(str1)
print(‘コード[0:5]=’,code_list01[0:5])
# コード内容読み込み
txt_data01 = code_txt__data.iloc[:,2] # コード内容( 計算;計数・・)
txt_list01 = []
for str1 in txt_data01:
txt_list01.append(str1)
print(‘コード内容[0:3]=’,txt_list01[0:3])
A_list = []
bcode = ‘A’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
A_list.append(btxt)
if str1[0] == bcode:
A_list.append(str1)
print(‘A_list[0:5]=’,A_list[0:5])
B_list = []
bcode = ‘B’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
B_list.append(btxt)
if str1[0] == bcode:
B_list.append(str1)
print(‘B_list[0:5]=’,B_list[0:5])
C_list = []
bcode = ‘C’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
C_list.append(btxt)
if str1[0] == bcode:
C_list.append(str1)
print(‘C_list[0:5]=’,C_list[0:5])
D_list = []
bcode = ‘D’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
D_list.append(btxt)
if str1[0] == bcode:
D_list.append(str1)
print(‘D_list[0:5]=’,D_list[0:5])
E_list = []
bcode = ‘E’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
E_list.append(btxt)
if str1[0] == bcode:
E_list.append(str1)
print(‘E_list[0:5]=’,E_list[0:5])
F_list = []
bcode = ‘F’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
F_list.append(btxt)
if str1[0] == bcode:
F_list.append(str1)
print(‘F_list[0:5]=’,F_list[0:5])
G_list = []
bcode = ‘G’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
G_list.append(btxt)
if str1[0] == bcode:
G_list.append(str1)
print(‘G_list[0:5]=’,G_list[0:5])
H_list = []
bcode = ‘H’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
H_list.append(btxt)
if str1[0] == bcode:
H_list.append(str1)
print(‘H_list[0:5]=’,H_list[0:5])
I_list = []
bcode = ‘I’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
I_list.append(btxt)
if str1[0] == bcode:
I_list.append(str1)
print(‘I_list[0:5]=’,I_list[0:5])
J_list = []
bcode = ‘J’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
J_list.append(btxt)
if str1[0] == bcode:
J_list.append(str1)
print(‘J_list[0:5]=’,J_list[0:5])
K_list = []
bcode = ‘K’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
K_list.append(btxt)
if str1[0] == bcode:
K_list.append(str1)
print(‘K_list[0:5]=’,K_list[0:5])
L_list = []
bcode = ‘L’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
L_list.append(btxt)
if str1[0] == bcode:
L_list.append(str1)
print(‘L_list[0:5]=’,L_list[0:5])
M_list = []
bcode = ‘M’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
M_list.append(btxt)
if str1[0] == bcode:
M_list.append(str1)
print(‘M_list[0:5]=’,M_list[0:5])
N_list = []
bcode = ‘N’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
N_list.append(btxt)
if str1[0] == bcode:
N_list.append(str1)
print(‘N_list[0:5]=’,N_list[0:5])
O_list = []
bcode = ‘O’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
O_list.append(btxt)
if str1[0] == bcode:
O_list.append(str1)
print(‘O_list[0:5]=’,O_list[0:5])
P_list = []
bcode = ‘P’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
P_list.append(btxt)
if str1[0] == bcode:
P_list.append(str1)
print(‘P_list[0:5]=’,P_list[0:5])
Q_list = []
bcode = ‘Q’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
Q_list.append(btxt)
if str1[0] == bcode:
Q_list.append(str1)
print(‘Q_list[0:5]=’,Q_list[0:5])
R_list = []
bcode = ‘R’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
R_list.append(btxt)
if str1[0] == bcode:
R_list.append(str1)
print(‘R_list[0:5]=’,R_list[0:5])
#1桁コード別に分割し、横に並べた表を作成
Z_list = []
bcode = ‘Z’
ct =0
for n1, str1 in enumerate(code_data01):
if str1 == bcode:
btxt = txt_list01[n1]
Z_list.append(btxt)
if str1[0] == bcode:
Z_list.append(str1)
print(‘Z_list[0:5]=’,Z_list[0:5])
# DataFrame化
df1 = pd.DataFrame(data=Z_list, columns=[‘その他‘])
df2 = pd.DataFrame(data=A_list)
df3 = pd.DataFrame(data=B_list)
df4 = pd.DataFrame(data=C_list)
df5 = pd.DataFrame(data=D_list)
df6 = pd.DataFrame(data=E_list)
df7 = pd.DataFrame(data=F_list)
df8 = pd.DataFrame(data=G_list)
df9 = pd.DataFrame(data=H_list)
df20 = pd.DataFrame(data=I_list)
df21 = pd.DataFrame(data=J_list)
df22 = pd.DataFrame(data=K_list)
df23 = pd.DataFrame(data=L_list)
df24 = pd.DataFrame(data=M_list)
df25 = pd.DataFrame(data=N_list)
df26 = pd.DataFrame(data=O_list)
df27 = pd.DataFrame(data=P_list)
df28 = pd.DataFrame(data=Q_list)
df29 = pd.DataFrame(data=R_list)
# 結合
df30=pd.concat([df2,df3,df4,df5,df6,df7,df8,df9,df20,df21,df22,df23,df24,df25,
df26,df27,df28,df29,df1], axis=1)
print(‘データ件数=’,len(df30))
# コード表書き出し
df30.to_csv(‘./中間data/一括処理コード表.csv’,encoding=’utf-8′, index=False)
print(‘一括処理コード表.csvを書き出しました‘)
# dataframeをarrayに変換
arr1 = df30.values
# Exce(xlsx)に書き出し
file_name = ‘./中間data/trans_data01.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘一括処理code表‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
print(‘trans_data01.xlsxに「一括処理コード表」を書き出しました‘)
# スクリブト27 年別のトピックKWを書き出しは保留(スクリプトは下記に移動)
## トピック数=1とし、高頻度の単語を出力(1トピックX 15word )する。
# 以下は集計処理
## 集計結果はtrans_data.xlsxに書き込み
# スクリプト28 旧データクリアし、Excelに転送するためのtrans_data.xlsxを設定
## 「trans_data.xlsx」を新規作成する(これにより旧データがクリアされる)。
##転送用のシートを追加する。
## テーマ名とコード表をコピーする。
import pandas as pd
import openpyxl
print(”)
print(‘出力サンプル‘)
# ブックを作成
book = openpyxl.Workbook()
# 保存する
book.save(‘trans_data.xlsx’)
# シートを追加
ws = book.create_sheet(title=’テーマ名‘)
ws = book.create_sheet(title=’code表‘)
ws = book.create_sheet(title=’年別発行件数集計‘)
ws = book.create_sheet(title=’出願人別集計‘)
ws = book.create_sheet(title=’出願人数年別集計‘)
ws = book.create_sheet(title=’出願人別年別集計‘)
ws = book.create_sheet(title=’メインG別年別集計‘)
ws = book.create_sheet(title=’新規参入集計‘)
ws = book.create_sheet(title=’全サンプル公報‘)
ws = book.create_sheet(title=’最新サンプル公報‘)
ws = book.create_sheet(title=’コード別年別集計‘)
ws = book.create_sheet(title=’一桁年別集計‘)
ws = book.create_sheet(title=’三桁年別集計‘)
ws = book.create_sheet(title=’四桁年別集計‘)
ws = book.create_sheet(title=’六桁年別集計‘)
ws = book.create_sheet(title=’一桁コード別集計‘)
ws = book.create_sheet(title=’三桁コード別集計‘)
ws = book.create_sheet(title=’四桁コード別集計‘)
ws = book.create_sheet(title=’六桁コード別集計‘)
ws = book.create_sheet(title=’コード表‘)
# 不要な「Sheet」を削除
del book[‘Sheet’]
# 保存する
book.save(‘trans_data.xlsx’)
print(‘trans_data.xlsxをクリアしました‘)
# テーマ名読み込み
thema_data = pd.read_excel(‘テーマ設定data.xlsx’,sheet_name=’テーマ名‘)
thema_data = thema_data.dropna(how=’all’) # 全列がNaNである行を削除
thema01 = thema_data.iloc[:,0]
thema = thema01[0]
print(‘テーマ名=’,thema)
# テーマ名書き込み
book = openpyxl.load_workbook(‘trans_data.xlsx’)
# シートを取得
sheet = book[‘テーマ名‘]
# セルへ書き込む
sheet[‘A1’] = ‘テーマ名‘
sheet[‘A2’] = thema
# 保存する
book.save(‘trans_data.xlsx’)
# コード表をコピー
code_data = pd.read_excel(‘./中間data/trans_data01.xlsx’,sheet_name=’コード対照表‘) # Excel用
code_data = code_data.dropna(how=’all’) # 全列がNaNである行を削除
# 特許分類読み込み
code01 = code_data.iloc[:,0]
code_list01 =[]
for str1 in code01:
code_list01.append(str1)
print(‘コード数=’,len(code_list01))
print(‘特許分類[0:5]=’,code_list01[0:5])
# コード読み込み
code02 = code_data.iloc[:,1]
code_list02 =[]
for str1 in code02:
code_list02.append(str1)
# print(‘コード数=’,len(code_list02))
print(‘コード[0:5]=’,code_list02[0:5])
# コード内容読み込み
code03 = code_data.iloc[:,2]
code_list03 =[]
for str1 in code03:
code_list03.append(str(str1))
print(‘コード内容[0:5]=’,code_list03[0:5])
# DataFrame化
df1 = pd.DataFrame(data=code_list01, columns=[‘特許分類‘])
df2 = pd.DataFrame(data=code_list02, columns=[‘コード‘])
df3 = pd.DataFrame(data=code_list03, columns=[‘コード内容‘])
# 結合
df20=pd.concat([df1,df2,df3], axis=1)
print(‘コード件数=’,len(df20))
# dataframeをarrayに変換
arr1 = df20.values
# Exce(xlsx)に書き出し
# ヘッダ作成
header_list =[[‘特許分類‘,’コード‘,’コード内容‘]]
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘code表‘]
write_list_1d(sheet, header_list, 1, 1) # ヘッダを1行目1列目に書き込み
write_list_1d(sheet, arr1, 2, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
print(‘trans_data.xlsxのシート「code表」に「コード対照表」を書き出しました‘)
# スクリプト29 出願人名称修正
## 異なる表記の出願人名称を統一するために、変換表を使用して出願人名称を修正する。
import datetime
import numpy as np
import pprint
import sys
print(”)
print(‘出力サンプル‘)
# 出願人名称変換表読み込み
apcon_data = pd.read_excel(‘出願人名称変換表.xlsx’,sheet_name=’出願人名称変換表‘)
df0 = apcon_data
# 元の出願人名称読み込み
apname1_data = apcon_data .iloc[:,0]
ap1_list =[]
for str1 in apname1_data:
if type(str1) == str:
ap1_list.append(str(str1))
# 行数を取得
nyap1 = len(ap1_list)
# 変換後の出願人名称読み込み
apname1_data = apcon_data .iloc[:,1]
ap2_list =[]
for n in range(nyap1):
str0 = apname1_data[n]
ap2_list.append(str(str0))
# 行数を取得
nyap2 = len(ap2_list)
# 行数が不一致ならば終了
if nyap1 != nyap2:
print(“出願人名称変換表に空白セルがあるので終了します“)
sys.exit()
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist3.csv’) # コード付き公報データ読み込み
# 出願人名称の読み込み・修正(ap1_list=元、ap2_list=新)
apname_data = pat_data.iloc[:,4]
ap_list = []
for str1 in apname_data:
if type(str1) == str:
str0 = str1
for n,str2 in enumerate(ap1_list):
if str1 == str2:
str0 = str0.replace(ap1_list[n],ap2_list[n]) # 出願人名称変換
ap_list.append(str(str0))
# 行数を取得
nyap = len(ap_list)
# 公報番号読み込み
patno_data = pat_data.iloc[:,0]
pn_list =[]
for n in range(nyap):
str0 = patno_data[n]
pn_list.append(str(str0))
print(‘pn_list[0:1]=’,pn_list[0:1])
# 出願番号読み込み
apno_data = pat_data.iloc[:,1]
an_list =[]
for n in range(nyap):
str0 = apno_data[n]
an_list.append(str(str0))
print(‘an_list[0:1]=’,an_list[0:1])
# 発行日読み込み
pd_data = pat_data.iloc[:,2]
pd_list =[]
for n in range(nyap):
str1= pd_data[n]
str0 = str(str1)[0:10]
pd_list.append(str(str0))
print(‘pd_list[0:1]=’,pd_list[0:1])
# 発明の名称読み込み
title_data = pat_data.iloc[:,3]
ti_list =[]
for n in range(nyap):
str0 = title_data[n]
ti_list.append(str(str0))
print(‘ti_list[0:1]=’,ti_list[0:1])
# 発明者読み込み
name_data = pat_data.iloc[:,5]
name_list =[]
for n in range(nyap):
str0 = name_data[n]
str0 = (str0.replace(“ “, “_”)) # 空白を「_」に置換
name_list.append(str0)
print(‘name_list[0:1]=’,name_list[0:1])
# IPC読み込み
ipc_data = pat_data.iloc[:,6]
ipc_list =[]
for n in range(nyap):
str0 = ipc_data[n]
ipc_list.append(str0)
print(‘ipc_list[0:1]=’,ipc_list[0:1])
# FI読み込み
fi_data = pat_data.iloc[:,7]
fi_list =[]
for n in range(nyap):
str0 = fi_data[n]
str0 = str(str0)
#データ中の空白を削除
str0 = (str0.replace(” “, “”)) # 半角空白を削除
str0 = (str0.replace(“ “, “”)) # 全角空白を削除
fi_list.append(str0)
print(‘fi_list[0:1]=’,fi_list[0:1])
# Fターム読み込み
ft_data = pat_data.iloc[:,8]
ft_list =[]
for n in range(nyap):
str0 = ft_data[n]
str0 = str(str0)
#データ中の空白を削除
str0 = (str0.replace(” “, “”)) # 半角空白を削除
str0 = (str0.replace(“ “, “”)) # 全角空白を削除
ft_list.append(str0)
# print(‘ft_list[0:1]=’,ft_list[0:1])
# 分類コード読み込み
code_data = pat_data.iloc[:,9]
cd_list =[]
for n in range(nyap):
str0 = code_data[n]
str0 = str(str0)
#データ中の空白を削除
str0 = (str0.replace(” “, “”)) # 半角空白を削除
str0 = (str0.replace(“ “, “”)) # 全角空白を削除
cd_list.append(str0)
print(‘cd_list[0:1]=’,cd_list[0:1])
# 要約読み込み
abst_data = pat_data.iloc[:,10]
abst_list =[]
for n in range(nyap):
str0 = abst_data[n]
str0 = str(str0)
#データ中の空白を削除
str0 = (str0.replace(” “, “”)) # 半角空白を削除
str0 = (str0.replace(“ “, “”)) # 全角空白を削除
str0 = (str0.replace(“,”, “”)) # 「,」を「、」に置換
abst_list.append(str0)
print(‘abst_list[0:1]=’,abst_list[0:1])
# DataFrame化
df1 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])
df2 = pd.DataFrame(data=an_list, columns=[‘出願番号‘])
df3 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])
df4 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])
df5 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])
df6 = pd.DataFrame(data=name_list, columns=[‘発明者‘])
df7 = pd.DataFrame(data=ipc_list, columns=[‘IPC‘])
df8 = pd.DataFrame(data=fi_list, columns=[‘FI‘])
df9 = pd.DataFrame(data=ft_list, columns=[‘Fターム‘])
df10 = pd.DataFrame(data=cd_list, columns=[‘分類コード‘])
df11 = pd.DataFrame(data=abst_list, columns=[‘要約‘])
# 結合
df20=pd.concat([df1, df2, df3, df4, df5, df6, df7, df8, df9, df10, df11], axis=1)
print(‘公報件数=’,len(df20))
# CSVとして書き出し
df20.to_csv(‘./中間data/new_patlist4.csv’,encoding=’utf-8′, index=False)
print(‘new_patlist4.csvを書き出しました‘)
# スクリブト30 年別発行件数
## 開始年から終了年までの数値を作成し、文字に変換し、連続する発行年を作成する。
## 連続する発行年毎に発行件数を集計する。
## 集計した発行年と発行件数とを書き出す。
### file_name = ‘patlist16.xlsx’。sheet = wb[‘年別発行件数‘]
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 発行日読み込み
pd_list =[]
for str1 in pd_data:
if “発行” not in str(str1):
str0 = str(str1)[0:10]
pd_list.append(str(str0))
# 最終発行年データ読み取り
max_nengetu = []
for str1 in pd_list:
if ‘/’ in str1:
split_str1 = str1.split(‘/’)
str2 = split_str1[0]
str3 = split_str1[1]
if len(str3) == 1:str3 = ‘0’ + str3
max_nengetu.append(str2 + str3)
if ‘-‘ in str1:
split_str1 = str1.split(‘-‘)
str2 = split_str1[0]
str3 = split_str1[1]
if len(str3) == 1:str3 = ‘0’ + str3
max_nengetu.append(str2 + str3)
# print(max_nengetu[0:5])
#最終月判定
max_nengetu = max(max_nengetu) # maxデータを抽出
monthend = max_nengetu[4:6]
print(‘最終月=’,monthend,’月‘)
# 追加補正係数nmend
npmend=12/int(monthend) – 1
print(‘追加補正係数=’,npmend)
# 開始年と終了年を判定
min_date = min(pd_list) # minデータを抽出
pystt = min_date[0:4] # 前4文字(年データ)読み取り
max_date = max(pd_list) # maxデータを抽出
pyend = max_date[0:4] # 前4文字(年データ)読み取り
print(“開始年=”,pystt, “終了年=”,pyend)
if int(pyend) > 2100:
print(“公報発行年が2100年以降になっています“)
sys.exit()
# 連番作成
year_list = list(range(int(pystt),int(pyend)+1))
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list = []
nen_list = []
for str1 in year_list:
nopy_list.append(str1)
str1 = str(str1) + ‘年‘
nen_list.append(str1)
print(“発行年連番=”, nopy_list,type(nopy_list))
print(“発行年=”, nen_list)
nnen = len(nen_list)
print(“調査年数=”, nnen,’年‘)
# 表の初期化
nx = 1 # 0列と1列の2列を設定
ny = len(nopy_list) # リストの行数を設定
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)] # 初期化
# 縦軸(発行年)設定
for y, str1 in enumerate(nopy_list): # 発行年連番のリストから取り出して表の0列(先頭列)に書き込む
arr1[y][0] = str1
# 発行日欄データを発行年に修正しリスト化
pd_data = pat_data.iloc[:,2] # 発行日欄
py_list01 =[]
for str1 in pd_data:
if “発行” not in str(str1):
nen = str1[0:4]
str0 = str(nen)
py_list01.append(str(str0))
# 年別件数を集計
ntate = len(nopy_list)
for y, str1 in enumerate(py_list01): #
for n in range(ntate):
if arr1[n][0] == int(str1):
arr1[n][1] += 1 # 一致すれば出現回数を加算
# 横ヘッダ追加
# 0行目にコピーを挿入
arr1.insert(0,arr1[0][:])
arr1[0][0] = “発行年“
arr1[0][1] = “発行件数“
# サンプル出力
print(arr1)
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘年別発行件数集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# 棒グラフ作成
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams[‘font.family’] = ‘MS PGothic’
# 発行年別の発行件数を集計
nenlast = nnen
list2 = [] # グラフ用の発行年
list3 = [] # グラフ用の発行件数
list4 = [] # 追加件数
list0 = []
for n1, str1 in enumerate(nopy_list):
if str1!= “発行年“:
nn = py_list01.count(str(str1)) # 発行件数をカウント
list2.append(str1)
list3.append(float(nn)) # グラフ用にfloatに変更
if n1 == nenlast – 1:
nn2 = nn*npmend
nn2 = round(nn2,1)
list4.append(nn2)
list0.append(nn+nn2)
else:
list4.append(0)
list0.append(nn)
print(‘元の件数=’,list3)
print(‘月数補正後の件数=’,list0)
# データ設定
labels = list2
data = list3
data2 = list4
# 表示位置設定
x_width = 0.5
x_loc = np.array(range(len(data))) + x_width
# グラフの大きさを設定
fig = plt.figure(figsize=(13.0, 4.0))
# タイトル、ラベルを設定
plt.title(“公報発行件数の年別推移“, fontsize=20)
plt.xlabel(“発行年“, fontsize=18)
plt.ylabel(“発行件数“, fontsize=18)
plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘) # 棒グラフの設定
if npmend > 0: # 追加補正係数>0ならば予想件数を表示
plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘) # 棒グラフの設定
plt.xticks(x_loc, labels, fontsize=14) # x軸にラベル設定
plt.grid() # 罫線追加
# 追加補正係数>0ならば予想件数を表示
if npmend > 0:
plt.legend()
# 描画実行
plt.show()
# スクリブト31 出願人別発行件数
## 重複を除去した出願人データを作成する。
## 持分を算出し、出願人毎の発行件数を集計する。
## 集計した出願人と発行件数とを書き出す。
### file_name = ‘patlist16.xlsx’。sheet = wb[‘年別発行件数‘]
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 出願人読み込み
apname_data = pat_data.iloc[:,4]
# 全出願人(重複無し)を抽出
list1 =[]
for str1 in apname_data:
ap_list = str1.split(“;”) # 分割
for str2 in ap_list: # 展開
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# arr1の初期化
nx = 1
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)]
# 縦軸書き込み
for y, str1 in enumerate(list1):
arr1[y][0] = str1
# (出願人+持分)リスト作成
ntate = len(list1)
list2 = []
list3 = []
for str1 in apname_data:
nap = str1.count(“;”) + 1
motibun = 1/nap
str2= str1.split(“;”)
for n in range(nap):
list2.append(str2[n])
list3.append(motibun)
for y,str1 in enumerate(arr1):
for n,str2 in enumerate(list2):
if str2 == arr1[y][0]:
arr1[y][1] += list3[n] # 一致すれば持分を加算
# 合計でソート
arr1 = sorted(arr1, key=lambda x:x[1], reverse=True) # 2列目で逆ソート
# グラフ用にコピー
arr2 = arr1
# 横ヘッダ追加
# 0行目にコピーを挿入
arr1.insert(0,arr1[0][:])
arr1[0][0] = “出願人“
arr1[0][1] = “発行件数“
# サンプル出力
print(‘arr1[0:5]=’,arr1[0:5][:])
# 書き込み
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘出願人別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# 棒グラフ作成
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams[‘font.family’] = ‘MS PGothic’
# ラベルとデータを設定
ntop = 10
ap_list = []
kensu_list = []
for y,str1 in enumerate(arr2):
ap_list.append(arr2[y][0])
kensu_list.append(arr2[y][1])
labels = ap_list[1:ntop]
data = kensu_list[1:ntop]
# 表示位置設定
x_width = 0.5
x_loc = np.array(range(len(labels))) + x_width
# グラフの大きさを設定
fig = plt.figure(figsize=(13.0, 4.0))
# タイトル、ラベルを設定
plt.title(“出願人別の発行件数(上位10社)”, fontsize=20)
plt.xlabel(“出願人“, fontsize=18)
plt.ylabel(“発行件数“, fontsize=18)
plt.bar(x_loc, data, width=x_width,color=’C0′) # 棒グラフの設定
plt.xticks(x_loc, labels, rotation=70,fontsize=14) # x軸にラベル設定(45度回転)
plt.grid() # 罫線追加
# 描画実行
plt.show()
# スクリブト32 出願人数年別集計
## 出願人数を年別に集計する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# 発行日欄データを発行年に修正しリスト化
pd_data = pat_data.iloc[:,2] # 発行日欄
py_list01 = []
for str1 in pd_data:
str1 = str1[0:4]
py_list01.append(str1)
# 出願人読み込み
apname_data = pat_data.iloc[:,4]
# 全出願人+発行年を抽出
ap_list =[]
for n, str1 in enumerate(apname_data):
ap_split = str1.split(“;”) # 分割
for str2 in ap_split: # 展開
str2 = py_list01[n] + “,” + str2
ap_list.append(str2)
# 発行年別に出願人の重複を削除
ap_list = list(set(ap_list)) # 重複を削除
# 前4文字のみに修正
list1 = []
for str1 in ap_list:
str4 = str1[0:4]
list1.append(str(str4))
# 発行年別の出願人数を集計
nenlast = nnen
ap_list = []
nap_list = []
list3 = [] # グラフ用の出願人数
list4 = [] # 追加件数
list5 = [] # 月数補正後の件数
for n1, str1 in enumerate(nopy_list): # nopy_list=発行年連番
if str1!= “発行年“:
nn = list1.count(str(str1)) # 出願人数をカウント
ap_list.append(str1)
nap_list.append(nn)
list3.append(float(nn)) # グラフ用にfloatに変更
if n1 == nenlast – 1:
nn2 = nn*npmend
nn2 = round(nn2,1)
list4.append(nn2)
list5.append(nn+nn2)
else:
list4.append(0)
list5.append(nn)
print(‘元の件数=’,list3)
print(‘月数補正後の件数=’,list5)
# 表の初期化
nx = 1
ny = len(nopy_list)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)]
# 縦軸書き込み
for y, str1 in enumerate(ap_list):
arr1[y][0] = str1
# 表を作成
for y,str1 in enumerate(arr1):
for n,str2 in enumerate(ap_list):
if str2 == arr1[y][0]:
arr1[y][1] += nap_list[n] # 一致すれば加算
# 横ヘッダ追加
# 0行目にコピーを挿入
arr1.insert(0,arr1[0][:])
arr1[0][0] = “発行年“
arr1[0][1] = “出願人数“
# サンプル出力
print(arr1)
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘出願人数年別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# 棒グラフ作成
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams[‘font.family’] = ‘MS PGothic’
# データ設定
labels = nopy_list
data = list3
data2 = list4
# 表示位置設定
x_width = 0.5
x_loc = np.array(range(len(data))) + x_width
# グラフの大きさを設定
fig = plt.figure(figsize=(13.0, 4.0))
# plt.title(“Bar Graph”)
plt.title(“出願人数の年別推移“, fontsize=20)
plt.xlabel(“発行年“, fontsize=18)
plt.ylabel(“出願人数“, fontsize=18)
plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘) # 棒グラフの設定
plt.xticks(x_loc, labels, fontsize=18) # x軸にラベル設定
if npmend > 0: # 追加補正係数>0ならば予想件数を表示
plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘) # 棒グラフの設定
plt.grid() # 罫線追加
# 追加補正係数>0ならば予想件数を表示
if npmend > 0:
plt.legend()
# 描画実行
plt.show()
# スクリブト33 出願人別年別集計
## 各公報毎に持分を計算し、年別に集計し、出願人毎の発行件数(持分)を集計する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# 出願人(重複なし)リスト作成(縦軸作成)
# 出願人読み込み
apname_data = pat_data.iloc[:,4]
ap_list =[]
for str1 in apname_data:
str0 = str1 + “,”
ap_list.append(str(str0))
# 出願人の重複を削除
list1 =[]
for str1 in apname_data:
ap_split = str1.split(“;”) # 分割
for str2 in ap_split: # 展開
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# 各公報から出願人+発行年+持分をリスト化
list2 =[]
for n, str1 in enumerate(apname_data):
nap = str1.count(“;”) + 1
nen = py_list01[n]
motibun = 1/nap
ap_split = str1.split(“;”) # 分割
for str2 in ap_split: # 展開
str3 = str2 + “,” + str(py_list01[n]) + “,” + str(motibun)
list2.append(str3)
# 表の初期化
nx = len(nopy_list)
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nopy_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(list1):
arr1[y+1][0] = str1
# 出願人別年別集計
for str1 in list2:
str2= str1.split(“,”)
ap =str2[0]
nen =str2[1]
motibun = str2[2]
for y, str3 in enumerate(list1):
if arr1[y+1][0] == ap:
for x, str4 in enumerate(nopy_list):
if arr1[0][x+1] == int(nen):
arr1[y+1][x+1] += float(motibun)
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# aray1をリスト化
list3 = []
for str1 in arr1:
list3.append(str1)
# 行列数を算出
ny = len(list1)
nx = len(nopy_list)
# 合計を算出し追加
list4 = []
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x]
str1.append(ntot)
list4.append(str1)
# 合計でソート
arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “出願人“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:5]=’,arr1[0:5][:])
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘出願人別年別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト34-1 新規参入企業抽出
## 最近になって参入してきた出願人の新規度合いを評価し、評価が高かった出願人をリストアップする。
### 調査開始年に発行公報がなかった出願人を抽出する。
### 出願人別年別集計表を作成
### 年平均件数(=横合計件数/(最終年–発行開始年))を算出
### 平均増加率を算出
### 平均件数以上でかつ平均増加率以上の出願人を抽出
### 最終年の件数が3件以上でかつ最近に新規参入した出願人を新規参入として抽出
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# 出願人(重複なし)リスト作成(縦軸作成)
# 出願人読み込み
apname_data = pat_data.iloc[:,4]
ap_list =[]
for str1 in apname_data:
str0 = str1 + “,”
ap_list.append(str(str0))
# 出願人の重複を削除
list1 =[]
for str1 in apname_data:
ap_split = str1.split(“;”) # 分割
for str2 in ap_split: # 展開
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# 各公報から出願人+発行年+持分をリスト化
list2 =[]
for n, str1 in enumerate(apname_data):
nap = str1.count(“;”) + 1
nen = py_list01[n]
motibun = 1/nap
ap_split = str1.split(“;”) # 分割
for str2 in ap_split: # 展開
str3 = str2 + “,” + str(py_list01[n]) + “,” + str(motibun)
list2.append(str3)
# 表の初期化
nx = len(nopy_list)
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nopy_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(list1):
arr1[y+1][0] = str1
# 出願人別年別集計
for str1 in list2:
str2= str1.split(“,”)
ap =str2[0]
nen =str2[1]
motibun = str2[2]
for y, str3 in enumerate(list1):
if arr1[y+1][0] == ap:
for x, str4 in enumerate(nopy_list):
if arr1[0][x+1] == int(nen):
arr1[y+1][x+1] += float(motibun)
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# aray1をリスト化
list3 = []
for str1 in arr1:
list3.append(str1)
# 行列数を算出
ny = len(list1)
nx = len(nopy_list)
# 合計を算出し追加
list4 = []
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x]
str1.append(ntot)
list4.append(str1)
# 合計でソート
arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “出願人“
arr1[0].append(“合計“)
# 調査開始年に発行公報が無かった出願人を抽出
list3 = []
for str1 in arr1:
if type(str1[1]) is float: # 開始年が0件ならばappend
if str1[1] == 0:
list3.append(str1)
if type(str1[1]) is int: # typeがintならばヘッダの年と判定しappend
list3.append(str1)
list3[0][0] = “出願人” # ヘッダの(0,0)を“出願人“に変更
print(“出願人=”, list3[0:2])
# 横合計を算出
list4 = []
for str1 in list3:
nx = len(str1)
xtot = 0
if type(str1[1]) is not str:
for x,str2 in enumerate(str1):
if type(str2) is float:
xtot = xtot + str2
list4.append(xtot)
list4[0] = “合計“
# 年平均件数(=横合計件数/(最終年–発行開始年))を追加
list5 = []
nsokei = 0
heikin = float(0)
ny = 0
for y, str1 in enumerate(list3):
ny = ny + 1
if type(str1[1]) is float:
heikin = list4[y] / (nx-1)
nsokei = nsokei + heikin # 年平均件数の合計を算出
list5.append(heikin)
print(‘年平均件数=’,list5[0:2])
print(“年平均件数の合計=”,nsokei)
# 全平均件数を算出
pav = nsokei / len(list5)
print(“全平均件数=”,pav)
# 平均件数以上でかつ平均増加率以上の出願人を抽出
list6 = [list3[0]]
for y,str1 in enumerate(list5):
if type(str1) is float:
if str1 > (nsokei / ny): # 平均件数以上
if str1 > pav: # 平均増加率以上
list6.append(list3[y+1])
else:
if list3[y+1][nx-1] >= 3: # 最終年の件数が3件以上
if list3[y+1][3] > 0: # 最近(調査開始年+2)に新規参入
list6.append(list3[y+1])
print(‘元表=’,list6[0:2]) # 元表
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘新規参入集計‘]
write_list_1d(sheet, list6, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト34-2 新規参入企業抽出
## 全体の平均件数と増加率を算出する。
## 新規参入出願人による発行件数の縦合計を集計する。
import numpy as np
print(”)
print(‘出力サンプル‘)
nnen = int(pyend) – int(pystt) + 1 # 調査期間
print(‘調査期間=’,nnen,’年‘)
print(‘新規候補=’,len(list6),’名‘) # 元表+合計
ntot = 0
for n1, nn1 in enumerate(list6):
if n1> 0:
ntot = ntot + nn1[nnen+1]
print(‘新規参入の縦合計=’,ntot) # 新規参入の縦合計
# 年平均件数(=横合計件数/発行期間(=0件でない年数))を算出
# 横合計欄=nnen+1
navr_list = [‘年平均件数‘]
for n1, nn1 in enumerate(list6):
if n1> 0:
# 発行期間(npnen)
npnen = 0
for n2, nn2 in enumerate(nn1):
if n2 < nnen+1:
if n2 > 0:
if nn2 > 0:
npnen = npnen + 1
if npnen > 1:
nn01 = round(nn1[nnen+1]/npnen,1)
else:
nn01 = 0
navr_list.append(nn01)
print(‘年平均件数[0:9]=’,navr_list[0:9])
# print(‘年平均件数=’,navr_list)
# 平均増加率(=(最終年前年件数–調査開始年翌年件数)/(発行期間(=0件でない年数))を算出
npavr_list = [‘平均増加率‘]
for n1, nn1 in enumerate(list6):
if n1 >0:
# 発行期間(npnen)
npnen = 0
for n2, nn2 in enumerate(nn1):
if n2 < nnen+1:
if n2 > 0:
if nn2 > 0:
npnen = npnen + 1
if npnen > 1:
np = round(nn1[nnen+1]/npnen,1)
else:
np = 0
np = round(np,1)
npavr_list.append(np)
print(‘平均増加率[0:9]=’,npavr_list[0:9])
# print(‘平均増加率=’,npavr_list)
# 全年平均件数(=新規参入の縦合計/新規候補者数/調査期間)を算出
nall = (ntot/len(list6))/nnen
print(‘全年平均件数=’,nall)
# 増加傾向出願人(=平均増加率>0)の全体平均増加率を算出
ntot = 0 # 増加傾向出願人の増加率
npall = 0 # 全体平均増加率
k = 0 # 増加傾向出願人の数
for n1, nn1 in enumerate(navr_list):
if n1 > 0:
if nn1 > 0: # 平均増加率>0
k=k+1
ntot = ntot + nn1
npall = ntot/k # 全体平均増加率
print(‘全体平均増加率=’,npall)
# 全年平均件数以上でかつ全体平均増加率以上の出願人(新規候補)を抽出
# かつ最終年件数+最終年前年の件数>3 (最終年近傍て3件以下は対象外)
newap_list = [‘新規候補フラグ‘]
for n1, nn1 in enumerate(list6):
if n1 > 0:
# print(nn1[0] ,’最終年近傍2年の発行件数=’,nn1[nnen] + nn1[nnen-1])
if (nn1[nnen] + nn1[nnen-1]) > 3:
bap = 0
if navr_list[n1] > nall: # 全年平均件数以上でかつ
if npavr_list[n1] > npall: # 全体平均増加率以上ならば
bap = 1 # 新規候補フラグ =1
else:
bap = 0
newap_list.append(bap)
print(‘新規候補フラグ[0:9]=’,newap_list[0:9])
# print(‘新規候補フラグ=’,newap_list)
# 発行年評価値(=最先発行年)を算出
fstnen_list = [‘発行年評価値‘]
for n1, nn1 in enumerate(list6):
if n1 > 0:
for n2, nn2 in enumerate(nn1):
if n2 > 0:
if nn2 > 0:
fstnen_list.append(n2+1)
break
print(‘発行年評価値[0:9]=’,fstnen_list[0:9])
# 合計件数評価値(=11-合計件数順位)を算出・付与
# 合計件数評価値を付与
k = 11
totrank_list = [‘合計件数評価値‘]
for str1 in list6:
if k > 0:
k=k – 1
else:
k=0
totrank_list.append(k)
print(‘合計件数評価値[0:9]=’,totrank_list[0:9])
# 総合評価値を算出
sogo_list = [‘総合評価値‘]
for nn1 in range(len(fstnen_list)):
if nn1 > 0:
nn2 = (fstnen_list[nn1] + totrank_list[nn1])*newap_list[nn1]
sogo_list.append(nn2)
print(‘総合評価値=’,sogo_list[0:20])
# 元表に追加
df1 = pd.DataFrame(list6)
df2 = pd.DataFrame(data=newap_list, columns=[‘新規候補フラグ‘])
df3 = pd.DataFrame(data=fstnen_list, columns=[‘発行年評価値‘])
df4 = pd.DataFrame(data=totrank_list, columns=[‘合計件数評価値‘])
df5 = pd.DataFrame(data=sogo_list, columns=[‘総合評価値‘])
df6 = pd.concat([df1, df2, df3, df4, df5], axis=1)
# 1行目をコピー
df0 = df6.iloc[0]
# リスト化
arr0 = df0.values
# 1行目を削除
df6 = df6.drop(df6.index[0])
# ソート
df6=df6.sort_values(‘総合評価値‘,ascending=False)
# リスト化
arr6 = df6.values
print(‘新規参入評価表[0:2]=’,arr6[0:2])
# Exceに書き出し
# ヘッダ作成
header_list = [arr0]
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘新規参入集計‘]
write_list_1d(sheet, header_list, 1, 1) # ヘッダを1行目1列目から書き込み
write_list_1d(sheet, arr6, 2, 1) # シート名「sheet」の2行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト35 サンプル公報リスト作成
# 全期間の発行公報をサンプリングし、公報番号~要約までの公報リストを作成する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 公報番号読み込み
patno_data = pat_data.iloc[:,0]
kensu = len(patno_data)
pn_list =[]
for str1 in patno_data:
str0 = str1
pn_list.append(str(str0))
# 発行日読み込み
pd_data = pat_data.iloc[:,2]
pd_list =[]
for str1 in pd_data:
if “発行” not in str(str1):
str0 = str(str1)[0:10]
pd_list.append(str(str0))
# 発明の名称読み込み
title_data = pat_data.iloc[:,3]
ti_list =[]
for str1 in title_data:
str0 = str1
ti_list.append(str(str0))
# 出願人読み込み
apname_data = pat_data.iloc[:,4]
ap_list =[]
for str1 in apname_data:
str0 = str1
ap_list.append(str(str0))
# 発明者読み込み
name_data = pat_data.iloc[:,5]
name_list =[]
for str1 in name_data:
str1 = str(str1)
str1 = (str1.replace(“ “, “_”)) # 空白を「_」に置換
str0 = str(str1)
name_list.append(str0)
# IPC読み込み
ipc_data = pat_data.iloc[:,6]
ipc_list =[]
for str1 in ipc_data:
str0 = str(str1)
ipc_list.append(str0)
# 要約読み込み
abst_data = pat_data.iloc[:,10]
abst_list =[]
for str1 in abst_data:
if str1 != ‘nan’:
#データ中の空白を削除
str1 = (str1.replace(” “, “”)) # 半角空白を削除
str1 = (str1.replace(“ “, “”)) # 全角空白を削除
str1 = (str1.replace(“,”, “”)) # 「,」を「、」に置換
abst_list.append(str1)
else:
abst_list.append(‘無し。‘)
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# DataFrame化
df1 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])
df2 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])
df3 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])
df4 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])
df5 = pd.DataFrame(data=name_list, columns=[‘発明者‘])
df6 = pd.DataFrame(data=ipc_list, columns=[‘IPC‘])
df7 = pd.DataFrame(data=abst_list, columns=[‘要約‘])
# 結合
df20=pd.concat([df1, df2, df3, df4, df5, df6, df7], axis=1)
# ソート
df20 = df20.sort_values(‘発行日‘, ascending=True) # 昇順
# 全件サンプリング(n=10)
if kensu>10:
df_allsample = df20.sample(n=10, random_state=0)
# dataframeをarrayに変換
arr1 = df_allsample.values
else:
arr1 = df20.values
# ヘッダ作成
header_list =[[“公報番号“,”発行日“,”発明の名称“,”出願人“,”発明者“,”IPC“,”要約“]]
# サンプル書き出し
print(“サンプル件数=”,len(arr1))
print(‘header_list=’,header_list)
print(‘arr1[0:1]=’,arr1[0:1]) # 1件出力
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘全サンプル公報‘]
write_list_1d(sheet, header_list, 1, 1) # ヘッダを1行目1列目に書き込み
write_list_1d(sheet, arr1, 2, 1) # シート名「sheet」の2行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
print(‘「全サンプル公報」をtrans_data.xlsxに書き出しました‘)
# スクリブト36 最終年発行のサンプル公報リスト作成
## 最終年発行の公報に絞った後にサンプリングし、公報番号~要約までの公報リストを作成する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 公報番号読み込み
patno_data = pat_data.iloc[:,0]
kensu = len(patno_data)
pn_list =[]
for str1 in patno_data:
str0 = str1
pn_list.append(str(str0))
# 発行日読み込み
pd_data = pat_data.iloc[:,2]
pd_list =[]
for str1 in pd_data:
if “発行” not in str(str1):
str0 = str(str1)[0:10]
pd_list.append(str(str0))
# 発明の名称読み込み
title_data = pat_data.iloc[:,3]
ti_list =[]
for str1 in title_data:
str0 = str1
ti_list.append(str(str0))
# 出願人読み込み
apname_data = pat_data.iloc[:,4]
ap_list =[]
for str1 in apname_data:
str0 = str1
ap_list.append(str(str0))
# 発明者読み込み
name_data = pat_data.iloc[:,5]
name_list =[]
for str1 in name_data:
str1 = str(str1)
str1 = (str1.replace(“ “, “_”)) # 空白を「_」に置換
str0 = str(str1)
name_list.append(str0)
# IPC読み込み
ipc_data = pat_data.iloc[:,6]
ipc_list =[]
for str1 in ipc_data:
str0 = str(str1)
ipc_list.append(str0)
# 要約読み込み
abst_data = pat_data.iloc[:,10]
abst_list =[]
for str1 in abst_data:
# 空白セル(=非数値データ(=nan))を文字(= “data無し“)に置換
str1 = str(str1)
#データ中の空白を削除
str1 = (str1.replace(” “, “”)) # 半角空白を削除
str1 = (str1.replace(“ “, “”)) # 全角空白を削除
str1 = (str1.replace(“,”, “”)) # 「,」を「、」に置換
str0 = str(str1)
abst_list.append(str0)
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# DataFrame化
df1 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])
df2 = pd.DataFrame(data=pd_list, columns=[‘発行日‘])
df3 = pd.DataFrame(data=ti_list, columns=[‘発明の名称‘])
df4 = pd.DataFrame(data=ap_list, columns=[‘出願人‘])
df5 = pd.DataFrame(data=name_list, columns=[‘発明者‘])
df6 = pd.DataFrame(data=ipc_list, columns=[‘IPC‘])
df7 = pd.DataFrame(data=abst_list, columns=[‘要約‘])
# 結合
df20=pd.concat([df1, df2, df3, df4, df5, df6, df7], axis=1)
# ソート
df20 = df20.sort_values(‘発行日‘, ascending=True) # 昇順
# 最終年サンプリング(n=10)
str1 = str(pyend)
df_nmax0 = (df20[df20[‘発行日‘].str.contains(str1)])
if len(df_nmax0)>10:
df_nmax1 = df_nmax0.sample(n=10, random_state=0)
# dataframeをarrayに変換
arr2 = df_nmax1.values
else:
arr2 = df_nmax0.values
# ヘッダ作成
header_list =[[“公報番号“,”発行日“,”発明の名称“,”出願人“,”発明者“,”IPC“,”要約“]]
# サンプル書き出し
print(“件数=”,len(arr2))
print(‘header_list=’,header_list)
print(‘arr2[0:1]=’,arr2[0:1]) # 1件出力
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘最新サンプル公報‘]
write_list_1d(sheet, header_list, 1, 1) # ヘッダを1行目1列目に書き込み
write_list_1d(sheet, arr2, 2, 1) # シート名「sheet」の2行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト37 メインG別年別集計
## IPCをメイングループに修正した後に、各メイングループ毎に年別の出現回数を集計する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# IPCメインG(重複なし)リスト作成(縦軸作成)
ipc_data = pat_data.iloc[:,6]
ipc_list =[]
for str1 in ipc_data:
str0 = str1 + “,”
ipc_list.append(str(str0))
# IPCをメインGに修正し、重複を削除して縦軸データを作成
list1 =[]
for str1 in ipc_data:
ipc_split = str1.split(“;”) # 分割
for str2 in ipc_split: # 展開
str3 = str2.split(“/”) # 「/」で分割
str2 = str3[0] + “/” # IPCをメインGに修正
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# ソート
list1 = sorted(list1)
# 公報データをメインGに修正(同一公報内の重複は削除)
maing_list = []
for str1 in ipc_data:
ipc_split = str1.split(“;”) # 分割
list0 = []
for str2 in ipc_split: # 展開
str3 = str2.split(“/”) # 「/」で分割
str2 = str3[0] + “/” # IPCをメインGに修正
if len(str2) > 5:
list0.append(str2)
list0 = list(set(list0)) # 重複を削除
maing_list.append(list0)
# 各公報からメインG+発行年+持分をリスト化
list2 =[]
for n, str1 in enumerate(maing_list):
nparts = len(str1)
for np in range(nparts):
ipc = str1[np]
nen = py_list01[n]
kaisu = 1
str3 = ipc + “,” + str(py_list01[n]) + “,” + str(kaisu)
list2.append(str3)
# 表の初期化
nx = len(nopy_list)
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nopy_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(list1):
arr1[y+1][0] = str1
# メインG別年別集計
for str1 in list2:
str2= str1.split(“,”)
ipc =str2[0]
nen =str2[1]
for y, str3 in enumerate(list1): # 重複なし分類コード(縦軸)と照合
if arr1[y+1][0] == ipc:
for x, str4 in enumerate(nopy_list): # 発行年連番(横軸)と照合
if arr1[0][x+1] == int(nen):
arr1[y+1][x+1] += 1 # 一致すれば出現回数を加算
arr1[0][0] = “メインG” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# arayをリスト化
list3 = []
for str1 in arr1:
list3.append(str1)
# 行列数を算出
ny = len(list1)
nx = len(nopy_list)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 合計でソート
arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “メインG“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:3]=’,arr1[0:3])
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘メインG別年別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト38 コード別年別集計
## 各年毎に各コード(全桁)の出現回数を集計する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# 分類コード(重複なし)リスト作成(縦軸作成)
code_data = pat_data.iloc[:,9]
cd_list =[]
for str1 in code_data:
str0 = str1 + “,”
cd_list.append(str(str0))
# 分類コードの重複を削除
list1 =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# ソート
list1 = sorted(list1)
# 各公報からコード+発行年+出現回数をリスト化
list2 =[]
for n, str1 in enumerate(code_data):
nen = py_list01[n]
kaisu = 1
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
str3 = str2 + “,” + str(py_list01[n]) + “,” + str(kaisu)
list2.append(str3)
# 表の初期化
nx = len(nopy_list)
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nopy_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(list1):
arr1[y+1][0] = str1
# コード別年別集計
for str1 in list2:
str2= str1.split(“,”)
code =str2[0]
nen =str2[1]
motibun = str2[2]
for y, str3 in enumerate(list1): # 重複なし分類コード(縦軸)と照合
if arr1[y+1][0] == code:
for x, str4 in enumerate(nopy_list): # 発行年連番(横軸)と照合
if arr1[0][x+1] == int(nen):
arr1[y+1][x+1] += float(kaisu) # 一致すれば出現回数を加算
arr1[0][0] = “分類コード” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# arayをリスト化
list3 = []
for str1 in arr1:
list3.append(str1)
# 行列数を算出
ny = len(list1)
nx = len(nopy_list)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 分類コードでソート
arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “分類コード“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:3]=’,arr1[0:3])
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘コード別年別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト39 一桁コード年別集計
## コードを一桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = []
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# 分類コード(重複なし)リスト作成(縦軸作成)
code_data = pat_data.iloc[:,9]
cd_list =[]
for str1 in code_data:
str0 = str1 + “,”
cd_list.append(str(str0))
# 分類コードを一桁に修正し、分類コードの重複を削除
list1 =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
str2 = str2[0] # 分類コードを一桁に修正
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# ソート
list1 = sorted(list1)
# 一桁に修正して重複を削除
bunkatu_list = []
for str1 in code_data:
code_split = str1.split(“;”) # 分割
list0 = []
for str2 in code_split: # 展開
str2 = str2[0] # 分類コードを一桁に修正
list0.append(str2)
list0 = list(set(list0)) # 重複を削除
bunkatu_list.append(list0)
# 各公報からコード+発行年+出現回数をリスト化
list2 =[]
for n, str1 in enumerate(bunkatu_list):
nparts = len(str1)
for np in range(nparts):
code = str1[np]
nen = py_list01[n]
kaisu = 1
str3 = code + “,” + str(py_list01[n]) + “,” + str(kaisu)
list2.append(str3)
# 表の初期化
nx = len(nopy_list)
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nopy_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(list1):
arr1[y+1][0] = str1
# コード別年別集計
for str1 in list2:
str2= str1.split(“,”)
code =str2[0]
code = code[0] # 一桁に絞り込み
nen =str2[1]
kaisu = str2[2]
for y, str3 in enumerate(list1): # 重複なし分類コード(縦軸)と照合
if arr1[y+1][0] == code:
for x, str4 in enumerate(nopy_list): # 発行年連番(横軸)と照合
if arr1[0][x+1] == int(nen):
arr1[y+1][x+1] += float(kaisu) # 一致すれば出現回数を加算
arr1[0][0] = “分類コード” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# arayをリスト化
list3 = []
for str1 in arr1:
list3.append(str1)
# 行列数を算出
ny = len(list1)
nx = len(nopy_list)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 分類コードでソート
arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “一桁分類コード“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:2]=’,arr1[0:2])
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘一桁年別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト40 三桁コード年別集計
## コードを三桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# 分類コード(重複なし)リスト作成(縦軸作成)
code_data = pat_data.iloc[:,9]
cd_list =[]
for str1 in code_data:
str0 = str1 + “,”
cd_list.append(str(str0))
# 分類コードを三桁に修正し、分類コードの重複を削除
list1 =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
str2 = str2[0:3] # 分類コードを三桁に修正
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# ソート
list1 = sorted(list1)
# 三桁に修正して重複を削除
bunkatu_list = []
for str1 in code_data:
code_split = str1.split(“;”) # 分割
list0 = []
for str2 in code_split: # 展開
str2 = str2[0:3] # 分類コードを三桁に修正
list0.append(str2)
list0 = list(set(list0)) # 重複を削除
bunkatu_list.append(list0)
# 各公報からコード+発行年+持分をリスト化
list2 =[]
for n, str1 in enumerate(bunkatu_list):
nparts = len(str1)
for np in range(nparts):
code = str1[np]
nen = py_list01[n]
kaisu = 1
str3 = code + “,” + str(py_list01[n]) + “,” + str(kaisu)
list2.append(str3)
# 表の初期化
nx = len(nopy_list)
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nopy_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(list1):
arr1[y+1][0] = str1
# コード別年別集計
for str1 in list2:
str2= str1.split(“,”)
code =str2[0]
code = code[0:3] # 三桁に絞り込み
nen =str2[1]
motibun = str2[2]
for y, str3 in enumerate(list1): # 重複なし分類コード(縦軸)と照合
if arr1[y+1][0] == code:
for x, str4 in enumerate(nopy_list): # 発行年連番(横軸)と照合
if arr1[0][x+1] == int(nen):
arr1[y+1][x+1] += float(kaisu) # 一致すれば出現回数を加算
arr1[0][0] = “分類コード” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# arayをリスト化
list3 = []
for str1 in arr1:
list3.append(str1)
# 行列数を算出
ny = len(list1)
nx = len(nopy_list)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 分類コードでソート
arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “三桁分類コード“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:2]=’,arr1[0:2])
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘三桁年別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト41 四桁コード年別集計
## コードを四桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# 分類コード(重複なし)リスト作成(縦軸作成)
code_data = pat_data.iloc[:,9]
cd_list =[]
for str1 in code_data:
str0 = str1 + “,”
cd_list.append(str(str0))
# 分類コードを四桁に修正し、分類コードの重複を削除
list1 =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
str2 = str2[0:4] # 分類コードを四桁に修正
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# ソート
list1 = sorted(list1)
# 四桁に修正して重複を削除
bunkatu_list = []
for str1 in code_data:
code_split = str1.split(“;”) # 分割
list0 = []
for str2 in code_split: # 展開
str2 = str2[0:4] # 分類コードを四桁に修正
list0.append(str2)
list0 = list(set(list0)) # 重複を削除
bunkatu_list.append(list0)
# 各公報からコード+発行年+持分をリスト化
list2 =[]
for n, str1 in enumerate(bunkatu_list):
nparts = len(str1)
for np in range(nparts):
code = str1[np]
nen = py_list01[n]
kaisu = 1
str3 = code + “,” + str(py_list01[n]) + “,” + str(kaisu)
list2.append(str3)
# 表の初期化
nx = len(nopy_list)
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nopy_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(list1):
arr1[y+1][0] = str1
# コード別年別集計
for str1 in list2:
str2= str1.split(“,”)
code =str2[0]
code = code[0:4] # 四桁に絞り込み
nen =str2[1]
motibun = str2[2]
for y, str3 in enumerate(list1): # 重複なし分類コード(縦軸)と照合
if arr1[y+1][0] == code:
for x, str4 in enumerate(nopy_list): # 発行年連番(横軸)と照合
if arr1[0][x+1] == int(nen):
arr1[y+1][x+1] += float(kaisu) # 一致すれば出現回数を加算
arr1[0][0] = “分類コード” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# arayをリスト化
list3 = []
for str1 in arr1:
list3.append(str1)
# 行列数を算出
ny = len(list1)
nx = len(nopy_list)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 分類コードでソート
arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “四桁分類コード“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:2]=’,arr1[0:2])
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘四桁年別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト42 六桁コード年別集計
## コードを六桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 開始年と終了年
print(“開始年=”,pystt, “終了年=”,pyend)
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# 分類コード(重複なし)リスト作成(縦軸作成)
# 分類コード読み込み
code_data = pat_data.iloc[:,9]
cd_list =[]
for str1 in code_data:
str0 = str1 + “,”
cd_list.append(str(str0))
# 分類コードを六桁に修正し、分類コードの重複を削除
list1 =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
str2 = str2[0:6] # 分類コードを六桁に修正
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# ソート
list1 = sorted(list1)
# 六桁に修正して重複を削除
bunkatu_list = []
for str1 in code_data:
code_split = str1.split(“;”) # 分割
list0 = []
for str2 in code_split: # 展開
str2 = str2[0:6] # 分類コードを六桁に修正
list0.append(str2)
list0 = list(set(list0)) # 重複を削除
bunkatu_list.append(list0)
# 各公報からコード+発行年+持分をリスト化
list2 =[]
for n, str1 in enumerate(bunkatu_list):
nparts = len(str1)
for np in range(nparts):
code = str1[np]
nen = py_list01[n]
kaisu = 1
str3 = code + “,” + str(py_list01[n]) + “,” + str(kaisu)
list2.append(str3)
# 表の初期化
nx = len(nopy_list)
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nopy_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(list1):
arr1[y+1][0] = str1
# コード別年別集計
for str1 in list2:
str2= str1.split(“,”)
code =str2[0]
code = code[0:6] # 六桁に絞り込み
nen =str2[1]
motibun = str2[2]
for y, str3 in enumerate(list1): # 重複なし分類コード(縦軸)と照合
if arr1[y+1][0] == code:
for x, str4 in enumerate(nopy_list): # 発行年連番(横軸)と照合
if arr1[0][x+1] == int(nen):
arr1[y+1][x+1] += float(kaisu) # 一致すれば出現回数を加算
arr1[0][0] = “分類コード” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# arayをリスト化
list3 = []
for str1 in arr1:
list3.append(str1)
# 行列数を算出
ny = len(list1)
nx = len(nopy_list)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 分類コードでソート
arr1 = sorted(arr1, key=lambda x:x[0], reverse=False)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “六桁分類コード“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:2]=’,arr1[0:2]) # 5件出力
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘六桁年別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト43 コード一桁出願人リスト
## コードを一桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。
### 横軸がコード、縦軸が出願人
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 分類コード(重複なし)リスト作成(縦軸作成)
code_data = pat_data.iloc[:,9]
cd_list =[]
for str1 in code_data:
str0 = str1
cd_list.append(str(str0))
# 分類コードを一桁に修正し、重複を削除し、コードヘッダリストを作成
cdhd_list =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
str2 = str2[0:1] #<<< 分類コードを三桁に修正 >>>
cdhd_list.append(str2)
cdhd_list = list(set(cdhd_list)) # 重複を削除
# 出現コードをソート
cdhd_list = sorted(cdhd_list)
# 各行の分類コードを一桁に修正し、同一公報内の分類コードの重複を削除
cddt_list =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
list1 =[]
for str2 in code_split: # 展開
str2 = str2[0:1] #<<< 分類コードを一桁に修正 >>>
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
list1 = sorted(list1) # 各要素リスト内をソート
cddt_list.append(list1)
# 出願人別集計結果を読み込み
ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)
# 出願人(重複なし)リスト作成(縦軸作成)
# apname_data = ap_data.iloc[0:20,0] # 上位20件を読み込み
apname_data = ap_data.iloc[:,0]
aphd_minilist =[]
for str1 in apname_data:
str0 = str1 + “,”
aphd_minilist.append(str(str0))
# 各公報から出願人(apname_data)+コード(cddt_list)+出願人数(nap)をリスト化
apname_data = pat_data.iloc[:,4]
apcd_list =[]
for n, str1 in enumerate(apname_data):
nap = str1.count(“;”) + 1 # 出願人数を算出
ap_split = str1.split(“;”) # 出願人を分割
for n1 in range(nap): # 分割した出願人毎に処理
ap_str = ap_split[n1]
ncd = len(cddt_list[n]) # コード数を算出
for n2 in range(ncd): # 分割したコード毎に処理
str2 = cddt_list[n] # n行目のコードを読み出し
str2 = str2[n2] # n行のn2番目のコードを読み出し(リスト[“A”]→文字A)
apcd_str = ap_str + “,” + str2 + “,” + str(nap) # 出願人+コード+出願人数を作成
apcd_list.append(apcd_str)
# 表の初期化(y=重複無し出願人,x=コードヘッダリスト)
ny = len(aphd_minilist) # 重複無し出願人
nx = len(cdhd_list) # コードヘッダリスト
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(cdhd_list): # コードヘッダリスト
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(aphd_minilist): # 重複無し出願人
arr1[y+1][0] = str1
# 出願人別コード別集計(出願人+コード=”, apcd_list)
for str1 in apcd_list: # (出願人+コード=”, apcd_list)
str2= str1.split(“,”)
ap =str2[0]
code =str2[1]
code = code[0:1] #<<< 一桁に絞り込み >>>
motibun = 1/int(str2[2]) # 持分を読み込み
for y, str3 in enumerate(aphd_minilist): # 重複なし出願人(縦軸)と照合
bap = arr1[y+1][0].rstrip(“,”)
if bap == ap:
for x, str4 in enumerate(cdhd_list): # コードヘッダリスト(横軸)と照合
if arr1[0][x+1] == code:
arr1[y+1][x+1] += float(motibun) # 一致すれば持分を加算
arr1[0][0] = “出願人” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# 合計を算出
ny = len(aphd_minilist) # aphd_list: # 重複なし出願人(縦軸)
nx = len(cdhd_list) # cdhd_list: # コードヘッダリスト(横軸)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 合計でソート
arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “出願人“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:2]=’,arr1[0:2]) # 5件出力
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘一桁コード別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト44 コード三桁出願人リスト
## コードを三桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。
### 横軸がコード、縦軸が出願人
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 分類コード(重複なし)リスト作成(縦軸作成)
code_data = pat_data.iloc[:,9]
cd_list =[]
for str1 in code_data:
str0 = str1
cd_list.append(str(str0))
# 分類コードを三桁に修正し、重複を削除し、コードヘッダリストを作成
cdhd_list =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
str2 = str2[0:3] #<<< 分類コードを三桁に修正 >>>
cdhd_list.append(str2)
cdhd_list = list(set(cdhd_list)) # 重複を削除
# 出現コードをソート
cdhd_list = sorted(cdhd_list)
# 分類コードが多すぎる場合には終了する
ncode = len(cdhd_list)
if ncode > 255:
print(“コード数が255以上になったので終了します“)
sys.exit()
# 各行の分類コードデータを三桁に修正し、重複を削除
cddt_list =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
list1 =[]
for str2 in code_split: # 展開
str2 = str2[0:3] #<<< 分類コードを三桁に修正 >>>
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
list1 = sorted(list1) # 各要素リスト内をソート
cddt_list.append(list1)
# 出願人別集計結果を読み込み
ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)
# 出願人(重複なし)リスト作成(縦軸作成)
# apname_data = ap_data.iloc[0:20,0] # 上位20件を読み込み
apname_data = ap_data.iloc[:,0]
aphd_minilist =[]
for str1 in apname_data:
str0 = str1 + “,”
aphd_minilist.append(str(str0))
# 各公報から出願人(apname_data)+コード(cddt_list)+出願人数(nap)をリスト化
apname_data = pat_data.iloc[:,4]
apcd_list =[]
for n, str1 in enumerate(apname_data):
nap = str1.count(“;”) + 1 # 出願人数を算出
ap_split = str1.split(“;”) # 出願人を分割
for n1 in range(nap): # 分割した出願人毎に処理
ap_str = ap_split[n1]
ncd = len(cddt_list[n]) # コード数を算出
for n2 in range(ncd): # 分割したコード毎に処理
str2 = cddt_list[n] # n行目のコードを読み出し
str2 = str2[n2] # n行のn2番目のコードを読み出し(リスト[“A”]→文字A)
apcd_str = ap_str + “,” + str2 + “,” + str(nap) # 出願人+コード+出願人数を作成
apcd_list.append(apcd_str)
# 表の初期化(y=重複無し出願人,x=コードヘッダリスト)
ny = len(aphd_minilist) # 重複無し出願人
nx = len(cdhd_list) # コードヘッダリスト
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(cdhd_list): # コードヘッダリスト
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(aphd_minilist): # 重複無し出願人
arr1[y+1][0] = str1
# 出願人別コード別集計(出願人+コード=”, apcd_list)
for str1 in apcd_list: # (出願人+コード=”, apcd_list)
str2= str1.split(“,”)
ap =str2[0]
code =str2[1]
code = code[0:3] #<<< 三桁に絞り込み >>>
motibun = 1/int(str2[2]) # 持分を読み込み
for y, str3 in enumerate(aphd_minilist): # 重複なし出願人(縦軸)と照合
bap = arr1[y+1][0].rstrip(“,”)
if bap == ap:
for x, str4 in enumerate(cdhd_list): # コードヘッダリスト(横軸)と照合
if arr1[0][x+1] == code:
arr1[y+1][x+1] += float(motibun) # 一致すれば持分を加算
arr1[0][0] = “出願人” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# 合計を算出
ny = len(aphd_minilist) # aphd_list: # 重複なし出願人(縦軸)
nx = len(cdhd_list) # cdhd_list: # コードヘッダリスト(横軸)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 分類コードでソート
arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “出願人“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:2]=’,arr1[0:2])
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘三桁コード別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト45 コード四桁出願人リスト
## コードを四桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。
### 横軸がコード、縦軸が出願人
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 分類コード(重複なし)リスト作成(縦軸作成)
code_data = pat_data.iloc[:,9]
cd_list =[]
for str1 in code_data:
str0 = str1
cd_list.append(str(str0))
# 分類コードを四桁に修正し、重複を削除し、コードヘッダリストを作成
cdhd_list =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
str2 = str2[0:4] #<<< 分類コードを四桁に修正 >>>
cdhd_list.append(str2)
cdhd_list = list(set(cdhd_list)) # 重複を削除
# 出現コードをソート
cdhd_list = sorted(cdhd_list)
# 各行の分類コードデータを四桁に修正し、同一公報内の分類コードの重複を削除
cddt_list =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
list1 =[]
for str2 in code_split: # 展開
str2 = str2[0:4] #<<< 分類コードを四桁に修正 >>>
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
list1 = sorted(list1) # 各要素リスト内をソート
cddt_list.append(list1)
# 分類コードが多すぎる場合には終了する
ncode = len(cdhd_list)
if ncode > 255:
print(“コード数が255以上になったので終了します“)
sys.exit()
# 出願人別集計結果を読み込み
ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)
# 出願人(重複なし)リスト作成(縦軸作成)
# apname_data = ap_data.iloc[0:20,0] # 上位20件を読み込み
apname_data = ap_data.iloc[:,0]
aphd_minilist =[]
for str1 in apname_data:
str0 = str1 + “,”
aphd_minilist.append(str(str0))
# 各公報から出願人(apname_data)+コード(cddt_list)+出願人数(nap)をリスト化
apname_data = pat_data.iloc[:,4]
apcd_list =[]
for n, str1 in enumerate(apname_data):
nap = str1.count(“;”) + 1 # 出願人数を算出
ap_split = str1.split(“;”) # 出願人を分割
for n1 in range(nap): # 分割した出願人毎に処理
ap_str = ap_split[n1]
ncd = len(cddt_list[n]) # コード数を算出
for n2 in range(ncd): # 分割したコード毎に処理
str2 = cddt_list[n] # n行目のコードを読み出し
str2 = str2[n2] # n行のn2番目のコードを読み出し(リスト[“A”]→文字A)
apcd_str = ap_str + “,” + str2 + “,” + str(nap) # 出願人+コード+出願人数を作成
apcd_list.append(apcd_str)
# 表の初期化(y=重複無し出願人,x=コードヘッダリスト)
ny = len(aphd_minilist) # 重複無し出願人
nx = len(cdhd_list) # コードヘッダリスト
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(cdhd_list): # コードヘッダリスト
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(aphd_minilist): # 重複無し出願人
arr1[y+1][0] = str1
# 出願人別コード別集計(出願人+コード=”, apcd_list)
for str1 in apcd_list: # (出願人+コード=”, apcd_list)
str2= str1.split(“,”)
ap =str2[0]
code =str2[1]
code = code[0:4] #<<< 四桁に絞り込み >>>
motibun = 1/int(str2[2]) # 持分を読み込み
for y, str3 in enumerate(aphd_minilist): # 重複なし出願人(縦軸)と照合
bap = arr1[y+1][0].rstrip(“,”)
if bap == ap:
for x, str4 in enumerate(cdhd_list): # コードヘッダリスト(横軸)と照合
if arr1[0][x+1] == code:
arr1[y+1][x+1] += float(motibun) # 一致すれば持分を加算
arr1[0][0] = “出願人” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# 合計を算出
ny = len(aphd_minilist) # aphd_list: # 重複なし出願人(縦軸)
nx = len(cdhd_list) # cdhd_list: # コードヘッダリスト(横軸)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 分類コードでソート
arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “出願人“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:2]=’,arr1[0:2])
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘四桁コード別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト46 コード六桁出願人リスト
## コードを六桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。
### 横軸がコード、縦軸が出願人
print(”)
print(‘出力サンプル‘)
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
# 分類コード(重複なし)リスト作成(縦軸作成)
code_data = pat_data.iloc[:,9]
cd_list =[]
for str1 in code_data:
str0 = str1
cd_list.append(str(str0))
# print(“分類コード欄=”, cd_list)
# 分類コードを六桁に修正し、重複を削除し、コードヘッダリストを作成
cdhd_list =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
for str2 in code_split: # 展開
str2 = str2[0:6] #<<< 分類コードを六桁に修正 >>>
cdhd_list.append(str2)
cdhd_list = list(set(cdhd_list)) # 重複を削除
# 出現コードをソート
cdhd_list = sorted(cdhd_list)
# 各行の分類コードデータを六桁に修正し、同一公報内の分類コードの重複を削除
cddt_list =[]
for str1 in code_data:
code_split = str1.split(“;”) # 分割
list1 =[]
for str2 in code_split: # 展開
str2 = str2[0:6] #<<< 分類コードを六桁に修正 >>>
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
list1 = sorted(list1) # 各要素リスト内をソート
cddt_list.append(list1)
# 分類コードが多すぎる場合には終了する
ncode = len(cdhd_list)
if ncode > 255:
print(“コード数が255以上になったので終了します“)
sys.exit()
# 出願人別集計結果を読み込み
ap_data = pd.read_excel(‘trans_data.xlsx’, sheet_name=’出願人別集計‘)
# 出願人(重複なし)リスト作成(縦軸作成)
# apname_data = ap_data.iloc[0:20,0] # 上位20件を読み込み
apname_data = ap_data.iloc[:,0]
aphd_minilist =[]
for str1 in apname_data:
str0 = str1 + “,”
aphd_minilist.append(str(str0))
# 各公報から出願人(apname_data)+コード(cddt_list)+出願人数(nap)をリスト化
apname_data = pat_data.iloc[:,4]
apcd_list =[]
for n, str1 in enumerate(apname_data):
nap = str1.count(“;”) + 1 # 出願人数を算出
ap_split = str1.split(“;”) # 出願人を分割
for n1 in range(nap): # 分割した出願人毎に処理
ap_str = ap_split[n1]
ncd = len(cddt_list[n]) # コード数を算出
for n2 in range(ncd): # 分割したコード毎に処理
str2 = cddt_list[n] # n行目のコードを読み出し
str2 = str2[n2] # n行のn2番目のコードを読み出し(リスト[“A”]→文字A)
apcd_str = ap_str + “,” + str2 + “,” + str(nap) # 出願人+コード+出願人数を作成
apcd_list.append(apcd_str)
# 表の初期化(y=重複無し出願人,x=コードヘッダリスト)
ny = len(aphd_minilist) # 重複無し出願人
nx = len(cdhd_list) # コードヘッダリスト
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(cdhd_list): # コードヘッダリスト
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(aphd_minilist): # 重複無し出願人
arr1[y+1][0] = str1
# 出願人別コード別集計(出願人+コード=”, apcd_list)
for str1 in apcd_list: # (出願人+コード=”, apcd_list)
str2= str1.split(“,”)
ap =str2[0]
code =str2[1]
code = code[0:6] #<<< 六桁に絞り込み >>>
motibun = 1/int(str2[2]) # 持分を読み込み
for y, str3 in enumerate(aphd_minilist): # 重複なし出願人(縦軸)と照合
bap = arr1[y+1][0].rstrip(“,”)
if bap == ap:
for x, str4 in enumerate(cdhd_list): # コードヘッダリスト(横軸)と照合
if arr1[0][x+1] == code:
arr1[y+1][x+1] += float(motibun) # 一致すれば持分を加算
arr1[0][0] = “出願人” # ヘッダ設定
# print(arr1) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# 合計を算出
ny = len(aphd_minilist) # aphd_list: # 重複なし出願人(縦軸)
nx = len(cdhd_list) # cdhd_list: # コードヘッダリスト(横軸)
# 合計を算出し追加
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x] # 合計を算出
str1.append(ntot) # 合計を追加
# 分類コードでソート
arr1 = sorted(arr1, key=lambda x:x[nx+1], reverse=True)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “出願人“
arr1[0].append(“合計“)
# サンプル出力
print(‘arr1[0:2]=’,arr1[0:2])
# Exceに書き出し
file_name = ‘trans_data.xlsx’
wb = openpyxl.load_workbook(file_name)
def write_list_1d(sheet, l_1d, start_row, start_col):
for y, row in enumerate(l_1d):
for x, cell in enumerate(row):
sheet.cell(row=start_row + y,
column=start_col + x,
value=l_1d[y][x])
sheet = wb[‘六桁コード別集計‘]
write_list_1d(sheet, arr1, 1, 1) # シート名「sheet」の1行目1列目からarr1の内容を書き込み
wb.save(file_name) # ファイル「file_name」に保存
# スクリブト47 用済みファイルを削除
import os
print(”)
print(‘出力サンプル‘)
os.remove(‘./中間data/class_code表.csv’)
os.remove(‘./中間data/class_hindo表.csv’)
os.remove(‘./中間data/FI_code表.csv’)
os.remove(‘./中間data/FIデータリスト1.csv’)
os.remove(‘./中間data/FIデータリスト2.csv’)
os.remove(‘./中間data/FIデータリスト3.csv’)
os.remove(‘./中間data/FI_hindo表.csv’)
os.remove(‘./中間data/FIデータリスト4.csv’)
os.remove(‘./中間data/FIデータリスト5.csv’)
os.remove(‘./中間data/new_patlist2.csv’)
os.remove(‘./中間data/new_patlist3.csv’)
# os.remove(‘./中間data/new_patlist4.csv’) # この後で使用
# os.remove(‘./中間data/Z_code表.csv’)
os.remove(‘./中間data/IPC_code対照表.csv’)
os.remove(‘./中間data/Z他_code表.csv’)
os.remove(‘./中間data/IPC_code表2.csv’)
os.remove(‘./中間data/コード_コード内容対照表.csv’)
os.remove(‘./中間data/コード_コード内容対照表2.csv’)
os.remove(‘./中間data/一括処理コード表.csv’)
# os.remove(‘./中間data/トピックKWリスト.csv’)
os.remove(‘./中間data/FIデータリスト4_2.csv’)
os.remove(‘./中間data/IPC_code表.csv’)
os.remove(‘./中間data/IPC_hindo表.csv’)
os.remove(‘./中間data/new_patlist.csv’)
os.remove(‘./中間data/subclass_code表.csv’)
os.remove(‘./中間data/subclass_hindo表.csv’)
os.remove(‘./中間data/全FIデータリスト.csv’)
# os.remove(‘./中間data/trans_data01.xlsx’) # この後で使用
print(‘不要ファイルを削除しました‘)
# 図表、コメント、調査レポートの作成
# スクリブト50 発行年データ読み込み
import pandas as pd
import openpyxl
print(”)
print(‘出力サンプル‘)
# 公報データ読み込み
try:
pat_data = pd.read_csv(‘分析公報data.csv’, engine =’python’) # csv用
except UnicodeDecodeError as e:
pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’shift_jis’) # csv用
# pat_data = pd.read_csv(‘分析公報data.csv’, encoding=’utf-8′) # csv用
pat_data = pat_data.dropna(how=’all’) # 全列がNaNである行を削除
print(‘対象公報件数=’,len(pat_data))
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 発行日読み込み
pd_list =[]
for str1 in pd_data:
if “発行” not in str(str1):
str0 = str(str1)[0:10]
pd_list.append(str(str0))
# 発行日欄データを発行年に修正しリスト化
pd_data = pat_data.iloc[:,2] # 発行日欄
py_list01 =[]
for str1 in pd_data:
if “発行” not in str(str1):
nen = str1[0:4]
str0 = str(nen)
py_list01.append(str(str0))
print(‘発行年データ[0:5]=’,py_list01[0:5])
# 開始年と終了年を判定
min_date = min(pd_list) # minデータを抽出
pystt = min_date[0:4] # 前4文字(年データ)読み取り
max_date = max(pd_list) # maxデータを抽出
pyend = max_date[0:4] # 前4文字(年データ)読み取り
# print(“開始年=”,pystt, “終了年=”,pyend)
if int(pyend) > 2100:
print(“公報発行年が2100年以降になっています“)
sys.exit()
# 連番作成
year_list = list(range(int(pystt),int(pyend)+1))
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
print(“発行年連番=”, nopy_list,type(nopy_list))
# スクリブト51 第一章調査の概要を書き出し
## テーマ名からツールソフトまでのコメントを作成し、書き出す。
import pandas as pd
import openpyxl
import docx
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
from matplotlib import pyplot as plt
print(”)
print(‘出力サンプル‘)
# 図表Noを初期化
nfig = 0
fig_n = ‘図‘ + str(nfig)
nhyo = 0
hyo_n = ‘表‘ + str(nhyo)
# テーマ名読み込み
thema_data = pd.read_excel(‘テーマ設定data.xlsx’,sheet_name=’テーマ名‘)
thema_data = thema_data.dropna(how=’all’) # 全列がNaNである行を削除
thema01 = thema_data.iloc[:,0]
thema = thema01[0]
print(‘テーマ名=’,thema)
# 年別発行件数読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’年別発行件数集計‘)
# 発行年読み込み
pd_data1 = pd_data.iloc[:,0]
py_list = []
for str1 in pd_data1:
py_list.append(int(str1))
# print(py_list)
# 開始年と終了年を判定
pystt = min(py_list) # minデータを抽出
pyend = max(py_list) # maxデータを抽出
print(“開始年=”,pystt, “終了年=”,pyend)
if int(pyend) > 2100:
print(“公報発行年が2100年以降になっています“)
sys.exit()
# 開始年と終了年
# print(“開始年=”,pystt, “終了年=”,pyend)
if npmend > 0:
period = str(pystt) + ‘年1月1日~‘ + str(pyend) + ‘年‘ + str(monthend) + ‘月末‘
else:
period = str(pystt) + ‘年1月1日~‘ + str(pyend) + ‘年12月31日‘
# ‘調査目的読み込み
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–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(‘1–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(‘1–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(‘1–4調査手法‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
wrd1 = ‘ 以下の手順により、対象公報の抽出、コード化、グラフ化、分析を行なっている。\n’
wrd2 = ‘ なお、コード化、グラフ化、分析コメントの作成、本レポートの作成については、すべてpythonにより自動作成している。\n’
wrd = wrd1 + wrd2
para = doc.add_paragraph(wrd)
wrd = ‘1-4-1 検索に使用するIPC、キーワードの抽出‘
para = doc.add_paragraph(wrd)
para.runs[npara].bold = True
wrd1= ‘ 次の手順により、検索に使用するIPC、キーワードを抽出する。\n’
wrd2 = ‘①インターネットにより調査テーマに関するキーワードを調べる。\n’
wrd3 = ‘②調べたキーワードを検索語句としてキーワード検索により公報を予備検索する。\n’
wrd4 = ‘③上記①と②の検索結果(発明の名称、要約、特許分類(IPC,FI,FT))を整理し、検索に使用するIPCとキーワードを抽出する。\n’
wrd = wrd1 + wrd2 + wrd3 + wrd4
para = doc.add_paragraph(wrd)
wrd = ‘1-4-2 公報データの作成‘
para = doc.add_paragraph(wrd)
para.runs[npara].bold = True
wrd = ‘ 抽出したIPCとキーワードを組み合わせて検索式を作成し、この検索式により検索し、公報データをダウンロードする。‘
para = doc.add_paragraph(wrd)
wrd = ‘1-4-3 ノイズ公報データの除去‘
para = doc.add_paragraph(wrd)
para.runs[npara].bold = True
wrd = ‘ 書誌事項に対してキーワード検索を行を行なってノイズ公報のデータを除去する。‘
para = doc.add_paragraph(wrd)
wrd = ‘1-4-4 コード付与‘
para = doc.add_paragraph(wrd)
para.runs[npara].bold = True
wrd1 = ‘ pythonを利用して独自に作成したコード化プログラムによりコード化する。\n’
wrd2 = ‘ コード化の基本的な処理では、出現頻度が高いIPCを抽出し、抽出したIPCに関連が深いIPCをまとめてコードを付与している。‘
wrd =wrd1 + wrd2
para = doc.add_paragraph(wrd)
wrd = ‘1-4-5 グラフ化および分析‘
para = doc.add_paragraph(wrd)
para.runs[npara].bold = True
wrd0 = ‘ 分析用公報データの書誌情報と、各公報に付与した分類コードとから以下の各種集計表とグラフを作成し、本テーマの出願動向を分析している。\n’
wrd0_1 = ‘ ※ 上記書誌情報の内容は、「公報番号、出願番号、発行日、発明等の名称、出願人・権利者、発明者、IPC、FI、Fターム、要約」である。\n’
wrd1 =’①全体の出願状況\n’
wrd1_1 = ‘ ・公報発行件数の年別推移(縦棒グラフ)\n’
wrd2 = ‘②出願人ベースの分析\n’
wrd2_1 = ‘ ・出願人別発行件数の割合(集計表、円グラフ)\n ‘
wrd2_2 = ‘ ・出願人数の年別推移(縦棒グラフ)\n’
wrd2_3 = ‘ ・出願人別発行件数の年別推移(折線グラフ、バブルチャート)\n’
wrd3 = ‘③メイングループの分析(縦棒グラフ、バブルチャート)\n’
wrd3_1 = ‘ ・メイングループ別発行件数の分布(縦棒グラフ)\n’
wrd3_2 = ‘ ・メイングループ別発行件数の年別推移(バブルチャート)\n’
wrd4 = ‘④ 新規参入企業(バブルチャート)\n’
wrd5 = ‘⑤最新発行のサンプル公報の概要(書誌リスト、概要)\n’
wrd6 = ‘⑥分類コードベースの分析\n’
wrd6_1 = ‘ ・分類コード別の発行件数割合(集計表、円グラフ)\n’
wrd6_2 = ‘ ・分類コード別発行件数の年別推移(折線グラフ、バブルチャート)\n’
wrd7 = ‘⑦コード別の詳細分析\n’
wrd7_1 = ‘ ・一桁コード別発行件数の年別推移(縦棒グラフ)\n’
wrd7_2 =’ ・一桁コード別出願人別の発行件数割合(集計表、円グラフ)\n’
wrd7_3 =’ ・一桁コード別出願人数の年別推移(縦棒グラフ)\n’
wrd7_4 = ‘ ・一桁コード別出願人別発行件数の年別推移(バブルチャート)\n’
wrd7_5 = ‘ ・一桁コード別新規参入企業(バブルチャート)\n’
wrd7_6 = ‘ ・一桁コード毎の下位コード別の発行件数割合(集計表、円グラフ)\n’
wrd7_7 = ‘ ・一桁コード毎の下位コード別発行件数の年別推移(バブルチャート)\n’
wrd7_8 = ‘ ・(該当公報が有れば)サンプル公報の概要(書誌リスト)\n’
wrd8 = ‘⑧出願人別・コード別の公報発行件数(バブルチャート)\n’
# wrd24 = ‘⑧課題別の年別推移(バブルチャート)\n’
# wrd 25 = ‘⑨トピック分析(発行年別の高頻出キーワードリスト)\n’
wrd01 =wrd0 + wrd0_1 + wrd1 + wrd1_1 + wrd2 + wrd2_1 + wrd2_2 + wrd2_3 + wrd3 + wrd3_1 + wrd3_2
wrd02 = wrd4 + wrd5 + wrd6 + wrd6_1 +wrd6_2 + wrd7 + wrd7_1 + wrd7_2 + wrd7_3
wrd03 = wrd7_4 + wrd7_5 + wrd7_6 + wrd7_7 + wrd7_8 + wrd8
wrd = wrd01 + wrd02 + wrd03
para = doc.add_paragraph(wrd)
wrd = ‘1-5 バソコン環境‘
para = doc.add_paragraph(wrd)
para.runs[npara].bold = True
wrd1 = ‘・使用パソコンのOS macOS Catalina\n’
wrd2 = ‘・使用python python 3.8.3\n’
wrd3 = ‘・python実行環境 Jupyter Notebook\n’
wrd =wrd1 + wrd2 + wrd3
para = doc.add_paragraph(wrd)
wrd = ‘1-6 ツールソフト(処理内容)’
para = doc.add_paragraph(wrd)
para.runs[npara].bold = True
wrd = ‘・特許出願動向調査_singleV4.ipynb(コーデイング、集計、図表作成、コメント作成、レポート作成)\n’
para = doc.add_paragraph(wrd)
doc.add_page_break() # 改頁
doc.save(‘report.docx’)
# スクリブト52 2-1 発行件数の年別推移(図表とコメント作成)
import pandas as pd
import numpy as np
import openpyxl
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams[‘font.family’] = ‘MS PGothic’
import matplotlib.patches as patches
import csv
import copy
print(”)
print(‘出力サンプル‘)
# 図表Noを初期化
nfig = 0
fig_n = ‘図‘ + str(nfig)
nhyo = 0
hyo_n = ‘表‘ + str(nhyo)
# テーマ名thema読み込み
thema_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’テーマ名‘)
thema_data = thema_data.dropna(how=’all’) # 全列がNaNである行を削除
thema01 = thema_data.iloc[:,0]
thema = thema01[0]
print(‘テーマ名=’,thema)
# コード表読み込み
code_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’code表‘)
code_data = code_data.dropna(how=’all’) # 全列がNaNである行を削除
# コードcode_list01読み込み
code01 = code_data.iloc[:,1]
code_list01 =[]
for str1 in code01:
code_list01.append(str1)
print(‘コード数=’,len(code_list01))
print(‘コード[0:5]=’,code_list01[0:5])
# コード内容code_list02読み込み
code02 = code_data.iloc[:,2]
code_list02 =[]
for str1 in code02:
code_list02.append(str(str1))
print(‘コード内容[0:3]=’,code_list02[0:3])
# 年別発行件数読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’年別発行件数集計‘)
# 年別発行件数nyken_list読み込み
pd_data1 = pd_data.iloc[:,1]
# nenlast = len(pd_data1)
ntot = 0
nyken_list = []
nyken_list2 = [] # 追加件数
nyken_list3 = [] # 合計件数
# for str1 in pd_data1:
for n1, str1 in enumerate(pd_data1):
nyken_list.append(int(str1))
ntot = ntot + str1
nn = int(str1)
if n1 == nenlast – 1:
nn = nn*npmend # 月数補正
nn = round(nn,1)
nyken_list2.append(nn)
nyken_list3.append(str1+nn)
else:
nyken_list2.append(0)
nyken_list3.append(str1)
print(‘発行件数=’,nyken_list)
print(‘追加補正係数=’,npmend)
print(‘追加予想件数=’,nyken_list2)
print(‘合計発行件数=’,nyken_list3)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント書き出し
if npmend > 0:
wrd1 = ‘ ‘ + str(pystt) + ‘年~‘ +str(pyend) + ‘年‘ + str(monthend) + ‘月末の間に発行された‘ + thema + ‘に関する分析対象公報の合計件数は‘ + str(ntot) + ‘件であった。\n’
else:
wrd1 = ‘ ‘ + str(pystt) + ‘年~‘ +str(pyend) + ‘年の間に発行された‘ + thema + ‘に関する分析対象公報の合計件数は‘ + str(ntot) + ‘件であった。\n’
wrd2 = ‘ ‘ + fig_n + ‘はこの分析対象公報を発行年別に集計し、縦棒グラフにしたものである。\n’
if npmend > 0:
wrd3 = ‘ ※ 調査最終年が12ヶ月未満の場合には、実際の発行件数を青色、その後の発行予想件数を橙色で示している(以下、同じ)。\n’
wrd =wrd1 + wrd2 + wrd3
else:
wrd =wrd1 + wrd2
print(‘wrd=’,wrd)
wrd2_1_1= wrd
print(fig_n)
# 描画データ設定
labels = py_list
data = nyken_list
data2 = nyken_list2
# 表示位置設定
x_width = 0.5
x_loc = np.array(range(len(data))) + x_width
# グラフの大きさを設定
fig = plt.figure(figsize=(13.0, 4.0))
# タイトル、ラベルを設定
plt.title(“公報発行件数の年別推移“, fontsize=20)
plt.xlabel(“発行年“, fontsize=18)
plt.ylabel(“発行件数“, fontsize=18)
plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘) # 棒グラフの設定
plt.xticks(x_loc, labels,fontsize=14) # x軸にラベル設定
if npmend > 0: # 追加補正係数>0ならば予想件数を表示
plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘)
plt.grid() # 罫線追加
# 追加補正係数>0ならば予想件数を表示
if npmend > 0:
plt.legend()
# 棒グラフ内に数値を書く
hx =(ntot/len(data))/30 # 書き込み位置を上に修正
for x, y in zip(x_loc, data):
plt.text(x, y+hx, y, ha=’center’, va=’bottom’) # 数値の書き込み位置をhx上に修正
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
plt.show()
# 2-1 発行件数年別推移のコメント
# 調査年数nnen算出
nnen = int(pyend) – int(pystt) + 1
# def bargraph_comment実行 / IN=(py_list,nyken_list)、OUT=wrd
print(‘list2=’,py_list) # 発行年
print(‘list3=’,nyken_list) # 発行件数
print(‘合計発行件数=’,nyken_list3)
wrd = bargraph_comment(py_list,nyken_list3)
# print(‘def_wrd=’,wrd)
# コメント作成
wrd1 = ‘ このグラフによれば、‘ + thema + ‘に関する公報件数は‘ + wrd + ‘\n’
# まとめに追加
wrd2= ‘ 今回の調査テーマ「‘ + thema + ‘」に関する公報件数は‘ + wrd + ‘\n’
f = open(“matome.txt”, “w”)
f.write(str(wrd2) + ‘\n’)
f.close()
# コメント追加
wrd2 = ‘ ※ 上記「最終年近傍」は最終年を含む3年としている。\n’
wrd3= ‘ ※ 出願時期は、一般的には発行日の1年6ヶ月以前である。\n’
wrd = wrd1 + wrd2 + wrd3
# コメント書き出し
print(‘wrd=’,wrd)
wrd2_1_2=wrd
# print(fig_n,’、‘,hyo_n)
# スクリブト53 第二章 全体分析 発行件数の年別推移(コメント書き出し)
print(”)
print(‘出力サンプル‘)
# 図表Noの初期値設定
nfig = 0
fig_n = ‘図‘ + str(nfig)
nhyo = 0
hyo_n = ‘表‘ + str(nhyo)
para = doc.add_paragraph(‘第二章 全体分析‘)
para.runs[npara].font.size = docx.shared.Pt(16)
para.runs[npara].bold = True
para = doc.add_paragraph(‘2-1 発行件数の年別推移‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd2_1_1)
para = doc.add_paragraph(wrd2_1_1)
nfig = nfig+ 1
fig_n = ‘図‘ + str(nfig)
print(fig_n)
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(‘ ‘ + wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd2_1_2)
para = doc.add_paragraph(wrd2_1_2)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト54 2-2 出願人別発行件数の割合(図表とコメント作成)
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nhyo = nhyo + 1
hyo_n = ‘表‘ + str(nhyo)
wrd1 = ‘ ‘ + hyo_n + ‘は本テーマの分析対象公報を公報発行件数が多い上位10社とその他の出願人について集計した集計表である。\n’
wrd2 = ‘ ※ 件数は持ち分として共同出願人数で按分している。\n’
wrd = wrd1 + wrd2
# コメント書き出し
wrd2_2_1= wrd
print(wrd2_2_1)
# 出願人別集計読み込み
ap_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人別集計‘)
ap_data = ap_data.dropna(how=’all’) # 全列がNaNである行を削除
nlimit = 10
# 出願人読み込み
ap01 = ap_data.iloc[:,0]
ap01_list =[]
for n1,str1 in enumerate(ap01):
if len(str1) > 30:
str1 = str1[0:29] + ‘\n’+str1[29:59]
ap01_list.append(str1)
if n1>= nlimit-1: break
nap = len(ap01_list)
print(‘出願人数=’,nap)
print(‘出願人名[0:5]=’,ap01_list[0:5])
# 発行件数読み込み
ap02 = ap_data.iloc[:,1]
nap02 = 0
ap02_list =[]
for n1, str1 in enumerate(ap02):
str1= round(str1,1)
ap02_list.append(float(str1))
nap02 = nap02 + str1
if n1>= nlimit-1: break
# 全発行件数算出
naptot = 0
for str1 in ap02:
naptot = naptot + float(str1)
# その他と合計を追加
ap01_list.append(‘その他‘)
ap01_list.append(‘合計‘)
naphoka=round((naptot – nap02),1) # その他の件数
if naphoka < 0: naphoka = 0
ap02_list.append(naphoka)
naptot01=round(naptot,1)
ap02_list.append(naptot01 )
# %計算
ap03_list = []
for str1 in ap02_list:
str2 = (str1/naptot)*100
str2=round(str2,1)
ap03_list.append(str2)
# 上位10社の発行件数集計表
df1 = pd.DataFrame(data=ap01_list,columns=[‘出願人‘])
df2 = pd.DataFrame(data=ap02_list,columns=[‘発行件数‘])
df3 = pd.DataFrame(data=ap03_list,columns=[‘%’])
df4 = pd.concat([df1,df2,df3], axis=1)
# 表の作成
nx = 2
ny = len(ap01_list)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)]
# 縦軸設定
for y, str1 in enumerate(ap01_list):
arr1[y][0] = str1
# 発行年別の発行件数
for y, str1 in enumerate(ap02_list):
arr1[y][1] = str1
# %追加
for y, str1 in enumerate(ap03_list):
arr1[y][2] = str1
table_vals = arr1
fig = plt.figure()
ax = fig.add_subplot(111) # nrows,ncols,indexが全て一桁のときは、カンマを省略して111で良い
print(hyo_n)
# 描画
col_labels = [‘出願人‘, ‘発行件数‘,’%’]
the_table = plt.table(cellText=table_vals,
colWidths=[0.4, 0.1, 0.1], # 列の幅を指定
colLabels=col_labels,
loc=’center’)
the_table.scale(4, 4)
the_table.auto_set_font_size(False)
the_table.set_fontsize(18)
for x in range(3):
the_table[(0,x)].set_facecolor(‘lightgreen’) # ヘッダを薄緑色に着色
the_table[(0,x)].get_text().set_fontsize(’24’) # フォントサイズ=24
the_table[(0,x)].get_text().set_fontweight(‘bold’) # フォント種=bold
for j in range(nap+2):
the_cell = the_table[j+1,0]
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘center’)
plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)
plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)
for pos in [‘right’,’top’,’bottom’,’left’]:
plt.gca().spines[pos].set_visible(False)
# 図表書き出し
plt.savefig(‘書き出し図表/’ + hyo_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
plt.show()
# ソート
arr4 = df4.values
arr4 = arr4[0:11] # 合計を除く
arr4 = sorted(arr4, key=lambda x:x[1], reverse=True) # 逆順
# 株式会社を空白に置換
ap011_list = []
for str1 in arr4:
str2 = str1[0].replace(“株式会社“, “”) # “株式会社“を消去
str2 = str2.replace(“国立大学法人“, “”) # “国立大学法人“を消去
str2 = str2.replace(“公立大学法人“, “”) # “公立大学法人“を消去
str2 = str2.replace(“学校法人“, “”) # “学校法人“を消去
str2 = str2.replace(“地方独立行政法人“, “”) # “地方独立行政法人“を消去
str2 = str2.replace(“独立行政法人“, “”) # “独立行政法人“を消去
str2 = str2.replace(“国立研究開発法人“, “”) # “国立研究開発法人“を消去
str2 = str2.replace(“一般財団法人“, “”) # “一般財団法人“を消去
str2 = str2.replace(“公益財団法人“, “”) # “公益財団法人“を消去
ap011_list.append(str2)
if naphoka > ap02_list[0]:
wrd1 = ‘ この集計表によれば、その他を除くと、第1位は‘
else:
wrd1 = ‘ この集計表によれば、第1位は‘
wrd2 = ap01_list[0] + ‘であり、‘ # その他を除く1位の出願人略称
wrd3 = str(ap03_list[0]) # その他を除く1位の%
wrd = wrd1 + wrd2 + wrd3 + ‘%であった。\n’
# まとめに追加
wrd4 = ‘ 出願人別に集計した結果によれば、第1位は‘ + wrd2 + wrd3 + ‘%であった。‘
f = open(“matome.txt”, “a”)
f.write(str(wrd4) + ‘\n’)
f.close()
# コメント書き出し
wrd2_2_2= wrd
arr5 =ap011_list[2:11] # 2位~10位に絞り込み
wrd4 = ”
for n1, str1 in enumerate(arr5):
if n1== 0:
wrd4 = str1
else:
wrd4 =wrd4 + ‘、‘ + str1
wrd4 = wrd4.replace(‘\n’,”) # 改行を削除
# コメント追加
wrd4 = ‘ 以下、‘ + wrd4
wrd5 = wrd4 + ‘と続いている。\n’
# まとめに追加
f = open(“matome.txt”, “a”)
f.write(str(wrd5) + ‘\n’)
f.close()
# コメント書き出し
print(‘wrd=’,wrd)
wrd2_2_3= wrd
# print(fig_n,’、‘,hyo_n)
# スクリブト55 2-2 出願人別発行件数の割合(コメント書き出し)
print(”)
print(‘出力サンプル‘)
# コメント書き出し
doc.add_page_break() # 改頁
para = doc.add_paragraph(‘2-2 出願人別発行件数の割合‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd2_2_1)
para = doc.add_paragraph(wrd2_2_1)
doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)
wrd = hyo_n
para = doc.add_paragraph(‘ ‘ + wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd2_2_2)
para = doc.add_paragraph(wrd2_2_2)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト56 2-2 出願人別円グラフ)(図表とコメント作成)
print(”)
print(‘出力サンプル‘)
# データ読み込み
fig_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人別集計‘)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント追加
wrd = ‘ ‘ + fig_n + ‘は上記集計結果を円グラフにしたものである。\n’
print(wrd)
wrd2_2_4 = wrd
# 出願人読み込み
pd_data0 = fig_data.iloc[:,0]
list2 =[]
for str1 in pd_data0:
list2.append(str1)
# 発行件数読み込み
pd_data1 = fig_data.iloc[:,1]
list3 = []
ntot = 0
for str1 in pd_data1:
list3.append(str1)
ntot = ntot + str1
# 上位10読み込み
n10 = []
ap10 = []
fullap10 = []
ntot10 = 0
for n in range(10):
n10.append(list3[n])
ntot10 =ntot10 + list3[n]
str2 = list2[n].replace(“株式会社“, “”) # “株式会社“を消去
str2 = str2.replace(“国立大学法人“, “”) # “国立大学法人“を消去
str2 = str2.replace(“公立大学法人“, “”) # “公立大学法人“を消去
str2 = str2.replace(“学校法人“, “”) # “学校法人“を消去
str2 = str2.replace(“地方独立行政法人“, “”) # “地方独立行政法人“を消去
str2 = str2.replace(“独立行政法人“, “”) # “独立行政法人“を消去
str2 = str2.replace(“国立研究開発法人“, “”) # “国立研究開発法人“を消去
str2 = str2.replace(“一般財団法人“, “”) # “一般財団法人“を消去
str2 = str2.replace(“公益財団法人“, “”) # “公益財団法人“を消去
ap10.append(str2)
fullap10.append(list2[n])
n10.append(ntot-ntot10)
ap10.append(‘その他‘)
fullap10.append(‘その他‘)
print(fig_n)
# 凡例
hanrei_nm = fullap10 # 出願人名を凡例として格納
# 円グラフ作成
plt.pie(n10, labels=ap10, autopct=”%1.1f%%”,pctdistance=0.9,radius=1.5,
startangle=90,counterclock=False)
# 円グラフの右横=1.5の位置に高さ=1で描画
plt.legend(hanrei_nm, fontsize=14,bbox_to_anchor=(1.5, 1)) # 凡例の表示
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
plt.show()
# コメント作成
np = round((ntot10/ntot)*100,1) # 小数点以下1位で%表示
wrd = “ このグラフによれば、上位10社で” + str(np) + “%を占めている。“
m05_wrd01 = ” この上位10社で” + str(np) + “%を占めている。“
if np<35:
wrd = “ このグラフによれば、上位10社だけでは” + str(np) + “%を占めているに過ぎず、多数の出願人に分散しているようである。“
m05_wrd01 = ” この上位10社だけでは” + str(np) + “%を占めているに過ぎず、多数の出願人に分散しているようである。“
if np>45:
wrd = “ このグラフによれば、上位10社だけで” + str(np) + “%を占めており、少数の出願人に集中しているようである。“
m05_wrd01 = “ この上位10社だけで” + str(np) + “%を占めており、少数の出願人に集中しているようである。“
wrd =wrd + ‘\n’
print(wrd)
wrd2_2_5 = wrd
print(‘m05_wrd01=’,m05_wrd01)
# まとめに追加
f = open(“matome.txt”, “a”)
f.write(m05_wrd01+ ‘\n’)
f.close()
# print(fig_n,’、‘,hyo_n)
# スクリブト57 2-2 出願人別発行件数の割合(コメント書き出し)
print(”)
print(‘出力サンプル‘)
fig_n = ‘図‘ + str(2)
# print(fig_n)
print(wrd2_2_4 )
para = doc.add_paragraph(wrd2_2_4 ) # 第2図は上記集計結果を円グラフ
#図No追加
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd2_2_5)
para = doc.add_paragraph(wrd2_2_5) # このグラフによれば、上位10社
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,hyo_n)
# スクリブト58 2-3 出願人数の年別推移(図表とコメント作成)
import numpy as np
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
wrd1 = ‘ ‘ + fig_n + ‘は本テーマの分析対象公報の出願人数を発行年別に集計し、縦棒グラフにしたものである。\n’
wrd2 = ‘ ※ 同じ年の出願人の重複は除去して集計している。\n’
wrd = wrd1 + wrd2
print(‘wrd=’,wrd)
wrd_2_3_1 = wrd
# 年別出願人数読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人数年別集計‘)
# 年別出願人数読み込み
pd_data1 = pd_data.iloc[:,1]
ntot = 0
nyken_list = []
nyken_list2 = [] # 追加件数
nyken_list3 = [] # 合計件数
for n1, str1 in enumerate(pd_data1):
nyken_list.append(str1)
ntot = ntot + str1
if n1 == nenlast – 1:
nn2 = str1*npmend # 月数補正
nn2 = round(nn2,1)
nyken_list2.append(nn2)
nyken_list3.append(str1+nn2)
else:
nyken_list2.append(0)
nyken_list3.append(str1)
print(‘出願人数=’,nyken_list)
print(‘追加補正係数=’,npmend)
print(‘追加予想出願人数=’,nyken_list2)
print(‘合計出願人数=’,nyken_list3)
# print(‘出願人数合計=’,ntot)
print(fig_n)
# 描画データ設定
labels = py_list
data = nyken_list
data2 = nyken_list2
# 表示位置設定
x_width = 0.5
x_loc = np.array(range(len(data))) + x_width
# グラフの大きさを設定
fig = plt.figure(figsize=(13.0, 4.0))
# タイトル、ラベルを設定
plt.title(“出願人数の年別推移“, fontsize=20)
plt.xlabel(“発行年“, fontsize=18)
plt.ylabel(“出願人数“, fontsize=18)
plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘) # 棒グラフの設定
plt.xticks(x_loc, labels, fontsize=14) # x軸にラベル設定
if npmend > 0: # 追加補正係数>0ならば予想件数を表示
plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘) # 棒グラフの設定
plt.grid() # 罫線追加
# 追加補正係数>0ならば予想件数を表示
if npmend > 0:
plt.legend()
# 棒グラフ内に数値を書く
hx = (ntot/len(data))/30 # 書き込み位置を上に修正
for x, y in zip(x_loc, data):
plt.text(x, y+hx, y, ha=’center’, va=’bottom’) # 数値の書き込み位置をhx上に修正
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
plt.show()
# def bargraph_comment実行
print(‘list2=’,py_list) # 発行年
print(‘list3=’,nyken_list) # 出願人数
print(‘合計出願人数=’,nyken_list3)
wrd = bargraph_comment(py_list,nyken_list3)
# print(wrd)
# 2-3 出願人数年別推移のコメント
wrd = ‘ このグラフによれば、出願人数は‘ + wrd + ‘\n’
print(‘wrd=’,wrd)
# コメントコピー
wrd_2_3_2 = wrd
# print(fig_n,’、‘,hyo_n)
# スクリブト59 2-3 出願人数の年別推移(コメント書き出し)
print(”)
print(‘出力サンプル‘)
fig_n = ‘図‘ + str(3)
# print(fig_n)
# doc.add_page_break() # 改頁
para = doc.add_paragraph(‘2-3 出願人数の年別推移‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd_2_3_1)
para = doc.add_paragraph(wrd_2_3_1) # 第1表は本テーマの分析対象公報
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd_2_3_2)
para = doc.add_paragraph(wrd_2_3_2) # このグラフによれば、上位10社
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト60 2-4 出願人別発行件数の年別推移(折線グラフ)(図表とコメント作成)
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
wrd1 = ‘ ‘ + fig_n + ‘は本テーマに関係する主要出願人の発行件数が年毎にどのように推移しているかを見るためのものであり、‘
wrd2 = ‘公報発行件数が多い上位10社について公報発行件数を発行年別に集計し、折線グラフにしたものである。\n’
wrd3 = ‘ ※ 件数は持ち分として共同出願人数で按分している。(以下、この注釈は省略する)\n’
wrd = wrd1 + wrd2 + wrd3
print(wrd)
# コメントコピー
wrd_2_4_1 = wrd
# 年別出願人数読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人別年別集計‘)
nclm=(len(pd_data.columns)) # 出願人欄から合計欄まで
# 読み込みデータ全体をDataFrameに変換
df00 = pd.DataFrame(pd_data)
# dataframeをarrayに変換
arr00 = df00.values
##発行年読み込み
nen_data = pd_data.columns[1:nclm-1] # 発行年のminからmaxまで
nen_list = []
for str1 in nen_data:
str1 = str(str1) + ‘年‘
nen_list.append(str1)
nnen = len(nen_list)
print(‘発行年=’,nen_list)
# ベスト(nbest)設定
nbest=10
## 出願人読み込み
ap_list =[]
for n1, str1 in enumerate(arr00):
if n1 == nbest: break
ap_list.append(str1[0])
print(‘出願人=’,ap_list)
## 表内数値読み込み
arr_nxny = []
for n1, str1 in enumerate(arr00):
if n1 == nbest: break
list01 = []
for n2, nn1 in enumerate(str1):
if n2 > 0:
nn1 = round(nn1,1)
if n2 < nnen+1:
nn1 = round(nn1,1)
if n2 < nnen+1:
list01.append(nn1)
arr_nxny.append(list01)
print(‘arr_nxny=’,arr_nxny)
# 最終年の件数を補正
nmax = 0
arr01 = []
cd01 = []
nxy_list0 = []
for n1, str1 in enumerate(arr_nxny):
arr02 = []
list0 = []
for n2, str2 in enumerate(str1):
if str2 > nmax: nmax = str2
list0.append(str2)
if (n2+1) == nenlast:
str2 = str2*(npmend+1) # 最終年の件数を補正
str2 = round(str2,1)
arr02.append(str2)
else:
arr02.append(str2)
arr01.append(arr02)
nxy_list0.append(list0)
print(‘元の件数=’,nxy_list0)
print(‘月数補正後の件数=’,arr01)
# 変数名修正
nen_list = nen_list
code_list = ap_list
arr_nxny = arr01
g_title = ‘出願人別発行件数の年別推移‘
# def実行
wrd = ”
wrd01,wrd02 = oresen_comment(nen_list,code_list,arr_nxny,fig_n, g_title)
print(‘wrd01=’,wrd01)
wrd02 = wrd02.replace(‘次のコード‘,’次の出願人‘)
bwd = code_list[0]
wrd02 = wrd02.replace(bwd,”)
print(‘wrd02=’,wrd02)
# スクリブト61 2-4 出願人別発行件数の年別推移(コメント書き出し)
print(”)
print(‘出力サンプル‘)
para = doc.add_paragraph(‘2-4 出願人別発行件数の年別推移‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd_2_4_1)
para = doc.add_paragraph(wrd_2_4_1) # ex:図4は本テーマに関係する主要出願人の発行件数
para.runs[npara].font.size = docx.shared.Pt(11)
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd01)
para = doc.add_paragraph(wrd01)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
print(wrd02)
para = doc.add_paragraph(wrd02) # このグラフによれば、上位10社
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# print(fig_n,’、‘,hyo_n)
# スクリブト62 2-4 出願人別発行件数の年別推移(バブルチャート)(図表とコメント作成)
import numpy as np
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント追加
wrd1 = ‘ ‘ + fig_n + ‘はこの集計結果を数値付きバブルチャートにしたものである。\n’
if npmend > 0:
wrd2 = ‘ 最終年は発行予想件数を加算した件数を使用している(以下、同じ)。\n’
else:
wrd2 = ”
wrd = wrd1 + wrd2
print(wrd)
# コメントコピー
wrd_2_4_5 = wrd
# 年別出願人数読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’出願人別年別集計‘)
#出願人読み込み
ap_data = pd_data.iloc[:,0]
ap_list =[]
ap_list01 =[]
for n1, str1 in enumerate(ap_data):
if n1 >= nbest: break
ap_list01.append(str1)
str2 = str1.replace(“株式会社“, “”) # “株式会社“を消去
str2 = str2.replace(“国立大学法人“, “”) # “国立大学法人“を消去
str2 = str2.replace(“公立大学法人“, “”) # “公立大学法人“を消去
str2 = str2.replace(“学校法人“, “”) # “学校法人“を消去
str2 = str2.replace(“地方独立行政法人“, “”) # “地方独立行政法人“を消去
str2 = str2.replace(“独立行政法人“, “”) # “独立行政法人“を消去
str2 = str2.replace(“国立研究開発法人“, “”) # “国立研究開発法人“を消去
str2 = str2.replace(“一般財団法人“, “”) # “一般財団法人“を消去
str2 = str2.replace(“公益財団法人“, “”) # “公益財団法人“を消去
ap_list.append(str1)
nnen = len(nen_list)
# 発行件数nxy_list読み込み
nenlast = nnen
nmax = 0
nxy_list = []
nxy_list0= []
for n1 in range(nap):
if n1 >= nbest:break
nx_list = []
nx_list0 = []
for n2 in range(nnen+1):
if n2 > 0:
str1 = pd_data.iloc[n1,n2]
str1 = round(str1,1)
if n2 == nenlast :
nx_list0.append(str1)
str1 = str1*(npmend + 1)
str1 = round(str1,1)
nx_list.append(str1)
else:
nx_list.append(str1)
nx_list0.append(str1)
if nmax < int(str1): nmax = int(str1)
nxy_list.append(nx_list)
nxy_list0.append(nx_list0)
print(‘元の件数=’,nxy_list0)
print(‘月数補正後の件数=’,nxy_list)
# 変数名変更
x_list = nen_list
y_list = ap_list
print(‘x_list=’,x_list)
print(‘y_list=’,y_list)
print(‘nxy_list=’,nxy_list)
print(fig_n)
# def buble0実行
buble0(x_list,y_list,nxy_list,fig_n)
# 2-4 出願人別発行件数の年別推移(バブルチャート)のコメント
# 最終年が最多の出願人を抽出
nap = len(ap_list)
npk_list = []
pkap_list = []
for n1, str1 in enumerate(ap_list01):
nxy_list01 = nxy_list[n1]
np = 0
for n2, str2 in enumerate(nxy_list01):
if str2>np:
np=str2 # ピーク件数
pknen = n2+1 # ピーク年
if pknen==nnen: # 最終年がピークならば
pkap_list.append(str1)
np = round(np,1)
npk_list.append(np)
n2 = len(pkap_list) # 最終年が最多の出願人数
# コメント追加
if n2 > 0:
wrd1 = ‘ このチャートによれば、次の出願人は最終年が最多となっている。\n’
# 最終年が最多の出願人書き出し
wrd2 =”
for str1 in pkap_list: # 最終年が最多の出願人
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if n2 == 0:
wrd = ‘ このチャートによれば、最終年が最多となっている出願人は無かった。\n’
# 増加した出願人コピー
wrd_2_4_6 = wrd
print(wrd_2_4_6)
# 重要出願人を抽出
## 最終年の件数が平均以上でかつピーク時の80%以上(ただし0件以外の平均)でかつ増加率が100%以上か
## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要出願人として書出す
#最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出
ct = 0
ntot = 0
nlast_list = []
nmae_list = []
for n in range(nap):
n0 = nxy_list[n][nnen-1] # 最終年の件数
if n0 > 0: ct = ct + 1
nlast_list.append(n0)
n1 = nxy_list[n][nnen-2] # 最終年前年の件数
nmae_list.append(n1)
ntot = ntot + n0
if ct > 0:
navr = round(ntot/ct,1) # 最終年の平均件数(ただし0件以外の平均)
else:
navr = 0
print(‘最終年の平均件数=’,navr,’対象件数=’,ct)
# 重要出願人を判定
vipap_list = []
for n1, str1 in enumerate(ap_list01):
flg = 0
if nlast_list[n1] > navr: # 最終年の件数が平均以上
if nlast_list[n1] > (npk_list[n1]*0.8): # ピーク時の80%以上
if nmae_list[n1] > 0:
if (nlast_list[n1]/nmae_list[n1]) > 1: #増加率が100%以上
vipap_list.append(str1)
flg = 1
if flg == 0:
if nlast_list[n1] > navr: # 最終年の件数が平均以上
if nlast_list[n1] > (npk_list[n1]*0.95): # ピーク時の95%以上
vipap_list.append(str1)
# コメント追加
wrd1 = ‘ 下記条件を満たす重要出願人は次のとおり。\n’
# 重要出願人書き出し
wrd2 =”
for str1 in vipap_list:
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if wrd2 != ”:
wrd = ‘ 下記条件を満たす重要出願人は次のとおり。\n’ + wrd2
else:
wrd = ‘ 下記条件を満たす重要出願人は無かった。\n’
print(wrd)
# 増加した出願人コピー
wrd_2_4_7 = wrd
if wrd2 != ”:
m08_wrd01 = ‘ 特に、重要と判定された出願人は次のとおり。\n’ + wrd2
else:
m08_wrd01 = ‘ 特に、重要と判定された出願人は無かった。\n’
# まとめに追加
f = open(“matome.txt”, “a”)
f.write(m08_wrd01 + ‘\n’)
f.close()
# コメント追加
wrd1 = ‘ ※最終年の件数が平均以上でかつピーク時の80%以上でかつ増加率が100%以上か、‘
wrd2 = ‘または最終年の件数が平均以上でかつピーク時の95%以上。以下、この条件を「所定条件」という。\n’
wrd = wrd1 + wrd2
# コピー
wrd_2_4_8 = wrd
print(wrd_2_4_8)
# print(fig_n,’、‘,hyo_n)
# スクリブト63 2-4 出願人別発行件数の年別推移(コメント書き出し)
print(”)
print(‘出力サンプル‘)
print(wrd_2_4_5)
para = doc.add_paragraph(wrd_2_4_5) # 第1表は本テーマの分析対象公報
para.runs[npara].font.size = docx.shared.Pt(11)
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd_2_4_6)
para = doc.add_paragraph(wrd_2_4_6)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
print(wrd_2_4_7)
para = doc.add_paragraph(wrd_2_4_7)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
print(wrd_2_4_8)
para = doc.add_paragraph(wrd_2_4_8)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト64 2-5 メイングループ別発行件数の分布(図表とコメント作成)
import numpy as np
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント追加
wrd = ‘ ‘ + fig_n + ‘はIPCのメイングループ分類別に発行公報を集計し、上位20位までを縦棒グラフにしたものである。\n’
# コメントコピー
wrd_2_5_1 = wrd
print(wrd_2_5_1)
# 年別出願人数読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’メインG別年別集計‘)
# ベストnを設定
nbest = 20
# メインG読み込み
pd_data0 = pd_data.iloc[:,0]
k = 0
maing_list =[]
for str1 in pd_data0:
k = k + 1
if k > nbest: break
str1 = str1 + ’00’
maing_list.append(str(str1))
# 合計読み込み
pd_data1 = pd_data.iloc[:,nnen+1]
k = 0
ntot = 0
nken_list = []
for nn1 in pd_data1:
k = k + 1
if k > nbest: break
nken_list.append(nn1)
ntot = ntot +nn1
# DataFrame化
df1 = pd.DataFrame(data=maing_list, columns=[‘メインG‘])
df2 = pd.DataFrame(data=nken_list, columns=[‘メインG別合計件数‘])
# 結合
df3=pd.concat([df1, df2], axis=1)
# メインGでソート
df3 = df3.sort_values(‘メインG‘, ascending=True) # 昇順
# リストに分解
maing_list01 = df3.iloc[:,0]
nken_list01 = df3.iloc[:,1]
# データ設定
labels = maing_list01
data = nken_list01
# 表示位置設定
x_width = 0.5
x_loc = np.array(range(len(data))) + x_width
print(fig_n)
# グラフの大きさを設定
fig = plt.figure(figsize=(13.0, 4.0))
# タイトル、ラベルを設定
gtitle=”メイングループ別ベスト” + str(nbest) +”の発行件数分布“
plt.title(gtitle, fontsize=20)
plt.xlabel(“メイングループ“, fontsize=18)
plt.ylabel(“発行件数“, fontsize=18)
plt.bar(x_loc, data, width=x_width,color=’C0′) # 棒グラフの設定
# x軸にラベル設定(45度回転)
plt.xticks(x_loc, labels, rotation=45,fontsize=14) # x軸にラベル設定
plt.grid() # 罫線追加
# 棒グラフ内に数値を書く
hx = (ntot/len(data))/30 # 書き込み位置を上に修正
for x, y in zip(x_loc, data):
plt.text(x, y+hx, y, ha=’center’, va=’bottom’) # 数値の書き込み位置をhx上に修正
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
plt.show()
# 2-5 メイングループ別発行件数の分布(棒グラフ)のコメント
# IPC分類表読み込み
ipc_data = pd.read_excel(‘IPC分類表.xlsx’,sheet_name=’メイングループ表‘)
ipc_data = ipc_data.dropna(how=’all’) # 全列がNaNである行を削除
maing01 = ipc_data.iloc[:,1]
maing_list01 = maing01[0:]
mgtitle01 = ipc_data.iloc[:,2]
mgtitle_list01 = mgtitle01[0:]
# 上位メインGに分類内容と件数を結合
mg_title_list =[]
for n1, str1 in enumerate(maing_list):
for n2, str2 in enumerate(maing_list01):
if str1 == str2:
str3 = str1 + “:” + mgtitle_list01[n2] + “(” +str(nken_list[n1]) + “件)”
mg_title_list.append(str3)
mg_title_list = sorted(mg_title_list)
# コメント追加
wrd1 = ‘ これらのメイングループの内容は以下のとおり。\n’
# 上位メインG書き出し
wrd2 =”
for str1 in mg_title_list: # 上位メインG+分類内容+件数
str1 = str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
print(wrd)
# 上位メインGコピー
wrd_2_5_2 = wrd
# 重要メインG(=平均件数以上)を抽出
ntot = 0
for nn1 in nken_list:
ntot = ntot + nn1
npsum = 0
nlimit = ntot/nbest
mgv_list = []
for n1, nn1 in enumerate(nken_list):
if nn1 < nlimit: break
mgv_list.append(maing_list[n1])
nmgv = len(mgv_list)
# 重要メインGに分類内容を結合
mg_title2_list =[]
for n1, str1 in enumerate(mgv_list):
for n2, str2 in enumerate(maing_list01):
if str1 == str2:
str3 = str1 + “:” + mgtitle_list01[n2] + “(” +str(nken_list[n1]) + “件)”
mg_title2_list.append(str3)
break
mg_title2_list = sorted(mg_title2_list)
# 重要メインG数を書き出し
n2 =nmgv
print(‘重要メインG数=’,n2)
# コメント追加
wrd1 = ‘ この中で比較的多かったのは、次のメイングループである。\n’
# 重要メインG書き出し
wrd2 =”
for str1 in mg_title2_list: # 重要メインG+分類内容+件数
str1 = str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
print(wrd)
# 重要メインGコピー
wrd_2_5_3 = wrd
m09_wrd01 = ‘ IPC別に集計した結果によれば、重要メイングループは次のとおり。\n’ + wrd2
# まとめに追加
f = open(“matome.txt”, “a”)
f.write(m09_wrd01 + ‘\n’)
f.close()
# print(fig_n,’、‘,hyo_n)
# スクリブト65 2-5 IPC別発行件数の年別推移(コメント書き出し)
print(”)
print(‘出力サンプル‘)
doc.add_page_break() # 改頁
para = doc.add_paragraph(‘2-5 メイングループ別発行件数の分布‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd_2_5_1)
para = doc.add_paragraph(wrd_2_5_1) # 第1表は本テーマの分析対象公報
para.runs[npara].font.size = docx.shared.Pt(11)
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd_2_5_2)
para = doc.add_paragraph(wrd_2_5_2)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
print(wrd_2_5_3)
para = doc.add_paragraph(wrd_2_5_3)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト66 2-6 IPC別発行件数の年別推移(バブルチャート)(図表とコメント作成)
import numpy as np
print(”)
print(‘出力サンプル‘)
# 上位メインG数の設定
nbest = 20
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント追加
wrd1 = ‘ ‘ + fig_n + ‘はIPCのメイングループ分類別の発行件数を年別に集計し、‘
wrd2 = ‘上位20位までを数値付きバブルチャートにしたものである。\n’
wrd = wrd1 + wrd2
print(wrd)
# コメントコピー
wrd_2_6_1 = wrd
# メインG数読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’メインG別年別集計‘)
#メインG読み込み
maing_data = pd_data.iloc[:,0]
maing_list =[]
for n1, str1 in enumerate(maing_data):
if n1 == nbest: break # nbestでループ終了
str1 = str1 + ’00’
maing_list.append(str1)
nmg=len(maing_list)
# 発行年読み込み
nen_data = pd_data.columns[1:nnen+1] # 発行年
nen_list = []
for str1 in nen_data:
str1 = str(str1) + ‘年‘
nen_list.append(str1)
# カラム数読み込み
nclm=(len(pd_data.columns))
# 発行件数読み込み
nenlast = len(nen_list)
nmax = 0
nxy_list = []
nxy_list0 = []
for n1 in range(nmg):
nx_list = []
nx_list0 = []
for n2 in range(nclm-1):
if n2>0:
str1 = pd_data.iloc[n1,n2]
if n2 == nenlast :
nx_list0.append(str1)
str1 = str1*(npmend + 1)
str1 = round(str1,1)
nx_list.append(str1)
else:
nx_list.append(str1)
nx_list0.append(str1)
if nmax < str1: nmax = str1
nxy_list.append(nx_list)
nxy_list0.append(nx_list0)
print(‘元の件数=’,nxy_list0)
print(‘月数補正後の件数=’,nxy_list)
# 変数名変更
x_list = nen_list
y_list = maing_list
print(‘x_list=’,x_list)
print(‘y_list=’,y_list)
print(‘nxy_list=’,nxy_list)
print(fig_n)
# def buble0実行
buble0(x_list,y_list,nxy_list, fig_n)
# 2-6 IPC別発行件数の年別推移(バブルチャート)のコメント
# 最終年が最多のメインGを抽出
nnen = len(nen_list)
nmg =len(maing_list)
npk_list = []
pkmg_list = []
for n1, str1 in enumerate(maing_list):
nxy_list01 = nxy_list[n1]
np1 = 0
for n2, str2 in enumerate(nxy_list01):
if str2>np1:
np1=str2 # ピーク件数
pknen = n2+1 # ピーク年
if pknen==nnen: # 最終年がピークならば
pkmg_list.append(str1)
np = round(np1,1)
npk_list.append(np1)
# ソート
pkmg_list= sorted(pkmg_list)
# メインGに分類内容と件数を結合
pkmg_title_list =[]
for n1, str1 in enumerate(pkmg_list):
for n2, str2 in enumerate(maing_list01):
if str1 == str2:
str3 = str1 + “:” + mgtitle_list01[n2] + “(” +str(nken_list[n1]) + “件)”
pkmg_title_list.append(str3)
# 最終年が最多のメインG数を書き出し
n2 = len(pkmg_list)
print(‘最終年が最多のメインG数=’,n2)
# コメント追加
flg_n2 = 0
if n2 > 0:
wrd1 = ‘ このチャートによれば、最終年が最多となっているメイングループは次のとおり。\n’
# 最終年が最多のメインG書き出し
wrd2 =”
for str1 in pkmg_title_list: # 最終年が最多のメインG
str1 = str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if n2 == 0:
wrd = ‘ このチャートによれば、最終年が最多のメイングループはなかった。\n’
# 増加したメインG書き出し
f = open(‘sub_txt.txt’, ‘a’)
f.write(wrd)
f.close()
wrd_2_6_2 = wrd
print(wrd_2_6_2)
# 重要メインGを抽出
## 最終年の件数が平均以上でかつピーク時の80%以上でかつ増加率が100%以上か
## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要メインGとして書出す
#最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出
ntot = 0
nlast_list = []
nmae_list = []
for n in range(nmg):
n0 = nxy_list[n][nnen-1] # 最終年の件数
nlast_list.append(n0)
n1 = nxy_list[n][nnen-2] # 最終年前年の件数
nmae_list.append(n1)
ntot = ntot + n0
navr = round(ntot/nmg,1) # 最終年の平均件数
# 重要メインGを判定
vipmg_list = []
for n1, str1 in enumerate(maing_list):
flg = 0
if nlast_list[n1] > navr: # 最終年の件数が平均以上
if nlast_list[n1] > (npk_list[n1]*0.8): # ピーク時の80%以上
if nmae_list[n1] > 0:
if (nlast_list[n1]/nmae_list[n1]) > 1: #増加率が100%以上
vipmg_list.append(str1)
flg = 1
if flg == 0:
if nlast_list[n1] > navr: # 最終年の件数が平均以上
if nlast_list[n1] > (npk_list[n1]*0.95): # ピーク時の95%以上
vipmg_list.append(str1)
# ソート
vipmg_list= sorted(vipmg_list)
# メインGに分類内容と件数を結合
vmg_title_list =[]
for n1, str1 in enumerate(vipmg_list):
for n2, str2 in enumerate(maing_list01):
if str1 == str2:
str3 = str1 + “:” + mgtitle_list01[n2] + “(” +str(nken_list[n1]) + “件)”
vmg_title_list.append(str3)
# 重要メインG数を書き出し
n2 = len(vipmg_list)
print(‘重要メインG数=’,n2)
# コメント追加
if n2 > 0:
wrd1 = ‘ 所定条件を満たす重要メインGは次のとおり。\n’
# 重要出願人書き出し
wrd2 =”
for str1 in vmg_title_list:
str1 = str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if n2 == 0:
if flg_n2 == 0:
wrd = ‘ 所定条件を満たす重要メインGはなかった。\n’
else:
wrd = ‘ 所定条件を満たす重要メインGもなかった。\n’
# 増加した出願人書き出し
f = open(‘sub_txt.txt’, ‘a’)
f.write(wrd)
f.close()
print(‘wrd=’,wrd)
wrd_2_6_3 = wrd
# print(fig_n,’、‘,hyo_n)
# スクリブト67 2-6 IPC別発行件数の年別推移(コメント書き出し)
print(”)
print(‘出力サンプル‘)
# doc.add_page_break() # 改頁
para = doc.add_paragraph(‘2-6 メイングループ別発行件数の年別推移‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd_2_6_1)
para = doc.add_paragraph(wrd_2_6_1) # 第1表は本テーマの分析対象公報
para.runs[npara].font.size = docx.shared.Pt(11)
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd_2_6_2)
para = doc.add_paragraph(wrd_2_6_2)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
print(wrd_2_6_3)
para = doc.add_paragraph(wrd_2_6_3)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト68 2-7 新規参入企業抽出(図表とコメント作成)
import numpy as np
print(”)
print(‘出力サンプル‘)
# 上位10に制限
nbest = 10
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント追加
wrd1 = ‘ ‘ + fig_n + ‘は分析対象公報全体を対象として各出願人の新規参入評価点を集計し、‘
wrd2 = ‘評価点が上位の出願人について年別発行件数を数値付きバブルチャートとして示したものである。\n’
wrd3 = ‘ ※調査開始年が0件でかつ合計件数と年平均件数が平均以上の出願人を抽出し、‘
wrd4 = ‘合計件数が上位10社までの年別発行件数を集計した。\n’
wrd5 = ‘ ※件数は持ち分として共同出願人数で按分している。‘
wrd6 = ‘(以下、これらの注釈は省略する。)’
wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5 + wrd6
print(wrd)
# コメントコピー
wrd_2_7_1 = wrd
# 年別出願人数読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’新規参入集計‘)
pd_data = pd_data.dropna(axis=0)
y = len(pd_data)
print(‘y=’,y)
x = len(pd_data.columns)
print(‘x=’,x)
# nbest,nap修正
if y <= 10: nbest = y
nap = nbest
print(‘nap=’,nap)
# リスト化
arr1 = pd_data.values
#出願人読み込み
ap_data = pd_data.iloc[:,0]
ap_list =[]
for n1, str1 in enumerate(ap_data):
if n1 == nbest: break
ap_list.append(str1)
# 発行年読み込み
nen_data = pd_data.columns[1:nnen+1]
nen_list = []
for str1 in nen_data:
str1 = str(str1) + ‘年‘
nen_list.append(str1)
nmax = 0
# 発行件数読み込み
nenlast = len(nen_list)
nxy_list = []
nxy_list0 = []
for n1 in range(nap):
nx_list = []
nx_list0 = []
for n2 in range(len(nen_list)+1):
if n2>0:
str1 = pd_data.iloc[n1,n2]
if n2 == nenlast :
nx_list0.append(str1)
str1 = str1*(npmend + 1)
str1 = round(str1,1)
nx_list.append(str1)
else:
nx_list.append(str1)
nx_list0.append(str1)
if nmax < str1: nmax = str1
nxy_list.append(nx_list)
nxy_list0.append(nx_list0)
print(‘元の件数=’,nxy_list0)
print(‘月数補正後の件数=’,nxy_list)
# 発行件数%化
npxy_list = []
for n1_list in nxy_list:
npx_list = []
for n2 in n1_list:
n3= round(n2/nmax,2)
npx_list.append(n3)
npxy_list.append(npx_list)
# 変数名変更
x_list = nen_list
y_list = ap_list
print(‘x_list=’,x_list)
print(‘y_list=’,y_list)
print(‘nxy_list=’,nxy_list)
print(fig_n)
# def実行
buble0(x_list,y_list,nxy_list, fig_n)
# 新規参入企業として重要と判定された出願人(最終年の件数>=3)を判定
# 最終年の件数読み込み
nken_data = pd_data.iloc[:,x-6] # 最終年の件数
nken_list =[]
for str1 in nken_data:
nken_list.append(str1)
newap_list = []
for n1, nn1 in enumerate(nken_list):
if n1 == nbest: break
if nn1 >= 3: # 重要と判定
newap_list.append(ap_list[n1])
print(‘重要と判定された新規参入企業=’,n2,newap_list)
# コメント追加
wrd2 =”
if n2 > 1:
wrd1 = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)は次のとおり。\n’
# 出願人書き出し
wrd2 =”
for str1 in newap_list:
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
print(wrd)
# コメント書き出し
wrd3 = ‘ ※ ここでは最終年の件数 > 3を重要とした。\n’
wrd = wrd + wrd3
wrd_2_7_2 = wrd
m10_wrd01 = ‘ 重要と判定された新規参入企業(出願人)は次のとおり。\n’ + wrd2
# まとめに追加
f = open(“matome.txt”, “a”)
f.write(m10_wrd01 + ‘\n’)
f.close()
if n2 <= 1:
if flg_n2 == 1: # チャートが無ければ
wrd = ‘ 新規参入企業として評価が高かった出願人は無かった。\n’
else:
wrd = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)は無かった。\n’
# コメント書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
print(‘wrd=’,wrd)
# 出願人コピー
wrd_2_7_2 = wrd
m10_wrd01 = ‘ 重要と判定された新規参入企業(出願人)は無かった。\n’
# まとめに追加
f = open(“matome.txt”, “a”)
f.write(m10_wrd01 + ‘\n’)
f.close()
if n2 == 0:
wrd1 = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)はなかった。\n’
wrd = wrd1
print(wrd)
# 出願人コピー
wrd_2_7_2 = wrd
# print(fig_n,’、‘,hyo_n)
# スクリブト69 2-7 新規参入企業(コメント書き出し)
print(”)
print(‘出力サンプル‘)
doc.add_page_break() # 改頁
para = doc.add_paragraph(‘2-7 新規参入企業‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd_2_7_1)
para = doc.add_paragraph(wrd_2_7_1) # 第1表は本テーマの分析対象公報
para.runs[npara].font.size = docx.shared.Pt(11)
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd_2_7_2)
para = doc.add_paragraph(wrd_2_7_2)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト70 2-8最新発行のサンプル公報(図表とコメント作成)
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nhyo = nhyo + 1
hyo_n = ‘表‘ + str(nhyo)
# コメント追加
wrd = ‘ ‘ + hyo_n + ‘は最近発行された公報の書誌事項をまとめた公報書誌リストである。‘
print(wrd)
# コメントコピー
wrd_2_8_1 = wrd
# 年別出願人数読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’最新サンプル公報‘)
y = len(pd_data)
x = len(pd_data.columns)
nclm = 4 # 書き出すカラム数を設定
arr1 = pd_data.values # リスト化
#公報番号読み込み
pn_data = pd_data.iloc[:,0]
pn_list =[]
for n1, str1 in enumerate(pn_data):
pn_list.append(str1)
npn=len(pn_list)
print(‘サンプル公報数=’,npn)
# 発行日読み込み
date_data = pd_data.iloc[:,1]
date_list = []
for str1 in date_data:
date_list.append(str1)
# 発明の名称読み込み(30文字/行までに制限)
title_data = pd_data.iloc[:,2]
title_list = []
fulltitle_list = []
for str1 in title_data:
fulltitle_list.append(str1)
if len(str1) > 30:
if len(str1) < 60: # 行を下げるために先頭に ‘\n’
str1 = ‘\n’ + str1[:29] + ‘\n’ + str1[29:58] # 30文字で折り返し(90文字以上は表示せず)
if len(str1) > 59:
if len(str1) < 90:
str1 = str1[:29] + ‘\n’ + str1[29:58] + ‘\n’ + str1[58:87] # 30文字で折り返し
else: # (91文字以上は表示せず)
str1 = str1[:29] + ‘\n’ + str1[29:58] + ‘\n’ + str1[58:90] + ‘・・・‘
title_list.append(str1)
# 出願人読み込み
ap_data = pd_data.iloc[:,3]
ap_list = []
fullap_list = []
for str1 in ap_data:
fullap_list.append(str1)
ap_list.append(str1)
# 要約読み込み(500文字までに制限。不要文字を削除)
abst_data = pd_data.iloc[:,6]
abst_list = []
for str1 in abst_data:
str0 = str1.split(‘【選択図】‘) # 【選択図】で分割
str1 = str0[0] # 【選択図】より前を残す
str1 = str(str1)
if len(str1) > 3:
#データ中の空白を削除
str1 = (str1.replace(” “, “”)) # 半角空白を削除
str1 = (str1.replace(“ “, “”)) # 全角空白を削除
str1 = (str1.replace(“,”, “”)) # 「,」を「、」に置換
str1 = (str1.replace(“(57)”, “”)) # 「(57)」を削除
str1 = (str1.replace(“【要約】“, “”)) # 「【要約】」を削除
str1 = (str1.replace(“(修正有)“, “”)) # 「(修正有)」をを削除
str1 = (str1.replace(“【課題】“, “”)) # 「【課題】」をを削除
abst_list.append(str1)
else:
abst_list.append(‘要約無し‘)
# DataFrame化
df1 = pd.DataFrame(data=pn_list, columns=[‘公報番号‘])
df2 = pd.DataFrame(data=date_list, columns=[‘発行日‘])
df3 = pd.DataFrame(data=title_list, columns=[‘発明の名称‘])
df4 = pd.DataFrame(data=ap_list, columns=[‘発明の名称‘])
# 横方向(axis=1)に結合
df5=pd.concat([df1, df2, df3, df4], axis=1)
# 表の作成
nx = 3
ny = len(ap_list)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny)]
# 公報番号
for y, str1 in enumerate(pn_list):
str1 = str1[0:6] + ‘\n’+ str1[6:] # 7文字で折り返し
arr1[y][0] = str1
# 発行日
for y, str1 in enumerate(date_list):
arr1[y][1] = str1
# 発明の名称
for y, str1 in enumerate(title_list):
arr1[y][2] = str1
# 出願人
for y, str1 in enumerate(ap_list):
if len(str1) > 8:
str1 = str1[0:8] + ‘\n’ + str1[8:17] # 9文字で折り返し(17文字以上は表示せず)
arr1[y][3] = str1
table_vals = arr1 # サンプル公報のテーブル値
fig = plt.figure()
ax = fig.add_subplot()
head_list = [‘公報番号‘,’発行日‘,’発明の名称‘,’出願人‘]
col_labels = head_list # ヘッダ設定
the_table = plt.table(cellText=table_vals, # トップ10のテーブル値
colWidths=[0.1, 0.1, 0.52, 0.16], # 列の幅を指定
colLabels=col_labels, # ヘッダを指定
loc=’center’)
the_table.scale(4, 6) # 全体のサイズをX=5、Y=15に設定
the_table.auto_set_font_size(False)
the_table.set_fontsize(22) # 全体が縮小されたのでフォントサイズを拡大
# ヘッダを着色
for x in range(nclm):
the_table[(0,x)].set_facecolor(‘lightgreen’) # ヘッダを薄緑色に着色
the_table[(0,x)].get_text().set_fontsize(’30’) # フォントサイズ=60
the_table[(0,x)].get_text().set_fontweight(‘bold’) # フォント種=bold
# 先頭列の文字位置を設定
for j in range(npn):
the_cell = the_table[j+1,0]
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘left’)
# 3列目の文字位置を設定
for j in range(npn):
the_cell = the_table[j+1,2]
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘left’)
# 4列目の文字位置を設定
for j in range(npn):
the_cell = the_table[j+1,3]
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘left’)
plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)
plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)
for pos in [‘right’,’top’,’bottom’,’left’]:
plt.gca().spines[pos].set_visible(False)
ax.plot(x, y, linewidth = 4) # 罫線の太さを設定
# 図表書き出し
plt.savefig(‘書き出し図表/’ + hyo_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
# plt.show()
# サンプル公報の概要読み込み
abst01_list = []
for n1, str1 in enumerate(fulltitle_list):
pn = pn_list[n1]
str2 = abst_list[n1]
splt_str2 = str2.split(‘。‘)
str3 = pn + ‘ ‘ + str1 + ‘\n’ + ‘ ‘ + splt_str2[0] + ‘。‘
abst01_list.append(str3)
print(‘概要[0]=’,abst01_list[0])
# コメント追加
wrd1 = ‘ これらのサンプル公報の概要は以下のとおり。‘
# 要約書き出し
wrd2 =”
for str1 in abst01_list:
wrd2 = wrd2 + “\n” + str1 + “\n”
wrd = wrd1 + wrd2
print(wrd)
# 要約書コピー
wrd_2_8_2 = wrd
# 発明の名称読み込み(100文字/件までに制限)
minititle_list =[]
for n1, str1 in enumerate(fulltitle_list):
if len(str1) > 100: str1 = str1[0:100] + “・・・” # 100文字/件までに制限
print(n1,str1)
minititle_list.append(str1)
# コメント追加(発明の名称を修正)
# def titlematome実行(fulltitle_listをdef titlematomeに渡し、処理結果をtitlewrd_list0として受け取る)
titlewrd_list0 = titlematome(minititle_list)
print(‘titlewrd_list0=’,titlewrd_list0)
# 2文字の単語を抽出
two_wrd = []
titlewrd_list =[]
for n1, str1 in enumerate(titlewrd_list0):
# リスト化
title0 = str1.split(‘、‘)
for str3 in title0:
if len(str3) == 1: str3 = “”
if len(str3) == 2:
if str3 not in two_wrd:
two_wrd.append(str3)
if str3 not in titlewrd_list:
if str3 != ”:
titlewrd_list.append(str3)
del_wrd = []
for str1 in titlewrd_list:
for str2 in two_wrd:
if str2 in str1:
if str2 != str1:
del_wrd.append(str2)
# 上位表現を削除(ex:「対象識別」が有れば単語「識別」を削除する)
if len(del_wrd) > 0:
title_wrd = ”
for str1 in titlewrd_list:
for str2 in del_wrd:
if str1 != str2:
if title_wrd == ”:
title_wrd= str1
else:
if str1 not in title_wrd:
title_wrd= title_wrd + ‘、‘ + str1
else:
title_wrd = ”
for str1 in titlewrd_list:
if str1 not in title_wrd:
title_wrd = title_wrd + ‘、‘ + str1
# 残った付与文字を置換および削除
title_wrd = (title_wrd.replace(‘、、‘, ‘、‘)) # 「、、」を「、」に置換
title_wrd = (title_wrd.replace(‘、、‘, ‘、‘)) # 「、、」を「、」に置換
if title_wrd[0] == ‘、‘:
title_wrd = title_wrd[1:] # 先頭の「、」を削除
# コメント追加
wrd1 = ‘ これらのサンプル公報には、‘
wrd2 = title_wrd
wrd3 = ‘などの語句が含まれていた。\n’
wrd = wrd1 + wrd2 + wrd3
print(wrd)
# 出願人書き出し
wrd_2_8_3 = wrd
# print(fig_n,’、‘,hyo_n)
# スクリブト71 2-8最新発行のサンプル公報(コメント書き出し)
print(”)
print(‘出力サンプル‘)
# doc.add_page_break() # 改頁
para = doc.add_paragraph(‘2-8 最新発行のサンプル公報‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd_2_8_1)
para = doc.add_paragraph(wrd_2_8_1) # 第1表は本テーマの分析対象公報
para.runs[npara].font.size = docx.shared.Pt(11)
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)
wrd = hyo_n
para = doc.add_paragraph(wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd_2_8_2)
para = doc.add_paragraph(wrd_2_8_2)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
print(wrd_2_8_3)
para = doc.add_paragraph(wrd_2_8_3)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト72 第三章 コード別の分析(図表とコメント作成)
import copy
# copy.deepcopy(コピー後に一方の値を変更しても、もう一方には影響しない)を使用
print(”)
print(‘出力サンプル‘)
# code表読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’code表‘)
y = len(pd_data)
x = len(pd_data.columns)
arr1 = pd_data.values # リスト化
#コード読み込み
code_data = pd_data.iloc[:,1]
code_list =[]
for str1 in code_data:
code_list.append(str1)
ncd=len(code_list)
# コード内容読み込み
cdnaiyo_data = pd_data.iloc[:,2]
cdnaiyo_list = []
for str1 in cdnaiyo_data:
cdnaiyo_list.append(str1)
# コード一桁目読み込み
flg = 0
code01_list = []
code01_list01 = []
for n1, str1 in enumerate(code_list):
if len(str1) == 1:
str2 = str1 + ‘:’ + cdnaiyo_list[n1]
code01_list01.append(str2)
if len(str2) > 36:
str2 = str2[0:35] + “\n ” + str2[35:]
flg = flg + 1
code01_list.append(str2)
# 一桁コード数算出
n2 = len(code01_list)
n2 = n2 + flg
print(‘一桁コード数=’,n2)
# コメント追加
wrd1 = ‘ この調査では、上記分析対象公報についてpythonによりコード化し、そのコードの一桁目をサブテーマのコードとした。‘
# 一桁コード書き出し
wrd2 =”
for str1 in code01_list:
str1 = “ ” + str1
wrd2 = wrd2 + “\n” + str1
wrd_cd1_list = wrd2
wrd = wrd1 + wrd2
print(wrd)
# コピー
wrd_3 =wrd
# 深いコピー(参照元を変化させない)
m11_wrd01 = “ コードはIPCを中心にコード化したが、その1桁コードは次のとおり。\n” + wrd2
m11_wrd = copy.deepcopy(m11_wrd01)
n2_m11 = copy.deepcopy(n2) # 一桁コード数
# print(fig_n,’、‘,hyo_n)
# スクリブト73 第三章 コード別の分析(コメント書き出し)
print(”)
print(‘出力サンプル‘)
doc.add_page_break() # 改頁
para = doc.add_paragraph(‘第三章 分類コード別の分析‘)
para.runs[npara].font.size = docx.shared.Pt(16)
para.runs[npara].bold = True
print(wrd_3)
para = doc.add_paragraph(wrd_3) # 第1表は本テーマの分析対象公報
para.runs[npara].font.size = docx.shared.Pt(11)
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト74 3-1-1 一桁コード別の発行件数割合(集計表)(図表とコメント作成)
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nhyo = nhyo + 1
hyo_n = ‘表‘ + str(nhyo)
# コメント追加
wrd = ‘ ‘ + hyo_n + ‘は分析対象公報の分類コードを一桁別(サブテーマ別)で集計した集計表である。\n’
print(wrd)
# コメントコピー
wrd_3_1_1 = wrd
# 一桁年別集計読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’一桁年別集計‘)
ny = len(pd_data)
nx = len(pd_data.columns)
nclm = 4 # 書き出すカラム数を設定
arr1 = pd_data.values # リスト化
#一桁分類コード読み込み
code_data01 = pd_data.iloc[:,0]
code_list01 =[]
for str1 in code_data01:
code_list01.append(str1)
ncd01=len(code_list01)
# code表読み込み
pd_data01 = pd.read_excel(‘trans_data.xlsx’,sheet_name=’code表‘)
#コード読み込み
code_data = pd_data01.iloc[:,1]
code_list =[]
for str1 in code_data:
code_list.append(str1)
ncd=len(code_list)
# print(code_list)
# コード内容読み込み
cdnaiyo_data = pd_data01.iloc[:,2]
cdnaiyo_list = []
for str1 in cdnaiyo_data:
cdnaiyo_list.append(str1)
# print(cdnaiyo_list)
# コード内容追加
nwrd_max = 0
cdnaiyo_list01 = []
for n1, str1 in enumerate(code_list01):
for n2, str2 in enumerate(code_list):
if str1 == str2:
str3 = cdnaiyo_list[n2]
if len(str3) > 26:
str3 = str3[:25] + ‘\n’ + str3[26:50] # 25文字で折り返し(50文字以上は表示せず)
cdnaiyo_list01.append(str3)
if len(str3) > nwrd_max: nwrd_max = len(str3)
# print(cdnaiyo_list01)
#横合計読み込み、全合計算出
tot_data01 = pd_data.iloc[:,nx-1]
ntot = 0
tot_list01 =[]
for nn1 in tot_data01:
ntot = ntot + nn1
tot_list01.append(nn1)
# %算出
np_list01 =[]
for str1 in tot_data01:
if ntot > 0:
str1 = (str1/ntot)*100
str1 = round(str1,1)
np_list01.append(str1)
else:
np_list01.append(0)
# 上位10社の発行件数集計表
df1 = pd.DataFrame(data=code_list01,columns=[‘コード‘])
df2 = pd.DataFrame(data=cdnaiyo_list01,columns=[‘コード内容‘])
df3 = pd.DataFrame(data=tot_list01,columns=[‘合計‘])
df4 = pd.DataFrame(data=np_list01,columns=[‘%’])
df5 = pd.concat([df1,df2,df3,df4], axis=1)
# 表の作成
arr1 = df5.values # リスト化
table_vals = arr1
fig = plt.figure()
ax = fig.add_subplot(111) # nrows,ncols,indexが全て一桁のときは、カンマを省略して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=4、Y=4に設定
the_table.auto_set_font_size(False)
the_table.set_fontsize(20)
for x in range(nclm):
the_table[(0,x)].set_facecolor(‘lightgreen’) # ヘッダを薄緑色に着色
the_table[(0,x)].get_text().set_fontsize(’20’) # フォントサイズ=80
the_table[(0,x)].get_text().set_fontweight(‘bold’) # フォント種=bold
for j in range(ny):
the_cell = the_table[j+1,0]
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘center’)
# 2列目の文字位置を設定
for j in range(ny):
the_cell = the_table[j+1,1]
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘left’)
plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)
plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)
for pos in [‘right’,’top’,’bottom’,’left’]:
plt.gca().spines[pos].set_visible(False)
# 図表書き出し
plt.savefig(‘書き出し図表/’ + hyo_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
# 合計でソート
arr1 = sorted(arr1, key=lambda x:x[3], reverse=True)
# コメント作成
wrd1 = ‘ この集計表によれば、コード「‘
wrd2 = arr1[0][0] + ‘:’ + arr1[0][1]
topcode2 = wrd2
print(‘topcode2=’,topcode2)
wrd2 = wrd2.replace(‘\n’,”) # 改行を削除
wrd3 = ‘」が最も多く、‘
wrd4 = str(arr1[0][3]) + ‘%を占めている。\n’
wrd5 = ‘ 以下、‘
wrd6 = ”
for n1, str1 in enumerate(arr1):
if n1== ny : break
str2 = str1[:][0] + ‘:’ + str1[:][1]
if n1== 1:
wrd6 = str2
if n1 > 1:
wrd6 = wrd6 + ‘、‘ + str2
wrd6 = wrd6.replace(‘\n’,”) # 改行を削除
wrd7 = ‘と続いている。‘
wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5 + wrd6 + wrd7
# 書き出し
wrd_3_1_2 = wrd
print(wrd_3_1_2)
m12_wrd01 = ‘ 1桁コード別に集計した結果によれば、コード「‘+ wrd2 + wrd3 + wrd4 + wrd5 + wrd6 +wrd7
# まとめに追加
f = open(“matome.txt”, “a”)
f.write(m12_wrd01 + ‘\n’)
f.close()
# print(fig_n,’、‘,hyo_n)
# スクリブト75 3-1 コード別全体分析(コメント書き出し)
print(”)
print(‘出力サンプル‘)
para = doc.add_paragraph(‘3-1 分類コード別全体分析‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
wrd = “ 分析対象公報を、サブテーマコード毎に分類し、分析した結果は以下のようになった。“
print(wrd)
para = doc.add_paragraph(wrd)
para = doc.add_paragraph(‘3-1-1 一桁コード別の発行件数割合‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd_3_1_1)
para = doc.add_paragraph(wrd_3_1_1)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)
wrd = hyo_n
para = doc.add_paragraph(‘ ‘ + wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd_3_1_2)
para = doc.add_paragraph(wrd_3_1_2)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト76 3-1-1 一桁コード別の発行件数割合(円グラフ)(図表とコメント作成)
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント追加
wrd = ‘ ‘ + fig_n + ‘は上記集計結果を円グラフにしたものである。‘
print(‘wrd=’,wrd)
para = doc.add_paragraph( wrd)
# コメントコピー
wrd_3_1_3 = wrd
# 凡例用に、コード+内容を作成
cd_naiyo_list = []
hancd_naiyo_list = []
for n1, str1 in enumerate(code_list01):
str2 = str1 + ‘:’ + cdnaiyo_list01[n1]
nlen = len(str2)
if nlen > 15:
str3 = str2[0:15] + ‘・・・‘
else:
str3 = str2[0:15]
cd_naiyo_list.append(str2)
hancd_naiyo_list.append(str3)
# 凡例を設定
hanrei_nm = hancd_naiyo_list # コード+内容を凡例として格納
print(fig_n)
# 円グラフ作成
plt.pie(tot_list01, labels=hancd_naiyo_list, autopct=”%1.1f%%”,pctdistance=0.9,
startangle=90,counterclock=False)
# 円グラフの右横=2.7の位置に高さ=1で描画
plt.legend(hanrei_nm, fontsize=12,bbox_to_anchor=(2.7, 1)) # 凡例の表示
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
plt.show()
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(‘ ‘ + wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト77 3-1-2 一桁コード別発行件数の年別推移(折線グラフ)(図表とコメント作成)
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント追加
wrd = ‘ ‘ + fig_n + ‘は分析対象公報を一桁コード別・年別に集計し、折線グラフにしたものである。‘
print(wrd)
# コメントコピー
wrd_3_1_2_1 = wrd
# 一桁年別集計読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’一桁年別集計‘)
nclm=(len(pd_data.columns)) # コード名から合計欄まで
# 読み込みデータ全体をDataFrameに変換
df00 = pd.DataFrame(pd_data)
# dataframeをarrayに変換
arr00 = df00.values
# 上位10に制限
nbest = 10
##発行年読み込み
nen_data = pd_data.columns[1:nclm-1] # 発行年のminからmaxまで
nen_list = []
for str1 in nen_data:
str1 = str(str1) + ‘年‘
nen_list.append(str1)
nnen = len(nen_list)
print(‘発行年=’,nen_list)
## コード読み込み
print(nbest)
cd_list =[]
for n1, str1 in enumerate(arr00):
if n1 == (nbest-1): break
cd_list.append(str1[0])
print(‘コード=’,cd_list)
# コード内容読み込み
code_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’code表‘)
nclm=(len(code_data.columns)) # コード名から合計欄まで
# コードcode_list01読み込み
code01 = code_data.iloc[:,1]
code_list01 =[]
for str1 in code01:
code_list01.append(str1)
print(‘コード数=’,len(code_list01))
print(‘コード[0:5]=’,code_list01[0:5])
# コード内容code_list02読み込み
code02 = code_data.iloc[:,2]
code_list02 =[]
for str1 in code02:
code_list02.append(str(str1))
print(‘コード内容[0:3]=’,code_list02[0:3])
# コード内容追加
cdnaiyo_list01 = []
for n1, str1 in enumerate(code_list01):
for n2, str2 in enumerate(cd_list):
if str1 == str2:
str3 = str2 + ‘:’ + code_list02[n1]
if len(str3) > 30:
str3 = str3[:29] + ‘\n’ + str3[29:] # 30文字で折り返し(60文字以上は表示せず)
cdnaiyo_list01.append(str3)
print(‘コード内容=’,cdnaiyo_list01)
## 表内数値読み込み
arr_nxny = []
for n1, str1 in enumerate(arr00):
if n1 == (nbest-1): break
list01 = []
for n2, nn1 in enumerate(str1):
if n2 > 0:
nn1 = round(nn1,1)
if n2 < nnen+1:
list01.append(nn1)
arr_nxny.append(list01)
print(‘arr_nxny=’,arr_nxny)
# 最終年の件数を補正
nmax = 0
arr01 = []
cd01 = []
nxy_list0 = []
for n1, str1 in enumerate(arr_nxny):
arr02 = []
list0 = []
for n2, str2 in enumerate(str1):
if str2 > nmax: nmax = str2
list0.append(str2)
if (n2+1) == nenlast:
str2 = str2*(npmend+1) # 最終年の件数を補正
str2 = round(str2,1)
arr02.append(str2)
else:
arr02.append(str2)
arr01.append(arr02)
nxy_list0.append(list0)
print(‘元の件数=’,nxy_list0)
print(‘月数補正後の件数=’,arr01)
# 変数名修正
nen_list = nen_list
code_list = cdnaiyo_list01
arr_nxny = arr01
g_title = ‘一桁コード別発行件数の年別推移‘
# def実行
wrd = ”
wrd01,wrd02 = oresen_comment(nen_list,code_list,arr_nxny,fig_n, g_title)
print(‘第1位のコード=’,topcode2)
topcode2 = “コード「” + topcode2 + “」“
# wrd01 = wrd01.replace(‘主要出願人名義‘,’コード‘)
wrd01 = wrd01.replace(‘主要出願人名義‘,topcode2)
print(‘wrd01=’,wrd01)
bwd = ‘次のコードも‘
wrd02 = wrd02.replace(bwd,’次のコードは‘)
print(‘wrd02=’,wrd02)
# まとめに追加
m08_wrd01 = wrd01 + wrd02
m08_wrd01 = m08_wrd01.replace(‘このグラフによれば上記‘,’年別推移で見ると‘)
m08_wrd01 = m08_wrd01.replace(‘この中で第1位は‘,’上記のとおり、この中で第1位は‘)
m08_wrd01 = m08_wrd01.replace(‘この中で、第1位は‘,’上記のとおり、この中で第1位は‘)
m08_wrd01 = m08_wrd01.replace(‘年別推移で見るとコード‘,’年別推移で見ると上記コード‘)
print(m08_wrd01)
f = open(“matome.txt”, “a”)
f.write(m08_wrd01)
f.close()
# スクリブト78 3-1-2 一桁コード別発行件数の年別推移(折線グラフ)(コメント書き出し)
print(”)
print(‘出力サンプル‘)
# doc.add_page_break() # 改頁
para = doc.add_paragraph(”)
para = doc.add_paragraph(‘3-1-2 一桁コード別発行件数の年別推移‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
print(wrd_3_1_2_1)
para = doc.add_paragraph(wrd_3_1_2_1)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(‘ ‘ + wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd01)
para = doc.add_paragraph(wrd01)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
print(wrd02)
para = doc.add_paragraph(wrd02)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# スクリブト79 3-1-2 一桁コード別発行件数の年別推移(バブルチャート作成)(図表とコメント作成)
import numpy as np
print(”)
print(‘出力サンプル‘)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント追加
wrd = ‘ ‘ + fig_n + ‘は一桁コード別の発行件数を年別に集計し、数値付きバブルチャートにしたものである。‘
print(‘wrd=’,wrd)
# コメントコピー
wrd_3_1_2_4 = wrd
ncd=len(cd_naiyo_list)
# 一桁年別集計読み込み
pd_data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’一桁年別集計‘)
ny = len(pd_data)
nx = len(pd_data.columns)
arr1 = pd_data.values # リスト化
# 発行年読み込み
nen_data = pd_data.columns[1:nnen+1] # 発行年
nen_list = []
for str1 in nen_data:
str1 = str(str1) + ‘年‘
nen_list.append(str1)
print(‘nen_list=’,nen_list)
# コード+コード内容リスト
print(‘cd_naiyo_list=’,cd_naiyo_list)
nmax = 0
# 発行件数読み込み
nenlast = len(nen_list)
nxy_list = []
nxy_list0 = []
for n1 in range(ncd):
nx_list = []
nx_list0 = []
for n2 in range(nx-1):
if n2 > 0:
str1 = pd_data.iloc[n1,n2]
nx_list0.append(str1)
if n2 == nenlast :
str1 = str1*(npmend + 1)
str1 = round(str1,1)
nx_list.append(str1)
else:
nx_list.append(str1)
if nmax < str1: nmax = str1
nxy_list.append(nx_list)
nxy_list0.append(nx_list0)
print(‘元の件数=’,nxy_list0)
print(‘月数補正後の件数=’,nxy_list)
y_len = len(nxy_list)
# 発行件数%化
npxy_list = []
for n1_list in nxy_list:
npx_list = []
for n2 in n1_list:
n3= round(n2/nmax,2)
npx_list.append(n3)
npxy_list.append(npx_list)
# 変数名変更
x_list = nen_list
y_list = cd_naiyo_list
print(‘x_list=’,x_list)
print(‘y_list=’,y_list)
print(‘nxy_list=’,nxy_list)
print(fig_n)
# def実行
buble0(x_list,y_list,nxy_list, fig_n)
# 3-1-2 一桁コード別発行件数の年別推移(バブルチャート)のコメント
# 最終年が最多のメインGを抽出
nnen = len(nen_list)
ncd =len(cd_naiyo_list)
npk_list = []
pkcd_list = []
for n1, str1 in enumerate(cd_naiyo_list):
nxy_list01 = nxy_list[n1]
np1 = 0
for n2, str2 in enumerate(nxy_list01):
if str2>np1:
np1=str2 # ピーク件数
pknen = n2+1 # ピーク年
if pknen==nnen: # 最終年がピークならば
pkcd_list.append(str1)
np = round(np1,1)
npk_list.append(np1)
# 合計件数読み込み
pd_data1 = pd_data.iloc[:,nx-1]
ntot = 0
nyken_list = []
for str1 in pd_data1:
nyken_list.append(str1)
ntot = ntot + str1
# DataFrame化
df1 = pd.DataFrame(data=cd_naiyo_list, columns=[‘コード‘])
df2 = pd.DataFrame(data=nyken_list, columns=[‘コード別合計件数‘])
# 結合
df3=pd.concat([df1, df2], axis=1)
# コード
code_list01 = df3.iloc[:,0]
# ソート
pkcd_list= sorted(pkcd_list)
# メインGに分類内容と件数を結合
pkcd_title_list =[]
for n1, str1 in enumerate(pkcd_list):
for n2, str2 in enumerate(code_list01):
if str1 == str2:
str3 = nyken_list[n2]
str3 =round(str3,1)
str4 = str1 + “(” +str(str3) + “件)”
pkcd_title_list.append(str4)
# print(‘pkcd_title_list=’,pkcd_title_list)
n2 = len(pkcd_list) # 最終年が最多のメインG数
# コメント追加
flg_n2 = 0
if n2 > 0:
wrd1 = ‘ このチャートによれば、最終年が最多となっているコードは次のとおり。\n’
# 最終年が最多のコード書き出し
wrd2 =”
for str1 in pkcd_title_list: # 最終年が最多のコード
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if n2 == 0:
flg_n2 = 1
wrd = ‘ このチャートによれば、最終年が最多となっているコードはなかった。‘
print(wrd)
# 増加したコードコピー
wrd_3_1_2_5 = wrd
# 重要コードを抽出
## 最終年の件数が平均以上でかつピーク時の80%以上でかつ増加率が100%以上か
## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要コードとして書出す
#最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出
ntot = 0
nlast_list = []
nmae_list = []
for n in range(y_len):
n0 = nxy_list[n][nnen-1] # 最終年の件数
nlast_list.append(n0)
n1 = nxy_list[n][nnen-2] # 最終年前年の件数
nmae_list.append(n1)
ntot = ntot + n0
navr = round(ntot/ncd,1) # 最終年の平均件数
# 重要メインGを判定
vipcd_list = []
for n1, str1 in enumerate(code_list01):
if n1 >= y_len: break
flg = 0
if nlast_list[n1] > navr: # 最終年の件数が平均以上
if nlast_list[n1] > (npk_list[n1]*0.8): # ピーク時の80%以上
if nmae_list[n1] > 0:
if (nlast_list[n1]/nmae_list[n1]) > 1: #増加率が100%以上
vipcd_list.append(str1)
flg = 1
if flg == 0:
if nlast_list[n1] > navr: # 最終年の件数が平均以上
if nlast_list[n1] > (npk_list[n1]*0.95): # ピーク時の95%以上
vipcd_list.append(str1)
# ソート
vipcd_list= sorted(vipcd_list)
# メインGに分類内容と件数を結合
vcd_title_list =[]
for n1, str1 in enumerate(vipcd_list):
for n2, str2 in enumerate(code_list01):
if str1 == str2:
str3 = str1 + “(” +str(nyken_list[n2]) + “件)”
vcd_title_list.append(str3)
n2 = len(vipcd_list) # 最終年が最多のコード数
# コメント追加
if n2 > 0:
wrd1 = ‘ 所定条件を満たす重要コードは次のとおり。\n’
# 重要コード書き出し
wrd2 =”
for str1 in vcd_title_list:
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if n2 == 0:
if flg_n2 == 0:
wrd = ‘ 所定条件を満たす重要コードはなかった。‘
else:
wrd = ‘ 所定条件を満たす重要コードもなかった。‘
print(wrd)
# 増加したコードコピー
wrd_3_1_2_6 = wrd
# print(fig_n,’、‘,hyo_n)
# スクリブト80 3-1-2 一桁コード別発行件数の年別推移(バブルチャート作成)(コメント書き出し)
print(”)
print(‘出力サンプル‘)
print(wrd_3_1_2_4)
para = doc.add_paragraph(wrd_3_1_2_4)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
# 図表読み込み
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
wrd = fig_n
para = doc.add_paragraph(‘ ‘ + wrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
print(wrd_3_1_2_5)
para = doc.add_paragraph(wrd_3_1_2_5)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
print(wrd_3_1_2_6)
para = doc.add_paragraph(wrd_3_1_2_6)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
# コード別個別分析一括処理
## 一桁コード毎に(1)~(8)の図表を作成する。
# スクリブト81 3-2-AZ-(1) コード別発行件数の年別推移(棒グラフ)(図表とコメント作成)
## AZ-(1)=ex:[A:計算;計数]
import pandas as pd
import numpy as np
import openpyxl
import matplotlib.pyplot as plt
plt.rcParams[‘font.family’] = ‘MS PGothic’
import matplotlib.patches as patches
import copy
import math
def bar_graph01(nfig,nhyo):
global nen_list
global nnen # 調査年数
global ncdtot
global npmend # 追加補正係数
# コメント追加
print(”)
wrd = ‘(1) コード別発行件数の年別推移‘
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# 発行年別の発行件数を集計
nenlast = len(nen_list)
nmax = 0 # 最大件数
nken_list= [] # 一桁コードの年別件数リスト
nken_list2 = [] # 追加件数
nken_list3 = [] # 合計件数
for n1,str1 in enumerate(nen_list):
nn = 0
for str2 in nen_list01:
if str1[0:4] == str2:
nn = nn +1
if nn > nmax: nmax = nn
nken_list.append(nn)
if n1 == nenlast – 1:
nn2 = nn*npmend # 月数補正
nn2 = round(nn2,1)
nken_list2.append(nn2)
nken_list3.append(nn+nn2)
else:
nken_list2.append(0)
nken_list3.append(nn)
print(‘発行件数=’,nken_list)
print(‘追加補正係数=’,npmend)
print(‘追加予想件数=’,nken_list2)
print(‘合計発行件数=’,nken_list3)
# 発行年に「年」を付加し横軸ヘッダを作成
nen_head = []
for str1 in nen_list:
str1 = str(str1) + ‘年‘
nen_head.append(str1)
# コメント追加
wrd1 = ‘ 分析対象公報のうちコード「‘
wrd2 = cdhead_list[ncd]
wrd3 = ‘ 」が付与された公報は‘
wrd4 = str(ncdtot)
wrd5 = ‘件であった。\n’
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
wrd6 = ‘ ‘ + fig_n + ‘はこのコード「‘
wrd7 = cdhead_list[ncd]
wrd8 = ‘」が付与された公報を発行年別に集計し、縦棒グラフにしたものである。\n’
wrd = wrd1 +wrd2 +wrd3 + wrd4 + wrd5 +wrd6 + wrd7 + wrd8
print(wrd)
# 書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# 棒グラフ描画
# X軸ラベル設定
labels = nen_head # ラベル=発行年
# 一桁コード発行件数設定
data = nken_list
data2 = nken_list2
# 表示位置設定
x_width = 0.5
x_loc = np.array(range(len(nen_list))) + x_width
print(fig_n)
# グラフの大きさを設定
fig = plt.figure(figsize=(13.0, 4.0))
# タイトル、ラベルを設定
plt.title(“公報発行件数の年別推移“, fontsize=20)
plt.xlabel(“発行年“, fontsize=18)
plt.ylabel(“発行件数“, fontsize=18)
plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘) # 棒グラフの設定
plt.xticks(x_loc, labels, fontsize=14) # x軸にラベル設定
if npmend > 0: # 追加補正係数>0ならば予想件数を表示
plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘) # 棒グラフの設定
plt.grid() # 罫線追加
# 追加補正係数>0ならば予想件数を表示
if npmend > 0:
plt.legend()
# 棒グラフ内に数値を書く
hx = nmax/50 # 書き込み位置を上に修正
for x, y in zip(x_loc, data):
plt.text(x, y+hx, y, ha=’center’, va=’bottom’) # 数値の書き込み位置をhx上に修正
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n +’.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
plt.show()
# 3-2 コード別個別分析–コード別発行件数の年別推移(棒グラフのコメント作成)
# コード別発行件数の年別推移(棒グラフ)の変動をコメントする
# def実行
print(‘list2=’,nen_list) # 発行年
print(‘list3=’,nken_list) # 発行件数
print(‘合計発行件数=’,nken_list3)
wrd = bargraph_comment(nen_list,nken_list3)
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
figwrd = fig_n
para = doc.add_paragraph(‘ ‘ + figwrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
# コメント作成
wrd1 = ‘ このグラフによれば、コード「‘
wrd2 = cdhead_list[ncd]
wrd3 = ‘ 」が付与された公報の発行件数は‘
wrd0 = wrd1 + wrd2 + wrd3
wrd = wrd0 + wrd
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
return(nfig,nhyo)
# スクリブト82 3-2-AZ-(2) コード別出願人別の発行件数割合(表と円グラフ)(図表とコメント作成)
def ap_hyo01(nfig,nhyo):
global ncdtot
# コメント追加
print(”)
wrd = ‘(2) コード別出願人別の発行件数割合‘
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
ntot01= ncdtot # 一桁コードの公報件数
print(‘一桁コードの公報件数=’,ntot01)
# 上位出願人数を指定
nbest_ap = 10
# 一桁コード別集計読み込み
code01__data = pd.read_excel(‘trans_data.xlsx’,sheet_name=’一桁コード別集計‘)
# 発行件数読み込み
ncode01_data = code01__data.iloc[:,ncd+1]
nenlast = len(ncode01_data)
ntot = 0
napken_list= []
for n1,nn1 in enumerate(ncode01_data):
nn1 = round(nn1,1)
if n1 == nenlast :
nn1 = nn1*(npmend + 1)
nn1 = round(nn1,1)
napken_list.append(nn1)
else:
napken_list.append(nn1)
ntot = ntot + nn1
# 出願人名読み込み
apname_data = code01__data.iloc[:,0]
ap01_list = []
for n1,str1 in enumerate(apname_data):
if napken_list[n1] > 0:
ap01_list.append(str1)
# print(len(ap01_list),’ap01_list=’,ap01_list)
# %を追加
npap_list = []
for n1, nn1 in enumerate(napken_list):
if napken_list[n1] > 0:
np = (nn1/ntot)*100
np = round(np,1)
npap_list.append(np)
# print(len(npap_list),’npap_list=’,npap_list)
napken_list01 = []
for nn1 in napken_list:
if nn1 > 0:
napken_list01.append(nn1)
# print(len(napken_list01),’napken_list01=’,napken_list01)
# DataFrame化
df1 = pd.DataFrame(data=ap01_list, columns=[‘出願人‘])
df2 = pd.DataFrame(data=napken_list01, columns=[‘発行件数‘])
df3 = pd.DataFrame(data=npap_list, columns=[‘%’])
# 横方向(axis=1)に結合
df4=pd.concat([df1, df2,df3], axis=1)
# 逆順にソート
df4=df4.sort_values(‘発行件数‘,ascending=False)
# 上位nbest_apをリスト化
arr1 = df4[0:nbest_ap].values
# 上位nbest_apの合計を算出
ntop = 0
for n1, str1 in enumerate(arr1):
if n1 == nbest_ap: break
nn = str1[1]
ntop = ntop + nn
# その他と合計を追加
arr1_nbest = []
for str1 in arr1:
blist = []
for str2 in str1:
# 末尾を削除
if type(str2) == str:
if str2[-1] == ‘,’: # 末尾が ‘,’ならば末尾を除去
np = len(str2)
str2 = str2[0:np-1]
blist.append(str2)
arr1_nbest.append(blist)
nsonota = round(ntot01 – ntop,1) # その他の件数
npsonota = round(((ntot01 – ntop)/ntot)*100,1) # その他の%
ngokei = round(ntot01,1)
arr1_nbest.append([‘その他‘,nsonota,npsonota])
arr1_nbest.append([‘合計‘,ngokei,100]) # 合計を追加
nlimit = len(arr1_nbest) – 2
# 読み込み数を設定
if nlimit < nbest_ap: nbest_ap=nlimit
# 出願人名を30文字以内に制限
for str1 in arr1_nbest:
if len(str1[0]) > 30:
str1[0] = str1[0][:29] + ‘\n’ + str1[0][29:] # 30文字で折り返し(60文字以上は表示せず)
# 2位以下をap_wrdにまとめる(その他は除外)
ap_wrd = ‘ 以下‘
ap_wrd2 = ‘ 以下‘
for n1, str1 in enumerate(arr1_nbest):
if str1[0] == ‘その他‘: break
str1 = str(str1[0])
str1 = str1.replace(‘株式会社‘, ”) # “株式会社“を消去
str1 = str1.replace(“国立大学法人“, “”) # “国立大学法人“を消去
str1 = str1.replace(“公立大学法人“, “”) # “公立大学法人“を消去
str1 = str1.replace(“学校法人“, “”) # “学校法人“を消去
str1 = str1.replace(“地方独立行政法人“, “”) # “地方独立行政法人“を消去
str1 = str1.replace(“独立行政法人“, “”) # “独立行政法人“を消去
str1 = str1.replace(“国立研究開発法人“, “”) # “国立研究開発法人“を消去
str1 = str1.replace(“一般財団法人“, “”) # “一般財団法人“を消去
str1 = str1.replace(“公益財団法人“, “”) # “公益財団法人“を消去
if n1 > 0:
if n1 <= nbest:
ap_wrd = ap_wrd + ‘、‘ + str1
if n1 > 1:
if n1 <= nbest:
ap_wrd2 = ap_wrd2 + ‘、‘ + str1
ap_wrd = ap_wrd + ‘と続いている。‘
ap_wrd = ap_wrd.replace(‘\n’,”) # 改行を削除
p_wrd2 = ap_wrd2 + ‘と続いている。‘
ap_wrd2 = ap_wrd2.replace(‘\n’,”) # 改行を削除
# 図表Noを加算
nhyo = nhyo + 1
hyo_n = ‘表‘ + str(nhyo)
wrd1 = ‘ ‘ + hyo_n + ‘はコード「‘
wrd2 = cdhead_list[ncd]
wrd3 = ‘」が付与された公報を公報発行件数が多い上位10社とその他の出願人について集計した集計表である。‘
wrd = wrd1 + wrd2 + wrd3 + ‘\n’
print(wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# 描画準備
table_vals = arr1_nbest # 表データ
fig = plt.figure()
ax = fig.add_subplot(111) # nrows,ncols,indexが全て一桁のときは、カンマを省略して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=5、Y=6に設定
for x in range(3):
the_table[(0,x)].set_facecolor(‘lightgreen’) # ヘッダを薄緑色に着色
the_table[(0,x)].get_text().set_fontsize(’80’) # フォントサイズ=80
the_table[(0,x)].get_text().set_fontweight(‘bold’) # フォント種=bold
for j in range(nbest_ap+2):
the_cell = the_table[j+1,0]
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘center’)
plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)
plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)
for pos in [‘right’,’top’,’bottom’,’left’]:
plt.gca().spines[pos].set_visible(False)
# 図表書き出し
hyo_n = ‘表‘ + str(nhyo)
print(hyo_n)
plt.savefig(‘書き出し図表/’ + hyo_n +’.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
plt.show()
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)
figwrd = hyo_n
para = doc.add_paragraph(‘ ‘ + figwrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
# 1位と2位が同数かチェック
flg1_2 = 0
if arr1_nbest[0][1] == arr1_nbest[1][1] : flg1_2 = 1
# コメント作成
if flg1_2 == 0:
if (ntot – ntop) > arr1_nbest[0][1]:
wrd1 = ‘ この集計表によれば、その他を除くと、第1位は‘
else:
wrd1 = ‘ この集計表によれば、第1位は‘
wrd2 = arr1_nbest[0][0]
wrd3 = ‘であり、‘
wrd4 = str(arr1_nbest[0][2])
wrd5 = ‘%であった。\n’
wrd6 = ap_wrd # 2位以下の出願人
wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5 + wrd6 + ‘\n’
wrd = wrd.replace(‘,’,”)
if flg1_2 == 1:
if (ntot – ntop) > arr1_nbest[0][1]:
wrd1 = ‘ この集計表によれば、その他を除くと、第1位は同数の‘
else:
wrd1 = ‘ この集計表によれば、第1位は同数の‘
wrd2 = arr1_nbest[0][0] + ‘と‘ + arr1_nbest[1][0]
wrd3 = ‘であり、それぞれ‘
wrd4 = str(arr1_nbest[0][2])
wrd5 = ‘%であった。\n’
wrd6 = ap_wrd2 # 3位以下の出願人
wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5 + wrd6 + ‘\n’
wrd = wrd.replace(‘,’,”)
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
if arr1_nbest[0][2] == 0:
wrd1 = wrd1 + ‘無かった。‘
return (nfig,nhyo)
if arr1_nbest[0][2] == 1:
wrd1 = wrd1 + wrd2 + ‘のみであった。‘
return (nfig,nhyo)
# 共同出願人が0または1ならばグラフ化せずにスキップ
if nlimit <=1:
wrd = ‘ 共同出願人は無かった。‘
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
return (nfig,nhyo)
if nlimit ==2:
ap01 = arr1_nbest[1][0].replace(‘,’,”) # 筆頭出願人の末尾の「,」を削除
wrd = ‘ 共同出願人は‘ + ap01 + ‘のみである。‘
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
return (nfig,nhyo)
# 共同出願人が2人以上ならば円グラフを描画
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# コメント作成
wrd = ‘ ‘ + fig_n + ‘は上記集計結果を円グラフにしたものである。\n’
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
print(fig_n)
# (2) コード別出願人別の発行件数割合(円グラフ)
# 円グラフの描画データ作成
ap10 = [] # 上位nbest_apの出願人略称(株式会社を除去)
fullap10 = [] # # 上位nbest_apの出願人フルネーム
ntot10 = 0 # 上位nbest_apの合計件数
n10 = [] # 上位nbest_apの%リスト
for n1, str1 in enumerate(arr1_nbest):
if n1 >= nbest_ap+1: break
str2 = str1[0].replace(“株式会社“, “”) # “株式会社“を消去
str2 = str2.replace(“国立大学法人“, “”) # “国立大学法人“を消去
str2 = str2.replace(“公立大学法人“, “”) # “公立大学法人“を消去
str2 = str2.replace(“学校法人“, “”) # “学校法人“を消去
str2 = str2.replace(“地方独立行政法人“, “”) # “地方独立行政法人“を消去
str2 = str2.replace(“独立行政法人“, “”) # “独立行政法人“を消去
str2 = str2.replace(“国立研究開発法人“, “”) # “国立研究開発法人“を消去
str2 = str2.replace(“一般財団法人“, “”) # “一般財団法人“を消去
str2 = str2.replace(“公益財団法人“, “”) # “公益財団法人“を消去
if nlen > 15:
str2 = str2[0:15] + ‘・・・‘
else:
str2 = str2[0:15]
ap10.append(str2)
fullap10.append(str2)
n10.append(str1[2])
if n1 < nbest_ap:
ntot10 = ntot10 + str1[1]
# 凡例
hanrei_nm = fullap10 # 出願人フルネームを凡例として格納
# 円グラフ作成
print(n10,ap10)
plt.pie(n10, labels=ap10, autopct=”%1.1f%%”,pctdistance=0.9,
startangle=90,counterclock=False)
# 円グラフの右横=2.7の位置に高さ=1で描画
plt.legend(hanrei_nm, fontsize=12,bbox_to_anchor=(2.7, 1)) # 凡例の表示
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n + ‘.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
plt.show()
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
figwrd = fig_n
para = doc.add_paragraph(‘ ‘ + figwrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
# コメント作成
np = round((ntot10/ntot)*100,1) # 小数点以下1位で%表示
wrd = “ このグラフによれば、上位10社で” + str(np) + “%を占めている。“
if np<35: wrd = “ このグラフによれば、上位10社だけでは” + str(np) + “%を占めているに過ぎず、多数の出願人に分散しているようである。“
if np>45: wrd = “ このグラフによれば、上位10社だけで” + str(np) + “%を占めており、少数の出願人に集中しているようである。“
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# print(fig_n,’、‘,hyo_n)
return (nfig,nhyo)
# スクリブト83 3-2-AZ-(3) コード別出願人数の年別推移(棒グラフ)(図表とコメント作成)
def bar_graph02(nfig,nhyo): # 3-2-AZ-(3)コード別出願人数の年別推移(棒グラフ)
global nen_list
global nen_list01
global nen_head_list
global nnen
global nen_head_list
global npmend # 追加補正係数
# コメント追加
print(”)
wrd = ‘(3) コード別出願人数の年別推移‘
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
wrd1 = ‘ ‘ + fig_n + ‘はコード「‘
wrd2 = cdhead_list[ncd]
wrd3 = ‘」が付与された公報の出願人数を発行年別に集計し、縦棒グラフにしたものである。‘
wrd = wrd1 + wrd2 + wrd3 + ‘\n’
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# 一桁コード別発行年別の出願人データにまとめる
cdap_list = [] # 一桁コード別出願人リスト
bap_list = []
bap_list01 = []
for n1,str1 in enumerate(nen_list): # 全公報発行年リスト(ex:2011,2012・・・)
bap_list01 = []
for n2, str2 in enumerate(nen_list01): # コード別公報の発行年リスト
if str1 == str2: # 発行年が同じならば
str3 = ap_list01[n2]
# 共同出願人を分割
split_str3 = str3.split(‘;’)
for str4 in split_str3:
bap_list01.append(str4) # 発行年別にリスト化
cdap_list.append(bap_list01)
# 一桁コード別出願人を抽出し重複を削除
nenlast = len(cdap_list)
nmax = 0 # 最大人数
ncdap01_list = [] # 一桁コード別年別出願人数
ncdap01_list2 = [] # 追加件数
ncdap01_list3 = [] # 合計件数
for n1, str1 in enumerate(cdap_list):
# 重複を削除
str1 = list(set(str1)) # 重複を削除
nn = len(str1)
if nn > nmax: nmax = nn
ncdap01_list.append(nn)
if n1 == nenlast – 1:
nn2 = nn*npmend # 月数補正
nn2 = round(nn2,1)
ncdap01_list2.append(nn2)
ncdap01_list3.append(nn+nn2)
else:
ncdap01_list2.append(0)
ncdap01_list3.append(nn)
print(‘発行件数=’,ncdap01_list)
print(‘追加補正係数=’,npmend)
print(‘追加予想件数=’,ncdap01_list2)
print(‘合計発行件数=’,ncdap01_list3)
# 棒グラフ描画準備
# X軸ラベル設定
labels = nen_head_list # ラベル=発行年
# 一桁コード別年別出願人数をdataに設定
data = ncdap01_list
data2 = ncdap01_list2
# 表示位置設定
x_width = 0.5
x_loc = np.array(range(nnen)) + x_width
print(fig_n)
# グラフの大きさを設定
fig = plt.figure(figsize=(13.0, 4.0))
# タイトル、ラベルを設定
plt.title(“出願人数の年別推移“, fontsize=20)
plt.xlabel(“発行年“, fontsize=18)
plt.ylabel(“出願人数“, fontsize=18)
plt.bar(x_loc, data, width=x_width,color=’C0′,label=’最終年発行件数‘) # 棒グラフの設定
plt.xticks(x_loc, labels, fontsize=14) # x軸にラベル設定
if npmend > 0: # 追加補正係数>0ならば予想件数を表示
plt.bar(x_loc, data2, width=x_width,bottom=data,color=’tab:orange’,label=’最終年予想件数‘) # 棒グラフの設定
plt.grid() # 罫線追加
# 追加補正係数>0ならば予想件数を表示
if npmend > 0:
plt.legend()
# 棒グラフ内に数値を書く
hx = nmax/50 # 書き込み位置を上に修正
for x, y in zip(x_loc, data):
plt.text(x, y+hx, y, ha=’center’, va=’bottom’) # 数値の書き込み位置をhx上に修正
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n +’.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
plt.show()
#図表書き出し
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
figwrd = fig_n
# (3) コード別出願人数の年別推移(棒グラフ)のコメントを作成
# 年別出願人数リスト ncdap01_list
# def実行
print(‘list2=’,nen_list) # 発行年
print(‘list3=’,ncdap01_list) # 発行件数
print(‘合計発行件数=’,ncdap01_list3)
wrd = bargraph_comment(nen_list,ncdap01_list3)
print(wrd)
figwrd = fig_n
para = doc.add_paragraph(‘ ‘ + figwrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
wrd1 = ‘ このグラフによれば、コード「‘
wrd2 = cdhead_list[ncd]
wrd3 = ‘ 」が付与された公報の出願人数は‘
wrd0 = wrd1 + wrd2 + wrd3
wrd = wrd0 + wrd + ‘\n’
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# print(fig_n,’、‘,hyo_n)
return (nfig,nhyo)
# スクリブト84 2-AZ-(4) コード別出願人別発行件数の年別推移(バブルチャート)(図表とコメント作成)
def buble_ap01(nfig,nhyo):
global ncd
global cdhead_list # 一桁コード+コード内容
global nen_list
global nen_head_list
global nnen
global cd01
global ncdtot
global py_list
global py_list01
global npmend
# コメント追加
print(”)
wrd = ‘(4) コード別出願人別発行件数の年別推移‘
# 書き出し
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# 合計件数 ntot
ntot = ncdtot
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
wrd1 = ‘ ‘ + fig_n + ‘はコード「‘
wrd2 = cdhead_list[ncd]
wrd3 = ‘」が付与された公報について主要出願人の発行件数が年毎にどのように推移しているかを見るためのものであり、‘
wrd4 = ‘公報発行件数が多い上位10社について公報発行件数を発行年別に集計し、数値付きバブルチャートにしたものである。\n’
wrd = wrd1 + wrd2 + wrd3 + wrd4
print(‘wrd=’,wrd)
# コメント書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# 各公報毎に持分を計算し、年別に集計し、出願人毎の発行件数(持分)を集計する。
# データ読み込み
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′) # csv用
pat_data = pat_data.dropna(how=’all’) # 全列がNaNである行を削除
# 開始年から終了年までの数値を作成し、文字に変換し、リスト化
nopy_list=[]
for str1 in year_list:
nopy_list.append(str1)
# コード欄データをリスト化
pd_data = pat_data.iloc[:,9] # コード欄
code_list =[]
for str1 in pd_data:
str1 = ‘;’ + str1
code_list.append(str(str1))
# 出願人(重複なし)リスト作成(縦軸作成)
# 出願人読み込み
apname_data = pat_data.iloc[:,4]
ap_list =[]
for str1 in apname_data:
str0 = str1 + “,”
ap_list.append(str(str0))
# 出願人の重複を削除
list1 =[]
for str1 in apname_data:
ap_split = str1.split(“;”) # 分割
for str2 in ap_split: # 展開
list1.append(str2)
list1 = list(set(list1)) # 重複を削除
# 各公報から出願人+発行年+持分とコードをリスト化
list2 = []
list3 = []
for n, str1 in enumerate(apname_data):
nap = str1.count(“;”) + 1
nen = py_list01[n]
motibun = 1/nap
code01 = code_list[n]
ap_split = str1.split(“;”) # 分割
for str2 in ap_split: # 展開
str3 = str2 + “,” + str(py_list01[n]) + “,” + str(motibun)
list2.append(str3) # 出願人+発行年+持分
list3.append(str(code01)) # コード
# 設定コードに絞り込み
bcd01 = ‘;’ + cd01 # 設定コードbcdに絞り込むために先頭に区切り符号「;」を付加
list4 = [] # 元リスト
for n1, str1 in enumerate(list2):
if bcd01 in list3[n1]:
list4.append(str1)
# 表の初期化
nx = len(nopy_list)
ny = len(list1)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nopy_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(list1):
arr1[y+1][0] = str1
# 出願人別年別集計
for str1 in list4:
str2= str1.split(“,”)
ap =str2[0]
nen =str2[1]
motibun = str2[2]
for y, str3 in enumerate(list1):
if arr1[y+1][0] == ap:
for x, str4 in enumerate(nopy_list):
if arr1[0][x+1] == int(nen):
arr1[y+1][x+1] += float(motibun)
# print(arr1[0:2]) # 元表
# 元表はヘッダを追加しており、ヘッダが文字でデータが数値になるためソートできないので、
# ヘッダ行を一旦削除し、合計データを追加し、合計欄でソートした後にヘッダを戻すことにした
# 1行目をコピー
a1_list = arr1[0][:]
# 1行目を削除
del arr1[0][:]
# aray1をリスト化
list3 = []
for str1 in arr1:
list3.append(str1)
# 行列数を算出
ny = len(list1)
nx = len(nopy_list)
# 合計を算出し追加
list4 = []
# 先頭の[]を削除
del arr1[0]
for y,str1 in enumerate(arr1):
ntot = 0
for x in range(nx+1):
if x>0:
ntot = ntot + arr1[y][x]
str1.append(ntot)
list4.append(str1)
# 合計でソート
arr1 = sorted(list4, key=lambda x:x[nx+1], reverse=True)
# 0行目にコピーを挿入
arr1.insert(0, a1_list)
# ヘッダを修正
arr1[0][0] = “出願人“
arr1[0].append(“合計“)
# nbestに絞り込み(上位出願人の年別発行件数(持分))
nbest = 10
arr_nbest = arr1[0:nbest+1][:] # ヘッダ+10行に絞り込み
# ヘッダコピー
head_list = arr1[0][:] # ヘッダ
# 上位出願人リストを作成
ap_list = []
for n1,str1 in enumerate(arr_nbest):
if n1 > 0:
ap_list.append(str1[0])
aptop_list = ap_list
# arr_nbestから件数リストを抽出
nenlast = len(arr_nbest)
# print(‘元の件数=’,arr_nbest)
nmax = 0
nxy_list = []
nxy_list0 = []
for n1, str1 in enumerate(arr_nbest): # Y軸
if n1 > 0:
nx_list = []
nx_list0 = []
for n2, nn in enumerate(str1): # X軸
if n2 == nnen+1: break # 合計欄を除く
if type(nn) != str: # 文字を除く
nx_list0.append(nn)
if (n2+1) == nenlast :
nn2 = nn*(npmend + 1)
nn2 = round(nn2,1)
nx_list.append(nn2)
else:
nx_list.append(nn)
if nn > nmax: nmax=nn
nxy_list.append(nx_list)
nxy_list0.append(nx_list0)
# print(‘元の件数=’,nxy_list0)
# print(‘月数補正後の件数=’,nxy_list)
# 発行件数%化
npxy_list = []
for str1 in nxy_list:
if n1 > 0:
npx_list = []
for n2, x2 in enumerate(str1):
n3= round(x2/nmax,2)
npx_list.append(n3)
npxy_list.append(npx_list)
# 変数名変更
x_list = nen_head_list
y_list = ap_list
print(‘x_list=’,x_list)
print(‘y_list=’,y_list)
print(‘nxy_list=’,nxy_list)
print(fig_n)
# def実行
buble0(x_list,y_list,nxy_list, fig_n)
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
figwrd = fig_n
para = doc.add_paragraph(‘ ‘ + figwrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
# (4) コード別出願人別発行件数の年別推移(バブルチャート)のコメント
# 最終年が最多の出願人を抽出
nnen = len(nen_list)
nap = len(ap_list)
npk_list = [] # ピーク件数
pkap_list = [] # 最終年が最多の出願人
for n1, str1 in enumerate(ap_list):
nxy_list01 = nxy_list[n1]
np = 0
for n2, str2 in enumerate(nxy_list01):
if str2>np:
np=str2 # ピーク件数
pknen = n2+1 # ピーク年
if pknen==nnen: # 最終年がピークならば
pkap_list.append(str1)
np = round(np,1)
npk_list.append(np)
# 最終年が最多の出願人数を書き出し
n2 = len(pkap_list)
# 書き出し人数書き出し
f = open(‘sub_txt.txt’, ‘a’)
f.write(str(n2) + “\n”)
f.close()
# 最終年の発行年件数読み込み
nlast_list =[]
for n1, str1 in enumerate(nxy_list):
nlast_list.append(str1[9])
if n1 == 9: break
# 最終年前年の発行年件数読み込み
nzennen_list =[]
for n1, str1 in enumerate(nxy_list):
nzennen_list.append(str1[8])
if n1 == 9: break
bcode = ap_list[0] # 1位の出願人名
# 最終年に増加した出願人を抽出
inc_ap_list = []
for n1, str1 in enumerate(ap_list):
if nlast_list[n1] – nzennen_list[n1] > 0:
inc_ap_list.append(str1)
# コメント追加
flg_n2 = 0
if n2 > 0:
wrd1 = ‘ このチャートによれば、以下の出願人は最終年が最多となっている。\n’
# 最終年が最多の出願人書き出し
wrd2 =”
for str1 in pkap_list:
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if n2 == 0:
wrd = ‘ このチャートによれば、最終年が最多となっている出願人はなかった。‘
flg_n2 = 1
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
# 重要出願人を抽出
## 最終年の件数が平均以上(ただし0件以外の平均)でかつピーク時の80%以上でかつ増加率が100%以上か
## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要出願人として書出す
#最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出
ct = 0
ntot = 0
nlast_list = []
nmae_list = []
for n in range(nap):
n0 = nxy_list[n][nnen-1] # 最終年の件数
if n0 > 0: ct = ct + 1
nlast_list.append(n0)
n1 = nxy_list[n][nnen-2] # 最終年前年の件数
nmae_list.append(n1)
ntot = ntot + n0
if ct > 0:
navr = round(ntot/ct,1) # 最終年の平均件数(ただし0件以外の平均)
else:
navr = 0
print(‘最終年の平均件数=’,navr,’対象件数=’,ct)
# 重要出願人を判定
vipap_list = []
for n1, str1 in enumerate(ap_list):
flg = 0
if nlast_list[n1] > navr: # 最終年の件数が平均以上
if nlast_list[n1] > (npk_list[n1]*0.8): # ピーク時の80%以上
if nmae_list[n1] > 0:
if (nlast_list[n1]/nmae_list[n1]) > 1: #増加率が100%以上
vipap_list.append(str1)
flg = 1
if flg == 0:
if nlast_list[n1] > navr: # 最終年の件数が平均以上
if nlast_list[n1] > (npk_list[n1]*0.95): # ピーク時の95%以上
vipap_list.append(str1)
print(‘重要出願人=’,vipap_list)
# 最終年が最多の出願人数を書き出し
n2 = len(vipap_list)
# 書き出し人数書き出し
f = open(‘sub_txt.txt’, ‘a’)
f.write(str(n2) + “\n”)
f.close()
# コメント追加
if n2 > 0:
wrd1 = ‘ 所定条件を満たす重要出願人は次のとおり。\n’
# 重要出願人書き出し
wrd2 =”
for str1 in vipap_list:
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if n2 == 0:
if flg_n2 == 0:
wrd = ‘ 所定条件を満たす重要出願人はなかった。\n’
else:
wrd = ‘ 所定条件を満たす重要出願人もなかった。\n’
# 増加した出願人書き出し
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# print(fig_n,’、‘,hyo_n)
return (nfig,nhyo,arr1)
# スクリブト85 3-2-AZ-(5) コード別新規参入企業(バブルチャート)(図表とコメント作成、書き出し)
## 最終年の件数が5件以上でかつ最近に新規参入した出願人を新規参入として抽出
## 調査開始年に発行公報が無かった出願人を抽出
## 年平均件数(=横合計件数/(最終年–発行開始年))を算出
## 平均増加率を算出
## 平均件数以上でかつ平均増加率以上の出願人を抽出
def buble_ap02(nfig,nhyo): # 3-2-AZ-(5) コード別新規参入企業(バブルチャート)
global ap_arr1
global nnen
global nen_list
global nen_head_list
global ncdtot
global npmend
# コメント追加
print(”)
wrd = ‘(5) コード別新規参入企業‘
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
ntot = ncdtot
nbest = 10
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
wrd1 = ‘ ‘ + fig_n + ‘は分析対象公報全体を対象として各出願人の新規参入評価点を集計し、‘
wrd2 = ‘評価点が高かった出願人の年別発行件数を数値付きバブルチャートとして示したものである。\n’
wrd01 = wrd1 + wrd2
print(‘wrd01=’,wrd01)
# コメント書き出し
wrd = wrd01
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# 調査開始年に発行公報が無かった出願人を抽出
# 先頭の[]を削除
sinki_arr1 = ap_arr1
list2 = copy.deepcopy(sinki_arr1) # arr1を深いコピー(参照元arr1を変化させない)
del list2[0]
head_list = sinki_arr1[0][:] # ヘッダ
list3 = [head_list] # ヘッダを追加
for str1 in list2:
if type(str1[1]) is float: # 開始年が0件ならばappend
if str1[1] == 0:
list3.append(str1)
if type(list2[1]) is int: # typeがintならばヘッダの年と判定しappend
list3.append(str1)
# 横合計を抽出
list4 = []
for str1 in list3:
str2= str1[nnen+1]
list4.append(str2)
# 年平均件数(=横合計件数/(最終年–発行開始年))を追加
nsokei = 0 # 年平均件数の合計
heikin = float(0)
ny = 0
nx = nnen
list5 = [] # 年平均件数
for y, str1 in enumerate(list3):
ny = ny + 1
if type(str1[1]) is float:
heikin = list4[y] / (nx-1)
nsokei = nsokei + heikin # 年平均件数の合計を算出
list5.append(heikin)
# 全平均件数を算出
pav = nsokei / len(list5)
# 平均件数以上でかつ平均増加率以上の出願人を抽出
list6 = [head_list] # 新規参入出願人リスト
for y,str1 in enumerate(list5):
if y == len(list5)-1: break
if type(str1) is float:
if str1 > (nsokei / ny): # 平均件数以上
if str1 > pav: # 平均増加率以上
list6.append(list3[y+1])
else:
if list3[y][nx-1] > 5: # 最終年の件数が5件以上
if list3[y][3] > 0: # 最近(調査開始年+2)に新規参入
list6.append(list3[y])
# 年平均件数(=横合計件数/調査期間)を算出
# 横合計欄=nnen+1
navr_list = [‘年平均件数‘]
for n1, nn1 in enumerate(list6):
if (n1+1) == (nnen): break
if n1> 0:
nn01 = round(nn1[nnen]/nnen,1)
navr_list.append(nn01)
# 平均増加率(=(最終年前年件数–調査開始年翌年件数)/(調査期間-2)を算出
npavr_list = [‘平均増加率‘]
for n1, nn1 in enumerate(list6):
if (n1+1) == nnen: break
if n1 >0:
np = (nn1[nnen-1] – nn1[2])/(nnen-2)
np = round(np,1)
npavr_list.append(np)
# 全年平均件数(=新規参入の縦合計/新規候補者数/調査期間)を算出
nall = (ntot/len(list6))/nnen # 全年平均件数
# 増加傾向出願人(=平均増加率>0)の全体平均増加率を算出
ntot = 0 # 増加傾向出願人の増加率
npall = 0 # 全体平均増加率
k = 0 # 増加傾向出願人の数
for n1, nn1 in enumerate(navr_list):
if n1 > 0:
if nn1 > 0: # 平均増加率>0
k=k+1
ntot = ntot + nn1
if k > 0:
npall = ntot/k # 全体平均増加率
else:
npall = 100
# 全年平均件数以上でかつ全体平均増加率以上の出願人(新規候補)を抽出
newap_list = [‘新規候補フラグ‘]
for n1, str1 in enumerate(list6):
if (n1+3) == nnen: break
if n1 > 0:
bap = 0
if navr_list[n1] > nall: # 全年平均件数以上でかつ
if npavr_list[n1] > npall: # 全体平均増加率以上ならば
bap = 1 # 新規候補フラグ =1
newap_list.append(bap)
# 発行年評価値(=最先発行年)を算出
fstnen_list = [‘発行年評価値‘]
for n1, nn1 in enumerate(list6):
if n1 > 0:
for n2, nn2 in enumerate(nn1):
if n2 > 0:
if nn2 > 0:
fstnen_list.append(n2+1)
break
# 合計件数評価値(=11-合計件数順位)を算出・付与
# 合計件数評価値を付与
k = 11
totrank_list = [‘合計件数評価値‘]
for n1, str1 in enumerate(list6):
if n1 > 0:
if k > 0:
k=k – 1
else:
k=0
totrank_list.append(k)
# 総合評価値を算出
sogo_list = [‘総合評価値‘]
print(‘fstnen_list=’,len(fstnen_list))
print(‘totrank_list=’,len(totrank_list))
print(‘newap_list=’,len(newap_list))
for nn1 in range(len(fstnen_list)):
if nn1 == (len(newap_list)): break
if nn1 > 0:
nn2 = (fstnen_list[nn1] + totrank_list[nn1])*newap_list[nn1]
sogo_list.append(nn2)
# 元表に追加
df1 = pd.DataFrame(list6)
df2 = pd.DataFrame(data=newap_list, columns=[‘新規候補フラグ‘])
df3 = pd.DataFrame(data=fstnen_list, columns=[‘発行年評価値‘])
df4 = pd.DataFrame(data=totrank_list, columns=[‘合計件数評価値‘])
df5 = pd.DataFrame(data=sogo_list, columns=[‘総合評価値‘])
df6 = pd.concat([df1, df2, df3, df4, df5], axis=1)
# ソートのために0行目(ヘッダ相当)を削除
df6 = df6.drop(df6.index[[0]])
# ソート
df6 = df6.sort_values(‘総合評価値‘, ascending=False) # 降順
# テスト用書き込み
df6.to_csv(‘新規参入評価表.csv’,encoding=’utf-8′, index=False)
# リスト化
arr6 = df6.values
# nbest読み込み
arr6 = arr6[0:nbest]
# 出願人リストを作成
ap_list = []
for n1,str1 in enumerate(arr6):
ap_list.append(str1[0])
# 発行年欄に絞り込み
top_arr6 = arr6[:,1:nnen+1]
# arr_nbestから件数リストを抽出
nenlast = len(top_arr6)
nmax = 0
nxy_list = []
nxy_list0 = []
for n1, str1 in enumerate(top_arr6): # Y軸
nx_list = []
nx_list0 = []
for n2, nn in enumerate(str1): # X軸
if n2 == nnen+1: break # 合計欄を除く
if type(nn) != str: # 文字を除く
nx_list0.append(nn)
if (n2+1) == nenlast :
nn2 = nn*(npmend + 1)
nn2 = round(nn2,1)
nx_list.append(nn2)
else:
nx_list.append(nn)
if nn > nmax: nmax=nn
nxy_list.append(nx_list)
nxy_list0.append(nx_list0)
# print(‘元の件数=’,nxy_list0)
# print(‘月数補正後の件数=’,nxy_list)
y_len = len(nxy_list)
# print(y_len)
# 発行件数%化
npxy_list = []
for str1 in nxy_list:
npx_list = []
for n2, x2 in enumerate(str1):
n3= round(x2/nmax,2)
npx_list.append(n3)
npxy_list.append(npx_list)
# 変数名変更
x_list = nen_head_list
y_list = ap_list
print(‘x_list=’,x_list)
print(‘y_list=’,y_list)
print(‘nxy_list=’,nxy_list)
print(fig_n)
# def実行
flg_n2 = 0
if len(nxy_list) > 1:
buble0(x_list,y_list,nxy_list, fig_n)
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
figwrd = fig_n
para = doc.add_paragraph(‘ ‘ + figwrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
else:
nfig = nfig – 1
fig_n = ‘図‘ + str(nfig)
flg_n2 = 1
# (5) コード別新規参入企業(バブルチャート)のコメント
# 新規参入企業として重要と判定された出願人(最終年の件数>=3)を判定
n2 = 0
newap_list = []
for n1, str1 in enumerate(nxy_list):
if n1 >= y_len: break
if str1[nnen-1] >= 3: # 最終年の件数>=3を判定
n2 = n2 + 1
newap_list.append(y_list[n1])
print(‘重要と判定された新規参入企業=’,n2,newap_list)
# コメント追加
if n2 > 1:
wrd1 = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)は次のとおり。\n’
# 出願人書き出し
wrd2 =”
for str1 in newap_list:
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
# コメント書き出し
wrd = wrd01 + wrd
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
if n2 <= 1:
if flg_n2 == 1: # チャートが無ければ
wrd = ‘ 新規参入企業として評価が高かった出願人は無かった。\n’
else:
wrd = ‘ このチャートによれば、重要と判定された新規参入企業(出願人)は無かった。\n’
# コメント書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
print(‘wrd=’,wrd)
# print(fig_n,’、‘,hyo_n)
return (nfig,nhyo)
# スクリブト86 3-2-AZ-(6) コード別の発行件数割合(判定、表作成、円グラフ)(図表とコメント作成、書き出し)
## 設定コードの下位コードであって10コードに近い階層を見つけ、その階層別の表と円グラフを作成する。
def cd_hyo01(nfig,nhyo):
global codehyo_list # code表
global ncd
global cdhead_list # 一桁コード+コード内容
global codehyo_list
global code01_list
global nketa # 3,4,6
global strketa # 三,四,六
# コメント追加
# wrd = ‘(6) コード別の発行件数割合\n’
print(”)
wrd = ‘(6) コード別の発行件数割合‘
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# (6) コード別の発行件数割合(表作成)
# コード欄データをリスト化
pd_data = pat_data.iloc[:,9] # コード欄
code_list =[]
for str1 in pd_data:
str1 = ‘;’ + str1
code_list.append(str(str1))
# 指定桁(nketa)コードとコード内容読み込み
code_nketa_list = []
codewrd_nketa_list = [] # 改行有りリスト
for str1 in codehyo_list:
if str1[1][0] == cd01:
if len(str1[1]) <= nketa:
code_nketa_list.append(str1[1])
str2 = str1[2]
if len(str2) > 30:
if len(str2) < 60:
str2 = ‘\n’ +str2[:29] + ‘\n’ + str2[29:58]
else:
str2 = str2[:29] + ‘\n’ + str2[29:58] + ‘\n’ + str2[58:87]
codewrd_nketa_list.append(str2)
code_nketa_list.append(‘ ‘)
codewrd_nketa_list.append(‘合計‘)
# 指定桁コード別合計算出(指定桁は下位の桁以下を含めて集計)
ntot = 0
ncd_nketa_list = [] # 指定桁コード別合計
for str1 in code_nketa_list:
nn = 0
for str2 in code_list:
if str1 in str2:
split_str2 = str2.split(‘;’)
for str3 in split_str2:
if len(str1) < nketa:
if str1 == str3:
nn = nn + 1
else:
if str1 == str3[0:nketa]:
nn = nn + 1
ntot = ntot + nn
ncd_nketa_list.append(nn)
nlast = len(code_nketa_list)
ncd_nketa_list[nlast-1] = ntot
# print(‘ncd_nketa_list=’,ncd_nketa_list)
# print(‘ncd_nketa_list[nlast-1]=’,ncd_nketa_list[nlast-1])
# %算出
flg0 = 0
np_nketa_list = []
for str1 in ncd_nketa_list:
if ntot> 0:
np = (str1/ntot)*100
np01 = round(np,1)
if np01 > 0: flg0 = 1
np_nketa_list.append(np01)
else:
np_nketa_list.append(0)
# コードZ99のコード内容を修正
for n1, str1 in enumerate(code_nketa_list):
if str1 == ‘Z99A’:
if code_nketa_list[n1-1] == ‘Z99’:
if ncd_nketa_list[n1-1] == 0:
codewrd_nketa_list[n1-1] = ‘上記以外のその他‘
if flg0== 0:
wrd = ‘ コード別の発行件数は無かった。‘
para = doc.add_paragraph(wrd)
print(wrd)
return (nfig,nhyo)
# 図表Noを加算
nhyo = nhyo + 1
hyo_n = ‘表‘ + str(nhyo)
# コメント追加
wrd1 = ‘ ‘ + hyo_n + ‘はコード「‘
wrd2 = cdhead_list[ncd]
wrd3 = ‘」が付与された公報のコードを‘
wrd4 = strketa
wrd5 = ‘桁別で集計した集計表である。\n’
wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# コードデータの行数
nline = len(code_nketa_list)
# DataFrame化(改行有り)
df1 = pd.DataFrame(data=code_nketa_list, columns=[‘コード‘])
df2 = pd.DataFrame(data=codewrd_nketa_list, columns=[‘コード内容‘])
df3 = pd.DataFrame(data=ncd_nketa_list, columns=[‘合計‘])
df4 = pd.DataFrame(data=np_nketa_list, columns=[‘%’])
# 横方向(axis=1)に結合
df5=pd.concat([df1, df2, df3,df4], axis=1)
# リスト化(改行有り)
arr1 = df5.values
print(hyo_n)
# コード別集計表作成
# 描画準備
table_vals = arr1 # 表データ
fig = plt.figure()
ax = fig.add_subplot(111) # nrows,ncols,indexが全て一桁のときは、カンマを省略して111で良い
# 表描画
col_labels = [‘コード‘,’コード内容‘,’合計‘,’%’]
the_table = plt.table(cellText=table_vals,
colWidths=[0.05,0.4, 0.05, 0.05], # 列の幅を指定
colLabels=col_labels,
loc=’center’)
the_table.set_fontsize(40)
the_table.scale(4, 5) # 全体のサイズをX=5、Y=10に設定
for x in range(4):
the_table[(0,x)].set_facecolor(‘lightgreen’) # ヘッダを薄緑色に着色
the_table[(0,x)].get_text().set_fontsize(’60’) # フォントサイズ=60
the_table[(0,x)].get_text().set_fontweight(‘bold’) # フォント種=bold
for j in range(nline+1):
if j > 0: # ヘッダを除いて
the_cell = the_table[j,0] # 1列目
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘left’)
the_cell = the_table[j,1] # 2列目
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘left’)
the_cell = the_table[nline,1] # 2列目
the_text = the_cell.get_text()
the_text.set_horizontalalignment(‘center’) # 「合計」をcenterに配置
plt.tick_params(axis=’x’, which=’both’, bottom=False, top=False, labelbottom=False)
plt.tick_params(axis=’y’, which=’both’, right=False, left=False, labelleft=False)
for pos in [‘right’,’top’,’bottom’,’left’]:
plt.gca().spines[pos].set_visible(False)
# 図表書き出し
plt.savefig(‘書き出し図表/’ + hyo_n +’.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
plt.show()
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + hyo_n + ‘.png’)
figwrd = hyo_n
para = doc.add_paragraph(‘ ‘ + figwrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
# 第1位を判定
nlast = len(arr1)
nmax = 0
cdmax = ”
cdwdmax = ”
npmax = 0
for n1, str1 in enumerate(arr1):
if n1 == nlast-1: break
if str1[2] > nmax:
nmax = str1[2]
cdmax = str1[0]
cdwdmax = str1[1]
npmax = str1[3]
# コメント追加
wrd1 = ‘ この集計表によれば、コード「‘
wrd2 = cdmax + “:” + cdwdmax
wrd2 = wrd2.replace(‘\n’,”) # 改行を削除
wrd3 = ‘」が最も多く、‘
wrd4 = str(npmax)
wrd5 = ‘%を占めている。\n’
wrd = wrd1 + wrd2 + wrd3 + wrd4 + wrd5
print(‘wrd=’,wrd)
# まとめに書き出し
m13_wrd01 = ‘下位分類の分析結果によれば、「‘ + wrd2 + ‘が特に多かった。\n’
m13_wrd = copy.deepcopy(m13_wrd01) # arr1を深いコピー(参照元arr1を変化させない)
# コメント書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# (6) コード別の発行件数割合(円グラフ作成)
# コメント追加
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
wrd =’ ‘ + fig_n + ‘は上記集計結果を円グラフにしたものである。\n’
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
nlast = len(df5)
df6 = df5.drop(df5.index[[nlast-1]]) # 1行目(ヘッダ相当)を削除
# リスト化
arr1 = df6.values
# 円グラフの描画データ作成
codewrd_nketa_list01 = []
cdwd_nketa_list01 = []
np_nketa_list01 = []
for str1 in arr1:
str2 = str1[0] + ‘:’ + str1[1][0:5]
codewrd_nketa_list01.append(str2)
str3= str1[0] + ‘:’ + str1[1]
nlen = len(str3)
if nlen > 15:
str4 = str3[0:15] + ‘・・・‘
else:
str4 = str3[0:15]
cdwd_nketa_list01.append(str4)
np_nketa_list01.append(str1[3])
# 凡例
hanrei_nm = cdwd_nketa_list01 # コード内容を凡例として格納
print(fig_n)
# 円グラフ作成
plt.pie(np_nketa_list01, labels=codewrd_nketa_list01, autopct=”%1.1f%%”,pctdistance=0.9,
startangle=90,counterclock=False)
# 円グラフの右横=2.7の位置に高さ=1で描画
plt.legend(hanrei_nm, fontsize=12,bbox_to_anchor=(2.7, 1)) # 凡例の表示
# 図表書き出し
plt.savefig(‘書き出し図表/’ + fig_n +’.png’,bbox_inches=’tight’, pad_inches=0.05)
# 描画実行
plt.show()
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
figwrd = fig_n
para = doc.add_paragraph(fig_n)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
# print(fig_n,’、‘,hyo_n)
return (nfig,nhyo)
# スクリブト87 3-2-AZ-(7) コード別発行件数の年別推移(判定、バブルチャート作成)(図表とコメント作成、書き出し)
## 設定コードの下位コードであって20コードに近い階層を見つけ、その階層別のバブルチャートを作成する。
def buble_cd01(nfig,nhyo):
global pat_list
global cd01
global cdhead01
global nen_list
global nen_head_list
global nnen
global ncd
global npmend
import copy
# コメント作成
print(”)
wrd = ‘(7) コード別発行件数の年別推移‘
# 書き出し
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# 設定した一桁コードのデータに絞り込む
nen_list01 = [] # 発行年データ
code_list01 = [] # コード欄データ
for str1 in pat_list:
str2 = ‘;’ + str1[9] # コード欄読み込み
if bcd01 in str2: # 設定一桁コードbcd01に絞り込む
str3 = str1[2] # 発行日欄を選択
str3 = str3[0:4]
nen_list01.append(str3)
str4 = str1[9] # コード欄を選択
code_list01.append(str4)
ncdtot = len(nen_list01)
# 設定一桁コードを含む公報から縦軸となるコードをリスト化
bcode_list =[]
for str1 in code_list01:
split_str1 = str1.split(‘;’)
for str2 in split_str1:
if str2[0] == cd01:
if len(str2) <= 6: # 6桁コードならば
bcode_list.append(str(str2))
# 重複なしコードリスト(縦軸)作成
ncd_code_list = list(set(bcode_list)) # 重複を削除
# 縦軸(コード)別年別件数を算出
# 集計表の初期化
nx = nnen + 1 # ex: 11(10年+合計欄)
ny = len(ncd_code_list) # ex: 44(コードA~A04A)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(nen_list):
arr1[0][x+1] = str1
arr1[0][0] = ‘コード‘
arr1[0][nx] = ‘合計‘
# 縦軸設定
for y, str1 in enumerate(ncd_code_list):
arr1[y+1][0] = str1
# コード別年別集計
for n1,str1 in enumerate(ncd_code_list): # 縦軸(コード)
str1 = ‘;’ + str1 + ‘;’
for n2, str2 in enumerate(code_list01): # コード欄データ
str2 = ‘;’ + str2 + ‘;’
if str1 in str2: # n2行のコードデータに縦軸(コード)が含まれていれば
nen = nen_list01[n2]
for n3, str3 in enumerate(nen_list):
if nen == str3:
nx01= n3 + 1
break
arr1[n1+1][nx01] += 1
arr1[n1+1][nx] += 1
# print(arr1[0:5]) # 元表
arr2 = []
for n1,str1 in enumerate(arr1):
if n1 > 0:
arr2.append(str1)
# 合計でソート(‘合計欄=’,nx)
arr2 = sorted(arr2, key=lambda x:x[nx-1], reverse=True)
# 上位20コードに制限
arr_nbest = []
code_20 = []
for n1, str1 in enumerate(arr2):
if n1 == 20: break
arr_nbest.append(str1)
code_20.append(str1[0])
# コードでソート
df1 = pd.DataFrame(data=code_20,columns=[‘コード‘])
df2 = pd.DataFrame(data=arr_nbest)
# 横方向(axis=1)に結合
df3=pd.concat([df1, df2], axis=1)
# ソート
df3 = df3.sort_values(‘コード‘, ascending=True) # 昇順
# 先頭率を削除
df3 = df3.drop(columns=0)
# リスト化
arr_nbest = df3.values
# print(‘arr_nbest=’,arr_nbest)
# 6桁上位20コード再現
code_20 = []
for n1, str1 in enumerate(arr_nbest):
code_20.append(str1[0])
# 上位20コードにコード内容付加
code_naiyo_20 = []
for str1 in code_20:
for str2 in codehyo_list:
if str2[1] == str1:
str3 = str1 + ‘:’ + str2[2]
code_naiyo_20.append(str3)
# arr_nbestから件数リストを抽出
nenlast = len(nen_list)
nmax = 0
nxy_list = []
nxy_list0 = []
for n1, str1 in enumerate(arr_nbest): # Y軸
nx_list = []
nx_list0 = []
for n2, nn in enumerate(str1): # X軸
if n2 == nnen+1: break # 合計欄を除く
if type(nn) != str: # 文字を除く
nx_list0.append(nn)
if (n2+1) == nenlast+1 :
nn2 = nn*(npmend + 1)
nn2 = round(nn2,1)
nx_list.append(nn2)
else:
nx_list.append(nn)
if nn > nmax: nmax=nn
nxy_list.append(nx_list)
nxy_list0.append(nx_list0)
# print(‘元の件数=’,nxy_list0)
# print(‘月数補正後の件数=’,nxy_list)
# 合計欄のリスト作成
ntot_list = []
for n1, str1 in enumerate(arr_nbest): # Y軸
str1 = int(str1[nx])
ntot_list.append(str1)
# 発行件数%化
npxy_list = []
for str1 in nxy_list:
npx_list = []
for n2, x2 in enumerate(str1):
if nmax < 0:
n3= round(x2/nmax,2)
npx_list.append(n3)
else:
npx_list.append(0)
npxy_list.append(npx_list)
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# print(fig_n)
# 変数名変更
x_list = nen_head_list
y_list = code_naiyo_20
print(‘x_list=’,x_list)
print(‘y_list=’,y_list)
print(‘nxy_list=’,nxy_list)
print(fig_n)
by_list = copy.deepcopy(y_list)
bnxy_list = copy.deepcopy(nxy_list)
if len(y_list) == 0:
nfig = nfig – 1
fig_n = ‘図‘ + str(nfig)
ewrd = ‘ コード別の発行件数は無かった。‘
para = doc.add_paragraph(ewrd)
print(ewrd)
return (nfig,nhyo)
else:
# def buble0実行
buble0(x_list,y_list,nxy_list, fig_n)
# コメント作成
wrd = ‘ ‘ + fig_n + ‘は六桁コード別の発行件数を年別に集計し、上位20までを数値付きバブルチャートにしたものである。\n’
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
figwrd = fig_n
para = doc.add_paragraph(‘ ‘ + figwrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
# (7) コード別発行件数の年別推移(バブルチャート)のコメント
flg_n2 = 0 # n2 == 1 なら flg_n2 = 1 にする
# 最終年が最多のコードを抽出
nnen = len(nen_list)
ncd20 = len(code_naiyo_20)
npk_list = [] # ピーク件数
pkcd_list = [] # 最終年が最多のコード
for n1, str1 in enumerate(code_naiyo_20):
nxy_list01 = nxy_list[n1]
np = 0
for n2, str2 in enumerate(nxy_list01):
if str2>np:
np=str2 # ピーク件数
pknen = n2+1 # ピーク年
if pknen == nnen: # 最終年がピークならば
pkcd_list.append(str1)
np = round(np,1)
npk_list.append(np)
# 最終年が最多のコード数を算出
n2 = len(pkcd_list)
# n2 = n2 +1
# 最終年の発行年件数読み込み
nxy_list = bnxy_list
nlast_list =[]
for n1, str1 in enumerate(nxy_list):
nlast_list.append(str1[nnen-1])
# print(‘nlast_list=’,nlast_list,len(nlast_list))
# 最終年前年の発行年件数読み込み
nzennen_list =[]
for n1, str1 in enumerate(nxy_list):
nzennen_list.append(str1[nnen-2])
# print(‘nzennen_list=’,nzennen_list,len(nzennen_list))
bcode = code_naiyo_20[0] # 1位のコード
# 最終年に増加したコードを抽出
inc_acs_list = []
code_naiyo_20 = by_list
for n1, str1 in enumerate(code_naiyo_20):
if nlast_list[n1] – nzennen_list[n1] > 0:
inc_acs_list.append(str1)
# コメント作成
flg_n2 = 0
if n2 > 0:
wrd1 = ‘ このチャートによれば、最終年が最多となっているコードは次のとおり。\n’
# 最終年が最多のコード書き出し
wrd2 =”
for str1 in pkcd_list:
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if n2 == 0:
wrd = ‘ このチャートによれば、最終年が最多のコードはなかった。\n’
flg_n2 = 1
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
# 重要コードを抽出
## 最終年の件数が平均以上でかつピーク時の80%以上でかつ増加率が100%以上か
## または最終年の件数が平均以上でかつピーク時の95%以上のものを重要として書出す
#最終年と最終年前年の件数をリスト化し、合計件数、平均件数を算出
xlast = len(nxy_list[0]) # リストの列数
# print(‘xlast=’,xlast)
ntot = 0
nlast01_list = []
nmae_list = []
for n in range(len(nlast_list)):
n0 = nxy_list[n][xlast-1] # 最終年(xlast-1)の件数
nlast01_list.append(n0)
n1 = nxy_list[n][xlast-2] # 最終年前年(xlast-2)の件数
nmae_list.append(n1)
ntot = ntot + n0
if ncd20 != 0:
navr = round(ntot/ncd20,1) # 最終年の平均件数
# 重要コードを判定
vipcd_list = []
for n1, str1 in enumerate(code_naiyo_20):
flg = 0
if nlast01_list[n1] > navr: # 最終年の件数が平均以上
if nlast01_list[n1] > (npk_list[n1]*0.8): # ピーク時の80%以上
if nmae_list[n1] > 0:
if (nlast01_list[n1]/nmae_list[n1]) > 1: #増加率が100%以上
vipcd_list.append(str1)
flg = 1
if flg == 0:
if nlast01_list[n1] > navr: # 最終年の件数が平均以上
if nlast01_list[n1] > (npk_list[n1]*0.95): # ピーク時の95%以上
vipcd_list.append(str1)
n2 = len(vipcd_list) # 最終年が最多のコード数
# コメント作成
if n2 > 0:
wrd1 = ‘ 所定条件を満たす重要コードは次のとおり。\n’
# 重要コード書き出し
wrd2 =”
for str1 in vipcd_list:
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
if n2 == 0:
if flg_n2 == 0:
wrd = ‘ 所定条件を満たす重要コードはなかった。\n’
else:
wrd = ‘ 所定条件を満たす重要コードもなかった。\n’
print(‘wrd=’,wrd)
# コメント書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# ループ回数書き出し
nloop02 = len(vipcd_list)
# print(‘サンプル公報のループ回数=’,nloop02)
if nloop02 == 0: return (nfig,nhyo)
# コメント作成
wrd = ‘ 上記重要コードのサンプル公報によれば、次のような技術が出願されていた。\n’
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# 重要コードのサンプル公報
## 上記重要コードを含む公報からサンプル10件を抽出し、発明の名称と要約の一部を書き出す。
# 公報データリスト化
pat_list = pat_data.values
# 公報番号読み込み
pn_list =[]
for n1, str1 in enumerate(pat_list):
str1= str1[0]
pn_list.append(str1)
# 発行日読み込み
pd_list =[]
for n1, str1 in enumerate(pat_list):
if n1 == 0:
str1= str1[2]
pd_list.append(str1)
if n1 != 0:
if “発行” not in str(str1[2]):
str1= str1[2]
pd_list.append(str1)
# 発明の名称読み込み
ti_list =[]
for n1, str1 in enumerate(pat_list):
str1= str1[3]
ti_list.append(str1)
# コード読み込み
cd_list =[]
for n1, str1 in enumerate(pat_list):
str1= str1[9]
cd_list.append(str1)
# print(‘コード=’,cd_list[0:2])
# 要約読み込み(最初の文を抽出し、不要文字を削除)
ab_list =[]
for n1, str1 in enumerate(pat_list):
str0 = str1[10].split(‘。‘) #「。」で分割
str1 = str0[0] + ‘。‘ # 最初の文を残す
if len(str1) > 3:
#データ中の空白を削除
str1 = (str1.replace(” “, “”)) # 半角空白を削除
str1 = (str1.replace(“ “, “”)) # 全角空白を削除
str1 = (str1.replace(“,”, “”)) # 「,」を「、」に置換
str1 = (str1.replace(“(57)”, “”)) # 「(57)」を削除
str1 = (str1.replace(“【要約】“, “”)) # 「【要約】」を削除
str1 = (str1.replace(“(修正有)“, “”)) # 「(修正有)」をを削除
str1 = (str1.replace(“【課題】“, “”)) # 「【課題】」をを削除
ab_list.append(str1)
else:
ab_list.append(‘要約無し‘)
print(‘要約の最初の文=’,ab_list[0:1])
# 重要コード毎にサンプル公報書き出し
for n1, str1 in enumerate(vipcd_list):
vipcd = str1
split_str1 = str1.split(‘:’)
vipcd01 = split_str1[0]
vipcd01 = ‘;’ + vipcd01 + ‘;’ # 重要コード
wrd =”
pn01_list = []
pd01_list = []
ti01_list = []
ab01_list = []
for n2, str2 in enumerate(cd_list):
str2 = ‘;’ + str2 + ‘;’
if vipcd01 in str2:
pn01_list.append(pn_list[n2])
pd01_list.append(pd_list[n2])
ti01_list.append(ti_list[n2])
ab01_list.append(ab_list[n2])
# DataFrame化
df1 = pd.DataFrame(data=pn01_list, columns=[‘公報番号‘])
df2 = pd.DataFrame(data=pd01_list, columns=[‘発行日‘])
df3 = pd.DataFrame(data=ti01_list, columns=[‘発明の名称‘])
df4 = pd.DataFrame(data=ab01_list, columns=[‘要約‘])
# 結合
df6=pd.concat([df1, df2, df3,df4], axis=1)
# サンプリング(n=10)
npn = len(pn01_list)
print(‘重要コード=’,vipcd01,’npn=’,npn,’件‘)
if npn>10:
df_allsample = df6.sample(n=10, random_state=0)
else:
df_allsample = df6
# ソート
df7 = df_allsample.sort_values(‘発行日‘, ascending=True) # 昇順
# リスト化
samp_arr = df7.values
# コード毎のコメントを作成
wrd = “[” + vipcd + “]”
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
wrd = ”
for str3 in samp_arr:
wrd = wrd + str3[0] + ” “+ str3[2] + “\n” + “ ” + str3[3] + “\n”+ “\n”
# サンプル公報書誌書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
# コメント追加(発明の名称を修正)
titlewrd_list0 =[]
for n1, str1 in enumerate(samp_arr):
str1 = str1[2]
if len(str1) > 100: str1 = str1[0:100] + “・・・” # 100文字/件までに制限
# print(n1,str1)
titlewrd_list0.append(str1)
# def実行(titlewrd_list0をdef titlematomeに渡し、処理結果をtitlewrd_list1として受け取る)
titlewrd_list1 = titlematome(titlewrd_list0)
# print(‘titlewrd_list1=’,titlewrd_list1)
# 2文字の単語を抽出
two_wrd = []
titlewrd_list =[]
for n1, str1 in enumerate(titlewrd_list1):
# リスト化
title0 = str1.split(‘、‘)
for str3 in title0:
if len(str3) == 1: str3 = “”
if len(str3) == 2:
if str3 not in two_wrd:
two_wrd.append(str3)
if str3 not in titlewrd_list:
titlewrd_list.append(str3)
# 削除する2文字単語を抽出
del_wrd = []
title_wrd = ”
for str1 in titlewrd_list:
for str2 in two_wrd:
if str2 in str1:
if str2 != str1:
del_wrd.append(str2)
# 上位表現を削除(ex:「対象識別」が有れば単語「識別」を削除する)
if len(del_wrd) > 0:
title_wrd = ”
for str1 in titlewrd_list:
for str2 in del_wrd:
if str1 != str2:
if title_wrd == ”:
title_wrd= str1
else:
if str1 not in title_wrd:
title_wrd= title_wrd + ‘、‘ + str1
else:
title_wrd = ”
for str1 in titlewrd_list:
if str1 not in title_wrd:
title_wrd = title_wrd + ‘、‘ + str1
# 残った付与文字を置換および削除
title_wrd = (title_wrd.replace(‘、、‘, ‘、‘)) # 「、、」を「、」に置換
title_wrd = (title_wrd.replace(‘、、‘, ‘、‘)) # 「、、」を「、」に置換
if title_wrd[0] == ‘、‘:
title_wrd = title_wrd[1:] # 先頭の「、」を削除
# コメント作成
wrd1 = ‘ これらのサンプル公報には、‘
wrd2 = title_wrd
wrd3 = ‘などの語句が含まれていた。\n’
wrd = wrd1 + wrd2 + wrd3
print(wrd)
# コメント書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# print(fig_n,’、‘,hyo_n)
return (nfig,nhyo)
# スクリブト88 3-2-AZ-(8) 出願人別・四桁コード別の公報発行状況(バブルチャート作成)(図表とコメント作成、書き出し)
## 設定コードの下位コードであって20コードに近い階層を見つけ、その階層別のバブルチャートを作成する。
def buble_ap03(nfig,nhyo):
global pat_list
global cd01
global nen_list
global nnen
global ncd
global ap_arr1
global codehyo_list
global nketa # 3,4,6
global strketa # 三,四,六
global npmend
print(”)
strketa = strketa + ‘桁‘
print(‘分析対象桁数=’,strketa)
# コメント追加
wrd1 = ‘(8) 出願人別・‘
wrd2 = ‘コード別の公報発行状況‘
wrd = wrd1 + strketa + wrd2
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
# 図表Noを加算
nfig = nfig + 1
fig_n = ‘図‘ + str(nfig)
# 設定した一桁コードのデータに絞り込む
ap_list01 = [] # 出願人欄データ
code_list01 = [] # コード欄データ
for str1 in pat_list:
str2 = ‘;’ + str1[9] # コード欄読み込み
if bcd01 in str2: # 設定一桁コードbcd01に絞り込む
str3 = str1[4] # 出願人欄を選択
ap_list01.append(str3)
str4 = str1[9] # コード欄を選択
code_list01.append(str4)
ncdtot = len(nen_list01) # 一桁コード別全公報件数
# 判定桁数(nketa)コードとコード内容読み込み(横軸)
code_nketa_list = [] # コード
codewrd_nketa_list = [] # コード内容
cd_wrd_list = [] # コード+コード内容
for str1 in codehyo_list:
if str1[1][0] == cd01:
if len(str1[1]) <= nketa:
code_nketa_list.append(str1[1])
str2 = str1[2]
codewrd_nketa_list.append(str2)
str3 = str1[1] + ‘:’ + str2
cd_wrd_list.append(str3)
# 主要出願人リスト作成
nbest = 10
aptop_list= []
for n1, str1 in enumerate(ap_arr1):
if n1 == nbest +1: break
if n1 > 0:
aptop_list.append(str1[0])
# 表の初期化
nx = len(cd_wrd_list)
ny = len(aptop_list)
arr1 = [[0.0 for x in range(nx+1)] for y in range(ny+1)]
# 横軸設定
for x, str1 in enumerate(code_nketa_list):
arr1[0][x+1] = str1
# 縦軸設定
for y, str1 in enumerate(aptop_list):
arr1[y+1][0] = str1
# 出願人別コード別集計
for n1, str1 in enumerate(aptop_list): # n1=y(上位出願人)
str1 = ‘;’ + str1 + ‘;’
for n2, str2 in enumerate(ap_list01): # 出願人欄データ
str2 = ‘;’ + str2 + ‘;’
if str1 in str2: # 「;A会社;B会社;C会社;」の中に「;A会社;」が含まれていれば
for n4, str3 in enumerate(code_nketa_list): # n4=x(設定桁数のコード)
str4 = code_list01[n2] # コード欄データ
split_str4 = str4.split(‘;’) # 「;」で分離してリスト化
for str5 in split_str4:
str5 = str5[0:nketa] # 先頭からnketaまでに修正
if str3 == str5: # nketaまではその桁数で比較、nketa以上はnketaまでで比較
arr1[n1+1][n4+1] += 1 # 先頭行、先頭列はヘッダなので+1の配列に加算
# print(arr1) # 元表
# 件数表作成
nenlast = len(arr1)
nmax = 0
nxy_list = []
for n1, str1 in enumerate(arr1): # Y軸
if n1 > 0:
nx_list = []
for n2, nn in enumerate(str1): # X軸
if n2 > 0:
if n2 == nenlast :
str1 = nn*(npmend + 1)
str1 = round(nn,1)
nx_list.append(nn)
else:
nx_list.append(nn)
if nn > nmax: nmax=nn
nxy_list.append(nx_list)
# 発行件数%化
npxy_list = []
for str1 in nxy_list:
npx_list = []
for n2, x2 in enumerate(str1):
if nmax > 0:
n3= round(x2/nmax,2)
npx_list.append(n3)
else:
npx_list.append(0)
npxy_list.append(npx_list)
# 変数名変更
x_list = code_nketa_list
y_list = aptop_list
print(‘x_list=’,x_list)
print(‘y_list=’,y_list)
print(‘nxy_list=’,nxy_list)
print(fig_n)
if nmax > 0:
# print(fig_n)
# def実行
buble0(x_list,y_list,nxy_list, fig_n)
# コメント追加
wrd1 = ‘ ‘ + fig_n + ‘は主要出願人がどのような技術に注力しているかを見るためのものであり、‘
wrd2 = ‘上位10社についてそれぞれ‘
wrd3 = ‘コード別に集計し、数値付きバブルチャートとしてまとめたものである。\n’
wrd = wrd1 + wrd2 + strketa + wrd3
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# 図表書き出し
doc.add_picture(‘./書き出し図表/’ + fig_n + ‘.png’)
figwrd = fig_n
para = doc.add_paragraph(‘ ‘ + figwrd)
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 中央揃え
para.runs[npara].font.size = docx.shared.Pt(14)
else:
# 図表Noを加算
wrd=’ 出願人別・三桁コード別の公報はなかった。‘
para = doc.add_paragraph(wrd)
print(wrd)
nfig = nfig – 1
fig_n = ‘図‘ + str(nfig)
doc.add_page_break() # 改頁
return (nfig,nhyo)
# (8) 出願人別・四桁コード別の公報発行状況(コメント)
## 各出願人が最も注力しているコードを抽出し、コード別にまとめ、書き出す
cd_ap_list = []
for n1, str1 in enumerate(arr1):
if n1 > 0:
nmax = 0
for n2, str2 in enumerate(str1):
if n2 > 0:
if str2 > 0:
if str2 > nmax:
nmax = str2
bcd = arr1[0][n2]
bap = arr1[n1][0]
if nmax > 0:
cdap = bcd + ‘;’ + bap
cd_ap_list.append(cdap)
# コード別に書き出し
bwrd = ”
wrd_list = []
for n1, str1 in enumerate(code_nketa_list):
for n2, str2 in enumerate(cd_ap_list):
split_str2 = str2.split(‘;’)
if str1 == split_str2[0]:
if cd_wrd_list[n1] != bwrd:
str3 = ‘[‘ + cd_wrd_list[n1] + ‘]’
wrd_list.append(str3)
str4 = ‘ ‘ + split_str2[1]
wrd_list.append(str4)
bwrd = cd_wrd_list[n1]
# コメント追加
wrd1 = ‘ このチャートから各出願人が最も注力しているコードを抽出し、コード別にまとめると以下のようになる。\n’
# コード取得
wrd2 =”
for str1 in wrd_list:
str1 = “ ” + str1 + “\n”
wrd2 = wrd2 + str1
wrd = wrd1 + wrd2
# コード書き出し
f = open(‘sub_txt.txt’, ‘a’)
f.write(wrd)
f.close()
print(‘wrd=’,wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
doc.add_page_break() # 改頁
# print(fig_n,’、‘,hyo_n)
return (nfig,nhyo)
# スクリブト89 コード別個別分析一括処理(図表、コメント書き出し)
## コード別個別分析一括処理
print(”)
print(‘出力サンプル‘)
# テスト用初期値設定
# nfig = 11
# fig_n = ‘図‘ + str(nfig)
# nhyo = 3
# hyo_n = ‘表‘ + str(nhyo)
doc.add_page_break() # 改頁
para = doc.add_paragraph(‘3-2 分類コード別個別分析‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
wrd = “ 分析対象公報を分析対象公報を一桁コード別(A~Z)に分け、それぞれのコードを分析した結果は以下のようになった。“
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)
# コードZは4桁に修正
print(‘cd01=’,cd01)
if cd01 == ‘Z’: nmin = 4
# 桁数を指定
nketa = nmin
if nketa == 3: strketa = ‘三‘
if nketa == 4: strketa = ‘四‘
if nketa == 6: strketa = ‘六‘
print(‘分析対象桁数=’,nketa) # 3,4,6
# def実行
if ncdtot >= 10: # 10件以上ならば
print(”)
print(‘出力サンプル(1)’)
x,y = bar_graph01(nfig,nhyo) # 3-2-AZ-(1) コード別発行件数の年別推移(棒グラフ)
nfig = x
nhyo = y
print(”)
print(‘出力サンプル(2)’)
x,y = ap_hyo01(nfig,nhyo) # 3-2-AZ-(2) コード別出願人別の発行件数割合(表と円グラフ)
nfig = x
nhyo = y
print(”)
print(‘出力サンプル(3)’)
x,y = bar_graph02(nfig,nhyo) # 3-2-AZ-(3)コード別出願人数の年別推移(棒グラフ)
nfig = x
nhyo = y
print(”)
print(‘出力サンプル(4)’)
x,y,str1 = buble_ap01(nfig,nhyo) # 3-2-AZ-(4) コード別出願人別発行件数の年別推移(バブルチャート)
nfig = x
nhyo = y
print(”)
print(‘出力サンプル(5)’)
ap_arr1 = str1 # str1をglobal化
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 Z99A~Z99Zのサンプル公報
## Z99A~Z99Zを含む公報からそれぞれサンプル10件を抽出し、発明の名称と要約の一部を書き出す。
# 以下を実行するかを判定
code_data = pd.read_csv(‘./中間data/Z_code表.csv’, encoding=’utf-8′)
code_list = code_data.values
print(code_list)
flg = 0
for str1 in code_list:
str1 = str1[1]
if str1 == ‘Z99A’: flg = 1
if flg == 0: print(‘Z99Aが含まれていないのでスキップ‘)
if flg == 1: print(‘Z99Aが含まれているので以下を実行‘)
# Z99A~Z99Zをリスト化
if flg == 1:
print(”)
print(‘出力サンプル‘)
para = doc.add_paragraph(‘3-3 その他(Z99)のコード別全体分析‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
wrd = “ その他(Z99)のコードが付与された公報が多かったので、その他(Z99)のコードが付与されたそれぞれの公報をサンプリングし、以下に、その概要を示す。“
print(wrd)
para = doc.add_paragraph(wrd)
para = doc.add_paragraph(‘3-1-1 一桁コード別の発行件数割合‘)
para.runs[npara].font.size = docx.shared.Pt(14)
para.runs[npara].bold = True
# Z99A~Z99Zをリスト化
code_data = pd.read_csv(‘./中間data/Z_code表.csv’, encoding=’utf-8′)
code_list = code_data.values
print(code_list)
zcd_list = []
for str1 in code_list:
str1 = str1[1]
if len(str1) == 4:
zcd_list.append(str1)
print(‘Z_code=’,zcd_list)
# 公報データリスト化
pat_data = pd.read_csv(‘./中間data/new_patlist4.csv’, encoding=’utf-8′)
pat_list = pat_data.values
# 公報番号読み込み
pn_list =[]
for n1, str1 in enumerate(pat_list):
str1= str1[0]
pn_list.append(str1)
# 発行日読み込み
pd_list =[]
for n1, str1 in enumerate(pat_list):
if n1 == 0:
str1= str1[2]
pd_list.append(str1)
if n1 != 0:
if “発行” not in str(str1[2]):
str1= str1[2]
pd_list.append(str1)
# 発明の名称読み込み
ti_list =[]
for n1, str1 in enumerate(pat_list):
str1= str1[3]
ti_list.append(str1)
# コード読み込み
cd_list =[]
for n1, str1 in enumerate(pat_list):
str1= str1[9]
cd_list.append(str1)
# print(‘コード=’,cd_list[0:2])
# 要約読み込み(最初の文を抽出し、不要文字を削除)
ab_list =[]
for n1, str1 in enumerate(pat_list):
str0 = str1[10].split(‘。‘) #「。」で分割
str1 = str0[0] + ‘。‘ # 最初の文を残す
if len(str1) > 3:
#データ中の空白を削除
str1 = (str1.replace(” “, “”)) # 半角空白を削除
str1 = (str1.replace(“ “, “”)) # 全角空白を削除
str1 = (str1.replace(“,”, “”)) # 「,」を「、」に置換
str1 = (str1.replace(“(57)”, “”)) # 「(57)」を削除
str1 = (str1.replace(“【要約】“, “”)) # 「【要約】」を削除
str1 = (str1.replace(“(修正有)“, “”)) # 「(修正有)」をを削除
str1 = (str1.replace(“【課題】“, “”)) # 「【課題】」をを削除
ab_list.append(str1)
else:
ab_list.append(‘要約無し‘)
print(‘要約の最初の文=’,ab_list[0:1])
# Z99コード毎にサンプル公報書き出し
pn01_list = []
pd01_list = []
ti01_list = []
for n1, str1 in enumerate(zcd_list):
zcd = str1
pn01_list = []
pd01_list = []
ti01_list = []
ab01_list = []
for n2, str2 in enumerate(cd_list):
if str1 in str2:
pn01_list.append(pn_list[n2])
pd01_list.append(pd_list[n2])
ti01_list.append(ti_list[n2])
ab01_list.append(ab_list[n2])
# DataFrame化
df1 = pd.DataFrame(data=pn01_list, columns=[‘公報番号‘])
df2 = pd.DataFrame(data=pd01_list, columns=[‘発行日‘])
df3 = pd.DataFrame(data=ti01_list, columns=[‘発明の名称‘])
df4 = pd.DataFrame(data=ab01_list, columns=[‘要約‘])
# 結合
df6=pd.concat([df1, df2, df3,df4], axis=1)
# サンプリング(n=10)
npn = len(ti01_list)
if npn >10:
df_allsample = df6.sample(n=10, random_state=0)
else:
df_allsample = df6
# print(str1,ti_sample)
# ソート
df7 = df_allsample.sort_values(‘発行日‘, ascending=True) # 昇順
# リスト化
samp_arr = df7.values
# コード毎のコメントを作成
wrd = “[” + zcd + “]”
print(wrd)
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
wrd = ”
for str3 in samp_arr:
wrd = wrd + str3[0] + ” “+ str3[2] + “\n” + “ ” + str3[3] + “\n”+ “\n”
print(wrd)
# 末尾を削除
if wrd[-2] == ‘\n’: # 末尾が ‘;’ならば末尾を除去
np = len(wrd)
wrd = wrd[0:np-2]
# サンプル公報書誌書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
# para.runs[npara].bold = True
# コメント追加(発明の名称を修正)
titlewrd_list0 =[]
for n1, str1 in enumerate(samp_arr):
str1 = str1[2]
if len(str1) > 100: str1 = str1[0:100] + “・・・” # 100文字/件までに制限
# print(n1,str1)
titlewrd_list0.append(str1)
# def実行(titlewrd_list0をdef titlematomeに渡し、処理結果をtitlewrd_list1として受け取る)
titlewrd_list1 = titlematome(titlewrd_list0)
# print(‘titlewrd_list1=’,titlewrd_list1)
# 2文字の単語を抽出
two_wrd = []
titlewrd_list =[]
for n1, str1 in enumerate(titlewrd_list1):
# リスト化
title0 = str1.split(‘、‘)
for str3 in title0:
if len(str3) == 1: str3 = “”
if len(str3) == 2:
if str3 not in two_wrd:
two_wrd.append(str3)
if str3 not in titlewrd_list:
titlewrd_list.append(str3)
# 削除する2文字単語を抽出
del_wrd = []
title_wrd = ”
for str1 in titlewrd_list:
for str2 in two_wrd:
if str2 in str1:
if str2 != str1:
del_wrd.append(str2)
# 上位表現を削除(ex:「対象識別」が有れば単語「識別」を削除する)
if len(del_wrd) > 0:
title_wrd = ”
for str1 in titlewrd_list:
for str2 in del_wrd:
if str1 != str2:
if title_wrd == ”:
title_wrd= str1
else:
if str1 not in title_wrd:
title_wrd= title_wrd + ‘、‘ + str1
else:
title_wrd = ”
for str1 in titlewrd_list:
if str1 not in title_wrd:
title_wrd = title_wrd + ‘、‘ + str1
# 残った付与文字を置換および削除
title_wrd = (title_wrd.replace(‘、、‘, ‘、‘)) # 「、、」を「、」に置換
title_wrd = (title_wrd.replace(‘、、‘, ‘、‘)) # 「、、」を「、」に置換
if title_wrd[0] == ‘、‘:
title_wrd = title_wrd[1:] # 先頭の「、」を削除
# コメント作成
wrd1 = ‘ これらのサンプル公報には、‘
wrd2 = title_wrd
wrd3 = ‘などの語句が含まれていた。\n’
wrd = wrd1 + wrd2 + wrd3
print(wrd)
# コメント書き出し
para = doc.add_paragraph(wrd)
para.runs[npara].font.size = docx.shared.Pt(11)
para.runs[npara].bold = True
doc.add_page_break() # 改頁
doc.save(‘report.docx’)
# スクリブト91 第四章 まとめ(コメント書き出し)
print(”)
print(‘出力サンプル‘)
# doc.add_page_break() # 改頁
para = doc.add_paragraph(‘第四章 まとめ‘)
para.runs[npara].font.size = docx.shared.Pt(16)
para.runs[npara].bold = True
wrd = “ この調査では、機械学習で使用されているpythonによりコード化し、コードを付与した公報データをグラフ化した。“
para = doc.add_paragraph(wrd) # この調査では、機械学習で使用されているpython
print(‘wrd=’,wrd)
# wrd01 = “ コード化はIPCを中心としており、その1桁コードは次のとおり。\n”
wrd01 = “ コード化はIPCを中心としており、その1桁コードは次のとおり。“
wrd = wrd01 + wrd_cd1_list
para = doc.add_paragraph(wrd)
print(‘wrd=’,wrd)
#コメント追加
with open(“matome.txt”,”r”) as f:
wrd = f.readlines()
para = doc.add_paragraph(wrd) # 分析結果は以下のとおり
print(‘wrd=’,wrd)
#エンドコメント追加
wrd = ‘ なお、この分析は全てプログラム処理による簡易的なものであるので、さらに精度の高い分析が必要であれば、特許調査会社の専門家による検索式作成と全件目視チェックによる分析を依頼することが望ましい(ただし数百万円と数ヶ月の期間が必要となるかもしれません)。‘
para = doc.add_paragraph(wrd) # なお、この調査はほとんどがプログラム処理
print(‘wrd=’,wrd)
doc.save(‘report.docx’)
# print(fig_n,’、‘,hyo_n)
print(‘レポート作成が終了しました。‘)