Rで株価データ取得

Rで株価データの取得のメモ
quantmodは素晴らしい!!

DOW

DowはYahoo.comから取得します。srcに”yahoo”をセット

library(quantmod)

# DOW
dow<-new.env()
dow.name<-getSymbols("DOW",env=dow,src="yahoo", from='2016-01-01',to='2016-06-30')
dow.prices<-dow[[dow.name]]
names(dow.prices)<-c("Open","High","Low","Close","Volume","Adjusted")

デフォルトの名前では使いづらいので、必要なデータを別のデータフレームに入れて名前をつけます。

> dow.prices["2016-02-01::2016-03-01"]
            Open  High   Low Close   Volume Adjusted
2016-02-01 41.58 42.77 41.22 42.58  8717200 41.44578
2016-02-02 44.14 45.18 42.82 45.03 16411000 43.83052
2016-02-03 45.73 47.05 45.70 46.74 16750300 45.49497
2016-02-04 46.93 47.64 46.73 47.39 13177300 46.12765
2016-02-05 47.48 47.50 46.41 46.69  8030600 45.44630
2016-02-08 46.46 46.94 45.20 46.23 13511300 44.99855
2016-02-09 45.71 47.20 45.71 46.60  8201200 45.35870
..

取得するデータはxts型ですので扱いやすいです

日本株

日本株はsrcにyahoojとYahooJapanを指定するだけです

jpn<-new.env()
jpn.name<-getSymbols("6758",env=jpn,src="yahooj", from='2016-01-01',to='2016-06-30')
jpn.prices<-jpn[[jpn.name]]
names(jpn.prices)<-c("Open","High","Low","Close","Volume","Adjusted")

> jpn.prices["2016-02-01::2016-03-01"]
             Open   High    Low  Close   Volume Adjusted
2016-02-01 2923.0 2924.0 2700.0 2836.0 32250000   2836.0
2016-02-02 2779.0 2812.0 2662.0 2692.5 18567800   2692.5
2016-02-03 2626.0 2654.5 2610.0 2623.5 15916000   2623.5
2016-02-04 2600.0 2657.0 2600.0 2620.5 10369200   2620.5
2016-02-05 2592.0 2638.5 2580.5 2615.0  8591500   2615.0
2016-02-08 2560.0 2592.0 2515.0 2569.0 10796100   2569.0
2016-02-09 2424.0 2444.0 2356.5 2388.5 13666800   2388.5

追記 19.06.18


上記のやり方ではどうやらエラーが出るようになりました。

