Ubuntu18.04にtextlintをインストール

node.jsの最新バージョンをインストール

Installing Node.js via package manager | Node.js

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt install -y nodejs yarn

textlintをインストール

https://dotinstall.com/lessons/basic_textlint

github.com

npm install --save-dev textlint

npm init -y

npm i -D textlint textlint-rule-preset-japanese textlint-rule-preset-jtf-style
npm i -D textlint-rule-prh

./node_modules/.bin/textlint --init

.textlintrc設定ファイルが作成されるので、以下をコピペ

{
  "filters": {},
  "rules": {
    "preset-japanese": true,
    "preset-jtf-style": true,
    "prh": {
      "rulePaths": [
        "./prh.yml"
      ]
    }
  }
}

textlintが動くか確認

prh.ymlを作成

version: 1
rules:
  - expected: VS Code
    patterns: VSCode
    prh: 公式サイトによるとVS Codeらしい
$(npm bin)/textlint ./textlint.md

今治市内の病院(位置情報付)

病院名 診療科目 住所 TEL 緯度 経度
iクリニック内科・呼吸器内科 内呼放ア 今治市郷新屋敷町3-1-39 0898-22-1929 34.0417791 133.0020673
相原内科クリニック 内呼小リ 今治市本町2丁目1-27 0898-25-1311 34.0690784 133.0020984
あおい小児科 今治市東村5丁目9-37 0898-47-0033 34.0383135 133.0213954
あおのクリニック 外内整小胃リ 今治市菊間町浜1001 0898-54-5115 34.0374318 132.8455713
アキクリニック 心療精神 今治市共栄町2丁目2-1 0898-32-4886 34.0678284 132.999857
秋山整形外科・歯科 整リリウ 今治市桜井2丁目3-1 0898-36-6661 34.0223328 133.038305
朝倉内科循環器科クリニック 内循呼消放整リ 今治市朝倉下甲452-1 0898-56-2818 33.997477 133.020026
あゆみクリニック 泌耳透 今治市高部甲526-1 0898-36-5333 34.0942133 132.9749638
有津むらかみクリニック 内外小呼肛リ 今治市伯方町有津甲2335 0897-72-3200 34.205331 133.095226
医師会市民病院 外内胃循放リ 今治市別宮町7丁目1-40 0898-22-7611 34.0743577 132.9919774
井門クリニック 内整麻リ 今治市朝倉下甲1146-1 0898-56-1155 34.00234 133.012886
井出整形外科医院 整外リ 今治市片山3丁目3-46 0898-23-5924 34.0516048 132.9861388
井出病院 内消呼循ア 今治市常盤町7丁目3-6 0898-32-2866 34.0556959 132.9878222
井戸内科・消化器科 内消 今治市蔵敷町1丁目15-6 0898-34-7556 34.0576324 132.9992819
いのうえ産婦人科 産婦 今治市大門町1丁目5-2 0898-22-1073 34.0650812 132.9962741
今井皮膚泌尿器科医院 皮泌 今治市共栄町2丁目1-24 0898-22-1041 34.0679977 132.9994015
いまおか内科クリニック 内消糖 今治市北高下町2丁目1-48 0898-22-0660 34.0525255 133.0112913
今治十全医院 今治市大門町2丁目4-18 0898-22-1754 34.0670281 132.995416
今治セントラル病院 外内整脳リ胃 今治市松本町2丁目6-6 0898-22-5251 34.0630903 133.0027676
今治第一病院 外内眼リ心放耳整泌 今治市宮下町1丁目1-21 0898-23-2000 34.0665554 132.9895418
今治南病院 内外眼透 今治市四村103-1 0898-22-7300 34.0337601 132.984669
梅の木中医学クリニック 産婦麻 今治市玉川町小鴨部甲35-1 0898-55-2820 34.0295229 132.9702801
大西クリニック 内呼外リ 今治市大西町紺原甲827-1 0898-53-2282 34.0669676 132.9383588
胃大腸おおにし肛門科ひふ科 肛皮ア 今治市松本町1丁目7-25 0898-33-0024 34.0648733 133.0007513
上原内科 循消呼放 今治市北鳥生町3丁目4-8 0898-22-2202 34.0529086 133.0078806
愛媛県今治病院 総透 今治市石井町4丁目5-5 0898-32-7111 34.0855318 132.9869578
大三島中央病院 内外 今治市大三島町宮浦5318-1 0897-82-1111 34.2460183 132.997268
市立岡村診療所 内外 今治市関前岡村甲18-2 0897-88-2118 34.1850959 132.8850959
小澤外科循環器科 循外 今治市馬越町4丁目3-10 0898-32-1520 34.0532074 132.9834473
かいはらクリニック 外内 今治市南高下町3丁目2-8 0898-33-7770 34.0496676 133.014613
片木脳神経外科 脳リ外放 今治市別名274 0898-22-1102 34.0420616 132.9760308
片山医院 内外 今治市吉海町幸新田71 0897-84-2620 34.1469245 133.0420812
かとう内科 今治市立花町1丁目10-5 0898-23-2310 34.0530079 132.9973487
かとう耳鼻咽喉科 耳ア麻 今治市常盤町7丁目1-10 0898-33-7033 34.0564903 132.9907247
金藤内科 内呼消 今治市玉川町大野甲67-1 0898-55-2217 34.0227023 132.9436086
かもいけ診療所 内循 今治市大西町九王甲2019-16 0898-53-0881 34.0731174 132.9287312
鴨頭医院 内小 今治市大西町新町甲535 0898-53-2102 34.066878 132.931433
喜多嶋診療所 内小胃消 今治市伯方町木浦甲3449 0897-72-0250 34.203995 133.112822
木原病院 外整内脳リ消 今治市別宮町3丁目7-8 0898-23-0634 34.0693471 132.9946439
きら病院 産婦 今治市北宝来町1丁目3-5 0898-31-5711 34.0642091 132.9958658
銀座眼科 今治市常盤町3丁目6-6 0898-33-4636 34.0661341 132.9999125
消化器科久保病院 消放内 今治市内堀1丁目1-19 0898-41-3233 34.1041112 132.9674163
久保皮膚科クリニック 今治市馬越町3丁目3-38 0898-34-1211 34.0576512 132.979342
くろみつクリニック 泌透 今治市郷新屋敷町3丁目4-11 0898-32-110 34.0412708 133.0017396
光生病院 内外眼整呼消循リ 今治市室屋町3丁目2-10 0898-22-0468 34.0699253 132.9999348
済生会今治病院 総透 今治市喜田村7丁目1-6 0898-47-2500 34.044024 133.0199651
済生会今治第2病院 内胃泌外整放 今治市北日吉町1丁目7-43 0898-23-0100 34.0636919 132.9885474
斎藤クリニック 整内放リウリ 今治市吉海町仁江16-2 0897-84-4333 34.1486993 133.044217
桜井眼科 今治市桜井2丁目6-23 0898-47-1572 34.0203802 133.0372162
さとう内科クリニック 内胃呼ア 今治市大新田町3丁目4-8 0898-33-7233 34.0804656 132.991927
重見内科 内胃 今治市国分3丁目13-45 0898-48-2800 34.0263121 133.0214815
しのざき整形外科 整リ 今治市伯方町伊方甲1022-1 0897-73-1221 34.2208408 133.0675463
正光会今治病院 精神 今治市高市甲786-13 0898-48-2560 34.0267793 133.0143271
白石医院 内小 今治市伯方町木浦甲1229-1 0897-72-0016 34.2043671 133.1139116
白石病院 内外胃放リ 今治市松本町1丁目5-9 0898-32-4135 34.0656426 133.0008818
菅病院 内循呼消放 今治市南日吉町2丁目3-21 0898-32-5092 34.0560516 132.9922245
皮フ科鈴木クリニック 今治市大門町2丁目2-3 0898-25-1200 34.0666393 132.9960992
鈴木耳鼻咽喉科 耳気 今治市大門町2丁目2-3 0898-23-0532 34.066656 132.996088
鈴木病院 内胃放小 今治市別宮町2丁目1-5 0898-23-0500 34.0672865 132.9969741
瀬戸内海病院 内消循放小呼外整 今治市北宝来町2丁目4-9 0898-23-0655 34.0660003 132.9938217
高木眼科病院 今治市北宝来町2丁目3-1 0898-31-7500 34.0652921 132.9940689
高山内科病院 今治市大正町3丁目5-8 0898-22-7720 34.0704305 132.9967353
たくぼ眼科 今治市南宝来町3丁目2-9 0898-25-1230 34.058613 133.0017204
たけうちクリニック 内循 今治市旭町2丁目2-11 0898-25-8100 34.0629014 133.0016205
竹内外科胃腸科 外胃 今治市立花町3丁目6-36 0898-22-0132 34.0496584 132.9981513
武内産婦人科 産婦 今治市北日吉町1丁目18-7 0898-22-1536 34.0649725 132.9916859
武田医院 内小 今治市桜井4丁目12-31 0898-48-0131 34.0191081 133.0369968
武田脳神経外科 今治市南高下町3丁目2-10 0898-25-6417 34.0495065 133.0149491
丹こどもクリニック 小ア 今治市末広町3丁目4-12 0898-23-3200 34.061551 133.005259
丹皮ふ科 今治市末広町3丁目4-10 0898-33-4112 34.061257 133.005142
近松内科 内胃呼循 今治市大正町3丁目6-12 0898-23-5156 34.0699139 132.9965131
つばさ発達クリニック 精神 今治市南日吉町3丁目3-51 0898-34-5991 34.0543462 132.9902636
Dクリニック 心療 今治市大門町2丁目1-21 0898-22-5511 34.0659505 132.9955576
徳丸皮膚科 今治市北高下町3丁目4-58 0898-32-7377 34.0516088 133.0101303
中川こころのクリニック 神心療神内 今治市北日吉町1丁目2-11 0898-36-1122 34.0641949 132.9921136
長野整形外科 整リリウ 今治市高部甲532-1 0898-41-3111 34.094727 132.974982
波方中央病院 内神リ 今治市波方町樋口甲1683-1 0898-41-5911 34.0989838 132.9499311
西信内科医院 内消 今治市米屋町3丁目1-41 0898-22-5753 34.0695504 133.0007986
はかた外科胃腸科 外胃 今治市伯方町叶浦甲1667-25 0897-72-1711 34.2056978 133.0743687
波止浜内科・外科 内外 今治市地堀5丁目2-1 0898-41-9168 34.1036806 132.9624444
内科・消化器科羽鳥病院 内消放 今治市南宝来町3丁目2-3 0898-22-2898 34.058663 133.0022009
羽原小児科 今治市大西町宮脇463 0898-53-5116 34.0610949 132.9233616
林医院 内循呼 今治市菊間町浜414 0898-54-2006 34.0366791 132.8423911
日浅産婦人科医院 産婦 今治市立花町3丁目7-30 0898-24-1135 34.0499001 132.9983679
ひねのクリニック 心療神内精 今治市馬越町4丁目5-1 0898-32-8686 34.0548544 132.9824835
平林胃腸クリニック 内消 今治市河南町2丁目6-20 0898-31-5100 34.0480667 132.9924131
広川眼科診療所 今治市松本町3丁目3-1 0898-22-1161 34.0622682 133.0024593
広瀬病院 外内整リ放 今治市拝志1-26 0898-47-0100 34.0428271 133.0244479
広瀬クリニック 外内整リ放 今治市拝志3-1 0898-47-3111 34.0427882 133.0246923
整形外科藤井病院 整リ 今治市常盤町5丁目3-38 0898-24-1000 34.0603206 132.9941549
藤田医院 整リ 今治市桜井2丁目5-57 0898-47-1131 34.0209135 133.037955
古国分診療所 今治市古国分1丁目13番22号 0898-52-7645 34.027049 133.0396382
放射線第一病院 内放消循呼リ 今治市北日吉町1丁目10-50 0898-23-3358 34.064903 132.9902639
正岡眼科 今治市常盤町5丁目3-9 0898-25-8000 34.0602984 132.9948742
まつい小児科 今治市八町東2丁目4-41 0898-25-3636 34.0404484 132.9940988
松浦医院 内外 今治市上浦町井口5300 0897-87-3350 34.2679463 133.0407092
まつうらバンビクリニック 小ア 今治市北宝来町3丁目3-34 0898-22-0573 34.0669473 132.992247
松本小児科 今治市馬越町3丁目3-30 0898-32-5880 34.0576929 132.9800587
松本皮膚科医院 今治市大正町3丁目6-10 0898-22-7353 34.0702555 132.9963437
真部クリニック 内整外小 今治市矢田甲7-1 0898-22-0907 34.060481 132.972984
三木病院 整リ 今治市泉川町1丁目3-45 0898-32-4680 34.05716 132.9947797
美須賀病院 外内消循放小整リ脳 今治市黄金町3丁目4-8 0898-32-1212 34.0616657 133.0055116
水越耳鼻咽喉科 今治市南宝来町1丁目4-16 0898-32-3387 34.0616929 132.99776
みぶ小児科 今治市北宝来町3丁目1-27 0898-23-7525 34.0658586 132.992858
三宅川医院 今治市町谷甲17-2 0898-48-3850 34.0197174 133.0057426
宮窪診療所 内整 今治市宮窪町宮窪5250-1 0897-86-3331 34.1749825 133.0750131
村上医院 今治市吉海町本庄2988-1 0897-84-4300 34.1516906 133.0437253
村上耳鼻咽喉科 今治市高市甲267-1 0898-48-1199 34.0277755 133.0082761
村上整形外科 整リ 今治市松木28-7 0898-47-2515 34.031311 133.0054695
村上病院 今治市常盤町5丁目3-37 0898-22-8833 34.0602844 132.9937716
ムラシマ耳鼻咽喉科 今治市松本町1丁目7-14 0898-22-5563 34.0643122 133.0011651
耳鼻咽喉科医院 今治市松本町3丁目2-24 0898-33-1962 34.0621988 133.0027898
矢野眼科 今治市吉海町八幡218-1 0897-84-3400 34.1445165 133.0433978
矢野眼科大三島分院 今治市大三島町宮浦5161 0897-82-1650 34.2475126 133.0005732
山内病院 内消放リ透眼 今治市片山3丁目1-40 0898-32-3000 34.0516104 132.9845861
吉野病院 内循放リ 今治市末広町1丁目5-5 0898-32-0323 34.0650928 133.002476
吉正整形外科 整リ 今治市別宮町7丁目2-60 0898-33-3400 34.075613 132.990933
吉本循環器内科 循内心療 今治市旭町1丁目3-6 0898-31-4020 34.063826 132.9990765
よりい眼科 今治市小泉4丁目11-9 0898-22-4411 34.0468249 132.9794946
渡辺小児科・麻酔科医院 小麻 今治市風早町3丁目1-12 0898-22-0528 34.0708921 133.0016456
生名診療所休院 越智郡上島町生名972 0897-76-2125 34.2696712 133.1840688
岩城診療所 内放 越智郡上島町岩城2123-1 0897-75-3188 34.245361 133.1439849
魚島国保健康保険診療 内小 越智郡上島町魚島1-124-3 0897-78-0231 34.1784482 133.3225042
秦医院 内外 越智郡上島町弓削下弓削127-5 0897-77-2074 34.2594579 133.2039178
import pandas as pd
import folium

