稼働中

(v_03)出現回数を数えるカウンター

Counter

collections.Counterの代わりのデータ出現回数を数える自作のカウンターを作成してみました。
記事(v_02)ではヤフーの地震データリストからcollections.Counterを使って地震頻度を調べました。
collections.Counterの代わりのカウンターを作成してみました。

カウンターのスクリプト

リストデータ d=[‘a’, ‘a’, ‘b’, ‘a’, ‘c’, ‘t’, ‘o’, ‘t’, ‘o’, ‘t’, ‘t’]を{要素1:回数,要素2:回数, …}の型に変換し、回数の多い順に並べ替えます。


count_def_01b.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# リストデータを要素(keys),重複数(values) のリストにする
def chg_Data(l_dat):
    #キーと重複値のリストデータを形成する
    keys=[]
    values=[]
    for s in l_dat:
        #キーデータがない場合は追加し、値を1で登録する
        if s not in keys:
            keys.append(s)
            values.append(1)
        #キーが重複しているので重複場所を探して値を+1する 場所を毎回探すので遅い?
        else:
            for i in range(len(keys)):
                if keys[i]== s:
                    values[i]=values[i]+1
                    
    return keys,values      # [要素リスト], [重複数リスト]を返す

#データの重複数をカウント、辞書型して並び変える
# リストデータ
d=['a', 'a', 'b', 'a', 'c', 't', 'o', 't', 'o', 't', 't']

#データの重複数をカウント
keys,values=chg_Data(d)

#辞書型に
d=dict(zip(keys, values))
#並び変える
r=sorted(d.items(),key=lambda x:x[1], reverse=True)
#表示する
print(r)

実行結果
無事に出現回数順のデータになりました。
>>> %Run count_def_01b.py
[('t', 4), ('a', 3), ('o', 2), ('b', 1), ('c', 1)]

地震データ収集

地震データ収集の記事(v_02)におけるcollections.Counterの代わりに先記のdef chg_Dataを使用してみました。


bs4_03_mycount_01b.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import urllib.request
from bs4 import BeautifulSoup
#
keys=[]         #地震場所名のリスト
values=[]       #地震場所名の出現回数のリスト
#
# リストデータを要素(keys),重複数(values) のリストにする
def chg_Data(l_dat):
    #キーと重複値のリストデータを形成する
    for s in l_dat:
        #キーデータがない場合は追加し、値を1で登録する
        if s not in keys:
            keys.append(s)
            values.append(1)
        #キーが重複しているので重複場所を探して値を+1する 場所を毎回探すので遅い?
        else:
            for i in range(len(keys)):
                if keys[i]== s:
                    values[i]=values[i]+1
    return keys,values
#
#地震データ取得ページ数
page=int(input ('Enter page(1-479): '))
#
s=0 # 数
total=0
count=0
place=[]      # 場所だけ

for p in range(page):
    p_val=str(p)+'01'
   
    url='https://typhoon.yahoo.co.jp/weather/jp/earthquake/list/?sort=1&key=1&b='+p_val

    req = urllib.request.Request(url)
    html = urllib.request.urlopen(req)
    soup = BeautifulSoup(html, "html.parser")

    q_index=soup.find(id="eqhist")

    # 数
    s=s+len(q_index.find_all('tr'))

    for tr in q_index.find_all('tr'):
        d_dat=[]
        for td in tr.find_all('td'):
            m_data=td.string
            if m_data== None:
                #None なら追加しない
                continue
            #日時、場所、マグニチュード、最大震度
            d_dat.append(m_data)
        
        if d_dat==[]:
            # 空なら追加しない  項目行が空
            continue            
        total=total+1
        #
        #震度が'1'と'---'、場所が'---'は除外する
        if d_dat[3]=='1' or d_dat[3]=='---' or d_dat[1]=='---':
            continue
        #
        count=count+1
        if count==1:
            d_st=d_dat[0]                   #最初の日時
            
        #場所データをdef_chg_Dataで累積
        keys,values=chg_Data([d_dat[1]])    #場所だけ
        
        d_en=d_dat[0]                       #最後の日時

d=dict(zip(keys, values))
r=sorted(d.items(),key=lambda x:x[1], reverse=True)#値の大きい順

#地震データ頻度結果
print('')
print(s,total,count)         #処理数(tr)、データ数、条件内使用データ数
print('rank10', r[0:10])     #上位10表示
print(f'{d_st.split()[0]} ~ {d_en.split()[0]}')    #収集データ期間

実行結果

地震ページを50ページで地震データ取得した結果です。collections.Counterを使った記事(v_02)と同様の結果になるので問題無くカウントできていると思います。やや処理が速いような気もしますが・・?です。


>>> %Run bs4_03_mycount_01b.py
Enter page(1-479): 50

5050 5000 1849
rank10 [('石川県能登地方', 322), ('トカラ列島近海', 261), ('福島県沖', 129), ('能登半島沖', 101), 
('宮城県沖', 70), ('茨城県南部', 38), ('岩手県沖', 36), ('沖縄本島北西沖', 34), ('茨城県沖', 33), 
('千葉県東方沖', 32)]
2024年1月6日 ~ 2021年12月4日

まとめ

データの出現回数を数える自作のカウンターが出来たと思います。