メモ

●カラム
コード 年度 売上高 営業利益 経常利益 純利益 短期借入金 長期借入金 純資産 総資産 発行済株式数 総資本経常利益率 自己資本当期純利益率 売上高営業利益率 売上高経常利益率 売上高当期純利益率 投下資本利益率 EPS BPS 売上高伸び率 営業利益伸び率 経常利益伸び率 当期純利益伸び率 総資本伸び率 自己資本伸び率 借入金伸び率 売上高年平均成長率 営業利益年平均成長率 経常利益年平均成長率 当期純利益年平均成長率 総資本年平均成長率 自己資本年平均成長率 借入金年平均成長率


import pandas as pd
import numpy as np
import os
import math
from math import isinf
from math import floor
import pandas as pd
import numpy as np
import math

# 処理したいファイル名のリストを指定
target_files = [
    '3856.csv', '4937.csv',]


# 期間の設定
span001=-1
span004=-4
span005=-5
span007=-7
span010=-10
span020=-20
span040=-40
span030=-30
span200 =200
span240=-240

# ステージ(stage )の強さ(strength )
SS01=1
SS02=2
SS03=3
SS04=4
SS05=5
SS06=6

TOTAL_DATA = pd.DataFrame(columns=[])
Result_DATA = pd.DataFrame(columns=[])

# ここでループの開始点と終了点を指定(例えば、最初の5つのファイル)
start_index = 0 # 開始インデックス
end_index = 1   # 終了インデックス
# フォルダ内すべてを行う場合、これを有効化する
# end_index = len(target_files)  

# enumerateを使用してファイル名とそのインデックスを取得
for i, filename in enumerate(target_files[start_index:end_index], start=start_index):
    print(f"{i}: {filename}")
    
    # データの読み込み
    try:
        base_data = pd.read_csv(filename, encoding='cp932')
    except UnicodeDecodeError:
        base_data = pd.read_csv(filename, encoding='utf-8')

    for column in ['始値', '高値', '安値', '終値', '出来高']:
        base_data[column] = base_data[column].astype(str)
        base_data[column] = base_data[column].str.replace(',', '')
        base_data[column] = pd.to_numeric(base_data[column].replace('--', np.nan), errors='coerce')
        base_data[column] = base_data[column].astype(float)
    
    columns_order = ['日付', '始値', '高値', '安値', '終値', '出来高']
    base_data = base_data[columns_order]
    base_data = base_data.sort_values('日付', ascending=True)
    
    Technical_data = base_data.copy()
    Technical_data['コード'] = filename.replace('.csv', '')

    # 4日平均の変動率を計算
    Technical_data['高-始(%)'] = (Technical_data['高値'] - Technical_data['始値']) / Technical_data['始値'] * 100
    Technical_data['始-安(%)'] = (Technical_data['始値'] - Technical_data['安値']) / Technical_data['始値'] * 100

    # 20日の平均を計算
    Technical_data['20MA_高-始(%)'] = Technical_data['高-始(%)'].rolling(window=20).mean()
    Technical_data['20MA_始-安(%)'] = Technical_data['始-安(%)'].rolling(window=20).mean()

    # 翌日の高値と安値をカラムに追加
    Technical_data['翌日_高値'] = Technical_data['高値'].shift(-1)
    Technical_data['翌日_安値'] = Technical_data['安値'].shift(-1)
    Technical_data['翌日_終値'] = Technical_data['終値'].shift(-1)

    # 翌日の変動率を計算
    Technical_data['翌日_高-始(%)'] = (Technical_data['翌日_高値'] - Technical_data['始値']) / Technical_data['始値'] * 100
    Technical_data['翌日_始-安(%)'] = (Technical_data['始値'] - Technical_data['翌日_安値']) / Technical_data['始値'] * 100

    # 翌日の20日平均の変動率を計算
    Technical_data['翌日_20MA_高-始(%)'] = Technical_data['翌日_高-始(%)'].rolling(window=20).mean()
    Technical_data['翌日_20MA_始-安(%)'] = Technical_data['翌日_始-安(%)'].rolling(window=20).mean()

    # 翌日の高値と安値の差を計算 (%)
    Technical_data['翌日_高-安(%)'] = (Technical_data['翌日_高値'] - Technical_data['翌日_安値']) / Technical_data['始値'] * 100

    # 翌日の高値と安値の差の20日移動平均を計算
    Technical_data['20MA_翌日_高-安(%)'] = Technical_data['翌日_高-安(%)'].rolling(window=20).mean()

    # 期間内最安値の計算(安値と翌営業日の安値の低い方)
    Technical_data['期間内最安値'] = Technical_data[['安値', '翌日_安値']].min(axis=1)

    # 全ての数値型のカラムに小数点第3位以下を切り捨てる関数の適用
    for col in Technical_data.columns:
        if np.issubdtype(Technical_data[col].dtype, np.number):
            # Replace infinities with NaN
            Technical_data[col].replace([np.inf, -np.inf], np.nan, inplace=True)
            # Apply the rounding
            Technical_data[col] = Technical_data[col].apply(lambda x: math.floor(x * 1000) / 1000 if not pd.isna(x) else x)

    # すべてが2以上のものだけを抽出
