こんにちは。JetBrains堀岡です。
「はじめてのPyCharm + Jupyter Notebook(その1)」の続きです。今回も Maria KhalusovaによるPyCharm 英語ブログ「Jupyter, PyCharm and Pizza」の記事をベースに少し違った観点で、PyCharmとJupyter Notebookの連携を紹介します。
その1では環境のセットアップと基本的な機能について説明しました。今回は、英語ブログに出てくるチャートを一通り表示できる環境を構築し、PyCharm上で分析を体験する方法を紹介します。
セットアップ
テスト環境はその1と同じです。
Githubからの新規プロジェクト作成
今回は、PyCharm 英語ブログ「Jupyter, PyCharm and Pizza」に出てくるチャートが表示できる環境を別PyCharmプロジェクトとして作ります。ブログで使用されたnotebookはGitHubからダウンロード可能になっていますので、GitHub上のコードから新しいPyCharmプロジェクトを作って試します。
PyCharmのスタート画面で「Get from Version Control」を選択します。
Get from Version Controlの画面で以下を指定します。
- URL: https://github.com/MKhalusova/pizza.git
- Directory: pizzaだと私の環境では前回のプロジェクトかぶるので「_mk」を追加しました。
今回はPyCharmプロジェクト作成時にPython interpreterが指定されていないので、以下のような警告が表示されます。ここで、Configure Python interpreter をクリックします。
前回同様New environmentを選択し、[OK]をクリックし、Conda仮想環境を新規作成します。
Pythonパッケージのインストール
前回同様、Jupyter等のパッケージは当然必要になりますが、試してみたところ、notebookで出力するチャートを表示するためには、英語ブログでは詳しく言及されていないパッケージのインストールが必要でした。「パッケージインストール&エラーメッセージの確認」の繰り返しを体験したい方は、以下をスキップして、そのままお試しいただきたいのですが、楽をしたい方は PyCharmの画面下部のTerminalでcondaコマンドで以下必要なものをまとめてインストールしましょう。
conda install jupyter matplotlib pandas plotly psutil requests
conda install -c plotly plotly-orca
Notebookの実行
パッケージがインストールされ、PyCharmのindexing処理が終わったのを確認します。その後、編集画面左上の[黄色電球アイコン] - [Clear Outputs]を実行します。
「
次に、(黄色電球アイコンの隣の)Run Allを実行します。
エラーなく実行できてPreview画面をスクロールしていってチャートが表示されているのを確認できればセットアップ成功です🎉。辛抱強くチュートリアルをやりたくない方は、これで満足できたのではないでしょうか😄
英語ブログで紹介されていたNotebookの理解
英語ブログの中では、実現したいことと、コードの断片が紹介されています。ブログで紹介されている内容を日本語でざっくり理解できるよう、Notebookファイルのソースに日本語でコメントを追加したものを以下に準備しました。
Notebookのコードを試したい方は、
- [黄色電球アイコン] - [Clear outputs]
- 一番最初のセルからセルごとに実行(Shift+Enter)しながら、Variableツールウィンドウを確認する、コードを少し変更してみたり、必要に応じてPyCharmのデバッガを使い、動作を確認するとPyCharmの使い勝手を確認できるでしょう。
#%%
#おまじない
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
#%%
import pandas as pd
df = pd.read_csv("../data/Datafiniti_Pizza_Restaurants_and_the_Pizza_They_Sell_May19.csv")
#%%
#テーブルサイズ確認
df.shape
#%%
#列名確認
df.columns
#%%
#最初の5行取得
df.head(5)
#%%
#country にどのような値があるか確認
df['country'].value_counts()
#%%
#利用しないカラムの削除
df.drop(['country', 'keys', 'menuPageURL','menus.currency', 'priceRangeCurrency'],axis = 1, inplace = True)
df.shape
#%%
#カラム名の変更
df.rename(columns={"province": "state"}, inplace = True)
#州の表記を変更するためのマッピング作成
states = {"AL":"Alabama", "AK":"Alaska", "AZ": "Arizona", "AR": "Arkansas", "CA": "California", "CO":"Colorado",
"CT": "Connecticut", "DE": "Delaware", "FL": "Florida", "GA": "Georgia", "HI": "Hawaii", "ID": "Idaho",
"IL": "Illinois", "IN": "Indiana", "IA": "Iowa", "KS": "Kansas", "KY": "Kentucky", "LA": "Louisiana",
"ME": "Maine", "MD": "Maryland", "MA": "Massachusetts", "MI": "Michigan", "MN": "Minnesota",
"MS": "Mississippi", "MO": "Missouri", "MT": "Montana", "NE": "Nebraska", "NV": "Nevada",
"NH": "New Hampshire", "NJ": "New Jersey", "NM": "New Mexico", "NY": "New York", "NC": "North Carolina",
"ND": "North Dakota", "OH": "Ohio", "OK": "Oklahoma", "OR": "Oregon", "PA": "Pennsylvania",
"RI": "Rhode Island", "SC": "South Carolina", "SD": "South Dakota", "TN": "Tennessee", "TX": "Texas",
"UT": "Utah", "VT": "Vermont", "VA": "Virginia", "WA": "Washington", "WV": "West Virginia",
"WI": "Wisconsin", "WY": "Wyoming"}
df['state'] = df['state'].map(states)
#%%
#メニュー名のtop 10を円グラフで表示
ax = df['menus.name'].value_counts().nlargest(10).plot.pie().set(xlabel='', ylabel='')
#%%
#レストランIDでグループ化してそれぞれの最初の行->レストラン一覧
unique_restaurants = df.groupby('id').first()
#%%
#レストラン一覧をマップ上に表示
import plotly.express as px
import plotly.io as pio
pio.renderers.default = 'svg'
#レストラン一覧のDataframeと緯度経度に利用するカラム名を指定し、地図上の散布図を作成
fig = px.scatter_geo(unique_restaurants, lat = 'latitude', lon = 'longitude', scope = 'usa', template = 'seaborn', opacity = 0.5)
fig.show()
#%%
#アメリカの州ごとの人口データ from https://www.census.gov/
pop = pd.read_csv("../data/SCPRC-EST2018-18+POP-RES.csv", usecols = ['NAME','POPESTIMATE2018'])
#[州名:人口]の辞書を作成
population = pop.iloc[1:52].set_index('NAME').to_dict()['POPESTIMATE2018']
#%%
#per_cap = 1/(州の人口/100000) = 100000/州の人口 のカラムを追加
unique_restaurants['per_cap'] = unique_restaurants.apply(lambda row: 100000/population[row['state']], axis=1)
# unique_restaurants.groupby('state')['per_cap'].sum() = 州ごとのレストラン数*100000/州の人口 = 州における100000人あたりのレストラン数
ax = unique_restaurants.groupby('state')['per_cap'].sum().nlargest(10).sort_values().plot.barh()\
.set(xlabel='Number of pizza restaurants per capita (100 000 residents)', ylabel='')
まとめ
PyCharm 英語ブログ「Jupyter, PyCharm and Pizza」で利用してるJupyter NotebookファイルをGitHub上から取得し、PyCharmプロジェクト作成しNotebookを実行する手順を紹介しました。PyCharm Professional(ダウンロードはこちら)を使えば、ブラウザによるJupyter Notebookと殆ど変わりなくセルの実行が可能です。加えて、IDEの強みを生かしてPythonコードの読み書きをより生産的に行うことができることを体験していただけましたら幸いです。
コメントやフィードバックがあれば是非お知らせ下さい。