On Github lgautier / odsc-pdaibp-slides
I am here as an individual, long-active Open Source developer and data scientist. Views and opinions expressed are solely my own.
docker run --rm -it -p 8888:8888 \
rpy2/odsc-pdaibp-slides
Visit http://localhost:8888/
**: If docker-machine (Windows, OS X), the address is:
docker-machine ip [MACHINE]
cursor = dbcon.cursor() sql = """ SELECT reviewhelpful, count(*) FROM review WHERE reviewscore < 2 GROUP BY reviewhelpful """ cursor.execute(sql)
Julia ⇒ Python : PyCall Julia ⇒ R : Rif or RCall [somewhere] ⇒ R : Rserve R ⇒ Python : rPython
Polyglot data analysis a project/ensemble with:
J. McAuley and J. Leskovec. From amateurs to connoisseurs: modeling the evolution of user expertise through online reviews. WWW, 2013. http://snap.stanford.edu/data/web-FineFoods.html
product/productId: B00...W
review/userId: A1S...MSMR
review/profileName: [some profile name]
review/helpfulness: 0/0
review/score: 1.0
review/time: 1344556800
review/summary: Sad outcome
review/text: Five minutes in, one tentacle was bitten off, ball inside
cracked in half. Not durable enough to be a dog toy.
Disappointed :(. So is the dog :(.
import sqlite3 dbfilename = "/opt/data/finefoods.db" dbcon = sqlite3.connect(dbfilename)
cursor = dbcon.cursor() sql = """ SELECT reviewhelpful, count(*) FROM review WHERE reviewscore < 2 GROUP BY reviewhelpful """ cursor.execute(sql)
<sqlite3.Cursor at 0x7fd01c3be7a0>
from collections import Counter
ct = Counter()
for row_n, (score, count) in enumerate(cursor, 1):
ct[score] = count
print(ct.most_common(n=3))
[('0/0', 12266), ('1/1', 4809), ('0/1', 3701)]
sql = """
select reviewhelpful, count(*)
from (select T.reviewername
from (select reviewername, count(*) as reviewer_count
from review
group by reviewername) as T
where T.reviewer_count > 5) as U
inner join review
on U.reviewername = review.reviewername
where reviewscore < 2
group by reviewhelpful
"""
cursor.execute(sql)
<sqlite3.Cursor at 0x7fd01c3be880>
cursor = dbcon.cursor() sql = """ select * from review where reviewscore < 2 """ cursor.execute(sql) result = cursor.fetchall()
result = (Review
.select()
.where(Review.reviewscore < 2))
(example with SQLObject)
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
from sqlalchemy import create_engine
Base = automap_base()
# engine, suppose it has two tables 'user' and 'address' set up
engine = create_engine("sqlite:////opt/data/finefoods.db")
Base.prepare(engine, reflect=True) review = Base.classes.review
session = Session(engine)
from sqlalchemy import func # SQL functions
query = (session
.query(review.reviewhelpful,
func.count(review.reviewhelpful))
.filter(review.reviewscore < 2)
.group_by(review.reviewhelpful)
.order_by(func.count(review.reviewhelpful).desc()))
res = query.all()
res[:3]
[('0/0', 12266), ('1/1', 4809), ('0/1', 3701)]
from sqlalchemy.dialects import sqlite print(str(query.statement.compile(dialect=sqlite.dialect())))
SELECT review.reviewhelpful, count(review.reviewhelpful) AS count_1 FROM review WHERE review.reviewscore < ? GROUP BY review.reviewhelpful ORDER BY count(review.reviewhelpful) DESC
datasrc <- src_sqlite(dbfilename) review_tbl <- tbl(datasrc, "review")
res <- filter(review_tbl,
reviewscore < 2) %>%
count(reviewhelpful) %>%
arrange('desc(n)')
from rpy2.robjects.lib import dplyr
datasrc = dplyr.src_sqlite(dbfilename)
review_tbl = datasrc.get_table("review")
res = (review_tbl
.filter('reviewscore < 2')
.count('reviewhelpful')
.arrange('desc(n)'))
print(res)
Source: sqlite 3.8.6 [/opt/data/finefoods.db]
From: <derived table> [?? x 2]
Arrange: desc(n)
reviewhelpful n
(chr) (int)
1 0/0 12266
2 1/1 4809
3 0/1 3701
4 1/2 2718
5 2/2 2123
6 0/2 1702
7 2/3 1579
8 1/3 1342
9 3/3 1104
10 2/4 921
.. ... ...
from rpy2.robjects import r, globalenv
import rpy2.robjects.lib.ggplot2 as gg
split_review = \
'as.integer(sapply(strsplit(reviewhelpful, "/"), "[", %i))'
p = (gg.ggplot((res.collect().
mutate(r1 = split_review % 1,
r2 = split_review % 2))) +
gg.aes_string(x='r1+1', y='r2+1', size='n') +
gg.geom_point(alpha = 0.5) +
gg.scale_x_log10("review voted helpful") +
gg.scale_y_log10("review") +
gg.scale_size(trans="sqrt"))
from rpy2.robjects.lib import grdevices
with grdevices.render_to_bytesio(grdevices.png,
width=800,
height=600,
res=120) as b:
p.plot()
from IPython.display import Image, display
data = b.getvalue()
display(Image(data=data, format='png', embed=True))
from bokeh.plotting import figure
from bokeh.plotting import figure, show, output_notebook
output_notebook()
plot = figure()
res = (review_tbl
.filter('reviewscore < 2')
.count('reviewhelpful')
.collect())
import math
plot.scatter(list(int(x.split('/')[0]) \
for x in res.rx2('reviewhelpful')),
list(int(x.split('/')[1]) \
for x in res.rx2('reviewhelpful')),
radius=list(math.log10(x/100) for x in res.rx2('n')),
fill_alpha=.3)
show(plot)
<Bokeh Notebook handle for In[16]>
import findspark
findspark.init()
import pyspark
conf = pyspark.conf.SparkConf()
(conf.setMaster('local[2]')
.setAppName('ipython-notebook')
.set("spark.executor.memory", "2g"))
sc = pyspark.SparkContext(conf=conf)
from pyspark.sql import SQLContext, Row
sqlcontext = SQLContext(sc)
cursor.execute('select * from review limit 10000')
review = \
sqlcontext.createDataFrame(cursor,
tuple(x[0] for x in cursor.description))
review.registerTempTable("review")
The data is now distributed on a Spark cluster.
sql = """ SELECT reviewhelpful, count(*) AS ct FROM review WHERE reviewscore < 2 GROUP BY reviewhelpful ORDER BY ct DESC """ counts = sqlcontext.sql(sql)
res = counts.collect() res[:3]
[Row(reviewhelpful='0/0', ct=241), Row(reviewhelpful='1/1', ct=87), Row(reviewhelpful='0/1', ct=80)]
names = (review
.flatMap(lambda p: p.reviewsummary.split())
.map(lambda word: (word.lower(), 1))
.reduceByKey(lambda a, b: a+b))
names.takeOrdered(15, key = lambda x: -x[1])
[('great', 1259),
('the', 914),
('good', 837),
('for', 706),
('a', 695),
('not', 624),
('and', 581),
('best', 568),
('my', 451),
('coffee', 438),
('but', 401),
('love', 395),
('of', 391),
('to', 371),
('is', 350)]
sql = """
SELECT *
FROM review
WHERE reviewscore < 2
"""
lowscore = sqlcontext.sql(sql)
names = (lowscore
.flatMap(lambda p: p.reviewsummary.split())
.map(lambda word: (word.lower(), 1))
.reduceByKey(lambda a, b: a+b))
names.takeOrdered(8, key = lambda x: -x[1])
[('not', 132),
('the', 92),
('is', 50),
('of', 48),
('this', 46),
('for', 44),
('i', 43),
('a', 42)]
lst = names.takeOrdered(8, key = lambda x: -x[1])
from rpy2.robjects.vectors import StrVector, IntVector
dataf = dplyr.DataFrame({'word': StrVector([x[0] for x in lst]),
'count': IntVector([x[1] for x in lst])})
p = (gg.ggplot(dataf) +
gg.geom_bar(gg.aes_string(x='word', y='count'),
stat="identity"))
with grdevices.render_to_bytesio(grdevices.png,
width=800,
height=600,
res=120) as b:
p.plot()
display(Image(data=b.getvalue(), format='png', embed=True))