質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

pandasのデータフレームにおけるループ処理の効率向上

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 210

taro_yamada

score 25

時系列データから株価が次にどちらの方向に動いたかサインを出すプログラムを書いています。
今のDF2を作ってループの中でループさせるやり方が非常に効率が悪いと思っていますが、いい書き方がわかりません。
初歩的な質問だと思いますが、pandasのレベルがなかなか向上せずに困っています。
どなたかご教示いただけないでしょうか?

        df = df.reset_index(drop=True)

        for i, row in df.iterrows():
            t = pushList.objects.get(pushList_id=df.loc[i, 'pushList_id'])
            time = df.loc[i, 'CurrentPriceTime'] + datetime.timedelta(hours=9)
            timecheck = time + datetime.timedelta(seconds=30)
            if time.time() > END_TIME: #15時を超えていたらelseにとんで0をいれる
                t.nextDirect = 0  # 0は時間外
                t.save()
            elif time.time() < START_TIME:
                t.nextDirect = 0  # 0は時間外
                t.save()
            elif RESTSTART_TIME < time.time() < RESTEND_TIME:
                t.nextDirect = 0  # 0は時間外
                t.save()
            else:
                df2 = df[(df.SymbolName == df.loc[i, 'SymbolName']) & (df.index > i)]  # 同じ銘柄かつiよりあとのレコードでDF2を作成
                df2 = df2.reset_index(drop=True)
                for i2, row2 in df2.iterrows():
                    time2 = df2.loc[i2, 'CurrentPriceTime'] + datetime.timedelta(hours=9) # 比較対象のレコードの時間を格納
                    if time2.time() > timecheck.time():
                        t.nextDirect = 3 #3は30秒間変化なし
                        t.save()
                        break
                    elif time2.time() > END_TIME:
                        t.nextDirect = 0  # 0は時間外
                        t.save()
                        break
                    elif RESTSTART_TIME < time2.time() < RESTEND_TIME:
                        t.nextDirect = 0  # 0は時間外
                        t.save()
                        break
                    else:
                        if df.loc[i, 'CalcPrice'] > df2.loc[i2, 'CalcPrice']: #CurrentQtyがiレコードのものより小さければ
                            t.nextDirect = 1  # 1が下がった
                            t.save()
                            break
                        elif df.loc[i, 'CalcPrice'] < df2.loc[i2, 'CalcPrice']:
                            t.nextDirect = 2  # 2は上がった
                            t.save()
                            break

            if i % 100 == 0:
                print(str(i) + "レコードまで処理")
                print(datetime.datetime.now())
