importでdefineできなかったという話
昨日までは動いてたスクリプトが今日は動かず、エラーを吐くという話。
事の発端
Bottleで簡易的にwebサーバを立ち上げてブラウザからRasPiをコントロールしようとしてました。
sampleスクリプトで何度か試していたのですが、今日になったら以下のエラーが。
NameError: name 'route' is not defined
で、どうもimportできていないっぽい。
でも、pipでshowすると、ちゃんとBottleはインストールされてる。
これは一体…とsysをimportしてsys.pathで確認するが、パスは通っている。
でも、importされているはずのnameがnot defined。
かなり悩みました。
結果
sampleから本番スクリプトに変更しようとして「battle.py」というファイルを同ディレクトリに作成していたのでした。同pathにある、こちらのbattle.pyをimportして動作しようとしていたので、そりゃ動かないわな。
ファイル名はちゃんと考えて付けましょうというオチでした。
番外編:Fusion 360の「デザイン」間のコピーについて
かなり紆余曲折して大変だったので自分用メモです。
コピーができない状態
左側のツリーでボディを右クリックした際に「コピー Ctrl+C」と表示されて選ぶことはできます。
ですが、ほかの「デザイン」に移動した際に貼り付けることができない。
原因
ダイレクトモデリングと履歴(ヒストリ)を残していくパラメトリックモデリングの問題でした。 他のデザインからコピーされるボディのヒストリが引き継げないためコピーができないようです。
なので、ダイレクトモデリングに切り替えればコピー&ペーストが可能となります。(Fusion360はこの二つを切り替えながらモデリングできる!なんと便利な。)
方法
「作成」メニューの下部に「基準フィーチャを作成」というコマンドがあり、これを実行するとダイレクトモデリングモードとなります。
ここで他デザインからのボディの貼り付けを行ったり、モデリングの結合などを行うことができます。そして最後に「基準フィーチャを終了」を実行することでまたパラメトリックモデリングに戻ります。
(やはり基本はパラメトリックモデリングをしてほしいみたいですね。個人的にはめんどくさいけど。)
参考blog
pandasとmathでfloatで困った話
pandasとmathでしばし戸惑った。
DataFrameで角度データを作成
floatのdtypeなのを確認して、「よし、degreesからradiansに変換するか」とmath.radians(df['degrees'])
を実行したらエラー。
TypeError: cannot convert the series to <type 'float'>
って、floatダヨ! しばしネットを彷徨い、もういい!自分でradiansに変換する簡単な関数作るか(メソッド作るか…が正しい?)と思ったら、まんまな問い合わせがヒット。
そうですか。
numpy最高!!
mathにdf食わせちゃダメだ。
pandasの便利メモ・1
pandasの細かなノウハウ、テクニック、便利な機能があります。 自分用メモ
pd.to_datetimeで日時を揃える。
日時文字列を高速にパース。C Parser → 正規表現 → tateutil
format引数でフォーマットを指定して柔軟なパースも可能。
欠損値の補完
resample
データのサンプリング周期を変える。
ダウンサンプリングは移動平均的に荒く。
df.resample('resample_time').mean()
(移動平均はdf.rolling(3).mean()
など)
アップサンプリングは細かく。
df.resample('resample_time').interpolate()
補完
上記のアップサンプリングは補完の一種。データ欠損のところを埋めている。
df.interpolate()
plotは便利
df.plot()
で時系列データの周期を自動で調整してプロットしてくれる。
こちらに詳しい。
pandas入り口まとめ
何度も躓いているので、とりあえず流れというか入門用の入り口を自分用にまとめておきます。
Series
一次元のデータというけど、ラベルも付けられるからn行2列の二次元データだと思うんだよね。
s = pd.Series( { 'hoge' : 123.456, 'huga' : 3455.23, 'piyo' : 5000.88 } )
とpandasのメソッド(!)で「s」というSeriesを作成する。 辞書から作るほうが視覚的に分かりやすいかな。
medianやlogもSeriesで使える…けど、ちょっと使い方に注意。
s.median()
だけど、logはnumpyを使うからnp.log(s)
と渡す。メソッドと引数渡し、紛らわしいね…。
SeriesにはName属性で名前をつけることが出来る。…はい。
DataFrame
こちらはn行n列の表として分かりやすいデータ形式。
行はindex、列はcolumnsのラベルを持つ。時系列の複数データなど得意。
手動でデータを作ることはそう無いと思う。普通はCSVなどで読み込むでしょう。なのでread_csvという便利なメソッドが!
df = pd.read_csv( './csv_data.csv', index_col = 'name', header = 0)
列ラベルとして使う行をheaderで指定、行ラベルとして使う列をindex_colで指定…。(だけど、index_colはheader行をチェックするんだよね?最終行でもいいのかな。) index_colで文字列で指定できるのは便利。csv中のカンマの数を数えなくていいし。
特定の列を指定する際にメンバ変数のようにアクセスすることも可能。
df.hoge
なので、列は固有データで行を時系列などにしたほうが操作しやすいDataFrameになるかな。
loc
を使ったほうが安全という話もあり。プロパティによるアクセスはオブジェクト自体のメソッド名と衝突したときに危険。
列の追加、削除
DataFrame.assign
メソッドで列を追加したメソッドを生成することもかんたんに。 df.assign(delta=df['hoge']-df['huga'])
など列を指定しつつ演算して、列を追加した新しいDataFrameを返してくるので名前をつけていきましょう。(「delta」は追加する列のラベルで任意)
削除は行も列もDataFrame.drop()
メソッドで。引数にaxis = 1
を指定すると列の削除に。例df.drop('hoge', axis = 1)
(hoge列を削除したDataFrameを返してくる)
データのファイル出力
read_csvがあるなら出力もあるだろうと。はいDataFrame.to_csv()
が。引数でカンマ区切りから変更することが出来るけど、csvなら変える必要ない。例df.to_csv("sample.csv")
Panel
三次元データ!ここはしっかりデータ形式を考えてからいじりださないと、場当たり的に作っていくとカオスになりそう。
軸の名前はそれぞれ
- items
- major_axis
- minor_axis
itemsがz軸でmajor_axisとminor_axisがx,y軸でDataFrameを作っているような感じ。
ここは実際のデータを入れてみないとなんとも。
panel.major_axis('hoge')
の行と列が欲しいものと違うという時は.Tで転置でpanel.major_axis('hoge').T
などという表記も使える。
時系列データの処理
今後、時系列データの処理について色々と調べていきたいと思います。
あ、さっそく…。
statsmodels.apiと。メモメモ。
jupyterでimport error
jupyterでmoduleを読み込めずにエラー連発したのでその対策メモ。
moduleが使えている環境にアクセスできるようにkernelに追加するとか、検索するといろいろ出てきましたが、単にpathを通せばいいんじゃないかなーとチャレンジ。
まずは現在動いているpathの確認。
import sys sys.path ['', '/Users/hoge/anaconda2/lib/python27.zip', '/Users/hoge/anaconda2/lib/python2.7', ... '/Users/hoge/.ipython']
これで、一番下の'/Users/hoge/.ipython'
に突っ込めばいいと分かる。
そしてimportしたかったmoduleのpathを調べる。
import huga print huga.__file__
/Users/hoge/anaconda2/envs/huga/lib/python2.7/site-packages/huga/__init__.pyc
なるほど!
そこで'/Users/hoge/.ipython'
の場所にln -nfs /Users/hoge/anaconda2/envs/huga/lib/python2.7/site-packages/huga/ huga
を実行してリンクを作成。
これでなんだか動いているような…。
こちらのenvironment_kernelsでKernelを切り替えるタイプはシンプルですが、自分の環境ではうまく動きませんでした。
番外編:Fusion 360のボディとコンポーネントについて
個人的に週末にいじっているFusion 360ですが、最初で躓いたのでメモ。
ボディとは
まず最初に作られるのがボディ。スケッチしたのを押し出したり結合したり分割したり移動させてモデリングを行う。
ボディは考えて作っていこう
一番最初にはまった所。
複数部品を一度に作りたくなるけど、単部品で止めておかないと、全部一体化(たとえ離れていても)されて1ボディとなってしまう。その後分割するのは色々と大変。切断面や切断線を利用して分割しないと別ボディとならない。
コンポーネントとは
部品一つ一つをまずは指す。複数のコンポーネントをアッセンブリーしたりするけど、まずは部品一つ一つがコンポーネント。
コンポーネントのコピーに要注意
普通にコピー&貼り付けを行うと、参照が付いてしまう。片方を編集すると、コピーされた全部が編集されてしまう。左側のツリー(?)には何のマークもないので注意。
参照無しでコピーするには、ツリーの一番上で「全体を貼り付け」という謎の日本語で貼り付けないといけない。