koji/メガネ男の日誌

日々の学び、活動状況を記録します。仕事のことは少なめ。

to_csv() で csv ファイルを書き出したらカラムが文字化けする件

f:id:kj_man666:20200403223829j:plain

pythonにてカラムが漢字のcsvファイルをDataFrame型で読み込んで加工し、csvファイルに書き出してエクセルで開いたら、カラムが文字化けしてしまったので、文字化け防止の方法をまとめます。

データは下記のものを想定します。

f:id:kj_man666:20200403224149p:plain

コードは以下のとおりです。

# ライブラリ
import pandas as pd
import os

# パスの取得
path = os.getcwd()

# DataFrame型データの作成
df = pd.DataFrame(
                {"壱":[1,2,3],
                 "弐":[10,15,20],
                 "参":[8, 6, 4]
                }
                )

# 文字化けするcsvファイルの書き出し
df.to_csv(path + "\data1.csv")

このように出力してエクセルで開くと、下記のとおりカラムが文字化けしてしまいます。

f:id:kj_man666:20200403223917p:plain

なお、メモ帳で開くと、ちゃんと漢字で表記されます。

f:id:kj_man666:20200403223909p:plain

csvファイルはエクセルで開くことが多いと思いますし、人にデータを共有するとき、「このカラムどういう意味?」と聞かれると面倒ですよね。

そういう時は、to_csv() のパラメーターに、shift-jis を指定しましょう。

shift-jis は日本語フォントの文字コードです。

ja.wikipedia.org

なお、encodingを何も設定しない場合は、自動的に "utf-8" という文字コードが設定されています。

ja.wikipedia.org

df.to_csv(path + "\data2.csv", encoding="shift-jis")

または、to_excel() 関数を使って、エクセルデータで出力する方法もあります。

この場合は、encoding="shift-jis" の指定は必要ありません。

ただし、openpyxl ライブラリをインストールする必要があります。

pip install openpyxl
df.to_excel(path + "\data3.xlsx")

出力結果 f:id:kj_man666:20200403225422p:plain

参考サイト

www.craneto.co.jp

note.nkmk.me

読み込んだcsvファイルのカラムが2列以上になっている場合の前処理

実務で扱うcsvデータというのは、カタチがキレイでないことが多々あります。

つい最近、次のようなデータを見かけました。

f:id:kj_man666:20200402233444p:plain

・・・カラムが2段になっている・・・

このままではxx1とかxx2とか、無意味な項目がカラムになってしまうし、意味のない行(項目1、項目2等)が入ってしまっている・・・。

どう処理したものか、頭をひねりました。。。

index 1 をコピーして columns を置換する?

あれこれやって、シンプルな回答を得ました。

# ライブラリ
import pandas as pd
import os

# 現在のフォルダのパスを取得
path = os.getcwd() + "/"
path

# read_csv() のパラメーターに、header=1 を追加
pd.read_csv(path + "sample.csv", header=1)

これで index 1 (上から2番目) の項目をカラムとして設定することができました。

f:id:kj_man666:20200402234102p:plain

なお、余談ですが、先ほどのsample.csvは以下のように作成しています。

こちらもご参考ください。

# カラムに相当する項目が2段になっているDataFrame型を作成
df = pd.DataFrame({'分類': ['項目1', 10, 32, 55],
                   'xx1': ['項目2', 45, 78, 9],
                   'xx2': ['項目3', 6, 1, 13],
                   'xx3': ['項目4', 15, 38, 51]})

# sample.csv というcsvファイルを作成
df.to_csv(path + "sample.csv", index=False)

以上になります、最後までお読みいただきありがとうございました。

参考サイト様

note.nkmk.me

pythonのDataFrameを連結するconcatでしょうもないことにつまづいた件

f:id:kj_man666:20200401220731j:plain

pandasのDataFrame型はとても便利ですよね。