pushList_id     Symbol     SymbolName     Exchange     ExchangeName     CurrentPrice     CurrentPriceTime     CurrentPriceChangeStatus     CurrentPriceStatus     CalcPrice     ...     Sell6Price     Sell6Qty     Sell7Price     Sell7Qty     Sell8Price     Sell8Qty     Sell9Price     Sell9Qty     TotalMarketValue     UnderBuyQty
0     4ab06a34-48af-46ca-9be9-283789524fa8     1447     ITbookホールディングス     1     東証マザーズ     0     2020-09-24 08:08:14.667339+09     NaN     -1     915     ...     915     3600     916     6300     918     200     919     200     18123314415     215000
1     733360c1-7b3a-400a-971b-7d376277f7dc     7044     ピアラ     1     東証1部     0     2020-09-24 08:08:16.007247+09     NaN     -1     2480     ...     2525     100     2536     300     2549     100     2560     400     17636966400     18200
2     8bf71bef-1a13-42ea-a23e-232c45176d09     3050     DCMホールディングス     1     東証1部     0     2020-09-24 08:08:17.408563+09     NaN     -1     1525     ...     1564     700     1565     200     1566     300     1568     1000     244818443100     131000
3     e9760a1a-741c-482c-abd0-994b0ac78ebc     3776     ブロードバンドタワー     1     東証JQス     0     2020-09-24 08:08:17.692836+09     NaN     -1     605     ...     634     200     635     3200     637     200     638     8100     36380767500     511200
4     07f99027-d7a9-45e4-ab78-891b3864e5e9     4722     フューチャー     1     東証1部     0     2020-09-24 08:08:18.171276+09     NaN     -1     2298     ...     2300     800     2309     900     2310     500     2320     1300     109531872000     7000
5     ae39c2c4-fba3-458b-9c02-d52b5c609489     6580     ライトアップ     1     東証マザーズ     0     2020-09-24 08:08:18.471329+09     NaN     -1     3135     ...     3180     300     3195     500     3200     1700     3220     100     9100905000     13100
6     782f5c31-57f0-4293-8de1-077388fd2963     3782     ディー・ディー・エス     1     東証マザーズ     0     2020-09-24 08:08:18.624487+09     NaN     -1     310     ...     314     8900     315     13200     316     6000     317     7300     14225993000     243500
7     14aaf2a1-8274-47d4-bf98-803c3330a230     4308     Jストリーム     1     東証マザーズ     0     2020-09-24 08:08:20.357745+09     NaN     -1     3835     ...     3845     100     3850     2200     3860     100     3870     300     53800064500     29800
8     717f1567-651c-4e69-8ddc-9f6f55098d31     4486     ユナイトアンドグロウ     1     東証マザーズ     0     2020-09-24 08:08:21.399333+09     NaN     -1     1846     ...     1922     900     1927     100     1932     100     1935     100     6724239600     21800
9     e30a4b99-c464-40e0-9aa9-1645e2c8cef3     3776     ブロードバンドタワー     1     東証JQス     0     2020-09-24 08:08:22.101601+09     NaN     -1     605     ...     634     200     635     3200     637     200     638     8100     36380767500     511300
10     ca042bc9-aca7-458b-ad90-605143f69b26     4722     フューチャー     1     東証1部     0     2020-09-24 08:08:22.533328+09     NaN     -1     2298     ...     2300     800     2309     900     2310     500     2315     100     109531872000     7000
11     e6591f32-3ea9-43ed-873b-ce705438f0be     3998     すららネット     1     東証マザーズ     0     2020-09-24 08:08:24.452058+09     NaN     -1     6220     ...     6220     3900     6230     300     6240     100     6250     2200     39435017700     24700
12     fdd0c61e-0356-4a4f-90f1-901d2570d544     6579     ログリー     1     東証マザーズ     0     2020-09-24 08:08:25.284751+09     NaN     -1     7320     ...     0     0     0     0     0     0     0     0     13684008000     17900
13     c0cdf143-6c26-4ef5-9512-1cc0a2625b04     4347     ブロードメディア     1     東証JQス     0     2020-09-24 08:08:26.323568+09     NaN     -1     115     ...     120     32900     121     40200     122     69100     123     71200     9101942145     899700
14     a43c18c0-e016-4e8e-a734-fc1d5c5bad34     4347     ブロードメディア     1     東証JQス     0     2020-09-24 08:08:26.971614+09     NaN     -1     115     ...     120     36900     121     40200     122     69100     123     71200     9101942145     899700
15     999b66f7-385a-4ac0-b0fe-261d47607dd1     3776     ブロードバンドタワー     1     東証JQス     0     2020-09-24 08:08:28.060202+09     NaN     -1     605     ...     634     200     635     3200     637     200     638     8100     36380767500     511300
16     d85e324b-7021-471d-9e3e-925542a58fa0     8226     理経     1     東証2部     0     2020-09-24 08:08:28.129255+09     NaN     -1     277     ...     279     6100     280     11600     281     3900     282     14500     4297577717     540800
17     70ec8f01-d75d-4b3c-bde4-6b5b6016291f     6579     ログリー     1     東証マザーズ     0     2020-09-24 08:08:28.329728+09     NaN     -1     7320     ...     0     0     0     0     0     0     0     0     13684008000     17900
18     cf99c9e6-3907-4bff-a87a-f1b419f4c677     3681     ブイキューブ     1     東証1部     0     2020-09-24 08:08:28.345352+09     NaN     -1     1791     ...     1796     100     1797     200     1798     300     1799     4900     43636282200     180100
19     3dd74a5c-c200-4527-881d-4728e9129461     3776     ブロードバンドタワー     1     東証JQス     0     2020-09-24 08:08:28.429994+09     NaN     
Index(['pushList_id', 'Symbol', 'SymbolName', 'Exchange', 'ExchangeName',
       'CurrentPrice', 'CurrentPriceTime', 'CurrentPriceChangeStatus',
       'CurrentPriceStatus', 'CalcPrice', 'PreviousClose', 'PreviousCloseTime',
       'ChangePreviousClose', 'ChangePreviousClosePer', 'OpeningPrice',
       'OpeningPriceTime', 'HighPrice', 'HighPriceTime', 'LowPrice',
       'LowPriceTime', 'TradingVolume', 'TradingVolumeTime', 'VWAP',
       'TradingValue', 'BidQty', 'BidPrice', 'BidTime', 'BidSign',
       'MarketOrderSellQty', 'Sell1Time', 'Sell1Sign', 'Sell1Price',
       'Sell1Qty', 'created_date_at', 'created_timestamp_at',
       'updated_timestamp_at', 'AskPrice', 'AskQty', 'AskSign', 'AskTime',
       'Buy10Price', 'Buy10Qty', 'Buy1Price', 'Buy1Qty', 'Buy1Sign',
       'Buy1Time', 'Buy2Price', 'Buy2Qty', 'Buy3Price', 'Buy3Qty', 'Buy4Price',
       'Buy4Qty', 'Buy5Price', 'Buy5Qty', 'Buy6Price', 'Buy6Qty', 'Buy7Price',
       'Buy7Qty', 'Buy8Price', 'Buy8Qty', 'Buy9Price', 'Buy9Qty',
       'MarketOrderBuyQty', 'OverSellQty', 'Sell10Price', 'Sell10Qty',
       'Sell2Price', 'Sell2Qty', 'Sell3Price', 'Sell3Qty', 'Sell4Price',
       'Sell4Qty', 'Sell5Price', 'Sell5Qty', 'Sell6Price', 'Sell6Qty',
       'Sell7Price', 'Sell7Qty', 'Sell8Price', 'Sell8Qty', 'Sell9Price',
       'Sell9Qty', 'TotalMarketValue', 'UnderBuyQty'],
      dtype='object')
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • toast-uz

    2020/10/15 21:25

    別の質問にしましょう。というのは、teratailは、あくまでも、ご自分でコードを書く上で、どうしてもわからないところを質問するものです。丸投げはよく無いとされている場所です。そのため、まずは今回の質問のコードをご自分で咀嚼し、追加列をご自分でコーディングしてみて、その上でわからないことを質問する、という手順が望ましいからです。

    キャンセル

  • taro_yamada

    2020/10/15 21:31

    大変失礼しました。
    改めてコーディングしてみたいと思います。

    キャンセル

  • taro_yamada

    2020/10/16 20:41

    すみません。
    まずは今回の課題を解消するためのサンプルとなるコードをいただけると助かります。

    キャンセル

