ラベル python の投稿を表示しています。 すべての投稿を表示
ラベル python の投稿を表示しています。 すべての投稿を表示

2019/08/04

GCP: GAE/Py から、ElasticSearch(GCE上で稼働)を呼び出す -- Python

  • GOAL: レコメンドエンジンとしてElasticSearchを立ち上げ&セットアップする。その後、Google App Engine(GAE)から、ElasticSearchAPIを呼び出して使う。
  • POINT
    1.GAE
    からの外部HTTPREST API)呼び出しは、POSTで行うこと! GETは使うな!!
    (GAE/Py27の環境で、requestsを利用して呼び出す場合)
    2.Logstash
    は、必ず「Ctrl+D」で終了させること!
    Ctrl+Z
    で終了させていたため、サービスが起動中となりハマりました。
  • HOW
    1.Martket Placeから、ELK(ElasticSearch+Logstash+Kibana)を起動
    2.Logstashを使って、CSVデータをElasticSearchにロード
    3.GAEから、ElasticSearchに検索クエリーを発行して結果を取得
    ----------------
    1.Martket Placeから、ELK(ElasticSearch+Logstash+Kibana)を起動
       ・Bitnamiの仮想マシンを選択
       ・手順に沿って、選択をしていくだけ


    2.Logstashを使って、CSVデータをElasticSearchにロード


    3.GAEから、ElasticSearchに検索クエリーを発行して結果を取得

2019/06/09

文字列内の検索  str.find() str.rfind() --- Python3

Goal: 文字列の中に、特定の文字列が含まれているか? 含まれている場合は、INDEXを取得する。

How: 文字列メソッド find() 、rfind() を使う。

例)
01234567890123456789012345678901
THIS IS A PEN. THIS IS AN APPLE.

に、文字列が含まれているかどうかを確認する。

1: 'IS' を前から探す →  2が返ってくる
2: 'THIS' を前から探す → 0が返ってくる
3: 'THIS' を後ろから探す → 15が返ってくる
4: 'PINEAPPLE' を探す → 無いから、-1が返ってくる

Source:



Result:

-> % python test.py
2
0
15
-1

2019/01/06

round() の四捨五入では上手くいかない! - python3

Python3 では、round()による四捨五入は使えない!!

How: decimal モジュールを使う。
サンプルコード

# -*- coding: utf-8 -*-
#
from decimal import Decimal, ROUND_HALF_UP
i = float(input())
print("入力値")
print(i)
#
print("roundの結果")
ex_round = round(i,1)
print(ex_round)
#
print("decimalの結果")
o = float(Decimal(str(i)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP))
print(o)

結果

入力値
12.25
roundの結果
12.2
decimalの結果

12.3

2019/01/05

Colaboratory すごい - Colaboratory + Python3 + Pandas

Google の Colaboratory を使ってデータサイエンス、機械学習にチャレンジをしてみる。

Goal:Google Colaboratory を立ち上げて、機械学習用のデータ・セットを読み込みデータをハンドリングする。主に、Pandas を使ってみるという内容。

How
1. Colaboratoryに新しいノートブックを作成する。以下にアクセスして、Python3のノートブックを作成する。

      https://colab.research.google.com/


2. Notebook

2019/01/01

標準入力の取扱 input と print - Python3

Goal:Python3での標準入力をハンドリングする。
#1 複数の値が1行に同時に入力された場合、数値として取り込む
入力値 --- 以下の3つの数値を入力したら、int型として取り込む
100 3 123456



(py3) toshi$ python python3-input.py
100 3 123456
output---
a=100
b=3
c=123456


#2 入力行数を最初に入力して、その後、複数行に渡る入力値を、配列として取り込む
入力値 --- 以下のように入力したら、3*3の行列として取り込む
3
1 2 3
4 5 6
7 8 9



(py3) toshi$ python python3-input2.py
3
1 2 3
4 5 6
7 8 9
output---
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

2018/10/14

GCP: Google App EngineのランタイムPython3.7を使ってみる2 -- Rest API

