旅好きエンジニアのメモ

旅のこと映画、統計、会計、プログラミングなど、気の向くままに語ります

djangoでpandas使うのは簡単だった

pandas使ってデータ分析しているサイトがよくあって、 私も参考にしているのですが大体csv使ってませんか?

少ないデータだったらcsvで良いと思うんですけど、 apiスクレイピングデータ取るときってdbに突っ込みませんか?

djangoのormでデータをdbにつっこんで、そのまま分析するほうが効率的な気がします。 そもそも、csvからデータ抜くの整形の処理やタイトルつけたりめんどくさいです。

そんなときは、"django-pandas"で楽をしちゃいましょう。

https://github.com/chrisdev/django-pandas

インストール
pip install django-pandas

サンプルは自分で作っているビットコインの足(日足とか分足とか)みたいなものです。

model

モデルはこんな感じです

class BitcoinTicker(models.Model):
    bc_id = models.IntegerField('bc_id', unique =True)
    high = models.DecimalField('high', max_digits=25, decimal_places=10, blank=True, null=True)
    low = models.DecimalField('low', max_digits=25, decimal_places=10, blank=True, null=True)
    volume = models.DecimalField('volume', max_digits=25, decimal_places=10, blank=True, null=True)
    timestamp = models.DateTimeField('timestamp')
pandasデータフレームへの変換
from app.models import BitcoinTicker
from django_pandas.io import read_frame
bitcoin_ticker = BitcoinTicker.objects.all()
df_bitcoin_ticker = read_frame(bitcoin_ticker)

カラムhighのデータが有るか確かめてみましょう。

df_bitcoin_ticker.high

こんな感じで簡単にできます。

最近はデータ分析にdjangoベースでやったほうがだいぶ楽なんじゃと思ったりしています。

djangoでjupyter notebookを使う方法

djangoでjupyter notebookを使おう

pythonicでデータ分析をする方ならjupyetrを使う方は多いのではないでしょうか?

ただ、web開発で何かしらのフレームワーク使っていたらjupyter使うって感じにならないですよね。。。 (自分だけかもしれないですが)

しかし、web開発でデータ分析している所があったら、そこはDB通してjupyterでやったほうが楽な気がします。

なので、今回はdjangoでjupyterを使う方法書いていきます。

まずは djangoのextensionをインストールしましょう!

pip install django-extensions
次にsetting.pyに以下のように追加しましょう
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app',
    'django_extensions',  # この行を追加
)
jupyter起動

そしてあとはshell_plusに以下のようにoptionを追加しましょう。

python manage.py shell_plus --notebook

これでjupyter使えちゃいます! 便利!!

djangoのORMでwhere文の大なり(>)を書きたい時

例えば、昨日の日付から現在までのデータを取得したい時

 

yesterday = datetime.date.today() - datetime.timedelta(1)
example_table.objects.all().values().filter(registeredDateTime__gt=yesterday)

 

filterでいつもの"="の前に

"__gt"をつけてやればいいだけです。

 

> は __gt=

= は =

djnagoのORMでinを書く方法

例えば為替のレートを検索するときで
ユーロとオーストラリア・ドルだけ抽出したいときは以下のように書きます。

ExchangeRate.objects.all().values().filter(currency_code__in=["EUR","AUD"])

filterのなかで"__in="を書いて、その中でリスト型で書くだけですね。

Djangoを使っていてドメインだけのルーティングをセッティングしたい場合

Djangoを使っていてドメインだけのルーティングをセッティングしたい場合

 

r'^$'を書けばドメインだけのルーティングができます。

url(r'^$', "ルーティングする場所", name='  '),

Djangoでデータ登録しようとした時character with byte sequence 0xe3 0x83 0x95 in encoding "UTF8" has no equivalent in encoding "LATIN1"なエラーが出ちゃった時

Djangoで日本語のデータを登録しようとした時、以下のようなエラーが出ました。

character with byte sequence 0xe3 0x83 0x95 in encoding "UTF8" has no equivalent in encoding "LATIN1"

 

これは自分がPostgreSQL使っていて起きた問題です。
PostgreSQLに原因があります。

まぁ、簡単に言うと現在使っている文字のエンコードが違うよーってはなし。
なのでDBを作成するときはエンコードをUTF8で作成しましょう。

Djangoとnginxでstaticファイルが当たらないとき

普段nginxの設定をしない自分からすればめっちゃ詰まりました。。。

nginx,uwsgi,djangoを使ってサイトを公開しようとしました。

すると、おっ独自ドメインでサイト見れるぞ!っとここまでは良かったんですが、
あれcss当たってない。。。。
と言うかstaticファイル読み込んでなくね。。。

となったわけです。

chromeの開発者ツールで見てみると
403エラーと出ているわけです。

ふむふむ、だいたいこれは権限関係のことだなっと。
まぁ、本当はというか、絶対良くないけど、アプリ配下の権限777のしちゃえば良くない?と思って変えたわけです。

しかし、直らない。。。

そして
ps aux | grep nginx
でようやく真相をするわけです。

あっ、nginx起動しているユーザー "www-data" みたいなやつだ。

自分のアプリのユーザーと違う。。。

まぁ、そこでnginxの起動ユーザー名を変えたら直りました。

つまりは

myprojectのユーザーが hogeなら

/etc/nginx/nginx.conf
一番上らへんにある

user www-data;

user hoge;

に変えてあげんと駄目だったんです。