Twitter-aktiivisuuden ihmettelyä
Halusin saada harjoitusta Julian datankäpistelyominaisuuksista ja idea oli hakea twitteristä lista omien twiittieni päivämääristä ja piirtää niistä jonkinlainen käppyrä. Pikkujuttu periaatteessa, mutta käytännössä ensimmäistä kertaa outojen kirjastojen kanssa ei niinkään.
Twitter.jl -kirjaston avulla sain ladattua 100 viimeisintä päivitystäni, lukuisten timeouttien jälkeen. En tiedä oliko Twitterin API vain jumissa vai kirjastossa jotain ongelmia.
Twiittien päivämääräkentät ovat muotoa “Fri Sep 26 15:19:11 +0000 2014”, älkää kysykö miksi. Joka tapauksessa näiden parsiminen tuotti mukavasti päänvaivaa. Lopulta sain päivämäärän ulos Calendar-moduulin avulla, kunhan ensin ymmärsin muuttaa järjestelmäni kielen suomesta englanniksi.
using Twitter, Calendar
# consumer_key, consumer_token, oauth_token and oauth_secret
twitterauth("asdfasdgfhfdghfdh",
"asdfsadfasdfasdfasd",
"sdfgdfgsdf-rtsdgdfsgdsghsdfgdfgdfsga",
"dsfgsrrtytryherhfghfdg")
timeline = get_user_timeline(; options = {"screen_name" => "anttihalla", "count" => 100})
ds = map(timeline) do x
d = x.created_at
cal = Calendar.parse("EEE MMM dd HH:mm:ss xx yyyy", d)
format(cal, "yyyy-MM-dd")
done
df = DataFrame(Date=ds)
writetable("tweets.csv", df)
Data on nyt hankittu ja tallennettu csv-tiedostoon.
DataFrames-moduuli tuo Juliaan tietokantataulumaisen tietotyypin (vrt Python Pandas, R-kielen data.frame), joka helpottaa esimerkiksi tilastollista laskentaa. Moduuli tuo myös puuttuvia arvoja varten NA -käsitteen, mitä ilman datanpenkojan elämä olisi kovin vaikeata. Gadfly taas on Julian oma grafiikkakirjasto, R-kielen ggplot2:a mukaillen. Ennen plottaamista dataa piti vielä hieman tuunata.
using DataFrames, Gadfly, Dates
df = readtable("tweets.csv")
# luusi sarake ja luku 1 jokaista tweettiä kohden summausta varten
df2 = hcat(df, rep(1,nrow(df)))
# pvm:n muunnos Stringistä Date-tyypiksi
df2[:Date] = Date(df2[:Date])
# taulu, jossa kaikki päivämäärät alun ja lopun välillä...
dfAll = DataFrame(
Date=[Date(first(df[:Date])):Date(last(df[:Date]))])
# jotta saadaan twiitittömät päivät mukaan myös
dfMerged = sort(join(dfAll,df2; on=:Date, kind=:left))
# puuttuvat (NA) arvot korvataan nollalla
dfMerged[:x1] = array(dfMerged[:x1], 0)
# päiväkohtaiset twiittisummat
combined = by(dfMerged, :Date, df -> sum(df[:x1]))
# lopuksi joka päivälle lasketaan kumulatiivinen summa
combined[:Cumulative] = cumsum(combined[:x1])
# piirretään viivagraafi kumulatiivisen arvon kehityksestä
plot(combined, x=[1:nrow(combined)], y="Cumulative", Geom.line)
Noniin. Sitten voikin ihmetellä kuvaa ja miettiä voiko siitä päätellä jotain.
Sataan twiittiin on mennyt aikaa melkein 500 päivää, eli keskimäärin vajaa puolitoista twiittiä viikossa. Käppyrästä voi myös tunnistaa yli-innostumisvaiheita, joiden jälkeen on lentänyt hanskat tiskiin. Viimeisin innostusvaihe on näemmä juuri alkanut pari päivää sitten, ennuste sen kestämiselle ei historiadatan perusteella ole kovin hyvä.
Linkit
- Twitter.jl - Julia package to access Twitter API
- Calendar.jl ja Dates-module - Date handling in Julia
- DataFrames.jl - Tools for working with statistical data in Julia.
- Python Pandas - Python data analysis library
- R dataframe - R documentation
- Gadfly.jl - Statistical graphics for Julia.