田舎プログラマーの備忘録

田舎出身のWEBプログラマーが書く備忘録です。

【pandas入門】そろそろpandas使いたいPythonユーザーの備忘録

はじめに

はじめましての方ははじめまして、お久しぶりです。 だいぶ期間が空いてしまいましたが、久しぶりに記事を書いていこうと思います。 Pythonを4年近くやっていまだにpandasを触っていなかったので、Excelの代わりにPythonを使うべく勉強した内容をまとめていこうと思います。

対象者

やること

  • pandasの文法とつらつらと書いていく

やらないこと

→ 何も知らない場合は有料ですが、udemyやdotinstall等で勉強するとよいかと思います。

お金をかけたくない場合は、公式チュートリアルを行えばよいかと思います。

Python チュートリアル — Python 3.6.5 ドキュメント

  • pandasとは

→ この辺をみてください

データ分析のライブラリ!Pandasとは【初心者向け】 | TechAcademyマガジン

サンプルコード

github.com

記載している内容

名前 役割
head 引数で指定した行数を取得
size 行数を返す
sum 合計を取得、dataframeの場合は各列ごとの合計が取得される
mean 平均値を取得する、dataframeの場合は各列ごとの平均が取得される
max 最大値を取得する
min 最小値を取得する
describe 要約統計量を取得する


メモ

そういえば、jupyterのマークダウンで書いた表を左寄せできないのだろうか🧐

DockerでJupyterLab x mysqlの環境を作った話

最近pandasの勉強したいと思い、その上で今はやりのDockerを使った環境を用意したかったので、とりあえず作ってみました。 現在絶賛書いているところですが、一旦区切りがついたのでこちらを使って公開しようと思います。

やったこと

dockerの構成

構成図

ソースを説明するまえに、今回作成したコンテナの構成をざっと図にまとめておきます。

※4/10現在は、コンテナは全部で3台使っています。

構成としては、jupyterコンテナに、DBとしてMySQL5.7がインストールされたコンテナ、データの永続化のためのvolumeコンテナを動作させています。 f:id:country-dev:20180410234610p:plain

ソースコード

現在開発中ではありますが、コードを公開しておきますので、興味がありましたら使用していただけると幸いです。 github.com

各containerの説明

各コンテナの詳しい説明を始めます。 コンテナの元として使用しているイメージの詳細な説明は時間の関係で今回割愛させていただきます。

jupyter container

  1. イメージ:jupyter/datascience-notebook
    scipyやpandas、numpyなどのよく使われるライブラリは大抵入ってるすごいイメージ Python3の他に、JuliaやRも使えるすぐれもの。

  2. 対応させたインタプリタRuby (2.3.1)
    仲間内で使う時に、Rubyエンジニアも一定数いるので、Rubyインタプリタもあとからインストールしました。

  3. あとでインストールしたライブラリ
    個人的にJupyterNotebookではなくJupyterLabを使いたかったので、別途インストールしました。

  4. Python

    • JupyterLab
    • PyMySQL

iruby、pry、cztopはrubyをJupyter上で使用するために必要なめ、別にインストール

  • Ruby
    • iruby
    • pry
    • cztop
    • Daru

mysql

1.イメージ:mysql:5.7

data volume

  1. イメージ:busybox

使用方法

起動

docker-compose up -d

停止

docker-compose stop 
※ docker-compose up で起動した場合は、Ctrl + c で停止できる

イメージの破棄

docker-compose rm

ほかのコマンドが気になる方は、公式のリファレンスを参考にしていただければと思います。 docker-compose コマンド概要 — Docker-docs-ja 1.11.0 ドキュメント

最後に

簡単ではありますが、今回作成したDockerの紹介をさせていただきました。 まだ詳しい設定などは把握できていない部分もあるので、調べて書き留めていければなと思っています。

Elasticsearch x kibana環境もdockerでできそうだからあとで挑戦してみようかな・・

MySQLのメンテをした話

前回は、PHPのセッション削除についての投稿をしました。 さて、今回はその後の話になります。

1. 初めに

