iPhoneのExcelデータをPythonista3でフーリエ変換

Pythonista3はiOSで動作するPythonの開発環境です。
numpyが標準でインストールされていましたが、openpyxlがインストールされていたのは少し驚きました。

ということで、iPhoneのExcelデータを読み込んでfftスペクトルを計算するアプリを作成してみました。

動作の雰囲気はこんな感じです。

ソースファイルは以下です。

# -*- coding: utf-8 -*-
 import appex
 import numpy as np
 import matplotlib.pyplot as plt
 import openpyxl as px
 import ui
 

 def fft(sender):
     dt = float(sender.superview['textfield1'].text)
     print('時間刻み = ',dt)
     t = list()
     f = list()
     
     count = 0
     for i in range(len(d)):
         t.append(dt*float(count))
         count += 1
     f = np.linspace(0, 1.0/dt, count) 

     # 高速フーリエ変換
     F = np.fft.fft(d)/float(count)
 
     # 振幅スペクトルを計算
     Amp = np.abs(F)
     # 位相角を計算
     Phs = np.degrees(np.angle(F))
 
     fmax = 1.0/dt/2.0 #後半の共役複素数部は除外
 
     # グラフ表示
     plt.figure(figsize=(10,15))
     plt.subplot(311)
     plt.plot(t, d)
     plt.xlabel("time")
     plt.ylabel("signal")
 
     plt.subplot(312)
     plt.plot(f, Amp)
     plt.xlim(0, fmax)
     plt.xlabel("frequency")
     plt.ylabel("amplitude")
 
     plt.subplot(313)
     plt.scatter(f, Phs, s=5, c="blue", edgecolors="blue")
     plt.xlim(0, fmax)
     plt.ylim(-180, 180)
     plt.xlabel("frequency")
     plt.ylabel("phase")
     plt.show()
     v.close()
 
 
 d = list()
 myf = appex.get_file_path()
 wb = px.load_workbook(myf, data_only = True)
 ws = wb.worksheets[0]
 for cell in ws['A']:
     d.append(cell.value)
 
 v = ui.load_view()
 v.present('fullscreen')

PythonでCSVファイルをExcelに変換する

PyhtonでExcelファイルのシートをCSVに出力する」の逆です。

# coding: utf-8

import sys
import os
import csv

import openpyxl as px
from openpyxl.utils.cell import coordinate_from_string, column_index_from_string
from openpyxl.utils import get_column_letter, column_index_from_string

def main():

    args = sys.argv

    exf = ''
    csvf = ''
    sheet = ''
    add = 'A1'

    if len(args) < 2:
        print ('USAGE : csv2excel -csv CSVFILE -excel EXCELFILE -sheet SHEETNAME [-address A1]')
        sys.exit()

    for i in range(len(args)):
        if args[i] == '-excel':
            exf = args[i+1]
        if args[i] == '-csv':
            csvf = args[i+1]
        if args[i] == '-sheet':
            sheet = args[i+1]
        if args[i] == '-address':
            add = args[i+1]

    csvfilepath = os.path.abspath(csvf)
    if os.path.exists(csvfilepath) == False:
        print ('!!!ERROR!!! CSV FILE', csvf , ' is not found')
        sys.exit()

    if exf == '':
        exf = csvf + '.xlsx'
    if sheet == '':
        [sheet,ext] = os.path.splitext(csvf)

    exfilepath = os.path.abspath(exf)
    if os.path.exists(exfilepath) == False:
        bk = px.Workbook()
        sh = bk.active
        sh.title = sheet
    else:
        bk = px.load_workbook(exfilepath)
        flg = 0
        for sh in bk.sheetnames:
            if sh == sheet:
                flg = 1
                break
        if flg == 0:
            sh = bk.create_sheet(title=sheet)
        else:
            sh = bk[sheet]

    a = coordinate_from_string(add)
    startrow = a[1]
    startcol = column_index_from_string(a[0])

    print ('CSVFILE   : ', csvfilepath)
    print ('EXCELFILE : ', exfilepath)
    print ('SHEETNAME : ', sheet)
    print ('ADDRESS   : ', add ,"(",startrow,",",startcol,")")

    with open(csvfilepath) as fp:
        reader = csv.reader(fp, delimiter=',')
        irow = startrow
        for row in reader:
            icol = startcol
            for v in row:
                if str.isnumeric(v):
                    sh.cell(irow,icol).value = float(v)
                else:
                    sh.cell(irow,icol).value = v
                icol +=1
            irow += 1

    bk.save(exfilepath)

    print ('FINISHED')

if __name__ == '__main__':
    main()

PyhtonでExcelファイルのシートをCSVに出力する

openpyxlを使用したCSV出力プログラムです。

# coding: utf-8

import sys
import os
import csv

import openpyxl as px

def main():

    args = sys.argv
    exf = ''
    csvf = ''
    sheet = ''

    if len(args) < 2:
        print ('USAGE : excel2csv -excel EXCELFILE -csv CSVFILE -sheet SHEETNAME')
        sys.exit()
 
    for i in range(len(args)):
        if args[i] == '-excel':
            exf = args[i+1]
        if args[i] == '-csv':
            csvf = args[i+1]
        if args[i] == '-sheet':
            sheet = args[i+1]
  
    exfilepath = os.path.abspath(exf)

    if os.path.exists(exfilepath) == False:
        print ('!!!ERROR!!! EXCEL FILE', exf , ' is not found')
        sys.exit()

    bk = px.load_workbook(exfilepath, read_only=True, keep_vba=False)

    flg = 0
    for sh in bk.sheetnames:
        if sh == sheet:
            flg = 1
            break
  
    if flg == 0:
        print ('!!!ERROR!!! SHEET NAME', sheet , ' is not found')
        sys.exit()

    if csvf == '':
        csvf = exfilepath + '.' + sheet + '.csv'
    else:
        csvf = os.path.dirname(exfilepath) + '/' + csvf

    print ('EXCELFILE : ',exfilepath)
    print ('SHEETNAME : ',sheet)
    print ('CSVFILE : ',csvf)

    ws = bk[sheet]

    with open(csvf, 'w', encoding='utf-8') as fp:
        writer = csv.writer(fp)
        for cols in ws.rows:
            writer.writerow([str(col.value or '') for col in cols])

    print ('FINISHED')

if __name__ == '__main__': 
    main()

exclcsv(Excel←→CSV相互変換)

exclcsvはExcelシートとCSVファイルを相互に変換するコマンドです。ClosedXMLを使用しており、Excelがインストールされていないサーバコンピュータなどでも動作します。

簡単なコマンドの例を以下に記載します。

exclcsv.exe -proc ex2csv -excel sample.xlsx –sheet sheet1 –csv sample.csv
「sample.xlsx」の「sheet1」シートを「sample.csv」に出力する
exclcsv.exe -proc csv2ex  –csv sample.csv -excel sample.xlsx –sheet sheet2
「sample.csv」を「sample.xlsx」の「sheet2」シートに出力する