import re
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
# 日本語フォント
plt.rcParams['font.family'] = 'IPAPGothic'
# パイチャートのサイズを大きく
piechart_figsize = (10, 10)
piechart_font_size = 30
def flatmap_series(series, func):
values = []
for value in series:
new_values = func(value)
for v in new_values:
values.append(v)
return pd.Series(values)
def multiple_choices(series):
return flatmap_series(series.dropna(), lambda s: [v.strip() for v in re.split(',', s)])
df = pd.read_csv("DjangoCongress JP 2018 事前アンケート(回答) - フォームの回答.csv",
header=0,
names=['company_name', 'product_kind', 'why_django', 'experience', 'django_version', 'python_version', 'os', 'db_backend', 'problem', 'recommend_library'])
# df
for company_name in df['company_name'].replace('Castalia', 'キャスタリア株式会社').dropna().sort_values().unique():
print(company_name)
一般的なウェブアプリケーションについでAPIサービスや教育方面でよく採用されているようです。 APIを開発するときはDjango REST Framework、教育システムだとOpen edXなど利用できるシステムやライブラリが豊富なのがDjangoの特色ですね。
default_kind = 'ウェブアプリ'
kinds = dict((re.compile(k), v) for k, v in ({
'.*(教育|MOOC|学習|勉強).*': '教育',
'.*社内.*': '社内システム',
'.*受託.*': '受託',
'.*(ウェブサイト|ブログ).*': 'ウェブサイト',
'.*個人.*': '個人',
'.*API.*': 'APIサービス',
'.*メディア.*': 'ウェブメディア',
'.*(分析|集計).*': '分析',
'.*業務.*': '業務',
}).items())
def product_kind(value):
for pattern, label in kinds.items():
if pattern.match(value):
return label
else:
return default_kind
product_kinds = flatmap_series(df['product_kind'].dropna(),
lambda s: [label.replace('* ', '') for label in re.split('[\n,、,・]', s) if label != '']).map(product_kind)
_ = product_kinds.groupby(product_kinds).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')
やはりPython。PythonだからDjangoにしたという方が多数でした。 また、そのなかでもフルスタックなフレームワークとして、機能が豊富で利用実績が多いというのも、選択した決め手になっているとの回答もありました。 最近だと機械学習などでPythonを使っているから、そのままDjangoを選ぶというケースもあるようです。
from matplotlib.font_manager import findfont
from janome.tokenizer import Tokenizer
from janome.tokenfilter import CompoundNounFilter
from wordcloud import WordCloud
tokenizer = Tokenizer()
filter = CompoundNounFilter()
keywords = []
stop_words = ['ため', 'あっ', 'ある', 'いる', 'こと']
for problem in df['why_django'].dropna():
tokens = tokenizer.tokenize(problem)
tokens = filter.apply(tokens)
keywords.extend([
token.surface for token in tokens
if token.surface not in stop_words and token.part_of_speech.split(',')[0] in ('形容詞', '名詞', '副詞', '動詞')])
font_path = findfont('IPAPGothic')
figure = plt.figure(figsize=(10,10))
figure.add_subplot(111).axis('off')
_ = plt.imshow(WordCloud(background_color="white", font_path=font_path, width=1000, height=1000).generate(" ".join(keywords)))
Djangoだからといって特殊な環境ではなくウェブ系の一般的な環境で使用されていることがわかります。 比較的新しいバージョンが選ばれているのは、もうずっとDjangoを使っているというよりは、ここ数年のPythonの採用の拡大にあわせてDjangoで開発をスタートしたケースが多そうです。 PyPyでの実績もありますね。発表お待ちしています。
experiences = df['experience'].map(lambda s: re.sub(r'\(.*\)', '', s))
_ = experiences.groupby(experiences).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')
django_versions = multiple_choices(df['django_version']).map(lambda s: re.sub(r'\(.*\)', '', s).replace('2.0', '2'))
_ = django_versions.groupby(django_versions).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')
python_versions = multiple_choices(df['python_version'])
_ = python_versions.groupby(python_versions).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')
oses = multiple_choices(df['os'])
_ = oses.groupby(oses).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')
二大OSSデータベースであるMySQLとPostgreSQLの利用が大半を占めていますね。 珍しいところでMongoDBを使われているところもあるようですが、これはdjango-mongodb-engine( https://django-mongodb-engine.readthedocs.io/en/latest/ )のようなカスタムのバックエンドを使っているのでしょうか。
db_backends = multiple_choices(df['db_backend'].replace("Aurora, Amazon Redshift", "Aurora、\nAmazon Redshift", regex=True).replace(r'SQL\(', r'SQL\n(', regex=True)) # 選択肢の設定上で","が含まれてた
db_backends
_ = db_backends.groupby(db_backends).count().plot('pie', label='', figsize=piechart_figsize, fontsize=piechart_font_size).axis('equal')
圧倒的に日本語の情報が不足しているようです。また、メインのコンポーネントであるViewとModelまわりで困ることが多いようです。 洋書ではTwo Scoops of Djangoがトピックを網羅しているのでおすすめです。他にもいくつか参考になる書籍がでているので探してみてください。最近ではDjangoの同人誌も作られているようです。
from matplotlib.font_manager import findfont
from janome.tokenizer import Tokenizer
from janome.tokenfilter import CompoundNounFilter
from wordcloud import WordCloud
tokenizer = Tokenizer()
filter = CompoundNounFilter()
keywords = []
stop_words = []
for problem in df['problem'].dropna():
tokens = tokenizer.tokenize(problem)
tokens = filter.apply(tokens)
keywords.extend([
token.surface for token in tokens
if token.surface not in stop_words and token.part_of_speech.split(',')[0] in ('形容詞', '名詞', '副詞', '動詞')])
font_path = findfont('IPAPGothic')
figure = plt.figure(figsize=(10,10))
figure.add_subplot(111).axis('off')
_ = plt.imshow(WordCloud(background_color="white", font_path=font_path, width=1000, height=1000).generate(" ".join(keywords)))
Django REST Frameworkは鉄板ですね。SwaggerもAPI系です。他、Django Debug Toolbar、Django Hijack、Django Extensionsなど開発支援のもの、django-imort-export、Silkなど運用で使われるもの、Python Social Auth、django-keeperなど認証機能を提供するものなどがよく使われています。 Djangoは再利用できるモジュールが多くあるので、知らないものあったら調べてみてくださいね。
stop_words = ['en', 'latest', 'csv', 'json']
libraries = []
for recommend_library_text in df['recommend_library'].dropna():
recommend_library_text = recommend_library_text\
.lower()\
.replace('django import/export', 'django-import-export')\
.replace('import-export', 'django-import-export')\
.replace('django rest framework', 'django-rest-framework')
for s in re.split(r'(\n|と|は|(|・|\(|/|,)', recommend_library_text):
s = s.strip().lower().replace(':-)', '')
if s == "":
continue
if s in stop_words:
continue
if re.search('^([a-z]| |-)+$', s):
libraries.append(s.replace('django-', '').replace('-django', '').replace('python-', ''))
font_path = findfont('IPAPGothic')
figure = plt.figure(figsize=(10,10))
figure.add_subplot(111).axis('off')
_ = plt.imshow(WordCloud(background_color="white", font_path=font_path, width=1000, height=1000, regexp=r'\w[\w-]+').generate(" ".join(libraries)))