Spaces:
Sleeping
Sleeping
Commit
·
8f3ff15
1
Parent(s):
941851a
add visualize sample
Browse files- address.csv +118 -0
- app.py +191 -55
- requirements.txt +4 -1
address.csv
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name,address
|
| 2 |
+
仙台駅前院,宮城県仙台市青葉区中央3-6-1 仙台TRビル東館 7F
|
| 3 |
+
福島院,福島県福島市置賜町1-29 佐平ビル 1F
|
| 4 |
+
郡山院,福島県郡山市駅前2丁目3番7号エリート30ビル7F・8F
|
| 5 |
+
宇都宮院,栃木県宇都宮市駅前通り1-4-6 トナリエ宇都宮 5F
|
| 6 |
+
水戸院,茨城県水戸市宮町1-7-33 水戸サウスタワー 6F(水戸オーパ内)
|
| 7 |
+
川口院,埼玉県川口市栄町3-8-15 近代グループBLD.23号館 8F
|
| 8 |
+
大宮東口院,埼玉県さいたま市大宮区仲町1-15 VORT大宮 7F
|
| 9 |
+
新宿東口院,東京都新宿区歌舞伎町1-27-5 歌舞伎町APMビル 7F
|
| 10 |
+
新宿三丁目院,東京都新宿区新宿3-1-20 メットライフ・JTB新宿スクエア 7F
|
| 11 |
+
池袋西口院,東京都豊島区西池袋5-1-3 メトロシティ西池袋ビル 3F
|
| 12 |
+
池袋駅前院,東京都豊島区東池袋1-8-1 WACCA IKEBUKURO 6F
|
| 13 |
+
渋谷西口院,東京都渋谷区道玄坂2-23-12 フォンティスビル 3F
|
| 14 |
+
渋谷東口院,東京都渋谷区渋谷2-19-15 宮益坂ビルディング 3F
|
| 15 |
+
世田谷院,東京都世田谷区池尻2-31-24 信田ビル 7F
|
| 16 |
+
中野院,東京都中野区中野3-34-32 凱旋ビル 3F
|
| 17 |
+
立川院,東京都立川市曙町2-11-2 フロム中武 6F
|
| 18 |
+
銀座二丁目院,東京都中央区銀座2-6-9 Ginza269ビル 9F
|
| 19 |
+
銀座有楽町院,東京都千代田区有楽町2-3-5 aune有楽町 5F
|
| 20 |
+
上野院,東京都台東区上野4-10-5 ヒューリック上野公園前ビル 7・8F
|
| 21 |
+
秋葉原院,東京都千代田区神田佐久間町1-13 チョムチョム秋葉原 8F
|
| 22 |
+
高田馬場院,東京都新宿区高田馬場2-17-15 唐橋ビル 7F・8F
|
| 23 |
+
町田院,東京都町田市原町田6-3-3 町映ビル 5F
|
| 24 |
+
千葉駅前院,千葉県中央区新千葉2-2-1 新日本EXビル 3F
|
| 25 |
+
横浜院,神奈川県横浜市西区北幸1-8-2 犬山西口ビルヂング 3F
|
| 26 |
+
新横浜院,神奈川県横浜市港北区新横浜2丁目5-14 WISENEXT新横浜 7F
|
| 27 |
+
名古屋栄院,愛知県名古屋市中区栄3-28-11 名古屋ゼロゲート 2F
|
| 28 |
+
名古屋駅前院,愛知県名古屋市中村区名駅3-26-6 ThirdKHビル 5F
|
| 29 |
+
京都駅前院,京都府京都市下京区七条通烏丸東入真苧屋町195番地 福井ビル3F
|
| 30 |
+
江坂院,大阪府吹田市江坂町1-21-17 ESAKA松尾ビル 3F
|
| 31 |
+
堺院,大阪府堺市堺区北瓦町2-4-12 岡本ビル 5F
|
| 32 |
+
心斎橋筋院,大阪府大阪市中央区心斎橋筋1-4-12 心斎橋日光ビル 4F
|
| 33 |
+
心斎橋院,大阪府大阪市中央区南船場4-4-10 辰野心斎橋ビル 4F
|
| 34 |
+
梅田大阪駅前院,大阪府大阪市北区曽根崎2-8-15 K'sスクエアビル 3F
|
| 35 |
+
梅田茶屋町院,大阪府大阪市北区茶屋町2-28 セントラル茶屋町 3・4F
|
| 36 |
+
神戸院,兵庫県神戸市中央区琴ノ緒町5-3-2 三宮駅前平和ビル 7F
|
| 37 |
+
福岡天神院,福岡県福岡市中央区天神2-7-6 DADAビル 6F
|
| 38 |
+
福岡博多院,福岡県福岡市博多区博多駅東2-4-6 ハカタベビル 3F
|
| 39 |
+
小倉院,福岡県北九州市小倉北区米町1-1-1 小倉駅前ひびきビル 4F
|
| 40 |
+
広島院,広島県広島市中区本通9-30 ランドマークビル 3F
|
| 41 |
+
岡山院,岡山県岡山市北区駅前町1-1-21 成通ハリービル 4F
|
| 42 |
+
八王子院,東京都八王子市旭町2-5 八王子ツインタワーA館 4F
|
| 43 |
+
横浜駅前院,神奈川県横浜市西区北幸1-1-8 エキニア横浜 7F
|
| 44 |
+
姫路院,兵庫県姫路市駅前町247番地 御幸苑ビル 2F
|
| 45 |
+
品川院,東京都港区高輪3-23-17 品川センタービルディング 201
|
| 46 |
+
静岡院,静岡県静岡市葵区紺屋町17-1 葵タワー 2F 201
|
| 47 |
+
柏院,千葉県柏市柏1-2-37 柏ちば興銀ビル 6F
|
| 48 |
+
川越院,埼玉県川越市脇田本町1-2 山崎ビル 4F
|
| 49 |
+
札幌駅前院,北海道札幌市中央区北4条西2-1-2 キタコートレードビル 6F
|
| 50 |
+
川崎院,神奈川県川崎市川崎区駅前本町12-1 川崎駅前タワー・リバーク B2F
|
| 51 |
+
ブレインクリニック新宿,東京都新宿区新宿4-2-23 新四curumuビル 8F
|
| 52 |
+
ブレインクリニック東京,東京都中央区日本橋2-2-2 マルヒロ日本橋ビル 8F
|
| 53 |
+
ブレインクリニック名古屋,愛知県名古屋市中村区名駅3-26-6 ThirdKHビル 3F
|
| 54 |
+
ブレインクリニック大阪,大阪府大阪市北区曽根崎新地2-4-1 ホテルマイステイズプレミア堂島 地下1F
|
| 55 |
+
熊本院,熊本県熊本市中央区上通町1-26 auneKUMAMOTO 8F
|
| 56 |
+
鹿児島院,鹿児島県鹿児島市中央町11番地 鹿児島中央ターミナルビル 2F
|
| 57 |
+
高崎院,群馬県高崎市八島町46-1 高崎オーパ 8F
|
| 58 |
+
天王寺院,大阪府大阪市阿倍野区阿倍野筋1-5-36 アベノセンタービル 2F
|
| 59 |
+
TCBスキンクリニック大阪駅前院,大阪府大阪市北区梅田2-1-21 レイズ ウメダビル 8F
|
| 60 |
+
ブレインクリニック浜松町,東京都港区浜松町2-7-17 イーグル浜松町ビル 5F
|
| 61 |
+
仙台広瀬通院,宮城県仙台市青葉区中央1-6-27 仙信ビル 4F
|
| 62 |
+
宮崎院,宮崎県宮崎市高千穂通2-6-18 NMビル 7F
|
| 63 |
+
岐阜院,岐阜県岐阜市神田町8-9-2 白木ビル 4F
|
| 64 |
+
長野院,長野県長野市南千歳1-1-1 ながの東急百貨店 別館シェルシェ 5F
|
| 65 |
+
金沢院,石川県金沢市堀川町4-1 セントラルビル 5F
|
| 66 |
+
新潟院,新潟県新潟市中央区花園1-2-2 コープシティ花園ガレッソ 2F
|
| 67 |
+
奈良院,奈良県奈良市小西町21-1 小西町商業ビル(な・ら・ら) 2F
|
| 68 |
+
北千住院,東京都足立区千住2-26-2 EXCEL33 3F
|
| 69 |
+
六本木院,東京都港区六本木5-1-3 ゴトウビルディング1st 8F
|
| 70 |
+
新宿西口院,東京都新宿区西新宿1-17-1 日本生命新宿西口ビル 2F
|
| 71 |
+
大宮西口院,埼玉県さいたま市大宮区桜木町2-3 ダイエー大宮店 3F
|
| 72 |
+
金山院,愛知県名古屋市熱田区金山町1-4-6 アルティメイト金山 7F・8F
|
| 73 |
+
自由が丘院,東京都目黒区自由が丘2-11-23 南風ビル 5F
|
| 74 |
+
なんば院,大阪府大阪市中央区難波4-2-1 難波御堂筋ビルディング 9F
|
| 75 |
+
京都四条院,京都府京都市下京区四条通東洞院東入立売西町66番地 京都証券ビル 5F
|
| 76 |
+
浜松院,静岡県浜松市中央区鍛冶町140 浜松Cビル 3F
|
| 77 |
+
枚方院,大阪府枚方市岡東町8-9 枚方SGビル 5F
|
| 78 |
+
和歌山院,和歌山県和歌山市美園町4-81-1 SOPHIA和歌山イーストプラザⅠ号館 3F
|
| 79 |
+
高松院,香川県高松市兵庫町11-6 カーニープレイス高松兵庫町ビル 3F
|
| 80 |
+
四日市院,三重県四日市市諏訪栄町10-7 ことぶきビル 2F
|
| 81 |
+
長崎院,長崎県長崎市大黒町14-5 ニュー長崎ビルディング 2F
|
| 82 |
+
那覇院,沖縄県那覇市久茂地1-1-1 パレットくもじ 9F
|
| 83 |
+
船橋院,千葉県船橋市本町1-7-6 ドリーム船橋ビル 5F
|
| 84 |
+
松山院,愛媛県松山市湊町5-4-25 日切ビル 5F
|
| 85 |
+
越谷院,埼玉県越谷市南越谷1-15-1 南越谷ラクーン 4F
|
| 86 |
+
高知院,高知県高知市はりまや町2-3-3 はりまやビル 1F・2F
|
| 87 |
+
倉敷院,岡山県倉敷市阿知1-7-1 天満屋倉敷店 5F
|
| 88 |
+
福井院,福井県福井市中央1-3-3 KIビル 3F
|
| 89 |
+
札幌大通院,北海道札幌市中央区南1条西2-18 IKEUCHI GATE 5F
|
| 90 |
+
久留米院,福岡県久留米市東町39-8 第21上野ビル 3F
|
| 91 |
+
富山院,富山県富山市桜町1-1-1 電鉄富山駅ビル エスタ 3F
|
| 92 |
+
藤沢院,神奈川県藤沢市南藤沢22-1 神中第二ビル 3F
|
| 93 |
+
千葉東口院,千葉県千葉市中央区富士見2-5-15 塚本千葉第3ビルディング 5F
|
| 94 |
+
佐賀院,佐賀県佐賀市駅前中央1- 4-17 コムボックス佐賀駅前 2F
|
| 95 |
+
つくば院,茨城県つくば市吾妻1-7-1 トナリエつくばスクエア トナリエクレオ 3F
|
| 96 |
+
豊田院,愛知県豊田市喜多町1-140 ギャザ 3F
|
| 97 |
+
高槻院,大阪府高槻市城北町2-11-1 山木ビル 3F・4F
|
| 98 |
+
山形院,山形県山形市香澄町1-15-28 ホテルニュー最上屋 2F
|
| 99 |
+
青森院,青森県青森市新町1-7-1 THREE 4F
|
| 100 |
+
秋田院,秋田県秋田市中通4-12-7 川上第二ビル 3F
|
| 101 |
+
盛岡院,岩手県盛岡市菜園1-10-1 パルクアベニュー・カワトク 8F
|
| 102 |
+
大分院,大分県大分市府内町2-1-4 トキハ会館 2F
|
| 103 |
+
本厚木院,神奈川県厚木市中町3-6-17 オーイズミホールディングス厚木ビル 5F
|
| 104 |
+
大阪阪急梅田駅前院,大阪府大阪市北区芝田2-6-30 梅田清和ビル 2F
|
| 105 |
+
徳島院,徳島県徳島市寺島本町西1丁目 駅前ポッポ街 セントラルビル 2F
|
| 106 |
+
松戸院,千葉県松戸市松戸1307-1 キテミテマツド 8F
|
| 107 |
+
前橋院,群馬県前橋市表町2-30-8 アクエル前橋 B1F
|
| 108 |
+
名古屋駅前桜通院,愛知県名古屋市中村区名駅3-25-3 大橋ビルディング 3F
|
| 109 |
+
豊橋院,愛知県豊橋市広小路1-18 ウェルプラザユメックスビル B1F
|
| 110 |
+
松江院,島根県松江市朝日町480-8 松江SKYビル 2F
|
| 111 |
+
周南徳山駅ビル院,山口県周南市銀座1-31 TOKUYAMA DECK 2F
|
| 112 |
+
福山院,広島県福山市東桜町1-1 アイネスフクヤマ2F
|
| 113 |
+
松本院,長野県松本市中央二丁目3-17知新堂ビル2F
|
| 114 |
+
三島院,静岡県三島市本町3-29 三島本町タワー3F 301
|
| 115 |
+
草津院,滋賀県草津市大路1-1-1 エルティ932ビル 3F
|
| 116 |
+
西鉄福岡天神駅前院,福岡県福岡市中央区天神1-4-1 西日本新聞会館15F
|
| 117 |
+
旭川駅前院,北海道旭川市一条通8-108 フィール旭川4F
|
| 118 |
+
山梨甲府駅前院,山梨県甲府市丸の内二丁目16番4号 丸栄ビル3F
|
app.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
import streamlit as st
|
|
|
|
| 2 |
import pandas as pd
|
| 3 |
import matplotlib.pyplot as plt
|
| 4 |
import japanize_matplotlib
|
|
@@ -7,58 +8,193 @@ import numpy as np
|
|
| 7 |
|
| 8 |
st.set_page_config(page_title="データ分析ダッシュボード", layout="wide")
|
| 9 |
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
st.
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
+
from streamlit_folium import st_folium
|
| 3 |
import pandas as pd
|
| 4 |
import matplotlib.pyplot as plt
|
| 5 |
import japanize_matplotlib
|
|
|
|
| 8 |
|
| 9 |
st.set_page_config(page_title="データ分析ダッシュボード", layout="wide")
|
| 10 |
|
| 11 |
+
# 탭 생성
|
| 12 |
+
tab1, tab2, tab3, tab4, tab5 = st.tabs([" データ分析ダッシュボード", "visualization1", "visualization2", "ボックスプロット", "折れ線グラフ"])
|
| 13 |
+
|
| 14 |
+
with tab1:
|
| 15 |
+
st.title("📊 データ分析ダッシュボード")
|
| 16 |
+
|
| 17 |
+
uploaded_file = st.file_uploader("CSVファイルをアップロードしてください", type=["csv"])
|
| 18 |
+
|
| 19 |
+
if uploaded_file is not None:
|
| 20 |
+
df = pd.read_csv(uploaded_file)
|
| 21 |
+
st.success("✅ ファイルを読み込みました!")
|
| 22 |
+
|
| 23 |
+
st.header("📌 データのプレビュー")
|
| 24 |
+
st.dataframe(df.head())
|
| 25 |
+
|
| 26 |
+
st.header("📊 基本統計情報")
|
| 27 |
+
st.write(df.describe())
|
| 28 |
+
|
| 29 |
+
st.header("📈 カラムごとの分布表示")
|
| 30 |
+
# 数値型カラムを取得
|
| 31 |
+
numeric_columns = df.select_dtypes(include=np.number).columns
|
| 32 |
+
# 数値型カラムが存在するか確認
|
| 33 |
+
if len(numeric_columns) > 0:
|
| 34 |
+
column = st.selectbox("分布を見たいカラムを選んでください", numeric_columns)
|
| 35 |
+
|
| 36 |
+
if column: # 選択されたカラムが存在する場合
|
| 37 |
+
fig, ax = plt.subplots()
|
| 38 |
+
sns.histplot(df[column], kde=True, ax=ax)
|
| 39 |
+
ax.set_title(f"{column} のヒストグラム")
|
| 40 |
+
st.pyplot(fig)
|
| 41 |
+
|
| 42 |
+
fig, ax = plt.subplots()
|
| 43 |
+
sns.histplot(df[column], kde=True, ax=ax)
|
| 44 |
+
ax.set_title(f"{column} のヒストグラム")
|
| 45 |
+
st.pyplot(fig)
|
| 46 |
+
|
| 47 |
+
numeric_df = df.select_dtypes(include=["number"])
|
| 48 |
+
fig_corr, ax_corr = plt.subplots()
|
| 49 |
+
sns.heatmap(numeric_df.corr(), annot=True, cmap="coolwarm", fmt=".2f", ax=ax_corr)
|
| 50 |
+
st.pyplot(fig_corr)
|
| 51 |
+
|
| 52 |
+
st.header("📊 ボックスプロット")
|
| 53 |
+
box_col = st.selectbox("ボックスプロットの対象カラムを選択", df.select_dtypes(include=np.number).columns, key="box")
|
| 54 |
+
fig_box, ax_box = plt.subplots()
|
| 55 |
+
sns.boxplot(x=df[box_col], ax=ax_box)
|
| 56 |
+
ax_box.set_title(f"{box_col} のボックスプロット")
|
| 57 |
+
st.pyplot(fig_box)
|
| 58 |
+
|
| 59 |
+
st.header("📈 折れ線グラフ")
|
| 60 |
+
if df.select_dtypes(include=np.number).shape[1] >= 2:
|
| 61 |
+
line_x = st.selectbox("X軸に使うカラムを選択", df.select_dtypes(include=np.number).columns, key="line_x")
|
| 62 |
+
line_y = st.selectbox("Y軸に使うカラムを選択", df.select_dtypes(include=np.number).columns, key="line_y")
|
| 63 |
+
|
| 64 |
+
fig_line, ax_line = plt.subplots()
|
| 65 |
+
sns.lineplot(x=df[line_x], y=df[line_y], ax=ax_line)
|
| 66 |
+
ax_line.set_title(f"{line_x} vs {line_y} 折れ線グラフ")
|
| 67 |
+
st.pyplot(fig_line)
|
| 68 |
+
|
| 69 |
+
st.header("📊 カテゴリカルデータの棒グラフ")
|
| 70 |
+
cat_columns = df.select_dtypes(include='object').columns
|
| 71 |
+
if len(cat_columns) > 0:
|
| 72 |
+
cat_col = st.selectbox("カテゴリカルカラムを選択", cat_columns)
|
| 73 |
+
fig_bar, ax_bar = plt.subplots()
|
| 74 |
+
df[cat_col].value_counts().plot(kind='bar', ax=ax_bar)
|
| 75 |
+
ax_bar.set_title(f"{cat_col} の頻度棒グラフ")
|
| 76 |
+
st.pyplot(fig_bar)
|
| 77 |
+
else:
|
| 78 |
+
st.warning("数値型のカラムがありません。")
|
| 79 |
+
|
| 80 |
+
else:
|
| 81 |
+
st.info("左側のサイドバーからCSVファイルをアップロードしてください。")
|
| 82 |
+
|
| 83 |
+
with tab2:
|
| 84 |
+
st.header("📊 住所・座標の可視化")
|
| 85 |
+
import folium
|
| 86 |
+
from streamlit_folium import st_folium
|
| 87 |
+
import pandas as pd
|
| 88 |
+
import requests
|
| 89 |
+
|
| 90 |
+
# uploaded_file2 = st.file_uploader("住所CSVファイルをアップロードしてください", type=["csv"])
|
| 91 |
+
|
| 92 |
+
# if uploaded_file2 is not None:
|
| 93 |
+
df = pd.read_csv("./address.csv")
|
| 94 |
+
|
| 95 |
+
name_list = df["name"]
|
| 96 |
+
address_list = df["address"]
|
| 97 |
+
|
| 98 |
+
def get_lat_long_from_address(address):
|
| 99 |
+
"""住所をAPIで検索し、緯度と経度を取得する"""
|
| 100 |
+
endpoint = "https://msearch.gsi.go.jp/address-search/AddressSearch"
|
| 101 |
+
response = requests.get(endpoint, params={"q": address})
|
| 102 |
+
|
| 103 |
+
if response.status_code == 200:
|
| 104 |
+
data = response.json()
|
| 105 |
+
if len(data) > 0:
|
| 106 |
+
lat = data[0]["geometry"]["coordinates"][1]
|
| 107 |
+
lon = data[0]["geometry"]["coordinates"][0]
|
| 108 |
+
return lat, lon
|
| 109 |
+
return None, None
|
| 110 |
+
|
| 111 |
+
staff_lat_lon = [get_lat_long_from_address(addr) for addr in address_list]
|
| 112 |
+
|
| 113 |
+
data = pd.DataFrame({
|
| 114 |
+
"クリニック名": name_list,
|
| 115 |
+
"クリニック住所": address_list,
|
| 116 |
+
"クリニック_緯度": [lat for lat, lon in staff_lat_lon],
|
| 117 |
+
"クリニック_経度": [lon for lat, lon in staff_lat_lon]
|
| 118 |
+
})
|
| 119 |
+
|
| 120 |
+
|
| 121 |
+
col1, col2 = st.columns([3, 2])
|
| 122 |
+
|
| 123 |
+
# 地図の生成
|
| 124 |
+
m = folium.Map(location=[37.5, 140.5], zoom_start=7)
|
| 125 |
+
|
| 126 |
+
# マーカーの追加 (NaNチェック 추가)
|
| 127 |
+
for i in range(len(data["クリニック名"])):
|
| 128 |
+
lat = data["クリニック_緯度"][i]
|
| 129 |
+
lon = data["クリニック_経度"][i]
|
| 130 |
+
|
| 131 |
+
if pd.isna(lat) or pd.isna(lon):
|
| 132 |
+
continue
|
| 133 |
+
|
| 134 |
+
folium.Marker(
|
| 135 |
+
location=(lat, lon),
|
| 136 |
+
popup=data["クリニック名"][i],
|
| 137 |
+
icon=folium.Icon(color="blue"),
|
| 138 |
+
).add_to(m)
|
| 139 |
+
|
| 140 |
+
|
| 141 |
+
with col1:
|
| 142 |
+
st.title("📍 クリニックの位置情報")
|
| 143 |
+
map_data = st_folium(m, width=1200, height=800)
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
with col2:
|
| 147 |
+
st.markdown("<br>", unsafe_allow_html=True)
|
| 148 |
+
st.markdown("<br>", unsafe_allow_html=True)
|
| 149 |
+
st.markdown("<br>", unsafe_allow_html=True)
|
| 150 |
+
st.markdown("<br>", unsafe_allow_html=True)
|
| 151 |
+
st.subheader("📌 選択されたクリニック情報")
|
| 152 |
+
|
| 153 |
+
if map_data and map_data["last_object_clicked"]:
|
| 154 |
+
clicked_lat = map_data["last_object_clicked"]["lat"]
|
| 155 |
+
clicked_lon = map_data["last_object_clicked"]["lng"]
|
| 156 |
+
|
| 157 |
+
for i in range(len(data["クリニック名"])):
|
| 158 |
+
if (round(data["クリニック_緯度"][i], 6) == round(clicked_lat, 6)) and (round(data["クリニック_経度"][i], 6) == round(clicked_lon, 6)):
|
| 159 |
+
st.write(f"**🏥 クリニック名:** {data['クリニック名'][i]}")
|
| 160 |
+
st.write(f"**📍 住所:** {data['クリニック住所'][i]}")
|
| 161 |
+
break
|
| 162 |
+
else:
|
| 163 |
+
st.info("📌 マーカーをクリックしてください。")
|
| 164 |
+
|
| 165 |
+
with tab3:
|
| 166 |
+
st.header("📊 ネットワークグラフ")
|
| 167 |
+
from pyvis.network import Network
|
| 168 |
+
import streamlit.components.v1 as components
|
| 169 |
+
|
| 170 |
+
np.random.seed(42)
|
| 171 |
+
nodes = [f"Node_{i}" for i in range(1, 21)] # 20개의 노드 생성
|
| 172 |
+
edges = []
|
| 173 |
+
|
| 174 |
+
for _ in range(50): # 50개의 랜덤 엣지 생성
|
| 175 |
+
src = np.random.choice(nodes)
|
| 176 |
+
dst = np.random.choice(nodes)
|
| 177 |
+
if src != dst:
|
| 178 |
+
weight = np.random.randint(1, 10)
|
| 179 |
+
edges.append((src, dst, weight))
|
| 180 |
+
|
| 181 |
+
df = pd.DataFrame(edges, columns=["Source", "Target", "Weight"])
|
| 182 |
+
|
| 183 |
+
net = Network(height="700px", width="100%", bgcolor="#222222", font_color="white")
|
| 184 |
+
net.force_atlas_2based(gravity=-300, central_gravity=0.01, spring_length=100, spring_strength=0.08)
|
| 185 |
+
|
| 186 |
+
for node in nodes:
|
| 187 |
+
net.add_node(node, label=node, title=f"{node} - Custom Tooltip", color="#009688")
|
| 188 |
+
|
| 189 |
+
for src, dst, weight in edges:
|
| 190 |
+
net.add_edge(src, dst, value=weight, title=f"Weight: {weight}")
|
| 191 |
+
|
| 192 |
+
net.show_buttons(filter_=["physics", "nodes", "edges"])
|
| 193 |
+
net.toggle_physics(True)
|
| 194 |
+
net.set_edge_smooth('dynamic')
|
| 195 |
+
|
| 196 |
+
net.save_graph('network.html')
|
| 197 |
+
|
| 198 |
+
HtmlFile = open("network.html", 'r', encoding='utf-8')
|
| 199 |
+
source_code = HtmlFile.read()
|
| 200 |
+
components.html(source_code, height=800, scrolling=True)
|
requirements.txt
CHANGED
|
@@ -3,4 +3,7 @@ pandas
|
|
| 3 |
matplotlib
|
| 4 |
japanize-matplotlib
|
| 5 |
seaborn
|
| 6 |
-
numpy
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
matplotlib
|
| 4 |
japanize-matplotlib
|
| 5 |
seaborn
|
| 6 |
+
numpy
|
| 7 |
+
pyvis
|
| 8 |
+
streamlit_folium
|
| 9 |
+
folium
|