前書き

Pythonの `+ pandas +`パッケージは、データの操作と分析に使用され、ラベル付きデータまたはリレーショナルデータを直感的に操作できるように設計されています。

`+ pandas +`パッケージはスプレッドシート機能を提供しますが、Pythonを使用しているため、従来のグラフィカルなスプレッドシートプログラムよりもはるかに高速で効率的です。

このチュートリアルでは、動作する大きなデータセット、 `+ pandas `の ` groupby()`および ` pivot_table()+`関数、そして最後にデータを視覚化する方法を設定します。

`+ pandas +`パッケージに慣れるために、チュートリアルhttps://www.digitalocean.com/community/tutorials/an-introduction-to-the-pandas-package-and-its-data-structuresを読むことができます-in-python-3 [pandasパッケージとPython 3のデータ構造の紹介]。

前提条件

このガイドでは、ローカルデスクトップまたはリモートサーバーで `+ pandas +`のデータを操作する方法について説明します。 大きなデータセットの操作はメモリを集中的に使用する可能性があるため、どちらの場合でも、このガイドの計算の一部を実行するには、少なくとも* 2GBのメモリ*が必要になります。

このチュートリアルでは、* Jupyter Notebook *を使用してデータを操作します。 まだお持ちでない場合は、https://www.digitalocean.com/community/tutorials/how-to-set-up-jupyter-notebook-for-python-3 [インストールとセットアップのチュートリアルに従ってください。 Python 3用Jupyterノートブック]。

データを設定する

このチュートリアルでは、https://www.ssa.gov/oact/babynames/limits.html [社会保障Webサイト]から8MBで入手できる、赤ちゃんの名前に関する米国の社会保障データを使用します。 ZIPファイル。

localでPython 3プログラミング環境をアクティブにしましょうマシン、またはhttps://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-programming-environment-on-an-ubuntu-16- 04-server [server]正しいディレクトリから:

cd
. /bin/activate

それでは、プロジェクト用の新しいディレクトリを作成しましょう。 「++」と呼んで、ディレクトリに移動できます。

mkdir
cd

このディレクトリ内で、 `+ curl +`コマンドを使用して社会保障Webサイトからzipファイルをプルできます。

curl -O https://www.ssa.gov/oact/babynames/names.zip

ファイルをダウンロードしたら、使用するすべてのパッケージがインストールされていることを確認しましょう。

  • 多次元配列をサポートするための + numpy +

  • データを視覚化するための + matplotlib +

  • データ分析のための + pandas +

  • matplotlib統計グラフィックスをより美しくするための「+ seaborn +」

パッケージがまだインストールされていない場合は、次のように `+ pip +`でインストールします。

pip install pandas
pip install matplotlib
pip install seaborn

`+ numpy +`パッケージもまだインストールされていない場合はインストールされます。

これでJupyter Notebookを起動できます。

jupyter notebook

Jupyter Notebookのウェブインターフェースにアクセスすると、そこに `+ names.zip +`ファイルが表示されます。

新しいノートブックファイルを作成するには、右上のプルダウンメニューから[新規作成]> [Python 3]を選択します。

image:https://assets.digitalocean.com/articles/eng_python/JupyterNotebookPy3/jupyter-notebook-new.png [新しいPython 3ノートブックを作成]

これにより、ノートブックが開きます。

まず、使用するパッケージをhttps://www.digitalocean.com/community/tutorials/how-to-import-modules-in-python-3[importing]から始めましょう。 ノートブックの上部に、次のように書く必要があります。

import numpy as np
import matplotlib.pyplot as pp
import pandas as pd
import seaborn

`+ ALT + ENTER +`を入力して、このコードを実行し、新しいコードブロックに移動できます。

また、Python Notebookにグラフをインラインに保つように指示しましょう。

matplotlib inline

コードを実行し、 `+ ALT + ENTER +`を入力して続行します。