df = pd.read_table('imabari_hospital.tsv')

imabari_map = folium.Map(location=[34.06604300, 132.99765800], zoom_start=12)

for i, r in df.iterrows():
    if '総' in r['診療科目']:
        icon_color = 'red'
    elif '小' in r['診療科目']:
        icon_color = 'orange'
    elif '外' in r['診療科目']:
        icon_color = 'red'
    elif '内' in r['診療科目']:
        icon_color = 'blue'
    elif '産婦' in r['診療科目']:
        icon_color = 'pink'
    else:
        icon_color = 'green'
    folium.Marker(location=[r['緯度'], r['経度']], popup=r['病院名'] + ' ' + r['診療科目'], icon=folium.Icon(color=icon_color)).add_to(imabari_map)
    
imabari_map

pandas基本

http://www.atmarkit.co.jp/ait/articles/1802/13/news012.html

import pandas as pd
import numpy as np

dow = pd.read_csv("xxxx.csv", index_col=0)

# データの冒頭の部分だけを表示
dow.head()

type(dow)

# 簡単な統計情報を見る「describe」メソッド
dow.describe()

dow_open = dow["Open"]

dow_open.head()

type(dow_open)

# DataFrame型から複数の列を取り出す
dow_high_low = dow[["High", "Low"]]
dow_high_low.head()

