開発者用マニュアル 各モジュールの説明等、開発メモ
USAGE
コマンドライン上でpython main.py
で実行
INTRODUCTION SAtraceFitの実行ファイル
- データソースからのテキストにフィッティングをかけて
- 結果をcsvに書き込み
- フィッティング結果を反映したスペクトラム図のpngを吐き出す
- csvファイル名はユーザーの入力
- csvファイル出力先はmain.pyに書き込まれている
- pngファイル出力先はfitting.plotshowing()に書き込まれている。
ACTION
<実行したときの、コマンドラインの表示の流れ>
- データファイル、出力ファイルのディレクトリ指定→parameter.pyで指定
- SNを書き込むcsvファイル名を聞かれる→入力する
- powerを書き込むcsvファイル名を聞かれる→入力する
- csvのフルパス表示
- 日付を指定(指定方法がメッセージで表示される。詳しくはdatelist.date_range_input()参照) 6. fitting.fitting()実行。詳しくはfitting.fitting()参照 7. フィッティング日時表示 8. フィッティング結果表示(5の日付指定が最後に来るまで繰り返し)
UPDATE7.0.0 ファイル名は日時指定で引っ張ってくる
UPDATE6.1.1 fot Mfit test
UPDATE6.1 fittting の引数に周波数は入れない(fittingのforステートメント中にparameterから直接引っ張る)
UPDATE6.0 例外により中断されたら実行するtry~finally文追加
UPDATE5.0 ファイル名の指定(コンソールからインプットする)
第一引数:作成するファイル名 第二引数:取り込み元のファイル名(オプション)
UPDATE4.0 やっぱりwaveとcarrier分ける(fittingDiv3系列の前半のように) やっぱりcsvの書き込みは1ファイルのfitting後ごとに行う
UPDATE3.0
- fittingの廃止→SN_PowerSearchに変更
- SN_PowerSearchに2つの関数
- SN, Power作成
- csvは2つ吐き出す
- SN
- Power
UPDATE2.4 ファイル名はフルパスで受ける globname.pyを新規作成
UPDATE2.3 データファイルの場所と注目すべき周波数はparameter.pyに記載
USAGE
- コマンドライン上にて
python main.py
で起動 SN, powerを出力するcsvファイル名(ディレクトリパスと拡張子は抜き)の入力が求められる(例:ファイル名をhogehoge.csvとしたければ、hogehoge
と入力する) フィッティング対象のデータの日付の入力が求められる<最初の日付> <最後の日付>
。フォーマットはyymmdd形式(例:2015年11月1日の日付からにしたいときは151101
と打ちこむ) - CSV_IO.editCSV内でread, writeメソッドを1つの関数に収めた
- fitting>read>translate>update>translate>writeの流れは1セット
PLAN
- プログラムを途中で止めるとこれまでの計算結果が記録されない
writeメソッドが走るのはfor文の最後だから read, writeメソッドが走るタイミングを調整する keyboard interruptされたときにwriteメソッド機能するようにできる?
- 二重起動すると強制終了される
マルチプロセス化ができない 書き込みが2重にくるからいけないんだと思う。 仕様として、月々ごとにまとめろ、とある
mainの親プロセスを作って、入力したら月々ごとにファイル名指定できるようにする?
- exe化する予定
py2exe
- GUI化する予定
TKinter
廃止 datelist.date_range_input()にアップグレード
UPDATE1.0 first commit
INTRODUCTION main.pyから2つの値が渡される 2つの間の日付のリストを返す
ACTION yymmdd形式の6桁をdatetime関数で日付にする ddate1,2に代入する ddate1がddate2になるまで(while) ddate1を1日ずつ足して、リストに追加する(append)
USAGE 引数 : 最初の日付yymmdd形式、最後の日付yymmdd形式 戻り値 : 最初の日付から最後の日付を入れたリストyymmdd形式
PLAN none
- ファイル名のglobに用いる日付を基にした文字列をyieldするgenerator
- 引数:なし(ユーザーに入力施す)
- 戻り値:
- datestr:文字列(%Y%m%d形式)
INTRODUCTION データの入ったrootディレクトリと注目する周波数を指定するpy
ACTION 関数入れているだけ
USAGE root():データの入ったrootディレクトリ 引数:なし 戻り値:rootPath(文字列)
freq() : 注目する周波数を指定する 引数 : なし 戻り値 : freqWave(リスト)
UPDATE1.0 first commit
PLAN none
import numpy as np
def param():
return {
'in':'C:/directory/hoge/',
'out':'C:/directory/hoge/',
'out_png':'C:/directory/hoge/',
'out_csv':'C:/directory/hoge/',
'freqWave': np.around(np.arange(start, stop, step),1),
'freqCarrier':[val1, val2, val3, ...],
'freqM':[(val1,val2)],
'country':{values:' str'}, # ココにないやつはUNK(UNKnown)と表示される
}
INTRODUCTION 関数readCSV,writeCSV, editCSVで構成される。 組み込み関数csv, os.path, datetime.datetimeを使用して、fittinngの結果を読み込み、書き込み、編集を行う。 各関数の説明は各関数のdocを参照。
UPDATE1.1 クラス'csv.DictReader()'を使ってディクショナリ形式でcsvを取り出す。 キーは見出し(csvの1行目) 行を読むたびリスト'dictList'へ追加する dictListを返す INTRODUCTION csvファイルの中身をディクショナリに入れるpy 引数:ファイル名 戻り値:ディクショナリ'mydict ACTION filenameにいれた名前のファイルを開く リスト'reader'に格納する リスト'reader'に対して0要素目をキーに、1要素目以降(リスト形式)を値にしたディクショナリ'mydict'を作成する
UPDATE1.3 周波数の指定は外部ファイルから渡されてくる周波数のリスト'outparam' 計算結果は外部ファイルから渡されてくる計算結果のリスト'cal_result' INTRODUCTION 辞書の内容ををcsvファイルを書き込む ACTION 引数として集合'outparam',辞書'cal_result'を渡す 戻り値なし csvを返す 日付時間のキーは行のラベルにあたる 周波数のキーは列のラベルにあたる USAGE 列のラベル'paramnames'を定義する {日付時間,周波数1,周波数2,...}がディクショナリになった'fit_result'を定義する csv_writer(引数1,引数2)を実行する 改造予定 datetimeでソートしたい
INTRODUCTION fitting>read>translate>update>translate>writeの流れを一まとめにした ACTION READ FROM CSV
CSVファイルを読み込む
UPDATE DICTIONARY
読み込んだcsvとappenddictを併せる
dictionary形式は同一キーが存在した場合、後から来たdictionary内のキーの値に更新する
WRITE TO CSV
更新したdictionaryをcsvに書き込む
USAGE 引数:
- readcsv:読み込みcsvファイル名
- writecsv:書き込みcsvファイル名
- appendDict:書き込む内容。fittingの結果
- freqWave:csvの1行目(見出し行)
戻り値:None(writecsvに書き込み) UPDATE first commit PLAN None
UPDATE1.0 first commit
INTRODUCTION 関数datatocsv, csvtodataから構成される。
- datetocsv : dataをcsvファイルに読み書きしやすい、ディクショナリ in リスト形式に変換する
- csvtodata : csvの内容をデータ整理用の、ディクショナリ in ディクショナリ形式に変換する
ディクショナリはキーが重複した場合、値を更新する機能、キーでソートする機能をもつ
ACTION フィッティングしたデータをcsvファイルに読み込み(書き込み)たい。
CSVの表形式
DateTime | 22.2kHz | 23.0kHz | ... |
---|---|---|---|
20151201_000011 | -87 | -40 | ... |
20151201_000512 | -80 | -40 | ... |
pythonの組み込み関数csvを用いれば、以下のような形式で取り込まれる。 これを ディクショナリ in リスト形式 と呼ぶ。
ディクショナリ in リスト形式
[ {DateTime:'20151201_000011', '22.2kHz':-87, '23.0kHz:-40',...},
{DateTime:'20151201_000512', '22.2kHz':-80, '23.0kHz:None,...},
...]
一方で、フィッティングの値はフィッティングを担当するモジュールfittingDiv
から以下のような形式で渡される。
この形式を ディクショナリ in ディクショナリ形式 と表現する。
ディクショナリ in ディクショナリ形式
{ '20151201_000011':{'22.2kHz':-87, '23.0kHz:-40', ...},
'20151201_000512':{'22.2kHz':-80, '23.0kHz:None, ...},
...}
pythonに取り込まれたcsvとフィッティングで得られる値を混ぜ合わせて、python内部でディクショナリ in ディクショナリ形式として集計することで、 日付時刻の重複データの更新が容易になる。
そこで、csvから読み込んだディクショナリ in リスト形式とデータ整理用のディクショナリ in ディクショナリ形式の相互変換ができるモジュールが欲しい。
(csvから読み書きしやすい形式)
[ {DateTime:'20151201_000011', '22.2kHz':-87, '23.0kHz:-40',...},
{DateTime:'20151201_000512', '22.2kHz':-80, '23.0kHz:None,...},
...]
^
| 相互変換できるモジュールが必要
v
(データ整理しやすい形式)
{ '20151201_000011':{'22.2kHz':-87, '23.0kHz:-40', ...},
'20151201_000512':{'22.2kHz':-80, '23.0kHz:None, ...},
...}
取り扱うデータ形式を一般化して考える。
- 'k'はcsvの1列目(見出し)
- 'v'は2列目以降(値)
を意味する。 ディクショナリ in リスト形式がn個の要素を持ったリストに収めていくと、n行のcsvが作成される。 要するに何を作るべきかというと、ディクショナリ in ディクショナリ形式とディクショナリ in リスト形式の相互変換モジュール
変換されたCSVの表形式
|k0|k1|k2 |... |k(n)|
| ---- | ----------------- | -------------------|
|v00|v10|v20 |... |v(n,0)|
|v01|v11|v21 |... |v(n,1)|
|v02|v12|v22 |... |v(n,2)|
|.| | | | |
|.| | | | |
|v(0,m-1)|v(1,m-1)|v(2,m-1)|...v(n,m-1)|
|v(0,m)|v(1,m)|v(2,m)|...v(n,m)|
^
| <<ココはpython組み込み関数でできる
v
# csv読み書き用 ディクショナリ in リスト形式
[
{k0:v00,k1:v10,k2:v20,...,k(n-1):v(n-1,0),k(n):v(n,0)},
{k0:v01,k1:v11,k2:v21},...,k(n-1):v(n-1,1),k(n):v(n,1)},
{k0:v02,k1:v12,k2:v22},... },
...,
{k0:v(0,m-1),k1:v(1,m-1),k2:v(2,m-1),...,k(n-1):v(n-1,m-1)),k(n):v(n,m-1))},
{k0:v(0,m),k1:v(1,m),k2:v(2,m),...,k(n-1):v(n-1,m),k(n):v(n,m)}
]
^
| <<ココの相互変換するモジュールを作りたい
v
# データ整理用 ディクショナリ in ディクショナリ形式
{
{v00:{k1:v10,k2:v20,...,k(n-1):v(n-1,0),k(n):v(n,0)},
{v01:{k1:v11,k2:v21},...,k(n-1):v(n-1,1),k(n):v(n,1)},
...,
{v0m:{k1:v(1,m),k2:v(2,m),...,k(n-1):v(n-1,m),k(n):v(n,m)}
}
USAGE CSV_IO.pyから呼び出される。 各関数のdoc参照 Testはコメントアウト外してbuildするのみ
UPDATE1.0 first commit
INTRODUCTION data(ディクショナリ in ディクショナリ形式)をcsvファイルに読み書きしやすい、ディクショナリ in リスト形式に変換する
ACTION
- 引数dataは{'日付':{周波数1:パワー1,周波数2:パワー2,...,周波数n:パワーn,}}で渡されてくる
- 引数dataを2要素のリストにしてdataSortedListに代入する。
dataSortedList= sorted(list(data.items()))
items()メソッドを用いて日付(値)とデータ(ディクショナリ型)を1セットのタプルにする list()ファンクションを用いてタプル形式をリスト形式にする。(sorted関数を使いたいため。) sorted()ファンクションを用いて文字列(日付)→ディクショナリの順番で並ぶようにしてる
- 空のリストcsvを作成
- ここから引数dataの数だけ繰り返す
for i in range(len(data))
3. リストcsvをディクショナリ in リスト形式にするcsv.append({})
3. csvというディクショナリ in リスト形式のi番目の要素に対して、「DateTime」をキーに、dataSortedListの0番目の要素=「日付」を値として追加する。csv[i]['DateTime']=dataSortedList[i][0]
ソートされたので0番目の要素は文字列 3. csvというディクショナリ in リスト形式のi番目の要素に対して、「ディクショナリ(周波数をキーにしたシグナル強度)」を追加する。
csv[i].update(dataSortedList[i][1])
ソートされたので1番目の要素はディクショナリ(周波数をキーにしたシグナル強度)。
- リスト in ディクショナリcsvを返して終了
USAGE 引数:pythonのデータ整理用 ディクショナリ in ディクショナリ形式 戻り値:pythonのcsv読み書き用 ディクショナリ in リスト形式
PLAN none
UPDATE1.0 first commit
INTRODUCTION csvの内容をデータ整理用の、ディクショナリ in ディクショナリ形式返す
ACTION
- 引数はリスト in ディクショナリ形式で入ってくる
- キーがDateTimeである値=日付 をcsvの行数文だけ
for i in range(len(csv))
抽出pop
し、リストcsvDateTimeに代入していく - 項目1で抽出した値(日付)と抽出する前野引数の残りをタプルにまとめ
zip
、ディクショナリ形式にするdict
USAGE 引数:pythonのcsv読み書き用 ディクショナリ in リスト形式 戻り値:pythonのデータ整理用 ディクショナリ in ディクショナリ形式
PLAN none
INTRODUCTION タイムスタンプと周波数を引数にフィッティング結果を返すpy
ACTION 引数:filebasename:タイムスタンプのこと。例えば'2015年01月01日12時35分06秒'を表す'20150101_123506' freqWave:帯域を持つ周波数のリスト freqCarrier:帯域を持たない周波数のリスト 戻り値:タプル形式 1. SNのディクショナリ in ディクショナリ形式のフィッティング結果{タイムスタンプ:{周波数1:出力1,周波数2:出力2,...}} 2. Powerのディクショナリ in ディクショナリ形式のフィッティング結果{タイムスタンプ:{周波数1:出力1,周波数2:出力2,...}}
- データをテキスト形式で読み込みdataにリストとして読み込み
- freqで指定した周波数の分だけfittingを行い
- データとフィッティング曲線をプロットする
- waveに格納された周波数をfittingする
- waveとしてみるか判断(OKだったらプロット)>>>indicatecondition
- carrierに格納された周波数をfittingする
- carrierとしてみるか判断(OKだったらプロット)
- ノイズフロアをプロット
- 測定データのプロット
- pngを吐き出す(オプションでプロットして表示)
- ディクショナリ in ディクショナリを返す
TODO plotshowing() plotするかしないか showするかsavepngするか 条件分岐 dictionary使う?inputでmain.py空の命令に従う
UPDATE2.0 awkコマンドを用いてcsvの見出し行を取得する INTRODUCTION SN比の時間推移を記録したSN.csvをプロットするgnuplotファイル ACTION x軸を時間軸にする set datafile separator ","でデータ区切りをコンマにする(csvファイルなので。) awkコマンドを用いてcsvの見出し行を取得する USAGE JUST BUILD
UPDATE1.0 first commit
USAGE
mainから呼び出す
引数:
rootpath:
dateFirst:最初の日付yymmdd形式
dateLast:最後の日付yymmdd形式
戻り値:リストfilebesename
イテレータでもいいな
globのhelpによるとリストを返すらしい
glob(pathname, *, recursive=False) Return a list of paths matching a pathname pattern.
INTRODUCTION 最初と最後の日付をもらって、その中のfilebasename(拡張子無しのファイル名)
ACTION datetime関数で日付の形式に直して globの
PLAN none