ここから、zipアーカイブを解凍し、CSVデータセットを「+ pandas 」にロードしてから、「 pandas +」を連結しますhttps://www.digitalocean.com/community/tutorials/an-introduction-to -the-pandas-package-and-its-data-structures-in-python-3#dataframes [DataFrames]。

Zipアーカイブの圧縮解除

zipアーカイブを現在のディレクトリに解凍するには、 + zipfile +`モジュールをインポートし、ファイル名(この場合は `+ names.zip +)で `+ ZipFile +`関数を呼び出します。

import zipfile
zipfile.ZipFile('names.zip').extractall('.')

コードを実行し、 `+ ALT + ENTER`を入力して続行できます。

これで、 `+`ディレクトリを振り返ると、CSV形式の名前データの ` .txt `ファイルが作成されます。 これらのファイルは、1881年から2015年までのファイル上のデータの年に対応します。 これらの各ファイルは、同様の命名規則に従います。 たとえば、2015ファイルは「 yob2015.txt 」と呼ばれ、1927ファイルは「 yob1927.txt +」と呼ばれます。

これらのファイルの形式を確認するには、Pythonを使用してファイルを開き、上位5行を表示します。

open('yob2015.txt','r').readlines()[:5]

コードを実行し、 `+ ALT + ENTER`で続行します。

Output['Emma,F,20355\n',
'Olivia,F,19553\n',
'Sophia,F,17327\n',
'Ava,F,16286\n',
'Isabella,F,15504\n']

データのフォーマット方法は、最初に名前(「+ Emma 」または「 Olivia 」など)、次にセックス(女性名の場合は「 F 」、男性名の場合は「 M +」)、そして番号その年にその名前で生まれた赤ちゃんのうち(2015年に生まれたEmmaという名前の20,355人の赤ちゃんがいました)。

この情報を使用して、データを「+ pandas」にロードできます。

CSVデータを「+ pandas」に読み込む

コンマ区切り値のデータを `+ pandas `に読み込むには、 ` pd.read_csv()`関数を使用して、テキストファイルの名前と決定した列名を渡します。 これを変数、この場合は「 names2015 +」に割り当てます。これは、2015年生年ファイルのデータを使用しているためです。

names2015 = pd.read_csv('yob2015.txt', names = ['Name', 'Sex', 'Babies'])

「+ ALT + ENTER +」と入力してコードを実行し、続行します。

これが確実に機能するように、表の上部を表示しましょう。

names2015.head()

コードを実行して `+ ALT + ENTER +`に進むと、次のような出力が表示されます。

image:https://assets.digitalocean.com/articles/eng_python/pandas/names2015-head-w.png [names2015.head output]

テーブルには、各名前で生まれた赤ちゃんの名前、性別、および数の情報が列ごとに整理されています。

`+ pandas +`オブジェクトを連結する

`+ pandas `オブジェクトを連結すると、 ` names +`ディレクトリ内のすべての個別のテキストファイルを操作できます。

これらを連結するには、まず、変数を未入力のhttps://www.digitalocean.com/community/tutorials/understanding-lists-in-python-3[list data type]に割り当てることにより、リストを初期化する必要があります。

all_years = []

それが完了したら、https://www.digitalocean.com/community/tutorials/how-to-construct-for-loops-in-python-3 [+ for + loop]を使用して繰り返します1880年から2015年の範囲の年ごとのすべてのファイル。 2015年がループに含まれるように、2015年の終わりに「++ 1 +」を追加します。

all_years = []

ループ内で、https://www.digitalocean.com/community/tutorials/how-to-use-string-formatters-in-python-3 [を使用して、各テキストファイルの値をリストに追加しますこれらの各ファイルの異なる名前を処理する文字列フォーマッタ]。 これらの値を + year`変数に渡します。 繰り返しますが、 `+ Name ++ Sex +、および `+ Babies +`の列を指定します。

all_years = []

for year in range(1880, 2015+1):