# 条件による行の抽出
dow[dow["High"] > 24000]


np.random.seed(0)
df = pd.DataFrame(np.random.rand(8, 4), columns=["A", "B", "C", "D"])
df

# ラベルによる指定の「loc」メソッド
df.loc[3:5, ["B", "C"]]

# 位置による指定の「iloc」メソッド
df.iloc[3:5, 1:3]

# データの加工
df["E"] = df["C"] + df["D"]
df

df["A"] = df["B"] * 2
df

# ラベル指定して1つのセルを書き換える「at」メソッド
df.at[1, "A"] = -1
df

# 位置を指定して1つのセルを書き換える「iat」メソッド
df.iat[2, 0] = -1
df

# 欠損値の処理
df["F"] = [1, None, None, 1, None, None, None, None]
df

# 欠損値を無視する「dropna」メソッド
df.dropna()

# 欠損値を特定の値で書き換える「fillna」メソッド
df.fillna(value=0)

df

# 集計演算
## データの平均値を求める「mean」メソッド
df.mean()

## データの標準偏差を求める「std」メソッド
df.std()

## 任意の関数を適用する「apply」メソッド
df.apply(lambda x: x.max() - x.min())

# グループ化
df["G"] = ["X", "X", "Y", "Y", "Z", "X", "Z", "Y"]
df

