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でデータ登録しようとした時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;
に変えてあげんと駄目だったんです。