【Python】pandasというライブラリを使ってCSVファイルを読み込み、グラフを作成する。

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、CSVの読み込みに関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

```csvs:売上.csv
部門,１月,２月,３月
商品A,600,700,800
商品B,4100,3800,4500
商品C,2900,1800,3000
商品D,800,900,1000
```

上記のようなCSVファイルを読み込み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/39ef02e3-bafc-f91b-3f56-d63807f9d32a.png)

この様な棒グラフを作り貼り付けたいです。

# pandasをインストール

```
pip install pandas
```

先ずはデータ解析用のライブラリ「pandas」をインストールします。

# CSVを読み込む方法

### read_csvメソッド

```python
pd.read_csv('ファイル名',
　　　　　　 encoding='読み取り時に使用する文字コード(今回はutf-8)')
```

CSVはpandasのread_csvメソッドで読み込めます。

読み取り時に使用する文字コードは他には「shift_jis」ぐらいでしょうか。
どんな差があるのか理解できていないです。
今のところ、「utf-8」のほうがエラーが出なかったです。

この、読み込んだCSVファイルはDataFrameというオブジェクトになります。
今回はDataFrameというオブジェクトになるとだけ覚えることにしました。
調べてたら、内容が多くて理解が追い付かない・・・。

### dataframe_to_rows関数

```python
dataframe_to_rows(DataFrameオブジェクト, index=None, header=True)
```

DataFrameオブジェクトに、dataframe_to_rows関数を使うことで
データを１行ずつ取り出す事が出来ます。

ここで、気を付けないといけないことがインデックスと、ヘッダーで
index, headerでそれぞれ設定します。

index引数、header引数には「True」「False」「None」を設定できます。

今回は後で行うグラフの設定の為に
index引数は「None」、header引数は「True」を選択しています。

参照にするファイルがどういったものなのかを判断して設定する必要があります。

# Worksheet.appendメソッド

```python
ws.append(リストや辞書)
```

dataframe_to_rows関数で取得した行を、
Worksheet.appendメソッドでシートに貼り付けます。

appendメソッドは、シートに行単位で値を設定できる、便利なメソッドですね。
グラフ作成だけじゃなくて、使用頻度が高そうです。

# 棒グラフを作成する。

棒グラフ作成には、BarChartオブジェクトを使います。

```python
bar = BarChart()

# 縦棒グラフに設定
bar.type = 'col'

# 横棒グラフに設定
bar.type = 'bar'
```

縦・横・の設定も合わせて行います。

次にセルを選択してグラフデータの範囲を決めます。

### Referenceオブジェクト

```python
Reference(Worksheetオブジェクト, min_col=最小の列番号, min_row=最小の行番号,
                                max_col=最大の列番号, max_row=最大の行番号)
```

上記のように、Referenceオブジェクトを使用して範囲を決めます。

### add_dataメソッド

```python
bar.add_data(Referenceオブジェクト, titles_from_data=データの１行目を凡例項目にする際は「True」)
```

範囲設定が終わったら、BarChartオブジェクトのadd_dataメソッドで
グラフにデータを追加します。

### set_categoriesメソッド

```python
bar.set_categories(Referenceオブジェクト)
```

初期状態の横軸ラベルは「1,2,3,・・・・」となっているので
ラベルの範囲を別途Referenceオブジェクトで用意して

BarChartオブジェクトのset_categoriesメソッドでグラフの横軸ラベルに設定します。

# Worksheet.add_chartメソッド

```python
ws.add_chart(BarChartオブジェクト, 'グラフを追加するセル番地')
```

最後に、Worksheet.add_chartメソッドで、シートにグラフを追加したら完成です。

# 最終的なコード

```python
import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

# CSVファイル読込み
df = pd.read_csv('売上.csv', encoding='utf-8')
for row in dataframe_to_rows(df, index=None, header=True):
    # データを１行ずつ追加
    ws.append(row)

# 棒グラフを選択
bar = BarChart()

# 縦棒グラフに設定
bar.type = 'col'

# グラフのデータ範囲を設定
data = Reference(ws, min_col=2, min_row=1,
                 max_col=ws.max_column, max_row=ws.max_row)

# ラベルの範囲を設定
labels = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)

# グラフにデータを追加
bar.add_data(data, titles_from_data=True)

# 横軸のラベルを追加
bar.set_categories(labels)

# 横軸タイトルを追加
bar.x_axis.title = '部門'

# 縦軸タイトルを追加
bar.y_axis.title = '売上高(千円)'

# グラフのタイトルを追加
bar.title = '部門別売上高'

# 棒グラフをシートに追加
ws.add_chart(bar, 'A9')

wb.save('部門別売上_棒グラフ.xlsx')
```

今回はなかなか、すんなり理解できず苦しみました。

CSVを張り付けたら、それを元とした
BarChart()オブジェクトと言う棒グラフの「箱」を用意して
タイトルやラベルの等パーツをCSVのデータを参考に取り付けて行って棒グラフを作り
シートにそれを張り付ける

といった感じでしょうか。

う～ん。もっとうまく表現できたら・・・。語彙力が欲しい。