## グループ化し集計
gr = df.groupby("G")
gr.sum()

# キーをインデックスとして扱いたくないときは、「as_index」フラグ
gr = df.groupby("G", as_index=False)
gr.mean()

# データの連結・結合
df1 = pd.DataFrame(np.random.rand(3, 3), columns=["A", "B", "C"])
df1

df2 = pd.DataFrame(np.random.rand(3, 3), columns=["A", "B", "C"])
df2

# 縦に連結する「concat」メソッド
df3 = pd.concat([df1, df2])
df3

# インデックスを振り直す「reset_index」メソッド
df3.reset_index(drop=True)

df1["D"] = ["A", "B", "D"]
df2["D"] = ["A", "B", "C"]

df1

df2

# 横に連結する「merge」メソッド
pd.merge(df1, df2, on="D")

# 外部結合
pd.merge(df1, df2, how="left", on="D")

# 配列型への変換 valuesプロパティ
df3.loc[:, ["A", "B", "C"]].values

今治の校区別人口を地図に表示

今治市オープンデータ一覧 | 情報政策課 オープンデータ | 今治市

平成30年度の今治市住民基本台帳人口統計

http://www.city.imabari.ehime.jp/opendata/toukei_jinkou/201805.xls

小・中学校

http://www.city.imabari.ehime.jp/opendata/data/school.csv

