CSVファイルが読み込めない

症状

Spyderを使っていてCSVファイルが読み込めなくなる

File b'ファイル名.csv' does not exist

原因

Spyderの設定でワークスペースを変えるとこうなる

対処

パスを通せば良い

path = '++++\名前\'

df = pd.read_csv(path + "dataset.csv",header = None)


パスを移動させても良い

csv_data  = pd.read_csv('./path/dataset.csv')

データの集約とグループ演算をやってみる Pandas

PythonのPandasを使っていると,例えば同じ名前の者同士を一括りにして,平均なり最大値を出したり,という処理を迫られることがあります.私自身,この間それを迫られた訳で,オライリーの本を読んで,どういう挙動を示すか色々試してみました.せっかくなので試した内容を,この記事にメモしておきたいと思います.

www.oreilly.co.jp


さて,今回のデータフレームは下のものを使います.

In [62]: df = pd.DataFrame(
    ...:          {'Time': ['10:00:00', '10:00:01', '10:00:02', '10:00:03', '10:00:04','10:00:05', '10:00:06', '10:00:07', '10:00:08', '10:00:09'],
    ...:         'Sensor': ['T-A', 'T-B', 'T-C', 'T-B', 'T-C', 'T-A', 'T-C', 'T-B' ,'T-B' ,'T-C'],
    ...:          'Value': [25, 30, 104, 52, 41, 91, 102, 40 ,101 ,97]}
    ...:          )

# 今回使用するデータ
In [63]: df
Out[63]: 
  Sensor      Time  Value
0    T-A  10:00:00     25
1    T-B  10:00:01     30
2    T-C  10:00:02    104
3    T-B  10:00:03     52
4    T-C  10:00:04     41
5    T-A  10:00:05     91
6    T-C  10:00:06    102
7    T-B  10:00:07     40
8    T-B  10:00:08    101
9    T-C  10:00:09     97

実験か何かでセンサ類を使って,得られたデータを分析することを想定しています.それぞれ,

  • 'Time':センサデータが得られた時間
  • 'Sensor':センサの型番
  • 'Value':センサから得られた値

を示しています.ちょっと問題設定としては苦しいかもしれませんが,練習のためと思ってご了承ください.

まずは基本的な使い方編

センサの型番で括るとこんな感じです.

# 今回使用するデータ
In [63]: df
Out[63]: 
  Sensor      Time  Value
0    T-A  10:00:00     25
1    T-B  10:00:01     30
2    T-C  10:00:02    104
3    T-B  10:00:03     52
4    T-C  10:00:04     41
5    T-A  10:00:05     91
6    T-C  10:00:06    102
7    T-B  10:00:07     40
8    T-B  10:00:08    101
9    T-C  10:00:09     97

# 'Sensor'で括る
In [101]: df.groupby('Sensor').groups
Out[101]: 
{'T-A': Int64Index([0, 5], dtype='int64'),
 'T-B': Int64Index([1, 3, 7, 8], dtype='int64'),
 'T-C': Int64Index([2, 4, 6, 9], dtype='int64')}

演算をしてみる

括った塊を演算にかけることが出来ます.例えば下の場合は'Sensor'でグルーピングして平均を求めています.

# 'Sensor'で括り,'T-A''T-B''T-C'のそれぞれの'Value'に対する平均値を求める
In [66]: df_mean = df.groupby('Sensor')['Value'].mean()

In [67]: df_mean
Out[67]: 
Sensor
T-A    58.00
T-B    55.75
T-C    86.00
Name: Value, dtype: float64

時間ごとに集計してみよう編

In [63]: df
Out[63]: 
  Sensor      Time  Value
0    T-A  10:00:00     25
1    T-B  10:00:01     30
2    T-C  10:00:02    104
3    T-B  10:00:03     52
4    T-C  10:00:04     41
5    T-A  10:00:05     91
6    T-C  10:00:06    102
7    T-B  10:00:07     40
8    T-B  10:00:08    101
9    T-C  10:00:09     97

ここで無理やりTime列をDateTime 型に変換して列を追加します

In [93]: df2 = df.assign(time2=lambda xx: pd.to_datetime(xx.Time))

In [94]: df2
Out[94]: 
  Sensor      Time  Value               time2
0    T-A  10:00:00     25 2017-02-05 10:00:00
1    T-B  10:00:01     30 2017-02-05 10:00:01
2    T-C  10:00:02    104 2017-02-05 10:00:02
3    T-B  10:00:03     52 2017-02-05 10:00:03
4    T-C  10:00:04     41 2017-02-05 10:00:04
5    T-A  10:00:05     91 2017-02-05 10:00:05
6    T-C  10:00:06    102 2017-02-05 10:00:06
7    T-B  10:00:07     40 2017-02-05 10:00:07
8    T-B  10:00:08    101 2017-02-05 10:00:08
9    T-C  10:00:09     97 2017-02-05 10:00:09

あとは無理やり

