Как умножить две созданные серии для создания третьей серии - PullRequest
0 голосов
/ 27 августа 2018

Я создал две серии, и я хочу создать третью серию, выполняя поэлементное умножение первых двух.Мой код приведен ниже:

new_samples = 10 # Number of samples in series
a = pd.Series([list(map(lambda x:x,np.linspace(2,2,new_samples)))],index=['Current'])
b = pd.Series([list(map(lambda x:x,np.linspace(10,0,new_samples)))],index=['Voltage'])
c = pd.Series([x*y for x,y in zip(a.tolist(),b.tolist())],index=['Power'])

Мой вывод:

TypeError: can't multiply sequence by non-int of type 'list'

Чтобы все было ясно, я вставляю свой фактический код for, указанный ниже.Мой фрейм данных уже содержит три столбца Current, Voltage, Power.Для моего требования я должен добавить новый список значений в существующие столбцы Voltage, Current.Но Power значения создаются путем умножения уже созданных значений.Мой код приведен ниже:

for i,j in zip(IV_start_index,IV_start_index[1:]):            
    isc_act = module_allData_df['Current'].iloc[i:j-1].max()
    isc_indx = module_allData_df['Current'].iloc[i:j-1].idxmax()
    sample_count = int((j-i)/(module_allData_df['Voltage'].iloc[i]-module_allData_df['Voltage'].iloc[j-1]))
    new_samples = int(sample_count * (module_allData_df['Voltage'].iloc[isc_indx]))
    missing_current = pd.Series([list(map(lambda x:x,np.linspace(isc_act,isc_act,new_samples)))],index=['Current'])
    missing_voltage = pd.Series([list(map(lambda x:x,np.linspace(module_allData_df['Voltage'].iloc[isc_indx],0,new_samples)))],index=['Voltage'])
    print(missing_current.tolist()*missing_voltage.tolist())

Пример данных: module_allData_df.head ()

     Voltage  Current    Power  
0  33.009998   -0.004 -0.13204  
1  33.009998    0.005  0.16505  
2  32.970001    0.046  1.51662  
3  32.950001    0.087  2.86665  
4  32.919998    0.128  4.21376 

Пример данных: module_allData_df.iloc [120: 126], и вам также требуется это

       Voltage  Current    Power  
120   0.980000    5.449  5.34002  
121   0.920000    5.449  5.01308  
122   0.860000    5.449  4.68614  
123   0.790000    5.449  4.30471  
124  33.110001   -0.004 -0.13244  
125  33.110001    0.005  0.16555  

пример данных: IV_start_index [: 5]

[0, 124, 251, 381, 512]

На основе ответа @jezrael я успешно создал три отдельные серии.Как добавить их в основной фрейм данных.Мое требование объясняется в следующем сюжете.enter image description here

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Проблема в том, что каждая серия представляет собой один элемент со списками, поэтому невозможно использовать векторизованные операции.

a = pd.Series([list(map(lambda x:x,np.linspace(2,2,new_samples)))],index=['Current'])
b = pd.Series([list(map(lambda x:x,np.linspace(10,0,new_samples)))],index=['Voltage'])

print (a)
Current    [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, ...
dtype: object

print (b)
Voltage    [10.0, 8.88888888888889, 7.777777777777778, 6....
dtype: object

Поэтому я считаю, что необходимо удалить [] и при необходимости добавить параметр name:

a = pd.Series(list(map(lambda x:x,np.linspace(2,2,new_samples))), name='Current')
b = pd.Series(list(map(lambda x:x,np.linspace(10,0,new_samples))),name='Voltage')
print (a)
0    2.0
1    2.0
2    2.0
3    2.0
4    2.0
5    2.0
6    2.0
7    2.0
8    2.0
9    2.0
Name: Current, dtype: float64

print (b)
0    10.000000
1     8.888889
2     7.777778
3     6.666667
4     5.555556
5     4.444444
6     3.333333
7     2.222222
8     1.111111
9     0.000000
Name: Voltage, dtype: float64

c = a * b
print (c)
0    20.000000
1    17.777778
2    15.555556
3    13.333333
4    11.111111
5     8.888889
6     6.666667
7     4.444444
8     2.222222
9     0.000000
dtype: float64

РЕДАКТИРОВАТЬ:

Если хотите умножить Outoput серии необходимо последние 2 строки:

missing_current = pd.Series(list(map(lambda x:x,np.linspace(isc_act,isc_act,new_samples))))
missing_voltage = pd.Series(list(map(lambda x:x,np.linspace(module_allData_df['Voltage'].iloc[isc_indx],0,new_samples))))
print(missing_current *missing_voltage)
0 голосов
/ 27 августа 2018

Проще использовать numpy.

import numpy as np
new_samples = 10 # Number of samples in series
a = np.array(np.linspace(2,2,new_samples))
b = np.array(np.linspace(10,0,new_samples))
c = a*b
print(c)

Вывод:

массив ([20., 17.77777778, 15.55555556, 13.33333333, 11.11111111, 8.88888889, 6.66666667, 4.44444444,2.22222222, 0.])

Поскольку вы все делаете с использованием pandas dataframe, используйте следующий код.

import pandas as pd
new_samples = 10 # Number of samples in series
df = pd.DataFrame({'Current':np.linspace(2,2,new_samples),'Voltage':np.linspace(10,0,new_samples)})
df['Power'] = df['Current'] * df['Voltage']
print(df.to_string(index=False))

Вывод:

Current    Voltage      Power
    2.0  10.000000  20.000000
    2.0   8.888889  17.777778
    2.0   7.777778  15.555556
    2.0   6.666667  13.333333
    2.0   5.555556  11.111111
    2.0   4.444444   8.888889
    2.0   3.333333   6.666667
    2.0   2.222222   4.444444
    2.0   1.111111   2.222222
    2.0   0.000000   0.000000
0 голосов
/ 27 августа 2018

Поскольку они представляют собой серии, вы можете просто умножить их c = a * b

Вы можете добавить a и b к фрейму данных, и c станет третьим столбцом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...