集計処理は次のとおり。
年別発行件数集計
出願人別発行件数集計
出願人別年別集計
一桁コード年別集計
三桁コード年別集計
四桁コード年別集計
六桁コード年別集計
コード一桁別出願人数集計
コード三桁別出願人数集計
コード六桁別出願人数集計
サンプルスクリプトは以下のとおり。
# スクリブト30 年別発行件数
## 開始年から終了年までの数値を作成し、文字に変換し、連続する発行年を作成する。
## 連続する発行年毎に発行件数を集計する。
## 集計した発行年と発行件数とを書き出す。
### file_name = 'patlist16.xlsx'。sheet = wb['年別発行件数']
# データ読み込み
pat_data = pd.read_csv('./中間data/new_patlist4.csv', encoding='utf-8')
# 発行日欄読み込み
pd_data = pat_data.iloc[:,2]
# 発行日読み込み
pd_list =[]
for str1 in pd_data:
if "発行" not in str(str1):
str0 = str(str1)[0:10]
pd_list.append(str(str0))
# 最終発行年データ読み取り
max_nengetu = []
for str1 in pd_list:
if '/' in str1:
split_str1 = str1.split('/')
str2 = split_str1[0]
str3 = split_str1[1]
if len(str3) == 1:str3 = '0' + str3
max_nengetu.append(str2 + str3)
if '-' in str1:
split_str1 = str1.split('-')
str2 = split_str1[0]
str3 = split_str1[1]
if len(str3) == 1:str3 = '0' + str3
max_nengetu.append(str2 + str3)
# print(max_nengetu[0:5])
#最終月判定
max_nengetu = max(max_nengetu) # maxデータを抽出
# print(max_nengetu)
monthend = max_nengetu[4:6]
print('最終月=',monthend,'月')
# 追加補正係数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['年別発行件数']
# データ読み込み
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 出願人数年別集計
## 出願人数を年別に集計する。
# データ読み込み
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 出願人別年別集計
## 各公報毎に持分を計算し、年別に集計し、出願人毎の発行件数(持分)を集計する。
# データ読み込み
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」に保存
# スクリブト39 一桁コード年別集計
## コードを一桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。
# データ読み込み
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 三桁コード年別集計
## コードを三桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。
# データ読み込み
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 四桁コード年別集計
## コードを四桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。
# データ読み込み
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 六桁コード年別集計
## コードを六桁に修正し、重複を除去した後に、各年毎に各コードの出現回数を集計する。
# データ読み込み
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 コード一桁出願人リスト
## コードを一桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。
### 横軸がコード、縦軸が出願人
# データ読み込み
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 コード三桁出願人リスト
## コードを三桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。
### 横軸がコード、縦軸が出願人
# データ読み込み
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 コード四桁出願人リスト
## コードを四桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。
### 横軸がコード、縦軸が出願人
# データ読み込み
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 コード六桁出願人リスト
## コードを六桁に修正し、重複を除去した後に、各出願人毎に各コードの出現回数を集計する。
### 横軸がコード、縦軸が出願人
# データ読み込み
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」に保存