> names(jpn.prices)<-c("Open","High","Low","Close","Volume","Adj")
 names(jpn.prices) <- c("Open", "High", "Low", "Close", "Volume",  でエラー: 
   NULL に対して属性を設定しようとしました 

取得方法がどうやら変わったのでしょうか?
下記のやり方でとれるようです

> library(quantmod)
> env<-getSymbols("9434.T", src="yahooj", from="2018-12-19",auto.assign=F)
> jpn<-as.data.frame(env)
> names(jpn)<-c("Open","High","Low","Close","Volume","Adjusted")
> head(jpn)
           Open High  Low Close    Volume Adjusted
2018-12-19 1463 1464 1282  1282 271497800     1282
2018-12-20 1183 1310 1176  1296 106361400     1296
2018-12-21 1279 1375 1275  1316  65040600     1316
2018-12-25 1307 1320 1240  1271  36914400     1271
2018-12-26 1300 1315 1288  1304  12116500     1304
2018-12-27 1350 1356 1325  1354  19368800     1354

CPLUS_INCLUDE_PATH

Cabochaをローカルにインストールさいのメモ

共用環境だと何かライブラリをインストールする際にも自分のローカルにインストールする必要があります。その際にハマったのでメモ

mecab

cabochaはMecabを使用しますので予めインストールしておきます。

CRF++

まず、ライブラリをインストールします。こちらから最新版をダウンロードします。現在はCRF++-0.58が最新版なのでこちらをダウンロードします。その後インストールします

$ tar xzvfp CRF++-0.58.tar.gz
$ cd CRF++-0.58
$ ./configure --prefix=~/local
$ make
$ make install

環境変数

環境変数を設定しておきます。これを設定しておかないとcabochaのコンパイル時に下記エラーが出ます。

make[1]: Entering directory `~/work/cabocha-0.69'
Making all in src
make[2]: Entering directory `~/work/cabocha-0.69/src'
/bin/sh ../libtool  --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I. -I.. -DCABOCHA_DEFAULT_POSSET="\"IPA"\" -DCABOCHA_DEFAULT_CHARSET="\"EUC-JP"\" -DMODEL_VERSION=102  -DCABOCHA_DEFAULT_RC="\"/work/s1630401/local/etc/cabocharc\""    -O3 -Wno-deprecated -Wall -c -o chunk_learner.lo chunk_learner.cpp
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I.. -DCABOCHA_DEFAULT_POSSET=\"IPA\" -DCABOCHA_DEFAULT_CHARSET=\"EUC-JP\" -DMODEL_VERSION=102 -DCABOCHA_DEFAULT_RC=\"/work/s1630401/local/etc/cabocharc\" -O3 -Wno-deprecated -Wall -c chunk_learner.cpp  -fPIC -DPIC -o .libs/chunk_learner.o
chunk_learner.cpp:6:19: error: crfpp.h: No such file or directory
In file included from chunk_learner.cpp:13:
chunker.h:24: error: ISO C++ forbids declaration of 'crfpp_model_t' with no type
chunker.h:24: error: expected ';' before '*' token
In file included from chunk_learner.cpp:15:
ne.h:27: error: ISO C++ forbids declaration of 'crfpp_model_t' with no type
ne.h:27: error: expected ';' before '*' token
chunk_learner.cpp: In function 'bool CaboCha::::runChunkingTrainingWithCRFPP(CaboCha::ParserType, const char*, const char*, const char*, CaboCha::CharsetType, CaboCha::PossetType, double, int)':
chunk_learner.cpp:171: error: 'crfpp_learn' was not declared in this scope
make[2]: *** [chunk_learner.lo] Error 1
make[2]: Leaving directory `~/work/cabocha-0.69/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `~/work/cabocha-0.69'
make: *** [all] Error 2

環境変数

$ export C_INCLUDE_PATH=~/local/include:$C_INCLUDE_PATH
$ export CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH
$ export LD_LIBRARY_PATH=~/local/lib:$LD_LIBRRY_PATH
$ export PATH=~/local/bin:$PATH

cabocha

次にcabochaをインストールします。こちらから同様に最新版をダウンロードします。現在では0.69です。

$ tar zxvfp cabocha-0.69.tar.gz
$ cd cabocha-0.69
$ ./configure --prefix=~/local 
$ make
$ make install

環境変数は.bashrcなどに入れておくと面倒がなくていいです

shinyでデバッグプリントを出す方法

すぐ忘れるのでメモ

shinyとは

Rの軽量Webフレームワークshiny。Rで計算した結果をWebで簡単に表現できるので非常に便利です。

RStudioを使ってデバッグすればいいのでしょうが、サーバサイドでいきなりコーディングし、訳の分からないエラーが発生した時には非常に困ります。
簡単にデバッグする方法は以下のとおりです

ブラウザ

Chromeのメニューから「その他のツール」ー「デベロッパーツール」を選択します。
そのメニューからConsoleを表示させると、Javascriptでサーバ側のエラーを表示してくれます。
これは非常に便利。

デバッグプリント

ソースコード上にデバッグプリントを埋め込んで変数の内容を確認するには

cat(file=stderr(),"debug=",value)

こんな感じでserver.R上に記述します。これで /var/log/shiny-server以下のファイルに出力されます。

まとめ

Rはスクリプト言語なので、エラーになる直前までは普通に実行してくれますので、エラーとなる直前にデバッグプリントを仕込むと良いでしょう

激安$3以下のebayで買ったArduino nanoを動かす

激安ArduinoNanoをなんとか動かしたメモ

ebayで最近よく物を買っています。Arudinoなんかですと国内で買う価格の半額どころか10分の1くらいの値段で手に入ります。

しかし、互換チップなどを使っているのでドライバーを入れたり色々面倒なことが起きたりします。

今回、購入したこちらのArudino uno ですが一筋縄ではいきませんでしたのでその対応のメモです。

環境

PC: Mac OS X 10.11
IDE: Arduino IDE 1.6.11

ch340gドライバ

こちらのUSBドライバは格安の互換品らしく、ドライバーを別途入れてやらないとPCからは認識できません。この辺りの手順は色々なところに書かれていますので、このあたりを参考にドライバー追加します。

IDE

ドライバを追加し、Arduino Nano をPCに接続してやります。自分の場合はMACなのでポートはArduinoIDEからは

/dev/cu.wchusbserial1420

というデバイスで認識されますので、ポートをこちらに接続してやります。

Blinkプログラムの書き込み

USBを接続し、ファイルメニューからスケッチの例ー01.BasicーBlinkを開いてやります。
ツールのボードをArduino Nano にし、プロセッサをATmega328、ポートは先ほどのポートをセットします。
そのまま、マイコンボードに書き込むを実行すると

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00

このエラー。。。。。色々調べたのですが、ケーブルを入れさししろとか、リセットを押しながらケーブルを入れるとか。。。全く改善されません。

よーく見るとRXやLのLEDが電源をONにしても光っていないことに気づきました。

ブートローダを書き込む

どうやらブートローダが書き込まれていないのではという目星をつけて色々調べたところ、こちらにまさに解決方法が!

手順は以下に示しておきます

必要なもの

Arduino UNO
オスーメスのジャンパーピン

手順

STEP 1

  • Arduino UNOをPCに接続
  • ツールメニューのシリアルポートをArduino UNOのポートに
  • ツールメニューのボードをArduino UNOに
  • ファイルメニューのスケッチの例からArduino ISPを開く
  • マイコンボードに書き込むを実行
  • USBケーブルをはずしてPCからはずす

STEP 2

  • Arduino Nanoのジャンパーピン1からUNOのD12へ接続
  • Arduino Nanoのジャンパーピン2からUNOの5Vへ接続
  • Arduino Nanoのジャンパーピン3からUNOのD13へ接続
  • Arduino Nanoのジャンパーピン4からUNOのD11へ接続
  • Arduino Nanoのジャンパーピン5からUNOのD10へ接続
  • Arduino Nanoのジャンパーピン6からUNOのGNDへ接続

STEP 3

  • Arduino UNOをPCに接続
  • ツールメニューのシリアルポートをArduino UNOのポートに
  • ツールメニューのボードをArduino Nanoに
  • ツールメニューのプロセッサをATmega328に
  • ツールメニューの書き込み装置をArduino as ISPへ
  • ツールメニューのブートローダ書き込みを実行

これでブートローダが書き込まれて無事Arduino Nano のLのLEDが光ります。

STEP 4


ケーブルを全て外してArduino Nanoの動作確認をします

  • Arduino NanoをPCに接続
  • ツールメニューのシリアルポートをArduino Nanoのポートに
  • ツールメニューのボードをArduino Nanoに
  • ツールメニューのプロセッサをATmega328に
  • ツールメニューの書き込み装置をAVRISP mkIIに戻しておく(不要かも)
  • ファイルメニューからスケッチの例ー01.BasicーBlinkを開く
  • マイコンボードに書き込むを実行

これで無事にLチカができました

bottleでMVC

pythonでデータ解析をしていると、その結果をヴィジュアル的に見せたくなってくる時があります。
PythonのWebフレームワークは様々ありますが、最もシンプルなbottleで作成するのが一番簡単です。

こちらのサイトで、BottleをMVCフレームワーク的に作成されているサンプルがありましたのでちょっといじってみました。その際、ちょっとハマったのでのメモです。

環境

  • OS: ubuntu14.04
  • python: 2.7.6
  • MySQL version: 5.1.63
  • MySQL encode: shift_jis
  • nginx 1.4.6

設定

nginx

http://server/pythonでアクセスできるようにnginxの設定ファイルを修正します

/etc/nginx/site-availables

server {
..

        location /python {
                rewrite ^/python/(.*)$ /$1 break;
                proxy_pass http://localhost:8081;
                proxy_redirect http://localhost:8081/ $scheme://$host/python/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
                proxy_read_timeout 20d;
        }
..

スクリプト

起動スクリプトを作成します

start.sh

gunicorn -b 127.0.0.1:8081 -c gunicorn.conf.py -w 1 index:app -D --reload  

gunicorn.conf.py

proc_name = "gunicorn"

bind = 'unix:/tmp/{0}.sock'.format(proc_name)
backlog = 2048


workers = 1
worker_class = 'sync'
worker_connections = 1000
timeout = 30
keepalive = 2


debug = False
spew = False

daemon = True
pidfile = "/tmp/gunicorn.pid"
umask = 0
user = None
group = None
tmp_upload_dir = None

errorlog = '/var/log/gunicorn/error.log'
loglevel = 'debug'
accesslog = '/var/log/gunicorn/access.log'


def post_fork(server, worker):
    server.log.info("Worker spawned (pid: %s)", worker.pid)

def pre_fork(server, worker):
    pass

def pre_exec(server):
    server.log.info("Forked child, re-executing.")

def when_ready(server):
    server.log.info("Server is ready. Spawning workers")

def worker_int(worker):
    worker.log.info("worker received INT or QUIT signal")

    ## get traceback info
    import threading, sys, traceback
    id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
    code = []
    for threadId, stack in sys._current_frames().items():
        code.append("\n# Thread: %s(%d)" % (id2name.get(threadId,""),
            threadId))
        for filename, lineno, name, line in traceback.extract_stack(stack):
            code.append('File: "%s", line %d, in %s' % (filename,
                lineno, name))
            if line:
                code.append("  %s" % (line.strip()))
    worker.log.debug("\n".join(code))

def worker_abort(worker):
    worker.log.info("worker received SIGABRT signal")

文字化け

上記環境で参考サイトを元に作成すると、DBの文字列を表示する際に文字化けしてしまいます。この対処法は散々悩んだ挙句この修正で行けました

app/models/db.py

dbhandle = MySQLdb.connect(
  host = config.get('live_db', 'host'),
  port = config.getint("live_db","port"), 
  user = config.get('live_db', 'user'),
  passwd = config.get('live_db', 'password'),
  db = config.get('live_db', 'database'),
  charset = "sjis",  # これを追加
  use_unicode=1
)

ESP-WROOM-02とArduino unoでWifi

Arduino UnoとWifiモジュールのESP-WROOM-02 DIP化キットをつないで通信をしてみます。

ESP-WROOM-02自体でもArduinoとしてプログラムを書き込んで使用できるようですが、ESP-WROOM-02に繋ぐためのUSBシリアル変換インターフェースを持っていないのでとりあえずArduinoと接続して使えるかどうか確認します。

使用する機器

回路

ArduinoとESP-WROOM-02を繋ぐ回路が必要なのですが、このDIP化キットとArduinoUnoをつないだ回路をWebで発見することが出来ず苦労しました。
このあたりこのあたり、あとこのページを参考にさせていただいて作成したのがこれ。

DSC_0250

プログラム

参考にしたサイトからこれを作成しました。

//https://ics.media/entry/10457/3
//http://okiraku-camera.tokyo/blog/?p=2873
/*
  Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)

 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo and Micro support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example

 This example code is in the public domain.

 */
#include 

SoftwareSerial mySerial(11, 10); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(115200);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    //Serial.println("mySerial avairable");
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    //Serial.println("Serial avairable");
    mySerial.write(Serial.read());
  }
}