In [95]: df2.groupby(pd.Grouper(key='time2', freq='2s')).groups
Out[95]: 
{Timestamp('2017-02-05 10:00:00', freq='2S'): 2,
 Timestamp('2017-02-05 10:00:02', freq='2S'): 4,
 Timestamp('2017-02-05 10:00:04', freq='2S'): 6,
 Timestamp('2017-02-05 10:00:06', freq='2S'): 8,
 Timestamp('2017-02-05 10:00:08', freq='2S'): 10}
In [96]: df2.groupby(pd.Grouper(key='time2', freq='2s')).max()
Out[96]: 
                    Sensor      Time  Value
time2                                      
2017-02-05 10:00:00    T-B  10:00:01     30
2017-02-05 10:00:02    T-C  10:00:03    104
2017-02-05 10:00:04    T-C  10:00:05     91
2017-02-05 10:00:06    T-C  10:00:07    102
2017-02-05 10:00:08    T-C  10:00:09    101

Jupyter Notebookを立ち上げると,一瞬だけコンソール画面が出てから落ちる

Jupyter Notebookって何かとトラブる気がします.
この記事を最初に書いたのは17年の冬ですが,その後違う原因のトラブルに見舞われたので,その時の対処方法をメモしておきます.

1.リンク先に「%HOME%」のような変な値が入る

 Jupyter Notebookが立ち上がらない,起動せずに一瞬だけ下のようなコンソール画面が出てすぐに閉じてしまうという現象がありました.よくみると「No such file or directory: ~~」って言ってます.
 ちなみにこれは一瞬すぎるので撮影するのにちょっと苦労しました.
f:id:shu10038:20170204010500p:plain

原因は何か?

パスの値がおかしいからです.

解決方法

Ⅰ変な値を削除

Jupyter Notebookのショートカットを右クリックしてファイルの場所を開く
f:id:shu10038:20170212190402p:plain

ショートカットを右クリックして,「リンク先」の一番後ろにある%HOME%を消す
f:id:shu10038:20170422092746j:plain

コマンドプロンプトから起動

Anaconda3がインストールされているフォルダに行って直接起動する.もしくはコマンドプロンプトから「Jupyter Notebook」と打つ
C:\Program Files\Anaconda3\Scripts\jupyter-notebook

2.ConfigFileが見当たらない

Jupyter Notebookを起動すると同じく一瞬だけ「No such file or directory: ~~」と出ます.さっきと違うのは,後ろに変な値が無いことです.
f:id:shu10038:20180104105645p:plain
一瞬すぎるので,コマンドプロンプトから直接Jupyterを呼び出します.
f:id:shu10038:20180106120821j:plain
そうすると「No such notebook dir: ~~」と出力されます.

原因は何か?

ディレクトリの場所を変更すると起きます

対処方法

「No such notebook dir: ~~」以下の「~~」の箇所で指定されているディレクトリに下記のように設定ファイル群探して移動させておきました.
f:id:shu10038:20180106122234j:plain

追記

ウィルスバスターが原因でJupyter Notebookが起動しないこともあるらしいです.
teratail.com

Python 3.x:日本語の入ったCSVファイルを読み込んで,データフレームに格納する

日本語の入ったCSVファイルの読み込み方を試行錯誤したので,結果を記しておきました

こんな日本語の入ったCSVファイルを用意します

# testJP.csv
"福岡",1,2
"博多",3,4
"長崎",5,6

結論から先にいうと・・

こうすれば出来ました

import codecs as cd
import pandas as pd

with cd.open("testJP.csv", "r", "Shift-JIS", "ignore") as file:
    df = pd.read_table(file,header=None,sep=',')
    
print(df)    

と書くと・・

    0  1  2
0  福岡  1  2
1  博多  3  4
2  長崎  5  6

ここから下は試行錯誤した結果ですよ

普通に読み込ませると・・・

import pandas as pd

df = pd.read_csv('testJP.csv')

と書くと...

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

読み込めませんでした,,,

cdを使うと??

import codecs as cd
import pandas as pd

with cd.open("testJP.csv", "r", "Shift-JIS", "ignore") as file:
    df = pd.read_table(file,header=None)
    
print(df)  

と書くと・・・

   福岡,1,2
0  博多,3,4
1  長崎,5,6

ただこれは見ての通り,カンマで区切られてないみたいなんですね~

import codecs as cd
import pandas as pd

with cd.open("testJP.csv", "r", "Shift-JIS", "ignore") as file:
    df = pd.read_table(file,header=None)
    
print(df)    

と書くと・・・

        0
0  福岡,1,2
1  博多,3,4
2  長崎,5,6

おぉ,,

結論は??

無理やり区切る

import codecs as cd
import pandas as pd

with cd.open("testJP.csv", "r", "Shift-JIS", "ignore") as file:
    df = pd.read_table(file,header=None,sep=',')
    
print(df)    

と書くと・・

    0  1  2
0  福岡  1  2
1  博多  3  4
2  長崎  5  6

下記も参考に
publicjournal.hatenablog.com

