[src=python]############ main ############
# Imports of own files
from helperfunctions import selectFile, parseEnglishDate, parseGermanDate, parseTime
## CSV Import
import csv
## MatplotLib ##
import matplotlib.pyplot as plt
## Dates ##
import matplotlib.dates as mdates
import datetime
from collections import Counter, OrderedDict
# This function generates a few graphs which displayes the injuries over a specific parameter
def showDiagrams():
print("Please select the training CSV file.\n")
selectedFile = selectFile()
if not selectedFile:
print("No valid file selected.")
return
headers = []
seperatedParams = {}
with open(selectedFile) as csvFile:
data = csv.DictReader(csvFile)
# header should be:
#
#'',
#'Strassenklasse',
#'Unfalldatum',
#'Alter',
#'Unfallklasse',
#'Unfallschwere', #### This one will be displayed
#'Lichtverhältnisse',
#'Verletzte Personen',
#'Anzahl Fahrzeuge',
#'Bodenbeschaffenheit',
#'Geschlecht',
#'Zeit (24h)',
#'Fahrzeugtyp',
#'Wetterlage'
# Seperate parameters
headers = data.fieldnames
for header in headers:
seperatedParams[header] = []
#i = 0
for row in data:
for header in headers:
seperatedParams[header].append([row[header], row['Unfallschwere']])
# Seperate each list by the seconds column ('Unfallschwere')
for header in headers:
# Columns we do not need to display
if header in ['', 'Unfallschwere']:
continue
print ("Processing " + header)
sortedParams = {}
for line in seperatedParams[header]:
if header == 'Unfalldatum':
# We use year 2016 to just use the day and month (and be able to use "Schaltjahr")
if "." in line[0]:
line[0] = parseGermanDate(line[0], 2016)
elif "-" in line[0]:
line[0] = parseEnglishDate(line[0], 2016)
elif header == 'Zeit (24h)':
time = parseTime(line[0])
if time:
line[0] = datetime.datetime.combine(datetime.date.today(), time)
else:
continue
elif header == 'Lichtverhältnisse':
line[0] = line[0].replace(' ', "\n")
elif header in ['Alter', 'Verletzte Personen', 'Anzahl Fahrzeuge']:
line[0] = int(line[0])
if line[1] not in sortedParams:
sortedParams[line[1]] = []
sortedParams[line[1]].append(line[0])
resortedParams = {}
for tmp in sortedParams:
resortedParams[tmp] = sorted(sortedParams[tmp])
sortedParams = resortedParams
# Now we can generate the image we need want to display
fig, ax = plt.subplots()
fig.autofmt_xdate()
axes = []
for l1 in sortedParams:
arrays = {}#OrderedDict()
for el in sortedParams[l1]:
if el not in arrays:
arrays[el] = 0
arrays[el] += 1
if header in ['Alter', 'Verletzte Personen', 'Anzahl Fahrzeuge', 'Unfalldatum', 'Zeit (24h)']:
if header == 'Unfalldatum':
ax.get_xaxis().set_major_formatter(mdates.DateFormatter('%d.%m'))
elif header == 'Zeit (24h)':
ax.get_xaxis().set_major_formatter(mdates.DateFormatter('%H:%M'))
axes.append(ax.plot(arrays.keys(), arrays.values()))
else:
axes.append(ax.bar(arrays.keys(), arrays.values(), align='center'))
ax.set_ylabel("Occurences")
ax.set_xlabel(header)
ax.tick_params(axis='x', rotation=70)
if header in ['Alter', 'Verletzte Personen', 'Anzahl Fahrzeuge', 'Unfalldatum', 'Zeit (24h)']:
new_axes = []
for a in axes:
new_axes.append(a[0])
axes = new_axes
ax.legend(axes, sortedParams.keys())
plt.grid()
plt.gcf().tight_layout()
plt.savefig(header + ".png", bbox_inches = 'tight')
#plt.show()
############ helperfunctions.py ############
## CSV Import
from os import listdir
## FileDialog ##
import tkinter as tk
from tkinter import filedialog
## Dates ##
import datetime
## variables ##
englishMonth = {'Jan':1, 'Feb':2, 'Mar':3, 'Apr':4, 'May':5, 'Jun':6, 'Jul':7, 'Aug':8, 'Sep':9, 'Oct':10, 'Nov':11, 'Dec':12}
germanMonth = {'Jan':1, 'Feb':2, 'Mrz':3, 'Apr':4, 'Mai':5, 'Jun':6, 'Jul':7, 'Aug':8, 'Sep':9, 'Okt':10, 'Nov':11, 'Dez':12}
## Functions ##
def selectFile():
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
return file_path
def parseEnglishDate(dt, optionalYear = None):
# %d-%b-%y
if not "-" in dt:
print("Invalid time for the function: ", dt)
return
pos = dt.find('-')
day = int(dt[
os])
pos2 = dt.find('-', pos+1)
month = dt[pos + 1
os2]
year = dt[pos2 + 1:]
if optionalYear:
year = optionalYear
return datetime.date(year, englishMonth[month], day)
def parseGermanDate(dt, optionalYear = None):
# %d. %b.
if not "." in dt:
print("Invalid time for the function: ", dt)
return
pos = dt.find('.')
day = int(dt[
os])
pos = dt.find(' ')
month = dt[pos + 1:-1]
year = 2018
if optionalYear:
year = optionalYear
return datetime.date(year, germanMonth[month], day)
def parseTime(t):
# %H%M
if len(t) == 3:
hours = t[:1]
minutes = t[1:]
elif len(t) == 4:
hours = t[:2]
minutes = t[2:]
else:
#print("Invalid time for this function: ", t)
return
return datetime.time(int(hours), int(minutes))[/src]
Damit kann man zumindest die Daten schonmal darstellen. Und ich vermute, dass alle, die Python nutzen wollen, da auch ein bisschen Code rausziehen können.