【Django】django-pandasを使ったQuerysetからDataFrameへの変換


投稿日 2022年6月1日 >> 更新日 2023年3月1日

概要

ブログの投稿頻度等を分析したいと思ったので、手間のかからないdjango-pandasを使用してQuerysetから一発でDataFrameに変換をして、CSVファイルに保存してからローカル環境にデータを転送する。

実行環境&使用ライブラリ

実行環境
Windows Subsystem for Linux
Python 3.6.9
pip 21.3.1
使用ライブラリ ライセンス
Django==2.2.5 BSD
django-pandas==0.6.2 BSD
$ pip install django==2.2.5 django-pandas==0.6.2

DataFrameにするモデル例

今回QuerysetからDataFrameにするモデルは、ブログ記事作成のためのテーブルを例に実装します。


class Category(models.Model):
    """
    カテゴリーモデル
    title : カテゴリーのタイトル

    """
    title = models.CharField('カテゴリー', max_length=20)


class Blog(models.Model):
    """
    記事作成モデル
    title : ブログ記事のタイトル
    text : ブログ記事の内容
    category : ブログ記事のカテゴリーで、Categoryモデルと紐づく
    created_at : 記事の作成日
    updated_at : 記事の更新日
    is_publick : 記事を公開するか非公開とするか

    """
    title = models.CharField('タイトル', max_length=150)
    text = MarkdownxField('テキスト', help_text='Markdown形式で書いてください。')
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
    created_at = models.DateField(auto_now_add=True)
    updated_at = models.DateField(auto_now=True)
    is_publick = models.BooleanField('選択', choices=((True, '公開'), (False, '非公開')))

QuerysetからDataFrameへ変換

管理コマンドである「shell」を実行します。

※リモートの場合データを取得するので恐らくスーパーユーザーで実行する必要があります。

$ sudo python3 manage.py shell

対話モードに入ったら必要なモジュールをインポートします。

# blogsアプリ内にあるmodels.pyで定義しているモデルをインポート
from blogs.models import Blog
from django_pandas.io import read_frame

BlogモデルのQuerysetを取得します。

queryset = Blog.objects.all()
print(queryset)
"""
<QuerySet [<Blog: 【初投稿】当Webサイト管理者の簡単な紹介!>,  '...(remaining elements truncated)...']>
"""

Blogモデルで定義されている各フィールドの情報が格納されているので、そのままdjango-pandasからインポートした「read_frame」に変数を渡します。

df = read_frame(queryset)

# 上から5行目を表示する
df.head()
"""
   id                                              title  ...  updated_at is_publick
0   1                             【初投稿】当Webサイト管理者の簡単な紹介!  ...  2020-08-02         公開
1   2  【保護されていない通信http://】NginxとCertbotで無料SSL証明書(Lets...  ...  2020-08-02         公開
2   3               LetsEncryptの無料SSL証明書をCertbotを使って自動発行  ...  2020-08-02         公開
3   4                        【簡単】Python3で仮想環境を構築する(venv)  ...  2020-08-02         公開
4   5                     【Webサーバー】Nginxが正常に起動されているか確認する  ...  2020-08-02         公開

[5 rows x 7 columns]
"""

type(df)
"""
<class 'pandas.core.frame.DataFrame'>
"""

DataFrameに変換されたら、CSVファイルとしてカレントディレクトリに保管します。

df.to_csv('pandas_dframe.csv')

「quit()」もしくわ「exit()」で対話モードを抜けて、ファイルの有無を確認します。

$ ls
... ... pandas_dframe.csv ...

リモートからローカルへファイルを転送

リモート環境のファイルをローカル環境に転送する場合は、ホームディレクトリからファイルが配置されているディレクトリまでのフルパス情報が必要なので、「pwd」コマンドでフルパスを確認します。

pwd
/home/username/project

フルパスをコピーしたらローカル環境を起動し、作業を行いたいディレクトリへと移動します。

そこにいるディレクトリへファイルを転送(コピー)してくる場合のコマンドは以下です。

※ローカル環境での作業です。

$ scp -P 1234 username@django-project.com:/home/username/project/pandas_dframe.csv pandas_dframe.csv

補足

  • 「-P」オプションはリモート環境で設定しているポート番号の設定です。設定していない場合は要りません。
  • 行末の「pandas_dframe.csv」は転送先の名前です。何でも構いません。

リモート先のパスワードを入力すると転送(コピー)が開始されます。

それでは以上となります。

最後までご覧いただきありがとうございました。