さらに、年ごとに列を作成して、それらを順番に保ちます。 これは、ループの進行に合わせて `+ -1 +`のインデックスを使用してそれらを指すことにより、各反復後に実行できます。

all_years = []

for year in range(1880, 2015+1):
   all_years.append(pd.read_csv('yob{}.txt'.format(year),
                                names = ['Name', 'Sex', 'Babies']))

最後に、 `+ pd.concat()`関数を使用して連結して ` pandas `オブジェクトに追加します。 変数「 all_names +」を使用してこの情報を保存します。

all_years = []

for year in range(1880, 2015+1):
   all_years.append(pd.read_csv('yob{}.txt'.format(year),
                                names = ['Name', 'Sex', 'Babies']))
   all_years[-1]['Year'] = year

これで、 `+ ALT + ENTER +`でループを実行し、結果のテーブルの末尾(一番下の行)を呼び出すことで出力を検査できます。

all_names.tail()

画像:https://assets.digitalocean.com/articles/eng_python/pandas/all_names-tail-w.png [all_names.tail outputl]

データセットが完成し、 `+ pandas +`で追加の作業を行う準備が整いました。

データのグループ化

`+ pandas `では、 ` .groupby()`関数を使用して列ごとにデータをグループ化できます。 完全なデータセットに「 all_names 」変数を使用すると、「 groupby()+」を使用してデータを異なるバケットに分割できます。

データセットを性別と年別にグループ化します。 次のように設定できます。

group_name = all_names.groupby(['Sex', 'Year'])

コードを実行して、 `+ ALT + ENTER`で続行できます。

この時点で、単に `+ group_name +`変数を呼び出すと、次の出力が得られます。

Output<pandas.core.groupby.DataFrameGroupBy object at 0x1187b82e8>

これは、それが `+ DataFrameGroupBy +`オブジェクトであることを示しています。 このオブジェクトには、データをグループ化する方法についての指示がありますが、値を表示する方法については指示しません。

値を表示するには、指示を与える必要があります。 たとえば、テーブルを返すために、 + .size()++ .mean()+、および `+ .sum()+`を計算できます。

`+ .size()+`から始めましょう:

group_name.size()

コードを実行して `+ ALT + ENTER +`を続行すると、出力は次のようになります。

OutputSex  Year
F    1880      942
    1881      938
    1882     1028
    1883     1054
    1884     1172
...

このデータは適切に見えますが、より読みやすくなる可能性があります。 `+ .unstack +`関数を追加することで読みやすくすることができます:

group_name.size().unstack()

コードを実行し、「+ ALT + ENTER +」と入力して続行すると、出力は次のようになります。

画像:https://assets.digitalocean.com/articles/eng_python/pandas/group_name-size-unstack.png [group_name.size().unstack()output]

このデータが示すことは、各年に女性と男性の名前がいくつあったかということです。 たとえば、1889年には、1,479人の女性の名前と1,111人の男性の名前がありました。 2015年には、18,993人の女性の名前と13,959人の男性の名前がありました。 これは、時間の経過とともに名前の多様性が大きくなることを示しています。

生まれた赤ちゃんの総数を取得したい場合は、 `+ .sum()`関数を使用できます。 それをより小さなデータセットに適用してみましょう。前に作成した単一の ` yob2015.txt `ファイルから設定された ` names2015 +`です。

names2015.groupby(['Sex']).sum()

「+ ALT + ENTER +」と入力してコードを実行し、続行します。

image:https://assets.digitalocean.com/articles/eng_python/pandas/names2015-groupby-sex-sum-w.png [names2015.groupby([‘Sex’]).sum()output]

これは、2015年に生まれた男性と女性の赤ちゃんの総数を示しています。ただし、その年に5回以上名前が使用された赤ちゃんのみがデータセットにカウントされます。

+ pandas + `+ .groupby()+`関数を使用すると、データを意味のあるグループに分割できます。

ピボットテーブル