回答 3

check解決した方法

0

解決できず、別の質問を立て直しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

以下に示します。細かい部分はコードにコメントを入れています。
ループを全く使わない例となっています。ただし、細かくは、同じ銘柄で30秒以内に同じ価格が出てきた場合、元のコードと処理が異なっていると思います。

上記を放置した理由として2点です。
+ まずはループを全く使わないコードを確認してほしかった。
+ 元のコードは、同じ銘柄で30秒以内に同じ価格が出てきた場合、何もしない処理になっているが、それで質問者様の意図通りなのかが疑問であった。
+ 実際の利用シーンを考えると、本来は、準リアルタイムで逐次で情報が来る中でSignをどう与えるかが本来は問われているのではないか。そうすると、そもそも一気にループ処理するのではなく、逐次で全銘柄の最終価格一覧と比較して処理をすることが必要になる。逐次処理に拡張することを前提とした場合と、一括処理だけを考えた場合で、放置した部分のコードの方針が大きく異なる。よって、いまの段階では放置することにした。

ということで、まずはこれで回答とします。この内容を咀嚼し、それをもとにご自分で様々なトライをしていただき、また新たな理解の最前線でご質問をお願いします。

import pandas as pd
import io

# 各時刻を時刻型で用意しておく(処理するデータの日付にあらかじめあわせる)
START_TIME = pd.to_datetime('2020-09-24 08:00:00+09')
RESTSTART_TIME =  pd.to_datetime('2020-09-24 15:15:00+09')
RESTEND_TIME =  pd.to_datetime('2020-09-24 16:15:00+09')
END_TIME =  pd.to_datetime('2020-09-25 05:30:00+09')

