[PYTHON] Je souhaite mapper le code EDINET et le numéro de valeur

1 Qu'est-ce que cet article?

Supposons que vous souhaitiez télécharger un rapport sur les titres pour une société. Si vous connaissez le code EDINET du rapport titres remis par la société, vous pouvez obtenir le rapport titres rédigé au format XBRL à partir de l'API EDINET. Le rapport titres au format XBRL peut être consulté avec un navigateur. Une fois le fichier XBRL disponible, il est par exemple possible d'obtenir automatiquement les ratios de capital de centaines d'entreprises en utilisant la technologie du scraping. Cependant, comme les informations qui mappent le numéro de titres et EDINET ne sont pas publiées sur le net, j'ai créé un code pour les mapper.

En passant, ce qu'est XBRL est expliqué ici d'une manière facile à comprendre.

2 Comment mapper le CODE EDINET et le numéro de valeur

Flux de traitement </ b> 99.JPG

2-1 Obtenir la table de correspondance «Numéro de valeur» et «Raison sociale».

Ce site (Japan Exchange Group) fournit une liste des numéros de titres des sociétés cotées à la Bourse de Tokyo. Téléchargez au format de fichier csv. Faites ceci manuellement.

2-2 Obtenez la table de mappage de "EDINET CODE" et "Company name".

Le code EDINET est lié au rapport titres. En d'autres termes, différents codes EDINET sont attribués aux déclarations de titres de la même société mais à des années différentes. De plus, l ’ API EDINET est une spécification qui vous permet d’obtenir un rapport titres soumis un certain jour </ b>. Par conséquent, si vous pouvez obtenir le "CODE EDINET" et le "nom de la société" soumis tous les jours à partir d'aujourd'hui jusqu'à l'année écoulée, vous pouvez créer un tableau de correspondance du "CODE EDINET" et du "nom de la société" de toutes les sociétés cotées.

2-3 Obtenir la table de correspondance «Numéro de valeur», «CODE EDINET» et «Raison sociale».

Tableau de mappage du "Numéro de valeur" et du "Nom de la société" </ b> et Tableau de correspondance de "EDINET" et "Nom de la société" </ b> En utilisant "Nom de la société" comme clé, les deux mappages ci-dessus Fusionner les tables pour générer une table de mappage pour «Numéro de valeur», «Nom de la société» et «CODE EDINET».

3 Affichage du code

Vous trouverez ci-dessous le code python qui mappe le «numéro de titre», le «CODE EDINET» et le «nom de la société» expliqués ci-dessus.

Veuillez définir les conditions constantes suivantes avant d'exécuter le code </ b> ・ START_DATE Définissez la date et l'heure de début de la collecte des données de la société qui a soumis le rapport sur les titres. ・ END_DATE #Définissez la date et l'heure de fin de collecte des données de la société qui a soumis le rapport sur les titres -FPATH = 'Entrez ici le chemin du fichier csv de la table de mappage du "numéro de sécurité" et du "nom de la société". ' -SPATH = 'Entrez ici le chemin pour stocker le fichier csv de la table de mappage de "EDINET CODE" et "nom de la société". ' -OPATH = 'Livraison (Table de mappage du "Numéro de valeur", "Nom de la société" et "CODE EDINET") Entrez ici le chemin pour stocker le fichier csv. '

test.py




# -*- coding: utf-8 -*-
import requests
import datetime
import time
import pandas as pd
import os.path
import math
import numpy as np

