【pandas入門】そろそろpandas使いたいPythonユーザーの備忘録
はじめに
はじめましての方ははじめまして、お久しぶりです。 だいぶ期間が空いてしまいましたが、久しぶりに記事を書いていこうと思います。 Pythonを4年近くやっていまだにpandasを触っていなかったので、Excelの代わりにPythonを使うべく勉強した内容をまとめていこうと思います。
対象者
- 基本的なpythonのインストールが終わっている(終わってない人はこっちでScrapyに入門した話 - 田舎プログラマーの備忘録)
- ある程度ググる力がある
- たまにはpythonを仕事で触りたい人
やること
- pandasの文法とつらつらと書いていく
やらないこと
- pythonの基礎
→ 何も知らない場合は有料ですが、udemyやdotinstall等で勉強するとよいかと思います。
お金をかけたくない場合は、公式チュートリアルを行えばよいかと思います。
Python チュートリアル — Python 3.6.5 ドキュメント
- pandasとは
→ この辺をみてください
データ分析のライブラリ!Pandasとは【初心者向け】 | TechAcademyマガジン
サンプルコード
記載している内容
名前 | 役割 |
---|---|
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コンテナを動作させています。
ソースコード
現在開発中ではありますが、コードを公開しておきますので、興味がありましたら使用していただけると幸いです。 github.com
各containerの説明
各コンテナの詳しい説明を始めます。 コンテナの元として使用しているイメージの詳細な説明は時間の関係で今回割愛させていただきます。
jupyter container
イメージ:jupyter/datascience-notebook
scipyやpandas、numpyなどのよく使われるライブラリは大抵入ってるすごいイメージ Python3の他に、JuliaやRも使えるすぐれもの。対応させたインタプリタ:Ruby (2.3.1)
仲間内で使う時に、Rubyエンジニアも一定数いるので、Rubyインタプリタもあとからインストールしました。あとでインストールしたライブラリ
個人的にJupyterNotebookではなくJupyterLabを使いたかったので、別途インストールしました。-
- JupyterLab
- PyMySQL
iruby、pry、cztopはrubyをJupyter上で使用するために必要なめ、別にインストール
- Ruby
- iruby
- pry
- cztop
- Daru
mysql
1.イメージ:mysql:5.7
data volume
- イメージ: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が実行されるようです。
実際の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でサーバーを作成しましょう。 画面をすべて出さないですが左のメニューから「サーバー」を選択してください。
リージョン・メモリの選択 サーバーを借りる地域の設定と、メモリの設定をします。 今回は特に考える必要がないので、東京リージョンでメモリは最低の512MBを選択します。
OSの選択 さくっとCentOS 7.3 (64bit)でいいでしょう。 慣れ親しんだOSがあった場合は自分が使いやすいOSを選択してください。 今回は基本的にCentOS7系のコマンドを使いますので、6以前で設定するときには注意してください。
ポートの設定 必要のない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/
ただ、見てみるとわかるとおり、どうも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コマンドを使ってプロセスの状態を確認してみます。 そうすると、明らかにJavaが高負荷をかけてしまっています。 今回は低スペックのVPSを使っているので、メモリが足りずJavaが落ちているようです。 なので、Elasticsearchの設定を以下のように変更します。
> vim /etc/elasticsearch/jvm.options # 22, 23行目の設定を以下のように変更します。 -Xms128m -Xmx128m > systemctl restart elasticsearch
そしてもう一度アクセスしてみます。
これでいったんKibanaとElasticsearchの設定を終了します。
このあとの学習
私はまだ、Elasticsearchの初心者でもあるので、まずはそちらを勉強しようと思っています。 今のところは下記サイトでElasticsearchのAPIを使用してみたところになります。
参考サイト
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