カテゴリー: python

  • PandasのTimestampオブジェクトでNaTTypeエラーを回避する

    PandasのTimestampオブジェクトでNaTTypeエラーを回避する

    PandasのTimestampオブジェクトを使用して日付データを操作する際、不適切なデータが含まれていると、NaTTypeエラーが発生することがあります。 この記事では、PandasのTimestampオブジェクトでNaTTypeエラーを回避する方法について説明します。 (さらに…)

  • Flask と Quart 比較: どちらを選ぶべきか?

    Flask と Quart 比較: どちらを選ぶべきか?

    近年、Flask 以外に Quartも python で API を作る時に選ばれるようになってきました。 それぞれの特徴をまとめます。

    項目 Flask Quart
    作者 Armin Ronacher Philip Jones
    公開年 2010 2017
    ライセンス BSD MIT
    非同期対応 部分的 (サードパーティ製の拡張機能) ネイティブ (async/await 対応)
    コミュニティ 大規模で安定 より小規模で成長中
    ドキュメントの充実度 高い 中程度
    日本語のドキュメント数 多い 少ない
    GitHubのStarの数 55,000以上 (2021年9月時点) 3,000以上 (2021年9月時点)
    対象ユーザー 初心者〜上級者 中級者〜上級者

    Flask はより充実したドキュメントと多くの日本語ドキュメントがあり、GitHub のスター数も多いため、初心者にも中級者や上級者にも適しています。 一方、Quart はドキュメントの充実度がやや劣り、日本語ドキュメントも少ないため、中級者や上級者に向いています。

    サンプルコード

    /hello を叩かれたら、hello world と表示するだけのサンプルコードは以下の通りです   Flask の例:

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/hello', methods=['GET'])
    def hello():
    return 'hello world'
    
    if __name__ == '__main__':
    app.run()

    Quart の例:

    from quart import Quart
    
    app = Quart(__name__)
    
    @app.route('/hello', methods=['GET'])
    async def hello():
    return 'hello world'
    
    if __name__ == '__main__':
    app.run()

    Flask はシンプルで軽量なフレームワークで、大きなコミュニティがありますが、非同期処理には部分的な対応しかしていません。 一方、Quart は非同期処理にネイティブで対応しており、より効率的なアプリケーション開発が可能ですが、コミュニティはまだ成長中です。 どちらを選ぶかは、プロジェクトの要件と開発チームの好み、そしてチームメンバーの技術レベルによって異なります。 非同期処理のサポートが重要な要素であれば、Quart の方が適しているかもしれません。   一方、初心者向けのサポートや豊富なリソースが重要であれば、Flask が良い選択肢となるでしょう。

  • Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘json’ from ‘itsdangerous’ (/var/task/itsdangerous/init.py)

    以下は、「Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘json’ from ‘itsdangerous’ (/var/task/itsdangerous/init.py)」に対する解決方法についてのブログ記事です。

    Lambda関数でPythonコードを実行する際に、依存ライブラリのバージョンによって、Runtime.ImportModuleErrorエラーが発生することがあります。

    この記事では、そのうちの1つである「itsdangerous」ライブラリのバージョンに関連するエラーについて解説します。

     

    上記のエラーは、Lambda関数に必要な「itsdangerous」ライブラリが、Lambda環境で正しく動作しないために発生します。

    特に、このエラーは「json」という特定の名前の属性をインポートできないという意味です。

     

    この問題を解決するには、Lambda関数の環境を構成し、互換性のあるバージョンの「itsdangerous」ライブラリを使用する必要があります。

    まず、既存のrequirements.txtファイルに以下のように「itsdangerous」ライブラリをバージョン指定して追加してください。

    itsdangerous==2.0.0

    次に、依存関係を更新する必要があります。Lambda関数のデプロイパッケージ内に既にライブラリがある場合は、パッケージを再度構築する必要があります。以下のコマンドを使用してパッケージを再構築してください。

    pip install -r requirements.txt

    これにより、指定されたバージョンの「itsdangerous」ライブラリがインストールされ、Lambda関数で使用できるようになります。この手順を実行することで、「itsdangerous」ライブラリのバージョンに関連するエラーを解決することができます。

    ただし、Lambda関数で発生するエラーは様々な種類があり、問題の原因を特定することが困難な場合があります。この場合、Lambda関数のログを確認して、詳細な情報を取得することをおすすめします。

  • [ERROR] Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘soft_unicode’ from ‘markupsafe’ (/var/task/markupsafe/__init__.py) Traceback (most recent call last):

    以下は、Lambda関数で「markupsafe」ライブラリのバージョンに関連するエラーが発生した場合の対処法についてより自然な文面でまとめたものです。

    このエラーを解決するには、Lambda関数で使用される「markupsafe」ライブラリのバージョンを明示的に指定し、互換性のあるバージョンを使用する必要があります。まず、Lambda関数の「requirements.txt」ファイルを確認し、以下のように「markupsafe」ライブラリのバージョンを指定することで、互換性のあるバージョンがインストールされることを確認できます。

    Copy code
    markupsafe==1.1.1

    次に、Lambda関数に必要な依存関係を更新するために、次のコマンドを実行します。

    pip install -r requirements.txt

    これにより、指定されたバージョンの「markupsafe」ライブラリがインストールされ、Lambda関数で使用できるようになります。この手順を実行することで、このエラーを解決することができます。

  • [ERROR] Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘escape’ from ‘jinja2’ (/var/task/jinja2/__init__.py)

    以下は、Jinja2 ライブラリのバージョンに互換性の問題がある場合に発生するエラーについての対処法についての説明です。

    Runtime.ImportModuleError エラーが発生した場合、Lambda 環境で使用される Jinja2 ライブラリのバージョンに互換性の問題がある可能性があります。この問題を解決するには、互換性のあるバージョンの Jinja2 を使用するように環境を構成する必要があります。

    まず、requirements.txt ファイルを確認して、Jinja2 のバージョンが明示的に指定されているかどうかを確認し、以下のようにバージョンを指定します。

    Copy code
    Jinja2==2.10.1

    次に、Lambda 関数にデプロイされる依存関係を更新し、Lambda 関数を再デプロイします。これにより、互換性のあるバージョンの Jinja2 がインストールされ、エラーが解消されるはずです。

    もし最新バージョンの Jinja2 を使用している場合、互換性の問題が発生する可能性があるため、古いバージョンを使用するか、コードを更新する必要があります。それでもエラーが解決しない場合は、Lambda 関数のログを確認し、原因を特定する必要があります。

  • [ERROR] Runtime.ImportModuleError: Unable to import module ‘app’: cannot import name ‘BaseRequest’ from ‘werkzeug.wrappers’ (/var/task/werkzeug/wrappers/__init__.py)

    Flask と Werkzeug ライブラリのバージョンに互換性の問題がある場合に発生するエラーについての対処法についての説明です。

    Flask==1.1.2
    Werkzeug==0.16.1

    次に、Lambda 関数にデプロイされる依存関係を更新し、Lambda 関数を再デプロイします。

    これにより、互換性のあるバージョンの Flask と Werkzeug がインストールされ、エラーが解消されるはずです。

     

    もし最新バージョンの Flask と Werkzeug を使用している場合、互換性の問題が発生する可能性があるため、古いバージョンを使用するか、コードを更新する必要があります。それでもエラーが解決しない場合は、Lambda 関数のログを確認し、原因を特定する必要があります。

     

  • Pythonによる日付の操作方法について – datetimeとtimedeltaの使い方

    Pythonのdatetimeモジュールは、日付や時刻を操作するためのクラスを提供しています。

    このモジュールを使用して、日付の計算やフォーマットを簡単に行うことができます。

    from datetime import datetime, timedelta
    
    # 現在の年月を取得
    now = datetime.now()
    this_month_str = now.strftime('%Y%m')
    
    # 先月の年月を取得
    last_month = now - timedelta(days=now.day)
    last_month_str = last_month.strftime('%Y%m')
    
    # 10週間前の年月を取得
    ten_weeks_ago = now - timedelta(weeks=10)
    ten_weeks_ago_str = ten_weeks_ago.strftime('%Y%m')
    
    # 今月日付を取得
    today_str = now.strftime('%Y%m%d')
    
    print('今月:', this_month_str)
    print('先月:', last_month_str)
    print('10週間前:', ten_weeks_ago_str)
    print('今日:', today_str)
    

    出力結果

    今月: 202303
    先月: 202302
    10週間前: 202301
    今日: 20230316

    datetimeモジュールから現在の日付を取得します。

    ここでは、nowメソッドを使用して現在の日付と時刻をdatetimeオブジェクトとして取得します。

    その後、strftimeメソッドを使用して、年月のみを表す文字列を生成します。

     

    timedeltaモジュールは現在を軸に先月の日付や10週間前の日付を相対的に計算することができます。

    timedeltaは、日付や時間の差分を表すオブジェクトです。

    ここでは、daysやweeksを指定して、現在の日付から指定した期間だけ引いた日付を取得しています。

     

  • python dataframeで csv 出力する際の先頭の ,(カンマ)を削除する

    以下のように pandas dataframe をcsv に変換すると

    df.to_csv(f'/tmp/{output}', mode='w', encoding='utf-8')

    先頭に,(カンマ)が入ってしまう

    ,TITLE,NUMBER,xxx
    hoge,1,xxx
    

    この対処法として

    index=False

    を追加することによって回避が可能

    df.to_csv(f'/tmp/{output}', mode='w', encoding='utf-8', index=False)

    結果は以下の通り

    TITLE,NUMBER,xxx
    hoge,1,xxx
    

    先頭の,(カンマ)が取り除かれた状態で csv が生成された。

  • Python でjsonの配列の変数から value を抜き出す

    Python で jsonの変数を持たせたいことがあり、読み込む上でのメモ

    import json
    
    list = [{"name":"Worker","no":"123"}, {"name":"User","no":"456"}, {"name":"Organization","no":"789"}, {"name": "Position","no":"123"}, {"name": "PositionTranslation","no":"123"}]
    
    for d in list:
    print(d.get('name'))
    print(d.get('no'))
    print("-----")

     

    list の中に json の配列を格納

    loop の中で .get(key名)を行うことで value を取り出すことができる

    結果

    Worker
    123
    -----
    User
    456
    -----
    Organization
    789
    -----
    Position
    123
    -----
    PositionTranslation
    123
    -----