# 例示されたデータは、コードの場合分けをあまり確認できないため、一部修正
data = ('''
pushList_id     Symbol     SymbolName     Exchange     ExchangeName     CurrentPrice     CurrentPriceTime     CurrentPriceChangeStatus     CurrentPriceStatus     CalcPrice     ...     Sell6Price     Sell6Qty     Sell7Price     Sell7Qty     Sell8Price     Sell8Qty     Sell9Price     Sell9Qty     TotalMarketValue     UnderBuyQty
4ab06a34-48af-46ca-9be9-283789524fa8     1447     ITbookホールディングス     1     東証マザーズ     0     2020-09-24 07:08:14.667339+09     NaN     -1     915     ...     915     3600     916     6300     918     200     919     200     18123314415     215000
733360c1-7b3a-400a-971b-7d376277f7dc     7044     ピアラ     1     東証1部     0     2020-09-24 08:08:16.007247+09     NaN     -1     2480     ...     2525     100     2536     300     2549     100     2560     400     17636966400     18200
8bf71bef-1a13-42ea-a23e-232c45176d09     3050     DCMホールディングス     1     東証1部     0     2020-09-24 08:08:17.408563+09     NaN     -1     1525     ...     1564     700     1565     200     1566     300     1568     1000     244818443100     131000
e9760a1a-741c-482c-abd0-994b0ac78ebc     3776     ブロードバンドタワー     1     東証JQス     0     2020-09-24 08:08:17.692836+09     NaN     -1     605     ...     634     200     635     3200     637     200     638     8100     36380767500     511200
07f99027-d7a9-45e4-ab78-891b3864e5e9     4722     フューチャー     1     東証1部     0     2020-09-24 08:08:18.171276+09     NaN     -1     2298     ...     2300     800     2309     900     2310     500     2320     1300     109531872000     7000
ae39c2c4-fba3-458b-9c02-d52b5c609489     6580     ライトアップ     1     東証マザーズ     0     2020-09-24 08:08:18.471329+09     NaN     -1     3135     ...     3180     300     3195     500     3200     1700     3220     100     9100905000     13100
782f5c31-57f0-4293-8de1-077388fd2963     3782     ディー・ディー・エス     1     東証マザーズ     0     2020-09-24 08:08:18.624487+09     NaN     -1     310     ...     314     8900     315     13200     316     6000     317     7300     14225993000     243500
14aaf2a1-8274-47d4-bf98-803c3330a230     4308     Jストリーム     1     東証マザーズ     0     2020-09-24 08:08:20.357745+09     NaN     -1     3835     ...     3845     100     3850     2200     3860     100     3870     300     53800064500     29800
717f1567-651c-4e69-8ddc-9f6f55098d31     4486     ユナイトアンドグロウ     1     東証マザーズ     0     2020-09-24 08:08:21.399333+09     NaN     -1     1846     ...     1922     900     1927     100     1932     100     1935     100     6724239600     21800
e30a4b99-c464-40e0-9aa9-1645e2c8cef3     3776     ブロードバンドタワー     1     東証JQス     0     2020-09-24 08:08:22.101601+09     NaN     -1     606     ...     634     200     635     3200     637     200     638     8100     36380767500     511300
ca042bc9-aca7-458b-ad90-605143f69b26     4722     フューチャー     1     東証1部     0     2020-09-24 08:08:22.533328+09     NaN     -1     2298     ...     2300     800     2309     900     2310     500     2315     100     109531872000     7000
e6591f32-3ea9-43ed-873b-ce705438f0be     3998     すららネット     1     東証マザーズ     0     2020-09-24 08:08:24.452058+09     NaN     -1     6220     ...     6220     3900     6230     300     6240     100     6250     2200     39435017700     24700
fdd0c61e-0356-4a4f-90f1-901d2570d544     6579     ログリー     1     東証マザーズ     0     2020-09-24 08:08:25.284751+09     NaN     -1     7320     ...     0     0     0     0     0     0     0     0     13684008000     17900
c0cdf143-6c26-4ef5-9512-1cc0a2625b04     4347     ブロードメディア     1     東証JQス     0     2020-09-24 08:08:26.323568+09     NaN     -1     115     ...     120     32900     121     40200     122     69100     123     71200     9101942145     899700
a43c18c0-e016-4e8e-a734-fc1d5c5bad34     4347     ブロードメディア     1     東証JQス     0     2020-09-24 08:09:26.971614+09     NaN     -1     115     ...     120     36900     121     40200     122     69100     123     71200     9101942145     899700
999b66f7-385a-4ac0-b0fe-261d47607dd1     3776     ブロードバンドタワー     1     東証JQス     0     2020-09-24 08:08:28.060202+09     NaN     -1     605     ...     634     200     635     3200     637     200     638     8100     36380767500     511300
d85e324b-7021-471d-9e3e-925542a58fa0     8226     理経     1     東証2部     0     2020-09-24 08:08:28.129255+09     NaN     -1     277     ...     279     6100     280     11600     281     3900     282     14500     4297577717     540800
70ec8f01-d75d-4b3c-bde4-6b5b6016291f     6579     ログリー     1     東証マザーズ     0     2020-09-24 08:08:28.329728+09     NaN     -1     7320     ...     0     0     0     0     0     0     0     0     13684008000     17900
cf99c9e6-3907-4bff-a87a-f1b419f4c677     3681     ブイキューブ     1     東証1部     0     2020-09-24 08:08:28.345352+09     NaN     -1     1791     ...     1796     100     1797     200     1798     300     1799     4900     43636282200     180100
''')