#Définition de classe
class YUHO_GET():

    #Constructeur ... Ici, la variable est lue.
    def __init__(self,start_date, end_date,spath,fpath,sel):
        
        
        self.start_date=start_date
        self.end_date=end_date
        self.spath=spath
        self.fpath=fpath
        self.sel=sel
        
    
        
    #Obtenez le nom de la société, l'heure et le code EDIET du rapport de titres pour chaque date.
    def mainproc(self):

        day_list = self.make_day_list() #Une fonction qui génère une date entre le début et la fin d'une date

        securities_report_doc_list = self.make_doc_id_list(day_list) #Obtenez le nom de la société, l'heure et le code EDIET du rapport de titres pour chaque date.
        number_of_lists = len(securities_report_doc_list)
        print("number_of_lists:", len(securities_report_doc_list))
        print("get_list:", securities_report_doc_list)
       
        
    #Une fonction qui génère une date entre le début et la fin d'une date
    def make_day_list(self):
        print("start_date:", self.start_date)
        print("end_day:", self.end_date)

        period = self.end_date - self.start_date
        period = int(period.days)
        day_list = []
        for d in range(period):
            day = self.start_date + datetime.timedelta(days=d)
            day_list.append(day)

        day_list.append(self.end_date)

        return day_list

    #Obtenez le nom de la société et le code EDIET du rapport de titres pour chaque date.
    def make_doc_id_list(self,day_list):
        securities_yuho_list = []
        securities_4hanki_list = []
        com_edi=[]
        for index, day in enumerate(day_list):
            url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents.json"
            params = {"date": day, "type": 2}

            proxies = {
                "http_proxy": "http://username:[email protected]:8080",
                "https_proxy": "https://username:[email protected]:8080"
            }
            #Vous avez accédé à l'API EDINET et obtenu le type de document soumis à la date indiquée.
            res = requests.get(url, params=params, proxies=proxies)
            json_data = res.json()
            print(day)

            for num in range(len(json_data["results"])):
                #Obtenir des informations sur le type de document renvoyé par l'API EDINET.
                ordinance_code = json_data["results"][num]["ordinanceCode"]
                form_code = json_data["results"][num]["formCode"]

                 #S'il s'agit d'un rapport sur les valeurs mobilières, «ordonnance»_code == "010" and form_code == "030000""Fait référence au rapport sur les titres.
                if ordinance_code == "010" and form_code == "030000":
                    print('★★★★★★★★★★★★ Rapport sur les valeurs mobilières ★★★★★★★★★★★★★★★')                    
                    #Stocker le nom de l'entreprise dans comname
                    comname=json_data["results"][num]["filerName"]
                    #de comname"Co., Ltd."Supprimer. Il correspond à la crosse avant et à la crosse arrière.
                    comname=comname.split('Co., Ltd.')[0] if comname.split('Co., Ltd.')[0] != '' else comname.split('Co., Ltd.')[-1]
                    #S'il y a un espace dans comname, supprimez-le
                    comname=comname.split(' ')[-1] if comname.split(' ')[0]=='' else comname
                    
                    com_edi={ 'Nom de la compagnie':comname,
                              'saison':json_data["results"][num]["docDescription"],           
                              'EDINET':json_data["results"][num]["docID"],
                             'Date de dépôt':day
                         }
                    

                    securities_yuho_list.append(com_edi)
                    
                                        
            securities_report=securities_yuho_list if self.sel==0 else securities_4hanki_list
            securities_report=pd.DataFrame(securities_report,columns=['Nom de la compagnie','saison','EDINET','Date de dépôt'])
            securities_report.to_csv(self.spath)
            
            
                    
        return securities_report                


        
        
    #Fonction qui associe EDINET au numéro de valeur
    def edinet_syoken_mapping(self):
        df_all_syokennum = pd.read_csv(self.fpath) #Obtenez les numéros de titres de toutes les actions cotées sur le TSE.
        df_all_editnum = pd.read_csv(self.spath) #Nom de la compagnie,Lire le code EDINET
        df_edi_syo=df_all_editnum.loc[:,['Nom de la compagnie','EDINET']]
        df_edi_syo=pd.DataFrame(df_edi_syo,columns=['Nom de la compagnie','EDINET','code'])                                                     
        df_syoken=df_all_syokennum.loc[:,['code','Nom de la compagnie']]
              
  
        for i in range(len(df_edi_syo)): 
            #(3)"Nom de la compagnie",「証券番号」表と"Nom de la compagnie"「EDINETコード」表から"Nom de la compagnie"「証券番号」「EDINETコード」のマッピング表を得る。
            code=self.get_syouken_num(df_syoken,df_edi_syo.iloc[i]['Nom de la compagnie'])            
            df_edi_syo['code'][i]=code

        #Vers le numéro de valeur".0"Est donnée".0"Supprimer.
        
        df_edi_syo.set_index("code",inplace=True)     
        df_edi_syo.to_csv(OPATH)
        df_edi_syo = pd.read_csv(OPATH, index_col=0)
        df_edi_syo.reset_index("code",inplace=True)        
        df_edi_syo['code'] = df_edi_syo.apply(lambda x:self.bunri(x),axis=1)
        df_edi_syo.set_index("code",inplace=True)
        
        #df_edi_Écrivez syo dans un fichier csv.
        #print(df_edi_syo)
        df_edi_syo.to_csv(OPATH)
        
    
    #Une fonction qui sépare la partie entière et la partie fractionnaire
    def bunri(self,x):
        return x.code.split(".")[0]
        
        
    #(3)Obtenez le numéro de valeur du nom de la société.
    def get_syouken_num(self,df,company_name):
        flag=0
       
        try:
            df1=df[df.Nom de la compagnie==str(company_name)]
            meigara_num=df1.iloc[0][0].astype(str)
            
            return  meigara_num
        #Si le nom de la société et le numéro de titre ne peuvent pas être mappés, NONE est renvoyé.
        except Exception as e:
            flag='NONE'
            return flag
        
        
##################   MAIN ##################            
            
START_DATE= datetime.date(2019,8,7) #Définissez la date et l'heure de début de la collecte des données de la société qui a soumis le rapport sur les titres.
END_DATE= datetime.date(2020,8,6)   #Définissez la date et l'heure de fin de collecte des données de la société qui a soumis le rapport sur les titres.

SEL=0 # SEL=0:Acquérir un rapport sur les titres.


FPATH='Entrez ici le chemin du fichier csv de la table de mappage "Numéro de valeur" et "Nom de la société".' 
SPATH='Entrez ici le chemin pour stocker le fichier csv de la table de mappage de "EDINET CODE" et "nom de l'entreprise".'
OPATH='Livrables(Tableau de correspondance «Numéro de valeur», «Raison sociale» et «CODE EDINET»)Saisissez ici le chemin pour stocker le fichier csv.'

def main():

    yuho=YUHO_GET(START_DATE,END_DATE,SPATH,FPATH,SEL) #(1)Créez une instance. Réglez les paramètres.
    yuho.mainproc() #(2)Extraire le nom de la société et EDINET ayant soumis le rapport titres
    yuho.edinet_syoken_mapping() #(3)Mappez le numéro de titre et le numéro EDINET.
    
 
if __name__ == "__main__":
    main()

Recommended Posts