テービーテックのデータサイエンス

未経験リケジョがゼロからデータサイエンティストを目指す姿を記す奮闘記です。2019/12/05文系出身者が共同で更新を開始

TAG index

▲前回こまごまと躓いたことを整理~csvファイルの読み込み~

f:id:TBT_matsu:20200305132440p:plain

こんにちは
テービーテックの村松です

ds-blog.tbtech.co.jp

前回こちらの記事の中でcsvファイルを読み込みからデータを整えるまでを端折ったので、今回はそこをピックアップします(リアルに躓いた場所を拾いつつ)

データ元

気象庁|過去の気象データ・ダウンロード」から豊田市の過去10年分のデータ拝借いたしました
一度に読み込めるデータ量に上限があるため、2回に分けてダウンロードしました

さて、始めようかな・・・

#pandasをインポートしてcsvファイルの読み込み
import pandas as pd
_df1 = pd.read_csv('ファイル名2010-2014')
_df2 = pd.read_csv('ファイル名2015-')

私<今回は2つだけだしfor文でなくてもいっかー(Shift+Enter)
Google Colab<エラーだよ

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 0: invalid start byte

出だしからか・・・
「ちょっとその文字表示できないです(意訳)」と言われました
調べてみるとcsvファイル内の何か文字コードがutf-8とうまく変換できないとのこと・・・
日本語はよく引っかかるみたいですね

解決策

標準で設定されている文字コードは世界標準の統一規格「utf-8」
これを日本語対応の文字コードに変更すれば良いようです
日本語対応の文字コードとしては「cp932」と「shift_jis」がよく目につきました

では、引数「encoding=」を指定します
これで任意の文字コードに変更できます

_df1 = pd.read_csv('ファイル名2010-2014',encoding='cp932')

今回は「cp932」と「shift_jis」どちらでも問題なく読み込めました
中身を表示してみますと、
f:id:TBT_matsu:20200305102623p:plain
こんな感じです
・・・色々いならない部分がありますね

次はデータの形を整えてみましょう

ちょっといつもと違うことしてみようかな

いつもは「.drop()」や「.iloc[]」などを使ってデータの形を整えていたのですが、
先ほど「.read_csv()」の引数を調べた時に、ファイルの読み込み時に色々設定できることをチラ見したのでせっかくなので使ってみようと思い立ちました

今回やりたいことは3つ

  • カラムの行を設定する
  • 指定のカラムの列を抜き出す
  • 不要な行を消す
「.read_csv()」の引数

今回使用する引数はこちら
「header=」→カラムとなる行を指定
「usecols=」→指定した列のみを読み込み
「skiprows=」→不要な行を飛ばして読み込み

どんなふうに変わっていくか一つずつやってみます

まずは「header=」を2行目で指定
指定した行より上は自動的に読み込みの対象外になります

_df1 = pd.read_csv('ファイル名2010-2014',encoding='cp932',
                   header=2)

f:id:TBT_matsu:20200305103218p:plain

次に「usecols=」に年月日と実測値が入っている列のみを指定

_df1 = pd.read_csv('ファイル名2010-2014',encoding='cp932',
                   header=2,
                   usecols=['年月日', '平均気温(℃)', '最高気温(℃)', '最低気温(℃)', '降水量の合計(mm)', '日照時間(時間)'])

f:id:TBT_matsu:20200305103506p:plain

最後に「skiprows=」で指定した行番号をスキップして読み込んでみます

_df1 = pd.read_csv('ファイル名2010-2014',encoding='cp932',
                   header=2,
                   usecols=['年月日', '平均気温(℃)', '最高気温(℃)', '最低気温(℃)', '降水量の合計(mm)', '日照時間(時間)'], 
                   skiprows=[3, 4])
ValueError: Usecols do not match columns, columns expected but not found: ['年月日', '降水量の合計(mm)', '最低気温(℃)', '平均気温(℃)', '日照時間(時間)', '最高気温(℃)']

・・・ん?
「指定された行にそのカラム名無いよ(意訳)」とのこと
さっきは普通に通ったので「skiprows=[3, 4]」がおかしいのだろうと思い、一先ず

_df1 = pd.read_csv('ファイル名2010-2014',encoding='cp932',
                   header=2,
                   skiprows=[3, 4])

これなら動くのかな、と試すと
f:id:TBT_matsu:20200305112601p:plain
・・・あれ?
カラムとして指定していた行が消えていました
行番号の数え方は「header=」と同じつもりでしたが違うんでしょうか・・・?

とりあえず1行ずつずらすと、

_df1 = pd.read_csv('ファイル名2010-2014',encoding='cp932',
                   header=2,
                   usecols=['年月日', '平均気温(℃)', '最高気温(℃)', '最低気温(℃)', '降水量の合計(mm)', '日照時間(時間)'], 
                   skiprows=[4, 5])

f:id:TBT_matsu:20200305113715p:plain
・・・ふむ、通りましたね

これで2つのデータベースを合体させて、インデックス番号を振り直します

#データベースの結合
_df = pd.concat([_df1, _df2])
#インデックス№の振り直し
_df = _df.reset_index(drop=True)

最後にProphet用にカラム名を一部変更したら終わりです

#カラム名の変更
df = _df.rename(columns={'年月日':'ds', '平均気温(℃)':'y'})

f:id:TBT_matsu:20200305115933p:plain


以上、csvファイルを読み込みからデータを整えるまででした