tata色々な備忘録

データ解析、画像解析、化学分析などなど

10分でPythonの科学計算環境構築(anaconda+ Visual Studio Code)

10分で科学計算+pythonのコーディング環境構築(自動補完)まで。

anacondaとVisual Studio Codeの組み合わせになる。
Visual Studio Code(VScode)はMS製のIDEだがmaclinuxでも動く。
Markdownでも優秀なツールであり、少しマイナーだがお勧め。

環境構築10分はダウンロード時間を除く。
確認はWindows10だが、maclinuxも同じ手順、時間で行ける。

1.anacondaのインストー

Download Anaconda Now! | Continuum

2.Visual Studio Code(VScode)のインストー

code.visualstudio.com

3.Visual Studio Codeの設定

python用設定のインストール (下図のようこそ→pythonをクリック→はい)

f:id:tatabox2000:20170717001559p:plain

② フォルダに移動(どこでも良い)

f:id:tatabox2000:20170716235640p:plain

③ 設定を選ぶ

f:id:tatabox2000:20170716235715p:plain

④ 図の通りに書き換える
1) python.pythonpathで検索
2) “python.pythonPath"を選ぶ
3) ワークスペース設定を選ぶ
4) ワークスペースの"python.pythonPath"に下記内容を記載
"python.pythonPath”: “C:\ProgramData\Anaconda3\python.exe” “python.autoComplete.extraPaths”: [“C:\ProgramData\Anaconda3\Lib\site-packages”
],"

f:id:tatabox2000:20170716235814p:plain

⑤ (゚д゚)ウマー(実行はctrl+F5)

Code runnerという拡張を入れると右クリックから実行可能。
便利な世の中になったものだ。

Python3.6にOpenCVをインストール(windows10)

忘れそうなのでメモ書き。
(現状のOpenCVはpython3.5までしか対応していない)

1.Anacondaでpython3.6を入れる。
Download Anaconda Now! | Continuum

2.conda-forge/opencv-feedstockを入れる
github.com