# データフレームをcsvから準備して時刻を時刻型にする
df = pd.read_csv(io.StringIO(data.replace('     ', ',')))
df['CurrentPriceTime'] = pd.to_datetime(df['CurrentPriceTime'])

# 以上のコードは、質問者様環境の再現のためであり、記述する必要はない
# ここからが実際の計算

# 時間内かどうかは、データフレームのまま、いっきに判定して、'OnTime'列に結果を記載
df_time = df['CurrentPriceTime']
df['OnTime'] = (df_time > START_TIME) & (df_time < RESTSTART_TIME) | (df_time > RESTEND_TIME) & (df_time < END_TIME)
# 'OnTime'列=Falseなら'Sign'列=0、それ以外なら'Sign'列=UNDEFINEDを入れる
UNDEFINED = 999   # NoneにするとSign列の型がintを保てないためUNDEFINEDとする
df['Sign'] = df['OnTime'].astype(int) * UNDEFINED

# 銘柄->時刻の2列を使ってソートする
df = df.sort_values(['Symbol', 'CurrentPriceTime'])
# 銘柄、時刻、価格の差分列を作る
df[['dSymbol', 'dCurrentPriceTime', 'dCalcPrice']] = df[['Symbol', 'CurrentPriceTime', 'CalcPrice']].diff()
# グループ化してから差分をとると処理が複雑なのであらかじめやっておく
# 結果として銘柄が変わる場所での差分は意味を持たないことに注意
# よって、銘柄の差分列で銘柄が変わったかどうか判定する
# こういった「ソート」と「差分」により、一度に一つの行だけを注目して処理できるようにするのがコツ

# 時間内で、同じ銘柄で30秒以内で価格も変わらない情報はノイズとして捨てる


# 時間内で、同じ銘柄で時刻差が30秒以上なら'Sign'列を3にする
# ただし、30秒以内で同じ価格が並んだ場合に、通しで30秒超えは判定不能
df['Sign'] = df['Sign'].mask((df['Sign'] == UNDEFINED) & (df['dSymbol'] == 0) & (df['dCurrentPriceTime'] > pd.Timedelta(seconds=30)), 3)

# 時間内で、同じ銘柄で価格が下がったら'Sign'列を1にする
df['Sign'] = df['Sign'].mask((df['Sign'] == UNDEFINED) & (df['dSymbol'] == 0) & (df['dCalcPrice'] < 0), 1)

