Функция Python для определения количества дней, которое требуется для изменения процента - PullRequest
2 голосов
/ 02 апреля 2019

У меня есть данные о рыночных ценах для панд. Это средняя цена сделки с криптовалютой (Ethereum) в долларах США.

Я хочу создать функцию, которая будет принимать параметр в процентах. Идея состоит в том, что функция затем выведет целое число, где это целое число представляет общее количество дней, которое потребовалось для того, чтобы увидеть этот процент увеличения.

У Pandas есть функция под названием pct_change(periods=x), которая сообщит вам процентное изменение за определенный период. Я в основном ищу противоположность этой функции. Сколько дня понадобилось, чтобы достичь определенного процента роста.

наш фрейм данных:
ДФ

index   ts  quote   base    last_bid
0   2015-08-07  USD ETH 3.000000
1   2015-08-08  USD ETH 1.266663
2   2015-08-09  USD ETH 1.266663
3   2015-08-10  USD ETH 1.266663
4   2015-08-11  USD ETH 1.026667
from datetime import datetime, timedelta
import pandas as pd

for index, row in df.iterrows():
    ndf = df['last_bid'].pct_change(periods=index)
    print(ndf[ndf > .5])

Это дает мне каждый случай, когда каждая дата выполняет более чем 50% -ное увеличение цены. Тем не менее, я просто хочу Первые данные, где 50% достигается для каждой строки. И тогда цикл продолжится до следующего ряда.

В идеале, все эти выходные данные будут в одном кадре данных с той же схемой выше. С 3 дополнительными колоннами. 1. Дата, когда произошел наш процент прироста. 2. Фактически процентное изменение. 3. Разница между нашей датой начала и окончания.

1 Ответ

1 голос
/ 03 апреля 2019

Не имея доступа именно к вашему фрейму данных, этот код загружает данные, форматирует их так, чтобы они больше походили на ваши, а затем ищет изменения target_percent или более.

import csv

import requests
import pandas

from datetime import datetime, timedelta

url = 'https://etherscan.io/chart/etherprice?output=csv'

print "Downloading CSV"

r = requests.get(url)

with open("data.csv", "w") as csv_handle:
    csv_handle.write(r.text)

df = pandas.read_csv("data.csv")

# First reformat the etherscan data to look like the data frame in the question
print "Reformatting data"
df = df.drop(labels=["UnixTimeStamp"], axis=1)
df = df.rename(columns={'Date(UTC)': 'ts', 'Value' : 'last_bid'})
df['ts'] = df['ts'].str.replace('/', '-')
df['ts'].replace(to_replace='^(\d+-\d+)-(\d\d\d\d)$', value='\g<2>-\g<1>',inplace=True,regex=True)

# Now process the reformatted data frame

target_percent = 50

found_dates    = []
date_diffs     = []
actual_changes = []

for i in range(len(df)):
    found_date = "n/a"
    actual_change = "n/a"
    date_diff = "n/a"

    starting_date = df["ts"][i]
    starting_bid = df["last_bid"][i]

    for j in range(i+1, len(df)):
        if df["last_bid"][j] >= (1.0 + 0.01*target_percent) * starting_bid:
            actual_change = "{:.1f}%".format(100.0 * (df["last_bid"][j] / starting_bid) - 100.0)
            found_date    = df["ts"][j]
            date_diff = str(datetime.strptime(found_date, "%Y-%m-%d") - datetime.strptime(starting_date, "%Y-%m-%d")).split(",")[0]
            break


    date_diffs.append(date_diff)
    actual_changes.append(actual_change)
    found_dates.append(found_date)

df["found_date"] = found_dates
df["actual_change"] = actual_changes
df["date_diff"] = date_diffs

print df

Он дает странные результаты для первых нескольких записей с нулевой ценой, но после этого выглядит нормально:

Downloading CSV
Reformatting data
           ts  last_bid found_date actual_change date_diff
1   2015-7-31      0.00   2015-8-1          nan%     1 day
2    2015-8-1      0.00   2015-8-2          nan%     1 day
3    2015-8-2      0.00   2015-8-3          nan%     1 day
4    2015-8-3      0.00   2015-8-4          nan%     1 day
5    2015-8-4      0.00   2015-8-5          nan%     1 day
6    2015-8-5      0.00   2015-8-6          nan%     1 day
7    2015-8-6      0.00   2015-8-7          inf%     1 day
8    2015-8-7      2.77  2016-2-10         57.0%  187 days
9    2015-8-8      0.81  2015-8-12         54.3%    4 days
10   2015-8-9      0.74  2015-8-12         68.9%    3 days
11  2015-8-10      0.68  2015-8-11         55.9%     1 day
12  2015-8-11      1.06  2015-8-13         67.9%    2 days
13  2015-8-12      1.25  2016-1-23         62.4%  164 days
14  2015-8-13      1.78   2016-2-7         68.5%  178 days
15  2015-8-14      1.79   2016-2-7         67.6%  177 days
16  2015-8-15      1.79   2016-2-7         67.6%  176 days
17  2015-8-16      1.37  2016-1-24         53.3%  161 days
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...