ピボットテーブルは、データの要約に役立ちます。 1つのテーブルに保存されたデータを自動的にソート、カウント、合計、または平均化できます。 次に、それらのアクションの結果を、その要約データの新しいテーブルに表示できます。

`+ pandas `では、 ` pivot_table()+`関数を使用してピボットテーブルを作成します。

ピボットテーブルを作成するには、まず、操作するDataFrameを呼び出し、次に表示するデータ、およびそれらのグループ化方法を呼び出します。

この例では、 `+ all_names +`データを使用して、一方の次元で名前、他方の年でグループ化された赤ちゃんのデータを表示します。

pd.pivot_table(all_names, 'Babies', 'Name', 'Year')

「+ ALT + ENTER」と入力してコードを実行し、続行すると、次の出力が表示されます。

image:https://assets.digitalocean.com/articles/eng_python/pandas/pivot-babies-name-year.png [pd.pivot_table(all_names、 ‘Babies’、 ‘Name’、 ‘Year’)output]

これは多くの空の値を示しているため、NameとYearを1つのケースでは行として、もう1つのケースでは列としてではなく、列として保持することができます。 これを行うには、データを角かっこでグループ化します。

pd.pivot_table(all_names, 'Babies', ['Name', 'Year'])

コードを実行して続行するために「+ ALT + ENTER +」と入力すると、このテーブルには各名前の記録されている年のデータのみが表示されます。

OutputName       Year
Aaban      2007     5.0
          2009     6.0
          2010     9.0
          2011    11.0
          2012    11.0
          2013    14.0
          2014    16.0
          2015    15.0
Aabha      2011     7.0
          2012     5.0
          2014     9.0
          2015     7.0
Aabid      2003     5.0
Aabriella  2008     5.0
          2014     5.0
          2015     5.0

さらに、次のように、データをグループ化して、名前と性別を一方の次元とし、年を他方に持つことができます。

pd.pivot_table(all_names, 'Babies', ['Name', 'Sex'], 'Year')

コードを実行して `+ ALT + ENTER +`に進むと、次の表が表示されます。

image:https://assets.digitalocean.com/articles/eng_python/pandas/pivot-babies-name-sex-year.png [pd.pivot_table(all_names、 ‘Babies’、[‘Name’、 ‘Sex’]、 ‘年’)出力]

ピボットテーブルを使用すると、既存のテーブルから新しいテーブルを作成できるため、そのデータをどのようにグループ化するかを決定できます。

データを視覚化する

`+ matplotlib `のような他のパッケージで ` pandas +`を使用することで、ノートブック内のデータを視覚化できます。

長年にわたる特定の名前の人気に関するデータを視覚化します。 そのためには、インデックスを設定および並べ替えて、特定の名前の人気の変化を確認できるデータを再加工する必要があります。

`+ pandas +`パッケージを使用すると、任意の次元数でデータを保存および操作できる階層またはマルチレベルのインデックス作成を実行できます。

性別、名前、年の情報を使用してデータのインデックスを作成します。 インデックスも並べ替えます。

all_names_index = all_names.set_index(['Sex','Name','Year']).sort_index()

「+ ALT + ENTER +」と入力して実行し、次の行に進みます。ここで、ノートブックに新しいインデックス付きDataFrameが表示されます。

all_names_index

コードを実行し、 `+ ALT + ENTER +`で続行すると、出力は次のようになります。

image:https://assets.digitalocean.com/articles/eng_python/pandas/all_names_index-w.png [all_names_index output]

次に、名前の人気度を経時的にプロットする関数を作成します。 関数「+ name_plot 」を呼び出し、関数を実行するときに呼び出すパラメーターとして「 sex 」と「 name +」を渡します。

def name_plot(sex, name):

ここで、作成したテーブルを保持するための + data +`という変数を設定します。 また、インデックスの値で行を選択するために、 `+ pandas + DataFrame `+ loc `を使用します。 この場合、「 sex 」と「 name 」の両方のデータを参照して、MultiIndexのフィールドの組み合わせに基づいて「 loc +」を作成します。

