Как я могу преобразовать эти столбцы панд, содержащие строки в float, сохраняя их значение? - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу преобразовать столбцы Actual, Forecast, Previous в число с плавающей запятой , чтобы я мог выполнять вычисления для них. CSV также содержит несколько NaN , которые должны оставаться на месте.

CSV-файл выглядит так:

2018-01-04 04:30:00,GBP,Low Impact Expected,Mortgage Approvals,65K,64K,65K
2018-01-04 04:51:00,EUR,Low Impact Expected,Spanish 10-y Bond Auction,1.53|1.8,,1.49|2.0
2018-01-04 05:01:00,EUR,Low Impact Expected,French 10-y Bond Auction,0.79|1.4,,0.36|1.9
2018-01-04 07:30:00,USD,Low Impact Expected,Challenger Job Cuts y/y,-3.6%,,30.1%

Пока я пробовал это:

df.columns = ['Date','Currency','Impact','Event','Actual','Forecast','Previous']

df = df[~(df['Actual'].isin('|','<']))]
#df = df[~df.Actual.str.contains("|")]

df['Actual'] = df['Actual'].str.replace('%', '')
df['Forecast'] = df['Forecast'].str.replace('%', '')
df['Previous'] = df['Previous'].str.replace('%', '')

df['Actual'] = df['Actual'].str.replace('K', '000')
df['Forecast'] = df['Forecast'].str.replace('K', '000')
df['Previous'] = df['Previous'].str.replace('K', '000')

for i in df['Actual']: float(i)
for i in df['Forecast']: float(i)
for i in df['Previous']: float(i)

Функции для избавления от | и <не работают </strong>. Похоже, многие предложения в Интернете не позволяют работать со значениями NaN в файле.

Также я не могу понять , как заменить% , в то же время переместить десятичную дробь , чтобы представление чисел было правильным.

Надеюсь, кто-нибудь может помочь. Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вот мое текущее решение, если кому-то интересно, благодаря помощи cosmic_inquiry.

import pandas as pd

#  Importing economic calendar
df = pd.read_csv('EconomicCalendar.csv')
df.columns = ['Date','Currency','Impact','Event','Actual','Forecast','Previous']


#  Remove no and low impact rows, remove votes beacuse of #format not convertable
df = df[df.Impact != 'Non-Economic']

event_filter = ['Asset Purchase Facility Votes', 'Official Bank Rate Votes']
df = df.loc[~df['Event'].str.contains('|'.join(event_filter))]

for col in ['Actual', 'Forecast', 'Previous']:
    #  Remove rows with certain formats not convertable
    df = df.loc[~df[col].str.contains('|'.join(['\|','\<']), na=False)]

    #  Change %, K, M, B, T into numerics
    df.loc[pd.notnull(df[col]) & df[col].str.contains('\%'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.contains('\%'), col].str.replace('%', '')) / 100
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('K'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('K'), col].str.replace('K', '')) * 1000
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('M'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('M'), col].str.replace('M', '')) * 1000000
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('B'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('B'), col].str.replace('B', '')) * 1000000000
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('T'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('T'), col].str.replace('T', '')) * 1000000000000

    #  Change all to numeric to perform calculation
    df[col] = pd.to_numeric(df[col])


#  Creating Surprise column which is Actual minus Forecast
df['Surprise'] = df['Actual']-df['Forecast']
0 голосов
/ 11 ноября 2018

Не самый красивый способ сделать это, но я верю, что это то, что вы хотите:

from io import StringIO
import pandas as pd
df = pd.read_table(StringIO("""2018-01-04 04:30:00,GBP,Low Impact Expected,Mortgage Approvals,65K,64K,65K
2018-01-04 04:51:00,EUR,Low Impact Expected,Spanish 10-y Bond Auction,1.53|1.8,,1.49|2.0
2018-01-04 05:01:00,EUR,Low Impact Expected,French 10-y Bond Auction,0.79|1.4,,0.36|1.9
2018-01-04 07:30:00,USD,Low Impact Expected,Challenger Job Cuts y/y,-3.6%,,30.1%"""), names=['Date','Currency','Impact','Event','Actual','Forecast','Previous'], sep=',')
df = df.loc[~df['Actual'].str.contains('[\|\<]')]
for col in ['Actual', 'Forecast', 'Previous']:
    df.loc[pd.notnull(df[col]) & df[col].str.contains('\%'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.contains('\%'), col].str.replace('%', '')) / 100
    df.loc[pd.notnull(df[col]) & df[col].str.endswith('K'), col] = pd.to_numeric(df.loc[pd.notnull(df[col]) & df[col].str.endswith('K'), col].str.replace('K', '')) * 1000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...