実行

Arduino IDEからツール、シリアルモニタを開いて確認します

Goodnight moon!
Hello, world?

ERROR
HELO  # <- 入力

ERROR
AT     # <- 入力


OK
HELO   # <- 入力

ERROS

入力した文字がそのままエコーされています

まとめ

プログラムを実行しても Hello, Worldが返ってこなかったりし、いろいろ回路をいじったりしましたが、なぜこれで動くのかちょっとわかりませんが動くのでこれでよしとします。次は実際にWifi通信してみることにします

pythonのmatplotlibでcandlestickチャート

MySQLからデータを取得し、Pythonのmatplotlibでローソク足を描画します。

環境

  • OS:MacOS10.11
  • python:2.7.12
  • MySQL 5.6

テーブル

MySQLのテーブル形式は以下のとおり。日足でも週足でもなんでも構いません。
データベース名はdbnameとしています

create table price_table(
  date datetime not null,
  code varchar(8) not null,
  open double precision null,
  high double precision null,
  low  double precision null,
  close double precision null,
  volume double precision null
)
;
create unique index idx_price on price(date,code)
;

休日考慮

シンプルにローソク足だけ表示します
休日がある場合には間を空けます

#!/bin/env python
# coding:utf-8

import matplotlib.pyplot as plt
from matplotlib.finance import candlestick_ohlc
import time
import MySQLdb