この構造を関数に書きましょう:

def name_plot(sex, name):

最後に、「+ pp 」としてインポートした「 matplotlib.pyplot +」で値をプロットします。 次に、性別と名前のデータの値をインデックスに対してプロットします。これは、ここでは年です。

def name_plot(sex, name):
   data = all_names_index.loc[sex, name]

「+ ALT + ENTER」と入力して実行し、次のセルに移動します。 これで、指定した名前「+ Danica 」を持つ女性の名前の「 F +」など、選択した性別と名前で関数を呼び出すことができます。

name_plot('F', 'Danica')

ここで「+ ALT + ENTER +」と入力すると、次の出力が表示されます。

image:https://assets.digitalocean.com/articles/eng_python/pandas/name_plot-danica-w.png [Danica Name Plot output]

使用しているシステムによっては、フォントの置換に関する警告が表示される場合がありますが、データは引き続き正しくプロットされることに注意してください。

視覚化を見ると、女性の名前であるダニカの人気は1990年頃にわずかに上昇し、2010年の直前にピークに達したことがわかります。

作成した関数を使用して、複数の名前のデータをプロットすることができます。これにより、さまざまな名前の経時的な傾向を確認できます。

まず、プロットを少し大きくすることから始めましょう。

pp.figure(figsize = (18, 8))

次に、プロットするすべての名前のリストを作成しましょう。

pp.figure(figsize = (18, 8))

これで、 `+ for`ループを使用してリストを反復処理し、各名前のデータをプロットできます。 最初に、これらの性別ニュートラル名を女性名として試します。

pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

このデータを理解しやすくするために、凡例を含めましょう。

pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

for name in names:
   name_plot('F', name)

「+ ALT + ENTER +」と入力してコードを実行し、続行すると、次の出力が表示されます。

image:https://assets.digitalocean.com/articles/eng_python/pandas/name_plot-f-list.png [名前のプロット、女性の名前の出力]

それぞれの名前は女性の名前として徐々に人気を集めていますが、ジェイミーの名前は1980年頃に女性の名前として圧倒的に人気がありました。

同じ名前をプロットしますが、今回は男性の名前としてプロットします。

pp.figure(figsize = (18, 8))

names = ['Sammy', 'Jesse', 'Drew', 'Jamie']

for name in names:
   name_plot('M', name)

pp.legend(names)

繰り返しますが、 `+ ALT + ENTER +`を入力してコードを実行し、続行します。 グラフは次のようになります。

image:https://assets.digitalocean.com/articles/eng_python/pandas/name_plot-m-list.png [名前のプロット、男性の名前の出力]

このデータは、Jesseが一般的に最も人気のある選択肢であり、1980年代と1990年代に特に人気があり、名前全体でより人気があります。

ここから、名前データの操作を続け、さまざまな名前とその人気に関する視覚化を作成し、さまざまなデータを参照して視覚化する他のスクリプトを作成できます。

結論

このチュートリアルでは、データの設定から、データを `+ groupby()`と ` pivot_table()`でグループ化し、MultiIndexでデータにインデックスを付け、 ` `+ matplotlib +`パッケージを使用したpandas + `データ。

多くの組織や機関は、「+ pandas +」とデータの視覚化について引き続き学習するために使用できるデータセットを提供しています。 米国政府は、たとえばhttps://www.data.gov/[data.gov]を通じてデータを提供します。

https://www.digitalocean.com/community/tutorials/how-to-plot-data-in-python-3-using-matplotlibのガイドに従って、「+ matplotlib +」でデータを視覚化する方法の詳細をご覧ください。 matplotlibを使用してPython 3でデータをプロットする]およびhttps://www.digitalocean.com/community/tutorials/how-to-graph-word-frequency-using-matplotlib-with-python-3[Wordの頻度をグラフ化する方法] matplotlibとPython 3]。