前回メモ(hello world with Python3.7)の続編。Restサービスの立上げ。
App Engine APIs が使えなくなっているので、代わりにGCPのPython用のライブラリを使う。(例えば、Datastoreの読み書きにndbは使えない。)

  • Goal
    GAE(Google App Engine) + python3.7ランタイム上にREST API(メソッドはPOST)を作成する。
    APIが呼び出されたら、GCP(Google Cloud Platform)のDatastoreに新規Entity(レコード)を追加する。
  • case
    名前、点数、教科名をjsonでPOSTしたら、GCPのDatastoreに書き込みして、Keyを返信する。
  • How
    1. 開発前準備
    1)開発環境に、google-cloud-datastoreをインストール
    2)
    GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定
    あくまで、ローカルでテストするために必要。
    以下コマンドを打つと、betaコンポーネントのダウンロードを聞かれる。
    「Y」を入力すると、ダウンロードされて環境変数の設定までしてくれる。
    $ gcloud beta auth application-default login

    2. requirements.txt の中身。google-cloud-datastoreも追加すること。



    3. main.py の中身。


  • Result --- curlのサンプルと結果
    Toshiのhistoryが67点


    $ curl -i -H "Content-Type: application/json" -X POST -d '{"name":"toshi","points":67,"subject":"history"}' https://.appspot.com/addtest
    HTTP/2 201 
    content-type: application/json
    x-cloud-trace-context: 4140694e3538666bb96627febc6130e4;o=1
    date: Sun, 14 Oct 2018 14:08:21 GMT
    server: Google Frontend
    content-length: 35
    alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
    {"result":{"id":5635703144710144}}



GCP: Google App EngineのランタイムPython3.7を使ってみる1 -- Hello World

GAEのStandard Environment に、Python3のランタイムがbeta版でリリースされていたので使ってみる。SecondGenerationというらしい。OPENCVかPillowが使えるかどうか?までテストする予定。まずはHello Worldまで。
https://cloud.google.com/appengine/docs/standard/python3/
  • Goal
    GAEのStandardEnvironmentにおいて、Python3.7のランタイムを使ってHelloWorldする。
  • How
    1. app.yaml, main.py, requirement.txt を用意する。サンプルは以下。
      https://github.com/pumpkinpietea/py37.git
    $ ls -lt
    total 32
    -rw-r--r--@ 1 Toshi_Admin  staff  817 Oct 14 11:22 app.yaml
    -rw-r--r--  1 Toshi_Admin  staff  101 Oct 14 10:08 README.md
    -rw-r--r--@ 1 Toshi_Admin  staff  956 Oct 14 01:17 main.py
    -rw-r--r--@ 1 Toshi_Admin  staff  197 Oct 14 00:11 requirements.txt
    2. ローカルでテスト
         $ pip install -r requirements.txt
         $ python main.py
    3. deploy

          $ gcloud app deploy ./py37/app.yaml


  • Comment
    1. libフォルダーに、pip -t でインストールは不要。逆にすべてrequirements.txtに記入する必要がある。
    2. ローカルテスト用のdev_appsever.py は、使えない。
      逆に普通に、local で実行すればよい。便利になった!
    3. deploy は、gcloud コマンドで実施が必要、appcfg.py は、使えない。
    4. 普通のpython3をそのままGAE上で動かす事を狙っているようなので、Cとかのライブラリも動くと思われる。別途テスト予定。

2018/09/02

GCP: GCP外のサーバーからDatastoreへデータをインポートする(GCPのKeyを使う場合)

  • Goal
    タブ区切りのテキストファイルをローカルマシン(OR AWSのEC2でも同じ)GCPのDatastoreにインポートする。pythonのプログラムで実施。

    前のPOSTのKeyを自分で設定しないバージョン

  • Case
    以下のようなテキストファイルを、Datastoreにインポートする。
    想定するのは、DatastoreをGAEのマスタのように利用していて、バッチで更新をするようなケース。keyは、GCPで自動設定されるKeyを使う。
    list.txtの中身(タブ区切り)
    id     shimei   score
    1234   山田      89
    2341   田中      90
    1238   佐藤      81

  • How
    1.GCPのコンソールで、Service Account Keyを作成する
     形式は、JSON
     権限は、DatastoreのOwner(これは、Import&Exportでも良いのかも?)
     作成された、JSONはローカルマシンのどこかに設置する。
    2.Google cloud datastore のクライアントライブラリをインストールする。
     ~$ pip install google-cloud-datastore
    3.pythonのプログラムでインポートする。
      ##utf-8に変換⇒Unicodeに変換して、インポートすること!
       あとで、Pythonから呼び出しをする事を想定している。


  • Result

GCP: GCP外のサーバーからDatastoreへデータをインポートする(keyを自分で設定する場合)

  • Goal
    タブ区切りのテキストファイルをローカルマシン(OR AWSのEC2でも同じ)GCPのDatastoreにインポートする。pythonのプログラムで実施。
    Keyは自分で設定したい。

    Keyを自分で設定する必要がない場合はこちら
  • Case
    以下のようなテキストファイルを、Datastoreにインポートする。
    想定するのは、DatastoreをGAEのマスタのように利用していて、バッチで更新をするようなケース。id をKeyとして登録したい。
    list.txtの中身(タブ区切り)
    id     shimei   score
    1234   山田      89
    2341   田中      90
    1238   佐藤      81
  • How
    1.GCPのコンソールで、Service Account Keyを作成する
     形式は、JSON
     権限は、DatastoreのOwner(これは、Import&Exportでも良いのかも?)
     作成された、JSONはローカルマシンのどこかに設置する。
    2.Google cloud datastore のクライアントライブラリをインストールする。
     ~$ pip install google-cloud-datastore
    3.pythonのプログラムでインポートする。
      ##utf-8に変換⇒Unicodeに変換して、インポートすること!
       あとで、Pythonから呼び出しをする事を想定している。


  • Result