connection = MySQLdb.connect(host="localhost",db="dbname",user="root",passwd="")
cursor = connection.cursor()

code = "6758"
date='2016-04-01'
cursor.execute("select date,open,high,low,close,volume from price_table where code=%s and date>=%s",[code,date])
result = cursor.fetchall()

ohlc=[]
fdate=[]  # float
ddate=[]  # datetime
for row in result:
  tmp=time.mktime(row[0].timetuple())
  ohlc.append((tmp,row[1],row[2],row[3],row[4],row[5]))  # unix time
  ddate.append(row[0])
  fdate.append(tmp)
cursor.close()
connection.close()


# graph上のfloat型の日付と、表示文字列を紐付けている
plt.xticks(
	fdate[::5],
	[x.strftime('%Y-%m-%d') for x in ddate][::5]
)


ax = plt.subplot()

candlestick_ohlc(ax,ohlc)

plt.xlabel('Date')
plt.ylabel('Price')
plt.title("title")
plt.legend()
plt.show()

休日考慮しない

シンプルにローソク足だけ表示します
休日を無視して詰めて描画します。テクニカルを重ね合わせる場合はこちらのほうが都合がいいです

#!/bin/env python
# coding:utf-8

import matplotlib.pyplot as plt
from matplotlib.finance import candlestick_ohlc
import time
import MySQLdb