# 時間内で、同じ銘柄で価格が上がったら'Sign'列を2にする
df['Sign'] = df['Sign'].mask((df['Sign'] == UNDEFINED) & (df['dSymbol'] == 0) & (df['dCalcPrice'] > 0), 2)

# この後、UNDEFINEDは除いて、'Sign'列をpushList変数に入れれば完成
# pushListの型定義は質問に記載されていないので、その部分は質問者にて実装ください

# 今回は上記でできるため、あえてgroupbyを使わなくてよい
# 途中の作業列は残しておくが、削除することは簡単にできる
# またindexは元のままなので、元のデータフレームの順番に戻すことも可能

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/18 04:33

    元のDFを作成する際に、不要な時間帯のデータは取らないようにするしかなさそうですね・・・
    ちょっとデータ取得からやり直してみます。

    キャンセル

  • 2020/10/18 08:09

    df_time.dt.time()で時間部分だけとりだせますよ。
    データフレームではなく、numpyのarrayになりますが。

    キャンセル

  • 2020/10/18 11:27

    df["CurrentPriceTime"].dt.time.apply(
    lambda d: (datetime.time(8) < d < datetime.time(11, 30))
    | (datetime.time(12, 30) < d < datetime.time(15))
    )

    で判定できます

    キャンセル

0

9:00から15:00の内11:30から12:30は0
同一銘柄のを上がったら2、下がったら1、変動なしのうち30秒以上は3、30秒以内は欠損にしています

import datetime
import io

import pandas as pd

