Shantanu's Blog

Corporate Consultant

November 29, 2012

 

BI made easy with qlikview

QlikView is a Business Intelligence (BI) software, which combines the features of dynamic presentations and instantaneous data manipulation. The paid version comes with a nice user friendly web interface. For example check out the Global Games app by qlikview.

http://ap.demo.qlikview.com/QvAJAXZfc/opendoc.htm?document=qvdocs/Global%20Games.qvw&host=Demo11

a) Australia's performance has deteriorated in the last 3 Olympics.
b) Australians are good at swimming and cycling but not in Shooting.
c) Male to female ratio is equal.

There are 3 steps involved to get any type of report. for e.g.
a) Type australia in the search box.
b) Choose the last 3 years in the years drop down on dashboard.
c) Click on "country profile" tab.

Qlikview has eliminated the scripting layer from the reporting process.  Reporting can be easy, intuitive and fun!

_____


After testing the tool with dummy data, I have come up with some interesting advantages over traditional spreadsheet tools like Excel.

1) Charts
Charts can be easily created based on the selected data. Zoom in / out and export to image file is as easy as pie. (image 1)



2) Two dimensional data
This has been explained in image 2 and image 3.


 
Here are the report inferences those can be derived based on the data analysis.
a) Acer devices are using Android as well as Windows Mobile OS but Android is more popular. (image 2)
b) Acer has around 17 models with A100 and S300 being most poular. (image 3)



Excel can do this, but reverse engineering is not possible in excel.
For e.g. If I need to know all the devices those use Android platform, I will have to re-sort and then re-group the data. qlikview allows us to do all this and much more using right click button as shown in image 4.




Labels: ,


November 14, 2012

 

Elastically Scalable Database

NuoDB is an elastically scalable database that is free to use upto 2 nodes.

1) Initiate an 64 bit AWS red hat EC2 instance and connect. for e.g.

sudo ssh -i Downloads/nov15a.pem root@ec2-54-242-74-2.compute-1.amazonaws.com

2) http port 80 and TCP port 8080 should be accessible from anywhere. Make the necessary changes in "Security Groups" section.

3) Make sure iptables are stopped and selinux disabled.
/etc/init.d/iptables stop
/usr/sbin/setenforce 0

4) Download and install nuodb.

wget http://www.nuodb.com/latest/nuodb-1.0-RC1.linux.x86_64.tar.gz

tar xvfz nuodb-1.0-RC1.linux.x86_64.tar.gz
cd nuodb-1.0-RC1.99.linux.x86_64/
sh run-quickstart

5) Connect to web interface of nuodb on port 8080
http://ec2-54-242-74-2.compute-1.amazonaws.com:8080

6) Import or export rows from test database.

nuoloader --user dba --password goalie --export "select * from hockey.hockey;" test

time ./bin/nuoloader --user dba --password goalie --import "abc8.txt,separator=^" --to 'INSERT INTO hockey.Hockey88 VALUES (?,?,?,?,?);' test@localhost

http://www.nuodb.com/nuodb-online-documentation/references/r_ComPages/r_nuoloader_comref.html

7) Create table would look something like this...
create table Hockey88 ( vname1 string,vname2 string, vname3 string, vname4 string, vname5 string);

8) You can connect to any nuosql server using the client.
nuosql test@ec2-54-242-74-2.compute-1.amazonaws.com

 

Python tips 17 - list break up


listEx = [1,2,3,'mooeez',2.9,2.345,'string','another string',55]

'''
I have a list of mixed vegitables and I need to separate the types those are edible by python.
I can use list comprehension to take out only integers or strings.
isinstance is the built-in function that will be handy.
'''
strList1 = [ i for i in listEx if isinstance(i,str)]

# Or use type function to check if the item is a string or integer.
strList2 = [ i for i in listEx if type(i) == str ]

# The same can be achived using filter.
strList3 = filter(lambda i: isinstance(i,str), listEx)

# It is also possible to use dictionary like object called defaultdict.
import collections
bin=collections.defaultdict(list)

for item in listEx:
    bin[item.__class__.__name__].append(item)

for key, item in bin.items():
    print (key, item)

'''
('int', [1, 2, 3, 55])
('float', [2.9, 2.345])
('str', ['mooeez', 'string', 'another string'])
'''

Labels:


 

python tips 16 - Switch in python


How do I find the results if the marks are given as a list.

s = [50,44,62,15,76,57,97,82,99,45,23]

'''
python does not support case syntax to help you with nested if statements.
We need a function to manage multiple if
it is possible to use list comprehension as well but that might be confusing.
'''
aa=["fail" if g < 40 else "A++" if g > 75 else "A" if g > 50 else "pass" for g in s]
# use zip or map to connect the results with original marks
print aa

def grade(i):
    if i<40: ail="ail" p="p" return="return">    if i>75: return "A++"
    if i>50: return "A"
    if i>40: return "pass"
   
li = map(lambda x: "{0} - {1}".format(x, grade(x)), s)
for i in li: print i

'''
50 - pass
44 - pass
62 - A
15 - Fail
76 - A++
57 - A
97 - A++
'''

Labels:


November 08, 2012

 

python tips 15 - sort made easy


