medical-kiban commited on
Commit
8f3ff15
·
1 Parent(s): 941851a

add visualize sample

Browse files
Files changed (3) hide show
  1. address.csv +118 -0
  2. app.py +191 -55
  3. 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
- st.title("📊 データ分析ダッシュボード")
11
-
12
- uploaded_file = st.file_uploader("CSVファイルをアップロードしてください", type=["csv"])
13
-
14
- if uploaded_file is not None:
15
- df = pd.read_csv(uploaded_file)
16
- st.success(" ファイルを読み込みました!")
17
-
18
- st.header("📌 データのプレビュー")
19
- st.dataframe(df.head())
20
-
21
- st.header("📊 基本統計情報")
22
- st.write(df.describe())
23
-
24
- st.header("📈 カラムごとの分布表示")
25
- column = st.selectbox("分布を見たいカラムを選んでください", df.select_dtypes(include=np.number).columns)
26
-
27
- fig, ax = plt.subplots()
28
- sns.histplot(df[column], kde=True, ax=ax)
29
- ax.set_title(f"{column} のヒストグラム")
30
- st.pyplot(fig)
31
-
32
- numeric_df = df.select_dtypes(include=["number"])
33
- fig_corr, ax_corr = plt.subplots()
34
- sns.heatmap(numeric_df.corr(), annot=True, cmap="coolwarm", fmt=".2f", ax=ax_corr)
35
- st.pyplot(fig_corr)
36
-
37
- st.header("📊 ボックスプロット")
38
- box_col = st.selectbox("ボックスプロットの対象カラムを選択", df.select_dtypes(include=np.number).columns, key="box")
39
- fig_box, ax_box = plt.subplots()
40
- sns.boxplot(x=df[box_col], ax=ax_box)
41
- ax_box.set_title(f"{box_col} のボックスプロット")
42
- st.pyplot(fig_box)
43
-
44
- st.header("📈 折れ線グラフ")
45
- if df.select_dtypes(include=np.number).shape[1] >= 2:
46
- line_x = st.selectbox("X軸に使うカラムを選択", df.select_dtypes(include=np.number).columns, key="line_x")
47
- line_y = st.selectbox("Y軸に使うカラムを選択", df.select_dtypes(include=np.number).columns, key="line_y")
48
-
49
- fig_line, ax_line = plt.subplots()
50
- sns.lineplot(x=df[line_x], y=df[line_y], ax=ax_line)
51
- ax_line.set_title(f"{line_x} vs {line_y} 折れ線グラフ")
52
- st.pyplot(fig_line)
53
-
54
- st.header("📊 カテゴリカルデータの棒グラフ")
55
- cat_columns = df.select_dtypes(include='object').columns
56
- if len(cat_columns) > 0:
57
- cat_col = st.selectbox("カテゴリカルカラムを選択", cat_columns)
58
- fig_bar, ax_bar = plt.subplots()
59
- df[cat_col].value_counts().plot(kind='bar', ax=ax_bar)
60
- ax_bar.set_title(f"{cat_col} の頻度棒グラフ")
61
- st.pyplot(fig_bar)
62
-
63
- else:
64
- st.info("左側のサイドバーからCSVファイルをアップロードしてください。")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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