Extract Weather data (In Norwegian)
Grid regionalt nivå: Twitter og vær-data
Region: Sør-Norge nord til Bergen (lengde/breddegrad 58.0, 5.1 til 60.5, 11.1). Mindre område enn dette vil gi for lite twitter-data til noen meningsfull analyse. Dele opp region i like store celler, f.eks et 10x10 grid. Twitter-data vil nødvendigvis være konsentrert rundt befolkningssentre, ikke alle celler vil ha særlig med data. Innsamling av twitter-meldinger på server er i gang, i overkant av 3000 meldinger (meldingstekst, tidsstempel, geo-koordinater) lagret i løpet av første uke. Bruker et python script med biblioteket tweepy (http://www.tweepy.org/) til innsamling, og lagrer i MongoDB.
Twitter data kan legges til grid med f.eks. ordtelling i cellene pr dag. Værdata kan samles inn fra Meteorologisk institutts webtjeneste (http://eklima.met.no/wsKlima/start/start_no.html). Alle observasjoner fra meteorologiske institutts stasjoner er tilgjengelige, historiske og oppdaterte hvis stasjonen er i drift. I den utvalgte regionen er det 429 aktive stasjoner. Aktuelle data kan være temperatur(døgnmiddeltemperatur/min/max), nedbør, lufttrykk. Bruker python og biblioteket suds (https://bitbucket.org/jurko/suds):
from suds.client import Client from suds.xsd.doctor import ImportDoctor, Import from datetime import datetime, timedelta
url = 'http://eklima.met.no/metdata/MetDataService?WSDL'
imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
imp.filter.add('http://no.met.metdata/IMetDataService.xsd')
doc = ImportDoctor(imp)
c = Client(url, doctor = doc)
Eksempel, hente alle stasjoner i vår valgte region:
s = c.service.getStationsProperties(,)
ss = [x for x in s if x.toYear==0 and 58.0 < x.latDec < 60.5 and 5.1 <
x.lonDec < 11.1]
for x in ss:
print(x.stnr, '\t', x.name)
Twitter-listener-kode: class MyListener(StreamListener):
def on_data(self, data):
fields = ('created_at', 'text', 'coordinates')
try:
tweet=json.loads(data)
if tweet['coordinates']:
client = MongoClient()
db = client.espen
d = {k:v for k, v in tweet.items() if k in fields}
db.tweets.insert(d)
except BaseException as e:
print("Error on_data: %s" % str(e))
return True
def on_error(self, status):
print(status)
return True
twitter_stream = Stream(auth, MyListener()) twitter_stream.filter(locations=[5.1,58.0,11.1,60.5])