connection = MySQLdb.connect(host="localhost",db="dbname",user="root",passwd="")
cursor = connection.cursor()

code = "6758"
date='2016-04-01'
cursor.execute("select date,open,high,low,close,volume from price_table where code=%s and date>=%s",[code,date])
result = cursor.fetchall()

ohlc=[]
fdate=[]  # float
ddate=[]  # datetime
adr=1
for row in result:
  tmp=adr
  ohlc.append((adr,row[1],row[2],row[3],row[4],row[5]))
  ddate.append(row[0])
  fdate.append(adr)
  adr=adr+1
cursor.close()
connection.close()


# graph上のfloat型の日付と、表示文字列を紐付けている
plt.xticks(
	fdate[::5],
	[x.strftime('%Y-%m-%d') for x in ddate][::5]
)


ax = plt.subplot()

candlestick_ohlc(ax,ohlc)

plt.xlabel('Date')
plt.ylabel('Price')
plt.title("title")
plt.legend()
plt.show()

これでとりあえずチャートが表示されます

Rのh2oでエラー対応法

H2Oパッケージを触っていてエラーが出たのでメモ

環境

  • ubuntu14.04
  • R-3.3.1
  • h2o-2.0.1

インストール

まずここを参考にインストールします

cmake

wget https://cmake.org/files/v3.6/cmake-3.6.1.tar.gz
tar zxvfp cmake-3.6.1.tar.gz 
cd cmake-3.6.1
./configure  
make
make install

h2o

wget https://github.com/h2o/h2o/archive/v2.0.1.tar.gz
tar zxvfp v2.0.1.tar.gz 
cd h2o-2.0.1/
cmake .
make
make install

設定

mkdir /usr/local/etc/h2o/
cd /usr/local/etc/h2o/
openssl genrsa 2048 > cert.key
openssl req -new -key cert.key  > cert.csr
openssl x509 -days 3650 -req -signkey cert.key < cert.csr > cert.pem
touch /usr/local/etc/h2o/error-log

起動

sudo /usr/local/bin/h2o -m daemon -c /usr/local/etc/h2o/h2o.conf

サンプル

ここのサンプルを実行してみます

library("h2o")
localH2O <- h2o.init(ip = "localhost", port = 54321, startH2O = TRUE, nthreads=-1)
cfData<-h2o.importFile(localH2O,path="https://raw.githubusercontent.com/ozt-ca/tjo.hatenablog.samples/master/r_samples/public_lib/jp/conflict_sample.txt")

ここでエラー発生

Error: is.character(key) && length(key) == 1L && !is.na(key) is not TRUE

どうやら、h2oの仕様が変わったようです。こちらを参考に修正します