似たようなDataFrame型を連結する時、concat()を使うと思いますが、実務でしょうもないことにつまづいたので備忘で書きます。

note.nkmk.me

DataFrame型 df1 と DataFrame型 df2 があるとしまして、

df1 と df2 を連結する際、

エラーが発生する例

df3 = concat( df1, df2 )

正しい例

df3 = concat( [ df1, df2 ] )

わかりますでしょうか、正しい方は() の中に [] が入っていますね。

これで10分以上エラーと格闘してしまいました。。

皆さまお気を付けくださいませ。

以上になります、最後までお読みいただきありがとうございました。

lightGBMを初めて使ったので備忘メモとしてまとめてみた

Kaggleの初心者ですが、M5コンペに挑戦中です。 KaggleではLightGBMが全盛と聞きましたので、備忘メモとしてまとめてみました。

setuptools、 numpy、scipy、 scikit-learn 0.21.3以降のライブラリのインストールが必要です。

詳細は公式ドキュメント参照。 lightgbm.readthedocs.io

データセットは、Kaggle の HousePrice コンペのものを使っています。 www.kaggle.com

理論や背景は先人のサイトに譲りまして、とりあえずぶん回してみるところまでをやってみます。

コードもこちらを参照しています。 www.codexa.net

なお、前提として、特徴量の抽出※、データの欠損値処理、ホールドアウト法処理(train_test_split)、標準化(StandardScaler)をしていますが、本記事ではlightGBMの記載にとどめ、詳細の記載を割愛しています。

※ 目的変数はSalePrice、説明変数はSalePriceと相関係数の高かった①OverallQual、②YearBuilt、③YearRemodAdd、④TotalBsmtSF、⑤1stFlrSF、⑥GrLivArea、⑦FullBath、⑧TotRmsAbvGrd、⑨GarageCars、⑩GarageAreaとしています。

# ライブラリ読込
import lightgbm as lgb

# データセット読込
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test)

# パラメーター設定
params = {'metric': 'rmse',
          'max_depth' : 9}

gbm = lgb.train(params,
                lgb_train,
                valid_sets=lgb_eval,
                num_boost_round=10000,
                early_stopping_rounds=100,
                verbose_eval=50)

こんな感じで出力されます。

Training until validation scores don't improve for 100 rounds [50] valid_0's rmse: 30194.1 [100] valid_0's rmse: 30750.4 Early stopping, best iteration is: [48] valid_0's rmse: 30177

# 予測の実施
predicted = gbm.predict(X_test)

# 予測値の出力
print(predicted)

こんな感じで予測値を作成することができます! f:id:kj_man666:20200329104555p:plain

今後の課題

パラメータの意味や、適切なパラメーターにするにはどうすればいいのかなど、使いこなすためにはまだまだ学ぶことが多いので精進いたします!

以上になります、最後までお読みいただきありがとうございました。

24時間ではしりぬける物理

f:id:kj_man666:20200322083400j:plain

 24時間ぶっ通しで現役物理学者が物理学、高校の物理で習う範囲及びその発展分野について、YouTubeで熱く講義をするイベント、24時間ではしりぬける物理を24時間視聴しましたので、感想とポエムをつづります。

 

※1 正しくは、24時間画面の前にいた、ですが。。

