Category:

poetryでパッケージ・仮想環境を管理

これまでpythonプロジェクトにおいては、pipでパッケージ管理しvenvで仮想環境を構築するというスタンスだったのですが、いい加減もっと便利なツールに乗り換えることにしました。 調べてみるとpipenvとpoetryという二つの良さそうな候補があり、ちょっと迷いましたがpoetryに決めました。 ドキュメントが分かりやすいので不要かもしれませんが、この記事では知っておいた方が良さそうな部分を抜粋して動作確認しつつ、poetryの使い方をまとめています。 poetryを選んだ理由 pipenvもpoetryも調べた範囲では、担当プロジェクトでやりたいことを考えると、機能的には不足を感じませんでしたが、先駆者の皆さんのブログを読むと、以下のような点でpoetryの方が優位性が高く、githubのstar数の推移を見ても、将来的にはpoetryがはやる可能性が高そうな気がするので、poetr Continue Reading

Posted On :
Category:

PySparkの実装サンプルと実行方法

最近Sparkを触る機会があって、少しだけ勉強したのでメモがてら残しておきます。 Sparkの分散処理の仕組み Sparkとは 高速で汎用的な分散処理システム 分散データ(RDD)をDISKを介さずにメモリ上に持つので、Hadoopの100倍ぐらい高速 Java, Scala, Python, RなどのAPIを提供 Spark SQL, MLlib, GraphX, Spark Streamingなどのリッチなツールを提供 分散処理システムの構成要素 画像は、こちらからお借りしました。 Driver Program Master Nodeで実行される起点となるプログラム SparkContextを作成し、RDDを生成して、Taskを実行していく SparkContext Sparkの色々な機能へのエントリーポイント ClusterManagerを通じてクラスターを操作する DAG Sche Continue Reading

Posted On :
Category:

Neo4jにCSVロードする4つの方法

Neo4jにCSVロードする方法は少なくとも4つはあるようです。 CSV LOAD apoc.load.csv apoc.import.csv neo4j-admin import この記事ではこの4つの方法について、pythonから実行する具体的な実装を説明したいと思います。 ロードするデータ サンプル実装でロードするデータはこちらです。リレーションLINKEDにはscoreというリンクの強さを表すプロパティが設定されています。 検証環境 今回は、docker-hubのneo4j:latestイメージで、docker-composeで検証します。docker-compose.yamlの設定は基本的には以下のような感じです。 version: '3' services: neo4j: image: neo4j:latest ports: – "7474:747 Continue Reading

Posted On :
Category:

Neo4j+pythonで特定の条件で繋がっているサブグラフを抽出する

やりたいこと 候補ノード(約1億件)と候補同士のリレーション(約100億件)をneo4jに登録して、特定の条件で繋がっているサブグラフのノードIDを抽出したいと思います。 入力データ 候補1 — 候補2 (score = 40) 候補1 — 候補3 (score = 60) 候補3 — 候補4 (score = 50) 候補4 — 候補5 (score = 70) 候補6 — 候補7 (score = 30) 候補7 — 候補8 (score = 70) 候補9 … リレーションなし scoreは関連性の強さです。本来、関連性に方向はありません。 グラフ表示するとこんなイメージです。 このデータからクエリでscore >= 50以上のリレーションを接合して、以下のようなデータを取得したいと思っています。 [候補1, 候補3, 候補4, 候補5] [候補2] [候補6] Continue Reading

Posted On :
Category:

pythonにおける親/兄弟階層のモジュールimportの方法

pythonでは、デフォルトでは実行フォルダおよびその配下のフォルダだけがモジュール検索対象のパスとなっています。 そのため、ある程度プロジェクトが大きくなってきて、共通モジュールを特定のフォルダに整理してまとめたりすると、パスが通らず困ったりします。 今回は、兄弟階層の共通モジュールのimport方法を説明します(もちろん親階層でも同じ方法で対応できます)。 はじめに フォルダ構成 今回は以下のようなフォルダ構成でmain.pyにlogger.pyをimportする方法について解説します。 ┣ module ┃ ┗ logger.py ┗ business   ┗ main.py logger.pyの実装 import logging formatter = '%(asctime)s [%(levelname)s] %(message)s' logging.basic Continue Reading

Posted On :
Category:

pythonの型ヒント

pythonは動的型付け言語ですが、バージョン3.5で型ヒントが導入されたことにより、静的型付け言語っぽく開発することができるようになりました。 ただし、公式ページ にも以下のように書いてあるように、 Python ランタイムは、関数や変数の型アノテーションを強制しません。 型アノテーションは、型チェッカー、IDE、linterなどのサードパーティーツールで使われます。 型ヒント自体はあくまでコメントの延長であり動作には一切影響を与えません。型チェッカー、IDE、linterなどのツールによって利用されます。 型ヒントの導入に関してはメリットしかないと思いますので、導入して快適なpython lifeをおくりましょう。 型ヒントのメリット 型ヒントを導入するメリットは3つあると思います。 コードチェック 入力候補の表示 可読性向上 コードチェック 型ヒントの最大のメリットは静的型チェックだ Continue Reading

Posted On :
Category:

pythonにおけるローカル環境での環境変数の設定

Twelve-Factor Appがデファクトになりつつある中、pythonのアプリを作る際も、設定はコードから切り離し環境変数に格納することも多いと思います。 staging環境やproduction環境は、service化するなりdocker化するなり、何らかの方法で環境変数を外部から与えると思いますが、ローカル開発環境においてどうやって環境変数を与えるかは結構悩みどころです。 この記事では、その辺を考えてみたいと思います。 考慮ポイント 基本的には上にあるものほど、優先度が高いと考えました。 環境を汚さない(環境変数が残ったままにしない) 環境変数が残ったままになると、別のプログラムを同じterminalで実行して、不正な動作をしたり事故につながる 開発のスピードを落とさない 実装から動作確認までのイテレートが短ければ短いほどよい(環境立ち上げに時間がかかるのは嫌) 運用の手間を増や Continue Reading

Posted On :
Category:

DataProc+PySparkのTips

環境変数の利用 DBへの接続情報など環境変数から設定するようにしたいケースが発生しそうなので調査しました。 いずれもドライバプログラム内でしか利用できません。つまりworkerノード(リモート)で利用するためには一旦変数に格納してアプリケーションコード内で参照するような工夫が必要ですのでご注意ください。 方法1:initialization-actionsで自前スクリプトを実行する initialization-actionsで自前のスクリプトを実行して、その中で環境変数を設定するというとても原始的な方法です。この方法だと変数の内容をファイルに記載して、GCSにアップロードしなくてはならないので正直使えないと思っています。 まず、クラスター作成時にinitialization-actionsオプションで指定するスクリプト(initialize.sh)を実装する echo "exp Continue Reading

Posted On :
Category:

pythonのTips

仕事でpythonを触る機会が今後増えそうなので、pythonに関するメモをためていく予定です。 Pythonのバージョン管理(pyenv) pyenvを使ってpythonをインストールします # pyenvのインストール brew install pyenv pyenv -v > pyenv 1.2.13 # インストール可能なpythonのバージョン確認 pyenv install –list # 特定のバージョンのpythonをインストール pyenv install 3.7.4 # インストール済みのpythonのバージョン確認 pyenv versions > * system (set by /Users/rinoguchi/.pyenv/version) > 3.7.4 # ~/.bash_profileに以下の設定を追加(symsとautocompletionの有効化) Continue Reading

Posted On :