Найти - Пользователи
Полная версия: Простой вопрос по анализу данных в Pandas
Начало » Python для новичков » Простой вопрос по анализу данных в Pandas
1
gyddik
Мне нужно привести цены к одному уровню (2016-09-29 = 100)
Date A B
2016-09-29 3297.62 2977.98
2016-09-30 3222.24 2980.88
Данные

На выходе должно получится
Date A B C D
2016-09-29 3297.62 2977.98 100 100
2016-09-30 3222.24 2980.88 97.71 100.09
noob_saibot
gyddik
http://stackoverflow.com/questions/12525722/normalize-data-in-pandas
gyddik
noob_saibot
К сожалению не разобрался.

Но вот что получилось по подсказке ((df/df.loc) * 100) с того же stackoverflow.com
 import pandas as pd
import datetime
import numpy as np
from pandas import DataFrame, read_csv
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib qt5
dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d')
result = pd.read_csv('result.csv',  
                       encoding = 'utf-8', parse_dates=['date'], 
                       date_parser=dateparse)
result = result.set_index(['date'])
df1 = (result['sber_junk_bonds']/result['sber_junk_bonds'].loc['2009-08-31']) * 100
s1 = pd.Series(df1)
result['sber_jb'] = s1
df2 = (result['abp_price']/result['abp_price'].loc['2009-08-31']) * 100
s2 = pd.Series(df2)
result['alpha_fi'] = s2
df3 = (result['alpha_price']/result['alpha_price'].loc['2009-08-31']) * 100
s3 = pd.Series(df3)
result['alpha'] = s3
df4 = (result['aeb_price']/result['aeb_price'].loc['2009-08-31']) * 100
s4 = pd.Series(df4)
result['alpha_eur'] = s4
df5 = (result['rpv_price']/result['rpv_price'].loc['2009-08-31']) * 100
s5 = pd.Series(df5)
result['rpv'] = s5
df6 = (result['vtb_kuz_most']/result['vtb_kuz_most'].loc['2009-08-31']) * 100
s6 = pd.Series(df6)
result['vtb'] = s6
df7 = (result['sber_fund_pers']/result['sber_fund_pers'].loc['2009-08-31']) * 100
s7 = pd.Series(df7)
result['sber_fp'] = s7
s3 = [s1, s2, s3, s4, s5, s6, s7]
ind = pd.concat(s3, axis=1)
ind
ind.plot()
plt.legend()
plt.show()
fig, axes = plt.subplots(figsize=(20, 10), nrows=4, ncols=2)
ind['sber_junk_bonds'].plot(ax=axes[0,0]); axes[0,0].set_title('sber_junk_bonds');
ind['abp_price'].plot(ax=axes[0,1]); axes[0,1].set_title('alpha_bonds');
ind['alpha_price'].plot(ax=axes[1,0]); axes[1,0].set_title('alpha');
ind['aeb_price'].plot(ax=axes[1,1]); axes[1,1].set_title('alpha_eur_bonds');
ind['rpv_price'].plot(ax=axes[2,0]); axes[2,0].set_title('rpv');
ind['vtb_kuz_most'].plot.area(ax=axes[2,1]); axes[2,1].set_title('vtb_kuz_most');
ind['sber_fund_pers'].plot(ax=axes[3,0]); axes[3,0].set_title('sber_fund_pers');

На выходе


и

scidam
У вас масштабирование специфическое нужно делить на определенное значение в колонке (пусть это значение соответствует индексу 0).
 import pandas as pd
from datetime import datetime
# Sample data 
example = pd.DataFrame({'time':[str(datetime.now())]*3, 'A': [10, 20.2, 11], 'B':[0.3, 2, 1.1]})
# Make copy of the data
_example = example.copy() 
# Scaling.
_example['C'] = _example.A / _example.A[0] * 100.0
_example['D'] = _example.B / _example.B[0] * 100.0
print _example

P.S. _example - копия данных - на всякий случай, чтобы исходные не менять.

Или можно вывести в нужном порядке колонки:
print _example[['time', 'A', 'B', 'C', 'D']]
gyddik
scidam
У вас масштабирование специфическое нужно делить на определенное значение в колонке (пусть это значение соответствует индексу 0).
 (result['sber_junk_bonds']/result['sber_junk_bonds'].loc['2009-08-31']) * 100

определенное значение получается за счет - …loc… то есть значение за 2009-08-31 будет равно 100 в данном случае.
Если использовать Ваш пример, в моем случае получается ошибка


IndexError Traceback (most recent call last)
<ipython-input-1-16f07b3f1c65> in <module>()
13 result = result.set_index()
14
—> 15
 df1 = (result['sber_junk_bonds']/result['sber_junk_bonds'].loc['2009-08-31'][0]) * 100
16 s1 = pd.Series(df1)
17 result = s1

IndexError: invalid index to scalar variable.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB