[Python] 基礎-6 csvファイルの読み込み

1.一般的な流れ

(1) “csv”モジュールを使った読み込み
“csv”モジュールをインポート import csv
open関数を使ってcsvファイルオブジェクト(csv_obj)を生成
csv_obj.reader ⇒ 行単位(iteratorプロトコル対応)オブジェクトをリスト形式で生成
csv_obj.DictReader ⇒ 行単位(iteratorプロトコル対応)オブジェクトを辞書形式で生成

(2) “panda”モジュールを使った読み込み
“panda”モジュールをインポート import pandas
データ分析用のモジュール・・・いつか使ってみたい

2.”csv”モジュールを使った読み込み

open関数

使い方の例:

with open(path+’\’+csv_A, mode=’r’, encoding=’utf_8′) as csv_obj:

引数     説明
mode“r”: read only
“w”: 書き込み許可
“x”: 排他的。
“a”:ファイルがあるときは追記
encoding 文字コード
 ”utf-8″:日本語
newlineex.: None, ”, ‘\n’, ‘\r’, ‘\r\n’

reader

使い方の例:

with open(ファイル名, mode=’r’, encoding=’utf_8′) as csv_obj:
csv_reader = csv.reader(csv_obj)
header = next(csv_reader)
print(header) 👈 headerはリスト
for row in csv_reader:
print(row[0]) 👈 rowはリスト

[Python] 出願人名の名寄せ

〘 課題 〙

「名寄せ」とは、表記を一つにまとめること。出願人名は、企業、団体、学校、研究機関、個人などの名称で、主体が同じでも完全に統一されていて変更されないというわけではない。例えば、会社名の変更、合併などで名称が変更されることがある。それ以外にも、関連会社などので1つのグループとして扱った方が良い場合もある。

〘 仕様 〙

処理対象:EXCELの特許文献リスト(「”db”シート」とする)
     「csvの前処理」を使って抽出した「筆頭出願人」カラムを持つことを想定
入力:「筆頭出願人」カラム
出力:「筆頭出願人(名寄せ)」カラム
「名寄せ」シート: 「筆頭出願人」と「筆頭出願人(名寄せ)」の対応付け

〘 名寄せシートの作り方 〙

「”db”シート」から「筆頭出願人」のピボットテーブルを作成

EXCELの「ピボットテーブル」を使うのは必須ではないが、出願件数の多い「筆頭出願人」を優先して、どのような名称を名寄せするかを検討する。
これをコピーして「名寄せ」シートを作成

名寄せ前の出願人名(Aカラム)を名寄せ後の出願人名(Bカラム)に対応付ける作業
出願件数の多い出願人名を優先して行い、上位何社(何人)まで行うかは、分析の目的による。

上の「パナソニックGr.」のように、「三洋電機」との合併、「松下電器産業」からの社名変更、「パナソニックIPマネージメント株式会社」などの関連会社など、まとめて扱いたいグループごとに、名寄せ後の出願人名を統一する。

名寄せ辞書の作成も、AIを活用するなどで自動化したいが、まだまだ検討中……
現段階では、マニュアルで進めるしかない。

〘 pythonによる処理 〙

〘 プログラムのポイント 〙

① 「名寄せ」シートを参照して、「名寄せ辞書」”name_dictionary”を作成。
   キー:元の出願人名
   値:名寄せ後の名称(空欄なら値は”None”)
   (「辞書」については、 基礎-2 リスト、タプル、辞書 を参照。)

② ”db”シートの各行(各特許文献)について、「筆頭出願人」が「名寄せ辞書」のキーのどれかに一致するので、値があればその値(名寄せ後の出願人名)、値がなければ(None)「筆頭出願人名」をそのまま、「筆頭出願人(名寄せ)」のカラムに出力する。

〘 処理結果 〙

出願人名を名寄せした後で、もう一度ピボットテーブルを作ると、出願人グループごとに出願件数を集計することができる。

特許マップDIYサポートキャンペーン 第3回

外出自粛/在宅勤務 応援企画

特許マップDo It Yourself
サポートキャンペーン 第3回

(緊急事態宣言期間中無料)

緊急事態宣言が、昨年4月、今年1月に続き三度発出されてしまいました。特許マップDIYサポートの無料サービスキャンペーンも、このたびもう一度行うことにしました。この災禍を福に転じたいと願っております。

