2013年9月20日金曜日

(Pythonメモ)Google Financeのニュースヘッドラインを取得するPythonコード

株価とニュースの関係を分析してみたいなぁと思って、Google Finance (US)を取り込むコードを書いた。

getHeadkineという関数に、対象となる会社のticker、その会社の属するmarket(NASDAQなど)、検索対象となる開始日と終了日をstartとendというパラメータで指定すると、keyが日付、valueがヘッドラインの辞書を返す。

from __future__ import unicode_literals
import urllib2
import urllib
import re
from datetime import datetime,timedelta
import nltk

def getHeadline(ticker,market,start,end):
    query = urllib2.quote(ticker+':'+market)
    base = 'https://www.google.com/finance/company_news?q='
    url = base + query + '&startdate='+ start +'&enddate=' + end + '&start=0&num=10000'
    print url
    html = urllib.urlopen(url).read()
    raw = nltk.clean_html(html)
    raw = unicode(raw,errors='ignore')
    data = raw.split('\n')
    data =  data[60:-1]
    while u' ' in data: data.remove(u' ')

    monthDict = {'Jan':'01','Feb':'02','Mar':'03','Apr':'04','May':'05','Jun':'06','Jul':'07','Aug':'08','Sep':'09','Oct':'10','Nov':'11','Dec':'12'}

    news={}

    for i in range(0,len(data),1):

        t = re.match(r'[\s\w0-9/\.,:;\(\)]+\-\s([0-9\w\s]+)\sago\s*',data[i])
        o = re.match(r'[\s\w0-9/\.,:;\(\)]+\-\s(\w+)\s([0-9]+),\s(201[0-3])\s*',data[i])
        if t:
            hours =  int(t.group(1).split(' ')[0])
            delta = timedelta(hours=hours)
            gmt = timedelta(hours=7)
            d = datetime.today() - delta + gmt
            year = str(d.year)

            if d.month <10:
                month = '0'+str(d.month)
            else:
                month = str(d.month)
            if d.day < 10:
                day = '0'+str(d.day)
            else:
                day = str(d.day)

            key = year+'_'+month+'_'+day

            if key in news.keys():
                news[key].append(data[i-1])
            else:
                news[key]=[]
                news[key].append(data[i-1])

        if o:
            #Month
            m = o.group(1)
            month = monthDict[m]
            day = o.group(2)
            year = o.group(3)

            key = year+'_'+month+'_'+day

            if key in news.keys():
                news[key].append(data[i-1])
            else:
                news[key]=[]
                news[key].append(data[i-1])

    return news

#Example : getHeadline
#Output is a dictionary like this: { date : [headline1, headline2,.....], date:[headline3],......}
#the keys (time) is not ordered.Also, time is GMT (I checked the publish time in RSS xml).
#The function requires 'ticker', 'market name', 'start date'(YYYY-MM-DD) and 'end date' (YYYY-MM-DD)
print getHeadline('AAPL','NASDAQ','2012-09-01','2013-09-15')

2013年9月1日日曜日

秋学期 第1モジュール ここまでの内容

今週末はLabor Dayで3連休です。


少しゆっくりできるかと思いきや・・・


宿題の雨あられですので、気が抜けない状況です。


ここまでの学校の様子を残しておきます。


秋学期は8月中旬から12月中旬までの4か月間で、Analytics programは2か月ごとのモジュールに分かれています。最初のモジュールは、


  1. Business Communication for Analytics 【週2】
  2. Linear Regression 【週2】
  3. Data Acquisition (DA) 【週1】
  4. Exploratory Data Analysis (EDA) 【週1】
の4つの授業があります。これらに加えて、週1回のゲストスピーカーのプレゼンに出席するということになっています。


Business Communication for Analytics

International Studentにはもっとも過酷な授業です。授業が始まる前に、Program Directorから、英語をもっと練習しないとついていけないだろうと警告されたくらいです(単に、私の英語力不足ですが)。

この授業では、「技術的な内容を、それを知らない人に伝える」ということが大きなテーマになっています。なぜなら、分析は、専門でない人にとって難しく見えてしまいます。しかし、多くの場合、専門でない人が意思決定者であり、お客さんです。そのため、いかにインサイトをわかりやすく腹落ちさせるかというところが、非常に重要になるためです。

もちろん、Data Visualizationなど見た目が華やかでファンシーなコミュニケーション手法もありますが、この授業では、Writing, Speakingがフォーカスになっています。


Linear Regression

Boot Campの統計の授業の続きというのが実際の位置づけです。授業の名の通り、ひたすら、回帰分析を勉強しています。ちなみに使用言語はRです。


ここまでは、最小二乗法による回帰分析とその特性、モデルの診断の仕方を学びました。また、ロバスト回帰などもトピックに上がっています。私にとっては、学部のときには勉強しなかった、Cook's Distanceや、Leverageなんかも勉強できて、ハッピーです。


Data Acquisition (DA)

先生は実務で活躍されている方で、内容は実践的です。扱う内容は、分析ではなく、データ取得、クレンジングなどのデータ分析をする手前までのすべてということになります。使用言語はPython。


ここまでのところ、正規表現、JSONファイルとCSVファイル(マトリックス形式のデータセット)の円コーディング・デコーディングなどを扱っています。今後は、ソーシャルメディアのAPIなどにも触れる模様です。


Exploratory Data Analysis(EDA)

先生はシリコンバレーで仕事をしている実務家の方で、かなり実践的です。ちなみに、使用言語は、PythonとRです。
Data Acquisitionと少しかぶりますが、こちらは、集計、可視化に重きが置かれています。


今年、出願を検討されている方がいらっしゃいましたら、もっと詳しくお伝えできますので、ぜひご連絡ください!

ではでは、宿題に戻ります・・・