Как найти корреляцию между столбцами, начинающимися с Open_ и Close_? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь найти корреляцию между ценами открытия и закрытия 150 криптовалют, используя панд.

Все данные криптовалюты хранятся в своем собственном файле CSV и выглядят примерно так:

|---------------------|------------------|------------------|
|         Date        |       Open       |       Close      |
|---------------------|------------------|------------------|
| 2019-02-01 00:00:00 |    0.00001115    |    0.00001119    |
|---------------------|------------------|------------------|
| 2019-02-01 00:05:00 |    0.00001116    |    0.00001119    |
|---------------------|------------------|------------------|
|         .           |        .         |         .        |

Я бы хотел найти корреляцию между столбцами Close и Open каждой криптовалюты.

На данный момент мой код выглядит следующим образом:

temporary_dataframe = pandas.DataFrame()
for csv_path, coin in zip(all_csv_paths, coin_name):
    data_file = pandas.read_csv(csv_path)
    temporary_dataframe[f"Open_{coin}"] = data_file["Open"]
    temporary_dataframe[f"Close_{coin}"] = data_file["Close"]
# Create all_open based on temporary_dataframe data.


corr_file = all_open.corr() 
print(corr_file.unstack().sort_values().drop_duplicates())

Вот часть вывода (вывод имеет форму (43661,)) :

Open_QKC_BTC     Close_QKC_BTC      0.996229
Open_TNT_BTC     Close_TNT_BTC      0.996312
Open_ETC_BTC     Close_ETC_BTC      0.996423

Проблема в том, что я не хочу видеть следующие корреляции:

  • между столбцами, начинающимися с Close_ и Close_ (например, Close_USD_BTC и Close_ETH_BTC)
  • между столбцами, начинающимися с Open_ и Open_ (например, Open_USD_BTC и Open_ETH_BTC)
  • между одной и той же монетой (например, Open_USD_BTC и Close_USD_BTC) .

Короче говоря, идеальный результат будет выглядеть так:

Open_TNT_BTC     Close_QKC_BTC      0.996229
Open_ETH_BTC     Close_TNT_BTC      0.996312
Open_ADA_BTC     Close_ETC_BTC      0.996423

(PS: я уверен, что это не самое элегантное, чтобы делать то, что я делаю. Если у кого-нибудь есть какие-либо предложения о том, как сделать этот сценарий лучше, я был бы более чем рад их услышать)

Большое спасибо заранее за помощь!

1 Ответ

0 голосов
/ 08 февраля 2019

Это довольно грязно, но, по крайней мере, показывает вам вариант.

Она генерирует случайные данные и сделала некоторые суффиксы (имена монет) проще, чем в вашем случае

import string
import numpy as np
import pandas as pd


#Generate random data
prefix = ['Open_','Close_']
suffix = string.ascii_uppercase #All uppercase letter to simulate coin-names

var1 = [None] * 100
var2 = [None] * 100

for i in range(len(var1)) :
    var1[i] = prefix[np.random.randint(0,len(prefix))] + suffix[np.random.randint(0,len(suffix))]
    var2[i] = prefix[np.random.randint(0,len(prefix))] + suffix[np.random.randint(0,len(suffix))]

df = pd.DataFrame(data = {'var1': var1, 'var2':var2 })

df['DropScenario_1'] = False
df['DropScenario_2'] = False
df['DropScenario_3'] = False
df['DropScenario_Final'] = False

df['DropScenario_1'] = df.apply(lambda row: bool(prefix[0] in row.var1) and (prefix[0] in row.var2), axis=1) #Both are Open_
df['DropScenario_2'] = df.apply(lambda row: bool(prefix[1] in row.var1) and (prefix[1] in row.var2), axis=1) #Both are Close_
df['DropScenario_3'] = df.apply(lambda row: bool(row.var1[len(row.var1)-1] == row.var2[len(row.var2)-1]), axis=1) #Both suffixes are the same

#Combine all scenarios
df['DropScenario_Final'] = df['DropScenario_1'] | df['DropScenario_2'] | df['DropScenario_3']

#Keep only the part of the df that we want
df = df[df['DropScenario_Final'] == False]

#Drop our messy columns
df = df.drop(['DropScenario_1','DropScenario_2','DropScenario_3','DropScenario_Final'], axis = 1)

Надеюсь, это поможет

PS Если вы найдете секретный ключ для торговли биткойнами, не прибегая к r / wallstreetbets, я возьму 5%;)

...