David Hancock
David Hancock

Reputation: 1071

Setting a cell equal to a value in pandas

I feel like an idiot right now, why isn't this working

results = pd.DataFrame(columns=['avg_daily_rets','cum_rets','STDEV','Sharpe'])
results.cum_rets = 4
results

returns

avg_daily_rets  cum_rets    STDEV   Sharpe

with no values

whereas

results = pd.DataFrame(columns=['avg_daily_rets','cum_rets','STDEV','Sharpe'])
results.cum_rets = np.arange(5)
results

returns

avg_daily_rets  cum_rets    STDEV   Sharpe
0   NaN 0   NaN NaN
1   NaN 1   NaN NaN
2   NaN 2   NaN NaN
3   NaN 3   NaN NaN
4   NaN 4   NaN NaN

ultimately i'm doing this:

results = DataFrame(columns = ['avg_daily_rets','cum_rets','STDEV','Sharpe'])
results['avg_daily_rets'] = data.Daily_rets.mean()
print data.Daily_rets.mean()
results.cum_rets = data.Daily_rets.sum()
print data.Daily_rets.sum()
results.STDEV = data.Daily_rets.std()
print data.Daily_rets.std()
results.Sharpe = results.avg_daily_rets / results.STDEV * np.sqrt(250)
print results.avg_daily_rets / results.STDEV * np.sqrt(250)

0.0257851999606
46.3102191292
0.052303548452
Series([], dtype: float64)

and getting the same as above:

avg_daily_rets  cum_rets    STDEV   Sharpe

Upvotes: 2

Views: 1363

Answers (2)

kevbonham
kevbonham

Reputation: 1040

The columns in pandas refer to Series objects, so you can't set them to an Int.

>>> import pandas as pd
>>> results = pd.DataFrame(columns=['avg_daily_rets','cum_rets','STDEV','Sharpe'])
>>> print type(results.cum_rets)
<class 'pandas.core.series.Series'>

Try

>>>results.cum_rets = [5]
>>> print results
  avg_daily_rets  cum_rets STDEV Sharpe
0            NaN         5   NaN    NaN

Pandas converts lists and dicts to Series, so you can make columns out of them.

EDIT:

I should have also pointed out, once you have the value, you can then set individual values directly. Eg:

>>>results.cum_rets[0] = 6
>>>print results.cum_rets
  avg_daily_rets  cum_rets STDEV Sharpe
0            NaN         6   NaN    NaN

Upvotes: 1

jezrael
jezrael

Reputation: 862431

I think you can create and filled DataFrame by arrays instead of scalar docs:

print data
   Daily_rets
a           1
b           2
c           3


avg_daily_rets = data.Daily_rets.mean()
print avg_daily_rets
2.0

cum_rets = data.Daily_rets.sum()
print cum_rets
6

STDEV = data.Daily_rets.std()
print STDEV
1.0

Sharpe = avg_daily_rets / STDEV * np.sqrt(250)
print Sharpe
31.6227766017

print pd.DataFrame( { 'avg_daily_rets': [ avg_daily_rets ],
                      'cum_rets': [ cum_rets ],
                      'STDEV': [ STDEV ],
                      'Sharpe': [ Sharpe ] })

   STDEV     Sharpe  avg_daily_rets  cum_rets
0      1  31.622777               2         6

You can add parameter columns, if you want change order of columns:

print pd.DataFrame( { 'avg_daily_rets': [ avg_daily_rets ],
                      'cum_rets': [ cum_rets ],
                      'STDEV': [ STDEV ],
                      'Sharpe': [ Sharpe ] },
                    columns = ['Sharpe', 'STDEV','cum_rets','avg_daily_rets'])

      Sharpe  STDEV  cum_rets  avg_daily_rets
0  31.622777      1         6               2

Upvotes: 2

Related Questions