手順(コマンドプロンプト
conda config --add channels conda-forge  
conda install opencv  

普通に使えて(゚д゚)ウマー

conda-forgeの皆様に感謝

Pythonで株・為替・先物解析 その1

Pythonで株・為替・先物解析の解析をしてみる。
そのままmatplotlibで描画すると土日祝日が空欄になるため、軸を別設定した。

import jsm
import datetime
import pandas as pd
import matplotlib.dates as mdate
import matplotlib.finance
import pylab as plt
import numpy as np
import sqlite3
import pandas.io.sql as psql

##################
#set stock number
##################
stock_name = 8411

#SQLlite
con = sqlite3.connect("data.db")
c = con.cursor()
try:
    c.execute("""create table all_sort(name integer ,date integer ,open integer ,high integer ,low integer ,close integer ,volume integer);""")
except:
    sql = 'select name,date from all_sort'
    a = c.execute(sql)
    for i, j in a:
        print i,j

#JSMによる日足習得
d = datetime.datetime.today()
q = jsm.Quotes()

start_date = datetime.date(2015, 1, 1)

yesterday = datetime.date.today() - datetime.timedelta(1)
end_date = yesterday

this_year = q.get_historical_prices(stock_name, jsm.DAILY, start_date, end_date)

#SQLに格納後Pandasへ移す
quotes = []
days=[]

colums_sql= u"insert into all_sort values(?,?,?,?,?,?,?)"
for i,each_day in enumerate(this_year):
    day =mdate.date2num(each_day.date)
    days.append(tuple([day]))
    quotes.append([i,each_day.open,each_day.close,each_day.high,each_day.low])
    for_sql = [stock_name,each_day.date,each_day.open,each_day.close,each_day.high,each_day.low,each_day.volume]
    c.execute(colums_sql,for_sql)

sql = 'select * from all_sort'
df = psql.read_sql(sql,con)

df2 = df[df['name'] == stock_name]
df2['date'] = df2['date'].apply(pd.to_datetime)

ascend_df = df2.sort_index(by='date',ascending=True)

#con.commit()


############################
#plot
############################

# SMA EMA
sma5 = pd.rolling_mean(df['close'], window=5)
sma5 = sma5.dropna()

ewma = pd.stats.moments.ewma
ewma5 = ewma(df['close'], span=5)

ewma25 = ewma(df['close'], span=25)
#ewma25 = ewma25.dropna()

#ロウソク足で描画
fig = plt.figure()
fig.subplots_adjust(bottom=0.2)
ax = fig.add_subplot(111)
ax.set_xticks(range(0,len(quotes),5))
ax.set_xticklabels([mdate.num2date(days[index][0]).strftime('%y %b %d') for index in ax.get_xticks()]) 

matplotlib.finance.candlestick(ax, quotes,colorup='red',colordown='blue')
ax.xaxis_date()
ax.autoscale_view()
plt.plot(sma5,label="SMA5")
plt.plot(ewma5,label="EMA5")
plt.plot(ewma25,label="EMA25")
plt.setp( plt.gca().get_xticklabels(),rotation=90, horizontalalignment='left')
plt.legend(loc="best")
ax.invert_xaxis()
plt.show()

f:id:tatabox2000:20150531224918p:plain 後日修正予定。

次回はコマ足(平均足)を検討する予定

参考

How do I plot only weekdays using Python's matplotlib candlestick? – | Mauricio

pandas - ローソク足チャートと移動平均線のプロット - Qiita

VBAでソート

とりあえず書いてみた。

以下のようなデータがあるとして

pos    cur     lots        price  
Buy     USD     10,000,000   120.5  
Buy     USD     10,000,000   119.5  
Buy     EUR     1,000,000    132.5  
Buy     EUR     1,000,000    130.5  
Sell    USD     10,000,000   121.5  
Buy     USD     10,000,000   118.5  
Sell    USD     10,000,000   122.5  

posやcur、up or down指定で並べ替え後、行頭に移動

pos    cur     lots        price  
Buy     USD     10,000,000   120.5  
Buy     USD     10,000,000   119.5  
Buy     USD     10,000,000   118.5  
Sell    USD     10,000,000   121.5  
Sell    USD     10,000,000   122.5  
Buy     EUR     1,000,000    132.5  
Buy     EUR     1,000,000    130.5  

VBAのコード

Sub sort_cur_pos()
    Dim first_row As Long
    Dim last_row As Long
    Dim row_counts As Long
    Dim cur As String
    Dim pos As String
    Dim up_or_down As String
    
    'ソートする項目と方法を指定
    cur = "USD"
    pos = "Sell"
    up_or_down = "up"
    
    '全体選択
    cells(1, 1).Select
    Selection.CurrentRegion.Select
    
    '行数のカウント
    all_row_end = ActiveWindow.RangeSelection.End(xlDown).Row
    
    '全体を選択してプレソート
    cells_area = ActiveWindow.RangeSelection.Address
    Worksheets("Sheet1").Range(cells_area) _
             .Sort Key1:=cells(1, 2), order1:=xlDescending, _
             Key2:=cells(1, 1), order2:=xlAscending
    
    '指定項目の範囲を調査して格納
    For i = 1 To all_row_end Step 1
        If cells(i, 2) = cur Then
            If cells(i, 1) = pos Then
                If first_row = 0 Then
                    first_row = i
                    last_row = i
                Else
                    last_row = i
                End If
            End If
        End If
    Next
    
    '指定項目を指定方向にソート
    If up_or_down = "up" Then
        Worksheets("Sheet1").Range(cells(first_row, 1), cells(last_row, 4)) _
             .Sort Key1:=cells(first_row, 4), order1:=xlAscending
    End If
    If up_or_down = "down" Then
        Worksheets("Sheet1").Range(cells(first_row, 1), cells(last_row, 4)) _
             .Sort Key1:=cells(first_row, 4), order1:=xlDescending
    End If
    
    '指定項目の位置を切り出して先頭に挿入
    Rows(first_row & ":" & last_row).Cut
    Rows("1:1").Insert Shift:=xlShiftDown
    
    '指定項目の範囲を選択
    row_counts = last_row - first_row + 1
    Range(cells(1, 1), cells(row_counts, 4)).Select
    
End Sub

リストを昇順、降順にする関数がないため、今回のように1)ワークシート内に記入した内容でソートする、
以外だと、2)自分でソートを実装する、3).netのArraylistを利用する事になる。

