jonghhhh commited on
Commit
f3d6e06
Β·
verified Β·
1 Parent(s): b3f119b

Upload 10 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,8 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ data_traffic_accidents.xlsx filter=lfs diff=lfs merge=lfs -text
37
+ network.png filter=lfs diff=lfs merge=lfs -text
38
+ photo1.jpg filter=lfs diff=lfs merge=lfs -text
39
+ photo2.jpg filter=lfs diff=lfs merge=lfs -text
40
+ wordcloud.png filter=lfs diff=lfs merge=lfs -text
Dockerfile CHANGED
@@ -1,21 +1,21 @@
1
- FROM python:3.9-slim
2
-
3
- WORKDIR /app
4
-
5
- RUN apt-get update && apt-get install -y \
6
- build-essential \
7
- curl \
8
- software-properties-common \
9
- git \
10
- && rm -rf /var/lib/apt/lists/*
11
-
12
- COPY requirements.txt ./
13
- COPY src/ ./src/
14
-
15
- RUN pip3 install -r requirements.txt
16
-
17
- EXPOSE 8501
18
-
19
- HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
20
-
21
- ENTRYPOINT ["streamlit", "run", "src/streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]
 
1
+ FROM python:3.9-slim
2
+
3
+ WORKDIR /app
4
+
5
+ RUN apt-get update && apt-get install -y \
6
+ build-essential \
7
+ curl \
8
+ software-properties-common \
9
+ git \
10
+ && rm -rf /var/lib/apt/lists/*
11
+
12
+ COPY requirements.txt .
13
+ RUN pip3 install -r requirements.txt
14
+
15
+ COPY . .
16
+
17
+ EXPOSE 8501
18
+
19
+ HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
20
+
21
+ ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"]
app.py ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import matplotlib.pyplot as plt
4
+ import pandas_bokeh
5
+ import folium
6
+ from streamlit_folium import st_folium
7
+ import requests
8
+
9
+ st.markdown("# κ²½ν¬λŒ€ 인근 κ°€μ„±λΉ„ 쒋은 λ§›μ§‘ λŠ˜μ–΄ ... 건강식은 'κΈ€μŽ„'")
10
+ st.markdown("#### '뢄식, 쀑식, ν•œμ‹μ— μΌμ‹κΉŒμ§€ λ‹€μ–‘ν•œ μŒμ‹ μ‹Έκ²Œ 제곡")
11
+ st.markdown("#### μΆ•μ œ 행사에 햄버거-핫도그 ν‘Έλ“œνŠΈλŸ­λ„ λ“±μž₯")
12
+ st.write('''κ²½ν¬λŒ€ μΈκ·Όμ—λŠ” 졜근 κ°€μ„±λΉ„ 쒋은 맛집듀이 속속 λ“€μ–΄μ„œλ©° 학생듀 μ‚¬μ΄μ—μ„œ 인기λ₯Ό 끌고 μžˆλ‹€. ν•œμ •λœ λŒ€ν•™μƒ 지갑사정에 λ§žλŠ” μ €λ ΄ν•œ 가격과 λ‹€μ–‘ν•˜κ³  퀄리티 높은 λ©”λ‰΄λ‘œ μž…μ†Œλ¬Έμ΄ λ‚˜λ©΄μ„œ μ„±μ—… 쀑인 것이닀.
13
+ 이처럼 κ²½ν¬λŒ€ μ£Όλ³€μ—λŠ” 학생듀 μ‚¬μ΄μ—μ„œ μž…μ†Œλ¬Έμ΄ μžμžν•œ κ°€μ„±λΉ„ 맛집듀이 λ§Žλ‹€. 뿐만 μ•„λ‹ˆλΌ λŒ€ν•™ μΆ•μ œ λ•Œλ©΄ λ‹€μ–‘ν•œ [ν‘Έλ“œνŠΈλŸ­](https://namu.wiki/w/%ED%91%B8%EB%93%9C%20%ED%8A%B8%EB%9F%AD)듀도 찾아와 μ €λ ΄ν•˜κ³  λ§›μžˆλŠ” 메뉴λ₯Ό 선보이며 큰 인기λ₯Ό λˆλ‹€.
14
+ 졜근 λ¬Όκ°€μƒμŠΉμœΌλ‘œ 인해 외식비 뢀담이 큰 λŒ€ν•™μƒλ“€μ—κ²Œ 이런 κ°€μ„±λΉ„ 높은 λ§›μ§‘κ³Ό ν‘Έλ“œνŠΈλŸ­μ€ ν™˜μ˜λ°›μ„ λ§Œν•˜λ‹€.''' )
15
+
16
+ st.write("<br><br><br>", unsafe_allow_html=True) # 3쀄 띄어쓰기
17
+
18
+ st.markdown("#### μ‹Ό 게 λΉ„μ§€λ–‘? 건강식은 μ•ˆ 보이넀")
19
+ st.markdown("#### μ €λ ΄ν•˜κ³  ν‘Έμ§ν•˜μ§€λ§Œ μ˜μ–‘κ³Ό 건강은 μ‹€μ’…")
20
+ st.write('''κ²½ν¬λŒ€ 인근 λ§›μ§‘λ“€μ˜ 메뉴λ₯Ό μžμ„Ένžˆ 보면 κ±΄κ°•ν•œ μ‹μž¬λ£Œλ‚˜ μ˜μ–‘μ€ 크게 κ³ λ €λ˜μ§€ μ•Šμ€ 것 κ°™μ•„ 아쉬움이 λ‚¨λŠ”λ‹€.
21
+ λŒ€ν•™κ°€μ—μ„œ 건강에 λŒ€ν•œ 고민보닀 μ‹Έκ³  λ°°λΆ€λ₯΄κ²Œ 먹을 수 μžˆλŠ” 곳이 인기인 점은 μ΄ν•΄λœλ‹€. ν•˜μ§€λ§Œ ν•œλ²ˆμ―€μ€ μ˜μ–‘κ³Ό 건강을 생각해봐야 ν•œλ‹€.
22
+ μ²­λ…„λ•ŒλΆ€ν„° 건강식을 μ„­μ·¨ν•˜κ³  μ˜¬λ°”λ₯Έ μ‹μŠ΅κ΄€μ„ κ°€μ Έμ•Όν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.''' )
23
+
24
+ st.markdown("#### λŒ€ν•™κ°€ 먹거리, κ±΄κ°•μ˜ κ· ν˜•μ„ μž‘μ•„μ•Ό ν•  λ•Œ")
25
+ st.write(''' μ „λ¬Έκ°€ OOO에 λ”°λ₯΄λ©΄ ~~~~~''')
26
+
27
+
28
+ # 사진 μ‚½μž…
29
+ st.image('photo1.jpg', caption='μ§€λ‚œ 4μ›”20일 κ²½ν¬λŒ€ κ΅λ‚΄μ—μ„œ 학생듀이 ν‘Έλ“œνŠΈλŸ­μ—μ„œ μŒμ‹μ„ κ΅¬λ§€ν•˜κ³  μžˆλ‹€')
30
+ st.image('photo2.jpg', caption='κ²½ν¬λŒ€ 근처 λ§›μ§‘ 지도(--- 제곡)')
31
+
32
+ # 데이터 뢈러였기
33
+ df = pd.read_excel('data_traffic_accidents.xlsx', index_col=0)
34
+ st.write('λ‹€μŒ λ°μ΄ν„°λŠ” μ „κ΅­μ˜ ꡐ톡사고λ₯Ό μ§€μ—­λ³„λ‘œ μ§‘κ³„ν•œ 것이닀')
35
+ #st.write(df)
36
+
37
+ # 검색어 μž…λ ₯ λ°›μ•„ 데이터 μ„ νƒμ μœΌλ‘œ 좜λ ₯
38
+ query = st.text_input('이 곳에 μ§€μ—­λͺ…(μ‹œκ΅°κ΅¬λ™μλ©΄)을 μž…λ ₯ν•˜λ©΄ κ΄€λ ¨ λ°μ΄ν„°λ§Œ 검색해 λ³΄μ—¬μ€λ‹ˆλ‹€', key='region1_input')
39
+ df['select1']=df['μ‚¬κ³ μ§€μ—­μœ„μΉ˜λͺ…'].apply(lambda x: 1 if query in x else 0)
40
+ st.write('검색 κ²°κ³Ό:', df[df['select1']==1])
41
+
42
+ # ꡐ톡사고 μœ ν˜•κ³Ό 연도에 λ”°λ₯Έ pivot table 보여주기
43
+ df_pivot=df.pivot_table(index='μ‚¬κ³ μœ ν˜•κ΅¬λΆ„', columns='사고연도', values='μ‚¬κ³ κ±΄μˆ˜', aggfunc='sum')
44
+ df_heatmap=df_pivot.style.background_gradient(cmap='Oranges').format("{:.2f}")
45
+ st.write('λ‹€μŒ ν‘œλŠ” ꡐ톡사고 건수λ₯Ό μœ ν˜•κ³Ό 연도에 따라 κ΅¬λΆ„ν•œ 것이닀', df_heatmap)
46
+
47
+ # μ›Œλ“œν΄λΌμš°λ“œ 보여주기
48
+ st.write('μ£Όμš” 단어듀을 μ›Œλ“œν΄λΌμš°λ“œλ‘œ 보여주면 λ‹€μŒκ³Ό κ°™λ‹€')
49
+ st.image('wordcloud.png')
50
+
51
+ # 연결망그림 보여주기
52
+ st.write('''μ·¨μž¬νŒ€μ€ μ£Όμš” 단어듀 간에 κ³΅λ™μΆœν˜„ν•˜λŠ” 관계λ₯Ό λ°”νƒ•μœΌλ‘œ μ˜λ―Έμ—°κ²°λ§μ„ κ·Έλ €λ³΄μ•˜λ‹€.
53
+ 뢄석결과, ~~μ„€λͺ…~~''')
54
+ st.image('network.png')
55
+
56
+ # κ·Έλž˜ν”„ html 보여주기
57
+ st.write('''μ·¨μž¬νŒ€μ€ ꡐ톡사고 μ‚¬κ³ κ±΄μˆ˜μ™€ μ‚¬λ§μžμˆ˜ κ°„μ˜ 관계λ₯Ό κ·Έλž˜ν”„λ‘œ ν‘œμ‹œν–ˆλ‹€ 뢄석결과, ~~μ„€λͺ…~~
58
+ κ·Έλž˜ν”„ 각 점에 마우슀λ₯Ό λ†“μœΌλ©΄ μ§€μ—­ 정보가 λ‚˜νƒ€λ‚œλ‹€''')
59
+ with open('bokeh_example.html', 'r', encoding='utf-8') as f:
60
+ html_content1 = f.read()
61
+ st.components.v1.html(html_content1, height=500) # markdown보닀 λ³΅μž‘ν•œ html 파일 μž‘λ™μ— 강함
62
+
63
+ # 지도 html 보여주기
64
+ st.write('''μ·¨μž¬νŒ€μ€ μ„œμšΈμ‹œ μ£Όμš” λŒ€ν•™μ˜ μœ„μΉ˜μ™€ 정보λ₯Ό 지도에 ν‘œκΈ°ν•΄ λ³΄μ•˜λ‹€. 뢄석결과, ~~μ„€λͺ…~~
65
+ 지도 μœ„ ν‘œκΈ° 지점에 마우슀λ₯Ό λ†“μœΌλ©΄ κ΄€λ ¨ 정보가 λ‚˜νƒ€λ‚œλ‹€''')
66
+ with open('folium_example.html', 'r', encoding='utf-8') as f:
67
+ html_content2 = f.read()
68
+ st.components.v1.html(html_content2, height=500)
bokeh_example.html ADDED
The diff for this file is too large to render. See raw diff
 
data_traffic_accidents.xlsx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6cbe09c6afa2d36d525aaf0e9efd7a726c296f8b59ab50b2703979e52d478469
3
+ size 5148724
folium_example.html ADDED
@@ -0,0 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+
5
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
6
+
7
+ <script>
8
+ L_NO_TOUCH = false;
9
+ L_DISABLE_3D = false;
10
+ </script>
11
+
12
+ <style>html, body {width: 100%;height: 100%;margin: 0;padding: 0;}</style>
13
+ <style>#map {position:absolute;top:0;bottom:0;right:0;left:0;}</style>
14
+ <script src="https://cdn.jsdelivr.net/npm/leaflet@1.9.3/dist/leaflet.js"></script>
15
+ <script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
16
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
17
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js"></script>
18
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet@1.9.3/dist/leaflet.css"/>
19
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"/>
20
+ <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css"/>
21
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.2.0/css/all.min.css"/>
22
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css"/>
23
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css"/>
24
+
25
+ <meta name="viewport" content="width=device-width,
26
+ initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
27
+ <style>
28
+ #map_ed45e426e4e625d1487296ea56b9516c {
29
+ position: relative;
30
+ width: 100.0%;
31
+ height: 100.0%;
32
+ left: 0.0%;
33
+ top: 0.0%;
34
+ }
35
+ .leaflet-container { font-size: 1rem; }
36
+ </style>
37
+
38
+ </head>
39
+ <body>
40
+
41
+
42
+ <div class="folium-map" id="map_ed45e426e4e625d1487296ea56b9516c" ></div>
43
+
44
+ </body>
45
+ <script>
46
+
47
+
48
+ var map_ed45e426e4e625d1487296ea56b9516c = L.map(
49
+ "map_ed45e426e4e625d1487296ea56b9516c",
50
+ {
51
+ center: [37.567, 126.978],
52
+ crs: L.CRS.EPSG3857,
53
+ zoom: 12,
54
+ zoomControl: true,
55
+ preferCanvas: false,
56
+ }
57
+ );
58
+
59
+
60
+
61
+
62
+
63
+ var tile_layer_41a0f1aae01a4ef313b7f6ff18d8d25a = L.tileLayer(
64
+ "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
65
+ {"attribution": "Data by \u0026copy; \u003ca target=\"_blank\" href=\"http://openstreetmap.org\"\u003eOpenStreetMap\u003c/a\u003e, under \u003ca target=\"_blank\" href=\"http://www.openstreetmap.org/copyright\"\u003eODbL\u003c/a\u003e.", "detectRetina": false, "maxNativeZoom": 18, "maxZoom": 18, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
66
+ ).addTo(map_ed45e426e4e625d1487296ea56b9516c);
67
+
68
+
69
+ var marker_40a0d3b3071e46ce44c855dd28b7197e = L.marker(
70
+ [37.592, 127.052],
71
+ {}
72
+ ).addTo(map_ed45e426e4e625d1487296ea56b9516c);
73
+
74
+
75
+ var popup_c08cc328a5125b3fad894b79123b4297 = L.popup({"maxWidth": 500});
76
+
77
+
78
+
79
+ var html_b3968776944b9326f1cbe8befde69049 = $(`<div id="html_b3968776944b9326f1cbe8befde69049" style="width: 100.0%; height: 100.0%;">κ²½ν¬λŒ€</div>`)[0];
80
+ popup_c08cc328a5125b3fad894b79123b4297.setContent(html_b3968776944b9326f1cbe8befde69049);
81
+
82
+
83
+
84
+ marker_40a0d3b3071e46ce44c855dd28b7197e.bindPopup(popup_c08cc328a5125b3fad894b79123b4297)
85
+ ;
86
+
87
+
88
+
89
+
90
+ marker_40a0d3b3071e46ce44c855dd28b7197e.bindTooltip(
91
+ `<div>
92
+ 클릭
93
+ </div>`,
94
+ {"sticky": true}
95
+ );
96
+
97
+
98
+ var marker_d35363d0a8fe53316869ae36187a1457 = L.marker(
99
+ [37.56, 126.937],
100
+ {}
101
+ ).addTo(map_ed45e426e4e625d1487296ea56b9516c);
102
+
103
+
104
+ var popup_d92fbb3aa56507683aedb49a771e3e7a = L.popup({"maxWidth": 500});
105
+
106
+
107
+
108
+ var html_81e8244e5d4ab9b0ada91f9b0c8ffa5e = $(`<div id="html_81e8244e5d4ab9b0ada91f9b0c8ffa5e" style="width: 100.0%; height: 100.0%;">μ—°μ„ΈλŒ€</div>`)[0];
109
+ popup_d92fbb3aa56507683aedb49a771e3e7a.setContent(html_81e8244e5d4ab9b0ada91f9b0c8ffa5e);
110
+
111
+
112
+
113
+ marker_d35363d0a8fe53316869ae36187a1457.bindPopup(popup_d92fbb3aa56507683aedb49a771e3e7a)
114
+ ;
115
+
116
+
117
+
118
+
119
+ marker_d35363d0a8fe53316869ae36187a1457.bindTooltip(
120
+ `<div>
121
+ 클릭
122
+ </div>`,
123
+ {"sticky": true}
124
+ );
125
+
126
+ </script>
127
+ </html>
network.png ADDED

Git LFS Details

  • SHA256: f8c512f3a6b0adaf6cd0c87330b19d307ea72e4ade8899df5c3e6627c5a5fe5b
  • Pointer size: 131 Bytes
  • Size of remote file: 467 kB
photo1.jpg ADDED

Git LFS Details

  • SHA256: 62c9831801c7100b6eee975e3cb63496737b356ed2ec654c6eff695da7fd8c8b
  • Pointer size: 131 Bytes
  • Size of remote file: 108 kB
photo2.jpg ADDED

Git LFS Details

  • SHA256: 13cd128f81b65d4f08b1542d5867fa4c13361babb010ed39e62abf3a1365f830
  • Pointer size: 131 Bytes
  • Size of remote file: 226 kB
requirements.txt CHANGED
@@ -1,3 +1,10 @@
1
- altair
2
- pandas
3
- streamlit
 
 
 
 
 
 
 
 
1
+ numpy==1.23.5 # bool8 문제 μ—†λŠ” λ§ˆμ§€λ§‰ 버전
2
+ pandas==1.5.3 # numpy 1.23.x와 잘 맞음
3
+ openpyxl==3.1.2
4
+ bokeh==2.4.3 # pandas-bokehλž‘ λ§žλŠ” 버전
5
+ pandas-bokeh==0.5.5 # bokeh 2.4.3에 λ§žλŠ” μ•ˆμ •λ²„μ „
6
+ matplotlib==3.7.3
7
+ folium==0.14.0
8
+ streamlit-folium==0.10.0 # Python 3.10 지원 λ§ˆμ§€λ§‰ 버전
9
+ streamlit==1.26.0 # 3.10μ΄λž‘ 잘 λ§žλŠ” μ•ˆμ • 버전
10
+ requests==2.31.0
wordcloud.png ADDED

Git LFS Details

  • SHA256: 9bae325d367784b5560ee0a3fb12327495510e515f7651a7036fcb70922f3ce9
  • Pointer size: 131 Bytes
  • Size of remote file: 250 kB