198 lines
5.5 KiB
Python
198 lines
5.5 KiB
Python
|
#! /usr/bin/env python
|
||
|
# -*- coding: UTF-8 -*-
|
||
|
import matplotlib.pyplot as plt
|
||
|
from statistikkHelpers import *
|
||
|
import matplotlib.dates as mdates
|
||
|
|
||
|
def getInputType():
|
||
|
inp = 0
|
||
|
while not (inp == '1' or inp == '2' or inp == '3' or inp == '4'):
|
||
|
print 'type 1 for user-statistics'
|
||
|
print 'type 2 for product-statistics'
|
||
|
print 'type 3 for global-statistics'
|
||
|
print 'type 4 to enter loop-mode'
|
||
|
inp = raw_input('')
|
||
|
return int(inp)
|
||
|
|
||
|
def getDateFile(date, n):
|
||
|
try:
|
||
|
if n==0:
|
||
|
inp = raw_input('start date? (yyyy-mm-dd) ')
|
||
|
elif n==-1:
|
||
|
inp = raw_input('end date? (yyyy-mm-dd) ')
|
||
|
year = inp.partition('-')
|
||
|
month = year[2].partition('-')
|
||
|
return datetime.date(int(year[0]), int(month[0]), int(month[2]))
|
||
|
except:
|
||
|
print 'invalid date, setting start start date'
|
||
|
if n==0:
|
||
|
print 'to date found on first line'
|
||
|
elif n==-1:
|
||
|
print 'to date found on last line'
|
||
|
print date
|
||
|
return datetime.date(int(date.partition('-')[0]), int(date.partition('-')[2].partition('-')[0]), int(date.partition('-')[2].partition('-')[2]))
|
||
|
|
||
|
def dateToDateNumFile(date, startDate):
|
||
|
year = date.partition('-')
|
||
|
month = year[2].partition('-')
|
||
|
day = datetime.date(int(year[0]), int(month[0]), int(month[2]))
|
||
|
deltaDays = day-startDate
|
||
|
return int(deltaDays.days), day.weekday()
|
||
|
|
||
|
def getProducts(products):
|
||
|
product = []
|
||
|
products = products.partition('¤')
|
||
|
product.append(products[0])
|
||
|
while (products[1]=='¤'):
|
||
|
products = products[2].partition('¤')
|
||
|
product.append(products[0])
|
||
|
return product
|
||
|
|
||
|
|
||
|
def piePlot(dictionary, n):
|
||
|
keys = []
|
||
|
values = []
|
||
|
i=0
|
||
|
for key in sorted(dictionary, key=dictionary.get, reverse=True):
|
||
|
values.append(dictionary[key])
|
||
|
if i<n:
|
||
|
keys.append(key)
|
||
|
i += 1
|
||
|
else:
|
||
|
keys.append('')
|
||
|
plt.pie(values, labels=keys)
|
||
|
|
||
|
|
||
|
def datePlot(array, dateLine):
|
||
|
if (not array == []):
|
||
|
plt.bar(dateLine, array)
|
||
|
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b'))
|
||
|
|
||
|
def dayPlot(array, days):
|
||
|
if (not array == []):
|
||
|
for i in range(7):
|
||
|
array[i]=array[i]*7.0/days
|
||
|
plt.bar(range(7), array)
|
||
|
plt.xticks(range(7),[' mon',' tue',' wed',' thu',' fri',' sat',' sun'])
|
||
|
|
||
|
def graphPlot(array, dateLine):
|
||
|
if (not array == []):
|
||
|
plt.plot(dateLine, array)
|
||
|
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b'))
|
||
|
|
||
|
|
||
|
def plotUser(database, dateLine, user, n):
|
||
|
printUser(database, dateLine, user, n)
|
||
|
plt.subplot(221)
|
||
|
piePlot(database.personVareAntall[user], n)
|
||
|
plt.xlabel('antall varer kjøpt gjengitt i antall')
|
||
|
plt.subplot(222)
|
||
|
datePlot(database.personDatoVerdi[user], dateLine)
|
||
|
plt.xlabel('penger brukt over dato')
|
||
|
plt.subplot(223)
|
||
|
piePlot(database.personVareVerdi[user], n)
|
||
|
plt.xlabel('antall varer kjøpt gjengitt i verdi')
|
||
|
plt.subplot(224)
|
||
|
dayPlot(database.personUkedagVerdi[user], len(dateLine))
|
||
|
plt.xlabel('forbruk over ukedager')
|
||
|
plt.show()
|
||
|
|
||
|
|
||
|
def plotProduct(database, dateLine, product, n):
|
||
|
printProduct(database, dateLine, product, n)
|
||
|
plt.subplot(221)
|
||
|
piePlot(database.varePersonAntall[product], n)
|
||
|
plt.xlabel('personer som har handler produktet')
|
||
|
plt.subplot(222)
|
||
|
datePlot(database.vareDatoAntall[product], dateLine)
|
||
|
plt.xlabel('antall produkter handlet per dag')
|
||
|
#plt.subplot(223)
|
||
|
plt.subplot(224)
|
||
|
dayPlot(database.vareUkedagAntall[product], len(dateLine))
|
||
|
plt.xlabel('antall over ukedager')
|
||
|
plt.show()
|
||
|
|
||
|
def plotGlobal(database, dateLine, n):
|
||
|
printGlobal(database, dateLine, n)
|
||
|
plt.subplot(231)
|
||
|
piePlot(database.globalVareVerdi, n)
|
||
|
plt.xlabel('varer kjøpt gjengitt som verdi')
|
||
|
plt.subplot(232)
|
||
|
datePlot(database.globalDatoForbruk, dateLine)
|
||
|
plt.xlabel('forbruk over dato')
|
||
|
plt.subplot(233)
|
||
|
graphPlot(database.pengebeholdning, dateLine)
|
||
|
plt.xlabel('pengebeholdning over tid (negativ verdi utgjør samlet kreditt)')
|
||
|
plt.subplot(234)
|
||
|
piePlot(database.globalPersonForbruk, n)
|
||
|
plt.xlabel('penger brukt av personer')
|
||
|
plt.subplot(235)
|
||
|
dayPlot(database.globalUkedagForbruk, len(dateLine))
|
||
|
plt.xlabel('forbruk over ukedager')
|
||
|
plt.show()
|
||
|
|
||
|
|
||
|
def alt4menu(database, dateLine, useDatabase):
|
||
|
n=10
|
||
|
while 1:
|
||
|
print '\n1: user-statistics, 2: product-statistics, 3:global-statistics, n: adjust amount of data shown q:quit'
|
||
|
try:
|
||
|
inp = raw_input('')
|
||
|
except:
|
||
|
continue
|
||
|
if inp == 'q':
|
||
|
break
|
||
|
elif inp == '1':
|
||
|
if i=='0':
|
||
|
user = raw_input('input full username: ')
|
||
|
else:
|
||
|
user = getUser()
|
||
|
plotUser(database, dateLine, user, n)
|
||
|
elif inp == '2':
|
||
|
if i=='0':
|
||
|
product = raw_input('input full product name: ')
|
||
|
else:
|
||
|
product = getProduct()
|
||
|
plotProduct(database, dateLine, product, n)
|
||
|
elif inp == '3':
|
||
|
plotGlobal(database, dateLine, n)
|
||
|
elif inp == 'n':
|
||
|
try:
|
||
|
n=int(raw_input('set number to show '));
|
||
|
except:
|
||
|
pass
|
||
|
#---------------------------------------MAIN-------------------------------------
|
||
|
inputType=getInputType()
|
||
|
i = raw_input('0:fil, 1:database \n? ')
|
||
|
if (inputType == 1):
|
||
|
if i=='0':
|
||
|
user = raw_input('input full username: ')
|
||
|
else:
|
||
|
user = getUser()
|
||
|
product = ''
|
||
|
elif (inputType == 2):
|
||
|
if i=='0':
|
||
|
product = raw_input('input full product name: ')
|
||
|
else:
|
||
|
product = getProduct()
|
||
|
user = ''
|
||
|
else :
|
||
|
product = ''
|
||
|
user = ''
|
||
|
if i=='0':
|
||
|
inputFile=raw_input('logfil? ')
|
||
|
if inputFile=='':
|
||
|
inputFile='default.dibblerlog'
|
||
|
database, dateLine = buildDatabaseFromFile(inputFile, inputType, product, user)
|
||
|
else:
|
||
|
database, dateLine = buildDatabaseFromDb(inputType, product, user)
|
||
|
|
||
|
if (inputType==1):
|
||
|
plotUser(database, dateLine, user, 10)
|
||
|
if (inputType==2):
|
||
|
plotProduct(database, dateLine, product, 10)
|
||
|
if (inputType==3):
|
||
|
plotGlobal(database, dateLine, 10)
|
||
|
if (inputType==4):
|
||
|
alt4menu(database, dateLine, i)
|