前回お話した溜めに溜めたsessionをあらかた削除したはいいけど、容量がほとんど戻らないという事象が発生しました。 その対処を行ったのでメモを残しておこうと思います。



2. DBに何が起きていたのか

さて、DBに起きたか見ていきましょう。 原因は、テーブルのDELETEによるフラグメンテーションの増加です。

フラグメンテーションと聞いて、エンジニアだとピンとくるかたはいるのではないでしょうか? HDDなどで良くある虫食いの状態です。

InnoDBはMVCCと呼ばれる機構で、削除が行われてもどうも履歴のようなものを残しており、DELETEをしてもデータとしては残っているようです。 これはセッションを管理しているので、DELETEは頻繁に行なわれていると推測できますが、一度もOPTIMYZEなどで解消をしようとしたことはありませんでした。

そして断片がどんどん溜まり、ストレージの容量を食いつぶしている状態を作り出したということになります。

3. 問題を解決する

さて、そんな断片化ですが、以下の二つの方法で対処することができます。

OPTIMIZE TABLE [table name]
ALTER TABLE [table name] ENGINE=INNODB

4. 大量削除をするときに気をつけること

但し上記のやり方ではできない時があります。 特に「ストレージの残り容量」は気をつけて下さい。
特にALTER TABLEは、一度テーブルのコピーをとってから、テーブルの置き換えを行う関係で、削除対象分の容量がストレージに必要となってきます。
今回、私たちは削除対象がおよそ10GBあり残量が5Gほどだったため、ALTER TABLEを行うことができませんでした。
そのような時の対処方は、

  • 一度テーブルをDROPして削除し同じテーブルを新しく作成する

  • 同じ構造のDBを作成し、その後該当のテーブルを削除したあと、作成しておいたテーブル名を削除したテーブル名に変更する。

といった方法が挙げられます。

何はともあれ、一度テーブルを削除して作成するのが手っ取り早いです。

稼働しているサービスであればダウンタイムは少ないほうがいいと思うので、あらかじめ用意したテーブルに切り替えるのが、一番ダウンタイムが少ない方法かと思います。




今回調べるにあたって参考サイト


漢(オトコ)のコンピュータ道: 大人のためのInnoDBテーブルとの正しい付き合い方。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.5.37 SHOW TABLE STATUS 構文

MySQLでDBとテーブルのサイズを確認するSQL - Qiita