2018/07/29

リストの要素の重複排除とNone(空要素)の排除 − Python

  • Goal
    リスト型の要素の中の重複排除とNone(空要素)を排除する。
    集合型(set)なら、重複排除は自動でできて、.discardでNoneは排除可能だが、リスト型で行いたい。理由は、リスト内の順番をキープしたいから。
  • How
    if で要素があるかどうか?と長さが0より大きいかを確認する。
    ※filterを使うとか、内包表記を使うとか色々載っていたが、これが一番分かりやすかった。。。
  • Result

    ~$ python eliminating_duplication.py
    === inputtext
    Aaa
    bBbb

    CCddff

    Aaa


    === after normalize
    AAA
    BBBB

    CCDDFF

    AAA


    === normal list splitted by \n
    [u'AAA', u'BBBB', u'', u'CCDDFF', u'', u'AAA', u'', u'']
    === normal list with splitlines
    [u'AAA', u'BBBB', u'', u'CCDDFF', u'', u'AAA', u'']
    === eliminating duplication and None
    [u'AAA', u'BBBB', u'CCDDFF']

2018/02/25

GCP: GAE上にAPI(POST)を作成ーDatastoreの操作(Create) ー Python



  • Goal
    GAE(Google App Engine)上にREST API(メソッドはPOST)を作成する。
    APIが呼び出されたら、GCP(Google Cloud Platform)のDatastoreに新規Entity(レコード)を追加する。言語・環境はPython+flask。
  • case
    名前、点数、教科名をjsonでPOSTしたら、GCPのDatastoreに書き込みして、Keyを返信する。
  • How
    1:開発環境は、以下でセットアップ
      Ubuntu16.4 + Pyenv:Python2.7.13 on GCE
      GCP: Google App Engine上にPython(Flask)アプリを立ち上げる手順

    2:ライブラリのセットアップ
      app.yaml に、flaskの記述を追加
      - name: flask
        version: 0.12

    3:mainプログラム と curl 結果


    4:Datastoreの結果

  • Thanks!

2018/02/11

