2022-11-19 17:44:28 +04:00

91 lines
2.3 KiB
Python

# sourcery skip: list-comprehension
import pandas as pd
import plotly.express as px
import json
import streamlit as st
from datetime import (datetime,
timedelta)
from pathlib import Path
data_dir = Path(__file__).resolve().parent.parent / 'data'
st.set_page_config(page_title = 'Health Data Visualization',
page_icon = ':bar_chart:',
layout = 'wide')
with open(data_dir / 'huawei_health_data.json') as f:
data = json.load(f)
heart_rate = []
for d in data:
if d['type'] == 7:
heart_rate.append(
{
'rate': float(d['samplePoints'][0]['value']),
'time': (datetime.fromtimestamp(
int(str(d['samplePoints'][0]['endTime'])[:10])
) + timedelta(
hours = int(data[0]['timeZone'][1:].replace('0', ''))
)
)
}
)
if is_all_data := st.sidebar.checkbox(f'All Data ({len(heart_rate)})', False):
heart_rate = pd.DataFrame(heart_rate)
else:
day = st.sidebar.date_input(
'Select Day',
heart_rate[0]['time'],
min_value = heart_rate[0]['time'],
max_value = heart_rate[-1]['time']
).strftime("%d-%m-%Y")
heart_rate = pd.DataFrame(
list(
filter(
lambda t: t['time'].strftime("%d-%m-%Y") == day, heart_rate
)
)
)
x = list(map(
lambda t: t.strftime("%d-%m-%Y %X"),
heart_rate['time']
))
y = heart_rate['rate']
st.sidebar.header('Split Data:')
average_number = st.sidebar.number_input(
f'Amount of data split (0 - {len(heart_rate)-1}): ',
step = 1,
min_value = 0,
max_value = len(heart_rate)-1
)
if average_number > 1:
heart_rate2 = []
rates = list(y)
for i in range(0, len(rates), average_number):
t = rates[i:i + average_number]
heart_rate2.append(sum(t) / len(t))
x = range(len(heart_rate2))
y = heart_rate2
st.plotly_chart(
px.line(
x = x, y = y
)
.update_layout(
xaxis = dict(
rangeslider = dict(
visible = True
),
type = "-" # ['-', 'linear', 'log', 'date', 'category', 'multicategory']
)
)
)