python-2.9; plot only last month; label at every second day

This commit is contained in:
Daniel Langbein 2021-02-17 16:59:17 +01:00
parent 94b10f0300
commit 61b1dcdb4d
8 changed files with 51 additions and 6 deletions

View File

@ -5,7 +5,7 @@
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/venv" /> <excludeFolder url="file://$MODULE_DIR$/venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.7 (venv37)" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.9 (venv-39)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
<component name="PackageRequirementsSettings"> <component name="PackageRequirementsSettings">

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (venv37)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (venv-39)" project-jdk-type="Python SDK" />
</project> </project>

View File

@ -0,0 +1,24 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="main - plot" type="PythonConfigurationType" factoryName="Python">
<module name="bbb-status" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="$USER_HOME$/venv-39/bin/python" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/langfingaz" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/langfingaz/main.py" />
<option name="PARAMETERS" value="plot" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
</component>

View File

@ -1,4 +1,4 @@
FROM python:3.8-alpine FROM python:3.9-alpine
WORKDIR /usr/src/ WORKDIR /usr/src/

View File

@ -29,3 +29,7 @@ Generate a new plot based on saved meeting data:
```shell ```shell
sudo docker-compose run bbb-status plot sudo docker-compose run bbb-status plot
``` ```
## example plot
![plot of one month BBB usage](plot-last-month.png)

BIN
plot-last-month.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View File

@ -20,7 +20,7 @@ def main():
'\tplot: saves a plot of the saved BBB meeting data\n' '\tplot: saves a plot of the saved BBB meeting data\n'
if len(argv) != 2: if len(argv) != 2:
raise ValueError("Expected one commandline argument!") raise ValueError("Expected one commandline argument!\n" + usageStr)
if argv[1] == "log": if argv[1] == "log":
logMeetingData.v1() logMeetingData.v1()

View File

@ -1,3 +1,4 @@
from datetime import datetime, timedelta
from pathlib import Path from pathlib import Path
from typing import List from typing import List
import logging import logging
@ -25,15 +26,31 @@ def plotMeetings(dataDir: Path = fileUtil.getProjectBaseDir().joinpath("data")):
dataStr, t = loadData.loadData(file) dataStr, t = loadData.loadData(file)
meetings: List[Meeting] = parseMeetings.parseMeetingsData(dataStr) meetings: List[Meeting] = parseMeetings.parseMeetingsData(dataStr)
bbbStati.append(parseMeetings.BbbStatus(meetings, t)) bbbStati.append(parseMeetings.BbbStatus(meetings, t))
if (len(bbbStati) < 1):
print("No bbbStatus objects could be read from data directory: " + str(dataDir))
return
# sort by date (x-axis) # sort by date (x-axis)
bbbStati = sorted(bbbStati, key=BbbStatus.getKey) bbbStati = sorted(bbbStati, key=BbbStatus.getKey)
# filter: take only bbbStatus objects of the last month (4 weeks)
#
# start: datetime = bbbStati[0].pointOfTime
# end: datetime = bbbStati[-1].pointOfTime
# delta: timedelta = end-start
end: datetime = bbbStati[-1].pointOfTime
monthBeforeEnd: datetime = end - timedelta(days=28)
bbbStati = [bbbStatus for bbbStatus in bbbStati if bbbStatus.pointOfTime >= monthBeforeEnd]
image: Path = doPlotMeetings(bbbStati) image: Path = doPlotMeetings(bbbStati)
print("saved image at " + str(image)) print("saved image at " + str(image))
def doPlotMeetings(bbbStati: List[BbbStatus]) -> Path: def doPlotMeetings(bbbStati: List[BbbStatus]) -> Path:
'''
:param bbbStati: List of bbbStatus objects sorted by date
'''
time = [] # x-axis: time time = [] # x-axis: time
participants = [] # yAxis (1) participants = [] # yAxis (1)
videos = [] # yAxis (2) videos = [] # yAxis (2)
@ -56,8 +73,8 @@ def doPlotMeetings(bbbStati: List[BbbStatus]) -> Path:
ax.plot(time, voices, label='voice') ax.plot(time, voices, label='voice')
# format the ticks (on x-axis) # format the ticks (on x-axis)
days = mdates.DayLocator() days = mdates.DayLocator(interval=2) # every second days
hours = mdates.HourLocator(interval=6) # every 6 hours one minor tick hours = mdates.HourLocator(interval=12) # every 12 hours one minor tick
dateFmt = mdates.DateFormatter('%Y-%m-%d') dateFmt = mdates.DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_locator(days) ax.xaxis.set_major_locator(days)