как я могу прекратить передачу моего индекса для цикла - PullRequest
0 голосов
/ 14 сентября 2018

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

Я выбрал несколько точек данных на графике данных журнала для создания кадра данных coords.coords имеет три столбца: [x], [y] и [slope], который содержит наклон линии, проведенной от (xi,yi) до (xi+1,yi+1), с slope = 0 после моей последней точки.

Я хочу сравнить значения x из coords со значениями x другого фрейма данных bg, чтобы я мог создать значения y для bg.Я хочу, чтобы значения y исходили из линии, соединяющей (xi,yi) и (xi+1,yi+1) для любых xj в bg между xi и xi+1.Этот код дает мне ключевую ошибку: 8, сообщая, что в coords нет индекса 8.

Я не знаю, как остановить цикл, когда индекс достигнет len(coords).

for j in range(0,len(bg)):
j = 0
n = 0
for n in range(0,len(coords)):
    if n < len(coords):
        while bg.x[j] <= coords.x[n+1]:
            bg.y[j] = coords.y[n] * np.power((bg.q[j] / coords.x[n]),coords.slope[n])
            j = j+1 
        if n < len(coords)-1:
            n=n+1

    elif n == len(coords):
        while bg.q[j] <= coords.x[n-1]:
            bg.I_bg[j] = coords.y[n-1] * np.power((bg.q[j] / coords.x[n-1]),coords.slope[n-1])
            j = j+1

вот трассировка

KeyError                                  Traceback (most recent call last)
<ipython-input-94-70509cdf924e> in <module>()
     14 
     15     for n in range(0,len(coords)):
---> 16         while bg.q[j] <= coords.x[n+1]:
     17             bg.I_bg[j] = coords.y[n] * np.power((bg.q[j] / coords.x[n]),coords.slope[n])
     18             j = j+1

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/series.py in __getitem__(self, key)
    765         key = com._apply_if_callable(key, self)
    766         try:
--> 767             result = self.index.get_value(self, key)
    768 
    769             if not is_scalar(result):

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_value(self, series, key)
   3116         try:
   3117             return self._engine.get_value(s, k,
-> 3118                                           tz=getattr(series.dtype, 'tz', None))
   3119         except KeyError as e1:
   3120             if len(self) > 0 and self.inferred_type in ['integer', 'boolean']:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in 
pandas._libs.hashtable.Int64HashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in 
pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 8

Я решил это с помощью комментариев и ответов.спасибо за то, что обратили внимание на то, как плохо написан мой код.очистка помогла.

j =0
n =0
for j in range(0,len(bg)):

for n in range(0,len(coords)):

    if (n + 1) < len(coords):
        while bg.q[j] <= coords.x[n+1]:
            bg.I_bg[j] = coords.y[n] * np.power((bg.q[j] / coords.x[n]),coords.slope[n])
            j = j+1
        n=n+1
    else:
        bg.I_bg[j] = coords.y[n] * np.power((bg.q[j] / coords.x[n]),coords.slope[n])

plt.plot(data['q'],data['0hr'],ls='None', marker='.')
plt.plot(bg['q'],bg['I_bg'],ls='None', marker='.')
plt.plot(coords['x'],coords['y'],ls='None',marker='.')
plt.xscale('log')
plt.xlabel('q (A^-1)')
plt.yscale('log')
plt.ylabel('Intensity')
plt.legend()

вывод

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Для меня это звучит как линейная интерполяция, которая в тупик, а также в сиппи один лайнер.
Посмотрите на np.interp https://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html

Ваш координат.х там xp, а координат.y ф.п. bg.x - это х. Просто посмотрите пример внизу.

0 голосов
/ 14 сентября 2018

На самом деле я не могу понять, что вы пытаетесь сделать ... например

for n in range(0,len(coords)): # note: same as range(len(coords))
    if n < len(coords):
        ...

уже очень странно. Причина в том, что если, например, coords содержит 4 элемента, цикл в первой строке будет повторять настройки тела n=0, n=1, n=2 и n=3. Нет никакого способа, которым n мог бы стать равным len(coords), и поэтому тест бессмыслен, поскольку условие всегда True.

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