#! /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)