cfData<-h2o.importFile(path="https://raw.githubusercontent.com/ozt-ca/tjo.hatenablog.samples/master/r_samples/public_lib/jp/conflict_sample.txt")
res.err.dl<-rep(0,100)
numlist<-sample(3000,100,replace=F)
for(i in 1:100){
 cf.train <- cfData[-numlist[i],]
 cf.test <- cfData[numlist[i],]
 res.dl <- h2o.deeplearning(x = 1:7, y = 8, data = cf.train, activation = "Tanh",hidden=rep(20,2))
 pred.dl <- h2o.predict(object=res.dl,newdata=cf.test[,-8])

 pred.dl.df <- as.data.frame(pred.dl)
 test.dl.df <- as.data.frame(cf.test)

 res.err.dl[i] <- ifelse(as.character(pred.dl.df[1,1])==as.character(test.dl.df[1,8]),0,1)
 }

またまたエラー

Error in h2o.deeplearning(x = 1:7, y = 8, data = cf.train, activation = "Tanh",  : 
  unused argument (data = cf.train)

仕様をみると、また変わっていました。以下のように修正します

 res.dl <- h2o.deeplearning(x = 1:7, y = 8, training_frame = cf.train, activation = "Tanh",hidden=rep(20,2))

続けます

sum(res.err.dl)

これでうまく実行できました

終了

sudo kill -TERM `cat /usr/local/etc/h2o/pid-file`

仕様がよく変わるので、メジャーバージョンアップ時は要注意です

Word Cloudを使って見る

WordCloudなるライブラリがあるので使ってみました。
自分の環境ではそのままではちょっとうまく動かなかったのでメモです。

こちらを参考にしました。

環境

– MacOS10.11
– python 2.7.12
– mecab 0.996

インストール

brew install python
brew install mecab
brew install mecab-ipadic


git clone https://github.com/amueller/word_cloud
cd word_cloud 
pip install -r requirements.txt
python setup.py install
pip install beautifulsoup4
pip install requests

エラー

こちらのサンプルをそのまま実行するとエラーが出ます

/usr/local/lib/python2.7/site-packages/bs4/__init__.py:181: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

The code that caused this warning is on line 53 of the file word_cloud.py. To get rid of this warning, change code that looks like this:

 BeautifulSoup([your markup])

to this:

 BeautifulSoup([your markup], "html.parser")

  markup_type=markup_type))
Traceback (most recent call last):
  File "word_cloud.py", line 53, in 
    wordlist = get_wordlist_from_QiitaURL(url)
  File "word_cloud.py", line 30, in get_wordlist_from_QiitaURL
    return mecab_analysis(text)
  File "word_cloud.py", line 10, in mecab_analysis
    t = mc.Tagger('-Ochasen -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/mecab-ipadic-neologd/')
  File "/usr/local/lib/python2.7/site-packages/MeCab.py", line 307, in __init__
    this = _MeCab.new_Tagger(*args)
RuntimeError

HTMLパーサーを明示的に入れます

    soup = BeautifulSoup(res.text,"html.parser")

そのまま実行するとまたまたエラー

Traceback (most recent call last):
  File "word_cloud.py", line 59, in 
    create_wordcloud(" ".join(wordlist).decode('utf-8'))
  File "word_cloud.py", line 50, in create_wordcloud
    stopwords=set(stop_words)).generate(text)
  File "/usr/local/lib/python2.7/site-packages/wordcloud-1.2.1-py2.7-macosx-10.11-x86_64.egg/wordcloud/wordcloud.py", line 463, in generate
    return self.generate_from_text(text)
  File "/usr/local/lib/python2.7/site-packages/wordcloud-1.2.1-py2.7-macosx-10.11-x86_64.egg/wordcloud/wordcloud.py", line 448, in generate_from_text
    words = self.process_text(text)
  File "/usr/local/lib/python2.7/site-packages/wordcloud-1.2.1-py2.7-macosx-10.11-x86_64.egg/wordcloud/wordcloud.py", line 391, in process_text
    self.stopwords_lower_ = set(map(str.lower, self.stopwords))
TypeError: descriptor 'lower' requires a 'str' object but received a 'unicode'

どうもUnicodeがらみのエラーです。stop_wordsのUnicode変換がうまくいっていないようなので普通の文字列にします

コード修正