※2 マンガ喫茶の1DAYプランを利用しました。
    おかげさまでマンガがはかどりましたし、ソフトクリームを堪能できました(待て

 

24時間ではしりぬける物理

 講師は東京学芸大学の 小林晋平 准教授です。

 元々開催予定であったイベントがコロナ騒動で流れたことからYouTubeでの開催とされたそうです。
 とにかく小林先生の語る熱量がすごかった!
 こういう先生がいらっしゃるなら講義を聞きに行きたいものです。
 24時間ではしりぬける物理のYouTube動画のアーカイブがもう見れないのが残念です・・・。

→追記3/23(月)にアーカイブをどうするか発表があるそうです!

Twitter
 有料で良いので販売しないかしら。

 

 さてYouTube動画ですが、24時間テレビみたいに、ときどき明らかに休憩するための企画が入るのかな、と思っていたら、全くそんなこともありませんでした。
 視聴者向けの休憩タイム(10分くらい)と(おそらく)ゼミ生による補講タイム以外、本当に小林先生がぶっ通しで、テンション高めに、立って黒板板書しながら講義されているから驚きでした。。

 ダンスで鍛えられているようですが、その後の先生の肩(後半、黒板をスライドさせるのがしんどい、とおっしゃってました)と肺(後半、黒板の粉を吸うので喉が辛いとおっしゃってました)が心配です。。
 お肌もカサカサ、口も口内炎がひどいと最後に仰ってました。。

 

 チャンネルの紹介サイトも見つけ、読みました。

www.businessinsider.jp

 番組の趣旨には共感しかありません。

 高校物理で学ぶ物理学は、どうしても受験対策に偏りがちだ。そこで学んだ内容が、実生活の中ではどのような形で見えてくるのか。
 そして、宇宙やブラックホール、素粒子など、最先端の物理学の中でどういった意味をもつのか分かりにくい。
 小林准教授は、受験科目としての物理学ではなく、物理学を勉強していくことで見えてくるつながりの幅広さや、面白さを伝えようというわけだ

  

『面白い』は大事です。でも、それだけで終わらないようにしたい。終わったあと、思わず本を一冊買ってしまうような講義にしたいです」

 先生の著作もAmazonでポチってしまいましたので、講義は成功と言えましょう笑
ブラックホールと時空の方程式:15歳からの一般相対論

 物理と、最近学びつつ仕事でも取り組んでいるデータサイエンス領域と物理学をうまく組み合わせたいと思います。

計算物理学II ―物理現象の解析・シミュレーション―
 私はすっかり小林先生のファンになりました笑

 
自分と物理

 親が大学で物理学を専攻していたせいか、家に物理関係の本があったり、時々物理について聞かされたりはしていました。

 そのため、超ひも理論とか、ファインマンとか、なんのこっちゃわからないのに、単語だけは知っていたりします。
 それだけ聞くと物理得意そうですが、特に苦手ででして、高校時代赤点でした。。。
 まだ力学の最初あたりは何となく理解できましたが、振り子やバネあたりからだんだん良くわからなくなり、最終的には、なぜ突然電気が出るのか、なぜ急にコンデンサについて学んでいるのかもわからず、物理学が大嫌いになりました。

 今思いますに、思いっきりディスりますが、高校の物理教師の授業が退屈だったんでしょうね。
 もっと言うと、教師本人も授業そのものは退屈していたんじゃないでしょうか。
 説明もそこそこに延々と数式解かされるだけでしたし。
 (教科書にも書いてあったのかもしれませんし、教師も説明していたのかもしれませんが)学問は、なぜそのような理論が構築されるに至ったのか、そもそもどこのどんな人がその理論を作り上げたのか、時代背景はどのようなものだったのか、他のどの理論に派生しているのか、何に使えるのか、を学ばないと、死ぬほどつまらないです。

 行列や線形代数の問題集を解くのはつまらなくても、機械学習やディープラーニングに必要となったら、必死で学びますし、なんで三角関数なんか勉強するの?という学生さんでも、音楽が好きで音の加工には三角関数を駆使するとなったら楽しく学べるんではないでしょうか。

 

 以上になります、最後までお読みいただきありがとうございました!

PySparkの環境構築に成功したのでまとめてみた

f:id:kj_man666:20200313184859j:plain

 GCIセミナーでpythonで大規模データを扱えるPySparkの存在を知りました。

 環境構築は各自挑戦とのことでしたので、やってみたところ、うまくいったのでまとめます。

 前提は以下のとおりです。

 ・ローカル環境での構築には成功したが、Anacondaなどの仮想環境上の構築はうまくいっていない  ・Windows10 Home 64bit  ・Python3.7.1

 手順は以下のとおり。

Sparkをインストールする

 こちらのサイトからSparkをダウンロードします。

spark.apache.org

 いくつかバージョンがあるようですが、私はこちらで設定しました。

f:id:kj_man666:20200313191721p:plain

 ダウンロードされた圧縮ファイルの拡張子が .tgz と私には見慣れないものでしたが、Lhaplus で無事解凍。

 解凍したフォルダはとりあえず C ドライブに配置しました。

 加えて、WindowsでSparkを実行するためには、Hadoopの依存関係を解決するため(よくわかってない)winutils.exe というファイルを取得しする必要があるそうです。

winutils.exe

 ダウンロードしたら、winutils.exeファイルを、先ほど展開したSparkのフォルダの直下にある、binフォルダの直下に保存します。

Spark の環境変数を設定する

 このままですと環境変数が設定されておらず、うまくプログラムが開かれません。

 ウィンドウズの設定画面から、環境変数の設定画面を開きます。

f:id:kj_man666:20200313192813p:plain
左下の歯車のアイコンをクリック
f:id:kj_man666:20200313204848p:plain
環境 と入力すると、環境変数の設定画面を出せる

 HADOOP_HOME のパスを、 先ほど展開した Spark のフォルダのアドレスに設定しましょう。

(例:C:\spark-2.4.5-bin-hadoop2.7)

 参考サイトですと、コマンドプロンプトで設定する方法もあったのですが、自分はなぜか保存がうまくいかなかったので、設定画面でやってみました。

 同じ様に、 SPARK_HOME のパスも、同様に先ほど展開した Spark のフォルダのアドレスに設定します。

 こんな感じになるはず。

f:id:kj_man666:20200313193902p:plain

f:id:kj_man666:20200313193904p:plain

java 8もインストールする

 次に java をインストールします。

 ブログを書いている時点ですと、java13 が最新ですが、java13でやるとエラーが発生しました。

 調べると、java10でやったらエラーが出たので、java8で環境を構築した、という記事を見つけました。

 現時点ではjavaのどのバージョンまで対応しているのかわかりませんでしたので、java8 で環境構築しました。

 ダウンロードには Oracle のアカウント作成を求められるので、事前に登録してください。

www.oracle.com

 

java の環境変数も設定する

 Spark のデータと同じように、java も環境変数を設定する必要があります。

 JAVA_HOME のパスを、java の Runtime Environment (JRE) のフォルダに設定します。

(例:C:\Program Files\Java\jre1.8.0_241)

こんな感じになるはず。 f:id:kj_man666:20200315122405p:plain  

コマンドプロンプトでSpark と PySpark を立ち上げてみる

 これで Spark の設定は完了です。

 コマンドプロンプトを立ち上げて、次のコマンドを打ち込んでSpark を立ち上げてみましょう。

spark-shell

 この画面が出れば成功です!

f:id:kj_man666:20200313195217p:plain

 Spark を停止するときは次のコマンドを入力します。

:quit

 次にPySpark も立ち上げてみましょう。

 コマンドプロンプトで、次のコマンドを入力してみましょう。

pyspark

 次の画面が表示されれば成功です!

f:id:kj_man666:20200313195438p:plain

 PySpark を停止するときは、先ほどと違い、

exit()

と入力しましょう。  

コマンドプロンプトで立ち上げたjupyter notebook上でPySparkを立ち上げてみる

 これで環境構築は無事終了です!

 最後に jupyter notebook で PySpark が動くかどうか見てみましょう!

 jupyter notebook のインストールはこちらのサイトが参考になりました! water2litter.net

 ついでに、findspark ライブラリもインストールしておきましょう!

 コマンドプロンプトに下記のコマンドを打ち込んで、jupyter notebook を立ち上げます。

jupyter notebook

 立ち上がったjupyter の画面に、下記のコマンドを打ち込みます。

import pyspark # only run after findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()

df = spark.sql('''select 'spark' as hello ''')
df.show()

 次の結果が出力されれば完成です! f:id:kj_man666:20200315122157p:plain

参考サイト

codezine.jp qiita.com www.programmersought.com goodbyegangster.hatenablog.com stackoverflow.com   最後までお読みいただきありがとうございました!

プログラミング初心者からは抜け出したので、振り返りをしてみる

f:id:kj_man666:20200302210535j:plain

 自称ではありますが、30代も後半になって、ようやくプログラミング初心者から抜け出したかな?と思えるようになりました。

 そこで、初心者のころを振り返って、今と何が違うのか考察してみたポエムをつづります。
 なお、具体的な勉強法については触れていませんのでご了承ください。

 

 そんなんじゃぬるい!とか、本来の定義と違う!、言われるかもしれません。

 ですが、脱初心者の定義を、私なりに設定いたしました。

 これが正しい定義だ!等ございましたら、コメントまでいただけると幸いです。

脱初心者の定義

 ググって自力でエラーを解消できる。

 求められた簡単な機能に対応するプログラムを書くことができる。

 今まさにプログラミングを勉強されいる方々のお役に少しでも立てれば幸いです。

 

 

プログラミング言語の選択

◆初心者のころ
 ウェブやゲーム制作、分析や自動化等、できることの多い最強のプログラミング言語探しにこだわってしまう。
◆今はこう思う
 解説サイトや書籍の数が多そうなプログラミング言語を選んで、とりあえずやってみればええやんと思う。

 

プログラミングで何をやればいいのか

◆初心者のころ
 いろんなジャンル(ゲーム制作、ウェブ制作、分析等)に満遍なく手を出そうとする。
◆今はこう思う
 一番興味持ったこと、仕事に関係することをとりあえずやり続ける。

 

学習方法

◆初心者のころ
 書籍選びやスクール探し、学習サイトはどれがいいのか、やりもしないうちからこだわってしまう。
◆今はこう思う
 とりあえずやりやすいことから初めてみて、わからないところはググるか、わかる人に聞けばいいと思うようになる。

技術書の読み方

◆初心者のころ
 丁寧に読みすぎて読み終われず挫折する。
◆今はこう思う
 読みやすい技術書を探す。
 読み切ることを重視して、パラパラめくって読む。
 ググってサイトで情報を得て補間する。 

プログラミングの関数や構文が覚えられないことについて

◆初心者のころ
 丸暗記しようとする。
 忘れてしまうと自分を責める。
 勉強の間がすぐ開いてしまう。
◆今はこう思う
 毎回忘れて毎回調べるが、そんなものだと割り切っており、特に気にしなくなる。
 何度も調べていると、ぼんやりとだが割と覚えていることに気づく。
 どうやって調べたらいいかだけは覚えている。
 毎日数分でもいいから、できることをやる。

環境構築

◆初心者のころ
 本を読んで出来なかったら挫折する
◆今はこう思う
 なるべく楽に環境構築できるツール、サイト、解説本をひたすら探す。
 人にすぐ聞く。
 解析本、解析サイトと環境のバージョンを揃えることの大事さを痛感する。

 

エラーが出たら

◆初心者のころ
 エラーは出ないものだと思っている。
 エラーが出たら自分を責める。
 エラーが出たらそこで諦める。
◆今はこう思う
 エラー内容をすぐググる。
 入力ミス、バージョンがあってないと言った単純な理由がほとんどだし、割とすぐ直るので特に自分を責めない。

自分はプログラミングに向いているか否か論

◆初心者のころ
 つまづくと、すぐ自分は向いていない、と考えてしまう。
◆今はこう思う
 個性は人それぞれで変えられないので、自分の特性を活かす方法を考える。

 

 以上になります、最後までお読みいただきありがとうございました。