そろそろMySQL5.7もまじめに使っていきたいな・・(´・ω・`)

sessionのガベージコレクションについて[PHP]

これは、sessionが2年間消さない設定にされていたのを、1週間にしたとき気になって調べたことのまとめです。

ざっくり起きた内容まとめ

  • RDSの容量が無料枠の20Gを食いつぶそうとしていた
  • 原因は過去にsessionデータをdatabaseに保存しているのを知りながら、有効期限を2年にしたから
  • 8Gほどに上るデータを削除しなければいけない

まずはCodeIgniterの設定を見てみる

$config['sess_expiration'] = 60*60*24*30*12*2;

( ^ω^ )どうしてこうなったし・・

およそ2年データを保持するという設定が書かれていました。

(なら、DBにわざわざ持たせるなという話ですが・・・)

CodeIgniterのコードを読んでみると、sess_expirationでは後述のmax_lifetimeしか設定できなさそうなので、これを1週間とかにするのはなんだか嫌な予感がすると思い、PHPの挙動を調べてみることにしました。

※実際、30日にしてみると一気にsessionが消えたので、一斉削除する処理が走っていると予想されます。

PHPのリファレンスを見てみる

1.必要な設定情報

注目するべきは以下の項目です。

config名 デフォルト値 ドキュメントから抜粋
session.gc_probability 1 session.gc_probabilityと session.gc_divisorの組み合わせでgcガーベッジコレクション)ルーチンの始動を制御します。
session.gc_divisor 100 session.gc_divisorと session.gc_probabilityの組み合わせで すべてのセッションの初期化過程でgc(ガーベッジコネクション)プロセス も始動する確率を制御します。
session.gc_maxlifetime 1440 (秒) session.gc_maxlifetime は、データが 'ごみ' とみなされ、消去されるまでの秒数を指定します。

2.挙動

gc_divisorとgc_probabilityの動作が気になったので、さらにPHP知っている人にも聞いてみることにしました。 どうやら、以下の式が成り立つときにgcが実行されるようです。

 \displaystyle { (0 < x < 1 ) < \frac{session.gc\_probability}{session.gc\_divisor}}

実際のPHPコードを読んでみましたが、下記の箇所が該当すると思います。

nrand = (zend_long) ((float) PS(gc_divisor) * php_combined_lcg());
if (PS(gc_probability) > 0 && nrand < PS(gc_probability)) {
    PS(mod)->s_gc(&PS(mod_data), PS(gc_maxlifetime), &num);
}

また、gcが動作すると、max_lifetimeを超えているセッションデータは一斉に削除されます。

一斉に削除されます(←ここ重要)

そのため、使用しているDBの性能によっては、動作が重くなる可能性もあるので注意しましょう。

できることなら、ある程度の件数ずつ削除していくといいのではないかと思います。

そろそろPythonのこと書いていきたい・・ Chainerもっと頑張らなきゃ

参考

PHPの公式リファレンス:PHP: 実行時設定 - Manual

PHPのセッションに関するコード:php-src/session.c at master · php/php-src · GitHub

Kibana×ElasticSearchをConoHa(512MB)で動かす

お久しぶりです。

最近、社内のプロダクトで「分析にKibanaを使おうぜ」っていう話が出たので、いままで使ったことがなかったKibanaとElasticsearchをConoHaのVPC最低で動かした話になります。

目次

注意事項 動作環境 ConoHaの準備 Elasticsearchのインストール Kibanaのインストール 確認と学習について

注意事項

この記事はあくまでConoHaでKibanaを動かすことが目的です。

セキュリティの設定など度外視しており、実運用で使うことを考えていません・

本番では実行しないようにしてください。

この設定で事故が起きても責任はとれません。

動作環境

ConoHa - リージョン:東京 - メモリ:512MB - OS:CentOS7(64bit)

Elasticsearch:5.6.1 Kibana:5.6.1

ConoHaの準備

まずは、ConoHaでサーバーを作成しましょう。 画面をすべて出さないですが左のメニューから「サーバー」を選択してください。

  1. リージョン・メモリの選択 f:id:country-dev:20170924215729p:plain サーバーを借りる地域の設定と、メモリの設定をします。 今回は特に考える必要がないので、東京リージョンでメモリは最低の512MBを選択します。

  2. OSの選択 f:id:country-dev:20170924215744p:plain さくっとCentOS 7.3 (64bit)でいいでしょう。 慣れ親しんだOSがあった場合は自分が使いやすいOSを選択してください。 今回は基本的にCentOS7系のコマンドを使いますので、6以前で設定するときには注意してください。

  3. ポートの設定 f:id:country-dev:20170924232259p:plain 必要のないIPv6のポートはチェックを付けないでいいでしょう。

今回Kibanaが5601ポートを使用するので、IPv4は「すべて許可」にチェックをしておいてください。 ConoHa側のインバウンドルールに引っかかってしまい、ポートを開けても通信できない状態になります。

1.サーバーの作成 上記が問題なければ「追加」のボタンを押しましょう。 ここでサーバーが作成されるとともに、料金が発生するので気を付けてくださいね。

Elasticsearchのインストール

1.Javaのインストール ElasticsearchはJava8以上の実行環境が必要です。 もし自身のサーバーにJava8がインストールされていなかったら、先にJava8をインストールしましょう。 今回はopen-jdk1.8をインストールします。

> yum -y install java-1.8.0-openjdk
> yum -y install java-1.8.0-openjdk-devel

念のためJavaのバージョンを確認しましょう。

> java -version

openjdk version "1.8.0_144"
OpenJDK Runtime Environment (build 1.8.0_144-b01)
OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)

とりあえず、インストールできました。

2.Elasticsearchのインストール

>vim /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

> yum -y install elasticsearch

> systemctl start elasticsearch 
> systemctl enable elasticsearch

#動作しているか確認
> systemctl status elasticsearch

上記の手順で行えばインストールはできたと思うので、 下記のコマンドで動作しているか確認しましょう

> curl http://127.0.0.1:9200
{
  "name" : "81JvC6n",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Q_32fYIpRkCBKV7uzgh-bg",
  "version" : {
    "number" : "5.6.1",
    "build_hash" : "667b497",
    "build_date" : "2017-09-14T19:22:05.189Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.1"
  },
  "tagline" : "You Know, for Search"
}

また、日本語を扱うにはkuromojiと呼ばれるプラグインがいるので、インストールします。

> /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji

Kibanaのインストール

> yum -y install kibana
> vim /etc/kibana/kibana.yml

7行目のコメントアウトを外して、すべての通信を受け付けるようにする
server.host: "0.0.0.0"

21行目のコメントアウトを外す
elasticsearch.url: "http://localhost:9200"

# portが閉じているので解放する
> firewall-cmd --add-port=5601/tcp --permanent
> firewall-cmd --reload 

> systemctl start kibana
> systemctl enable kibana

ここまできたら、Kibanaにアクセスしてみましょう。 http://{自分のサーバーのIPアドレス}:5601/ f:id:country-dev:20170924232814p:plain

ただ、見てみるとわかるとおり、どうもElasticsearchへの疎通で失敗しています。 systemctlコマンドで状態を確認してみましょう。

> systemctl status elasticsearch
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
   Active: failed (Result: signal) since Sun 2017-09-24 22:57:26 JST; 32min ago
     Docs: http://www.elastic.co
 Main PID: 29465 (code=killed, signal=KILL)

Sep 24 22:33:32 host-xxx-xx-xx-xxx systemd[1]: Starting Elasticsearch...
Sep 24 22:33:32 host-xxx-xx-xx-xxxx systemd[1]: Started Elasticsearch.
Sep 24 22:33:33 host-xxx-xx-xx-xxx elasticsearch[29465]: OpenJDK 64-Bit Server VM warning: If the number of pr...s=N
Sep 24 22:57:26 host-xxx-xx-xx-xxx systemd[1]: elasticsearch.service: main process exited, code=killed, statu...KILL
Sep 24 22:57:26 host-xxx-xx-xx-xxx systemd[1]: Unit elasticsearch.service entered failed state.
Sep 24 22:57:26 host-xxx-xx-xx-xxx systemd[1]: elasticsearch.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

というようにエラーが出て、プロセスが死んでいるのがわかります。 ちょっと動かしてtopコマンドを使ってプロセスの状態を確認してみます。 f:id:country-dev:20170924233539p:plain そうすると、明らかにJavaが高負荷をかけてしまっています。 今回は低スペックのVPSを使っているので、メモリが足りずJavaが落ちているようです。 なので、Elasticsearchの設定を以下のように変更します。

> vim /etc/elasticsearch/jvm.options

# 22, 23行目の設定を以下のように変更します。
-Xms128m
-Xmx128m

> systemctl restart elasticsearch

そしてもう一度アクセスしてみます。 f:id:country-dev:20170924235149p:plain

これでいったんKibanaとElasticsearchの設定を終了します。

このあとの学習

私はまだ、Elasticsearchの初心者でもあるので、まずはそちらを勉強しようと思っています。 今のところは下記サイトでElasticsearchのAPIを使用してみたところになります。

qiita.com

参考サイト

ConoHaについて:ConoHaでサクっとWebサーバーを作ろう - Qiita

open-jdk1.8.0のインストール:CentOS6にjdk-1.8.0をインストールした話 - 路地裏カジノ

Elasticsearchのインストール: CentOS 7 : Elastic Stack : Elasticsearch インストール : Server World

Kibanaのインストール: CentOS 7 : Elastic Stack : Kibana インストール : Server World

スペックの低いVPSでelasticsearchを動かす: Elasticsearchのメモリ使用量を減らす | karakaram-blog