かねがね、特許マップを自分で作ってみたいと思っていた方、チャレンジしてみませんか?
新型コロナウィルスの脅威はありますが、まとまった時間がとれる機会は増えているのではないでしょうか? 

    • ・検索式作成 相談、代行
    • ・ヒット文献集合csvダウンロード
    • ・Excel(関数/ピボット/マクロ)操作 

特許マップを作るには、まず目的に合った特許文献集合を作る必要があります。是非、この機会にご相談ください。弁理士の職業的守秘義務の範囲です。業務上のテーマについてもご相談いただけます。

商用の検索データベースを利用できない方には、作成した文献集合をcsvダウンロードして無償提供します。

Excel(関数/ピボット/マクロ)については、セミナーのプレゼン資料(Seminar-PatentSearch-and-Map_20190703)か拙著を参考に進めてください。こみ入った内容のご質問にはSkype, ZoomなどのWeb会議システムで対応いたします。Excelシート画面を共有しながらQ&Aできますので。

メール(mail to: kojima#aq-patent.com 注:「#」を「@」に代えてください)でお申し込みください。

特許マップDIYサポートキャンペーン 第2回

外出自粛/在宅勤務 応援企画

特許マップDo It Yourself
サポートキャンペーン
 第2回

(緊急事態宣言期間中無料)

緊急事態宣言が、残念ながら昨年4月に続き再び発出されてしまいました。特許マップDIYサポートの無料サービスキャンペーンも、このたびもう一度行うことにしました。この災禍を福に転じたいと願っております。

かねがね、特許マップを自分で作ってみたいと思っていた方、チャレンジしてみませんか?
新型コロナウィルスの脅威はありますが、まとまった時間がとれる機会は増えているのではないでしょうか? 

    • ・検索式作成 相談、代行
    • ・ヒット文献集合csvダウンロード
    • ・Excel(関数/ピボット/マクロ)操作 

特許マップを作るには、まず目的に合った特許文献集合を作る必要があります。是非、この機会にご相談ください。弁理士の職業的守秘義務の範囲です。業務上のテーマについてもご相談いただけます。

商用の検索データベースを利用できない方には、作成した文献集合をcsvダウンロードして無償提供します。

Excel(関数/ピボット/マクロ)については、セミナーのプレゼン資料(Seminar-PatentSearch-and-Map_20190703)か拙著を参考に進めてください。こみ入った内容のご質問にはSkype, ZoomなどのWeb会議システムで対応いたします。Excelシート画面を共有しながらQ&Aできますので。

メール(mail to: kojima#aq-patent.com 注:「#」を「@」に代えてください)でお申し込みください。

[Python] ダウンロードしたcsvに対する発明者分析

〖 課題 〗

ダウンロードしたcsvファイルの特許文献リストから、発明者ごとに出願年と件数を抽出することによって、出願人がリストの特許分野に何人の発明者を投入したのかを知ることができる。

〖 仕様 〗

入力:
csvファイルで、「発明者」、「出願日」、「出願日(受理)」が含まれている。
同じ特許の出願公開と特許公報は、予め1件のレコード(文献)にまとめられている
出力:
別のシート(”発明者”)に、1列目に発明者の一覧、2列目以降に出願年ごとの出願件数を出力
「出願年」は「出願日(受理)」ではなく「出願日」に基づく。分割出願は最初の親出願の出願日になる。1件の出願からn件の分割出願が行われたときには、最初の1件の出願年に1+n件の出願されたとカウントされる。

注:分割出願をカウントから除くためには改良が必要

〖 処理例 〗

入力:

事例研究「任天堂スイッチの特許戦略(2020.9更新)」で収集した任天堂スイッチの関連特許115件

発明者名は、複数のときは「;」で区切られている。

 

出力:

初めて出願した年の順に並べ替え、発明者の個人名を伏せて、件数をexcelの「条件付き書式」で色分けして示した。

中核メンバーが誰か、長く従事しているのか、新規に投入された人はその後も継続的に従事しているのかがわかる。ただし、任天堂スイッチの事例では、出願年の範囲がまだ狭く、あまり明確には顕れていない。

詳しくは、事例研究「任天堂スイッチの特許戦略(2020.9-10更新)」に、「発明者分析を追加(2020.10.9)」を追加して更新した(ご参考)。

《 プログラムの構成 》

<入力>
csvダウンロードしたデータから構成したEXCELファイル
csvデータは”db”シート

<出力>
同じEXCELファイルの”発明者”シート
pythonでは上の表を作るところまで、並べ替えや条件付き表示は手作業(Excel操作)

注:csvデータの数(特許文献数)、出願年の範囲などを固定値としてプログラム
  したがって、プログラムとしての汎用性はない。

line 6: os, openpyxlを使用。osはgetcwdでpathを取得するため、openpyxlはexcelファイルを扱うため

line 8-11: ファイル名、シート名などのパラメータ指定

line 13-15: excelファイルを開き、2つのシート(csvデータ”db”と出力用の”発明者”シート)をオブジェクト化

line 17: inventor_dict=発明者の辞書(発明者名をkey、出願年のリストを値とする辞書型データ;出願年は複数になるので単独の整数ではなくリスト型とする)
この行ではinventor_dictを空データに初期化。

line 18-29:csvデータの115件の特許文献情報を順次取得して処理するループ
注:csvデータ内のデータ(レコード数)を適応的にするには、シートオブジェクト.max_rowメソッドを使う

line 19-20:ある1件の特許について、発明者(inventors)情報と出願日(appl_date)情報を取得
inventors=発明者名が”;“区切りで連結された長い文字列

line 21-22:発明者(inventors)が空白でなければ、”;“で分割してリスト型に変換

line 23-29:その特許(line18のループで1件ずつ選ばれている特許)のすべての発明者について繰り返すループ

line 24-29:line 23のループで指している発明者が、inventor_dict(発明者の辞書)のkeyに既に存在するかどうかを調べ、
存在してなければ(line 25)、「その発明者:[出願年]」のデータをinventor_dictに追加
存在していれば(lien 26-29)、その発明者をkeyとする要素の[出願年]リストに、その特許の出願年を要素として追加する

ここまででデータ解析は完了
inventor_dictは、以下のようになる
発明者1:[出願年1, 出願年2, ・・・]
発明者2:[出願年x, 出願年y, ・・・]

line 30-42:”発明者”シートへの出力
1列目に発明者名、2列目以降に出願年ごとの出願件数をカウントして出力

〖 プログラムソース 〗

# -*- coding: utf-8 -*-
"""
発明者解析
"""
#
import os, openpyxl
#
path = os.getcwd()
file_name  = "20200825_Switch特許family.xlsx"
sheet_name = "発明者検索"
sheet_SW = "db172"     # SWITCH特許
#
# シートオブジェクトを生成
workbook = openpyxl.load_workbook(path+"\\"+file_name)
sheet_obj = workbook.get_sheet_by_name(sheet_name)
SWpat_obj = workbook.get_sheet_by_name(sheet_SW)
#
# SWITCH特許のリストを作成
SWpatents = []
for i in range(2,173):
    SWpatents.append(SWpat_obj.cell(row=2,column=i).value)
#
# SWITCH発明者のリストを作成
SWinventors = []
for i in range(29,172):
    SWinventors.append(sheet_obj.cell(row=2,column=i).value)
#
# "発明者検索"シートでの解析
for l in range(3,sheet_obj.max_row+1):
# 共同出願解析
    applicants = sheet_obj.cell(row=l,column=7).value
    if "任天堂" in applicants:
        if ";" in applicants:
            sheet_obj.cell(row=l,column=24).value = applicants.replace("任天堂株式会社","N")
        else:
            sheet_obj.cell(row=l,column=23).value = 1               # 任天堂単独出願
# SWITCH特許か否かの判定
    appl_num = sheet_obj.cell(row=l,column=2).value
    if appl_num in SWpatents:
        sheet_obj.cell(row=l,column=25).value = 1                   # SWITCH特許
# 発明者解析
    inventors = sheet_obj.cell(row=l,column=8).value
    if inventors is None:
        sheet_obj.cell(row=l,column=26).value = 0                   # 発明者数
    else:
        inventor_list = inventors.split(";")
        sheet_obj.cell(row=l,column=26).value = len(inventor_list)  # 発明者数
        num_SWinv = 0
        for inventor in inventor_list:
            for col in range(29,172):
                if inventor == SWinventors[col-29]:
                    num_SWinv +=1
                    sheet_obj.cell(row=l,column=col).value = 1      # SW発明者のフラグ処理
        sheet_obj.cell(row=l,column=27).value = num_SWinv           # SW発明者数
        sheet_obj.cell(row=l,column=28).value = len(inventor_list) - num_SWinv        
#
workbook.save(path+"\\"+file_name)