# use function to sort on key
from operator import itemgetter
student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
]
print sorted(student_tuples, key=itemgetter(2))

# using lambda to avoid function as key
items=[('1', 0.6923076923076923), ('0', 2.0), ('3', 0.2222222222222222),
 ('2', 1.0909090909090908), ('7', 0.0), ('6', 0.875),
('9', 1.6923076923076923),('8', 1.3333333333333333)]

print sorted(items, key=lambda (_, value): value)

# use class to map the items and then use it as a key
class Student:
    def __init__(self, name, grade, age):
            self.name = name
            self.grade = grade
            self.age = age
    def __repr__(self):
            return repr((self.name, self.grade, self.age))

student_objects = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]

print sorted(student_objects, key=lambda student: student.age)  

from operator import attrgetter
print sorted(student_objects, key=attrgetter('age'))

# decorate sort undecorate
decorated = [(student.grade, i, student) for i, student in enumerate(student_objects)]
decorated.sort()
[student for grade, i, student in decorated]

Labels:


November 07, 2012

 

python tips 14 - nested loops


Using plain nested-for loops can get you nesting.

>>> dummy = {1:[1,2,3],2:[2,3,4],3:[3,4,5]}
>>> aa = (dd for _,d in dummy.iteritems() for dd in d)
>>> list(aa)
[1, 2, 3, 2, 3, 4, 3, 4, 5]

That will do the same as:

def aa(dummy):
    for _, d in dummy.iteritems():
        for dd in d:
            yield dd

print list(aa())

The best way to learn generator expressions is to start with plain generators so you can easily see the results at each step.


Labels:


 

Python tips 13 - error handling


Use traceback module to read and log errors.

import traceback
try:
    with open("C:/path/to/py.log") as f:
        for line in f:
            print line
except IOError, exception:
    print 'aaa'
    print exception
    print
    print 'test'
    print traceback.print_exc()
    print 'test2'
 _____

logging module can handle such issues more elegantly.

import logging
logging.basicConfig(filename="sample.log", level=logging.INFO)
log = logging.getLogger("ex")

try:
    raise RuntimeError
except RuntimeError, err:
    log.exception("RuntimeError!")

Labels:


November 05, 2012

 

Python tips 12 - Tk interface


# The Tkinter module ("Tk interface") is the standard Python interface to the Tk GUI toolkit. We can create windows and menus as shown below.

from Tkinter import *

def callback():
    print "called the callback!"

root = Tk()

# create a menu
menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=callback)
filemenu.add_command(label="Open...", command=callback)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=callback)

helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=callback)

mainloop()


# This will create 2 buttons in a new window with Hello and Quit words with 2 different functions being called while clicked.

from Tkinter import *

class App:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.button = Button(frame, text="QUIT", fg="red", command=frame.quit)
        self.button.pack(side=LEFT)

        self.hi_there = Button(frame, text="Hello", command=self.say_hi)
        self.hi_there.pack(side=LEFT)

    def say_hi(self):
        print "hi there, everyone!"

root = Tk()

app = App(root)

root.mainloop()

# and here is hello world example

from Tkinter import *
root = Tk()
w = Label(root, text="Hello, world!")
w.pack()
root.mainloop()


Archives

June 2001   July 2001   January 2003   May 2003   September 2003   October 2003   December 2003   January 2004   February 2004   March 2004   April 2004   May 2004   June 2004   July 2004   August 2004   September 2004   October 2004   November 2004   December 2004   January 2005   February 2005   March 2005   April 2005   May 2005   June 2005   July 2005   August 2005   September 2005   October 2005   November 2005   December 2005   January 2006   February 2006   March 2006   April 2006   May 2006   June 2006   July 2006   August 2006   September 2006   October 2006   November 2006   December 2006   January 2007   February 2007   March 2007   April 2007   June 2007   July 2007   August 2007   September 2007   October 2007   November 2007   December 2007   January 2008   February 2008   March 2008   April 2008   July 2008   August 2008   September 2008   October 2008   November 2008   December 2008   January 2009   February 2009   March 2009   April 2009   May 2009   June 2009   July 2009   August 2009   September 2009   October 2009   November 2009   December 2009   January 2010   February 2010   March 2010   April 2010   May 2010   June 2010   July 2010   August 2010   September 2010   October 2010   November 2010   December 2010   January 2011   February 2011   March 2011   April 2011   May 2011   June 2011   July 2011   August 2011   September 2011   October 2011   November 2011   December 2011   January 2012   February 2012   March 2012   April 2012   May 2012   June 2012   July 2012   August 2012   October 2012   November 2012   December 2012   January 2013   February 2013   March 2013   April 2013   May 2013   June 2013   July 2013   September 2013   October 2013   January 2014   March 2014   April 2014   May 2014   July 2014   August 2014   September 2014   October 2014   November 2014   December 2014   January 2015   February 2015   March 2015   April 2015   May 2015   June 2015   July 2015   August 2015   September 2015   January 2016   February 2016   March 2016   April 2016   May 2016   June 2016   July 2016   August 2016   September 2016   October 2016   November 2016   December 2016   January 2017   February 2017   April 2017   May 2017   June 2017   July 2017  

This page is powered by Blogger. Isn't yours?