Oh! Yummy!!

プログラミングとか投資のこととかご飯のこととかを書きます。

C言語 fgets関数 引数 標準入力

自分の研究が大詰めなので久々の更新になってしまった。

C言語の標準ライブラリに、fgetsがある

char *fgets(char *line, int maxline, FILE *fp)

標準入力が3番目の引数に使えることをさっき知ったのでそのメモ。
使い方としては

#include<stdio.h>
int maxline=100;
int main()
{
    char line[maxline];
    fgets(line, maxline, stdin);
}

stdinと指定すればよいらしい
勉強になりました。

pandasで0の要素を欠損値(NaN)にする方法

データフレーム型を扱うときに0.0を欠損値(NaN)にしたい場面は多い(私の場合)
今までは

import pandas as pd
a = pd.read_csv("sample.csv")

で読み込み

import numpy as np
b = np.array(a)

でnumpyの配列に変換し

for n in range(b.size):
    if b[n] == 0.0:
        b[n] = float(NaN)

で欠損値にしていた.
しかし,この手法は相当面倒である.
またデータフレーム型に直さなければならないし
そこで,画期的(私にとっては)な方法を知ってしまった.

import pandas as pd
a = pd.read_csv("sample.csv")
b = a[a!=0.0]

これだけでできてしまった.
これまでの苦労は...(こんなことは日常茶飯事なので前向きに)

pandasでcolumnsとindexの名前を変更する方法

今回はpandasを使ってデータフレーム型のcolumnsとindexの名前を変える方法をかる〜く紹介

>>>data
     a     b
0  4.5   2.1
1  5.4   8.3
2  7.6   5.5

dataに対して名前を変更する

>>>data.columns = ['name1','name2']
>>>data.index = ['index0','index1','index2']
>>>data
         name1   name2
index0     4.5     2.1
index1     5.4     8.3
index2     7.6     5.5

このように簡単に変更できる.
データ数が膨大になってくると面倒

weka csv読み込み シェル上からエラー特定ワンライナー

筆者が研究中にcsv形式のデータをwekaに読みこませるとエラーが出たので,原因部分を特定するために書いたワンライナーをメモ

pythonのpandasなどでは統計量をまとめて取得できる.

import pandas as pd
data = pd.read_csv("sample.csv")
a = data.describe()

これによりaには

count
mean
std
min
25%
50%
75%
max

が格納されている.
各統計量の説明は本筋ではないので省く.
このような処理によって以下の様なデータができたとして

,count,mean,std,min,25%,50%,75%,max
file1,46,5.0,9.0,0.0,3.0,5.5,7.2,11.0
file2,65,6.7,8.0,0.0,3.2,6.5,8.8,12.1
...

筆者の場合,約9000行,650列ほどデータがあるのでエラーがあると特定するのが困難である.
そこで,シェル上で以下を実行し,その都度wekaに読み込ませて原因を特定する手法をとった.

$cat filename.csv | grep count | awk -F, '{printf("%s,",$1);{for(i=n;i<m;i++)printf("%s,",$i)}printf("%s\n",$m)}' > newfile.csv
$cat filename.csv | grep file | awk -F, '{printf("%s,",$1);{for(i=n;i<m;i++)printf(%lf,",$i)}printf("%lf\n",$m)}' >> newfile.csv

いわゆるシェル芸(ワンライナー)というものである.
2行になっているのは許して下さい(こんなのシェル芸じゃないという意見は受け入れます.)
nとmの値を書き換えてエラーが出たら範囲を半分,さらにその半分と、エラーの位置を特定していく.

結果的には % という文字が原因だった
wekaでは%が読み込めないようだ(設定によるだろうか?)
%をperに書き換えてwekaに読み込ませることに成功した.

結構な時間を原因特定にかけてしまった...(もう同じミスはしないだろう)
同じミスをした人が早くこの記事を見つけることを願うばかりである.

pandasを使ってcsvデータを読み書き

pandasを使ってデータフレーム(DataFrame)型のデータをいじる方法をメモ.
私がよく使うものだけ.

まず

import pandas as pd

pdが一般的らしい.
そしてcsvファイルを読み込む(csvとはカンマ区切りのデータ,スペース区切りはssv,タブ区切りはtsv).
オプションで指定すればssv,tsvも読み込めるがデフォルトはcsv.
/home/user/sample.csvを読み込む

#index列がない場合
a = pd.read_csv("/home/user/sample.csv")

#index列がある場合
a = pd.read_csv("/home/user/sample.csv",index_col=0)

次は書き込み(出力)
/home/user/sample-a.csv に出力

#index列を出力しない場合
a.to_csv("/home/user/sample-a.csv",index=False)

#index列ごと出力する場合
a.to_csv("/home/user/sample-a.csv")

こんな感じです。
最近は研究が忙しくブログがかけない.

python ディレクトリ(フォルダ)内のファイル名をlistで取得

pythonを用いてディレクトリ内のファイル一覧をlist型で取得する。
この操作はかなり使うことが多いと思う。(私はよく使う)
/home/user/Hatenaというディレクトリの直下に a.txt, b.txt, c.txt が存在すると仮定して
各ファイル名を出力させる

import os

filenames = os.listdir("/home/user/Hatena")
for txtfile in sorted(filenames):
    print txtfile

出力は

a.txt
b.txt
c.txt

が得られる。
ディレクトリの中でもソートされていると思うが私は念のためソートする事が多い。

※最近はpathlibを使うことが多いらしいです.

python でFizzBuzz問題(C でナベアツ問題)

プログラミングの有名な問題のひとつに "FizzBuzz問題" がある。
1,2,3,4,5,6,7...のような数列の要素が
3で割り切れる場合は Fizz
5で割り切れる場合は Buzz
両方で割り切れる場合は FizzBuzz
と出力するような問題である。
ほしい出力は以下。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...

この問題を python で実装していきたいと思う
早速コードを書いてみた

for i in range(1,100):
    if i % 15 == 0:
        print "FizzBuzz"
    elif i % 3 == 0:
        print "Fizz"
    elif i % 5 == 0:
        print "Buzz"
    else:
        print i

これで上のような出力が得られるはずである。

もっと良いアルゴリズムがあるんだろうか?
ご存じの方は教えて下さいm(..)m

そういえばこの問題「ナベアツ問題」っていってるのどこかで見たな(笑)
実装してみますか
どうせだからC言語
3の倍数と3の付く数字の時はアホになって、5の倍数で犬になります。
ちょっと難しいな...

#include<stdio.h>

int i;
int main(void)
{
    for(i=0;i<15;i++)
    {
        if(i%15==0) printf("ワホーン!\n");
        else if(i%10==3 || i%3==0) printf("サァァン\n");
        else if(i%5==0) printf("ゴフッッツ\n");
        else printf("%d\n",i);
    }
}
//これは6でもサァァンっていうやつだな。

ナベアツさんには程遠いな...

個人的にはエド・はるみさんとか藤崎マーケットさんのネタが好きだなぁ

...以上!!