dung1987 / app.py
vuhuudung
Update app.py
7534c6b unverified
# Cài đặt thư viện
import streamlit as st
import pandas as pd
import numpy as np
import unidecode
import os
import requests
import io
from io import BytesIO
from st_aggrid import AgGrid, GridOptionsBuilder
import webbrowser
from pathlib import Path
def render():
# Thiết lập wide mode cho Streamlit
st.set_page_config(layout="wide")
st.header('DUNG UPDATE DỮ LIỆU 9/2024')
st.text('APP CẬP NHẬT DỮ LIỆU 2024')
####################################
ten_file_csv_0= r'data/socongvan.csv'
df=pd.read_csv(ten_file_csv_0, header=0, dtype=str) #lấy dữ liệu, không lấy header
df=pd.DataFrame(df)
df=df.astype(str)
# Hàm loại bỏ dấu và chuyển về chữ thường
def chu_thuong_khong_dau(text):
return unidecode.unidecode(text).lower()
# Hàm chuyển đổi danh sách
def chuyen_doi_chu_thuong(lst):
return [chu_thuong_khong_dau(item) for item in lst]
# Nhập dữ liệu tìm kiếm
trich_yeu = 'Về việc' # str.contains để kiểm tra hoặc có có chuỗi này không
loai_bo_trich_yeu = '@@@'
so_ky_hieu = 'qldt' #.apply để kiểm tra có đồng thời các chuỗi này không
loai_bo_so_ky_hieu = '@@@'
ngay_van_ban = '2024' # str.contains để kiểm tra hoặc có có chuỗi này không
# Add 2 columns for date input
col1, col2, col3, col4, col5 = st.columns(5)
with col1:
trich_yeu = st.text_input('Lọc theo Nội dung trích yếu', trich_yeu)
with col2:
loai_bo_trich_yeu = st.text_input('Loại bỏ nội dung có trong trích yếu', loai_bo_trich_yeu)
with col3:
so_ky_hieu = st.text_input('Lọc theo Số ký hiệu', so_ky_hieu)
with col4:
loai_bo_so_ky_hieu = st.text_input('Loại bỏ nội dung có trong số ký hiệu', loai_bo_so_ky_hieu)
with col5:
ngay_van_ban = st.text_input('Lọc theo Ngày văn bản', ngay_van_ban)
# chuyển đổi kiểu chữ
trich_yeu = chuyen_doi_chu_thuong([item.strip() for item in trich_yeu.split(',')])
loai_bo_trich_yeu = chuyen_doi_chu_thuong([item.strip() for item in loai_bo_trich_yeu.split(',')])
so_ky_hieu = chuyen_doi_chu_thuong([item.strip() for item in so_ky_hieu.split(',')])
loai_bo_so_ky_hieu = chuyen_doi_chu_thuong([item.strip() for item in loai_bo_so_ky_hieu.split(',')])
ngay_van_ban = chuyen_doi_chu_thuong([item.strip() for item in ngay_van_ban.split(',')])
# Tìm kiếm và lọc các dòng chứa ít nhất một trong các chuỗi cần lọc
df_loc = df[df['Trích yếu'].apply(chu_thuong_khong_dau).str.contains('|'.join(trich_yeu),case=False)
& ~df['Trích yếu'].apply(chu_thuong_khong_dau).str.contains('|'.join(loai_bo_trich_yeu), na=False)
& df['Số ký hiệu'].apply(chu_thuong_khong_dau).apply(lambda x: all(chuoi in x for chuoi in so_ky_hieu))
& ~df['Số ký hiệu'].apply(chu_thuong_khong_dau).str.contains('|'.join(loai_bo_so_ky_hieu), na=False)
& df['Ngày văn bản'].apply(chu_thuong_khong_dau).str.contains('|'.join(ngay_van_ban),case=False)
]
# Hiển thị kết quả
df_hienthi = df_loc[['Trích yếu', 'Số ký hiệu', 'Ngày văn bản', 'Đơn vị ban hành', 'Ghi chú']]
# Sử dụng st_aggrid để tùy chỉnh chiều rộng của từng cột
gb = GridOptionsBuilder.from_dataframe(df_hienthi)
# Cấu hình chiều rộng của từng cột
# gb.configure_column("STT", width=10, sortable=True)
gb.configure_column("Trích yếu", width=100, sortable=True)
gb.configure_column("Số ký hiệu", width=10, sortable=True)
gb.configure_column("Ngày văn bản", width=10, sortable=True)
gb.configure_column("Đơn vị ban hành", width=10, sortable=True)
gb.configure_column("Ghi chú", width=10, sortable=True)
# Cấu hình phân trang
gb.configure_pagination(paginationAutoPageSize=True) # Chia thành nhiều trang tự động
gb.configure_default_column(wrapText=True, autoHeight=True) # Tự động giãn ô khi chuỗi dài
gridOptions = gb.build()
# Hiển thị DataFrame với cấu hình tùy chỉnh
st.write("Kết quả tìm kiếm và tra cứu:")
AgGrid(df_hienthi, gridOptions=gridOptions, height=400, fit_columns_on_grid_load=True)
# Tạo nút tải xuống Excel
excel_buffer = io.BytesIO()
with pd.ExcelWriter(excel_buffer, engine='openpyxl') as writer:
df_hienthi.to_excel(writer, index=False, sheet_name='Dữ liệu')
excel_data = excel_buffer.getvalue()
st.download_button(
label="Tải xuống danh sách kết quả tìm kiếm",
data=excel_data,
file_name='du_lieu.xlsx',
mime='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
)
####################################
path_file= r'data/danhsachthumuc.csv'
df_path=pd.read_csv(path_file, header=0, dtype=str)
df_path=pd.DataFrame(df_path)
df_path=df_path.astype(str)
so_ky_hieu_2 = '000, cv, qldt, dung, 2024' #.apply để kiểm tra có đồng thời các chuỗi này không
so_ky_hieu_2 = st.text_input('Tìm kiếm theo tên thư mục', so_ky_hieu_2)
so_ky_hieu_2 = chuyen_doi_chu_thuong([item.strip() for item in so_ky_hieu_2.split(',')])
# Tìm kiếm và lọc các dòng chứa ít nhất một trong các chuỗi cần lọc
df_path_loc = df_path[df_path['Folder Name'].apply(chu_thuong_khong_dau).apply(lambda x: all(chuoi in x for chuoi in so_ky_hieu_2))]
# Sử dụng st_aggrid để tùy chỉnh chiều rộng của từng cột
gb1 = GridOptionsBuilder.from_dataframe(df_path_loc)
# Cấu hình chiều rộng của từng cột
# gb1.configure_column("Folder Name", width=10, sortable=True)
# gb1.configure_column("Full Path", width=20, sortable=True)
# Cấu hình phân trang
# gb1.configure_pagination(paginationAutoPageSize=True) # Chia thành nhiều trang tự động
# gb1.configure_default_column(wrapText=True, autoHeight=True) # Tự động giãn ô khi chuỗi dài
# gridOptions1 = gb1.build()
# Hiển thị DataFrame với cấu hình tùy chỉnh
# st.write("Bảng dữ liệu:")
# AgGrid(df_path_loc, gridOptions=gridOptions1, height=200, fit_columns_on_grid_load=True)
########################################
# Hàm mở đường dẫn local
def open_local_path(path):
if os.path.exists(path):
os.startfile(path) # Đối với Windows
# webbrowser.open(path) # Đối với các hệ điều hành khác
else:
st.error(f"Đường dẫn không tồn tại: {path}")
# # Kiểm tra và lưu trạng thái danh sách button trong session_state
# if 'show_buttons' not in st.session_state:
# st.session_state.show_buttons = False
# # Button để mở hoặc đóng danh sách các button
# if st.button("Hiển thị/Ẩn danh sách đường dẫn"):
# st.session_state.show_buttons = not st.session_state.show_buttons
# # # Hiển thị danh sách các button nếu show_buttons là True
# if st.session_state.show_buttons:
# st.write("Chọn đường dẫn để mở:")
# for index, row in df_path_loc.iterrows():
# col1, col2, col3 = st.columns([2, 4, 1])
# with col1:
# st.write(row['Folder Name'])
# with col2:
# st.write(row['Full Path'])
# with col3:
# if st.button('Mở File', key=index):
# open_local_path(row['Full Path'])
st.write("Chọn đường dẫn để mở Folder:")
for index, row in df_path_loc.iterrows():
col1, col2 = st.columns([4, 1])
with col1:
st.write(row['Full Path'])
with col2:
if st.button('Mở Folder', key=index):
open_local_path(row['Full Path'])
############################################
# # Tạo tiêu đề web
# st.title('Tự học Streamlit')
# # Tạo nét gạch ngang
# st.markdown('---')
# # Tạo subheader
# st.subheader('Xin chào mọi người!')
# # Tạo nét gạch ngang
# st.markdown('---')
# # Tạo header
# st.header('ĐẦU TƯ XÂY DỰNG')
# st.text('Danh sách các dự án đầu tư xây dựng')
# st.header('QUY HOẠCH XÂY DỰNG')
# st.text('Danh sách các đồ án quy hoạch')
# st.markdown('# H1')
# st.markdown('## H2')
# st.markdown('### H3')
# st.markdown('**bold text**')
# st.markdown('*italicized text*')
# st.markdown('> blockquote')
# st.markdown('1. First item')
# st.markdown('2. Second item')
# st.markdown('3. Third item')
# st.markdown('`code`')
# st.markdown('---')
# st.markdown('[Google](https://www.google.com)')
# st.markdown('![alt text](image.jpg)')
# st.markdown('| Syntax | Description |')
# st.markdown('| ----------- | ----------- |')
# st.markdown('| Header | Title |')
# st.markdown('| Paragraph | Text |')
# json={"firstName": "John","lastName": "Smith","age": 25}
# st.markdown('```{"firstName": "John","lastName": "Smith","age": 25}```')
# st.markdown("Here's a sentence with a footnote. [^1]")
# st.markdown('[^1]: This is the footnote.')
# st.markdown('### My Great Heading {#custom-id}')
# st.markdown('term: definition')
# st.markdown('~~The world is flat.~~')
# st.markdown('- [x] Write the press release')
# st.markdown('- [ ] Update the website')
# st.markdown('- [ ] Contact the media')
# st.markdown('That is so funny! :joy:')
# st.markdown('==very important words==')
# st.markdown('H~2~O')
# st.markdown('X^2^')
# st.caption('Hi, I am Caption')
# st.latex(r'\begin{pmatrix}a&b\\c&d\end{pmatrix}')
# dic={"firstName": "John","lastName": "Smith","age": 25}
# st.json(dic)
# code="""
# print('hello world')
# def funct():
# return 0;"""
# st.code(code, language="python")
# # st.audio("Audio.mp3")
# # st.video("video.mp4")
# def change():
# print(st.session_state.checker)
# st.checkbox('check box', value=True, on_change=change, key='checker')
# radio_btn=st.radio('In which country do you live?', options=('us','uk','vn'))
# print(radio_btn)
# def btn_click():
# print('Button clicked')
# btn=st.button("Click Me", on_click=btn_click)
# select=st.selectbox('what is your car', options=('toyoto', 'bmw', 'mec'))
# print(select)
# multi_select=st.multiselect('what is your favourite', options = ('red', 'black', 'white', 'brown'))
# print(multi_select)
# st.write(multi_select)
# _start_date = '2024-01-02'
# _end_date = '2024-06-08'
# # convert string to date
# from datetime import datetime
# _start_date = datetime.strptime(_start_date, '%Y-%m-%d')
# _end_date = datetime.strptime(_end_date, '%Y-%m-%d')
# # Data Input
# # Add start date and end date input
# # start_date = st.date_input('Start date', value=_start_date, min_value=None, max_value=None, key=None)
# # end_date = st.date_input('End date', value=_end_date, min_value=None, max_value=None, key=None)
# # Add 2 columns for date input
# col1, col2 = st.columns(2)
# with col1:
# start_date = st.date_input('Start date', value=_start_date, min_value=None, max_value=None, key='start_date')
# with col2:
# end_date = st.date_input('End date', value=_end_date, min_value=None, max_value=None, key='end_date')
# # Load data
# from vnstock3 import Vnstock
# stock = Vnstock().stock(symbol='VCI', source='VCI')
# history_df = stock.quote.history(start=start_date.strftime('%Y-%m-%d'), end=end_date.strftime('%Y-%m-%d'))
# st.dataframe(history_df)
# # Plot close data
# import matplotlib.pyplot as plt
# import seaborn as sns
# plt.figure(figsize=(12, 6))
# sns.lineplot(x=history_df.index, y=history_df['close'])
# plt.title('Close Price')
# plt.grid()
# st.set_option('deprecation.showPyplotGlobalUse', False)
# st.pyplot()
render()