import io
import pandas as pd
import folium

df = pd.read_table(io.StringIO("""
school    latitude    longtude    population
富田小学校   34.034117   133.013897  11313
吹揚小学校   34.062174   133.004632  11194
日高小学校   34.045906   132.976149  10164
常盤小学校   34.059801   132.989257  10143
乃万小学校   34.064473   132.957729  9258
立花小学校   34.047734   133.001053  9144
桜井小学校   34.017379   133.034048  9054
波方小学校   34.104842   132.945771  8598
大西小学校   34.063777   132.923203  8434
鳥生小学校   34.048912   133.01326   8245
清水小学校   34.032847   132.984749  7270
近見小学校   34.089579   132.986088  6706
別宮小学校   34.071325   132.992401  6494
伯方小学校   34.205097   133.111311  6396
波止浜小学校    34.105954   132.965175  5600
国分小学校   34.032933   133.031261  5401
朝倉小学校   33.998541   133.01669   4382
菊間小学校   34.032773   132.84617   4018
吉海小学校   34.144926   133.041087  3498
大三島小学校    34.246862   133.000884  2941
上浦小学校   34.262876   133.031784  2744
九和小学校   34.021287   132.939051  2735
宮窪小学校   34.172273   133.072824  2600
鴨部小学校   34.022004   132.955834  2322
亀岡小学校   34.054804   132.872854  1832
岡村小学校   34.188051   132.883441  398
"""))

