Python 任意の関数上の任意の(x,y)範囲内の点を乱数で多数作成し、csvファイルに保存する

 本記事では、データ点数とx,y各々の上下限範囲を指定して、一様乱数で生成する雛形コードを載せました。このコードの活用は、例えば、何かしらのデータ分析によって得られた重回帰分析による2変数の回帰式を関数に設定します。その関数上に沿った多数のデータを生成することが出来るため、等高線図を作成して可視化するのに役立ちます。例えば、下記のような関数について、

f:id:HK29:20200811112046p:plain

データ点数を10000個、x,y上下限を-5≦x≦25, -10≦y≦10, の範囲で、生成したcsvファイル例が下図です。

f:id:HK29:20200811111304p:plain

生成した乱数データを用いて可視化(等高線図)した例は下記リンク先です。

Python 格子点(グリッド)を線形補完して等高線図を作成する「scipy.interpolate.griddata」 - PythonとVBAで世の中を便利にする

■本プログラム

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d")

# x, yデータからzを生成する関数
def function_A(X, Y):
    Z = 6 * X - pow(X, 2) + 4 * Y - pow(Y, 2)
    
    return Z

def main():
    # x, yデータを指定範囲内の一様乱数で生成する計算
    np.random.seed(39) # ランダムシートを固定する場合。数値は適当
    x = (x_max - x_min) * np.random.rand(N) + x_min
    y = (y_max - y_min) * np.random.rand(N) + y_min
    print(x.shape, y.shape)
    for k, (a, b) in enumerate(zip(x, y)):
        print(k, a, b)
    # zをx,yデータから生成する
    z = function_A(x, y)

    # numpy配列の列方向の連結
    xyz = np.column_stack([x, y, z])
    print(xyz, xyz.shape)

    # csvファイルの作成
    df = pd.DataFrame(xyz)
    df.columns = ['x', 'y', 'z']
    print(df)
    df.to_csv(now + '_' + file_name + '.csv', index=False, encoding='utf8')
    
    
if __name__ == "__main__":
    N = 10000 # 生成するデータ点数
    x_min = -5 # xの最小値
    x_max = 25 # xの最大値
    y_min = -10 # yの最小値
    y_max = 10 # yの最大値
    
    file_name = 'test_data'

    main()
    print('finished')

以上

<広告>