data = """
,pushList_id,Symbol,SymbolName,Exchange,ExchangeName,CurrentPrice,CurrentPriceTime,CurrentPriceChangeStatus,CurrentPriceStatus,CalcPrice,...,Sell6Price,Sell6Qty,Sell7Price,Sell7Qty,Sell8Price,Sell8Qty,Sell9Price,Sell9Qty,TotalMarketValue,UnderBuyQty
0,4ab06a34-48af-46ca-9be9-283789524fa8,1447,ITbookホールディングス,1,東証マザーズ,0,2020-09-24 07:08:14.667339+09,,-1,915,...,915,3600,916,6300,918,200,919,200,18123314415,215000
1,733360c1-7b3a-400a-971b-7d376277f7dc,7044,ピアラ,1,東証1部,0,2020-09-24 08:08:16.007247+09,,-1,2480,...,2525,100,2536,300,2549,100,2560,400,17636966400,18200
2,8bf71bef-1a13-42ea-a23e-232c45176d09,3050,DCMホールディングス,1,東証1部,0,2020-09-24 08:08:17.408563+09,,-1,1525,...,1564,700,1565,200,1566,300,1568,1000,244818443100,131000
3,e9760a1a-741c-482c-abd0-994b0ac78ebc,3776,ブロードバンドタワー,1,東証JQス,0,2020-09-24 08:08:17.692836+09,,-1,605,...,634,200,635,3200,637,200,638,8100,36380767500,511200
4,07f99027-d7a9-45e4-ab78-891b3864e5e9,4722,フューチャー,1,東証1部,0,2020-09-24 08:08:18.171276+09,,-1,2298,...,2300,800,2309,900,2310,500,2320,1300,109531872000,7000
5,ae39c2c4-fba3-458b-9c02-d52b5c609489,6580,ライトアップ,1,東証マザーズ,0,2020-09-24 08:08:18.471329+09,,-1,3135,...,3180,300,3195,500,3200,1700,3220,100,9100905000,13100
6,782f5c31-57f0-4293-8de1-077388fd2963,3782,ディー・ディー・エス,1,東証マザーズ,0,2020-09-24 08:08:18.624487+09,,-1,310,...,314,8900,315,13200,316,6000,317,7300,14225993000,243500
7,14aaf2a1-8274-47d4-bf98-803c3330a230,4308,Jストリーム,1,東証マザーズ,0,2020-09-24 08:08:20.357745+09,,-1,3835,...,3845,100,3850,2200,3860,100,3870,300,53800064500,29800
8,717f1567-651c-4e69-8ddc-9f6f55098d31,4486,ユナイトアンドグロウ,1,東証マザーズ,0,2020-09-24 08:08:21.399333+09,,-1,1846,...,1922,900,1927,100,1932,100,1935,100,6724239600,21800
9,e30a4b99-c464-40e0-9aa9-1645e2c8cef3,3776,ブロードバンドタワー,1,東証JQス,0,2020-09-24 08:08:22.101601+09,,-1,606,...,634,200,635,3200,637,200,638,8100,36380767500,511300
10,ca042bc9-aca7-458b-ad90-605143f69b26,4722,フューチャー,1,東証1部,0,2020-09-24 08:08:22.533328+09,,-1,2298,...,2300,800,2309,900,2310,500,2315,100,109531872000,7000
11,e6591f32-3ea9-43ed-873b-ce705438f0be,3998,すららネット,1,東証マザーズ,0,2020-09-24 08:08:24.452058+09,,-1,6220,...,6220,3900,6230,300,6240,100,6250,2200,39435017700,24700
12,fdd0c61e-0356-4a4f-90f1-901d2570d544,6579,ログリー,1,東証マザーズ,0,2020-09-24 08:08:25.284751+09,,-1,7320,...,0,0,0,0,0,0,0,0,13684008000,17900
13,c0cdf143-6c26-4ef5-9512-1cc0a2625b04,4347,ブロードメディア,1,東証JQス,0,2020-09-24 08:08:26.323568+09,,-1,115,...,120,32900,121,40200,122,69100,123,71200,9101942145,899700
14,a43c18c0-e016-4e8e-a734-fc1d5c5bad34,4347,ブロードメディア,1,東証JQス,0,2020-09-24 08:09:26.971614+09,,-1,115,...,120,36900,121,40200,122,69100,123,71200,9101942145,899700
15,999b66f7-385a-4ac0-b0fe-261d47607dd1,3776,ブロードバンドタワー,1,東証JQス,0,2020-09-24 08:08:28.060202+09,,-1,605,...,634,200,635,3200,637,200,638,8100,36380767500,511300
16,d85e324b-7021-471d-9e3e-925542a58fa0,8226,理経,1,東証2部,0,2020-09-24 08:08:28.129255+09,,-1,277,...,279,6100,280,11600,281,3900,282,14500,4297577717,540800
17,70ec8f01-d75d-4b3c-bde4-6b5b6016291f,6579,ログリー,1,東証マザーズ,0,2020-09-24 08:08:28.329728+09,,-1,7320,...,0,0,0,0,0,0,0,0,13684008000,17900
18,cf99c9e6-3907-4bff-a87a-f1b419f4c677,3681,ブイキューブ,1,東証1部,0,2020-09-24 08:08:28.345352+09,,-1,1791,...,1796,100,1797,200,1798,300,1799,4900,43636282200,180100
"""

df = pd.read_csv(io.StringIO(data), index_col=0)

df

df["CurrentPriceTime"] = pd.to_datetime(df["CurrentPriceTime"]).dt.tz_localize(None)

InTime= df["CurrentPriceTime"].dt.time.apply(
    lambda d: (datetime.time(8) < d < datetime.time(11, 30))
    | (datetime.time(12, 30) < d < datetime.time(15))
)

df1 = df.loc[:, ["SymbolName", "CurrentPriceTime", "CalcPrice"]]

df1

df_diff = df1.groupby("SymbolName").diff()

# 上昇2、下降1、変動なし3、欠損None
df_diff["Sign"] = df_diff["CalcPrice"].apply((lambda x: 1 if x < 0 else 2 if x > 0 else 3 if x == 0 else None))

# 30秒以内変動がないものを欠損
df_diff["Sign"] = df_diff["Sign"].mask((df_diff["CurrentPriceTime"] < pd.Timedelta(seconds=30)) & (df_diff["Sign"] == 3))

# 時間外を0
df_diff.loc[~InTime, "Sign"] = 0

df["Sign"] = df_diff["Sign"]

df

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/19 08:22

    文字化けしていて意味がわかりません
    別途質問立ててください

    キャンセル

  • 2020/10/19 08:26

    またサンプルと希望する結果の例をご提示ください

    キャンセル

  • 2020/10/19 23:07

    質問を立て直しました。
    本当にすみません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る