df.dtypes

imabari_map = folium.Map(location=[34.06604300, 132.99765800], zoom_start=12)

for i, r in df.iterrows():
    folium.CircleMarker(location=[r['latitude'], r['longtude']],
                        popup=r['school'], radius=r['population']/500).add_to(imabari_map)

imabari_map

JFLの試合結果から得点ランキング作成

#%%
import csv
from urllib.parse import urljoin
import time

import requests
from bs4 import BeautifulSoup


def cleaning(info, team, data):

    result = []

    for trs in data:

        temp = [i.get_text(strip=True) for i in trs.select('th, td')]
        
        # 時間の分を除去後、延長時間を計算
        temp[0] = eval(temp[0].rstrip('分'))

        # 名前のPKを削除
        temp[1] = temp[1].replace('(PK)', '').strip()

        result.append(info + [team] + temp)

    return result


def scraping(n, url):

    r = requests.get(url)

    if r.status_code == requests.codes.ok:

        soup = BeautifulSoup(r.content, 'html5lib')

        # シーズン・節
        score_season = soup.select_one(
            'div.score-header > h2.score-meta > span.score-season').get_text(
                strip=True).split()

        # 節
        score_season[1] = score_season[1].strip('第節')

        # print(score_season)

        # 日時
        score_date = soup.select_one(
            'div.score-header > h2.score-meta > span.score-date').get_text(
                strip=True).split()

        # print(score_date)

        # チーム名
        score_table = soup.select_one('table.score-table')

        home_team = score_table.select_one('th.score-team1').get_text(strip=True)
        away_team = score_table.select_one('th.score-team2').get_text(strip=True)

        # print(home_team, away_team)

        # 試合情報
        game_info = [n] + score_season + score_date + [home_team, away_team]

        # 得点
        for i in soup.select('div.section > h3'):

            # 得点のテーブルか確認
            if i.text == '得 点':

                table = [trs for trs in i.parent.select('div.score-frame > div.score-left > table > tbody > tr')]
                home_data = cleaning(game_info, home_team, table)

                table = [trs for trs in i.parent.select('div.score-frame > div.score-right > table > tbody > tr')]
                away_data = cleaning(game_info, away_team, table)

                score_data = home_data + away_data

                return (score_data)
            
        return None

if __name__ == "__main__":

    url = 'http://www.jfl.or.jp/jfl-pc/view/s.php?a=1270&f=2018A001_spc.html'

    r = requests.get(url)

    if r.status_code == requests.codes.ok:

        soup = BeautifulSoup(r.content, 'html5lib')

        with open('result.csv', 'w') as fw:
            writer = csv.writer(fw, dialect='excel', lineterminator='\n')
            writer.writerow(
                ['試合', 'シーズン', '節', '日付', '時刻', 'ホーム', 'アウェイ', '所属チーム', '時間', '背番号', '名前'])
            
            n = 0

            for link in soup.select('td.detail-link > a'):

                # 詳細のリンクか確認
                if link.text == '詳細':
                    
                    n += 1

                    spc_url = urljoin(url, link.get('href'))

                    # 詳細をスクレイピング
                    score_data = scraping(n, spc_url)

                    # CSVに保存
                    if score_data:
                        writer.writerows(score_data)

                    # 1秒待機
                    time.sleep(1)
#%%
df = pd.read_csv('result.csv')
df['得点'] = 1

# ゴール数ランキング
pv = df.pivot_table(
    values='得点', index=['選手名', 'チーム名'], aggfunc=sum, fill_value=0)
pv = pv.reset_index()

# オウンゴールを削除
pv.drop(pv.index[pv['選手名'] == 'オウンゴール'], inplace=True)

# ランキング
pv['順位'] = pv['得点'].rank(ascending=False, method='min')

# 順位・チーム名・名前で昇順
pv.sort_values(
    ['順位', 'チーム名', '選手名'], ascending=[True, True, True], inplace=True)

pv.set_index('順位', inplace=True)

df_goal = pv.loc[:, ['順位', '選手名', 'チーム名', '得点']]

df_goal.to_excel('jfl_goal_ranking.xlsx')