GCP: Google App Engine上にPython(Flask)アプリを立ち上げる手順



  • Goal
    開発環境も何も無い状態から、GAE(Google App Engine)上にFlaskアプリ(Hello World)を30分以内に立ち上げる。
    GAEは、Standard Environmentなので、Pythonは、2.7
  • How
    1. GCP上に新プロジェクト作成(xxxxx-test−0001) ⇒ 手順割愛
    2. GCP上で、GAEを有効にする。 ⇒ 手順割愛
      初めてのアプリ作成で、Pythonを選ぶ。
      チュートリアルはやらなくて良いので、途中で抜ける。
      1プロジェクトで、1GAEアプリしか持てない。
    3. GCP上に新VMインスタンス(Ubuntu16.4)作成(dev001) ⇒ 手順割愛
      TYPEはMicro(無料マシン)でOK。
      別にローカルマシンがあればそれでもOK。
    4. VM(dev001)の設定 ー 開発環境構築
        4-1. 初期設定 + Pyenv + GAEのSDKの導入
          以下のファイルを実行
       
         ~$ . UbuntuSetupForGAE.sh

        4-2. Localに開発用フォルダの作成とPyenvのセットアップ      
           

    5. Deploy
      localでのテスト。main.pyがあるディレクトリで以下を実行
          $ 
    dev_appserver.py .
     
       Deploy。 main.pyがあるディレクトリで以下を実行する
          $ appcfg.py update --noauth_local_webserver -A "project id" -V "version" .

    6. 確認する。以下のURLにアクセスする。
      
    https://”projectid”.appspot.com
         



  • Notes
    これを使って、LineのBotなどマイクロサービスを立ち上げれる
    main.pyの編集と必要なlibのインストールが必要
  • Thanks!!

  • 2017/12/02

    Pyenv + virtualenv のセットアップ手順 on AWS-EC2

    AWSのEC2 RHEL7.4(Ubuntuの場合は、パッケージの部分だけ違う) に Pyenv+virtualenv をセットアップする手順

    1.インストール


    2.チェックとちょこっと設定
    #切り替え可能なバージョンチェック
    [ec2-user@ip-10-0-0-174 ~]$ pyenv versions
    * system (set by /home/ec2-user/.pyenv/version)
    #インストール可能なPythonバージョンを確認
    [ec2-user@ip-10-0-0-174 ~]$ pyenv install -l
    Available versions:
      2.1.3
      2.2.3
      2.3.7
      2.4
      2.4.1

      2.4.2
    #新しいPythonのバージョンをインストール
    [ec2-user@ip-10-0-0-174 ~]$ pyenv install 2.7.13
    Downloading Python-2.7.13.tar.xz...
    -> https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tar.xz
    Installing Python-2.7.13...
    Installed Python-2.7.13 to /home/ec2-user/.pyenv/versions/2.7.13
    #2.7.13が追加された。
    [ec2-user@ip-10-0-0-174 ~]$ pyenv versions
    * system (set by /home/ec2-user/.pyenv/version)
      2.7.13
    #2.7.13をベースに、"testpy"という環境を構築する
    [ec2-user@ip-10-0-0-174 ~]$ pyenv virtualenv 2.7.13 testpy
    Collecting virtualenv
      Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
        100% |████████████████████████████████| 1.8MB 638kB/s 
    Installing collected packages: virtualenv
    Successfully installed virtualenv-15.1.0
    New python executable in /home/ec2-user/.pyenv/versions/2.7.13/envs/testpy/bin/python2.7
    Also creating executable in /home/ec2-user/.pyenv/versions/2.7.13/envs/testpy/bin/python
    Installing setuptools, pip, wheel...done.
    Requirement already satisfied: setuptools in /home/ec2-user/.pyenv/versions/2.7.13/envs/testpy/lib/python2.7/site-packages
    Requirement already satisfied: pip in /home/ec2-user/.pyenv/versions/2.7.13/envs/testpy/lib/python2.7/site-packages
    #"testpy"が追加された
    [ec2-user@ip-10-0-0-174 ~]$ pyenv versions
    * system (set by /home/ec2-user/.pyenv/version)
      2.7.13
      2.7.13/envs/testpy
      testpy
    #開発用のディレクトリ"pyproject"のPython環境を"testpy"に変更する
    [ec2-user@ip-10-0-0-174 ~]$ cd pyproject/
    #今のバージョンは、2.7.5だが。。
    [ec2-user@ip-10-0-0-174 pyproject]$ python -V
    Python 2.7.5
    #Pyenvで変更すると
    [ec2-user@ip-10-0-0-174 pyproject]$ pyenv local testpy 
    (testpy) [ec2-user@ip-10-0-0-174 pyproject]$ python -V
    Python 2.7.13

    バージョン2.7.13へと変更された。

    2017/10/28

    CSVファイルを読み込んでlist型と辞書型に格納 - Python


    • Goal
      PythonでCSVファイルを読み込んで、List型と辞書型、集合型に格納する
    • How
      CSVモジュールのreaderメソッドを使う

      マスターファイルを作る。 テキストファイル menu.csv
       
      UDON001,500
      UDON0012,700
      SUSHI0123,1200
      TONKATSU001,2000
      RAMEN10,1000

    • Result
      (pytest2.7.13)~/pytest$ python CSVtoListDic.py 
      List
      [['UDON001', '500'], ['UDON0012', '700'], ['SUSHI0123', '1200'], ['TONKATSU001', '2000'], ['RAMEN10', '1000']]
      5
      Dic
      {'TONKATSU001': '2000', 'UDON001': '500', 'RAMEN10': '1000', 'UDON0012': '700', 'SUSHI0123': '1200'}
      5
      Set
      set(['TONKATSU001', 'UDON001', 'SUSHI0123', 'UDON0012', 'RAMEN10'])

      5

    2017/10/22

    テキストファイルをRDBのテーブル(イメージは、品番マスターとか)風に使う - Python


    • Goal
      ChatBotが受信したテキストメッセージと、テキストファイル(CSV)をマッチングさせる。テキストファイルのままで、品番マスタの用に使って参照させる。
    • 準備
      マスターファイルを作る
      テキストファイル menu.csv
       
      UDON001,500
      UDON0012,700
      SUSHI0123,1200
      TONKATSU001,2000
      RAMEN10,1000
    • How
      1. unicodedata を使って、ひらがな・カタカナ・漢字判定と、全角・半角変換する
      2. lineでテキストファイルから1行取得して、比較を繰り返す
      3. 先頭からで一致したら抜き出す

    • 結果

      (pytest2.7.13) ubuntu@ip-10-0-0-253:~/pytest$ python testmatch.py
      UDON001,500
    • Thanks!!
      以下、参考にさせて頂きました。
      http://minus9d.hatenablog.com/entry/2015/07/16/231608