自分の環境に合わせていじります

#!/bin/env python
# coding:utf-8
#%matplotlib inline
import urllib2
from bs4 import BeautifulSoup

import matplotlib.pyplot as plt
from wordcloud import WordCloud
from bs4 import BeautifulSoup
import requests
import MeCab as mc



def mecab_analysis(text):
    t = mc.Tagger('-Ochasen -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/')
    enc_text = text.encode('utf-8')
    node = t.parseToNode(enc_text)
    output = []
    while(node):
        if node.surface != "":  # ヘッダとフッタを除外
            word_type = node.feature.split(",")[0]
            if word_type in ["形容詞", "動詞","名詞", "副詞"]:
                output.append(node.surface)
        node = node.next
        if node is None:
            break
    return output


def get_wordlist_from_QiitaURL(url):
    res = requests.get(url)
    soup = BeautifulSoup(res.text,"html.parser")

    text = soup.body.section.get_text().replace('\n','').replace('\t','')
    return mecab_analysis(text)

def create_wordcloud(text):

    # 環境に合わせてフォントのパスを指定する。
    #fpath = "/System/Library/Fonts/HelveticaNeue-UltraLight.otf"
    #fpath = "/Library/Fonts/ヒラギノ角ゴ Pro W3.otf"
    fpath = "/Library/Fonts/Osaka.ttf"

    # ストップワードの設定
    #stop_words = [ u'てる', u'いる', u'なる', u'れる', u'する', u'ある', u'こと
', u'これ', u'さん', u'して', u'くれる', u'やる', u'くださる', u'そう', u'せる', u'した',  u'思う',  u'それ', u'ここ', u'ちゃん', u'くん', u'', u'て',u'に',u'を
',u'は',u'の', u'が', u'と', u'た', u'し', u'で', u'ない', u'も', u'な', u'い', u'か', u'ので', u'よう', u'']
    stop_words = [ 'てる', 'いる', 'なる', 'れる', 'する', 'ある', 'こと', 'これ
', 'さん', 'して', 'くれる', 'やる', 'くださる', 'そう', 'せる', 'した',  '思う',  'それ', 'ここ', 'ちゃん', 'くん', '', 'て','に','を','は','の', 'が', 'と', 'た', 'し', 'で', 'ない', 'も', 'な', 'い', 'か', 'ので', 'よう', '']

    wordcloud = WordCloud(background_color="white",font_path=fpath, width=900, height=500, \
                          stopwords=set(stop_words)).generate(text)

    plt.figure(figsize=(15,12))
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()

url = "http://qiita.com/t_saeko/items/2b475b8657c826abc114"
wordlist = get_wordlist_from_QiitaURL(url)
create_wordcloud(" ".join(wordlist).decode('utf-8'))

実行

python word_cloud.py

これで画像が表示されます

CentOS5にbzip2-1.0.6をインストール

未だCentOS5を使っているといろいろと不都合が生じてきます。まず、最新のアプリケーションを使おうとすると、デフォルトで入っているライブラリ群が古く全くインストールできません。

今回はCentOS5.11にbzip2-1.0.6をインストールしてみます

ダウンロード

$ cd /usr/local/src
$ wget http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
$ tar xzvfp  bzip2-1.0.6.tar.gz
$ cd bzip2-1.0.6

コンパイル

シェアードライブラリも同時にコンパイルします
まずは本体

$ make
# make install

次にシェアードライブラリ

$ make -f Makefile-libbz2_so 
$ make
gcc -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.6 blocksort.o huffman.o crctable.o randtable.o compress.o decompress.o bzlib.o
/usr/bin/ld: blocksort.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
blocksort.o: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました
make: *** [all] エラー 1

ここでエラーが

解決方法

どうもfPICをつけてコンパイルしないとダメなようです
本体側も修正、Makefileを修正します

CFLAGS=-Wall -Winline -O2 -g $(BIGFILES) -fPIC  # -fPICを追加
CXXFLAGS=-fPIC   # 行追加

コンパイル

$ make clean
$ make
# make install

次にシェアードライブラリ。Makefile-libbz2_soを修正

CXXFLAGS=-fPIC # 行追加

コンパイル

$ make -f Makefile-libbz2_so 
# mv libbz2.so.1.0* /usr/local/lib