"""
    filtered_data = Technical_data[
        (Technical_data['翌日_20MA_高-始(%)'] >= 2) &
        (Technical_data['翌日_20MA_始-安(%)'] >= 2) &
        (Technical_data['20MA_翌日_高-安(%)'] >= 2)
    ].copy()
"""

Technical_data = Technical_data[Technical_data['日付'] >= '2019-01-01']
Technical_data  

import datetime
from datetime import datetime, timedelta
# 現在の日付と時間を取得

current_date = datetime.now().strftime("%Y_%m_%d_%H_%M")
file_name = f"3856オシレーター一覧{current_date}.csv"
Technical_data.to_csv(file_name, encoding='cp932', index=False)
# 関数定義: 都道府県でシートを分けてピボットテーブルを作成
def create_pivot_table_by_prefecture(df, index, columns, values, folder_path, prefix):
    # 都道府県コードを元のデータフレームに結合
    df = pd.merge(df, prefectures01[['都道府県名', '都道府県コード']], on='都道府県名', how='left')

    # 都道府県コードでソート
    df.sort_values('都道府県コード', inplace=True)

    # 製作所フラグのすべての値を取得(0と●を想定)
    all_flags = [0, '●']

    # 全てのcolumns(例: 'キーワード')の値を取得
    all_column_values = df[columns].unique()

    # ピボットテーブルの作成
    with pd.ExcelWriter(f"{folder_path}{prefix}.xlsx") as writer:
        for _, prefecture_row in prefectures01.iterrows():
            prefecture = prefecture_row['都道府県名']
            prefecture_code = prefecture_row['都道府県コード']

            # 都道府県ごとのデータフレームを作成
            df_prefecture = df[df['都道府県名'] == prefecture]

            # ピボットテーブルの作成
            pivot_table = df_prefecture.pivot_table(
                index=index,
                columns=[columns, '製作所フラグ'],
                values=values,
                aggfunc='sum',
                fill_value=0
            )

            # カラムのMultiIndexを作成
            new_columns = pd.MultiIndex.from_product(
                [all_column_values, all_flags],
                names=[columns, '製作所フラグ']
            )

            # pivot_tableのカラムを再インデックス
            pivot_table = pivot_table.reindex(columns=new_columns, fill_value=0)

            # 合計を計算
            pivot_table['合計'] = pivot_table.sum(axis=1)

            # 合計で降順に並べ替え
            pivot_table = pivot_table.sort_values('合計', ascending=False)

            # カラムの順序を変更して、'合計'を左に移動
            cols = pivot_table.columns.tolist()
            cols = ['合計'] + [col for col in cols if col != '合計']
            pivot_table = pivot_table[cols]

            # ピボットテーブルを都道府県名のシートに保存
            pivot_table.to_excel(writer, sheet_name=f"{prefecture_code}_{prefecture}")

# 関数定義: ピボットテーブルを作成
def create_pivot_table(df, index, columns, values, folder_path, prefix):
    # 都道府県コード一覧を読み込み
    prefectures_path = input_folder_path + "都道府県コード一覧.xlsx"
    prefectures01 = pd.read_excel(prefectures_path)

    # 都道府県コードを元のデータフレームに結合
    df = pd.merge(df, prefectures01[['都道府県名', '都道府県コード']], on='都道府県名', how='left')

    # 製作所フラグのすべての値を取得(0と●を想定)
    all_flags = [0, '●']

    # 全てのcolumns(例: 'キーワード')の値を取得
    all_column_values = df[columns].unique()
    all_prefecture_codes = df['都道府県コード'].unique()

    # カラムのMultiIndexを作成
    new_columns = pd.MultiIndex.from_product(
        [all_column_values, all_flags, all_prefecture_codes],
        names=[columns, '製作所フラグ', '都道府県コード']
    )

    # ピボットテーブルの作成
    pivot_table = df.pivot_table(
        index=index,
        columns=[columns, '製作所フラグ', '都道府県コード'],
        values=values,
        aggfunc='sum',
        fill_value=0
    )

    # pivot_tableのカラムを再インデックス
    pivot_table = pivot_table.reindex(columns=new_columns, fill_value=0)

    # 合計を計算
    pivot_table['合計'] = pivot_table.sum(axis=1)

    # 合計で降順に並べ替え
    pivot_table = pivot_table.sort_values('合計', ascending=False)

    # カラムの順序を変更して、'合計'を左に移動
    cols = pivot_table.columns.tolist()
    cols = ['合計'] + [col for col in cols if col != '合計']
    pivot_table = pivot_table[cols]

    # ピボットテーブルをExcelファイルに保存
    pivot_table.to_excel(f"{folder_path}{prefix}.xlsx")

この記事が気に入ったらサポートをしてみませんか?