PyQt(PySide)とOpenCVで画像処理その7(日本語処理)

OSを判定して日本語対応させる。 os.nameがntならcp932、それ以外ならutf-8エンコードする。

import os
import PySide
from PySide import QtCore,QtGui
import cv2
#OSチェック
def os_check():
  #windows
    if os.name is 'nt':
        code = 'cp932'
        return code
  #Unix、Mac
    if os.name is not 'nt':
        code = 'utf-8'
        return code

def open_file(code):
    filename = QtGui.QFileDialog.getOpenFileName(filter="Image Files (*.png *.bmp *jpg)")
  #日本語をエンコードして文字化け回避
    filename = filename[0].encode(code)
        im = cv2.imread(filename)
    cv2.imshow("",im)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    code = os_check()
    open_file(code)

PyQt(PySide)とOpenCVで画像処理その6(サブウィンドウ)

久しぶりの更新。以下の続き
PyQt(PySide)とOpenCVで画像処理その5(イベントフィルター) - tataboxの備忘録

PyQt(PySide)でサブウィンドウを呼び出したり、ウィジットを追加してみる。

1.QtDesigner で下のように作る

Main window (ファイル名:main.ui objectname: main)

f:id:tatabox2000:20150301223801p:plain

Widget (ファイル名:widget.ui objectname:widget)

f:id:tatabox2000:20150301215956p:plain

Dialog (ファイル名:dialog.ui objectname:dialog)

f:id:tatabox2000:20150301215949p:plain

2.フォルダに移動し、コマンドライン上でpythonのコードに変換

pyside-uic -o main.py main.ui
pyside-uic -o widget.py widget.ui
pyside-uic -o dialog.py dialog.ui

3.同一フォルダに以下の内容で作成し、実行

import PySide
from PySide import QtCore,QtGui
import sys

from main import Ui_main
from dialog import Ui_dialog
from widget import Ui_widget

class Main(QtGui.QMainWindow,Ui_main):
 def __init__(self, parent = None):
        super(Main, self).__init__(parent)
        self.ui = Ui_main()
    self.setupUi(self)
    self.button.clicked.connect(self.pushButton)

    QtCore.QObject.connect(self.actionLoad_Dialog, QtCore.SIGNAL("triggered()"), self.pushMenu)


 def pushButton(self):
     self.widget = Widget(self)
     self.widget.show()
 def pushMenu(self):
     self.dialog = Dialog(self)
     self.dialog.show()

class Dialog(QtGui.QDialog,Ui_dialog):
 def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.setupUi(self)

class Widget(QtGui.QWidget,Ui_widget):
 def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setupUi(self)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    dmw = Main()
    dmw.show()
    sys.exit(app.exec_())
menu 中のload Dialogを押す

f:id:tatabox2000:20150301224228p:plain

load widgetボタンを押す

f:id:tatabox2000:20150301224409p:plain

Widgetは内部、Dialogは別窓で表示される。

参考

python - How to create new PyQt4 windows from an existing window? - Stack Overflow

python+Opencvによる画像処理10(線や文字の書き込み)

画像にスケールを書き込む必要があり、線や文字の書き込み法を調べたのでメモ。

(1) 線の書き込み
cv2.line(image,(start_x,start_y),(end_x,end_y),color,thickness)
(2)文字の書き込み
cv2.putText(image,text,(start_x,start_y),font, font size,color)

フォントの種類(これのみ、日本語は多分不可)

FONT_HERSHEY_COMPLEX
FONT_HERSHEY_COMPLEX_SMALL
FONT_HERSHEY_DUPLEX
FONT_HERSHEY_PLAIN
FONT_HERSHEY_SCRIPT_COMPLEX
FONT_HERSHEY_SCRIPT_SIMPLEX
FONT_HERSHEY_SIMPLEX
FONT_HERSHEY_TRIPLEX
FONT_ITALIC
実行結果

f:id:tatabox2000:20141006011119p:plain

参考

Drawing Functions in OpenCV — OpenCV 3.0.0-dev documentation