Создание графика обновления в реальном времени с использованием pandas dataframe Python
Я пытаюсь создать живой график обновления, извлекая результаты из pandas dataframe, в котором хранятся значения динамических данных, которые были извлечены из моего локального сервера.
Используя pandas dataframe, он требует времени и сохраняет его в 1 столбце, затем использует его и сохраняет в другом. Затем выдает это в таблицу результатов. Через 2 секунды это займет много времени и снова будет использовано, а затем добавит это в таблицу данных результатов. В конечном счете, он просто сохранит таблицу результатов в таблице результатов:
>>> print(results)
time kW
0 00:32:40 9
1 00:32:42 11
2 00:32:44 10
3 00:32:46 27
4 00:32:48 18
5 00:32:50 11
Вот код, который у меня есть, который очищает мой локальный сервер и сохраняет данные в этом фрейме данных. Каждый раз, когда я перезапускаю сценарий, он берет предыдущие сохраненные данные и просто добавляет к нему новые данные и записывает файл csv (содержащий данные времени и кВт) в указанный путь к файлу:
import requests
import bs4
import time
import pandas as pd
from datetime import datetime
import glob
import os
def hasNumbers(inputString):
return any(char.isdigit() for char in inputString)
def get_count():
url = "http://10.0.0.206/temp_report.html"
# request with fake header, otherwise you will get an 403 HTTP error
r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
page_source = r.text
# print(page_source)
soup = bs4.BeautifulSoup(page_source, 'html.parser')
#print(soup)
data = soup.find_all('p')
# Pull time
data_time = data[0].text.split()
data_time = [element for element in data_time if hasNumbers(element)][0]
# Pull date
data_date = data[1].text.split()
data_date = [element for element in data_date if hasNumbers(element)][0]
# Convert date and time to datetime data type
data_datetime = data_date +' '+ data_time
data_datetime = datetime.strptime(data_datetime, '%Y-%m-%d %H:%M:%S')
# Pull usage and convert to data type int
data_usage = data[2].text.split()
data_usage = [element for element in data_usage if hasNumbers(element)][0]
data_usage = int(data_usage)
temp_df = pd.DataFrame(data = [[data_time, data_usage]], columns = ['time', 'kW'] )
print('Date: %s Time: %s Usage: %s kW' %(data_date, data_time, data_usage))
return temp_df
# change path_to_file string
path_to_file = 'C:/seniord/csusite/'
# If folder doesn't exist, create it
if not os.path.exists(path_to_file):
os.makedirs(path_to_file)
# get all files in that folder
fnames = glob.glob('*.csv')
# if there are no files, start with new dataframe
# else, get the most recently saved data and read that to continue appending
if fnames == []:
results = pd.DataFrame()
else:
latest_file = max(fnames, key=os.path.getctime)
results = pd.read_csv(path_to_file+latest_file)
date_stored = datetime.now().strftime('%Y_%m_%d_%HH_%M_%S')
while True:
df = get_count()
results = results.append(df).reset_index(drop=True)
#results.to_csv(path_to_file+'%s_kW_usage.csv' %(date_stored),index=False) #If you want to create a new csv file to the folder, uncomment this. Otherwise use the code below
results.to_csv(path_to_file+'kW_usage.csv',index=False)
time.sleep(2)
NEED: ось Y графика для отображения столбца кВт и ось X для отображения соответствующего столбца времени. Затем я хочу просто распечатать метку даты (только дата) над графиком или что-то в этом роде.
Буду очень признателен вашим ребятам за советом, как это реализовать