PythonでK-means法を試してみた

 久しぶりにPython機械学習的なことをやってみました.今回は教師なし学習としてクラスター分析のソースコードを書いてみて色々試しました.

ソースコード

 こんな感じで書いてみました.

 

 上のソースコードはファイル出力とか省いていますが,省かないで実際に使ったデータセットなども含めた版はこちらです.(自分用)

 

実際にやってみる

次のような明らかに3分割されたデータを使って,3つのクラスターに分けてみました.

f:id:shu10038:20170226181017p:plain

クラスターに分類た結果は次のとおりです.それぞれのクラスターに,赤,青,緑で色を付けています.

f:id:shu10038:20170226181019p:plain

 まぁ,これは簡単だから出来て当たり前ですね.

 こんなデータはどうだろうか?

次に,こんな風に円状の塊のそとにデータ群が囲っている状況を考えます.これを2つのクラスターに分けるとどうなるのでしょうか?

f:id:shu10038:20170226181018p:plain

下が,分けた結果です.真ん中と外で別れるものかと思ったらそうではないですね.

f:id:shu10038:20170226181020p:plain

実はこの円形のデータセットは,ネットでKmeans法を調べると例題としてよく乗っているやつです.なんでもカーネル法を使うと上手く分けられるそうな.また後日試してみます.

参考

検索してすぐ出てきたやつを参考にしました

Python3:CSVファイルの入出力について色々

Pandasを用いたCSVファイルの入出力について色々試してみました.下の英語ドキュメントに詳しく書いてあるんですが,自分がよく使うものだけピックアップしてメモしておきます.

テスト用にこんなCSVファイルを用意します
text1.csv ↓

hakata@hukuoka+900,100,1981
kitakyuushuu@hukuoka+900,200,1954
iiduka@hukuoka+900,300,1971

もくじ

1.読み込み編

ⅰ.普通に読み込んだ場合は一行目がheaderになる

とくに何も引数を指定しない場合は,一行目がheaderになるようです

In [1]: import pandas as pd
     df = pd.read_csv('text1.csv') # データフレームを作る
In [2]: df
Out[2]: 
         hakata@hukuoka+900  100  1981
0  kitakyuushuu@hukuoka+900  200  1954
1        iiduka@hukuoka+900  300  1971

ⅱ.headerを無しを指定すると適当な数が埋め込まれる

引数に,header=Noneを指定すればいけます.

In [3]: df = pd.read_csv('text1.csv',header=None)
In [4]: df
Out[4]: 
                          0    1     2
0        hakata@hukuoka+900  100  1981
1  kitakyuushuu@hukuoka+900  200  1954
2        iiduka@hukuoka+900  300  1971

ⅲ.headerやindexに名前をつけたい場合namesなどを使う

In [5]: df = pd.read_csv('text1.csv' ,names=('c1','c2','c3'))
In [6]: df
Out[6]: 
                         c1   c2    c3
0        hakata@hukuoka+900  100  1981
1  kitakyuushuu@hukuoka+900  200  1954
2        iiduka@hukuoka+900  300  1971

ⅳ.カンマ以外で区切りたいとき

たとえば"@"区切る場合はsepを使う

In [7]: df = pd.read_csv('text1.csv', header=None,sep='@')
In [8]: df
Out[8]: 
              0                     1
0        hakata  hukuoka+900,100,1981
1  kitakyuushuu  hukuoka+900,200,1954
2        iiduka  hukuoka+900,300,1971

"@"でも"+"でもカンマでも区切りたい場合はsep='[@+,]'みたいに書く

In [9]: df = pd.read_csv('text1.csv', header=None,sep='[@+,]')
In [10]: df
Out[10]: 
              0        1    2    3     4
0        hakata  hukuoka  900  100  1981
1  kitakyuushuu  hukuoka  900  200  1954
2        iiduka  hukuoka  900  300  1971

ⅴ.特定の列をindexにしたいとき

index_col=[指定したい行]で指定するそうです.

In [11]: df = pd.read_csv('text1.csv', index_col=[0])

In [12]: df
Out[12]: 
                          100  1981
hakata@hukuoka+900                 
kitakyuushuu@hukuoka+900  200  1954
iiduka@hukuoka+900        300  1971

ⅵ.convertersを用いて特定の列だけ置き換える

import pandas as pd

# 置き換え
def sub(x):
    y = x.replace('@', '').replace('+900', ' ')
    return (y)

# convertersに渡す
conv = {                
    0: sub, # データフレーム0列目に対してsub関数を呼び出す
    1: sub, # データフレーム1列目に対してsub関数を呼び出す
          }
          
# データ読み込み         
df = pd.read_csv('testCSV1.csv', header=None,converters=conv)

# 出力
print(df)    

と書くと

                      0    1     2
0        hakatahukuoka   100  1981
1  kitakyuushuuhukuoka   200  1954
2        iidukahukuoka   300  1971

と出力される

↓参考
stackoverflow.com

2.書き込み編